The journey towards resumable downloads on Windows Phone

First of all, most of you would advise me to use the Background Transfers that are available in Windows Phone. And you are right! Yes you are.

But we can’t initiate a Background Transfer from a Background Agent. I still want do download files in the Background Agent. I know the standard Background Agents won’t help, because they can’t be run any longer than 25 seconds. However we still have the Resource Intensive Agents. And yes the constraints for Resource Intensive are even harder to meet. But when the constrains are met, it can run for 10 minutes. For your information these are the hard constraints to meet.

  • External power is required
  • A WiFi connection, or connected to the internet through a pc
  • The device’s battery level is greater than 90%
  • The screen is locked
  • No active phone call

 

Yes I know, in practice these constraints are only met when the phone is on charger during the night. But still it will happen. So I want to download large files, sometimes the download won’t even complete in the 10 minutes that are available. Which could be cause by a slow or medium WiFi/Internet connection in combination with very large files. So I would like to continue the unfinished downloads the next time the Resource Intensive agent gets to run. So I’ve been working on a solution.

Resumable Downloads

Yes I found a solution, you can find it at the end of this post, but you can read my journey as well. There are interesting parts in my journey, but that’s up to you to read or ignore.

Cheapest request to know the size of the download

I started with a little bit of experimentation, just a simple console app. I know that’s not completely equal to a Windows Phone app, specially a Windows Phone Background Agent. But it’s easy experimenting and because I wanted to use the HttpClient, I expected them to be largely equal. They were equal for the API parts, but not the implementation. But back to my idea, I want to know the size of the download I’m about to start. The cheapest way to get to know this, is by a HTTP HEAD request, instead of a HTTP GET. The HEAD request is identical to GET, but it doesn’t contain the body, being the file in my case.

So how do we do a HTTP Head request, and get the Content Length Header? It’s as easy as the following piece of code.

public static async Task<long?> GetRemoteSize(HttpClient client, Uri uri)
{
    var headRequest = new HttpRequestMessage(HttpMethod.Head, uri);
    HttpResponseMessage response = await client.SendAsync(headRequest);
    return response.Content.Headers.ContentLength;
}

 

It’s interesting code, however for Windows Phone you can immediately forget this. It works in the Command line app, but the ContentLength header is somehow not available for Windows Phone when doing a HEAD request, it’s always returning 0. This could be caused by the HttpClient implementation, or it’s maybe at a lower level, I don’t know.

If I modify the method above, to a HTTP GET request where I ask the method to complete as early as when the headers are read. I don’t want to wait for the whole 80 MiB file to be downloaded, just to know the size of the Download.

private async Task<long?> GetRemoteSize(HttpClient client, Uri uri)
{
    var headRequest = new HttpRequestMessage(HttpMethod.Get, uri);
    HttpResponseMessage response = await client.SendAsync(headRequest, HttpCompletionOption.ResponseHeadersRead);
    return response.Content.Headers.ContentLength;
}

That’s working, nice! So I can at least get the length of the download when I start the download. That will enable me to check if they bytes I’ve written to the file are the complete download. I will not make this call as a separate method call, like the method above. This was just experimentation.

The Range Header, or better the Header that enables a partial download aka resume

Let’s say we’ve been downloading for 10 minutes, but the download did not finish yet. We’ve already downloaded 45 MiB of the in total 80 MiB file. We want to continue with the download as soon as our Resource Intensive Agent gets run. So we need to tell the remote server which of the bytes we want from them. Here we have the HTTP Range header to help us out. It’s not available via method or properties, but we can set it very easily. So in below example I wanted to download all the content starting from 45 MiB. The HttpRequestMessage would read like this.

var readRequest = new HttpRequestMessage(HttpMethod.Get, originToDownload);
readRequest.Headers.Add("Range", string.Format("bytes={0}-", 45*1024*1024));

 

The range that you add to the Range header can end with a dash when you want to get all the remaining bytes. This works fine on the Console application, but it fires an InvalidOperationException telling “Nullable object must have a value” on Windows Phone. Sounds like the upper range being empty isn’t supported on Windows Phone.

I did investigate it a little bit, but not too much. I now fill the upper part of the range with long.MaxValue and that seems to work.

var readRequest = new HttpRequestMessage(HttpMethod.Get, originToDownload);
readRequest.Headers.Add("Range", string.Format("bytes={0}-{1}", 45*1024*1024, long.MaxValue));

Be aware that the ContentLength header you’re getting in the response will contain the actual length of bytes that are sent. So in the above case it will show the amount of bytes remaining 45 MiB done of the 80 MiB, means 35 MiB in the Content and 36700160 (35*1024*1024) as ContentLength.

The Solution

If you combine the Range header with the knowledge we gained about getting the ContentLength we can write a method like this:

private async Task<bool> Download(HttpClient client, Uri originToDownload, string targetToDownloadTo)
{
    var readRequest = new HttpRequestMessage(HttpMethod.Get, originToDownload);

    StorageFile fileToDownloadTo = await ApplicationData.Current.LocalFolder
        .CreateFileInPathAsync(targetToDownloadTo, CreationCollisionOption.OpenIfExists);
    using (Stream writeStream = await fileToDownloadTo.OpenStreamForWriteAsync())
    {
        writeStream.Seek(0, SeekOrigin.End);
        long currentLength = writeStream.Length;
        if (currentLength > 0)
            readRequest.Headers.Add("Range",
                string.Format("bytes={0}-{1}", currentLength, long.MaxValue));
        using (HttpResponseMessage response =
            await client.SendAsync(readRequest, HttpCompletionOption.ResponseHeadersRead))
        {
            long? remoteSize = response.Content.Headers.ContentLength;
            long totalRead = 0L;
            if (remoteSize == 0)
            {
                //All bytes have already been read.
                return true;
            }
            using (Stream stream = await response.Content.ReadAsStreamAsync())
            {
                var buffer = new byte[1024*64];
                int bytesRead;
                do
                {
                    bytesRead = stream.Read(buffer, 0, buffer.Length);
                    writeStream.Write(buffer, 0, bytesRead);
                    await writeStream.FlushAsync();
                    totalRead += bytesRead;
                } while (bytesRead != 0);
            }
            if (remoteSize == totalRead)
            {
                return true;
            }
            return false;
        }
    }
}

If you want to copy paste, you will need the helper method to CreateFileInPathAsync.

public static async Task<StorageFile> CreateFileInPathAsync(this StorageFolder parentFolder, string path,
                                                            CreationCollisionOption collisionOption)
{
    string folderPath = path.Substring(0, path.LastIndexOf('/'));
    string fileName = path.Substring(path.LastIndexOf('/') + 1);
    StorageFolder targetFolder = await EnsureFolderExistsAsync(parentFolder, folderPath);
    if (targetFolder != null)
    {
        return await targetFolder.CreateFileAsync(fileName, collisionOption);
    }
    return null;
}

public static async Task<StorageFolder> EnsureFolderExistsAsync(this StorageFolder parentFolder, string path)
{
    StorageFolder currentFolder = parentFolder;
    var pathElements = path.Trim('/').Split('/');
    foreach (string name in pathElements)
    {
        currentFolder = await currentFolder.CreateFolderAsync(name, CreationCollisionOption.OpenIfExists);
    }
    return currentFolder;
}

Memory Usage

It’s very nice we now have a way to download large files, and when required resume them. However be careful around memory usage. In my application I already have the SQLite db-engine in memory, so there’s not much memory left. So even though you can download multiple files after each other the memory usage increases. I stop downloading more files when I’ve less than 1.5 MiB of memory left. Not sure if this will be the sweet spot for your app, I’ve tried keeping that thresshold smaller but got Out of Memory exceptions quite often. So you’ve been warned.

Final notes

Now I created a method to download large files and even resume downloads, I can’t recommend to use it in every place. Use it where appropriate and where the better alternative Background Transfers can’t be used. I can’t think of any place other than a background agent to use this. But there might be others.

