Foundatio 12.0.0

FoundatioFoundatio

Build status NuGet Version feedz.io Discord

Pluggable foundation blocks for building loosely coupled distributed apps.

Includes implementations in Redis, Azure, AWS, RabbitMQ, Kafka and in memory (for development).

Why Foundatio?

When building several big cloud applications we found a lack of great solutions (that's not to say there isn't solutions out there) for many key pieces to building scalable distributed applications while keeping the development experience simple. Here are a few examples of why we built and use Foundatio:

  • Wanted to build against abstract interfaces so that we could easily change implementations.
  • Wanted the blocks to be dependency injection friendly.
  • Caching: We were initially using an open source Redis cache client but then it turned into a commercial product with high licensing costs. Not only that, but there weren't any in memory implementations so every developer was required to set up and configure Redis.
  • Message Bus: We initially looked at NServiceBus (great product) but it had high licensing costs (they have to eat too) but was not OSS friendly. We also looked into MassTransit (another great product) but found Azure support lacking at the time and local set up a pain (for in memory). We wanted a simple message bus that just worked locally or in the cloud.
  • Storage: We couldn't find any existing project that was decoupled and supported in memory, file storage or Azure Blob Storage.

To summarize, if you want pain free development and testing while allowing your app to scale, use Foundatio!

Implementations

Getting Started (Development)

Foundatio can be installed via the NuGet package manager. If you need help, please open an issue or join our Discord chat room. We’re always here to help if you have any questions!

This section is for development purposes only! If you are trying to use the Foundatio libraries, please get them from NuGet.

  1. You will need to have Visual Studio Code installed.
  2. Open the Foundatio.slnx Visual Studio solution file.

Using Foundatio

The sections below contain a small subset of what's possible with Foundatio. We recommend taking a peek at the source code for more information. Please let us know if you have any questions or need assistance!

Caching

Caching allows you to store and access data lightning fast, saving you exspensive operations to create or get data. We provide four different cache implementations that derive from the ICacheClient interface:

  1. InMemoryCacheClient: An in memory cache client implementation. This cache implementation is only valid for the lifetime of the process. It's worth noting that the in memory cache client has the ability to cache the last X items via the MaxItems property. We use this in Exceptionless to only keep the last 250 resolved geoip results.
  2. HybridCacheClient: This cache implementation uses both an ICacheClient and the InMemoryCacheClient and uses an IMessageBus to keep the cache in sync across processes. This can lead to huge wins in performance as you are saving a serialization operation and a call to the remote cache if the item exists in the local cache.
  3. RedisCacheClient: A Redis cache client implementation.
  4. RedisHybridCacheClient: An implementation of HybridCacheClient that uses the RedisCacheClient as ICacheClient and the RedisMessageBus as IMessageBus.
  5. ScopedCacheClient: This cache implementation takes an instance of ICacheClient and a string scope. The scope is prefixed onto every cache key. This makes it really easy to scope all cache keys and remove them with ease.

Sample

using Foundatio.Caching;

ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");

Queues

Queues offer First In, First Out (FIFO) message delivery. We provide four different queue implementations that derive from the IQueue interface:

  1. InMemoryQueue: An in memory queue implementation. This queue implementation is only valid for the lifetime of the process.
  2. RedisQueue: An Redis queue implementation.
  3. AzureServiceBusQueue: An Azure Service Bus Queue implementation.
  4. AzureStorageQueue: An Azure Storage Queue implementation.
  5. SQSQueue: An AWS SQS implementation.

Sample

using Foundatio.Queues;

IQueue<SimpleWorkItem> queue = new InMemoryQueue<SimpleWorkItem>();

await queue.EnqueueAsync(new SimpleWorkItem {
    Data = "Hello"
});

var workItem = await queue.DequeueAsync();

Locks

Locks ensure a resource is only accessed by one consumer at any given time. We provide two different locking implementations that derive from the ILockProvider interface:

  1. CacheLockProvider: A lock implementation that uses cache to communicate between processes.
  2. ThrottlingLockProvider: A lock implementation that only allows a certain amount of locks through. You could use this to throttle api calls to some external service and it will throttle them across all processes asking for that lock.
  3. ScopedLockProvider: This lock implementation takes an instance of ILockProvider and a string scope. The scope is prefixed onto every lock key. This makes it really easy to scope all locks and release them with ease.

