Ecng.Interop
1.0.300
See the version list below for details.
dotnet add package Ecng.Interop --version 1.0.300
NuGet\Install-Package Ecng.Interop -Version 1.0.300
<PackageReference Include="Ecng.Interop" Version="1.0.300" />
<PackageVersion Include="Ecng.Interop" Version="1.0.300" />
<PackageReference Include="Ecng.Interop" />
paket add Ecng.Interop --version 1.0.300
#r "nuget: Ecng.Interop, 1.0.300"
#:package Ecng.Interop@1.0.300
#addin nuget:?package=Ecng.Interop&version=1.0.300
#tool nuget:?package=Ecng.Interop&version=1.0.300
Ecng.Interop
A comprehensive .NET library for Platform/Invoke (P/Invoke) operations and native code interoperability. This library provides safe, easy-to-use wrappers for working with unmanaged memory, native libraries, and low-level data structures.
Table of Contents
Overview
Ecng.Interop simplifies the complexity of interoperating with native code by providing:
- Type-safe wrappers for unmanaged memory operations
- Automatic memory management with safe handles
- Helper methods for common marshaling scenarios
- Optimized fixed-size string types for performance-critical interop scenarios
- Utilities for loading and calling native libraries dynamically
Key Features
- Safe Memory Management: RAII-style memory management with
HGlobalSafeHandleandSafePointer - Dynamic Library Loading: Load and call functions from native DLLs at runtime
- String Marshaling: Support for ANSI, Unicode, UTF-8, and BSTR string formats
- Fixed-Size Strings: Pre-defined fixed-size string types (ASCII and UTF-8) for efficient marshaling
- Pointer Reading/Writing: Sequential pointer reading with
PtrReaderand type-safe pointer operations - Blittable Types: Specialized types like
BlittableDecimalfor direct memory layout compatibility - Time Structures: Compact time representations optimized for interop scenarios
- Cross-Platform: Works on Windows, Linux, and macOS
Installation
Add a reference to the Ecng.Interop project or include the compiled DLL in your project.
<ProjectReference Include="path\to\Ecng.Interop\Interop.csproj" />
Core Components
Dynamic Library Loading
Using DllLibrary Base Class
The DllLibrary class provides a managed way to load native libraries and access their functions.
using Ecng.Interop;
// Define your library wrapper
public class MyNativeLibrary : DllLibrary
{
public MyNativeLibrary(string dllPath) : base(dllPath)
{
// Retrieve function pointers as delegates
Add = GetHandler<AddDelegate>("Add");
Multiply = TryGetHandler<MultiplyDelegate>("Multiply"); // Returns null if not found
}
// Define delegate types matching native function signatures
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int AddDelegate(int a, int b);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int MultiplyDelegate(int a, int b);
// Public wrapper methods
public Func<int, int, int> Add { get; }
public Func<int, int, int> Multiply { get; }
}
// Usage
using (var lib = new MyNativeLibrary(@"C:\path\to\native.dll"))
{
int result = lib.Add(10, 20); // Returns 30
Console.WriteLine($"Result: {result}");
// Check DLL version
Console.WriteLine($"DLL Version: {lib.DllVersion}");
}
Manual Library Loading
using Ecng.Interop;
// Load library manually
IntPtr libraryHandle = Marshaler.LoadLibrary(@"C:\path\to\library.dll");
try
{
// Get function pointer
IntPtr funcPtr = libraryHandle.GetProcAddress("MyFunction");
// Convert to delegate
var myFunc = funcPtr.GetDelegateForFunctionPointer<MyFunctionDelegate>();
// Call the function
int result = myFunc(42);
}
finally
{
// Free the library
libraryHandle.FreeLibrary();
}
Memory Management
HGlobalSafeHandle
HGlobalSafeHandle provides automatic cleanup of unmanaged memory allocated with Marshal.AllocHGlobal.
using Ecng.Interop;
// Allocate 1024 bytes of unmanaged memory
using (var handle = 1024.ToHGlobal())
{
IntPtr ptr = handle.DangerousGetHandle();
// Use the memory
Marshal.WriteInt32(ptr, 42);
int value = Marshal.ReadInt32(ptr);
Console.WriteLine($"Value: {value}"); // Output: Value: 42
}
// Memory is automatically freed when disposed
// Allocate and write a string
using (var handle = Encoding.UTF8.ToHGlobal("Hello, World!"))
{
IntPtr ptr = handle.DangerousGetHandle();
string decoded = Encoding.UTF8.ToString(ptr);
Console.WriteLine(decoded); // Output: Hello, World!
}
SafePointer
SafePointer wraps an unmanaged pointer with bounds checking and automatic shifting.
using Ecng.Interop;
// Allocate memory
IntPtr memory = Marshal.AllocHGlobal(100);
try
{
// Create a SafePointer with size boundary
var safePtr = new SafePointer(memory, 100);
// Read a value and auto-shift the pointer
int value1 = safePtr.Read<int>(autoShift: true);
int value2 = safePtr.Read<int>(autoShift: true);
// Read a structure
MyStruct myStruct = safePtr.ToStruct<MyStruct>(autoShift: true);
// Copy to byte array
byte[] buffer = new byte[20];
safePtr.CopyTo(buffer, autoShift: true);
// Manual shifting
safePtr.Shift<long>(); // Shift by sizeof(long)
safePtr.Shift(16); // Shift by 16 bytes
}
finally
{
Marshal.FreeHGlobal(memory);
}
GCHandle<T>
Generic wrapper around GCHandle for pinning managed objects.
using Ecng.Interop;
byte[] data = new byte[] { 1, 2, 3, 4, 5 };
// Pin the array in memory
using (var gcHandle = new GCHandle<byte[]>(data, GCHandleType.Pinned))
{
// Create a safe pointer to the pinned data
SafePointer pointer = gcHandle.CreatePointer();
// Pass pointer to native code
NativeFunction(pointer.Pointer);
}
// Array is automatically unpinned when disposed
Pointer Utilities
PtrReader
Sequential reading from unmanaged memory pointers.
using Ecng.Interop;
IntPtr dataPtr = GetSomeNativeData();
var reader = new PtrReader(dataPtr);
// Read various types sequentially
byte b = reader.GetByte();
short s = reader.GetShort();
int i = reader.GetInt();
long l = reader.GetLong();
IntPtr p = reader.GetIntPtr();
// Read null-terminated strings
string str1 = reader.GetString();
// Read fixed-length strings
string str2 = reader.GetString(20); // Read 20 characters
Direct Pointer Operations
using Ecng.Interop;
IntPtr ptr = Marshal.AllocHGlobal(100);
try
{
// Write values
ptr.Write<int>(42);
(ptr + 4).Write<short>(100);
(ptr + 6).Write<byte>(255);
// Read values
int intValue = ptr.Read<int>();
short shortValue = (ptr + 4).Read<short>();
byte byteValue = (ptr + 6).Read<byte>();
// Copy to managed array
byte[] buffer = new byte[10];
ptr.CopyTo(buffer);
ptr.CopyTo(buffer, offset: 0, length: 10);
// Create spans (modern .NET)
Span<byte> span = ptr.ToSpan(100);
ReadOnlySpan<byte> roSpan = ptr.ToReadOnlySpan(100);
}
finally
{
ptr.FreeHGlobal();
}
String Marshaling
The library provides comprehensive string marshaling for different encodings.
using Ecng.Interop;
// ANSI strings
string text = "Hello, World!";
IntPtr ansiPtr = text.FromAnsi();
try
{
string decoded = ansiPtr.ToAnsi();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeHGlobal(ansiPtr);
}
// Unicode strings
IntPtr unicodePtr = text.FromUnicode();
try
{
string decoded = unicodePtr.ToUnicode();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeHGlobal(unicodePtr);
}
// Platform-dependent (Auto)
IntPtr autoPtr = text.FromAuto();
try
{
string decoded = autoPtr.ToAuto();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeHGlobal(autoPtr);
}
// BSTR (COM interop)
IntPtr bstrPtr = text.FromBSTR();
try
{
string decoded = bstrPtr.ToBSTR();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeBSTR(bstrPtr);
}
// UTF-8 with unsafe pointers
unsafe
{
byte* utf8Buffer = stackalloc byte[100];
text.ToUtf8(utf8Buffer, 100);
string decoded = 100.ToUtf8(utf8Buffer);
Console.WriteLine(decoded);
}
// ASCII with unsafe pointers
unsafe
{
byte* asciiBuffer = stackalloc byte[100];
text.ToAscii(asciiBuffer, 100);
string decoded = 100.ToAscii(asciiBuffer);
Console.WriteLine(decoded);
}
Type Marshaling
Structure Marshaling
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct MyNativeStruct
{
public int Id;
public double Value;
public byte Flag;
}
// Marshal from structure to pointer
MyNativeStruct data = new MyNativeStruct
{
Id = 1,
Value = 3.14,
Flag = 1
};
IntPtr ptr = data.StructToPtr();
try
{
// Pass ptr to native code
NativeFunction(ptr);
// Marshal back from pointer to structure
MyNativeStruct result = ptr.ToStruct<MyNativeStruct>();
Console.WriteLine($"ID: {result.Id}, Value: {result.Value}");
}
finally
{
Marshal.FreeHGlobal(ptr);
}
// Get pointer and size
(IntPtr ptr, int size) = data.StructToPtrEx();
try
{
Console.WriteLine($"Structure size: {size} bytes");
// Use ptr and size
}
finally
{
Marshal.FreeHGlobal(ptr);
}
BlittableDecimal
BlittableDecimal is a struct that matches the memory layout of decimal for direct marshaling.
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct PriceData
{
public int Quantity;
public BlittableDecimal Price; // Can be marshaled directly
}
PriceData data = new PriceData
{
Quantity = 100,
Price = (BlittableDecimal)123.45m
};
// Marshal to unmanaged memory
IntPtr ptr = data.StructToPtr();
try
{
// Pass to native code
NativeFunction(ptr);
// Read back
PriceData result = ptr.ToStruct<PriceData>();
decimal price = result.Price; // Implicit conversion
Console.WriteLine($"Quantity: {result.Quantity}, Price: {price}");
}
finally
{
Marshal.FreeHGlobal(ptr);
}
Fixed-Size Strings
Fixed-size string types provide efficient marshaling for scenarios where string length is known at compile time.
UTF-8 Fixed Strings
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct NetworkPacket
{
public int PacketId;
public Utf8String16 Symbol; // 16 bytes
public Utf8String32 Message; // 32 bytes
public Utf8String8 Source; // 8 bytes
}
// Usage
NetworkPacket packet = new NetworkPacket
{
PacketId = 123,
Symbol = (Utf8String16)"AAPL",
Message = (Utf8String32)"Order executed",
Source = (Utf8String8)"NYSE"
};
// Convert to strings
string symbol = packet.Symbol; // Implicit conversion
string message = packet.Message;
string source = packet.Source.ToString();
Console.WriteLine($"Symbol: {symbol}, Message: {message}");
// Available UTF-8 sizes: 1-33, 48, 64, 65, 128, 129, 256
ASCII Fixed Strings
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct LegacyRecord
{
public int RecordId;
public AsciiString32 Name; // 32 bytes ASCII
public AsciiString64 Address; // 64 bytes ASCII
public AsciiString16 City; // 16 bytes ASCII
}
// Usage
LegacyRecord record = new LegacyRecord
{
RecordId = 1,
Name = (AsciiString32)"John Doe",
Address = (AsciiString64)"123 Main Street",
City = (AsciiString16)"New York"
};
// Convert to strings
string name = record.Name; // Implicit conversion
string address = record.Address;
string city = record.City.ToString();
Console.WriteLine($"{name} from {city}");
// Available ASCII sizes: 1-32, 64, 128
Time Structures
Compact time representations optimized for native interop.
Time4Sec (4-byte time with second resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct LogEntry
{
public Time4Sec Timestamp; // 4 bytes instead of 8
public int EventId;
}
// Usage
LogEntry entry = new LogEntry
{
Timestamp = (Time4Sec)DateTime.UtcNow,
EventId = 123
};
// Convert to DateTime
DateTime dt = entry.Timestamp; // Implicit conversion
DateTimeOffset dto = entry.Timestamp;
Console.WriteLine($"Event at: {dt}");
Console.WriteLine($"Formatted: {entry.Timestamp.ToString("yyyy-MM-dd HH:mm:ss", null)}");
Time8Mls (8-byte time with millisecond resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct TradeData
{
public Time8Mls ExecutionTime;
public double Price;
public int Volume;
}
// Usage
TradeData trade = new TradeData
{
ExecutionTime = (Time8Mls)DateTime.UtcNow,
Price = 150.25,
Volume = 1000
};
DateTime executionTime = trade.ExecutionTime;
Console.WriteLine($"Trade executed at: {executionTime:yyyy-MM-dd HH:mm:ss.fff}");
Time8Mcs (8-byte time with microsecond resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct HighFrequencyTick
{
public Time8Mcs Timestamp;
public double BidPrice;
public double AskPrice;
}
// Usage
HighFrequencyTick tick = new HighFrequencyTick
{
Timestamp = (Time8Mcs)DateTime.UtcNow,
BidPrice = 100.50,
AskPrice = 100.51
};
DateTime tickTime = tick.Timestamp;
Console.WriteLine($"Tick at: {tickTime:HH:mm:ss.ffffff}");
TimeNano (nanosecond resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct PrecisionEvent
{
public TimeNano Timestamp;
public int EventType;
}
// Usage
PrecisionEvent evt = new PrecisionEvent
{
Timestamp = (TimeNano)DateTime.UtcNow,
EventType = 5
};
DateTime eventTime = evt.Timestamp;
Console.WriteLine($"Precise event time: {eventTime:O}");
Hardware Information
Generate hardware-based identifiers for licensing or device identification.
using Ecng.Interop;
// Synchronous
string hardwareId = HardwareInfo.GetId();
Console.WriteLine($"Hardware ID: {hardwareId}");
// Asynchronous
string hardwareIdAsync = await HardwareInfo.GetIdAsync();
Console.WriteLine($"Hardware ID: {hardwareIdAsync}");
// With cancellation
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
try
{
string id = await HardwareInfo.GetIdAsync(cts.Token);
Console.WriteLine($"Hardware ID: {id}");
}
catch (OperationCanceledException)
{
Console.WriteLine("Hardware ID retrieval timed out");
}
The hardware ID is generated based on:
- Windows: CPU ID + Motherboard Serial Number (or MAC Address)
- Linux: Root partition UUID
- macOS: Platform UUID
Usage Examples
Complete Example: Calling Native Library
using Ecng.Interop;
using System.Runtime.InteropServices;
// Define the native structure
[StructLayout(LayoutKind.Sequential)]
public struct Point3D
{
public double X;
public double Y;
public double Z;
}
// Create library wrapper
public class MathLibrary : DllLibrary
{
public MathLibrary() : base("mathlib.dll")
{
CalculateDistance = GetHandler<CalculateDistanceDelegate>("CalculateDistance");
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate double CalculateDistanceDelegate(IntPtr point1, IntPtr point2);
private CalculateDistanceDelegate CalculateDistance;
public double GetDistance(Point3D p1, Point3D p2)
{
IntPtr ptr1 = p1.StructToPtr();
IntPtr ptr2 = p2.StructToPtr();
try
{
return CalculateDistance(ptr1, ptr2);
}
finally
{
ptr1.FreeHGlobal();
ptr2.FreeHGlobal();
}
}
}
// Usage
using (var lib = new MathLibrary())
{
Point3D p1 = new Point3D { X = 0, Y = 0, Z = 0 };
Point3D p2 = new Point3D { X = 3, Y = 4, Z = 0 };
double distance = lib.GetDistance(p1, p2);
Console.WriteLine($"Distance: {distance}"); // Output: Distance: 5
}
Complete Example: Working with Native Arrays
using Ecng.Interop;
using System.Runtime.InteropServices;
// Allocate array in unmanaged memory
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
int sizeInBytes = sizeof(int) * numbers.Length;
using (var handle = sizeInBytes.ToHGlobal())
{
IntPtr ptr = handle.DangerousGetHandle();
// Copy managed array to unmanaged memory
Marshal.Copy(numbers, 0, ptr, numbers.Length);
// Create SafePointer for safe iteration
var safePtr = new SafePointer(ptr, sizeInBytes);
// Read values
for (int i = 0; i < numbers.Length; i++)
{
int value = safePtr.Read<int>(autoShift: true);
Console.WriteLine($"Value {i}: {value}");
}
}
Complete Example: Reading Native Structure with Strings
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public unsafe struct UserData
{
public int UserId;
public AsciiString32 UserName;
public AsciiString64 Email;
public Time8Mls RegistrationDate;
}
// Read from native memory
IntPtr nativeDataPtr = GetUserDataFromNativeCode();
UserData user = nativeDataPtr.ToStruct<UserData>();
Console.WriteLine($"User ID: {user.UserId}");
Console.WriteLine($"Name: {(string)user.UserName}");
Console.WriteLine($"Email: {(string)user.Email}");
Console.WriteLine($"Registered: {(DateTime)user.RegistrationDate}");
Best Practices
Memory Management
- Always dispose resources: Use
usingstatements forDllLibrary,HGlobalSafeHandle, andGCHandle<T> - Prefer safe wrappers: Use
SafePointerover rawIntPtrwhen possible for bounds checking - Match allocation/deallocation: Use
FreeHGlobal()for memory allocated withAllocHGlobal()
// Good
using (var handle = 1024.ToHGlobal())
{
// Use memory
} // Automatically freed
// Avoid
IntPtr ptr = Marshal.AllocHGlobal(1024);
// ... might forget to free
String Marshaling
- Choose the right encoding: Use UTF-8 for modern APIs, ASCII for legacy systems
- Use fixed-size strings for structures: More efficient than string marshaling
- Be aware of null terminators: ANSI/Unicode strings are null-terminated
// Good for structures
[StructLayout(LayoutKind.Sequential)]
public struct Config
{
public Utf8String32 Name; // Fixed size, no allocation
}
// Avoid for structures (requires marshaling)
[StructLayout(LayoutKind.Sequential)]
public struct ConfigBad
{
[MarshalAs(UnmanagedType.LPStr)]
public string Name; // Requires allocation and marshaling
}
Platform Considerations
- Check platform: Use
OperatingSystemchecks when necessary - Handle pointer size: Use
IntPtr.Sizefor platform-dependent sizes - Test on target platforms: Marshaling behavior can differ between platforms
if (OperatingSystem.IsWindows())
{
// Windows-specific code
}
else if (OperatingSystem.IsLinux())
{
// Linux-specific code
}
Performance
- Pin arrays for bulk operations: Use
GCHandle<T>to avoid copying - Use stackalloc for small buffers: Avoid heap allocation when possible
- Batch operations: Minimize transitions between managed and unmanaged code
// Good: Single pinning for bulk operation
byte[] data = new byte[1000];
using (var handle = new GCHandle<byte[]>(data, GCHandleType.Pinned))
{
SafePointer ptr = handle.CreatePointer();
NativeBulkOperation(ptr.Pointer, data.Length);
}
// Avoid: Multiple small transitions
for (int i = 0; i < 1000; i++)
{
NativeSingleOperation(data[i]); // Many transitions
}
Platform Support
- .NET Standard 2.0: Compatible with .NET Framework 4.6.1+ and .NET Core 2.0+
- .NET 6.0: Full support
- .NET 10.0: Full support with latest features
- Operating Systems: Windows, Linux, macOS
Dependencies
- Ecng.Common: Core utilities
- WmiLight: Windows Management Instrumentation for hardware info
- Microsoft.Windows.CsWin32: Windows API source generator
Thread Safety
- Most classes are not thread-safe by default
DllLibraryinstances should not be shared between threads without synchronization- Memory allocation/deallocation is thread-safe (handled by the runtime)
License
This library is part of the StockSharp/Ecng project.
| Product | Versions 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. |
NuGet packages (7)
Showing the top 5 NuGet packages that depend on Ecng.Interop:
| Package | Downloads |
|---|---|
|
StockSharp.Algo
Trading algorithms. More info on web site https://stocksharp.com/store/ |
|
|
StockSharp.Licensing
Licensing components. More info on web site https://stocksharp.com/store/ |
|
|
Ecng.Interop.Windows
Ecng system framework |
|
|
Ecng.ManagedWinapi
Ecng system framework |
|
|
StockSharp.RtsHistory
Trading and algorithmic trading platform (stock markets, forex, bitcoins and options). .NET API for InteractiveBrokers, GainCapital, OANDA, FIX/FAST, Binance etc. More info on web site https://stocksharp.com/store/api/ |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on Ecng.Interop:
| 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.301 | 106 | 1/4/2026 |
| 1.0.300 | 75 | 1/1/2026 |
| 1.0.299 | 77 | 12/31/2025 |
| 1.0.298 | 100 | 12/30/2025 |
| 1.0.297 | 90 | 12/30/2025 |
| 1.0.296 | 91 | 12/29/2025 |
| 1.0.295 | 97 | 12/26/2025 |
| 1.0.294 | 93 | 12/26/2025 |
| 1.0.293 | 89 | 12/26/2025 |
| 1.0.292 | 101 | 12/26/2025 |
| 1.0.291 | 173 | 12/25/2025 |
| 1.0.290 | 179 | 12/25/2025 |
| 1.0.289 | 183 | 12/22/2025 |
| 1.0.288 | 161 | 12/21/2025 |
| 1.0.287 | 252 | 12/19/2025 |
| 1.0.286 | 237 | 12/19/2025 |
| 1.0.285 | 338 | 12/17/2025 |
| 1.0.284 | 320 | 12/15/2025 |
| 1.0.283 | 186 | 12/12/2025 |
| 1.0.282 | 137 | 12/12/2025 |
| 1.0.281 | 2,013 | 11/29/2025 |
| 1.0.280 | 1,868 | 11/28/2025 |
| 1.0.279 | 1,872 | 11/28/2025 |
| 1.0.278 | 1,926 | 11/27/2025 |
| 1.0.277 | 2,024 | 11/24/2025 |
| 1.0.276 | 1,935 | 11/24/2025 |
| 1.0.275 | 1,934 | 11/23/2025 |
| 1.0.274 | 1,985 | 11/22/2025 |
| 1.0.273 | 2,236 | 11/20/2025 |
| 1.0.272 | 2,188 | 11/18/2025 |
| 1.0.271 | 2,140 | 11/18/2025 |
| 1.0.270 | 2,126 | 11/13/2025 |
| 1.0.269 | 2,022 | 11/13/2025 |
| 1.0.268 | 2,012 | 11/10/2025 |
| 1.0.267 | 2,895 | 11/1/2025 |
| 1.0.266 | 1,987 | 10/28/2025 |
| 1.0.265 | 1,996 | 10/27/2025 |
| 1.0.264 | 1,950 | 10/27/2025 |
| 1.0.263 | 1,864 | 10/25/2025 |
| 1.0.262 | 2,937 | 10/3/2025 |
| 1.0.261 | 2,173 | 9/25/2025 |
| 1.0.260 | 6,781 | 8/30/2025 |
| 1.0.259 | 2,193 | 8/14/2025 |
| 1.0.258 | 5,010 | 7/14/2025 |
| 1.0.257 | 1,994 | 7/13/2025 |
| 1.0.256 | 1,948 | 7/13/2025 |
| 1.0.255 | 1,911 | 7/12/2025 |
| 1.0.254 | 2,437 | 7/8/2025 |
| 1.0.253 | 4,408 | 6/16/2025 |
| 1.0.252 | 2,123 | 6/9/2025 |
| 1.0.251 | 2,033 | 6/8/2025 |
| 1.0.250 | 2,590 | 5/21/2025 |
| 1.0.249 | 1,954 | 5/17/2025 |
| 1.0.248 | 2,631 | 5/12/2025 |
| 1.0.247 | 2,022 | 5/12/2025 |
| 1.0.246 | 2,019 | 5/12/2025 |
| 1.0.245 | 1,960 | 5/11/2025 |
| 1.0.244 | 1,955 | 5/11/2025 |
| 1.0.243 | 1,934 | 5/11/2025 |
| 1.0.242 | 1,947 | 5/11/2025 |
| 1.0.241 | 1,972 | 5/6/2025 |
| 1.0.240 | 1,962 | 5/2/2025 |
| 1.0.239 | 2,081 | 4/17/2025 |
| 1.0.238 | 2,016 | 4/12/2025 |
| 1.0.237 | 3,657 | 3/20/2025 |
| 1.0.236 | 1,983 | 3/19/2025 |
| 1.0.235 | 3,351 | 2/26/2025 |
| 1.0.234 | 1,938 | 2/26/2025 |
| 1.0.233 | 3,449 | 2/5/2025 |
| 1.0.232 | 2,027 | 1/21/2025 |
| 1.0.231 | 1,955 | 1/14/2025 |
| 1.0.230 | 1,942 | 1/12/2025 |
| 1.0.229 | 1,930 | 1/10/2025 |
| 1.0.228 | 4,703 | 11/18/2024 |
| 1.0.227 | 2,499 | 11/7/2024 |
| 1.0.226 | 2,104 | 10/19/2024 |
| 1.0.225 | 3,951 | 10/5/2024 |
| 1.0.224 | 3,566 | 9/18/2024 |
| 1.0.223 | 1,964 | 9/17/2024 |
| 1.0.222 | 3,192 | 9/4/2024 |
| 1.0.221 | 1,943 | 9/3/2024 |
| 1.0.220 | 1,951 | 9/1/2024 |
| 1.0.219 | 2,953 | 8/23/2024 |
| 1.0.218 | 1,981 | 8/22/2024 |
| 1.0.217 | 6,341 | 6/12/2024 |
| 1.0.216 | 2,730 | 5/28/2024 |
| 1.0.215 | 3,916 | 5/4/2024 |
| 1.0.214 | 3,152 | 4/14/2024 |
| 1.0.213 | 3,440 | 3/28/2024 |
| 1.0.212 | 2,008 | 3/17/2024 |
| 1.0.211 | 3,424 | 2/23/2024 |
| 1.0.210 | 1,967 | 2/23/2024 |
| 1.0.209 | 3,480 | 2/18/2024 |
| 1.0.208 | 1,968 | 2/16/2024 |
| 1.0.207 | 1,948 | 2/16/2024 |
| 1.0.206 | 2,832 | 2/13/2024 |
| 1.0.205 | 2,744 | 2/8/2024 |
| 1.0.204 | 2,977 | 2/4/2024 |
| 1.0.203 | 3,076 | 1/23/2024 |
| 1.0.202 | 2,680 | 1/12/2024 |
| 1.0.201 | 3,351 | 1/2/2024 |
| 1.0.200 | 1,983 | 12/29/2023 |
| 1.0.199 | 20,826 | 12/10/2023 |
| 1.0.198 | 23,175 | 11/12/2023 |
| 1.0.197 | 19,498 | 11/10/2023 |
| 1.0.196 | 19,475 | 11/10/2023 |
| 1.0.195 | 19,493 | 11/9/2023 |
| 1.0.194 | 19,518 | 11/3/2023 |
| 1.0.193 | 19,493 | 11/1/2023 |
| 1.0.192 | 19,484 | 11/1/2023 |
| 1.0.191 | 24,471 | 9/8/2023 |
| 1.0.190 | 19,529 | 9/8/2023 |
| 1.0.189 | 1,995 | 9/8/2023 |
| 1.0.188 | 2,027 | 9/6/2023 |
| 1.0.187 | 19,562 | 9/3/2023 |
| 1.0.186 | 19,636 | 8/21/2023 |
| 1.0.185 | 2,066 | 8/14/2023 |
| 1.0.184 | 19,595 | 8/10/2023 |
| 1.0.183 | 24,539 | 6/29/2023 |
| 1.0.182 | 21,867 | 5/27/2023 |
| 1.0.181 | 19,628 | 5/19/2023 |
| 1.0.180 | 21,444 | 5/14/2023 |
| 1.0.179 | 20,997 | 5/8/2023 |
| 1.0.178 | 2,173 | 4/21/2023 |
| 1.0.177 | 26,030 | 4/3/2023 |
| 1.0.176 | 19,868 | 3/13/2023 |
| 1.0.175 | 22,231 | 3/6/2023 |
| 1.0.174 | 2,195 | 2/26/2023 |
| 1.0.173 | 27,132 | 2/9/2023 |
| 1.0.172 | 22,431 | 2/7/2023 |
| 1.0.171 | 19,745 | 2/4/2023 |
| 1.0.170 | 22,701 | 2/2/2023 |
| 1.0.169 | 22,734 | 1/30/2023 |
| 1.0.168 | 2,298 | 1/18/2023 |
| 1.0.167 | 27,364 | 12/30/2022 |
| 1.0.166 | 2,255 | 12/23/2022 |
| 1.0.165 | 2,241 | 12/14/2022 |
| 1.0.164 | 2,211 | 12/14/2022 |
| 1.0.163 | 2,198 | 12/14/2022 |
| 1.0.162 | 2,234 | 12/14/2022 |
| 1.0.161 | 2,212 | 12/14/2022 |
| 1.0.160 | 23,906 | 12/12/2022 |
| 1.0.159 | 23,669 | 12/8/2022 |
| 1.0.158 | 2,294 | 12/4/2022 |
| 1.0.157 | 2,234 | 12/4/2022 |
| 1.0.156 | 19,830 | 11/30/2022 |
| 1.0.155 | 19,799 | 11/29/2022 |
| 1.0.154 | 19,810 | 11/28/2022 |
| 1.0.153 | 19,840 | 11/18/2022 |
| 1.0.152 | 24,515 | 11/11/2022 |
| 1.0.151 | 19,804 | 11/11/2022 |
| 1.0.150 | 2,282 | 11/10/2022 |
| 1.0.149 | 19,864 | 11/5/2022 |
| 1.0.148 | 19,826 | 11/4/2022 |
| 1.0.147 | 38,141 | 11/1/2022 |
| 1.0.146 | 40,539 | 10/16/2022 |
| 1.0.145 | 19,994 | 9/25/2022 |
| 1.0.144 | 2,441 | 9/10/2022 |
| 1.0.143 | 2,374 | 9/10/2022 |
| 1.0.142 | 61,696 | 9/8/2022 |
| 1.0.141 | 19,952 | 9/8/2022 |
| 1.0.140 | 2,372 | 9/8/2022 |
| 1.0.139 | 19,952 | 9/4/2022 |
| 1.0.138 | 19,922 | 9/4/2022 |
| 1.0.137 | 85,550 | 8/24/2022 |
| 1.0.136 | 20,014 | 8/8/2022 |
| 1.0.135 | 19,924 | 8/8/2022 |
| 1.0.134 | 19,982 | 7/26/2022 |
| 1.0.133 | 19,927 | 7/26/2022 |
| 1.0.132 | 62,655 | 7/19/2022 |
| 1.0.131 | 44,093 | 7/18/2022 |
| 1.0.130 | 19,992 | 7/13/2022 |
| 1.0.129 | 19,976 | 7/8/2022 |
| 1.0.128 | 20,003 | 6/30/2022 |
| 1.0.127 | 20,016 | 6/18/2022 |
| 1.0.126 | 19,986 | 6/6/2022 |
| 1.0.125 | 103,901 | 4/30/2022 |
| 1.0.124 | 20,004 | 4/20/2022 |
| 1.0.123 | 20,014 | 4/10/2022 |
| 1.0.122 | 19,963 | 4/7/2022 |
| 1.0.121 | 19,986 | 4/7/2022 |
| 1.0.120 | 20,034 | 4/2/2022 |
| 1.0.119 | 26,947 | 3/29/2022 |
| 1.0.118 | 19,950 | 3/27/2022 |
| 1.0.117 | 2,431 | 3/27/2022 |
| 1.0.116 | 104,952 | 2/20/2022 |
| 1.0.115 | 19,966 | 2/20/2022 |
| 1.0.114 | 19,986 | 2/20/2022 |
| 1.0.113 | 19,988 | 2/20/2022 |
| 1.0.112 | 20,001 | 2/20/2022 |
| 1.0.111 | 19,969 | 2/20/2022 |
| 1.0.110 | 19,988 | 2/20/2022 |
| 1.0.109 | 19,997 | 2/20/2022 |
| 1.0.108 | 19,957 | 2/20/2022 |
| 1.0.107 | 19,952 | 2/19/2022 |
| 1.0.106 | 141,136 | 1/24/2022 |
| 1.0.105 | 163,876 | 12/29/2021 |
| 1.0.104 | 44,998 | 12/20/2021 |
| 1.0.103 | 19,905 | 12/13/2021 |
| 1.0.102 | 45,165 | 12/7/2021 |
| 1.0.101 | 19,818 | 12/7/2021 |
| 1.0.100 | 45,268 | 12/6/2021 |
| 1.0.99 | 19,824 | 12/6/2021 |
| 1.0.98 | 19,816 | 12/5/2021 |
| 1.0.97 | 2,281 | 12/2/2021 |
| 1.0.96 | 46,673 | 11/29/2021 |
| 1.0.95 | 44,846 | 11/22/2021 |
| 1.0.94 | 19,936 | 11/17/2021 |
| 1.0.93 | 19,894 | 11/14/2021 |
| 1.0.92 | 45,868 | 11/13/2021 |
| 1.0.91 | 19,936 | 11/11/2021 |
| 1.0.90 | 19,858 | 11/11/2021 |
| 1.0.89 | 19,890 | 11/10/2021 |
| 1.0.88 | 19,899 | 11/9/2021 |
| 1.0.87 | 75,003 | 11/5/2021 |
| 1.0.86 | 19,910 | 11/5/2021 |
| 1.0.85 | 19,871 | 11/4/2021 |
| 1.0.84 | 19,879 | 11/4/2021 |
| 1.0.83 | 19,886 | 11/3/2021 |
| 1.0.82 | 19,970 | 10/30/2021 |
| 1.0.81 | 48,422 | 10/21/2021 |
| 1.0.80 | 19,981 | 10/17/2021 |
| 1.0.79 | 74,472 | 10/14/2021 |
| 1.0.78 | 24,130 | 10/13/2021 |
| 1.0.77 | 19,915 | 10/12/2021 |
| 1.0.76 | 48,334 | 10/11/2021 |
| 1.0.75 | 19,866 | 10/9/2021 |
| 1.0.74 | 34,090 | 10/7/2021 |
| 1.0.73 | 50,450 | 10/7/2021 |
| 1.0.72 | 19,857 | 10/7/2021 |
| 1.0.71 | 2,370 | 10/6/2021 |
| 1.0.70 | 19,947 | 9/28/2021 |
| 1.0.69 | 49,299 | 9/23/2021 |
| 1.0.68 | 19,983 | 9/11/2021 |
| 1.0.67 | 19,906 | 9/10/2021 |
| 1.0.66 | 19,910 | 9/9/2021 |
| 1.0.65 | 19,857 | 9/8/2021 |
| 1.0.64 | 19,913 | 9/8/2021 |
| 1.0.63 | 47,809 | 9/6/2021 |
| 1.0.62 | 2,370 | 8/31/2021 |
| 1.0.61 | 2,323 | 8/30/2021 |
| 1.0.60 | 48,758 | 7/31/2021 |
| 1.0.59 | 73,490 | 7/30/2021 |
| 1.0.58 | 19,941 | 7/26/2021 |
| 1.0.57 | 100,166 | 7/5/2021 |
| 1.0.56 | 19,949 | 7/1/2021 |
| 1.0.55 | 76,036 | 6/4/2021 |
| 1.0.54 | 101,266 | 4/26/2021 |
| 1.0.53 | 47,778 | 4/19/2021 |
| 1.0.52 | 153,547 | 4/7/2021 |
| 1.0.51 | 47,051 | 4/3/2021 |
| 1.0.50 | 162,980 | 3/22/2021 |
| 1.0.49 | 120,168 | 3/4/2021 |
| 1.0.48 | 47,092 | 2/26/2021 |
| 1.0.47 | 168,931 | 2/2/2021 |
| 1.0.46 | 52,862 | 1/26/2021 |
| 1.0.45 | 69,835 | 1/24/2021 |
| 1.0.44 | 2,383 | 1/24/2021 |
| 1.0.43 | 2,437 | 1/23/2021 |
| 1.0.42 | 52,683 | 1/20/2021 |
| 1.0.41 | 19,949 | 1/20/2021 |
| 1.0.40 | 45,119 | 1/18/2021 |
| 1.0.39 | 2,352 | 1/18/2021 |
| 1.0.38 | 44,228 | 1/16/2021 |
| 1.0.37 | 125,138 | 12/16/2020 |
| 1.0.36 | 71,915 | 12/14/2020 |
| 1.0.35 | 49,434 | 12/9/2020 |
| 1.0.34 | 20,322 | 12/7/2020 |
| 1.0.33 | 20,442 | 12/6/2020 |
| 1.0.32 | 20,356 | 12/2/2020 |
| 1.0.31 | 20,328 | 12/2/2020 |
| 1.0.30 | 45,987 | 12/1/2020 |
| 1.0.29 | 161,550 | 11/12/2020 |
| 1.0.29-atestpub | 732 | 11/11/2020 |
| 1.0.28 | 45,932 | 10/11/2020 |
| 1.0.27 | 99,732 | 9/9/2020 |
| 1.0.26 | 44,701 | 9/3/2020 |
| 1.0.25 | 45,242 | 8/20/2020 |
| 1.0.24 | 93,620 | 8/9/2020 |
| 1.0.23 | 27,085 | 7/28/2020 |
| 1.0.22 | 44,526 | 7/19/2020 |
| 1.0.21 | 67,644 | 7/6/2020 |
| 1.0.20 | 93,876 | 6/6/2020 |
| 1.0.19 | 28,089 | 6/4/2020 |
| 1.0.18 | 51,879 | 5/29/2020 |
| 1.0.17 | 69,324 | 5/21/2020 |
| 1.0.16 | 3,006 | 5/17/2020 |
| 1.0.15 | 72,514 | 5/12/2020 |
| 1.0.14 | 124,661 | 5/4/2020 |
| 1.0.13 | 23,768 | 4/24/2020 |
| 1.0.12 | 6,687 | 4/22/2020 |
| 1.0.11 | 20,676 | 4/22/2020 |
| 1.0.10 | 20,693 | 4/21/2020 |
| 1.0.9 | 48,700 | 4/18/2020 |
| 1.0.8 | 29,111 | 4/16/2020 |
| 1.0.7 | 3,212 | 4/16/2020 |
| 1.0.6 | 42,869 | 4/15/2020 |
| 1.0.5 | 44,763 | 4/11/2020 |
| 1.0.4 | 44,182 | 4/3/2020 |
| 1.0.3 | 3,196 | 4/1/2020 |
| 1.0.2 | 31,335 | 3/27/2020 |
| 1.0.1 | 30,277 | 3/22/2020 |
| 1.0.0 | 5,084 | 3/22/2020 |