Ecng.Net.SocketIO 1.0.525

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Net.SocketIO --version 1.0.525
                    
NuGet\Install-Package Ecng.Net.SocketIO -Version 1.0.525
                    
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.Net.SocketIO" Version="1.0.525" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Net.SocketIO" Version="1.0.525" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.Net.SocketIO" />
                    
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.Net.SocketIO --version 1.0.525
                    
#r "nuget: Ecng.Net.SocketIO, 1.0.525"
                    
#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.Net.SocketIO@1.0.525
                    
#: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.Net.SocketIO&version=1.0.525
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Net.SocketIO&version=1.0.525
                    
Install as a Cake Tool

Ecng.Net.SocketIO

A high-performance .NET client library for WebSocket communication with automatic reconnection, message resending, and comprehensive connection state management.

Features

  • WebSocket Client Implementation - Full-featured WebSocket client with async/await support
  • Automatic Reconnection - Configurable reconnection attempts with exponential backoff
  • Command Resending - Automatic resend of commands after reconnection
  • Connection State Tracking - Track and aggregate connection states across multiple connections
  • JSON Serialization - Built-in JSON serialization for object messages
  • Flexible Logging - Customizable logging hooks for info, error, and verbose messages
  • RestSharp Integration - Helper methods for REST API calls with authentication
  • Thread-Safe - Safe to use in multi-threaded environments

Installation

Add the package reference to your project:

<PackageReference Include="Ecng.Net.SocketIO" Version="x.x.x" />

Quick Start

Basic WebSocket Connection

using Ecng.Net;

var socket = new WebSocketClient(
    url: "wss://example.com/socket",
    stateChanged: state => Console.WriteLine($"State: {state}"),
    error: ex => Console.WriteLine($"Error: {ex.Message}"),
    process: (msg, ct) =>
    {
        Console.WriteLine($"Received: {msg.AsString()}");
        return ValueTask.CompletedTask;
    },
    infoLog: (fmt, args) => Console.WriteLine(fmt, args),
    errorLog: (fmt, args) => Console.Error.WriteLine(fmt, args),
    verboseLog: (fmt, args) => Console.WriteLine($"[VERBOSE] {fmt}", args)
);

await socket.ConnectAsync(CancellationToken.None);

Sending Messages

// Send JSON object
await socket.SendAsync(new { type = "subscribe", channel = "trades" });

// Send string
await socket.SendAsync("Hello, WebSocket!");

// Send raw bytes
byte[] data = Encoding.UTF8.GetBytes("Raw message");
await socket.SendAsync(data, WebSocketMessageType.Text);

Core Components

WebSocketClient

The main class for WebSocket communication.

Constructor Parameters
public WebSocketClient(
    string url,                              // WebSocket URL (ws:// or wss://)
    Action<ConnectionStates> stateChanged,   // Connection state change callback
    Action<Exception> error,                 // Error handler
    Func<WebSocketMessage, CancellationToken, ValueTask> process,  // Message processor
    Action<string, object> infoLog,          // Info log handler
    Action<string, object> errorLog,         // Error log handler
    Action<string, object> verboseLog        // Verbose log handler (can be null)
)
Configuration Properties
// Reconnection settings
socket.ReconnectAttempts = 10;              // -1 for infinite, 0 for no reconnect
socket.ReconnectInterval = TimeSpan.FromSeconds(5);
socket.ResendInterval = TimeSpan.FromSeconds(2);
socket.ResendTimeout = TimeSpan.FromMilliseconds(500);

// Message encoding
socket.Encoding = Encoding.UTF8;

// Buffer sizes
socket.BufferSize = 1024 * 1024;            // 1MB for compressed data
socket.BufferSizeUncompress = 10 * 1024 * 1024; // 10MB for uncompressed

// JSON serialization
socket.Indent = true;
socket.SendSettings = new JsonSerializerSettings { ... };

// Auto-resend control
socket.DisableAutoResend = false;
Connection Management
// Connect
await socket.ConnectAsync(cancellationToken);
socket.Connect(); // Synchronous version

// Disconnect
socket.Disconnect();

// Check connection state
bool isConnected = socket.IsConnected;
ConnectionStates currentState = socket.State;

// Abort connection immediately
socket.Abort();
Sending Messages with Subscription Tracking
// Send with subscription ID for automatic resend after reconnect
long subscriptionId = 12345;
await socket.SendAsync(
    obj: new { action = "subscribe", symbol = "BTCUSD" },
    subId: subscriptionId
);

// Unsubscribe (negative ID removes from resend queue)
await socket.SendAsync(
    obj: new { action = "unsubscribe", symbol = "BTCUSD" },
    subId: -subscriptionId
);

// Manual resend management
socket.RemoveResend(subscriptionId);  // Remove specific subscription
socket.RemoveResend();                 // Remove all subscriptions
Advanced Features
// Custom initialization
socket.Init += ws =>
{
    ws.Options.SetRequestHeader("X-Custom-Header", "value");
    ws.Options.KeepAliveInterval = TimeSpan.FromSeconds(30);
};

