Foundatio.AzureStorage 10.2.0 Prefix Reserved

Install-Package Foundatio.AzureStorage -Version 10.2.0
dotnet add package Foundatio.AzureStorage --version 10.2.0
<PackageReference Include="Foundatio.AzureStorage" Version="10.2.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.AzureStorage --version 10.2.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Foundatio.AzureStorage, 10.2.0"
#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.AzureStorage as a Cake Addin
#addin nuget:?package=Foundatio.AzureStorage&version=10.2.0

// Install Foundatio.AzureStorage as a Cake Tool
#tool nuget:?package=Foundatio.AzureStorage&version=10.2.0
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 (2)

Showing the top 2 NuGet packages that depend on Foundatio.AzureStorage:

Package Downloads
SoftwarePioniere.Fx.Hosting

Package Description

ReCloud.Business.Lgm

ReCloud Business Class Library

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Foundatio.AzureStorage:

Repository Stars
exceptionless/Exceptionless
Exceptionless server and jobs
Version Downloads Last updated
10.2.0 1,680 7/8/2021
10.1.0 381 6/16/2021
10.0.2 5,421 1/20/2021
10.0.0 3,816 9/16/2020
10.0.0-beta9 304 8/25/2020
10.0.0-beta8 206 8/3/2020
10.0.0-beta7 203 7/29/2020
10.0.0-beta6 279 7/8/2020
10.0.0-beta3 331 6/14/2020
10.0.0-beta2 297 6/6/2020
10.0.0-beta10 220 9/15/2020
10.0.0-beta1 252 5/26/2020
9.0.0 16,663 1/16/2020
8.1.1537 19,750 8/30/2019
8.0.1530 4,160 5/14/2019
8.0.1528 485 4/16/2019
8.0.1525 1,055 2/24/2019
8.0.1523 375 2/22/2019
7.0.1507 8,659 9/7/2018
7.0.1505 1,276 5/9/2018
6.0.1479 8,192 11/30/2017
5.1.1460 1,839 7/4/2017
5.1.1456 717 5/5/2017
5.0.1336 952 3/14/2017
5.0.1334 639 3/13/2017
5.0.1331 608 3/12/2017
5.0.1329-pre 586 3/12/2017
5.0.1328-pre 613 3/12/2017
5.0.1327-pre 595 3/12/2017
5.0.1326-pre 606 3/12/2017
5.0.1324-pre 609 3/12/2017
4.3.1323-pre 590 3/11/2017
4.3.1319 645 3/1/2017
4.3.1317 643 2/23/2017
4.3.1316 660 2/22/2017
4.3.1315 719 2/22/2017
4.3.1314 675 2/20/2017
4.3.1312 612 2/20/2017
4.3.1311-pre 616 2/20/2017
4.3.1307 668 2/16/2017
4.3.1306 652 2/15/2017
4.3.1305 629 2/15/2017
4.3.1304-pre 601 2/15/2017
4.3.1303-pre 616 2/14/2017
4.3.1301 645 2/14/2017
4.3.1299 629 2/14/2017
4.3.1293 653 2/12/2017
4.3.1292 651 2/10/2017
4.3.1291 658 2/10/2017
4.3.1290 666 2/10/2017
4.3.1289 648 2/9/2017
4.3.1288 640 2/9/2017
4.3.1286 653 2/8/2017
4.3.1282 659 2/5/2017
4.3.1281 635 2/5/2017
4.3.1280 643 2/5/2017
4.3.1276-pre 584 2/5/2017
4.3.1177-pre 703 9/2/2016
4.3.1164-pre 628 8/21/2016
4.2.1205-pre 666 9/19/2016
4.2.1183 1,497 9/9/2016
4.2.1179 677 9/8/2016
4.2.1176 668 9/2/2016
4.2.1172 656 9/1/2016
4.2.1171-pre 629 9/1/2016
4.2.1169 718 8/22/2016
4.2.1167-pre 643 8/22/2016
4.2.1166-pre 627 8/22/2016
4.2.1161 666 8/10/2016
4.2.1156-pre 634 8/2/2016
4.2.1155 666 8/1/2016
4.2.1150 861 7/20/2016
4.2.1149-pre 623 7/19/2016
4.2.1148-pre 630 7/19/2016
4.2.1147-pre 633 7/19/2016
4.2.1146-pre 620 7/19/2016
4.2.1137 665 7/19/2016
4.2.1129-pre 635 7/19/2016
4.2.1128-pre 630 7/19/2016
4.2.1127-pre 598 7/19/2016
4.2.1126-pre 611 7/19/2016
4.2.1125-pre 647 7/19/2016
4.2.1123-pre 636 7/19/2016
4.2.1119-pre 619 7/18/2016
4.2.1113-pre 618 7/16/2016
4.2.1108-pre 616 7/15/2016
4.2.1107-pre 616 7/15/2016
4.2.1104-pre 794 7/13/2016
4.2.1099-pre 772 7/12/2016
4.2.1098-pre 770 7/12/2016
4.2.1093-pre 636 7/8/2016
4.2.1091-pre 608 7/8/2016
4.2.1090-pre 644 7/8/2016
4.2.1089-pre 660 7/7/2016
4.2.1087-pre 622 7/7/2016
4.2.1083-pre 658 7/6/2016
4.2.1082-pre 642 7/6/2016
4.2.1081-pre 609 7/6/2016
4.2.1079-pre 623 7/6/2016
4.2.1078-pre 627 7/6/2016
4.2.1073-pre 635 7/5/2016
4.2.1070-pre 599 7/5/2016
4.2.1069-pre 617 7/1/2016
4.2.1059-pre 620 7/1/2016
4.2.1046-pre 629 6/24/2016
4.2.1031-pre 604 6/24/2016
4.2.1028-pre 644 6/24/2016
4.2.1027-pre 617 6/24/2016
4.1.1009 1,094 6/15/2016
4.1.1002-pre 613 6/14/2016
4.1.995-pre 651 6/13/2016
4.1.989-pre 932 5/26/2016
4.1.983-pre 601 5/25/2016
4.1.982-pre 619 5/25/2016
4.1.978-pre 715 5/6/2016
4.1.977-pre 622 5/5/2016
4.1.975-pre 620 5/5/2016
4.0.958 780 5/1/2016
4.0.957 667 4/29/2016
4.0.956 693 4/29/2016
4.0.955 694 4/28/2016
4.0.941 654 4/27/2016
4.0.940 659 4/27/2016
4.0.925 632 4/27/2016
4.0.922 646 4/27/2016
4.0.909 710 4/20/2016
4.0.880 755 4/7/2016
4.0.869 714 3/30/2016
4.0.864 657 3/29/2016
4.0.861 674 3/29/2016
4.0.860 640 3/29/2016
4.0.857 667 3/29/2016
4.0.855 655 3/29/2016
4.0.846 769 3/22/2016
4.0.842 699 3/21/2016
4.0.836 714 3/18/2016
4.0.835 647 3/18/2016
4.0.834 673 3/17/2016
4.0.832 639 3/17/2016
4.0.831 633 3/16/2016
4.0.829 642 3/16/2016
4.0.828 653 3/15/2016
4.0.827 664 3/15/2016
4.0.826 673 3/15/2016
4.0.825 720 3/13/2016
4.0.821 698 3/11/2016
4.0.819 654 3/11/2016
4.0.818 652 3/11/2016
4.0.816 721 3/11/2016
4.0.815 713 3/11/2016
4.0.814 727 3/11/2016
4.0.813 717 3/10/2016
4.0.812 735 3/10/2016
4.0.811 717 3/10/2016
4.0.810 705 3/10/2016
4.0.809 675 3/10/2016
4.0.805 664 3/9/2016
4.0.797 647 3/9/2016
4.0.796 645 3/9/2016
4.0.794 667 3/9/2016
4.0.793 695 3/9/2016
4.0.792 666 3/8/2016
4.0.791 655 3/8/2016
4.0.790 650 3/8/2016
4.0.788 657 3/8/2016
4.0.774 691 3/2/2016
4.0.773 692 3/1/2016
4.0.772 669 3/1/2016
4.0.770 681 3/1/2016
4.0.769 737 3/1/2016
4.0.762 650 3/1/2016
4.0.761 656 3/1/2016
4.0.760 661 2/29/2016
4.0.759 663 2/29/2016
4.0.758 676 2/29/2016
4.0.757 672 2/29/2016
4.0.756 679 2/27/2016
4.0.755 663 2/27/2016
4.0.754 666 2/27/2016
4.0.753 683 2/27/2016
4.0.752 645 2/27/2016
4.0.750 683 2/27/2016
4.0.749 661 2/27/2016
4.0.747 681 2/26/2016
4.0.746 659 2/26/2016
4.0.744 678 2/26/2016
4.0.743 665 2/26/2016
4.0.742 675 2/26/2016
4.0.741 644 2/26/2016
4.0.739 656 2/25/2016
4.0.738 644 2/25/2016
4.0.734 638 2/25/2016
4.0.733-beta 619 2/25/2016
4.0.672 802 2/16/2016
4.0.669 804 2/11/2016
4.0.668 719 2/11/2016
3.0.654 675 2/10/2016
3.0.646 700 2/5/2016
3.0.645 654 2/5/2016
3.0.644 646 2/5/2016
3.0.639 678 2/3/2016
3.0.638 683 2/2/2016
3.0.637 703 2/1/2016
3.0.635 671 2/1/2016
3.0.633 743 1/27/2016
3.0.632 661 1/27/2016
3.0.629 773 1/18/2016
3.0.626 671 1/18/2016
3.0.625 656 1/18/2016
3.0.624 884 12/17/2015
3.0.623 708 12/9/2015
3.0.622 679 12/9/2015
3.0.621 710 12/9/2015
3.0.620 669 12/8/2015
3.0.613 702 12/4/2015
3.0.611 679 12/3/2015
3.0.610 681 11/30/2015
3.0.606 684 11/30/2015
3.0.605 656 11/25/2015
3.0.603 657 11/23/2015
3.0.601 658 11/23/2015
3.0.600 722 11/19/2015
3.0.599 687 11/19/2015
3.0.598 650 11/17/2015
3.0.592 681 11/12/2015
3.0.589 677 11/10/2015
3.0.588 683 11/10/2015
3.0.586 690 11/10/2015
3.0.584 661 11/10/2015
3.0.583 688 11/10/2015
3.0.581 685 11/6/2015
3.0.579 661 11/6/2015
3.0.576 675 11/5/2015
3.0.575 672 11/4/2015
3.0.574 693 11/4/2015
3.0.569 674 11/3/2015
3.0.568 655 11/3/2015
3.0.566 656 11/3/2015
3.0.545 825 10/28/2015
3.0.538 755 10/22/2015
3.0.537 688 10/21/2015
3.0.536 717 10/21/2015
3.0.534 702 10/21/2015
3.0.532 722 10/21/2015
3.0.531 756 10/21/2015
3.0.524 669 10/15/2015
3.0.523 722 10/10/2015
3.0.522 650 10/10/2015
3.0.520 677 10/9/2015
3.0.519 658 10/9/2015
3.0.518 723 10/9/2015
3.0.517 681 10/9/2015
3.0.516 704 10/7/2015
3.0.514 762 10/6/2015
3.0.513 646 10/6/2015
3.0.512 710 10/6/2015
3.0.509 772 10/1/2015
3.0.507 687 10/1/2015
3.0.505 762 9/30/2015
3.0.503 710 9/30/2015
3.0.502 688 9/30/2015
3.0.479 699 9/25/2015
3.0.476 683 9/24/2015
3.0.471 701 9/24/2015
3.0.470 730 9/24/2015
3.0.469 680 9/24/2015
3.0.468 698 9/24/2015
3.0.467 677 9/24/2015
3.0.465 715 9/24/2015
3.0.459 676 9/23/2015
3.0.456 683 9/23/2015
3.0.455 708 9/22/2015
3.0.454 715 9/19/2015
3.0.453 706 9/19/2015
3.0.452 681 9/18/2015
3.0.451 688 9/18/2015
3.0.450 706 9/18/2015
3.0.447 710 9/18/2015
2.0.378 749 9/5/2015
2.0.372 709 9/4/2015
2.0.370 696 9/4/2015
2.0.368 699 9/4/2015
2.0.365 695 9/3/2015
2.0.363 690 9/3/2015
2.0.361 708 9/3/2015
1.0.360 702 9/1/2015
1.0.359 679 9/1/2015
1.0.358 712 9/1/2015
1.0.356 706 8/31/2015
1.0.355 701 8/31/2015
1.0.354 722 8/29/2015
1.0.305 737 8/19/2015
1.0.299 765 8/8/2015
1.0.293 719 7/20/2015
1.0.292 786 7/20/2015
1.0.289 896 7/10/2015
1.0.288 657 7/10/2015
1.0.286 815 7/7/2015
1.0.285 709 7/7/2015
1.0.284 707 7/7/2015
1.0.282 712 7/6/2015
1.0.281 693 7/6/2015
1.0.279 698 7/6/2015
1.0.277 746 6/18/2015
1.0.276 712 6/8/2015
1.0.275 674 6/8/2015
1.0.274 670 6/8/2015
1.0.272 1,038 6/1/2015
1.0.269 748 5/25/2015
1.0.268 685 5/24/2015
1.0.266 705 5/24/2015
1.0.263 708 5/21/2015
1.0.258 698 5/19/2015
1.0.257 716 5/18/2015
1.0.256 783 5/17/2015
1.0.254 656 5/13/2015
1.0.253 670 5/13/2015
1.0.250 676 5/13/2015
1.0.249 689 5/12/2015
1.0.248 681 5/12/2015
1.0.245 705 5/12/2015
1.0.241 681 5/12/2015
1.0.240 695 5/12/2015
1.0.237 691 5/11/2015
1.0.234 709 5/9/2015
1.0.233 699 5/9/2015
1.0.231 681 5/7/2015
1.0.230 692 5/7/2015
1.0.229 678 5/7/2015
1.0.226 691 5/7/2015
1.0.217 721 4/28/2015
1.0.215 706 4/27/2015
1.0.213 759 4/23/2015
1.0.210 689 4/23/2015
1.0.209 731 4/15/2015
1.0.202 693 4/15/2015
1.0.201 715 4/15/2015
1.0.198 691 4/15/2015
1.0.197 676 4/15/2015
1.0.196 675 4/15/2015
1.0.195 674 4/15/2015
1.0.194 677 4/15/2015
1.0.193 673 4/15/2015
1.0.192 676 4/15/2015
1.0.191 699 4/14/2015
1.0.189 729 4/10/2015
1.0.187 706 4/9/2015
1.0.186 697 4/8/2015
1.0.185 822 4/6/2015
1.0.183 700 4/3/2015
1.0.181 712 4/3/2015
1.0.180 672 4/2/2015
1.0.178 709 4/1/2015
1.0.177 681 4/1/2015
1.0.175 698 4/1/2015
1.0.171 671 3/31/2015
1.0.170 693 3/31/2015
1.0.168 682 3/31/2015
1.0.164 718 3/30/2015
1.0.162 690 3/28/2015
1.0.160 706 3/27/2015
1.0.159 696 3/26/2015
1.0.156 928 3/24/2015
1.0.154 680 3/24/2015
1.0.152 700 3/24/2015
1.0.151 680 3/24/2015
1.0.150 683 3/23/2015
1.0.149 682 3/23/2015
1.0.148 687 3/23/2015
1.0.147 690 3/21/2015
1.0.146 688 3/20/2015
1.0.145 685 3/19/2015
1.0.143 707 3/18/2015
1.0.142 842 3/12/2015
1.0.141 684 3/12/2015
1.0.140 720 3/5/2015
1.0.139 748 3/5/2015
1.0.138 689 3/4/2015
1.0.137 709 3/3/2015
1.0.134 703 3/3/2015
1.0.129 666 3/3/2015
1.0.128 702 3/3/2015
1.0.125 753 2/28/2015
1.0.124 671 2/28/2015
1.0.122 671 2/28/2015
1.0.119 860 2/25/2015
1.0.117 930 2/24/2015
1.0.115 663 2/24/2015
1.0.114 680 2/23/2015
1.0.113 825 2/23/2015
1.0.112 826 2/23/2015
1.0.111 818 2/23/2015
1.0.110 669 2/23/2015
1.0.109 854 2/22/2015
1.0.108 671 2/22/2015
1.0.103 804 2/22/2015
1.0.0 884 2/21/2015