Foundatio.AzureServiceBus 10.2.2 Prefix Reserved

Install-Package Foundatio.AzureServiceBus -Version 10.2.2
dotnet add package Foundatio.AzureServiceBus --version 10.2.2
<PackageReference Include="Foundatio.AzureServiceBus" Version="10.2.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.AzureServiceBus --version 10.2.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Foundatio.AzureServiceBus, 10.2.2"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install Foundatio.AzureServiceBus as a Cake Addin
#addin nuget:?package=Foundatio.AzureServiceBus&version=10.2.2

// Install Foundatio.AzureServiceBus as a Cake Tool
#tool nuget:?package=Foundatio.AzureServiceBus&version=10.2.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Foundatio

Build status NuGet Version feedz.io Discord

Pluggable foundation blocks for building loosely coupled distributed apps.

Includes implementations in Redis, Azure, AWS, RabbitMQ 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 but found Azure support lacking and local set up a pain. 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.sln 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 the InMemoryCacheClient and uses the IMessageBus to keep the cache in sync across processes.
  3. RedisCacheClient: A Redis cache client implementation.
  4. RedisHybridCacheClient: This cache implementation uses both the RedisCacheClient and InMemoryCacheClient implementations and uses the RedisMessageBus to keep the in memory cache in sync across processes. This can lead to huge wins in performance as you are saving a serialization operation and call to Redis if the item exists in the local cache.
  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 lock = await locker.AcquireAsync("test");
// ...
await lock.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. 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")

Metrics

We provide five implementations that derive from the IMetricsClient interface:

  1. InMemoryMetricsClient: An in memory metrics implementation.
  2. RedisMetricsClient: An Redis metrics implementation.
  3. StatsDMetricsClient: An statsd metrics implementation.
  4. MetricsNETClient: An Metrics.NET implementation.
  5. AppMetricsClient: An AppMetrics implementation.
  6. CloudWatchMetricsClient: An AWS CloudWatch implementation.

We recommend using all of the IMetricsClient implementations as singletons.

Sample
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);

Sample Application

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

Roadmap

This is a list of high level things that we are planning to do:

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Foundatio.AzureServiceBus:

Package Downloads
SoftwarePioniere.Fx.Hosting

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
10.2.2 545 9/23/2021
10.2.0 1,917 7/8/2021
10.1.0 369 6/16/2021
10.0.2 1,696 1/20/2021
10.0.0 1,438 9/16/2020
10.0.0-beta9 289 8/25/2020
10.0.0-beta8 262 8/3/2020
10.0.0-beta7 255 7/29/2020
10.0.0-beta6 299 7/8/2020
10.0.0-beta5 435 6/20/2020
10.0.0-beta3 375 6/14/2020
10.0.0-beta2 366 6/6/2020
10.0.0-beta10 254 9/15/2020
10.0.0-beta1 329 5/26/2020
9.0.0 38,054 1/16/2020
8.1.1518 9,785 8/30/2019
8.0.1512 1,877 5/14/2019
8.0.1510 425 4/16/2019
8.0.1507 487 2/24/2019
8.0.1505 441 2/22/2019
7.0.1490 650 5/9/2018
6.0.1467 770 11/30/2017
5.1.1454 733 5/5/2017
5.0.1336 760 3/14/2017
5.0.1334 610 3/13/2017
5.0.1331 645 3/12/2017
5.0.1329-pre 593 3/12/2017
5.0.1328-pre 611 3/12/2017
5.0.1327-pre 612 3/12/2017
5.0.1326-pre 611 3/12/2017
5.0.1324-pre 602 3/12/2017
4.3.1323-pre 614 3/11/2017
4.3.1319 642 3/1/2017
4.3.1317 622 2/23/2017
4.3.1316 665 2/22/2017
4.3.1315 657 2/22/2017
4.3.1314 653 2/20/2017
4.3.1312 641 2/20/2017
4.3.1311-pre 660 2/20/2017
4.3.1307 661 2/16/2017
4.3.1306 649 2/15/2017
4.3.1305 645 2/15/2017
4.3.1304-pre 604 2/15/2017
4.3.1303-pre 627 2/14/2017
4.3.1301 634 2/14/2017
4.3.1299 635 2/14/2017
4.3.1293 663 2/12/2017
4.3.1292 628 2/10/2017
4.3.1291 681 2/10/2017
4.3.1290 649 2/10/2017
4.3.1289 644 2/9/2017
4.3.1288 630 2/9/2017
4.3.1286 646 2/8/2017
4.3.1282 629 2/5/2017
4.3.1281 632 2/5/2017
4.3.1280 625 2/5/2017
4.3.1276-pre 588 2/5/2017
4.3.1177-pre 638 9/2/2016
4.3.1164-pre 640 8/21/2016
4.2.1205-pre 626 9/19/2016
4.2.1183 792 9/9/2016
4.2.1179 661 9/8/2016
4.2.1176 660 9/2/2016
4.2.1172 631 9/1/2016
4.2.1171-pre 632 9/1/2016
4.2.1169 648 8/22/2016
4.2.1167-pre 602 8/22/2016
4.2.1166-pre 612 8/22/2016
4.2.1161 656 8/10/2016
4.2.1156-pre 635 8/2/2016
4.2.1155 651 8/1/2016
4.2.1150 672 7/20/2016
4.2.1149-pre 624 7/19/2016
4.2.1148-pre 627 7/19/2016
4.2.1147-pre 647 7/19/2016
4.2.1146-pre 612 7/19/2016
4.2.1137 706 7/19/2016
4.2.1129-pre 615 7/19/2016
4.2.1128-pre 647 7/19/2016
4.2.1127-pre 595 7/19/2016
4.2.1126-pre 626 7/19/2016
4.2.1125-pre 623 7/19/2016
4.2.1123-pre 633 7/19/2016
4.2.1119-pre 633 7/18/2016
4.2.1113-pre 657 7/16/2016
4.2.1108-pre 622 7/15/2016
4.2.1107-pre 641 7/15/2016
4.2.1104-pre 771 7/13/2016
4.2.1099-pre 784 7/12/2016
4.2.1098-pre 787 7/12/2016
4.2.1093-pre 653 7/8/2016
4.2.1091-pre 633 7/8/2016
4.2.1090-pre 649 7/8/2016
4.2.1089-pre 645 7/7/2016
4.2.1087-pre 661 7/7/2016
4.2.1083-pre 649 7/6/2016
4.2.1082-pre 636 7/6/2016
4.2.1081-pre 641 7/6/2016
4.2.1079-pre 659 7/6/2016
4.2.1078-pre 664 7/6/2016
4.2.1073-pre 654 7/5/2016
4.2.1070-pre 616 7/5/2016
4.2.1069-pre 625 7/1/2016
4.2.1059-pre 636 7/1/2016
4.2.1046-pre 608 6/24/2016
4.2.1031-pre 618 6/24/2016
4.2.1028-pre 622 6/24/2016
4.2.1027-pre 631 6/24/2016
4.1.1009 1,011 6/15/2016
4.1.1002-pre 613 6/14/2016
4.1.995-pre 822 6/13/2016
4.1.989-pre 609 5/26/2016
4.1.983-pre 603 5/25/2016
4.1.982-pre 633 5/25/2016
4.1.978-pre 639 5/6/2016
4.1.977-pre 640 5/5/2016
4.1.975-pre 625 5/5/2016
4.0.958 664 5/1/2016
4.0.957 693 4/29/2016
4.0.956 693 4/29/2016
4.0.955 662 4/28/2016
4.0.941 663 4/27/2016
4.0.940 664 4/27/2016
4.0.925 663 4/27/2016
4.0.922 694 4/27/2016
4.0.909 683 4/20/2016
4.0.880 708 4/7/2016
4.0.869 667 3/30/2016
4.0.864 677 3/29/2016
4.0.861 664 3/29/2016
4.0.860 674 3/29/2016
4.0.857 663 3/29/2016
4.0.855 650 3/29/2016
4.0.846 690 3/22/2016
4.0.842 646 3/21/2016
4.0.836 682 3/18/2016
4.0.835 676 3/18/2016
4.0.834 642 3/17/2016
4.0.832 684 3/17/2016
4.0.831 651 3/16/2016
4.0.829 643 3/16/2016
4.0.828 679 3/15/2016
4.0.827 683 3/15/2016
4.0.826 664 3/15/2016
4.0.825 709 3/13/2016
4.0.821 747 3/11/2016
4.0.819 691 3/11/2016
4.0.818 690 3/11/2016
4.0.816 713 3/11/2016
4.0.815 703 3/11/2016
4.0.814 722 3/11/2016
4.0.813 666 3/10/2016
4.0.812 752 3/10/2016
4.0.811 700 3/10/2016
4.0.810 673 3/10/2016
4.0.809 691 3/10/2016
4.0.805 638 3/9/2016
4.0.797 649 3/9/2016
4.0.796 666 3/9/2016
4.0.794 681 3/9/2016
4.0.793 651 3/9/2016
4.0.792 665 3/8/2016
4.0.791 639 3/8/2016
4.0.790 642 3/8/2016
4.0.788 681 3/8/2016
4.0.774 674 3/2/2016
4.0.773 661 3/1/2016
4.0.772 676 3/1/2016
4.0.770 659 3/1/2016
4.0.769 754 3/1/2016
4.0.762 655 3/1/2016
4.0.761 692 3/1/2016
4.0.760 657 2/29/2016
4.0.759 651 2/29/2016
4.0.758 671 2/29/2016
4.0.757 680 2/29/2016
4.0.756 676 2/27/2016
4.0.755 664 2/27/2016
4.0.754 634 2/27/2016
4.0.753 644 2/27/2016
4.0.752 665 2/27/2016
4.0.750 652 2/27/2016
4.0.749 673 2/27/2016
4.0.747 652 2/26/2016
4.0.746 657 2/26/2016
4.0.744 654 2/26/2016
4.0.743 668 2/26/2016
4.0.742 668 2/26/2016
4.0.741 659 2/26/2016
4.0.739 637 2/25/2016
4.0.738 649 2/25/2016
4.0.734 697 2/25/2016
4.0.733-beta 618 2/25/2016
4.0.672 676 2/16/2016
4.0.669 726 2/11/2016
4.0.668 716 2/11/2016
3.0.654 682 2/10/2016
3.0.646 687 2/5/2016
3.0.645 683 2/5/2016
3.0.644 637 2/5/2016
3.0.639 693 2/3/2016
3.0.638 679 2/2/2016
3.0.637 685 2/1/2016
3.0.635 655 2/1/2016
3.0.633 653 1/27/2016
3.0.632 693 1/27/2016
3.0.629 680 1/18/2016
3.0.626 671 1/18/2016
3.0.625 656 1/18/2016
3.0.624 685 12/17/2015
3.0.623 790 12/9/2015
3.0.622 680 12/9/2015
3.0.621 659 12/9/2015
3.0.620 662 12/8/2015
3.0.613 731 12/4/2015
3.0.611 670 12/3/2015
3.0.610 680 11/30/2015
3.0.606 674 11/30/2015
3.0.605 653 11/25/2015
3.0.603 693 11/23/2015
3.0.601 686 11/23/2015
3.0.600 694 11/19/2015
3.0.599 677 11/19/2015
3.0.598 676 11/17/2015
3.0.592 719 11/12/2015
3.0.589 692 11/10/2015
3.0.588 670 11/10/2015
3.0.586 718 11/10/2015
3.0.584 674 11/10/2015
3.0.583 699 11/10/2015
3.0.581 681 11/6/2015
3.0.579 684 11/6/2015
3.0.576 685 11/5/2015
3.0.575 683 11/4/2015
3.0.574 705 11/4/2015
3.0.569 699 11/3/2015
3.0.568 688 11/3/2015
3.0.566 695 11/3/2015
3.0.545 685 10/28/2015
3.0.538 714 10/22/2015
3.0.537 695 10/21/2015
3.0.536 679 10/21/2015
3.0.534 663 10/21/2015
3.0.532 722 10/21/2015
3.0.531 675 10/21/2015
3.0.524 699 10/15/2015
3.0.523 678 10/10/2015
3.0.522 709 10/10/2015
3.0.520 696 10/9/2015
3.0.519 691 10/9/2015
3.0.518 683 10/9/2015
3.0.517 676 10/9/2015
3.0.516 708 10/7/2015
3.0.514 719 10/6/2015
3.0.513 709 10/6/2015
3.0.512 715 10/6/2015
3.0.509 708 10/1/2015
3.0.507 698 10/1/2015
3.0.505 722 9/30/2015
3.0.503 760 9/30/2015
3.0.502 718 9/30/2015
3.0.479 705 9/25/2015
3.0.476 692 9/24/2015
3.0.471 708 9/24/2015
3.0.470 721 9/24/2015
3.0.469 718 9/24/2015
3.0.468 714 9/24/2015
3.0.467 709 9/24/2015
3.0.465 726 9/24/2015
3.0.459 714 9/23/2015
3.0.456 735 9/23/2015
3.0.455 707 9/22/2015
3.0.454 746 9/19/2015
3.0.453 747 9/19/2015
3.0.452 704 9/18/2015
3.0.451 727 9/18/2015
3.0.450 735 9/18/2015
3.0.447 711 9/18/2015
2.0.378 741 9/5/2015
2.0.372 722 9/4/2015
2.0.370 763 9/4/2015
2.0.368 713 9/4/2015
2.0.365 706 9/3/2015
2.0.363 699 9/3/2015
2.0.361 703 9/3/2015
1.0.360 689 9/1/2015
1.0.359 716 9/1/2015
1.0.358 711 9/1/2015
1.0.356 698 8/31/2015
1.0.355 788 8/31/2015
1.0.354 699 8/29/2015
1.0.305 735 8/19/2015
1.0.299 753 8/8/2015
1.0.293 711 7/20/2015
1.0.292 720 7/20/2015
1.0.289 714 7/10/2015
1.0.288 710 7/10/2015
1.0.286 747 7/7/2015
1.0.285 734 7/7/2015
1.0.284 718 7/7/2015
1.0.282 720 7/6/2015
1.0.281 713 7/6/2015
1.0.279 709 7/6/2015
1.0.277 678 6/18/2015
1.0.276 730 6/8/2015
1.0.275 719 6/8/2015
1.0.274 669 6/8/2015
1.0.272 719 6/1/2015
1.0.269 707 5/25/2015
1.0.268 723 5/24/2015
1.0.266 703 5/24/2015
1.0.263 718 5/21/2015
1.0.258 730 5/19/2015
1.0.257 706 5/18/2015
1.0.256 836 5/17/2015
1.0.254 684 5/13/2015
1.0.253 707 5/13/2015
1.0.250 713 5/13/2015
1.0.249 725 5/12/2015
1.0.248 704 5/12/2015
1.0.245 716 5/12/2015
1.0.241 733 5/12/2015
1.0.240 712 5/12/2015
1.0.237 718 5/11/2015
1.0.234 716 5/9/2015
1.0.233 699 5/9/2015
1.0.231 696 5/7/2015
1.0.230 744 5/7/2015
1.0.229 722 5/7/2015
1.0.226 722 5/7/2015
1.0.217 794 4/28/2015
1.0.215 734 4/27/2015
1.0.213 796 4/23/2015
1.0.210 748 4/23/2015
1.0.209 734 4/15/2015
1.0.202 746 4/15/2015
1.0.201 717 4/15/2015
1.0.198 739 4/15/2015
1.0.197 708 4/15/2015
1.0.196 724 4/15/2015
1.0.195 734 4/15/2015
1.0.194 729 4/15/2015
1.0.193 722 4/15/2015
1.0.192 750 4/15/2015
1.0.191 737 4/14/2015
1.0.189 746 4/10/2015
1.0.187 730 4/9/2015
1.0.186 759 4/8/2015
1.0.185 742 4/6/2015
1.0.183 736 4/3/2015
1.0.181 795 4/3/2015
1.0.180 753 4/2/2015
1.0.178 735 4/1/2015
1.0.177 748 4/1/2015
1.0.175 795 4/1/2015
1.0.171 738 3/31/2015
1.0.170 710 3/31/2015
1.0.168 722 3/31/2015
1.0.164 747 3/30/2015
1.0.162 724 3/28/2015
1.0.160 730 3/27/2015
1.0.159 715 3/26/2015
1.0.157 713 3/24/2015
1.0.156 750 3/24/2015
1.0.154 717 3/24/2015
1.0.152 704 3/24/2015
1.0.151 723 3/24/2015
1.0.150 772 3/23/2015
1.0.149 733 3/23/2015
1.0.148 704 3/23/2015
1.0.147 732 3/21/2015
1.0.146 727 3/20/2015
1.0.145 712 3/19/2015
1.0.143 802 3/18/2015
1.0.142 728 3/12/2015
1.0.141 699 3/12/2015
1.0.140 824 3/5/2015
1.0.139 735 3/5/2015
1.0.138 772 3/4/2015
1.0.137 712 3/3/2015
1.0.134 711 3/3/2015
1.0.129 808 3/3/2015
1.0.128 880 3/3/2015
1.0.125 803 2/28/2015
1.0.124 721 2/28/2015
1.0.122 877 2/28/2015
1.0.119 937 2/25/2015
1.0.117 860 2/24/2015
1.0.115 765 2/24/2015
1.0.114 877 2/23/2015
1.0.113 888 2/23/2015
1.0.112 925 2/23/2015
1.0.111 944 2/23/2015
1.0.110 941 2/23/2015
1.0.109 840 2/22/2015
1.0.108 851 2/22/2015
1.0.103 911 2/22/2015