It's worth noting that all lock providers take a ICacheClient. This allows you to ensure your code locks properly across machines.

Sample

using Foundatio.Lock;

ILockProvider locker = new CacheLockProvider(new InMemoryCacheClient(), new InMemoryMessageBus());
var testLock = await locker.AcquireAsync("test");
// ...
await testLock.ReleaseAsync();

ILockProvider throttledLocker = new ThrottlingLockProvider(new InMemoryCacheClient(), 1, TimeSpan.FromMinutes(1));
var throttledLock = await throttledLocker.AcquireAsync("test");
// ...
await throttledLock.ReleaseAsync();

Messaging

Allows you to publish and subscribe to messages flowing through your application. We provide four different message bus implementations that derive from the IMessageBus interface:

  1. InMemoryMessageBus: An in memory message bus implementation. This message bus implementation is only valid for the lifetime of the process.
  2. RedisMessageBus: A Redis message bus implementation.
  3. RabbitMQMessageBus: A RabbitMQ implementation.
  4. KafkaMessageBus: A Kafka implementation.
  5. AzureServiceBusMessageBus: An Azure Service Bus implementation.

Sample

using Foundatio.Messaging;

IMessageBus messageBus = new InMemoryMessageBus();
await messageBus.SubscribeAsync<SimpleMessageA>(msg => {
  // Got message
});

await messageBus.PublishAsync(new SimpleMessageA { Data = "Hello" });

Jobs

Allows you to run a long running process (in process or out of process) without worrying about it being terminated prematurely. We provide three different ways of defining a job, based on your use case:

  1. Jobs: All jobs must derive from the IJob interface. We also have a JobBase base class you can derive from which provides a JobContext and logging. You can then run jobs by calling RunAsync() on the job or by creating a instance of the JobRunner class and calling one of the Run methods. The JobRunner can be used to easily run your jobs as Azure Web Jobs.

Sample

using Foundatio.Jobs;

public class HelloWorldJob : JobBase {
  public int RunCount { get; set; }

  protected override Task<JobResult> RunInternalAsync(JobContext context) {
     RunCount++;
     return Task.FromResult(JobResult.Success);
  }
}
var job = new HelloWorldJob();
await job.RunAsync(); // job.RunCount = 1;
await job.RunContinuousAsync(iterationLimit: 2); // job.RunCount = 3;
await job.RunContinuousAsync(cancellationToken: new CancellationTokenSource(10).Token); // job.RunCount > 10;
  1. Queue Processor Jobs: A queue processor job works great for working with jobs that will be driven from queued data. Queue Processor jobs must derive from QueueJobBase<T> class. You can then run jobs by calling RunAsync() on the job or passing it to the JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.

Sample

using Foundatio.Jobs;

public class HelloWorldQueueJob : QueueJobBase<HelloWorldQueueItem> {
  public int RunCount { get; set; }

  public HelloWorldQueueJob(IQueue<HelloWorldQueueItem> queue) : base(queue) {}

  protected override Task<JobResult> ProcessQueueEntryAsync(QueueEntryContext<HelloWorldQueueItem> context) {
     RunCount++;

     return Task.FromResult(JobResult.Success);
  }
}

public class HelloWorldQueueItem {
  public string Message { get; set; }
}
 // Register the queue for HelloWorldQueueItem.
container.AddSingleton<IQueue<HelloWorldQueueItem>>(s => new InMemoryQueue<HelloWorldQueueItem>());

// To trigger the job we need to queue the HelloWorldWorkItem message.
// This assumes that we injected an instance of IQueue<HelloWorldWorkItem> queue

IJob job = new HelloWorldQueueJob();
await job.RunAsync(); // job.RunCount = 0; The RunCount wasn't incremented because we didn't enqueue any data.

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunAsync(); // job.RunCount = 1;

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunUntilEmptyAsync(); // job.RunCount = 3;
  1. Work Item Jobs: A work item job will run in a job pool among other work item jobs. This type of job works great for things that don't happen often but should be in a job (Example: Deleting an entity that has many children.). It will be triggered when you publish a message on the message bus. The job must derive from the WorkItemHandlerBase class. You can then run all shared jobs via JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.