// Post-connect hook
socket.PostConnect += async (isReconnect, ct) =>
{
    if (isReconnect)
        Console.WriteLine("Reconnected! Resubscribing...");

    await Task.CompletedTask;
};

// Pre-process received data (e.g., decompression)
socket.PreProcess2 = (input, output) =>
{
    // Decompress or transform data
    input.CopyTo(output);
    return input.Length;
};

// Send ping frame
await socket.SendOpCode(0x9);

WebSocketMessage

Represents an incoming message from the WebSocket.

// In your message processor
Func<WebSocketMessage, CancellationToken, ValueTask> process = (msg, ct) =>
{
    // Get as string
    string text = msg.AsString();

    // Deserialize to object
    var trade = msg.AsObject<TradeData>();

    // Deserialize to dynamic
    dynamic data = msg.AsObject();

    // Get JSON reader for streaming
    using var reader = msg.AsReader();

    // Access raw bytes
    ReadOnlyMemory<byte> bytes = msg.Memory;

    return ValueTask.CompletedTask;
};

Connection States

The ConnectionStates enum represents the current state of the connection:

public enum ConnectionStates
{
    Disconnected,   // Not connected
    Disconnecting,  // In process of disconnecting
    Connecting,     // In process of connecting
    Connected,      // Successfully connected
    Reconnecting,   // Attempting to reconnect
    Restored,       // Connection restored after reconnect
    Failed          // Connection failed
}

ConnectionStateTracker

Track and aggregate states across multiple connections.

var tracker = new ConnectionStateTracker();

// Add connections
tracker.Add(socket1);
tracker.Add(socket2);

// Monitor overall state
tracker.StateChanged += state =>
    Console.WriteLine($"Overall state: {state}");

// Connect all
await tracker.ConnectAsync(CancellationToken.None);

// Disconnect all
tracker.Disconnect();

// Remove connections
tracker.Remove(socket1);

The tracker aggregates states with the following logic:

  • Connected: All connections are connected
  • Reconnecting: Any connection is reconnecting
  • Restored: All connections are connected or restored
  • Failed: All connections have failed
  • Disconnected: All connections are disconnected or failed

IConnection Interface

Standard interface for connection management:

public interface IConnection
{
    event Action<ConnectionStates> StateChanged;
    ValueTask ConnectAsync(CancellationToken cancellationToken);
    void Disconnect();
}

Both WebSocketClient and ConnectionStateTracker implement this interface.

RestSharp Integration

The library includes helper methods for REST API calls, often used alongside WebSocket connections.

Basic REST Request

using Ecng.Net;
using RestSharp;

var request = new RestRequest(Method.Get);
request.AddQueryParameter("symbol", "BTCUSD");

var response = await request.InvokeAsync<PriceData>(
    url: new Uri("https://api.example.com/price"),
    caller: this,
    logVerbose: (fmt, args) => Console.WriteLine(fmt, args),
    token: CancellationToken.None
);

Console.WriteLine($"Price: {response.Price}");

Authentication

// Bearer token authentication
request.SetBearer(secureToken);

// Custom authenticator
var authenticator = new MyCustomAuthenticator();
var response = await request.InvokeAsync2<Data>(
    url: apiUrl,
    caller: this,
    logVerbose: logger,
    token: cancellationToken,
    auth: authenticator
);

Error Handling

try
{
    var response = await request.InvokeAsync<Data>(url, this, logger, token);
}
catch (RestSharpException ex)
{
    Console.WriteLine($"HTTP {ex.Response.StatusCode}: {ex.Response.Content}");
    Console.WriteLine($"Error: {ex.Message}");
}

Advanced REST Features

// Custom content converter
var response = await request.InvokeAsync<Data>(
    url: apiUrl,
    caller: this,
    logVerbose: logger,
    token: cancellationToken,
    contentConverter: content => content.Replace("null", "\"\"")
);

// Handle specific error status codes
var response = await request.InvokeAsync3<Data>(
    url: apiUrl,
    caller: this,
    logVerbose: logger,
    token: cancellationToken,
    handleErrorStatus: statusCode =>
    {
        if (statusCode == HttpStatusCode.TooManyRequests)
        {
            // Custom handling
            return true; // Handled
        }
        return false; // Not handled, will throw
    }
);

// Add body as string
request.AddBodyAsStr("{\"key\": \"value\"}");

// Remove parameters
request.RemoveWhere(p => p.Name == "old_param");

// Convert parameters to query string
string queryString = request.Parameters.ToQueryString();

JWT Decoding

string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
var parts = token.DecodeJWT();

foreach (var part in parts)
{
    Console.WriteLine(part);
}

Complete Examples

Crypto Exchange WebSocket Client

public class CryptoExchangeClient : IDisposable
{
    private readonly WebSocketClient _socket;
    private long _subscriptionCounter;

