Ecng.Configuration
1.0.243
See the version list below for details.
dotnet add package Ecng.Configuration --version 1.0.243
NuGet\Install-Package Ecng.Configuration -Version 1.0.243
<PackageReference Include="Ecng.Configuration" Version="1.0.243" />
<PackageVersion Include="Ecng.Configuration" Version="1.0.243" />
<PackageReference Include="Ecng.Configuration" />
paket add Ecng.Configuration --version 1.0.243
#r "nuget: Ecng.Configuration, 1.0.243"
#:package Ecng.Configuration@1.0.243
#addin nuget:?package=Ecng.Configuration&version=1.0.243
#tool nuget:?package=Ecng.Configuration&version=1.0.243
Ecng.Configuration
A lightweight and efficient configuration management library for .NET applications, providing typed access to configuration sections, application settings, and a flexible service registry.
Overview
Ecng.Configuration wraps and extends the .NET System.Configuration framework, offering:
- Type-safe access to configuration sections and groups
- Service registry pattern for dependency injection and service location
- Event-driven notifications for service registration
- AppSettings helpers with type conversion
- Thread-safe operations for concurrent access
Installation
This library requires:
- .NET Standard 2.0+ or .NET 6.0+
System.Configuration.ConfigurationManagerpackage
<PackageReference Include="System.Configuration.ConfigurationManager" />
Key Features
1. Configuration Sections
Access configuration sections by type or name with built-in caching for performance.
Access by Type
using Ecng.Configuration;
// Get a custom configuration section by type
var section = ConfigManager.GetSection<MyCustomSection>();
// Section will be null if not found
if (section != null)
{
// Use the section
var value = section.SomeProperty;
}
Access by Name
// Get section by name
var connectionStrings = ConfigManager.GetSection<ConnectionStringsSection>("connectionStrings");
// Or without type parameter
var section = ConfigManager.GetSection("mySection");
Example Configuration File
<configuration>
<configSections>
<section name="mySection" type="MyNamespace.MyCustomSection, MyAssembly"/>
</configSections>
<mySection someProperty="value" />
</configuration>
2. Configuration Section Groups
Organize related configuration sections into groups.
// Get a section group by type
var group = ConfigManager.GetGroup<MyConfigurationGroup>();
// Get a section group by name
var systemWeb = ConfigManager.GetGroup<SystemWebSectionGroup>("system.web");
3. Application Settings
Simple access to AppSettings with type conversion support.
// Get a setting with default value
int timeout = ConfigManager.TryGet<int>("RequestTimeout", 30);
// Get a boolean setting
bool enableLogging = ConfigManager.TryGet<bool>("EnableLogging", false);
// Get a string setting
string apiUrl = ConfigManager.TryGet<string>("ApiUrl", "https://default-api.com");
// Direct access to all AppSettings
var allSettings = ConfigManager.AppSettings;
foreach (string key in allSettings.AllKeys)
{
Console.WriteLine($"{key} = {allSettings[key]}");
}
Configuration File:
<configuration>
<appSettings>
<add key="RequestTimeout" value="60" />
<add key="EnableLogging" value="true" />
<add key="ApiUrl" value="https://api.example.com" />
</appSettings>
</configuration>
4. Service Registry
A lightweight service locator pattern for managing application services without heavy DI frameworks.
Register Services
// Register a service with default name (type's AssemblyQualifiedName)
var securityProvider = new CollectionSecurityProvider(securities);
ConfigManager.RegisterService<ISecurityProvider>(securityProvider);
// Register a service with a custom name
ConfigManager.RegisterService<ILogger>("FileLogger", new FileLogger());
ConfigManager.RegisterService<ILogger>("ConsoleLogger", new ConsoleLogger());
Retrieve Services
// Get a service by type (using default name)
var provider = ConfigManager.GetService<ISecurityProvider>();
// Get a service by name
var fileLogger = ConfigManager.GetService<ILogger>("FileLogger");
var consoleLogger = ConfigManager.GetService<ILogger>("ConsoleLogger");
// Try to get a service (returns default if not found)
var optionalService = ConfigManager.TryGetService<IOptionalFeature>();
if (optionalService != null)
{
// Service is available
}
Check Service Registration
// Check if a service is registered
if (ConfigManager.IsServiceRegistered<IMessageAdapter>())
{
var adapter = ConfigManager.GetService<IMessageAdapter>();
}
// Check by name
if (ConfigManager.IsServiceRegistered<ILogger>("FileLogger"))
{
// Use the file logger
}
Conditional Registration
// Register only if not already registered
ConfigManager.TryRegisterService<IDefaultService>(new DefaultServiceImpl());
// This won't override the existing registration
ConfigManager.TryRegisterService<IDefaultService>(new AnotherImpl());
Get All Services of a Type
// Get all registered services of a specific type
var allLoggers = ConfigManager.GetServices<ILogger>();
foreach (var logger in allLoggers)
{
logger.Log("Application started");
}
5. Service Registration Events
React to service registration with event handlers or subscriptions.
Global Event Handler
// Subscribe to all service registrations
ConfigManager.ServiceRegistered += (type, service) =>
{
Console.WriteLine($"Service registered: {type.Name}");
};
// Now register a service
ConfigManager.RegisterService<IMyService>(new MyServiceImpl());
// Output: Service registered: IMyService
Type-Specific Subscription
// Subscribe to a specific service type registration
ConfigManager.SubscribeOnRegister<ISecurityProvider>(provider =>
{
Console.WriteLine($"SecurityProvider registered with {provider.Count} securities");
// Initialize or configure the provider
});
// When this service is registered, the callback will be invoked
ConfigManager.RegisterService<ISecurityProvider>(new CollectionSecurityProvider(securities));
6. Service Fallback
Provide a fallback mechanism to create services on-demand when they're not registered.
// Set up a service fallback handler
ConfigManager.ServiceFallback += (type, name) =>
{
// Create services dynamically based on type
if (type == typeof(ILogger))
{
return new DefaultLogger();
}
if (type == typeof(ICache))
{
return new MemoryCache();
}
// Return null to indicate service cannot be created
return null;
};
// Now getting an unregistered service will use the fallback
var logger = ConfigManager.GetService<ILogger>(); // Creates DefaultLogger
7. Access Underlying Configuration
For advanced scenarios, access the underlying .NET Configuration object.
// Get the underlying Configuration object
var config = ConfigManager.InnerConfig;
if (config != null)
{
Console.WriteLine($"Configuration file: {config.FilePath}");
// Access sections directly
foreach (ConfigurationSection section in config.Sections)
{
Console.WriteLine($"Section: {section.SectionInformation.Name}");
}
}
Complete Usage Example
Here's a complete example showing typical usage in an application:
using Ecng.Configuration;
using System;
namespace MyApplication
{
public class Program
{
static void Main(string[] args)
{
// 1. Configure service fallback (optional)
ConfigManager.ServiceFallback += CreateDefaultServices;
// 2. Subscribe to service registrations (optional)
ConfigManager.SubscribeOnRegister<ILogger>(logger =>
{
logger.Initialize();
});
// 3. Register core services
ConfigManager.RegisterService<ILogger>(new FileLogger("app.log"));
ConfigManager.RegisterService<IExchangeInfoProvider>(
new InMemoryExchangeInfoProvider()
);
// 4. Register multiple implementations with names
ConfigManager.RegisterService<ICache>("Memory", new MemoryCache());
ConfigManager.RegisterService<ICache>("Distributed", new RedisCache());
// 5. Read application settings
var timeout = ConfigManager.TryGet<int>("Timeout", 30);
var apiUrl = ConfigManager.TryGet<string>("ApiUrl");
// 6. Get configuration section
var customSection = ConfigManager.GetSection<CustomAppSettings>();
// 7. Use services throughout your application
RunApplication();
}
static void RunApplication()
{
// Retrieve services when needed
var logger = ConfigManager.GetService<ILogger>();
logger.Log("Application started");
var provider = ConfigManager.GetService<IExchangeInfoProvider>();
var exchanges = provider.GetExchanges();
// Use named service
var cache = ConfigManager.GetService<ICache>("Memory");
cache.Set("key", "value");
}
static object CreateDefaultServices(Type type, string name)
{
// Provide default implementations
if (type == typeof(ILogger))
return new ConsoleLogger();
return null;
}
}
// Example interfaces
public interface ILogger
{
void Initialize();
void Log(string message);
}
public interface IExchangeInfoProvider
{
IEnumerable<Exchange> GetExchanges();
}
public interface ICache
{
void Set(string key, string value);
string Get(string key);
}
}
Thread Safety
All operations in ConfigManager are thread-safe:
- Configuration sections and groups are cached on first access
- Service registry operations use locking to prevent race conditions
- Multiple threads can safely register and retrieve services concurrently
// Safe to call from multiple threads
Parallel.For(0, 100, i =>
{
var service = ConfigManager.GetService<IMyService>();
service.DoWork();
});
Best Practices
1. Register Services at Application Startup
// Register all services during application initialization
public static void ConfigureServices()
{
ConfigManager.RegisterService<ILogger>(new Logger());
ConfigManager.RegisterService<IDataService>(new DataService());
// ... register other services
}
2. Use Type-Safe Access
// Prefer type-safe access over string-based access
var section = ConfigManager.GetSection<MySection>(); // Good
var section = (MySection)ConfigManager.GetSection("mySection"); // Less safe
3. Provide Defaults for AppSettings
// Always provide sensible defaults
var timeout = ConfigManager.TryGet<int>("Timeout", 30); // Good
var timeout = ConfigManager.TryGet<int>("Timeout"); // May return 0
4. Check Service Registration Before Use
// For optional services, check registration first
if (ConfigManager.IsServiceRegistered<IOptionalFeature>())
{
var feature = ConfigManager.GetService<IOptionalFeature>();
feature.Execute();
}
5. Use Named Services for Multiple Implementations
// Register different implementations with descriptive names
ConfigManager.RegisterService<IRepository>("User", new UserRepository());
ConfigManager.RegisterService<IRepository>("Product", new ProductRepository());
// Retrieve specific implementation
var userRepo = ConfigManager.GetService<IRepository>("User");
Common Patterns
Singleton Services
// Register singleton services
var singletonService = new MySingletonService();
ConfigManager.RegisterService<IMySingletonService>(singletonService);
// Every call returns the same instance
var service1 = ConfigManager.GetService<IMySingletonService>();
var service2 = ConfigManager.GetService<IMySingletonService>();
// service1 == service2
Factory Pattern with Fallback
// Use fallback as a factory
ConfigManager.ServiceFallback += (type, name) =>
{
if (type == typeof(IDataService))
{
// Create with dependencies
var logger = ConfigManager.GetService<ILogger>();
return new DataService(logger);
}
return null;
};
// First call creates and registers the service
var service = ConfigManager.GetService<IDataService>();
Configuration-Driven Service Selection
// Select service implementation based on configuration
var loggerType = ConfigManager.TryGet<string>("LoggerType", "Console");
ILogger logger = loggerType switch
{
"File" => new FileLogger(),
"Console" => new ConsoleLogger(),
"Database" => new DatabaseLogger(),
_ => new ConsoleLogger()
};
ConfigManager.RegisterService<ILogger>(logger);
Migration from .NET ConfigurationManager
If you're migrating from using ConfigurationManager directly:
// Before:
var setting = ConfigurationManager.AppSettings["MySetting"];
// After:
var setting = ConfigManager.AppSettings["MySetting"];
// Or with type conversion:
var typedSetting = ConfigManager.TryGet<int>("MySetting", 0);
// Before:
var section = (MySection)ConfigurationManager.GetSection("mySection");
// After:
var section = ConfigManager.GetSection<MySection>("mySection");
Limitations
- Configuration file must exist and be valid at application startup
- Configuration sections are cached on first load (not reloaded automatically)
- Service registry is in-memory only (not persisted)
- Not a replacement for full dependency injection frameworks (suitable for simpler scenarios)
See Also
License
Part of the StockSharp/Ecng framework.
| 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. |
-
.NETStandard 2.0
- Ecng.Common (>= 1.0.238)
- System.Configuration.ConfigurationManager (>= 8.0.1)
-
net10.0
- Ecng.Common (>= 1.0.238)
- System.Configuration.ConfigurationManager (>= 10.0.1)
-
net6.0
- Ecng.Common (>= 1.0.238)
- System.Configuration.ConfigurationManager (>= 8.0.1)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Ecng.Configuration:
| Package | Downloads |
|---|---|
|
StockSharp.BusinessEntities
Trading entities (security, trade etc.). More info on web site https://stocksharp.com/store/ |
|
|
StockSharp.Configuration
Configuration components. More info on web site https://stocksharp.com/store/ |
|
|
StockSharp.Finam
Finam |
|
|
StockSharp.Mfd
MFD |
|
|
StockSharp.Algo.Compilation
Compilation components. More info on web site https://stocksharp.com/store/ |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on Ecng.Configuration:
| 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.244 | 0 | 12/30/2025 |
| 1.0.243 | 47 | 12/29/2025 |
| 1.0.242 | 51 | 12/26/2025 |
| 1.0.241 | 38 | 12/26/2025 |
| 1.0.240 | 45 | 12/26/2025 |
| 1.0.239 | 56 | 12/26/2025 |
| 1.0.238 | 129 | 12/25/2025 |
| 1.0.237 | 149 | 12/25/2025 |
| 1.0.236 | 176 | 12/22/2025 |
| 1.0.235 | 157 | 12/21/2025 |
| 1.0.234 | 241 | 12/19/2025 |
| 1.0.233 | 231 | 12/19/2025 |
| 1.0.232 | 320 | 12/17/2025 |
| 1.0.231 | 313 | 12/15/2025 |
| 1.0.230 | 168 | 12/12/2025 |
| 1.0.229 | 127 | 12/12/2025 |
| 1.0.228 | 254 | 11/29/2025 |
| 1.0.227 | 126 | 11/28/2025 |
| 1.0.226 | 135 | 11/28/2025 |
| 1.0.225 | 186 | 11/27/2025 |
| 1.0.224 | 283 | 11/24/2025 |
| 1.0.223 | 195 | 11/24/2025 |
| 1.0.222 | 194 | 11/23/2025 |
| 1.0.221 | 243 | 11/22/2025 |
| 1.0.220 | 488 | 11/20/2025 |
| 1.0.219 | 446 | 11/18/2025 |
| 1.0.218 | 408 | 11/18/2025 |
| 1.0.217 | 392 | 11/13/2025 |
| 1.0.216 | 288 | 11/10/2025 |
| 1.0.215 | 1,157 | 11/1/2025 |
| 1.0.214 | 263 | 10/28/2025 |
| 1.0.213 | 260 | 10/27/2025 |
| 1.0.212 | 216 | 10/27/2025 |
| 1.0.211 | 141 | 10/25/2025 |
| 1.0.210 | 1,218 | 10/3/2025 |
| 1.0.209 | 437 | 9/25/2025 |
| 1.0.208 | 5,461 | 8/30/2025 |
| 1.0.207 | 338 | 8/19/2025 |
| 1.0.206 | 4,101 | 7/13/2025 |
| 1.0.205 | 228 | 7/13/2025 |
| 1.0.204 | 207 | 7/12/2025 |
| 1.0.203 | 1,105 | 7/8/2025 |
| 1.0.202 | 3,560 | 6/16/2025 |
| 1.0.201 | 412 | 6/9/2025 |
| 1.0.200 | 310 | 6/8/2025 |
| 1.0.199 | 1,056 | 5/21/2025 |
| 1.0.198 | 273 | 5/17/2025 |
| 1.0.197 | 1,126 | 5/12/2025 |
| 1.0.196 | 312 | 5/12/2025 |
| 1.0.195 | 395 | 4/17/2025 |
| 1.0.194 | 2,383 | 3/20/2025 |
| 1.0.193 | 278 | 3/19/2025 |
| 1.0.192 | 1,891 | 2/26/2025 |
| 1.0.191 | 220 | 2/26/2025 |
| 1.0.190 | 2,056 | 2/5/2025 |
| 1.0.189 | 307 | 1/21/2025 |
| 1.0.188 | 236 | 1/14/2025 |
| 1.0.187 | 246 | 1/12/2025 |
| 1.0.186 | 231 | 1/10/2025 |
| 1.0.185 | 2,186 | 12/27/2024 |
| 1.0.184 | 221 | 12/26/2024 |
| 1.0.183 | 233 | 12/26/2024 |
| 1.0.182 | 1,763 | 11/18/2024 |
| 1.0.181 | 1,050 | 11/7/2024 |
| 1.0.180 | 350 | 10/19/2024 |
| 1.0.179 | 3,016 | 10/5/2024 |
| 1.0.178 | 2,588 | 9/18/2024 |
| 1.0.177 | 241 | 9/17/2024 |
| 1.0.176 | 2,095 | 9/1/2024 |
| 1.0.175 | 6,973 | 6/12/2024 |
| 1.0.174 | 1,216 | 5/28/2024 |
| 1.0.173 | 2,658 | 5/4/2024 |
| 1.0.172 | 1,715 | 4/14/2024 |
| 1.0.171 | 2,088 | 3/28/2024 |
| 1.0.170 | 300 | 3/17/2024 |
| 1.0.169 | 1,457 | 2/23/2024 |
| 1.0.168 | 258 | 2/23/2024 |
| 1.0.167 | 2,206 | 2/18/2024 |
| 1.0.166 | 264 | 2/16/2024 |
| 1.0.165 | 1,337 | 2/13/2024 |
| 1.0.164 | 1,230 | 2/8/2024 |
| 1.0.163 | 1,470 | 2/4/2024 |
| 1.0.162 | 1,603 | 1/23/2024 |
| 1.0.161 | 327 | 1/12/2024 |
| 1.0.160 | 2,367 | 1/2/2024 |
| 1.0.159 | 291 | 12/29/2023 |
| 1.0.158 | 5,209 | 11/12/2023 |
| 1.0.157 | 241 | 11/10/2023 |
| 1.0.156 | 241 | 11/10/2023 |
| 1.0.155 | 235 | 11/9/2023 |
| 1.0.154 | 267 | 11/3/2023 |
| 1.0.153 | 259 | 11/1/2023 |
| 1.0.152 | 234 | 11/1/2023 |
| 1.0.151 | 5,721 | 9/8/2023 |
| 1.0.150 | 271 | 9/8/2023 |
| 1.0.149 | 280 | 9/3/2023 |
| 1.0.148 | 387 | 8/21/2023 |
| 1.0.147 | 328 | 8/14/2023 |
| 1.0.146 | 326 | 8/10/2023 |
| 1.0.145 | 39,099 | 6/29/2023 |
| 1.0.144 | 13,685 | 5/27/2023 |
| 1.0.143 | 383 | 5/19/2023 |
| 1.0.142 | 25,974 | 5/8/2023 |
| 1.0.141 | 450 | 4/21/2023 |
| 1.0.140 | 50,222 | 4/3/2023 |
| 1.0.139 | 572 | 3/13/2023 |
| 1.0.138 | 18,121 | 3/6/2023 |
| 1.0.137 | 458 | 2/26/2023 |
| 1.0.136 | 46,610 | 2/9/2023 |
| 1.0.135 | 15,839 | 2/7/2023 |
| 1.0.134 | 491 | 2/4/2023 |
| 1.0.133 | 18,785 | 2/2/2023 |
| 1.0.132 | 17,271 | 1/30/2023 |
| 1.0.131 | 539 | 1/18/2023 |
| 1.0.130 | 44,164 | 12/30/2022 |
| 1.0.129 | 521 | 12/23/2022 |
| 1.0.128 | 500 | 12/23/2022 |
| 1.0.127 | 20,213 | 12/12/2022 |
| 1.0.126 | 20,359 | 12/4/2022 |
| 1.0.125 | 498 | 12/4/2022 |
| 1.0.124 | 531 | 11/30/2022 |
| 1.0.123 | 530 | 11/28/2022 |
| 1.0.122 | 563 | 11/18/2022 |
| 1.0.121 | 28,289 | 11/11/2022 |
| 1.0.120 | 549 | 11/11/2022 |
| 1.0.119 | 546 | 11/10/2022 |
| 1.0.118 | 584 | 11/5/2022 |
| 1.0.117 | 578 | 11/4/2022 |
| 1.0.116 | 23,558 | 11/1/2022 |
| 1.0.115 | 24,641 | 10/16/2022 |
| 1.0.114 | 760 | 9/10/2022 |
| 1.0.113 | 49,592 | 9/8/2022 |
| 1.0.112 | 649 | 9/8/2022 |
| 1.0.111 | 639 | 9/8/2022 |
| 1.0.110 | 643 | 9/4/2022 |
| 1.0.109 | 87,759 | 8/24/2022 |
| 1.0.108 | 735 | 8/8/2022 |
| 1.0.107 | 660 | 7/26/2022 |
| 1.0.106 | 665 | 7/26/2022 |
| 1.0.105 | 51,601 | 7/19/2022 |
| 1.0.104 | 44,733 | 7/18/2022 |
| 1.0.103 | 698 | 7/8/2022 |
| 1.0.102 | 742 | 6/18/2022 |
| 1.0.101 | 711 | 6/6/2022 |
| 1.0.100 | 94,203 | 4/30/2022 |
| 1.0.99 | 993 | 4/20/2022 |
| 1.0.98 | 1,014 | 4/10/2022 |
| 1.0.97 | 973 | 4/7/2022 |
| 1.0.96 | 982 | 4/7/2022 |
| 1.0.95 | 999 | 4/2/2022 |
| 1.0.94 | 12,334 | 3/29/2022 |
| 1.0.93 | 1,222 | 3/27/2022 |
| 1.0.92 | 258,151 | 1/24/2022 |
| 1.0.91 | 157,069 | 12/29/2021 |
| 1.0.90 | 27,759 | 12/20/2021 |
| 1.0.89 | 682 | 12/13/2021 |
| 1.0.88 | 54,664 | 12/6/2021 |
| 1.0.87 | 744 | 12/2/2021 |
| 1.0.86 | 33,770 | 11/29/2021 |
| 1.0.85 | 32,553 | 11/22/2021 |
| 1.0.84 | 4,255 | 11/17/2021 |
| 1.0.83 | 34,053 | 11/13/2021 |
| 1.0.82 | 7,712 | 11/10/2021 |
| 1.0.81 | 4,444 | 11/9/2021 |
| 1.0.80 | 67,293 | 11/5/2021 |
| 1.0.79 | 6,226 | 11/4/2021 |
| 1.0.78 | 4,295 | 11/4/2021 |
| 1.0.77 | 4,211 | 11/3/2021 |
| 1.0.76 | 4,526 | 10/30/2021 |
| 1.0.75 | 35,632 | 10/21/2021 |
| 1.0.74 | 4,980 | 10/17/2021 |
| 1.0.73 | 65,569 | 10/14/2021 |
| 1.0.72 | 15,753 | 10/13/2021 |
| 1.0.71 | 4,657 | 10/12/2021 |
| 1.0.70 | 35,945 | 10/11/2021 |
| 1.0.69 | 4,439 | 10/9/2021 |
| 1.0.68 | 39,284 | 10/7/2021 |
| 1.0.67 | 41,320 | 10/7/2021 |
| 1.0.66 | 4,462 | 10/7/2021 |
| 1.0.65 | 4,529 | 10/6/2021 |
| 1.0.64 | 3,187 | 9/28/2021 |
| 1.0.63 | 36,895 | 9/23/2021 |
| 1.0.62 | 4,807 | 9/10/2021 |
| 1.0.61 | 2,907 | 9/9/2021 |
| 1.0.60 | 2,883 | 9/8/2021 |
| 1.0.59 | 2,922 | 9/8/2021 |
| 1.0.58 | 33,199 | 9/6/2021 |
| 1.0.57 | 3,167 | 8/31/2021 |
| 1.0.56 | 2,878 | 8/30/2021 |
| 1.0.55 | 36,256 | 7/31/2021 |
| 1.0.54 | 62,255 | 7/30/2021 |
| 1.0.53 | 3,299 | 7/26/2021 |
| 1.0.52 | 91,686 | 7/5/2021 |
| 1.0.51 | 3,288 | 7/1/2021 |
| 1.0.50 | 65,422 | 6/4/2021 |
| 1.0.49 | 93,201 | 4/26/2021 |
| 1.0.48 | 34,074 | 4/19/2021 |
| 1.0.47 | 151,563 | 4/7/2021 |
| 1.0.46 | 33,305 | 4/3/2021 |
| 1.0.45 | 181,472 | 3/22/2021 |
| 1.0.44 | 115,226 | 3/4/2021 |
| 1.0.43 | 36,444 | 2/26/2021 |
| 1.0.42 | 170,310 | 2/2/2021 |
| 1.0.41 | 119,867 | 1/24/2021 |
| 1.0.40 | 3,400 | 1/23/2021 |
| 1.0.39 | 60,258 | 1/20/2021 |
| 1.0.38 | 3,292 | 1/20/2021 |
| 1.0.37 | 33,714 | 1/18/2021 |
| 1.0.36 | 30,141 | 1/16/2021 |
| 1.0.35 | 118,597 | 12/16/2020 |
| 1.0.34 | 57,214 | 12/14/2020 |
| 1.0.33 | 35,208 | 12/9/2020 |
| 1.0.32 | 5,654 | 12/6/2020 |
| 1.0.31 | 6,648 | 12/2/2020 |
| 1.0.30 | 31,498 | 12/1/2020 |
| 1.0.29 | 188,932 | 11/12/2020 |
| 1.0.29-atestpub | 1,766 | 11/11/2020 |
| 1.0.28 | 32,711 | 10/11/2020 |
| 1.0.27 | 113,010 | 9/9/2020 |
| 1.0.26 | 31,175 | 9/3/2020 |
| 1.0.25 | 31,849 | 8/20/2020 |
| 1.0.24 | 86,007 | 8/9/2020 |
| 1.0.23 | 32,082 | 7/28/2020 |
| 1.0.22 | 31,049 | 7/19/2020 |
| 1.0.21 | 57,914 | 7/6/2020 |
| 1.0.20 | 86,608 | 6/6/2020 |
| 1.0.19 | 32,330 | 6/4/2020 |
| 1.0.18 | 59,268 | 5/29/2020 |
| 1.0.17 | 59,195 | 5/21/2020 |
| 1.0.16 | 4,363 | 5/17/2020 |
| 1.0.15 | 57,422 | 5/12/2020 |
| 1.0.14 | 110,463 | 5/4/2020 |
| 1.0.13 | 8,444 | 4/24/2020 |
| 1.0.12 | 11,177 | 4/22/2020 |
| 1.0.11 | 4,279 | 4/22/2020 |
| 1.0.10 | 4,279 | 4/21/2020 |
| 1.0.9 | 32,577 | 4/18/2020 |
| 1.0.8 | 30,854 | 4/16/2020 |
| 1.0.7 | 4,166 | 4/16/2020 |
| 1.0.6 | 26,302 | 4/15/2020 |
| 1.0.5 | 29,036 | 4/11/2020 |
| 1.0.4 | 27,652 | 4/3/2020 |
| 1.0.3 | 3,795 | 4/1/2020 |
| 1.0.2 | 14,936 | 3/27/2020 |
| 1.0.1 | 13,845 | 3/22/2020 |
| 1.0.0 | 6,212 | 3/22/2020 |