Sample

using System.Threading.Tasks;
using Foundatio.Jobs;

public class HelloWorldWorkItemHandler : WorkItemHandlerBase {
  public override async Task HandleItemAsync(WorkItemContext ctx) {
    var workItem = ctx.GetData<HelloWorldWorkItem>();

    // We can report the progress over the message bus easily.
    // To receive these messages just inject IMessageSubscriber
    // and Subscribe to messages of type WorkItemStatus
    await ctx.ReportProgressAsync(0, "Starting Hello World Job");
    await Task.Delay(TimeSpan.FromSeconds(2.5));
    await ctx.ReportProgressAsync(50, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(70, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(90, "Reading value.");
    await Task.Delay(TimeSpan.FromSeconds(.5));

    await ctx.ReportProgressAsync(100, workItem.Message);
  }
}

public class HelloWorldWorkItem {
  public string Message { get; set; }
}
// Register the shared job.
var handlers = new WorkItemHandlers();
handlers.Register<HelloWorldWorkItem, HelloWorldWorkItemHandler>();

// Register the handlers with dependency injection.
container.AddSingleton(handlers);

// Register the queue for WorkItemData.
container.AddSingleton<IQueue<WorkItemData>>(s => new InMemoryQueue<WorkItemData>());

// The job runner will automatically look for and run all registered WorkItemHandlers.
new JobRunner(container.GetRequiredService<WorkItemJob>(), instanceCount: 2).RunInBackground();
 // To trigger the job we need to queue the HelloWorldWorkItem message.
 // This assumes that we injected an instance of IQueue<WorkItemData> queue

 // NOTE: You may have noticed that HelloWorldWorkItem doesn't derive from WorkItemData.
 // Foundatio has an extension method that takes the model you post and serializes it to the
 // WorkItemData.Data property.
 await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });

File Storage

We provide different file storage implementations that derive from the IFileStorage interface:

  1. InMemoryFileStorage: An in memory file implementation. This file storage implementation is only valid for the lifetime of the process.
  2. FolderFileStorage: An file storage implementation that uses the hard drive for storage.
  3. AzureFileStorage: An Azure Blob storage implementation.
  4. S3FileStorage: An AWS S3 file storage implementation.
  5. RedisFileStorage: An Redis file storage implementation.
  6. MinioFileStorage An Minio file storage implementation.
  7. AliyunFileStorage: An Aliyun file storage implementation.
  8. SshNetFileStorage: An SFTP file storage implementation.

We recommend using all of the IFileStorage implementations as singletons.

Sample

using Foundatio.Storage;

IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")

Resilience

Resilience policies provide a powerful way to handle transient failures and make your applications more robust by implementing retry logic, circuit breakers, and timeouts. The resilience system allows you to configure policies globally or per-operation, giving you fine-grained control over how Foundatio components handle failures.

The resilience system is built around the IResiliencePolicy interface and provides:

  1. Retry Logic: Automatically retry failed operations with configurable delays and maximum attempts
  2. Circuit Breaker: Temporarily stop calling failing services to prevent cascading failures
  3. Timeout: Set maximum execution time for operations
  4. Exponential Backoff: Gradually increase delays between retries with optional jitter
  5. Exception Filtering: Configure which exceptions should trigger retries

You can customize resilience behavior throughout Foundatio by implementing IResiliencePolicyProvider and passing it via options. This allows you to replace the default retry behavior in caching, queues, storage, and other Foundatio components.

Resilience Policy Sample

using Foundatio.Resilience;

// Create a basic resilience policy
var policy = new ResiliencePolicyBuilder()
    .WithMaxAttempts(5)
    .WithExponentialDelay(TimeSpan.FromSeconds(1))
    .WithTimeout(TimeSpan.FromMinutes(5))
    .WithJitter()
    .Build();

// Execute an operation with resilience
await policy.ExecuteAsync(async ct => {
    // Your operation that might fail
    await SomeUnreliableOperationAsync(ct);
});