    public CryptoExchangeClient(string wsUrl)
    {
        _socket = new WebSocketClient(
            url: wsUrl,
            stateChanged: OnStateChanged,
            error: OnError,
            process: ProcessMessage,
            infoLog: (fmt, args) => Console.WriteLine($"[INFO] {fmt}", args),
            errorLog: (fmt, args) => Console.Error.WriteLine($"[ERROR] {fmt}", args),
            verboseLog: null
        )
        {
            ReconnectAttempts = -1,  // Infinite reconnection
            ReconnectInterval = TimeSpan.FromSeconds(5),
            ResendTimeout = TimeSpan.FromSeconds(1)
        };

        _socket.Init += ws =>
        {
            ws.Options.KeepAliveInterval = TimeSpan.FromSeconds(20);
        };

        _socket.PostConnect += async (isReconnect, ct) =>
        {
            if (isReconnect)
            {
                Console.WriteLine("Reconnected! Subscriptions will be restored automatically.");
            }
        };
    }

    public async Task ConnectAsync()
    {
        await _socket.ConnectAsync(CancellationToken.None);
    }

    public async Task SubscribeToTradesAsync(string symbol)
    {
        var subId = ++_subscriptionCounter;

        await _socket.SendAsync(
            obj: new
            {
                type = "subscribe",
                channel = "trades",
                symbol = symbol
            },
            subId: subId
        );

        Console.WriteLine($"Subscribed to {symbol} trades (ID: {subId})");
    }

    public async Task UnsubscribeFromTradesAsync(long subscriptionId, string symbol)
    {
        await _socket.SendAsync(
            obj: new
            {
                type = "unsubscribe",
                channel = "trades",
                symbol = symbol
            },
            subId: -subscriptionId  // Negative to remove from resend queue
        );
    }

    private void OnStateChanged(ConnectionStates state)
    {
        Console.WriteLine($"Connection state: {state}");

        if (state == ConnectionStates.Connected)
        {
            // Connection established
        }
        else if (state == ConnectionStates.Restored)
        {
            // Connection restored after disconnect
        }
        else if (state == ConnectionStates.Failed)
        {
            // Connection failed after all retry attempts
        }
    }

    private void OnError(Exception ex)
    {
        Console.Error.WriteLine($"WebSocket error: {ex}");
    }

    private async ValueTask ProcessMessage(WebSocketMessage msg, CancellationToken ct)
    {
        try
        {
            var message = msg.AsObject<dynamic>();

            if (message.type == "trade")
            {
                Console.WriteLine($"Trade: {message.symbol} @ {message.price}");
            }
            else if (message.type == "error")
            {
                Console.Error.WriteLine($"Server error: {message.message}");
            }
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine($"Error processing message: {ex.Message}");
        }

        await ValueTask.CompletedTask;
    }

    public void Dispose()
    {
        _socket?.Disconnect();
        _socket?.Dispose();
    }
}

// Usage
await using var client = new CryptoExchangeClient("wss://api.exchange.com/ws");
await client.ConnectAsync();
await client.SubscribeToTradesAsync("BTCUSD");

// Keep running
await Task.Delay(Timeout.Infinite);

Multi-Connection Manager

public class MultiExchangeClient
{
    private readonly ConnectionStateTracker _tracker;
    private readonly WebSocketClient _exchangeA;
    private readonly WebSocketClient _exchangeB;

    public MultiExchangeClient()
    {
        _tracker = new ConnectionStateTracker();

        _exchangeA = CreateClient("wss://exchange-a.com/ws", "Exchange A");
        _exchangeB = CreateClient("wss://exchange-b.com/ws", "Exchange B");

        _tracker.Add(_exchangeA);
        _tracker.Add(_exchangeB);

        _tracker.StateChanged += state =>
        {
            Console.WriteLine($"Overall connection state: {state}");

            if (state == ConnectionStates.Connected)
            {
                Console.WriteLine("All exchanges connected!");
            }
        };
    }

    private WebSocketClient CreateClient(string url, string name)
    {
        return new WebSocketClient(
            url: url,
            stateChanged: state => Console.WriteLine($"{name}: {state}"),
            error: ex => Console.Error.WriteLine($"{name} error: {ex.Message}"),
            process: (msg, ct) =>
            {
                Console.WriteLine($"{name}: {msg.AsString()}");
                return ValueTask.CompletedTask;
            },
            infoLog: (fmt, args) => Console.WriteLine($"[{name}] {fmt}", args),
            errorLog: (fmt, args) => Console.Error.WriteLine($"[{name}] {fmt}", args),
            verboseLog: null
        )
        {
            ReconnectAttempts = 5,
            ReconnectInterval = TimeSpan.FromSeconds(3)
        };
    }

    public async Task ConnectAllAsync()
    {
        await _tracker.ConnectAsync(CancellationToken.None);
    }

    public void DisconnectAll()
    {
        _tracker.Disconnect();
    }
}

WebSocket with REST API Integration

public class TradingClient
{
    private readonly WebSocketClient _wsClient;
    private readonly Uri _restApiUrl;