In the end this is something that can be used in any other .NET application, with a small set of modifications maybe to suit the targeted platform.

  • Gravatar MSicc December 27th, 2013 at 22:54
    Great Article Mark! I already have an idea for using this as download indicator for even small requests like downloading data from Twitter or Azure etc. ;)
  • Gravatar Mark Monster December 27th, 2013 at 22:58
    Hi Marco,

    Love the way others come with ideas I didn't think off at all.

    Have fun!

    Best,

    Mark Monster
  • Gravatar Matt Lacey December 29th, 2013 at 20:53
    Hi Mark.
    A couple of years ago I built a WP7 app that downloaded very large movie files (0.7 to 1.6GB in size). In doing this I used the Range header to download the files in 64KB "chunks". This meant that we could easily measure progress and where we should resume from. It also meant it was easy to identify any problems in transmission (corruption on the wire). With large files it's good to not have to re-download the whole file if there's a problem with part of it. (This really matters if it's a large file and a slow connection.) Knowing that the same chunks of a file will also be downloaded means that caching can be improved and you only need to calculate check sums for specific chunks once. ;)

    Be aware that with this approach there are a couple of potential gotchas that others may need to be aware of.
    - Not all servers support range headers, check this if you're using a shared host.
    - There are still some old proxy servers around that don't support these headers and may strip them.
    In both the above situations the app needs to be able to handle downloading the whole file in one go. The whole file is returned in such instances.


    Great article though. Just wanted to help add to it.

    Matt.
  • Gravatar Mark Monster December 30th, 2013 at 08:42
    Hi Matt,

    Thanks for the additional information! This really adds up to the article. Specially the support for Range Headers on the server is very important.

    Interesting approach to do 64KB chunks.

    Best,

    Mark Monster
  • Gravatar rob February 13th, 2014 at 19:01
    Thanks a lot!

    Was banging my head for hours why the content length was always 0. Your solution works fine!
  • Gravatar Francesco April 15th, 2014 at 16:56
    Hello, if i use your code receive this error

    read is not supported on the main thread when buffering is disabled
  • Gravatar Cheap Vans May 4th, 2014 at 06:44
    Mitch Abshere, the infamous Captain Fin, has taken the laid back feel of the Costa Mesa and added a waxed coated twill textile upper and a gum ultra-flexible waste-free rubber outsole for a sophisticated, but relaxed look. Made with water-based inks and g Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/costa-mesa-shoes-captain-fin-waxedblackgum-vvnkatv-p-667.html"/>Vans For Sale</a> Vans Costa Mesa Shoes-(Captain Fin) Waxed/Black/Gum-VVNKATVMitch Abshere, the infamous Captain Fin, has taken the laid back feel of the Costa Mesa and added a waxed coated twill textile upper and a gum ultra-flexible waste-free rubber outsole for a sophisticated, but relaxed look. Made with water-based inks and gMitch Abshere, the infamous Captain Fin, has taken the laid back feel of the Costa Mesa and added a waxed coated twill textile upper and a gum ultra-flexible waste-free rubber outsole for a sophisticated, but relaxed look. Made with water-based inks and g
  • Vans Chukka Low Bright Blue/Pewter Skate Trainers,vans high wedge,vans leopard black sk8 hi platform,vans warped tour 2014 lineup,vans aircraft Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/vans-chukka-low-bright-bluepewter-skate-trainers-lp46378-p-556.html"/>Vans Shoes Outlet</a> On Sale Vans Chukka Low Bright Blue/Pewter Skate Trainers Lp46378 ExclusiveWhere to buy an excellent shoes has troubled many people especialy thoses new online buyers, buy On Sale Vans Chukka Low Bright Blue/Pewter Skate Trainers Lp46378 Exclusive from our online store will always be your best choice!Where to buy an excellent shoes has troubled many people especialy thoses new online buyers, buy On Sale Vans Chukka Low Bright Blue/Pewter Skate Trainers Lp46378 Exclusive from our online store will always be your best choice!
  • Gravatar Vans Shoes May 4th, 2014 at 06:44
    Nautically-inspired with contemporary style, the 3 Tone Chauffeur features a premium tri-color canvas upper with a removable, washable and comfortable UltraCush? Eco Footbed and flexible, waste-free rubber outsoles. The 3 Tone Chauffeur is made with water Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/chauffeur-shoes-3-tone-graycoralblack-vnj8aou-p-766.html"/>Vans Chauffeur Shoes-(3 Tone) Gray/Coral/Black-VNJ8AOU</a> Vans Chauffeur Shoes-(3 Tone) Gray/Coral/Black-VNJ8AOUNautically-inspired with contemporary style, the 3 Tone Chauffeur features a premium tri-color canvas upper with a removable, washable and comfortable UltraCush? Eco Footbed and flexible, waste-free rubber outsoles. The 3 Tone Chauffeur is made with waterNautically-inspired with contemporary style, the 3 Tone Chauffeur features a premium tri-color canvas upper with a removable, washable and comfortable UltraCush? Eco Footbed and flexible, waste-free rubber outsoles. The 3 Tone Chauffeur is made with water
  • Gravatar Raul Lecato May 4th, 2014 at 16:46
    The journey towards resumable downloads on Windows Phone - Silverlight, WP7, .NET, C#, ASP.NET MVC?
  • Gravatar cheap where are oakley sunglasses made May 10th, 2014 at 02:42
    I¡¦m not sure where you're getting your info, but great topic. I must spend a while learning much more or understanding more. Thanks for fantastic info I was searching for this information for my mission.
    [url= http://www.cintimesys.com/images/invitation/cheap-where-are-oakley-sunglasses-made-16300891.html]cheap where are oakley sunglasses made[/url]
  • Gravatar cheap oakley holbrook sunglasses May 10th, 2014 at 02:42
    My husband and i were now satisfied when Albert could deal with his investigations using the ideas he got out of the weblog. It is now and again perplexing to just possibly be giving for free secrets that other people might have been selling. And we also fully grasp we have got the website owner to thank for this. Most of the explanations you have made, the straightforward site navigation, the friendships your site aid to engender - it's most sensational, and it's really letting our son and us understand that theme is satisfying, and that's wonderfully vital. Thank you for everything!
    [url= http://www.sapphireglobalmh.com/highslide/graphics/cheap-oakley-holbrook-sunglasses-10953907.html]cheap oakley holbrook sunglasses[/url]
  • Gravatar cheap oakley croakies May 10th, 2014 at 02:42
    Hello there, just became alert to your blog through Google, and found that it's truly informative. I am going to watch out for brussels. I’ll appreciate if you continue this in future. Lots of people will be benefited from your writing. Cheers!
    [url= http://www.statlerinternational.com/concent/cheap-oakley-croakies-7237476.html]cheap oakley croakies[/url]
  • Gravatar cheap oakley holbrook sunglasses May 10th, 2014 at 02:42
    Just wish to say your article is as astounding. The clarity in your post is just nice and i could assume you are an expert on this subject. Well with your permission let me to grab your RSS feed to keep up to date with forthcoming post. Thanks a million and please carry on the gratifying work.
    [url= http://www.heidiweisel.com/press/hwlifestyle/hwlifestyleimages/cheap-oakley-holbrook-sunglasses-7802967.html]cheap oakley holbrook sunglasses[/url]
  • Gravatar cheap oakley shooting gloves May 10th, 2014 at 02:43
    I simply needed to say thanks all over again. I'm not certain the things I would've carried out without the aspects documented by you directly on such a area of interest. It absolutely was a challenging concern in my circumstances, however , being able to view your skilled strategy you managed it forced me to leap for joy. I'm thankful for the advice as well as pray you know what an amazing job you are always putting in training the mediocre ones thru your site. I am sure you've never come across all of us.
    [url= http://www.rochess.com/TiVo/img/cheap-oakley-shooting-gloves-11410450.html]cheap oakley shooting gloves[/url]
  • Gravatar cheap oakley gas cans May 10th, 2014 at 02:43
    Hello there, I discovered your site via Google while looking for a comparable matter, your site came up, it appears to be like good. I've bookmarked it in my google bookmarks.
    [url= http://www.smackdogpoker.com/leagues/pokercom/cheap-oakley-gas-cans-17191394.html]cheap oakley gas cans[/url]
  • Gravatar cheap oakley jawbones May 10th, 2014 at 02:43
    I will right away grasp your rss as I can't find your email subscription link or newsletter service. Do you've any? Please allow me recognize in order that I may subscribe. Thanks.
    [url= http://www.laprepinc.com/Resources/ContentRotator/cheap-oakley-jawbones-4484180.html]cheap oakley jawbones[/url]
  • Gravatar cheap oakley factory pilot May 10th, 2014 at 02:43
    I have to express my appreciation to this writer for bailing me out of this type of difficulty. Right after surfing throughout the world-wide-web and finding thoughts which are not productive, I was thinking my entire life was well over. Living devoid of the solutions to the problems you've resolved by means of this post is a critical case, and the kind which may have badly affected my entire career if I had not discovered your web blog. The know-how and kindness in playing with the whole thing was valuable. I'm not sure what I would have done if I hadn't encountered such a point like this. I can also now relish my future. Thanks a lot very much for the impressive and result oriented guide. I will not hesitate to refer your web sites to any person who would need support about this matter.
    [url= http://www.ironworkerslocal340.com/images/gallery/cheap-oakley-factory-pilot-15500415.html]cheap oakley factory pilot[/url]
  • Gravatar cheap oakley hq May 10th, 2014 at 05:55
    Excellent goods from you, man. I've understand your stuff previous to and you're just extremely wonderful. I really like what you've acquired here, certainly like what you are stating and the way in which you say it. You make it entertaining and you still care for to keep it sensible. I cant wait to read far more from you. This is really a tremendous site.
    cheap oakley hq http://www.satcomcorp.com/inc/oakley/cheap-oakley-hq-17359241.html
  • Gravatar optinarchitectbonus.blogspot.com May 10th, 2014 at 15:42
    I am regular reader, how are you everybody?
    This article posted at this web site is in fact nice.
  • Gravatar Custom Vans Shoes May 12th, 2014 at 16:17
    The 106 Vulcanized has a low-top profile with a canvas upper with leather detail on the heel, metal eyelets, hiker inspired laces, a contrast Vans flag label and inverted Waffle Outsole. Its vulcanized construction gives this heritage style the utmost in Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/106-vulcanized-shoes-hiker-steel-grayformula-one-vvhnayt-p-757.html"/>Custom Vans Shoes</a> Vans 106 Vulcanized Shoes-(Hiker) Steel Gray/Formula One-VVHNAYTThe 106 Vulcanized has a low-top profile with a canvas upper with leather detail on the heel, metal eyelets, hiker inspired laces, a contrast Vans flag label and inverted Waffle Outsole. Its vulcanized construction gives this heritage style the utmost inThe 106 Vulcanized has a low-top profile with a canvas upper with leather detail on the heel, metal eyelets, hiker inspired laces, a contrast Vans flag label and inverted Waffle Outsole. Its vulcanized construction gives this heritage style the utmost in
  • Gravatar Vans For Sale May 12th, 2014 at 16:17
    Vans sk8 hi platform Shoes red unisex,cheap vans shoes,vans womens shoes chambray polka dot,vans shoes clearance,vans wedge sneakers price Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/vans-sk8-hi-platform-shoes-red-unisex-vl32565-p-662.html"/>Cheap Vans</a> Cheap Vans sk8 hi platform Shoes red unisex Vl32565 Online SaleCheap Vans sk8 hi platform Shoes red unisex Vl32565 Online Sale,if you like,just order enjoy top quality in low price,more shoes you buy more discount you will get,welcome to order.Cheap Vans sk8 hi platform Shoes red unisex Vl32565 Online Sale,if you like,just order enjoy top quality in low price,more shoes you buy more discount you will get,welcome to order.
  • Gravatar Vans Shoes May 12th, 2014 at 16:17
    Don't we all want our Vans to look as if Tony Alva had worn them since the '70s? With this Sk8-Hi Reissue CA we experimented with speeding up the process of disintegration that makes a pair of Vans truly one's own. Newly assembled 10 oz. canvas Authentic Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/sk8hi-reissue-ca-shoes-over-washed-black-vkxjbqn-p-868.html"/>Vans Shoes</a> Vans Sk8-Hi Reissue CA Shoes-(Over Washed) Black-VKXJBQNDon't we all want our Vans to look as if Tony Alva had worn them since the '70s? With this Sk8-Hi Reissue CA we experimented with speeding up the process of disintegration that makes a pair of Vans truly one's own. Newly assembled 10 oz. canvas AuthenticDon't we all want our Vans to look as if Tony Alva had worn them since the '70s? With this Sk8-Hi Reissue CA we experimented with speeding up the process of disintegration that makes a pair of Vans truly one's own. Newly assembled 10 oz. canvas Authentic
  • Gravatar Discount Louis Vuitton sweater May 14th, 2014 at 06:50
    It is really a great and useful piece of info. I¡¦m happy that you shared this useful information with us. Please keep us up to date like this. Thank you for sharing.
    Discount Louis Vuitton sweater http://www.ledhelmets.com/images/Discount-Louis-Vuitton-sweater-11606067.html
  • Gravatar Discount Louis Vuitton seattle May 14th, 2014 at 06:50
    Hi, for all time i used to check web site posts here early in the dawn, because i like to gain knowledge of more and more.
    Discount Louis Vuitton seattle http://www.ruggedalgiz.com/common/Discount-Louis-Vuitton-seattle-7536548.html
  • Gravatar Discount Louis Vuitton outlet houston May 14th, 2014 at 06:51
    Whats Taking place i am new to this, I stumbled upon this I've found It positively helpful and it has aided me out loads. I'm hoping to give a contribution & assist different customers like its aided me. Great job.
    Discount Louis Vuitton outlet houston http://www.mobili-arzenton.it/divani/Discount-Louis-Vuitton-outlet-houston-16872180.html
  • Gravatar Discount Louis Vuitton men May 14th, 2014 at 06:51
    hi!,I love your writing so a lot! proportion we communicate extra about your post on AOL? I require a specialist on this area to unravel my problem. Maybe that is you! Looking ahead to look you.
    Discount Louis Vuitton men http://www.rabacksstenhuggeri.se/Gallery/Discount-Louis-Vuitton-men-13599170.html
  • Gravatar Discount Louis Vuitton outlet usa May 14th, 2014 at 06:51
    It's the best time to make some plans for the future and it's time to be happy. I've read this post and if I could I desire to suggest you some interesting things or suggestions. Perhaps you can write next articles referring to this article. I want to read even more things about it!
    Discount Louis Vuitton outlet usa http://www.friskolanmetis.com/old/Discount-Louis-Vuitton-outlet-usa-15620349.html
  • Gravatar Discount Louis Vuitton lockit May 15th, 2014 at 03:00
    Hello to every body, it's my first go to see of this weblog; this web site contains awesome and truly excellent material for visitors.
    Discount Louis Vuitton lockit http://www.powerapp.it/images/slider/Discount-Louis-Vuitton-lockit-17512134.html
  • Gravatar Discount Louis Vuitton shades men May 15th, 2014 at 05:10
    I think other site proprietors should take this website as an model, very clean and excellent user friendly style and design, as well as the content. You are an expert in this topic!
    Discount Louis Vuitton shades men http://www.icelandicmarket.com/News/Discount-Louis-Vuitton-shades-men-951771.html
  • Gravatar cheap baseball snapback hats May 16th, 2014 at 10:41
    hello there and thank you for your info ?I have certainly picked up something new from right here. I did however expertise some technical issues using this website, as I experienced to reload the website many times previous to I could get it to load properly. I had been wondering if your web hosting is OK? Not that I'm complaining, but slow loading instances times will often affect your placement in google and could damage your high-quality score if ads and marketing with Adwords. Anyway I am adding this RSS to my email and could look out for much more of your respective exciting content. Make sure you update this again soon..
    cheap baseball snapback hats http://www.pflegeconcept.de/cept/cheap-baseball-snapback-hats-19298328.html
  • Gravatar Polo Outlet Online Shopping May 16th, 2014 at 12:46
    Polo socket voucher thakoon outfitting taylor schilling via lemon is considered the different brown
  • Gravatar cheap diamond hats May 17th, 2014 at 09:58
    It¡¦s actually a cool and useful piece of information. I am glad that you just shared this helpful information with us. Please keep us informed like this. Thank you for sharing.
    cheap diamond hats http://www.binationallogistics.com/spanish/data/cheap-diamond-hats--15644763.html
  • Gravatar funbrain May 20th, 2014 at 22:41
    Great data below. Also i have one fascinating internet site. You possibly can seet listed here:
  • Gravatar Discount Louis Vuitton varsity jacket May 23rd, 2014 at 11:04
    You actually make it appear really easy along with your presentation but I find this matter to be actually one thing that I feel I would by no means understand. It sort of feels too complicated and very vast for me. I'm taking a look ahead for your next post, I will attempt to get the grasp of it!
    Discount Louis Vuitton varsity jacket http://www.gorcrea.com/Informes/Discount-Louis-Vuitton-varsity-jacket-4420094.html
  • I have been exploring for a bit for any high quality articles or blog posts on this kind of area . Exploring in Yahoo I finally stumbled upon this website. Reading this information So i¡¦m happy to express that I have an incredibly good uncanny feeling I found out exactly what I needed. I so much indubitably will make sure to don¡¦t fail to remember this site and give it a look regularly.
    Discount Louis Vuitton sunglasses for men http://www.lindasworkshops.com/Design/Pictures/Discount-Louis-Vuitton-sunglasses-for-men-5399403.html
  • Gravatar Discount Louis Vuitton totally gm May 23rd, 2014 at 11:04
    This video post is truly fantastic, the noise feature and the picture feature of this video post is really remarkable.
    Discount Louis Vuitton totally gm http://www.bebesnageursffn.fr/images/Discount-Louis-Vuitton-totally-gm-7972339.html
  • Gravatar Discount Louis Vuitton rolling luggage May 23rd, 2014 at 11:04
    It¡¦s actually a nice and helpful piece of info. I¡¦m satisfied that you shared this helpful information with us. Please stay us up to date like this. Thanks for sharing.
    Discount Louis Vuitton rolling luggage http://www.helenssycenter.se/bilder/Discount-Louis-Vuitton-rolling-luggage-304798.html
  • The Rata Vulc, a lace-up loafer part of the SurfSider line, features premium textile and canvas uppers with prints and details made with water-based inks and dyes. Its removable and washable UltraCush? Eco Footbed delivers an extra comfy fit and its ultra Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/rata-vulc-shoes-surf-the-web-vuctcg4-p-783.html"/>Vans For Sale</a> Vans Rata Vulc Shoes-Surf The Web-VUCTCG4The Rata Vulc, a lace-up loafer part of the SurfSider line, features premium textile and canvas uppers with prints and details made with water-based inks and dyes. Its removable and washable UltraCush? Eco Footbed delivers an extra comfy fit and its ultraThe Rata Vulc, a lace-up loafer part of the SurfSider line, features premium textile and canvas uppers with prints and details made with water-based inks and dyes. Its removable and washable UltraCush? Eco Footbed delivers an extra comfy fit and its ultra
  • Gravatar Vans Shoes Outlet May 27th, 2014 at 03:18
    Authentic Vans Girls Lo Pro Grey/Pink Leopard Print Shoes,vans sneaker,vans sneaker,discount vans shoes,vans aircraft Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/authentic-vans-girls-lo-pro-greypink-leopard-print-shoes-lg44477-p-646.html"/>UK Sale Authentic Vans Girls Lo Pro Grey/Pink Leopard Print Shoes Lg44477 </a> UK Sale Authentic Vans Girls Lo Pro Grey/Pink Leopard Print Shoes Lg44477 UK Sale Authentic Vans Girls Lo Pro Grey/Pink Leopard Print Shoes Lg44477 ,take action buy what you need vans shoes enjoy large discount yet 100% quality guarantee,no matter which one you buy never disappoint you.UK Sale Authentic Vans Girls Lo Pro Grey/Pink Leopard Print Shoes Lg44477 ,take action buy what you need vans shoes enjoy large discount yet 100% quality guarantee,no matter which one you buy never disappoint you.
  • Gravatar Vans Shoes May 27th, 2014 at 03:18
    Vans Euclid Pewter/Ice Skate Trainers,vans era guate,vans shoes application,vans sneaker,vans uk Vans Shoes,Cheap Vans,Vans For Sale,Vans Shoes Outlet,Custom Vans Shoes,vans lindero grey seafoam evo,vans era guate<a href=" http://www.shoesvansonuk.com/vans-euclid-pewterice-skate-trainers-ws26667-p-608.html"/>Vans Shoes Outlet</a> Exclusive Vans Euclid Pewter/Ice Skate Trainers Ws26667 Exclusive Vans Euclid Pewter/Ice Skate Trainers Ws26667 ,brand new with excellent quality sale online in low price,welcome to order with free shipping no sale tax.Exclusive Vans Euclid Pewter/Ice Skate Trainers Ws26667 ,brand new with excellent quality sale online in low price,welcome to order with free shipping no sale tax.
  • Gravatar tai chi shoes May 30th, 2014 at 04:51
    F*ckin' remarkable things here. I'm very happy to look your article. Thanks so much and i am taking a look forward to contact you. Will you kindly drop me a mail?
  • Gravatar cheap batman bicycle suits May 30th, 2014 at 04:51
    Fantastic goods from you, man. I've understand your stuff previous to and you're just extremely excellent. I actually like what you've acquired here, certainly like what you are stating and the way in which you say it. You make it enjoyable and you still take care of to keep it smart. I cant wait to read far more from you. This is really a tremendous site.
  • Gravatar Cheap rent Louis Vuitton June 4th, 2014 at 11:00
    What's up to every , for the reason that I am genuinely keen of reading this webpage’s post to be updated regularly. It carries good information.
    Cheap rent Louis Vuitton http://www.richwoodplumbing.com/background/louis-vuitton/Cheap-rent-Louis-Vuitton.html
  • Gravatar Dorris June 5th, 2014 at 09:46
    I think that what you said was actually very reasonable.
    However, what about this? suppose you wrote a catchier title?
    I mean, I don't want to tell you how to run your blog, however suppose you added something to maybe grab folk's attention? I mean The journey
    towards resumable downloads on Windows Phone - Silverlight, WP7, .NET, C#,
    ASP.NET MVC is a little plain. You could look at Yahoo's front page and note how they create article titles to grab viewers to click.
    You might try adding a video or a related pic or two
    to grab people excited about what you've got to say.
    In my opinion, it might make your website a little bit more interesting.
  • Gravatar Where Can I Buy Polo Shirts June 11th, 2014 at 03:50
    large polo its before you start available money supervision solutions
  • Gravatar Below Wholesale Sunglasses June 11th, 2014 at 12:56
    neknominates try getting electronic take in development
    Below Wholesale Sunglasses http://www.sea-monkey.com/?key=Below+Wholesale+Sunglasses
  • Gravatar Wholesale Kids Sunglasses June 13th, 2014 at 07:23
    cheap sun glasses on the web the obamas generously donated
    Wholesale Kids Sunglasses http://www.sea-monkey.com/?key=Wholesale+Kids+Sunglasses
  • The journey towards resumable downloads on Windows Phone - Silverlight, WP7, .NET, C#, ASP.NET MVC
  • Gravatar carpet cleaning flyer June 15th, 2014 at 16:44
    Hello there! I just wish to give you a big thumbs up for the excellent information you have here on this post.

    I am returning to your site for more soon.
  • Gravatar CHANNEL ZERO Beanies snapbacks June 16th, 2014 at 05:46
    whoah this weblog is great i like studying your articles. Keep up the great paintings! You realize, a lot of individuals are hunting around for this info, you could help them greatly.
    CHANNEL ZERO Beanies snapbacks http://www.interdynamo.com/ed/hats/CHANNEL-ZERO-Beanies-snapbacks.html
  • Gravatar Cheap loui vuitton purses June 16th, 2014 at 06:06
    I simply could not go away your web site before suggesting that I really enjoyed the standard info an individual supply to your guests? Is gonna be again steadily in order to investigate cross-check new posts
    Cheap loui vuitton purses http://www.sharirusch.com/pdf/louis-vuitton/Cheap-loui-vuitton-purses.html
  • Gravatar nike free pas chr June 18th, 2014 at 21:57
    Sherri Now i'm looking to buy method to consider photos off<br />my new iphone 4 image container and put them about my<br />my i pad2 photo vault aid I did not remember my username and password as well as has been wondering if there has been anyways in order to reset button it and when I will input curve security questions in case it occurs again We have a tendency want to reduce the photos in it so please assist me to QUICKLY thank you Yet another thing We've observed is always that for many, crooked credit is the defense mechanism circumstances further than all their control. In particular they will often happen to be saddled with the health issues in order that they genuinely have too much payments gonna collections. It will be because of occupation burning or perhaps lack of ability to operate. Occasionally divorce proceedings as well as spliting up can easily definitely send out the actual economic situation inside undesired direction. Thank you discussing your ideas within this website.
  • Gravatar gucci handbags online June 20th, 2014 at 12:49
    The shoe is beautiful and exactly as described! Thank you!!!
  • Gravatar getting tested for std June 21st, 2014 at 13:59
    If u Find the u gt a yeast An infection vr
    tIm u gt u Period, gt proactIve. Roseola is a illness that generally impacts children below two many years of age.
    An autoimmune illness causes the immune system to flip on itself.
  • Gravatar Marianne June 27th, 2014 at 20:46
    If you wish for to increase your experience simply keep visiting this web page and be updated with the
    newest news update posted here.
  • Gravatar ray ban wayfarer polarized June 29th, 2014 at 04:30
    Es ist nicht Bigamie Wenn es Trigamy
  • Gravatar Replica louis vuitton azur wallet July 1st, 2014 at 08:05
    I was just searching for this info for a while. After six hours of continuous Googleing, at last I got it in your website. I wonder what's the lack of Google strategy that do not rank this kind of informative sites in top of the list. Usually the top sites are full of garbage.
    Replica louis vuitton azur wallet http://b222.edm-chambly.fr
  • Gravatar Air Jordan Retro 11 XI Blanc/Vert July 4th, 2014 at 03:18
    The reason for all this, of course, is not only to discourage people from smoking at all, but also a concern that the health of non smokers will be damaged if they inhale cigarette smoke, which contains a mixture of toxic chemicals.
  • Gravatar Cheap Louis Vuitton factory outlet July 8th, 2014 at 04:53
    Hi, Neat post. There is a problem together with your site in web explorer, may test this IE still is the marketplace leader and a large component of other folks will leave out your excellent writing because of this problem.
    Cheap Louis Vuitton factory outlet http://www.jayandcompany.com/images/loui-vuitton-bag/Cheap-Louis-Vuitton-factory-outlet.html
  • Gravatar Holbrook Oakley July 8th, 2014 at 07:23
    Last but not the least, when you purchase sunglasses online, chose a company which offers a return policy. Though you might have an option to use virtual mirror facility but still if they fail to inspire you in some way, then you can certainly return it and go for another one.
    Holbrook Oakley http://www.hisurfadvisory.com/brand/oakleyoutlet.asp
  • Gravatar Lashunda July 12th, 2014 at 03:08
    Today, while I was at work, my cousin stole my iPad and tested to see if it can survive a thirty foot drop,
    just so she can be a youtube sensation. My apple ipad is now destroyed
    and she has 83 views. I know this is totally off topic but I had to share
    it with someone!
  • Gravatar Whosale Oakley Twentysix Sunglasses July 12th, 2014 at 03:40
    <b><a href="/">oakley sunglasses</a></b> are always created using lenses that give 100% safety from both ultraviolet The and B rays, and provide distortion free vision. Other special features found in various kinds of <b><a href="/">oakley sunglasses</a></b> are anti scratch layer for lenses, anti fog remedy, straps that allow simple attachment to helmet, fire resistant straps, etc.
    Whosale Oakley Twentysix Sunglasses http://www.kostomlatypm.com/?kw=oakley-twentysix.html
  • Q : R : En cas d'accident sur les pistes de ski, l'Assistance li茅e 脿 votre carte, prend en charge les frais d'茅vacuation mis en uvre par les organismes intervenus entre le lieu de l'accident et le centre m茅dical ou hospitalier le plus proche, ainsi que le retour sur le lieu de s茅jour (dans les limites pr茅vues par votre contrat). Vous devez appeler ou faire appeler imm茅diatement le num茅ro indiqu茅 au dos de votre carte. N'attendez pas le retour 脿 votre domicile pour les contacter, l'assistance ne pourrait plus donner suite 脿 votre dossier.
  • Gravatar Ray Ban Wayfarer lunette Outlet RB3095 July 21st, 2014 at 04:06
    No "armpit hugger" styles I like the opening of my purse to hang at about waist level so it's easy to just reach down and throw my sunglasses into or dig out my keys without having to take it off.
Gravatar