Circuit Breaker Sample

using Foundatio.Resilience;

// Create a policy with circuit breaker
var policy = new ResiliencePolicyBuilder()
    .WithMaxAttempts(3)
    .WithCircuitBreaker(cb => cb
        .WithFailureRatio(0.5) // Open circuit at 50% failure rate
        .WithMinimumCalls(10)  // Need at least 10 calls before opening
        .WithBreakDuration(TimeSpan.FromMinutes(1)))
    .Build();

await policy.ExecuteAsync(async ct => {
    // This will be protected by the circuit breaker
    await CallExternalServiceAsync(ct);
});

Custom Resilience Provider Sample

using Foundatio.Resilience;

// Create a custom resilience provider for your application
var resilienceProvider = new ResiliencePolicyProvider()
    .WithDefaultPolicy(builder => builder
        .WithMaxAttempts(3)
        .WithExponentialDelay(TimeSpan.FromSeconds(1))
        .WithTimeout(TimeSpan.FromMinutes(2)))
    .WithPolicy("external-api", builder => builder
        .WithMaxAttempts(5)
        .WithCircuitBreaker()
        .WithTimeout(TimeSpan.FromSeconds(30)))
    .WithPolicy<MyService>(builder => builder
        .WithMaxAttempts(3)
        .WithLinearDelay()
        .WithTimeout(TimeSpan.FromSeconds(30)));

// Use named policies
var apiPolicy = resilienceProvider.GetPolicy("external-api");
await apiPolicy.ExecuteAsync(async ct => {
    await CallExternalApiAsync(ct);
});

// Use class based policies
var apiPolicy = resilienceProvider.GetPolicy<MyService>();
await apiPolicy.ExecuteAsync(async ct => {
    await CallMyServiceAsync(ct);
});

Sample Application

We have both slides and a sample application that shows off how to use Foundatio.

Thanks to all the people who have contributed

contributors

Showing the top 20 packages that depend on Foundatio.

Packages Downloads
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
8
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
10
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
12
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
14
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
15
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
16
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
17
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
18

https://github.com/FoundatioFx/Foundatio/releases