    public TradingClient(string wsUrl, string restUrl)
    {
        _restApiUrl = new Uri(restUrl);
        _wsClient = new WebSocketClient(
            url: wsUrl,
            stateChanged: state => Console.WriteLine($"WS State: {state}"),
            error: ex => Console.Error.WriteLine($"WS Error: {ex}"),
            process: ProcessWebSocketMessage,
            infoLog: (fmt, args) => Console.WriteLine(fmt, args),
            errorLog: (fmt, args) => Console.Error.WriteLine(fmt, args),
            verboseLog: null
        );
    }

    public async Task<AccountInfo> GetAccountInfoAsync()
    {
        var request = new RestRequest("/account", Method.Get);
        request.SetBearer(GetAuthToken());

        try
        {
            var account = await request.InvokeAsync<AccountInfo>(
                url: new Uri(_restApiUrl, request.Resource),
                caller: this,
                logVerbose: (fmt, args) => Console.WriteLine(fmt, args),
                token: CancellationToken.None
            );

            return account;
        }
        catch (RestSharpException ex)
        {
            Console.Error.WriteLine($"REST API Error: {ex.Message}");
            Console.Error.WriteLine($"Status: {ex.Response.StatusCode}");
            Console.Error.WriteLine($"Content: {ex.Response.Content}");
            throw;
        }
    }

    public async Task PlaceOrderAsync(string symbol, decimal price, decimal quantity)
    {
        var request = new RestRequest("/orders", Method.Post);
        request.SetBearer(GetAuthToken());
        request.AddBodyAsStr(new
        {
            symbol = symbol,
            price = price,
            quantity = quantity
        }.ToJson());

        var order = await request.InvokeAsync<Order>(
            url: new Uri(_restApiUrl, request.Resource),
            caller: this,
            logVerbose: (fmt, args) => Console.WriteLine(fmt, args),
            token: CancellationToken.None
        );

        Console.WriteLine($"Order placed: {order.Id}");
    }

    private async ValueTask ProcessWebSocketMessage(WebSocketMessage msg, CancellationToken ct)
    {
        var data = msg.AsObject<dynamic>();

        if (data.type == "order_update")
        {
            Console.WriteLine($"Order {data.orderId} status: {data.status}");
        }

        await ValueTask.CompletedTask;
    }

    private SecureString GetAuthToken()
    {
        // Return your authentication token
        throw new NotImplementedException();
    }
}

Best Practices

  1. Always handle errors: Provide error handlers to catch and log exceptions.

  2. Configure reconnection: Set appropriate reconnection attempts and intervals based on your use case.

  3. Use subscription IDs: Track subscriptions with IDs for automatic resend after reconnection.

  4. Monitor connection states: React to state changes to update your UI or trigger business logic.

  5. Dispose properly: Always dispose of WebSocketClient when done to clean up resources.

  6. Use async/await: Prefer async methods for better scalability.

  7. Implement backoff: Use increasing reconnection intervals to avoid overwhelming the server.

  8. Log appropriately: Use different log levels (info, error, verbose) for debugging and monitoring.

Thread Safety

The WebSocketClient class is designed to be thread-safe for the following operations:

  • Sending messages
  • Connection/disconnection
  • State management
  • Subscription tracking

However, you should not share a single WebSocketMessage instance across threads, as it contains read-only memory references.

Performance Considerations

  • Buffer Sizes: Adjust BufferSize and BufferSizeUncompress based on your message sizes.
  • Resend Interval: Lower intervals increase network traffic; higher intervals delay recovery.
  • Reconnect Attempts: Balance between reliability and resource usage.
  • Verbose Logging: Disable in production for better performance.

License

This library is part of the Ecng framework.

Support

For issues, questions, or contributions, please refer to the main StockSharp repository.

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 (7)

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

Package Downloads
StockSharp.AlphaVantage

AlphaVantage

StockSharp.IEX

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/

StockSharp.Web.Api.Client

StockSharp WebApi

StockSharp.Binance

Binance

StockSharp.Okex

OKX connector

