Foundatio.MetricsNET 10.5.0

The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved
.NET Standard 2.0
dotnet add package Foundatio.MetricsNET --version 10.5.0
NuGet\Install-Package Foundatio.MetricsNET -Version 10.5.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Foundatio.MetricsNET" Version="10.5.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.MetricsNET --version 10.5.0
#r "nuget: Foundatio.MetricsNET, 10.5.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.MetricsNET as a Cake Addin
#addin nuget:?package=Foundatio.MetricsNET&version=10.5.0

// Install Foundatio.MetricsNET as a Cake Tool
#tool nuget:?package=Foundatio.MetricsNET&version=10.5.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 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 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. 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.

Thanks to all the people who have contributed

contributors

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows net7.0 net7.0-android net7.0-ios net7.0-maccatalyst net7.0-macos net7.0-tvos net7.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
10.5.0 207 5/18/2022
10.4.0 234 3/7/2022
10.3.1 235 1/20/2022
10.3.0 219 1/20/2022
10.2.5 194 12/7/2021
10.2.4 637 12/3/2021
10.2.3 199 11/22/2021
10.2.2 246 9/23/2021
10.2.1 267 7/19/2021
10.2.0 267 7/8/2021
10.1.4 320 6/16/2021
10.1.3 286 4/23/2021
10.1.2 295 4/23/2021
10.1.1 292 4/15/2021
10.1.0 289 4/13/2021
10.0.2 321 1/20/2021
10.0.1 422 11/2/2020
10.0.0 518 9/16/2020
10.0.0-beta9 271 8/25/2020
10.0.0-beta8 264 8/3/2020
10.0.0-beta7 320 7/29/2020
10.0.0-beta6 320 7/7/2020
10.0.0-beta5 468 6/20/2020
10.0.0-beta3 266 6/14/2020
10.0.0-beta2 367 6/6/2020
10.0.0-beta10 327 9/15/2020
10.0.0-beta1 324 5/26/2020
10.0.0-alpha3 295 5/5/2020
10.0.0-alpha2 282 4/27/2020
10.0.0-alpha1 290 4/25/2020
9.1.1 785 4/28/2020
9.1.0 416 4/28/2020
9.0.0 444 1/16/2020
8.1.2126 534 8/30/2019
8.1.2123 492 8/27/2019
8.1.2120 496 8/27/2019
8.1.2115 502 8/27/2019
8.1.2109 481 8/26/2019
8.1.2058 515 5/14/2019
8.1.2027 549 4/16/2019
8.0.1965 544 2/24/2019
8.0.1948 525 2/22/2019
7.1.1845 657 11/3/2018
7.1.1841 657 11/3/2018
7.1.1837 622 11/1/2018
7.1.1833 657 11/1/2018
7.0.1831 626 11/1/2018
7.0.1818 649 10/30/2018
7.0.1738 707 9/7/2018
7.0.1706 838 5/9/2018
6.0.1586 869 11/30/2017
5.1.1562 794 10/30/2017
5.1.1521 801 9/27/2017
5.1.1515 787 9/26/2017
5.1.1501 808 9/14/2017
5.1.1498 784 8/28/2017
5.1.1492 813 8/28/2017
5.1.1490 803 8/16/2017
5.1.1474 813 8/1/2017
5.1.1470 817 7/31/2017
5.1.1457 839 6/23/2017
5.1.1448 817 5/5/2017
5.1.1443 817 5/5/2017
5.0.1336 826 3/14/2017
5.0.1334 820 3/13/2017
5.0.1331 836 3/12/2017
5.0.1329-pre 707 3/12/2017
5.0.1328-pre 680 3/12/2017
5.0.1327-pre 694 3/12/2017
5.0.1326-pre 719 3/12/2017
5.0.1324-pre 713 3/12/2017
4.3.1323-pre 707 3/11/2017
4.3.1317 863 2/23/2017
4.3.1316 841 2/22/2017
4.3.1315 848 2/22/2017
4.3.1314 878 2/20/2017
4.3.1312 847 2/20/2017
4.3.1311-pre 695 2/20/2017
4.3.1307 839 2/16/2017
4.3.1306 835 2/15/2017
4.3.1305 849 2/15/2017
4.3.1304-pre 698 2/15/2017
4.3.1303-pre 719 2/14/2017
4.3.1301 831 2/14/2017
4.3.1299 843 2/14/2017
4.3.1293 861 2/12/2017
4.3.1292 826 2/10/2017
4.3.1291 850 2/10/2017
4.3.1290 831 2/10/2017
4.3.1289 843 2/9/2017
4.3.1288 836 2/9/2017
4.3.1286 855 2/8/2017
4.3.1282 855 2/5/2017
4.3.1281 872 2/5/2017
4.3.1280 826 2/5/2017
4.3.1276-pre 716 2/5/2017
4.3.1177-pre 750 9/2/2016
4.3.1164-pre 723 8/21/2016
4.2.1205-pre 1,096 9/19/2016
4.2.1183 884 9/9/2016
4.2.1179 840 9/8/2016
4.2.1176 851 9/2/2016
4.2.1172 844 9/1/2016
4.2.1171-pre 729 9/1/2016
4.2.1169 845 8/22/2016
4.2.1167-pre 733 8/22/2016
4.2.1166-pre 723 8/22/2016
4.2.1161 851 8/10/2016
4.2.1156-pre 712 8/2/2016
4.2.1155 880 8/1/2016
4.2.1150 862 7/20/2016
4.2.1149-pre 716 7/19/2016
4.2.1148-pre 711 7/19/2016
4.2.1147-pre 731 7/19/2016
4.2.1146-pre 748 7/19/2016
4.2.1137 844 7/19/2016
4.2.1129-pre 744 7/19/2016
4.2.1128-pre 714 7/19/2016
4.2.1127-pre 749 7/19/2016
4.2.1126-pre 721 7/19/2016
4.2.1125-pre 723 7/19/2016
4.2.1123-pre 730 7/19/2016
4.2.1119-pre 721 7/18/2016
4.2.1113-pre 743 7/16/2016
4.2.1108-pre 750 7/15/2016
4.2.1107-pre 741 7/15/2016
4.2.1104-pre 907 7/13/2016
4.2.1099-pre 904 7/12/2016
4.2.1098-pre 898 7/12/2016
4.2.1093-pre 799 7/8/2016
4.2.1091-pre 810 7/8/2016
4.2.1090-pre 751 7/8/2016
4.2.1089-pre 758 7/7/2016
4.2.1087-pre 759 7/7/2016
4.2.1083-pre 782 7/6/2016
4.2.1082-pre 790 7/6/2016
4.2.1081-pre 778 7/6/2016
4.2.1079-pre 755 7/6/2016
4.2.1078-pre 754 7/6/2016
4.2.1073-pre 794 7/5/2016
4.2.1070-pre 784 7/5/2016
4.2.1069-pre 751 7/1/2016
4.2.1059-pre 745 7/1/2016
4.2.1046-pre 723 6/24/2016
4.2.1031-pre 738 6/24/2016
4.2.1028-pre 746 6/24/2016
4.2.1027-pre 749 6/24/2016
4.1.1009 909 6/15/2016
4.1.1002-pre 1,056 6/14/2016
4.1.995-pre 960 6/13/2016
4.1.989-pre 761 5/26/2016
4.1.983-pre 751 5/25/2016
4.1.982-pre 752 5/25/2016
4.1.978-pre 719 5/6/2016
4.1.977-pre 734 5/5/2016
4.1.975-pre 725 5/5/2016
4.0.958 872 5/1/2016
4.0.957 1,014 4/29/2016
4.0.956 1,042 4/29/2016
4.0.955 880 4/28/2016
4.0.941 1,136 4/27/2016
4.0.940 1,099 4/27/2016
4.0.925 1,023 4/27/2016
4.0.922 992 4/27/2016
4.0.909 1,042 4/20/2016
4.0.880 914 4/7/2016
4.0.869 908 3/30/2016
4.0.864 861 3/29/2016
4.0.861 902 3/29/2016
4.0.860 866 3/29/2016
4.0.857 863 3/29/2016
4.0.855 893 3/29/2016
4.0.846 883 3/22/2016
4.0.842 933 3/21/2016
4.0.836 858 3/18/2016
4.0.835 876 3/18/2016
4.0.834 890 3/17/2016
4.0.832 868 3/17/2016
4.0.831 851 3/16/2016
4.0.829 865 3/16/2016
4.0.828 878 3/15/2016
4.0.827 866 3/15/2016
4.0.826 877 3/15/2016
4.0.825 984 3/13/2016
4.0.821 867 3/11/2016
4.0.819 940 3/11/2016
4.0.818 872 3/11/2016
4.0.816 947 3/11/2016
4.0.815 978 3/11/2016
4.0.814 879 3/11/2016
4.0.813 983 3/10/2016
4.0.812 954 3/10/2016
4.0.811 944 3/10/2016
4.0.810 886 3/10/2016
4.0.809 882 3/10/2016
4.0.805 868 3/9/2016
4.0.797 890 3/9/2016
4.0.796 875 3/9/2016
4.0.794 875 3/9/2016
4.0.793 892 3/9/2016
4.0.792 881 3/8/2016
4.0.791 866 3/8/2016
4.0.790 871 3/8/2016
4.0.788 869 3/8/2016
4.0.774 938 3/2/2016
4.0.773 866 3/1/2016
4.0.772 891 3/1/2016
4.0.770 866 3/1/2016
4.0.769 867 3/1/2016
4.0.762 888 3/1/2016
4.0.761 860 3/1/2016
4.0.760 872 2/29/2016
4.0.759 1,078 2/29/2016
4.0.758 870 2/29/2016
4.0.757 850 2/29/2016
4.0.756 1,201 2/27/2016
4.0.755 891 2/27/2016
4.0.754 1,067 2/27/2016
4.0.753 942 2/27/2016
4.0.752 1,058 2/27/2016
4.0.750 1,143 2/27/2016
4.0.749 973 2/27/2016
4.0.747 1,148 2/26/2016
4.0.746 1,288 2/26/2016
4.0.744 971 2/26/2016
4.0.743 1,293 2/26/2016
4.0.742 1,234 2/26/2016
4.0.741 1,052 2/26/2016
4.0.739 937 2/25/2016
4.0.738 1,096 2/25/2016
4.0.734 1,251 2/25/2016
4.0.733-beta 970 2/25/2016
4.0.672 873 2/16/2016
4.0.669 857 2/11/2016
4.0.668 975 2/11/2016
3.0.654 872 2/10/2016
3.0.646 888 2/5/2016
3.0.645 869 2/5/2016
3.0.644 854 2/5/2016
3.0.639 862 2/3/2016
3.0.638 858 2/2/2016
3.0.637 875 2/1/2016
3.0.635 848 2/1/2016
3.0.633 849 1/27/2016
3.0.632 859 1/27/2016
3.0.629 938 1/18/2016
3.0.626 904 1/18/2016
3.0.625 939 1/18/2016
3.0.624 877 12/17/2015
3.0.623 916 12/9/2015
3.0.622 864 12/9/2015
3.0.621 871 12/9/2015
3.0.620 864 12/8/2015
3.0.613 1,080 12/4/2015
3.0.611 889 12/3/2015
3.0.610 1,095 11/30/2015
3.0.606 1,005 11/30/2015
3.0.605 976 11/25/2015
3.0.603 999 11/23/2015
3.0.601 960 11/23/2015
3.0.600 985 11/19/2015
3.0.599 958 11/19/2015
3.0.598 953 11/17/2015
3.0.592 916 11/12/2015
3.0.589 917 11/10/2015
3.0.588 920 11/10/2015
3.0.586 908 11/10/2015
3.0.584 942 11/10/2015
3.0.583 927 11/10/2015
3.0.581 900 11/6/2015
3.0.579 870 11/6/2015
3.0.576 902 11/5/2015
3.0.575 904 11/4/2015
3.0.574 900 11/4/2015
3.0.569 881 11/3/2015
3.0.568 912 11/3/2015
3.0.566 893 11/3/2015
3.0.545 896 10/28/2015
3.0.538 893 10/22/2015
3.0.537 891 10/21/2015
3.0.536 883 10/21/2015
3.0.534 898 10/21/2015
3.0.532 903 10/21/2015
3.0.531 880 10/21/2015
3.0.524 889 10/15/2015
3.0.523 909 10/10/2015
3.0.522 928 10/10/2015
3.0.520 898 10/9/2015
3.0.519 1,005 10/9/2015
3.0.518 1,207 10/9/2015
3.0.517 1,000 10/9/2015
3.0.516 1,062 10/7/2015
3.0.514 964 10/6/2015
3.0.513 1,085 10/6/2015
3.0.512 1,263 10/6/2015
3.0.509 1,028 10/1/2015
3.0.507 983 10/1/2015
3.0.505 1,032 9/30/2015
3.0.503 1,007 9/30/2015
3.0.502 974 9/30/2015
3.0.479 993 9/25/2015
3.0.476 944 9/24/2015
3.0.471 955 9/24/2015
3.0.470 931 9/24/2015
3.0.469 939 9/24/2015
3.0.468 929 9/24/2015
3.0.467 960 9/24/2015
3.0.465 936 9/24/2015
3.0.459 953 9/23/2015
3.0.456 966 9/23/2015
3.0.455 949 9/22/2015
3.0.454 968 9/19/2015
3.0.453 987 9/19/2015
3.0.452 956 9/18/2015
3.0.451 967 9/18/2015
3.0.450 956 9/18/2015
3.0.447 921 9/18/2015
2.0.378 924 9/5/2015
2.0.372 925 9/4/2015
2.0.370 933 9/4/2015
2.0.368 907 9/4/2015
2.0.365 921 9/3/2015
2.0.363 924 9/3/2015
2.0.361 906 9/3/2015
1.0.360 928 9/1/2015
1.0.359 909 9/1/2015
1.0.358 887 9/1/2015
1.0.356 909 8/31/2015
1.0.355 982 8/31/2015
1.0.354 900 8/29/2015
1.0.305 910 8/19/2015
1.0.299 1,196 8/8/2015
1.0.293 938 7/20/2015
1.0.292 921 7/20/2015
1.0.289 902 7/10/2015
1.0.288 901 7/10/2015
1.0.286 944 7/7/2015
1.0.285 923 7/7/2015
1.0.284 930 7/7/2015
1.0.282 900 7/6/2015
1.0.281 916 7/6/2015
1.0.279 932 7/6/2015
1.0.277 923 6/18/2015
1.0.276 896 6/8/2015
1.0.275 880 6/8/2015
1.0.274 878 6/8/2015
1.0.272 1,142 6/1/2015
1.0.269 918 5/25/2015
1.0.268 916 5/24/2015
1.0.266 943 5/24/2015
1.0.263 899 5/21/2015
1.0.258 912 5/19/2015
1.0.257 911 5/18/2015
1.0.256 988 5/17/2015
1.0.254 892 5/13/2015
1.0.253 912 5/13/2015
1.0.250 901 5/13/2015
1.0.249 924 5/12/2015
1.0.248 881 5/12/2015
1.0.245 904 5/12/2015
1.0.241 918 5/12/2015