Version Downloads Last updated
12.0.0 8 08/26/2025
11.1.0 11 05/17/2025
11.0.8 12 03/01/2025
11.0.7 13 03/01/2025
11.0.6 13 01/19/2025
11.0.5 13 01/19/2025
11.0.4 11 01/19/2025
11.0.3 13 01/19/2025
11.0.2 12 01/18/2025
11.0.1 11 01/18/2025
11.0.0 12 01/19/2025
10.7.1 14 01/19/2025
10.7.0 14 03/12/2024
10.6.1 14 03/01/2024
10.6.0 15 08/18/2023
10.5.0 14 03/01/2024
10.4.0 14 03/16/2024
10.3.1 14 03/12/2024
10.3.0 13 03/12/2024
10.2.5 15 03/12/2024
10.2.4 14 03/01/2024
10.2.3 14 03/12/2024
10.2.2 14 01/04/2024
10.2.1 13 02/08/2024
10.2.0 14 03/02/2024
10.1.4 13 03/01/2024
10.1.3 14 03/13/2024
10.1.2 14 12/13/2023
10.1.1 13 03/01/2024
10.1.0 14 03/12/2024
10.0.2 15 03/13/2024
10.0.1 13 03/13/2024
10.0.0 13 03/13/2024
10.0.0-beta9 10 03/16/2024
10.0.0-beta8 11 03/16/2024
10.0.0-beta7 12 03/17/2024
10.0.0-beta6 12 03/17/2024
10.0.0-beta5 12 03/17/2024
10.0.0-beta3 11 03/03/2024
10.0.0-beta2 10 03/16/2024
10.0.0-beta10 12 03/17/2024
10.0.0-beta1 13 02/27/2024
10.0.0-alpha3 13 03/22/2024
10.0.0-alpha2 14 03/17/2024
10.0.0-alpha1 14 03/17/2024
9.1.1 13 03/13/2024
9.1.0 11 01/26/2024
9.0.0 12 03/13/2024
8.1.2126 14 03/02/2024
8.1.2058 12 03/15/2024
8.1.2027 11 03/16/2024
8.0.1965 13 03/18/2024
8.0.1948 13 03/17/2024
7.1.1845 13 03/03/2024
7.1.1841 13 03/02/2024
7.1.1837 14 03/03/2024
7.1.1833 14 03/03/2024
7.0.1831 13 03/13/2024
7.0.1818 14 03/13/2024
7.0.1738 14 03/13/2024
7.0.1706 13 03/14/2024
6.0.1586 11 01/19/2025
5.1.1562 13 03/02/2024
5.1.1521 13 03/16/2024
5.1.1515 14 03/16/2024
5.1.1501 14 03/16/2024
5.1.1498 11 03/16/2024
5.1.1492 12 03/16/2024
5.1.1490 12 03/16/2024
5.1.1474 13 03/16/2024
5.1.1470 13 03/16/2024
5.1.1457 13 03/16/2024
5.1.1448 15 03/17/2024
5.1.1443 12 03/17/2024
5.0.1336 15 03/14/2024
5.0.1334 13 03/22/2024
5.0.1331 13 03/16/2024
5.0.1329-pre 11 03/02/2024
5.0.1328-pre 12 03/02/2024
5.0.1327-pre 11 03/16/2024
5.0.1326-pre 12 03/02/2024
5.0.1324-pre 12 03/06/2024
4.3.1323-pre 11 03/03/2024
4.3.1319 12 03/17/2024
4.3.1317 13 03/17/2024
4.3.1316 13 03/16/2024
4.3.1315 11 03/17/2024
4.3.1314 12 03/02/2024
4.3.1312 13 03/17/2024
4.3.1311-pre 12 03/03/2024
4.3.1307 13 03/03/2024
4.3.1306 15 03/16/2024
4.3.1305 14 03/17/2024
4.3.1304-pre 15 03/18/2024
4.3.1303-pre 11 03/19/2024
4.3.1301 15 03/16/2024
4.3.1299 15 03/17/2024
4.3.1297 11 03/16/2024
4.3.1293 12 03/16/2024
4.3.1292 13 03/16/2024
4.3.1291 14 03/17/2024
4.3.1290 14 03/17/2024
4.3.1289 13 03/16/2024
4.3.1288 13 03/16/2024
4.3.1286 12 03/17/2024
4.3.1282 13 03/14/2024
4.3.1281 11 03/16/2024
4.3.1280 14 03/16/2024
4.3.1276-pre 12 03/02/2024
4.3.1177-pre 11 03/17/2024
4.3.1164-pre 11 02/27/2024
4.2.1205-pre 12 03/18/2024
4.2.1183 13 03/16/2024
4.2.1179 12 03/17/2024
4.2.1176 11 01/19/2025
4.2.1172 14 03/03/2024
4.2.1171-pre 10 03/17/2024
4.2.1169 10 01/19/2025
4.2.1167-pre 10 03/18/2024
4.2.1166-pre 12 03/03/2024
4.2.1161 14 03/16/2024
4.2.1156-pre 12 03/18/2024
4.2.1155 14 03/16/2024
4.2.1150 12 03/16/2024
4.2.1149-pre 11 03/17/2024
4.2.1148-pre 12 03/03/2024
4.2.1147-pre 11 03/18/2024
4.2.1146-pre 11 03/17/2024
4.2.1137 13 03/17/2024
4.2.1129-pre 12 03/02/2024
4.2.1128-pre 12 03/03/2024
4.2.1127-pre 11 03/18/2024
4.2.1126-pre 11 03/02/2024
4.2.1125-pre 11 03/03/2024
4.2.1123-pre 12 03/03/2024
4.2.1119-pre 13 03/02/2024
4.2.1113-pre 12 03/18/2024
4.2.1108-pre 10 03/02/2024
4.2.1107-pre 10 03/18/2024
4.2.1104-pre 10 03/03/2024
4.2.1099-pre 12 03/17/2024
4.2.1098-pre 12 03/16/2024
4.2.1093-pre 11 03/03/2024
4.2.1091-pre 11 03/02/2024
4.2.1090-pre 12 03/05/2024
4.2.1089-pre 12 03/18/2024
4.2.1087-pre 12 03/17/2024
4.2.1083-pre 10 03/05/2024
4.2.1082-pre 11 03/02/2024
4.2.1081-pre 10 03/17/2024
4.2.1079-pre 11 03/18/2024
4.2.1078-pre 12 03/03/2024
4.2.1073-pre 11 03/17/2024
4.2.1070-pre 12 03/02/2024
4.2.1069-pre 10 03/18/2024
4.2.1059-pre 11 03/02/2024
4.2.1046-pre 13 03/02/2024
4.2.1031-pre 12 03/03/2024
4.2.1028-pre 12 03/02/2024
4.2.1027-pre 11 03/17/2024
4.1.1009 14 03/03/2024
4.1.1002-pre 12 03/16/2024
4.1.995-pre 14 03/03/2024
4.1.989-pre 14 03/05/2024
4.1.983-pre 11 03/02/2024
4.1.982-pre 10 03/02/2024
4.1.978-pre 12 03/02/2024
4.1.977-pre 13 03/05/2024
4.1.975-pre 15 03/02/2024
4.0.958 10 03/17/2024
4.0.957 11 03/17/2024
4.0.956 11 03/17/2024
4.0.955 11 03/16/2024
4.0.941 12 03/18/2024
4.0.940 11 03/16/2024
4.0.925 12 03/16/2024
4.0.922 11 03/16/2024
4.0.909 12 03/17/2024
4.0.880 10 03/17/2024
4.0.869 11 03/16/2024
4.0.864 10 03/17/2024
4.0.861 10 03/17/2024
4.0.860 12 03/17/2024
4.0.857 11 03/16/2024
4.0.855 10 03/03/2024
4.0.846 10 03/18/2024
4.0.842 11 03/17/2024
4.0.836 10 03/17/2024
4.0.835 9 01/19/2025
4.0.834 13 03/18/2024
4.0.832 10 03/18/2024
4.0.831 11 01/19/2025
4.0.829 11 03/17/2024
4.0.828 11 03/22/2024
4.0.827 12 03/17/2024
4.0.826 10 03/17/2024
4.0.825 12 03/17/2024
4.0.821 12 03/17/2024
4.0.819 11 03/17/2024
4.0.818 11 03/16/2024
4.0.816 11 03/17/2024
4.0.815 11 03/17/2024
4.0.814 15 03/22/2024
4.0.813 12 03/03/2024
4.0.812 12 03/16/2024
4.0.811 12 03/17/2024
4.0.810 12 03/16/2024
4.0.809 11 03/17/2024
4.0.805 13 03/03/2024
4.0.797 13 03/17/2024
4.0.796 9 03/16/2024
4.0.794 14 03/17/2024
4.0.793 12 03/16/2024
4.0.792 10 03/16/2024
4.0.791 11 03/17/2024
4.0.790 12 03/16/2024
4.0.788 12 03/17/2024
4.0.774 10 03/03/2024
4.0.773 11 03/22/2024
4.0.772 10 03/16/2024
4.0.770 11 03/17/2024
4.0.769 10 03/27/2024
4.0.762 14 03/16/2024
4.0.761 12 03/17/2024
4.0.760 11 03/16/2024
4.0.759 13 03/17/2024
4.0.758 11 03/16/2024
4.0.757 12 03/17/2024
4.0.756 12 03/17/2024
4.0.755 11 03/22/2024
4.0.754 11 03/16/2024
4.0.753 12 03/17/2024
4.0.752 12 03/17/2024
4.0.750 11 03/17/2024
4.0.749 11 03/22/2024
4.0.747 12 03/17/2024
4.0.746 11 03/17/2024
4.0.744 10 03/16/2024
4.0.743 11 03/17/2024
4.0.742 10 03/17/2024
4.0.741 11 03/17/2024
4.0.739 11 03/16/2024
4.0.738 10 03/14/2024
4.0.734 11 03/16/2024
4.0.733-beta 15 03/17/2024
4.0.672 11 03/17/2024
4.0.669 12 03/17/2024
4.0.668 12 03/17/2024
3.0.654 11 03/13/2024
3.0.646 11 03/13/2024
3.0.645 11 03/12/2024
3.0.644 11 03/12/2024
3.0.639 11 03/13/2024
3.0.638 11 03/13/2024
3.0.637 11 03/13/2024
3.0.635 11 03/13/2024
3.0.633 11 03/13/2024
3.0.632 9 03/03/2024
3.0.629 11 03/13/2024
3.0.626 12 03/13/2024
3.0.625 10 03/13/2024
3.0.624 11 03/13/2024
3.0.623 11 03/02/2024
3.0.622 10 03/13/2024
3.0.621 11 03/12/2024
3.0.620 10 03/22/2024
3.0.613 11 03/13/2024
3.0.611 12 03/02/2024
3.0.610 9 03/12/2024
3.0.606 11 03/13/2024
3.0.605 10 03/02/2024
3.0.603 11 03/13/2024
3.0.601 10 03/13/2024
3.0.600 11 03/13/2024
3.0.599 10 03/22/2024
3.0.598 12 03/13/2024
3.0.592 12 03/13/2024
3.0.589 11 03/13/2024
3.0.588 10 03/02/2024
3.0.586 12 03/13/2024
3.0.584 10 03/13/2024
3.0.583 13 03/13/2024
3.0.581 11 03/13/2024
3.0.579 11 03/13/2024
3.0.576 11 03/12/2024
3.0.575 12 03/12/2024
3.0.574 11 03/13/2024
3.0.569 11 03/13/2024
3.0.568 11 03/02/2024
3.0.566 13 03/12/2024
3.0.548 13 03/13/2024
3.0.545 12 03/12/2024
3.0.538 12 03/13/2024
3.0.537 10 03/12/2024
3.0.536 8 01/18/2025
3.0.534 14 03/13/2024
3.0.532 13 03/13/2024
3.0.531 11 01/19/2025
3.0.524 11 03/13/2024
3.0.523 10 03/13/2024
3.0.522 12 03/12/2024
3.0.520 11 03/13/2024
3.0.519 11 03/13/2024
3.0.518 12 03/02/2024
3.0.517 11 03/13/2024
3.0.516 10 03/13/2024
3.0.514 12 03/12/2024
3.0.513 11 03/13/2024
3.0.512 12 03/22/2024
3.0.509 11 03/13/2024
3.0.507 11 03/12/2024
3.0.505 10 03/13/2024
3.0.503 12 03/16/2024
3.0.502 10 03/13/2024
3.0.479 12 03/13/2024
3.0.476 12 03/13/2024
3.0.471 11 03/13/2024
3.0.470 11 03/13/2024
3.0.469 12 03/13/2024
3.0.468 11 03/13/2024
3.0.467 11 03/13/2024
3.0.465 11 03/13/2024
3.0.459 10 03/13/2024
3.0.456 11 03/12/2024
3.0.455 12 03/12/2024
3.0.454 11 03/12/2024
3.0.453 10 03/13/2024
3.0.452 11 03/13/2024
3.0.451 12 03/13/2024
3.0.450 11 03/13/2024
3.0.447 11 03/13/2024
2.0.378 10 03/16/2024
2.0.372 12 03/15/2024
2.0.370 11 03/14/2024
2.0.368 13 03/14/2024
2.0.365 11 03/12/2024
2.0.363 10 03/14/2024
2.0.361 13 03/14/2024
1.0.360 10 03/02/2024
1.0.359 10 02/29/2024
1.0.358 10 03/02/2024
1.0.356 12 03/13/2024
1.0.355 11 03/13/2024
1.0.354 10 03/22/2024
1.0.305 9 01/31/2025
1.0.299 11 03/16/2024
1.0.293 11 03/17/2024
1.0.292 11 03/16/2024
1.0.289 10 03/22/2024
1.0.288 12 03/26/2024
1.0.286 11 03/17/2024
1.0.285 12 03/16/2024
1.0.284 11 03/02/2024
1.0.282 12 03/16/2024
1.0.281 13 03/16/2024
1.0.279 11 03/16/2024
1.0.277 11 03/16/2024
1.0.276 11 03/16/2024
1.0.275 11 03/22/2024
1.0.274 11 03/16/2024
1.0.272 11 02/27/2024
1.0.269 10 03/16/2024
1.0.268 11 03/03/2024
1.0.266 12 03/03/2024
1.0.263 10 03/22/2024
1.0.258 10 03/03/2024
1.0.257 10 02/28/2024
1.0.256 11 03/18/2024
1.0.254 11 03/16/2024
1.0.253 12 03/19/2024
1.0.250 12 03/16/2024
1.0.249 11 03/17/2024
1.0.248 10 03/03/2024
1.0.245 12 03/02/2024
1.0.241 11 03/17/2024
1.0.240 12 03/18/2024
1.0.237 12 03/17/2024
1.0.234 13 03/03/2024
1.0.233 12 03/17/2024
1.0.231 13 03/16/2024
1.0.230 10 03/16/2024
1.0.229 10 01/19/2025
1.0.226 12 03/16/2024
1.0.217 10 03/16/2024
1.0.215 10 03/02/2024
1.0.213 12 03/03/2024
1.0.210 11 03/16/2024
1.0.209 13 03/16/2024
1.0.202 11 03/16/2024
1.0.201 12 02/28/2024
1.0.198 11 03/16/2024
1.0.197 12 03/22/2024
1.0.196 10 03/02/2024
1.0.195 11 03/03/2024
1.0.194 12 03/16/2024
1.0.193 13 03/03/2024
1.0.192 8 03/01/2025
1.0.191 11 03/17/2024
1.0.189 11 03/03/2024
1.0.187 12 03/02/2024
1.0.186 13 03/02/2024
1.0.185 12 03/03/2024
1.0.183 10 03/18/2024
1.0.181 13 03/16/2024
1.0.180 11 03/17/2024
1.0.178 12 02/28/2024
1.0.177 14 03/16/2024
1.0.175 12 03/17/2024
1.0.171 11 03/17/2024
1.0.170 9 01/18/2025
1.0.168 12 03/14/2024
1.0.164 10 03/02/2024
1.0.162 12 03/16/2024
1.0.160 12 03/17/2024
1.0.159 11 03/16/2024
1.0.157 12 03/03/2024
1.0.156 12 02/28/2024
1.0.154 12 03/16/2024
1.0.152 11 03/16/2024
1.0.151 10 03/17/2024
1.0.150 11 03/17/2024
1.0.149 13 03/03/2024
1.0.148 12 03/16/2024
1.0.147 12 03/17/2024
1.0.146 10 03/22/2024
1.0.145 11 03/17/2024
1.0.143 10 03/16/2024
1.0.142 11 03/17/2024
1.0.141 11 03/16/2024
1.0.140 11 03/17/2024
1.0.139 12 03/16/2024
1.0.138 11 02/28/2024
1.0.137 10 01/19/2025
1.0.134 10 03/16/2024
1.0.129 11 03/16/2024
1.0.128 11 03/15/2024
1.0.125 10 03/16/2024
1.0.124 9 01/19/2025
1.0.122 9 03/16/2024
1.0.119 10 03/03/2024
1.0.117 11 03/16/2024
1.0.115 12 03/03/2024
1.0.114 11 03/14/2024
1.0.113 12 03/16/2024
1.0.112 11 03/16/2024
1.0.111 12 02/28/2024
1.0.110 11 03/16/2024
1.0.109 9 01/19/2025
1.0.108 12 03/15/2024
1.0.103 11 03/16/2024
1.0.37 15 03/12/2024
1.0.36 14 03/12/2024
1.0.35 15 03/02/2024
1.0.34 14 03/13/2024
1.0.33 13 03/02/2024
1.0.32 13 03/13/2024
1.0.31 14 03/12/2024
1.0.30 13 03/12/2024
1.0.28 13 03/13/2024
1.0.27 13 03/14/2024
1.0.26 13 01/19/2025
1.0.25 14 03/13/2024
1.0.24 14 03/16/2024
1.0.23 12 03/22/2024
1.0.0 14 03/14/2024