GitHub repositories (1)

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

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.536 107 2/10/2026
1.0.535 88 2/10/2026
1.0.534 81 2/10/2026
1.0.533 233 2/4/2026
1.0.532 111 2/4/2026
1.0.531 264 2/1/2026
1.0.530 94 1/30/2026
1.0.529 92 1/30/2026
1.0.528 90 1/30/2026
1.0.527 101 1/29/2026
1.0.526 107 1/26/2026
1.0.525 91 1/26/2026
1.0.524 104 1/22/2026
1.0.523 100 1/22/2026
1.0.522 99 1/21/2026
1.0.521 125 1/19/2026
1.0.520 101 1/19/2026
1.0.519 101 1/18/2026
1.0.518 95 1/18/2026
1.0.517 102 1/16/2026
1.0.516 132 1/14/2026
1.0.515 103 1/13/2026
1.0.514 101 1/13/2026
1.0.513 106 1/12/2026
1.0.512 141 1/9/2026
1.0.511 123 1/9/2026
1.0.510 107 1/8/2026
1.0.509 112 1/8/2026
1.0.508 110 1/7/2026
1.0.507 109 1/6/2026
1.0.506 107 1/6/2026
1.0.505 113 1/5/2026
1.0.504 124 1/4/2026
1.0.503 126 1/1/2026
1.0.502 114 12/31/2025
1.0.501 116 12/30/2025
1.0.500 110 12/30/2025
1.0.499 120 12/29/2025
1.0.498 114 12/29/2025
1.0.497 118 12/26/2025
1.0.496 112 12/26/2025
1.0.495 109 12/26/2025
1.0.494 129 12/26/2025
1.0.493 204 12/25/2025
1.0.492 207 12/25/2025
1.0.491 216 12/24/2025
1.0.490 209 12/23/2025
1.0.489 197 12/22/2025
1.0.488 198 12/22/2025
1.0.487 202 12/22/2025
1.0.486 190 12/21/2025
1.0.485 243 12/19/2025
1.0.484 267 12/19/2025
1.0.483 307 12/18/2025
1.0.482 304 12/17/2025
1.0.481 306 12/15/2025
1.0.480 279 12/15/2025
1.0.479 264 12/14/2025
1.0.478 185 12/14/2025
1.0.477 182 12/13/2025
1.0.476 205 12/13/2025
1.0.475 172 12/12/2025
1.0.474 158 12/12/2025
1.0.473 146 12/12/2025
1.0.472 152 12/12/2025
1.0.471 148 12/12/2025
1.0.470 149 12/12/2025
1.0.469 152 12/12/2025
1.0.468 752 12/2/2025
1.0.467 708 12/2/2025
1.0.466 704 12/2/2025
1.0.465 307 11/30/2025
1.0.464 183 11/29/2025
1.0.463 173 11/28/2025
1.0.462 176 11/28/2025
1.0.461 220 11/27/2025
1.0.460 262 11/24/2025
1.0.459 231 11/24/2025
1.0.458 228 11/23/2025
1.0.457 202 11/23/2025
1.0.456 257 11/22/2025
1.0.455 464 11/20/2025
1.0.454 440 11/20/2025
1.0.453 438 11/20/2025
1.0.452 463 11/18/2025
1.0.451 446 11/18/2025
1.0.450 370 11/13/2025
1.0.449 308 11/10/2025
1.0.448 1,133 11/1/2025
1.0.447 237 10/31/2025
1.0.446 246 10/28/2025
1.0.445 368 10/27/2025
1.0.444 234 10/27/2025
1.0.443 165 10/25/2025
1.0.442 193 10/24/2025
1.0.441 299 10/20/2025
1.0.440 334 10/12/2025
1.0.439 182 10/11/2025
1.0.438 317 10/7/2025
1.0.437 259 10/6/2025
1.0.436 299 10/3/2025
1.0.435 269 10/1/2025
1.0.434 242 10/1/2025
1.0.433 241 9/30/2025
1.0.432 245 9/28/2025
1.0.431 261 9/25/2025
1.0.430 3,542 9/5/2025
1.0.429 278 9/2/2025
1.0.428 628 8/30/2025
1.0.427 299 8/30/2025
1.0.426 297 8/20/2025
1.0.425 241 8/20/2025
1.0.424 260 8/19/2025
1.0.423 267 8/15/2025
1.0.422 359 8/10/2025
1.0.421 1,075 7/16/2025
1.0.420 310 7/14/2025
1.0.419 283 7/13/2025
1.0.418 259 7/13/2025
1.0.417 231 7/12/2025
1.0.416 824 7/8/2025
1.0.415 294 7/4/2025
1.0.414 293 7/2/2025
1.0.413 453 6/24/2025
1.0.412 1,063 6/16/2025
1.0.411 448 6/9/2025
1.0.410 323 6/8/2025
1.0.409 649 5/21/2025
1.0.408 296 5/21/2025
1.0.407 279 5/17/2025
1.0.406 687 5/12/2025
1.0.405 379 5/12/2025
1.0.404 348 5/12/2025
1.0.403 269 5/11/2025
1.0.402 283 5/11/2025
1.0.401 239 5/10/2025
1.0.400 199 5/10/2025
1.0.399 325 5/6/2025
1.0.398 244 5/3/2025
1.0.397 414 4/17/2025
1.0.396 364 4/15/2025
1.0.395 261 4/12/2025
1.0.394 341 4/9/2025
1.0.393 295 4/6/2025
1.0.392 252 4/5/2025
1.0.391 1,129 3/22/2025
1.0.390 324 3/20/2025
1.0.389 311 3/20/2025
1.0.388 306 3/19/2025
1.0.387 872 2/26/2025
1.0.386 281 2/26/2025
1.0.385 799 2/8/2025
1.0.384 275 2/8/2025
1.0.383 259 2/8/2025
1.0.382 252 2/6/2025
1.0.381 243 2/6/2025
1.0.380 261 2/6/2025
1.0.379 271 2/6/2025
1.0.378 247 2/6/2025
1.0.377 250 2/5/2025
1.0.376 247 2/5/2025
1.0.375 269 2/5/2025
1.0.374 294 2/3/2025
1.0.373 275 2/2/2025
1.0.372 293 2/1/2025
1.0.371 280 1/31/2025
1.0.370 284 1/30/2025
1.0.369 264 1/26/2025
1.0.368 297 1/21/2025
1.0.367 280 1/20/2025
1.0.366 246 1/20/2025
1.0.365 263 1/19/2025
1.0.364 252 1/19/2025
1.0.363 278 1/15/2025
1.0.362 245 1/15/2025
1.0.361 240 1/14/2025
1.0.360 232 1/12/2025
1.0.359 224 1/12/2025
1.0.358 243 1/12/2025
1.0.357 210 1/12/2025
1.0.356 262 1/10/2025
1.0.355 1,097 12/30/2024
1.0.354 285 12/27/2024
1.0.353 304 12/19/2024
1.0.352 774 11/20/2024
1.0.351 280 11/19/2024
1.0.350 263 11/19/2024
1.0.349 825 11/18/2024
1.0.348 499 11/15/2024
1.0.347 247 11/14/2024
1.0.346 272 11/14/2024
1.0.345 280 11/14/2024
1.0.344 228 11/14/2024
1.0.343 261 11/14/2024
1.0.342 298 11/7/2024
1.0.341 309 10/31/2024
1.0.340 363 10/20/2024
1.0.339 285 10/20/2024
1.0.338 301 10/20/2024
1.0.337 289 10/19/2024
1.0.336 307 10/19/2024
1.0.335 308 10/19/2024
1.0.334 299 10/19/2024
1.0.333 302 10/19/2024
1.0.332 281 10/19/2024
1.0.331 311 10/19/2024
1.0.330 340 10/18/2024
1.0.329 293 10/17/2024
1.0.328 256 10/17/2024
1.0.327 282 10/17/2024
1.0.326 834 10/14/2024
1.0.325 262 10/13/2024
1.0.324 262 10/13/2024
1.0.323 276 10/12/2024
1.0.322 474 10/9/2024
1.0.321 278 10/9/2024
1.0.320 470 10/5/2024
1.0.319 802 9/18/2024
1.0.318 256 9/18/2024
1.0.317 281 9/18/2024
1.0.316 273 9/17/2024
1.0.315 776 9/3/2024
1.0.314 323 9/1/2024
1.0.313 990 8/9/2024
1.0.312 281 8/9/2024
1.0.311 296 8/8/2024
1.0.310 746 7/25/2024
1.0.309 299 7/23/2024
1.0.308 320 7/17/2024
1.0.307 592 7/4/2024
1.0.306 646 6/12/2024
1.0.305 283 6/12/2024
1.0.304 287 6/12/2024
1.0.303 481 5/28/2024
1.0.302 642 5/4/2024
1.0.301 434 4/23/2024
1.0.300 296 4/21/2024
1.0.299 329 4/14/2024
1.0.298 594 3/28/2024
1.0.297 364 3/17/2024
1.0.296 563 3/9/2024
1.0.295 381 2/23/2024
1.0.294 310 2/23/2024
1.0.293 523 2/18/2024
1.0.292 316 2/18/2024
1.0.291 292 2/17/2024
1.0.290 307 2/16/2024
1.0.289 427 2/14/2024
1.0.288 305 2/13/2024
1.0.287 379 2/8/2024
1.0.286 379 2/5/2024
1.0.285 295 2/4/2024
1.0.284 467 1/23/2024
1.0.283 290 1/23/2024
1.0.282 360 1/12/2024
1.0.281 725 1/2/2024
1.0.280 335 12/29/2023
1.0.279 390 12/17/2023
1.0.278 549 12/15/2023
1.0.277 313 12/15/2023
1.0.276 294 12/15/2023
1.0.275 332 12/13/2023
1.0.274 326 12/13/2023
1.0.273 329 12/10/2023
1.0.272 698 11/18/2023
1.0.271 238 11/18/2023
1.0.270 266 11/18/2023
1.0.269 249 11/17/2023
1.0.268 222 11/12/2023
1.0.267 221 11/12/2023
1.0.266 250 11/10/2023
1.0.265 205 11/10/2023
1.0.264 247 11/9/2023
1.0.263 209 11/9/2023
1.0.262 226 11/9/2023
1.0.261 256 11/3/2023
1.0.260 240 11/1/2023
1.0.259 225 11/1/2023
1.0.258 1,483 9/8/2023
1.0.257 278 9/8/2023
1.0.256 295 9/3/2023
1.0.255 364 8/27/2023
1.0.254 290 8/24/2023
1.0.253 260 8/21/2023
1.0.252 333 8/15/2023
1.0.251 301 8/14/2023
1.0.250 276 8/14/2023
1.0.249 312 8/10/2023
1.0.248 1,031 7/29/2023
1.0.247 1,107 7/1/2023
1.0.246 320 6/29/2023
1.0.245 817 5/27/2023
1.0.244 368 5/21/2023
1.0.243 305 5/19/2023
1.0.242 1,095 5/8/2023
1.0.241 366 5/7/2023
1.0.240 356 5/7/2023
1.0.239 334 5/7/2023
1.0.238 382 5/1/2023
1.0.237 424 4/22/2023
1.0.236 383 4/21/2023
1.0.235 350 4/21/2023
1.0.234 1,247 4/13/2023
1.0.233 1,146 4/3/2023
1.0.232 502 3/27/2023
1.0.231 445 3/21/2023
1.0.230 448 3/17/2023
1.0.229 441 3/13/2023
1.0.228 1,195 3/6/2023
1.0.227 506 2/26/2023
1.0.226 950 2/21/2023
1.0.225 463 2/20/2023
1.0.224 479 2/16/2023
1.0.223 470 2/15/2023
1.0.222 440 2/14/2023
1.0.221 443 2/14/2023
1.0.220 1,370 2/9/2023
1.0.219 848 2/7/2023
1.0.218 499 2/4/2023
1.0.217 486 2/4/2023
1.0.216 498 2/3/2023
1.0.215 460 2/3/2023
1.0.214 453 2/3/2023
1.0.213 897 2/2/2023
1.0.212 846 1/30/2023
1.0.211 480 1/30/2023
1.0.210 523 1/25/2023
1.0.209 516 1/23/2023
1.0.208 465 1/23/2023
1.0.207 500 1/18/2023
1.0.206 527 1/15/2023
1.0.205 529 1/6/2023
1.0.204 1,433 1/1/2023
1.0.203 497 12/31/2022
1.0.202 981 12/30/2022
1.0.201 515 12/29/2022
1.0.200 520 12/23/2022
1.0.199 1,404 12/12/2022
1.0.198 1,082 12/8/2022
1.0.197 498 12/4/2022
1.0.196 503 12/4/2022
1.0.195 507 12/2/2022
1.0.194 532 11/30/2022
1.0.193 493 11/29/2022
1.0.192 490 11/28/2022
1.0.191 529 11/26/2022
1.0.190 526 11/26/2022
1.0.189 530 11/25/2022
1.0.188 528 11/25/2022
1.0.187 542 11/18/2022
1.0.186 1,613 11/11/2022
1.0.185 564 11/11/2022
1.0.184 518 11/10/2022
1.0.183 582 11/5/2022
1.0.182 563 11/4/2022
1.0.181 542 11/2/2022
1.0.180 535 11/2/2022
1.0.179 1,443 11/1/2022
1.0.178 1,670 10/16/2022
1.0.177 760 9/25/2022
1.0.176 687 9/10/2022
1.0.175 2,994 9/8/2022
1.0.174 667 9/8/2022
1.0.173 671 9/8/2022
1.0.172 648 9/4/2022
1.0.171 644 9/4/2022
1.0.170 5,366 8/24/2022
1.0.169 729 8/8/2022
1.0.168 651 8/8/2022
1.0.167 1,278 7/31/2022
1.0.166 668 7/31/2022
1.0.165 679 7/26/2022
1.0.164 648 7/26/2022
1.0.163 3,214 7/21/2022
1.0.162 706 7/19/2022
1.0.161 3,171 7/18/2022
1.0.160 702 7/13/2022
1.0.159 686 7/8/2022
1.0.158 713 6/30/2022
1.0.157 716 6/20/2022
1.0.156 668 6/18/2022
1.0.155 712 6/6/2022
1.0.154 759 5/27/2022
1.0.153 5,230 4/30/2022
1.0.152 695 4/20/2022
1.0.151 726 4/10/2022
1.0.150 694 4/7/2022
1.0.149 673 4/7/2022
1.0.148 735 4/2/2022
1.0.147 694 3/29/2022
1.0.146 677 3/27/2022
1.0.145 683 3/27/2022
1.0.144 3,933 3/24/2022
1.0.143 2,695 2/20/2022
1.0.142 658 2/20/2022
1.0.141 665 2/20/2022
1.0.140 695 2/20/2022
1.0.139 718 2/20/2022
1.0.138 681 2/20/2022
1.0.137 676 2/20/2022
1.0.136 696 2/20/2022
1.0.135 698 2/20/2022
1.0.134 686 2/19/2022
1.0.133 4,579 2/10/2022
1.0.132 798 1/27/2022
1.0.131 720 1/27/2022
1.0.130 3,581 1/24/2022
1.0.129 668 1/24/2022
1.0.128 706 1/23/2022
1.0.127 7,030 12/29/2021
1.0.126 554 12/27/2021
1.0.125 497 12/27/2021
1.0.124 519 12/27/2021
1.0.123 1,779 12/20/2021
1.0.122 563 12/17/2021
1.0.121 552 12/16/2021
1.0.120 534 12/15/2021
1.0.119 519 12/14/2021
1.0.118 545 12/14/2021
1.0.117 502 12/13/2021
1.0.116 668 12/12/2021
1.0.115 1,643 12/10/2021
1.0.114 551 12/7/2021
1.0.113 550 12/7/2021
1.0.112 1,988 12/6/2021
1.0.111 550 12/6/2021
1.0.110 555 12/5/2021
1.0.109 1,246 12/3/2021
1.0.108 1,052 12/3/2021
1.0.107 584 12/2/2021
1.0.106 2,471 11/29/2021
1.0.105 5,278 11/23/2021
1.0.104 541 11/23/2021
1.0.103 1,632 11/22/2021
1.0.102 638 11/17/2021
1.0.101 593 11/14/2021
1.0.100 1,761 11/13/2021
1.0.99 606 11/11/2021
1.0.98 587 11/11/2021
1.0.97 569 11/10/2021
1.0.96 584 11/9/2021
1.0.95 2,616 11/6/2021
1.0.94 615 11/6/2021
1.0.93 2,187 11/5/2021
1.0.92 642 11/5/2021
1.0.91 604 11/4/2021
1.0.90 569 11/4/2021
1.0.89 634 11/3/2021
1.0.88 693 10/30/2021
1.0.87 2,057 10/21/2021
1.0.86 666 10/17/2021
1.0.85 676 10/17/2021
1.0.84 3,064 10/14/2021
1.0.83 603 10/13/2021
1.0.82 626 10/13/2021
1.0.81 596 10/12/2021
1.0.80 2,152 10/11/2021
1.0.79 582 10/9/2021
1.0.78 1,966 10/7/2021
1.0.77 2,172 10/7/2021
1.0.76 583 10/7/2021
1.0.75 618 10/6/2021
1.0.74 672 9/28/2021
1.0.73 2,381 9/23/2021
1.0.72 719 9/11/2021
1.0.71 618 9/10/2021
1.0.70 683 9/9/2021
1.0.69 585 9/8/2021
1.0.68 648 9/8/2021
1.0.67 2,171 9/6/2021
1.0.66 716 8/31/2021
1.0.65 576 8/30/2021
1.0.64 2,629 7/31/2021
1.0.63 3,061 7/30/2021
1.0.62 698 7/26/2021
1.0.61 4,493 7/5/2021
1.0.60 654 7/1/2021
1.0.59 3,836 6/4/2021
1.0.58 5,087 4/26/2021
1.0.57 2,197 4/19/2021
1.0.56 5,741 4/8/2021
1.0.55 1,821 4/7/2021
1.0.54 636 4/7/2021
1.0.53 1,898 4/3/2021
1.0.52 7,999 3/22/2021
1.0.51 5,790 3/4/2021
1.0.50 2,174 2/26/2021
1.0.49 8,293 2/2/2021
1.0.48 3,247 1/26/2021
1.0.47 3,017 1/24/2021
1.0.46 678 1/24/2021
1.0.45 725 1/23/2021
1.0.44 3,919 1/20/2021
1.0.43 729 1/20/2021
1.0.42 2,102 1/18/2021
1.0.41 644 1/18/2021
1.0.40 2,074 1/16/2021
1.0.39 6,330 12/17/2020
1.0.38 707 12/16/2020
1.0.37 3,230 12/14/2020
1.0.36 2,139 12/9/2020
1.0.35 689 12/9/2020
1.0.34 703 12/7/2020
1.0.33 803 12/6/2020
1.0.32 757 12/2/2020
1.0.31 720 12/2/2020
1.0.30 2,218 12/1/2020
1.0.29 7,380 11/12/2020
1.0.29-atestpub 580 11/11/2020
1.0.28 3,363 10/11/2020
1.0.27 8,629 9/9/2020
1.0.26 2,646 9/3/2020
1.0.25 2,706 8/20/2020
1.0.24 6,175 8/9/2020
1.0.23 2,721 7/28/2020
1.0.22 2,659 7/19/2020
1.0.21 4,473 7/6/2020
1.0.20 6,643 6/6/2020
1.0.19 2,633 6/4/2020
1.0.18 4,399 5/29/2020
1.0.17 4,440 5/21/2020
1.0.16 778 5/17/2020
1.0.15 4,533 5/12/2020
1.0.14 8,251 5/4/2020
1.0.13 805 4/24/2020
1.0.12 792 4/22/2020
1.0.11 767 4/22/2020
1.0.10 789 4/21/2020
1.0.9 3,242 4/18/2020
1.0.8 2,602 4/16/2020
1.0.7 801 4/16/2020
1.0.6 2,275 4/15/2020
1.0.5 2,685 4/11/2020
1.0.4 2,576 4/3/2020
1.0.3 800 4/1/2020
1.0.2 2,505 3/27/2020
1.0.1 2,618 3/22/2020
1.0.0 904 3/22/2020