modified date: July 23, 2017

INS0923920381WD202C

Instacart Analysis is derived from the R scripts in the insta_public_analysis project. See end of file for license details.

The sample of Instacart Data contains aggregate transactions of 206209 and 3214874 unique users that are part of the “prior” eval_set.

The summary below represents the frequency distribution of the number of orders per user.

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   3.00    5.00    9.00   15.59   19.00   99.00 

Users and Day of Week

Sunday was the most popular day to place orders at 151528. Friday was the lease popular day to place orders at 128327.

Day and Hour Shopping

Day of Week Shopping

The full distribution is available below as a data table and graph:

Day of Week

Day of Week

Hour of Day Shopping

The hour of the day that was most shopped was hour 15 with a log10 total of 5.06 Orders and ranges from 10 -15 around 5 total orders.

The chart belows plots the points of total orders at the respective hours placed Hour of Day

Day Of Week Ice Cream

This graph represents day of week orders for Ice Cream Aisle. Product Names are different within the aisle. Ice Cream

Hour of Day Ice Cream

This graph represents day of week orders for Ice Cream Aisle. Product Names are different within the aisle. Ice Cream

We see the pattern from the graph above, for the entire week. The following graph shows the averages for every hour for each day and groups by shopper type:

Re Orders

Days since prior order- Ice Cream

Ignoring unknown parameters: binwidth, bins, pad

How Many prior orders - Ice Cream

Ice Cream Only Reorders ##

Orders and Basket Size

Basket Variety - Product Combinations

The graph shows the variety of the basket. The unique products in a basket decreases through the customers lifecyle. Note that there is one order_id outlier that has 145 unqiue product_ids in the order.

Another interesting point; there seems to be a strong positive correlation in the quantity of unique products to the quantity of prior reorders (see How Many prior orders chart above) . So not only does the product basket variety decrease, but so does the number of future orders.

This might show potential symptoms that a customer might “churn out” if the quantity of unique products decreases. We would need to perform a deeper analysis and hypothesis test to rule out other factors such as; seasonality, duration of products, etc.

The outlier can be seen in the following distribution:

Distribution of ProductID Combinations

Distribution of ProductID Combinations

The users purchased a combination of 10 product_ids. However, a large proportion spans between 5 and 8 unique products, but are most frequently had 1 unique product at 313496 orders. 6429748 orders were the denser proportion of orders.

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    5.00    8.00   10.09   14.00  145.00 

Basket Size - Ice Cream

A basket that includes ice cream is likely to have around 1 or 2 different product id’s: Ice Cream Basket Variety

Reorders and Proportions - Ice Cream Only

Purchase frequency and most often reordered

Reordered Proportion

Top Proportion Reordered

Basket Size Trend

Basket Size Trend

The scatterplot shows an increase in product variety in each order from the first to the 30th order. Then the curve of the trend shifts downward after the 30th order.

Basket Size Trend

Basket Size Trend

Basket Size Variance

This plot suggests that the customers are likely to have an average of approx. 9.4 items before their first 50 orders. After 50, the variance is wider, yet the customers basket size declines.

Variance of Data

Variance of Data

Ice Cream Basket Trend

This graph suggests that when compared to the total average basket trend, the average of ice cream is a part of the basket anywhere between the first and 90th order and will have 1.6 to 2.0 types of ice cream. It does decrease , but since you cannot have partial ice cream product, it is most likely 2 different product ids.

Ice Cream Basket Trend

Ice Cream Basket Trend

Ice Cream basket Variance

This graph suggests 2 different types of ice cream products within first 20 orders; variance will increase by up to 6 percent, but still not significant from the fitted line.

icecream variance ##

Top Selling Products

The table below shows the top product names.

All Dept & Aisle

This treemap covers all departments and aisles.

Frozen department and Ice Cream Aisle

Frozen department and Ice Cream Aisle

This table shows top products:

Frozen & Ice Cream

Barplot of the top selling Ice Cream Products.

Frozen department and Ice Cream Aisle

Frozen department and Ice Cream Aisle

Table showing the to Ice Cream Products:

Data Source:

The Instacart Online Grocery Shopping Dataset 2017”, Accessed from https://www.instacart.com/datasets/grocery-shopping-2017 on July 2017

This project was developed on R System for Statistical Computation and Graphics. All source code is in R Programming Language. For information see https://www.r-project.org/about.html
Also Contains Source from:
 Philipp Spachtholz as permitted by Apache 2.0 License 
 http://www.apache.org/licenses/LICENSE-2.0
 Repository
 https://www.kaggle.com/philippsp/exploratory-analysis-instacart/code
LS0tCnRpdGxlOiAiSW5zdGFjYXJ0IEFuYWx5c2lzIDIwMTciCmF1dGhvcjogIk1pY2hhZWwgR2FyY2lhIgpkYXRlOiAiSnVseSA2LCAyMDE3Igptb2RpZmllZCBkYXRlOiAiSnVseSAyMywgMjAxNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CnRoZW1lOiBzcGFjZWxhYgpkZl9wcmludDogcGFnZWQKLS0tCiMjIyMjIG1vZGlmaWVkIGRhdGU6IEp1bHkgMjMsIDIwMTcKCklOUzA5MjM5MjAzODFXRDIwMkMKCkluc3RhY2FydCBBbmFseXNpcyBpcyBkZXJpdmVkIGZyb20gdGhlIFIgc2NyaXB0cyBpbiB0aGUgaW5zdGFfcHVibGljX2FuYWx5c2lzIHByb2plY3QuIFNlZSBlbmQgb2YgZmlsZSBmb3IgbGljZW5zZSBkZXRhaWxzLgoKYGBge3IsIGVjaG89RkFMU0V9CiNzb3VyY2UoZmlsZS5wYXRoKGdldHdkKCkscGFzdGUoIlJ1bl9JbnN0YWNhcnRTb3VyY2VGaWxlcyIsIi5SIixzZXAgPSAiIikpLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKClRoZSBzYW1wbGUgb2YgSW5zdGFjYXJ0IERhdGEgY29udGFpbnMgYWdncmVnYXRlIHRyYW5zYWN0aW9ucyBvZiBgciBwYXN0ZSh1c2VyQ291bnRzWzFdKWAgYW5kICBgciBwYXN0ZSh1c2VyQ291bnRzWzJdKWAgdW5pcXVlIHVzZXJzIHRoYXQgYXJlIHBhcnQgb2YgdGhlICJwcmlvciIgZXZhbF9zZXQuIAoKVGhlIHN1bW1hcnkgYmVsb3cgcmVwcmVzZW50cyB0aGUgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIG9yZGVycyBwZXIgdXNlci4KYGBge3IsIGVjaG89RkFMU0V9CmZycVN1bW1hcnkoKQpgYGAKCgojIyMjIFVzZXJzIGFuZCBEYXkgb2YgV2VlayAKClN1bmRheSB3YXMgdGhlIG1vc3QgcG9wdWxhciBkYXkgdG8gcGxhY2Ugb3JkZXJzIGF0IGByIHBhc3RlKGRvd191c2VyRnVuYygpW3doaWNoKGRvd191c2VyRnVuYygpWzFdID09IDEpLDJdKWAuCkZyaWRheSB3YXMgdGhlIGxlYXNlIHBvcHVsYXIgZGF5IHRvIHBsYWNlIG9yZGVycyBhdCBgciBwYXN0ZShkb3dfdXNlckZ1bmMoKVt3aGljaChkb3dfdXNlckZ1bmMoKVsxXSA9PSA2KSwyXSlgLgoKIyMgRGF5IGFuZCBIb3VyIFNob3BwaW5nIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQojIyMgRGF5IG9mIFdlZWsgU2hvcHBpbmcKVGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZSBiZWxvdyBhcyBhIGRhdGEgdGFibGUgYW5kIGdyYXBoOgpgYGB7cixlY2hvPUZBTFNFfQpybWFya2Rvd246OnBhZ2VkX3RhYmxlKGRvd191c2VyRnVuYygpKQpgYGAKCiFbRGF5IG9mIFdlZWtdKGRvd191c2VyUGxvdC5wbmcpCgojIyMgSG91ciBvZiBEYXkgU2hvcHBpbmcKVGhlIGhvdXIgb2YgdGhlIGRheSB0aGF0IHdhcyBtb3N0IHNob3BwZWQgd2FzIGhvdXIgMTUgd2l0aCBhIGxvZzEwIHRvdGFsIG9mIDUuMDYgT3JkZXJzIGFuZCByYW5nZXMgZnJvbSAxMCAtMTUgYXJvdW5kIDUgdG90YWwgb3JkZXJzLgoKVGhlIGNoYXJ0IGJlbG93cyBwbG90cyB0aGUgcG9pbnRzIG9mIHRvdGFsIG9yZGVycyBhdCB0aGUgcmVzcGVjdGl2ZSBob3VycyBwbGFjZWQKIVtIb3VyIG9mIERheV0odGltZV91c2Vyc1Bsb3QucG5nKQoKIyMjIERheSBPZiBXZWVrIEljZSBDcmVhbSAKVGhpcyBncmFwaCByZXByZXNlbnRzIGRheSBvZiB3ZWVrIG9yZGVycyBmb3IgSWNlIENyZWFtIEFpc2xlLiBQcm9kdWN0IE5hbWVzIGFyZSBkaWZmZXJlbnQgd2l0aGluIHRoZSBhaXNsZS4KIVtJY2UgQ3JlYW1dKGZyb3plbl9pY2VjcmVhbV9kb3cucG5nKQoKIyMjIEhvdXIgb2YgRGF5IEljZSBDcmVhbQpUaGlzIGdyYXBoIHJlcHJlc2VudHMgZGF5IG9mIHdlZWsgb3JkZXJzIGZvciBJY2UgQ3JlYW0gQWlzbGUuIFByb2R1Y3QgTmFtZXMgYXJlIGRpZmZlcmVudCB3aXRoaW4gdGhlIGFpc2xlLgohW0ljZSBDcmVhbV0oZnJvemVuX2ljZWNyZWFtX2hvdXIucG5nKQoKIyMKCldlIHNlZSB0aGUgcGF0dGVybiBmcm9tIHRoZSBncmFwaCBhYm92ZSwgZm9yIHRoZSBlbnRpcmUgd2Vlay4gVGhlIGZvbGxvd2luZyBncmFwaCBzaG93cyB0aGUgYXZlcmFnZXMgZm9yIGV2ZXJ5IGhvdXIgZm9yIGVhY2ggZGF5IGFuZCBncm91cHMgYnkgc2hvcHBlciB0eXBlOgoKCiMjIFJlIE9yZGVycyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyBEYXlzIHNpbmNlIHByaW9yIG9yZGVyLSBJY2UgQ3JlYW0KYGBgIHtyLCBlY2hvID0gRkFMU0V9CnJlb3JkZXJfZGF5cyhkZXBhcnRtZW50ID0gImZyb3plbiIsIGFpc2xlID0gImljZSBjcmVhbSBpY2UiKQpgYGAKCiMjIyBIb3cgTWFueSBwcmlvciBvcmRlcnMgLSBJY2UgQ3JlYW0KIVtJY2UgQ3JlYW0gT25seSBSZW9yZGVyc10oUnBsb3Rfbm9fcHJpb3JfcmVvcmRlcnMucG5nKQojIwoKCgojIyBPcmRlcnMgYW5kIEJhc2tldCBTaXplIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQojIyMgQmFza2V0IFZhcmlldHkgLSBQcm9kdWN0IENvbWJpbmF0aW9ucwpUaGUgZ3JhcGggc2hvd3MgdGhlIHZhcmlldHkgb2YgdGhlIGJhc2tldC4gVGhlIHVuaXF1ZSBwcm9kdWN0cyBpbiBhIGJhc2tldCBkZWNyZWFzZXMgdGhyb3VnaCB0aGUgY3VzdG9tZXJzIGxpZmVjeWxlLiAKTm90ZSB0aGF0IHRoZXJlIGlzIG9uZSBvcmRlcl9pZCBvdXRsaWVyIHRoYXQgaGFzIDE0NSB1bnFpdWUgcHJvZHVjdF9pZHMgaW4gdGhlIG9yZGVyLiAKCkFub3RoZXIgaW50ZXJlc3RpbmcgcG9pbnQ7IHRoZXJlIHNlZW1zIHRvIGJlIGEgc3Ryb25nIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGluIHRoZSBxdWFudGl0eSBvZiB1bmlxdWUgcHJvZHVjdHMgdG8gdGhlIHF1YW50aXR5IG9mIHByaW9yIHJlb3JkZXJzIChzZWUgSG93IE1hbnkgcHJpb3Igb3JkZXJzIGNoYXJ0IGFib3ZlKSAuIFNvIG5vdCBvbmx5IGRvZXMgdGhlIHByb2R1Y3QgYmFza2V0IHZhcmlldHkgZGVjcmVhc2UsIGJ1dCBzbyBkb2VzIHRoZSBudW1iZXIgb2YgZnV0dXJlIG9yZGVycy4gCgpUaGlzIG1pZ2h0IHNob3cgcG90ZW50aWFsIHN5bXB0b21zIHRoYXQgYSBjdXN0b21lciBtaWdodCAiY2h1cm4gb3V0IiBpZiB0aGUgcXVhbnRpdHkgb2YgdW5pcXVlIHByb2R1Y3RzIGRlY3JlYXNlcy4gV2Ugd291bGQgbmVlZCB0byBwZXJmb3JtIGEgZGVlcGVyIGFuYWx5c2lzIGFuZCBoeXBvdGhlc2lzIHRlc3QgdG8gcnVsZSBvdXQgb3RoZXIgZmFjdG9ycyBzdWNoIGFzOyBzZWFzb25hbGl0eSwgZHVyYXRpb24gb2YgcHJvZHVjdHMsIGV0Yy4gCgpUaGUgb3V0bGllciBjYW4gYmUgc2VlbiBpbiB0aGUgZm9sbG93aW5nIGRpc3RyaWJ1dGlvbjoKCiFbRGlzdHJpYnV0aW9uIG9mIFByb2R1Y3RJRCBDb21iaW5hdGlvbnNdKHByb2Rjb21iaW5hdGlvbnMucG5nKQoKVGhlIHVzZXJzIHB1cmNoYXNlZCBhIGNvbWJpbmF0aW9uIG9mIDEwIHByb2R1Y3RfaWRzLiBIb3dldmVyLCBhIGxhcmdlIHByb3BvcnRpb24gc3BhbnMgYmV0d2VlbiA1IGFuZCA4IHVuaXF1ZSBwcm9kdWN0cywgYnV0IGFyZSBtb3N0IGZyZXF1ZW50bHkgaGFkIDEgIHVuaXF1ZSBwcm9kdWN0IGF0IGByIHBhc3RlKGxlbmd0aCh1bmxpc3QoYVt3aGljaChhJG5vX3Byb2R1Y3RzID09IDEpLF0pKSlgIG9yZGVycy4gYHIgcGFzdGUobGVuZ3RoKHVubGlzdChhW3doaWNoKGEkbm9fcHJvZHVjdHMgPD0gOCB8IGEkbm9fcHJvZHVjdHMgPjEgKSxdKSkpYCBvcmRlcnMgd2VyZSB0aGUgZGVuc2VyIHByb3BvcnRpb24gb2Ygb3JkZXJzLiAKCmBgYHtyLCBlY2hvPUZBTFNFfQpzdW1tYXJ5KGEkbm9fcHJvZHVjdHMpCmBgYCAKYGBge3IsIGVjaG89RkFMU0V9CnJtYXJrZG93bjo6cGFnZWRfdGFibGUoTm9PcmRlcl9EZXB0QWlzbGUpCiN0YWJsZXM6OmFzLnRhYnVsYXIoKE5vT3JkZXJfRGVwdEFpc2xlKSkKYGBgCgoKIyMjIEJhc2tldCBTaXplIC0gSWNlIENyZWFtCkEgYmFza2V0IHRoYXQgaW5jbHVkZXMgaWNlIGNyZWFtIGlzIGxpa2VseSB0byBoYXZlIGFyb3VuZCAxIG9yIDIgZGlmZmVyZW50IHByb2R1Y3QgaWQnczoKIVtJY2UgQ3JlYW0gQmFza2V0IFZhcmlldHldKHByZGNvbWJwcm9iX2ZyekljZWNybS5wbmcpCgoKIyMjIFJlb3JkZXJzIGFuZCBQcm9wb3J0aW9ucyAtIEljZSBDcmVhbSBPbmx5CgpQdXJjaGFzZSBmcmVxdWVuY3kgYW5kIG1vc3Qgb2Z0ZW4gcmVvcmRlcmVkCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBGQUxTRX0KIyBzb3VyY2UgaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9waGlsaXBwc3AvZXhwbG9yYXRvcnktYW5hbHlzaXMtaW5zdGFjYXJ0L25vdGVib29rICB1bmRlciBBcGFjaGUgTGljZW5zZQpvcmRlcl9wcm9kX3ByaW9yX2RlcHRbd2hpY2gob3JkZXJfcHJvZF9wcmlvcl9kZXB0JGRlcGFydG1lbnQgPT0gImZyb3plbiIgJiBvcmRlcl9wcm9kX3ByaW9yX2RlcHQkYWlzbGUgPT0gImljZSBjcmVhbSBpY2UiKSxdICAlPiUgCiAgZ3JvdXBfYnkocmVvcmRlcmVkKSAlPiUgCiAgc3VtbWFyaXplKGNvdW50ID0gbigpKSAlPiUgCiAgbXV0YXRlKHJlb3JkZXJlZCA9IGFzLmZhY3RvcihyZW9yZGVyZWQpKSAlPiUKICBtdXRhdGUocHJvcG9ydGlvbiA9IHJvdW5kKChjb3VudC9zdW0oY291bnQpKSwyKSkKCmBgYAoKCgoKCgoKCiMjIyBSZW9yZGVyZWQgUHJvcG9ydGlvbgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBGQUxTRX0Kcm1hcmtkb3duOjpwYWdlZF90YWJsZShyZW9yZGVyZWRQcm9wb3J0aW9uKCkpCmBgYAoKIyMjIFRvcCBQcm9wb3J0aW9uIFJlb3JkZXJlZAoKYGBgIHtyIG9uY2x1ZGUgPSBUUlVFLCBlY2hvID0gRkFMU0V9CnJtYXJrZG93bjo6cGFnZWRfdGFibGUob2Z0ZW5PcmRlckZ1bih0b3BOUHJvZCA9IDEwMCkpCmBgYAoKCgpgYGAge3IgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBGQUxTRX0KUGxvdG9mdGVuT3JkZXJGdW4odG9wTlByZFBsb3QgPSAyMCkKCmBgYAoKCiMjCgoKIyMgQmFza2V0IFNpemUgVHJlbmQgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CiMjIyBCYXNrZXQgU2l6ZSBUcmVuZApUaGUgc2NhdHRlcnBsb3Qgc2hvd3MgYW4gaW5jcmVhc2UgaW4gcHJvZHVjdCB2YXJpZXR5IGluIGVhY2ggb3JkZXIgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIDMwdGggb3JkZXIuIFRoZW4gdGhlIGN1cnZlIG9mIHRoZSB0cmVuZCBzaGlmdHMgZG93bndhcmQgYWZ0ZXIgdGhlIDMwdGggb3JkZXIuCgohW0Jhc2tldCBTaXplIFRyZW5kXShiYXNrZXRzaXplX3RyZW5kX1Bsb3QucG5nKQoKYHIgcm1hcmtkb3duOjpwYWdlZF90YWJsZShiYXNrZXRzaXplX3RyZW5kKWAKCiMjIyBCYXNrZXQgU2l6ZSBWYXJpYW5jZQoKVGhpcyBwbG90IHN1Z2dlc3RzIHRoYXQgdGhlIGN1c3RvbWVycyBhcmUgbGlrZWx5IHRvIGhhdmUgYW4gYXZlcmFnZSBvZiBhcHByb3guIDkuNCBpdGVtcyBiZWZvcmUgdGhlaXIgZmlyc3QgNTAgb3JkZXJzLiAKQWZ0ZXIgNTAsIHRoZSB2YXJpYW5jZSBpcyB3aWRlciwgeWV0IHRoZSBjdXN0b21lcnMgYmFza2V0IHNpemUgZGVjbGluZXMuCgohW1ZhcmlhbmNlIG9mIERhdGFdKGJhc2tldHNpemVfcGN0Q2hnX1Bsb3QucG5nKQoKCiMjIyBJY2UgQ3JlYW0gQmFza2V0IFRyZW5kClRoaXMgZ3JhcGggc3VnZ2VzdHMgdGhhdCB3aGVuIGNvbXBhcmVkIHRvIHRoZSB0b3RhbCBhdmVyYWdlIGJhc2tldCB0cmVuZCwgdGhlIGF2ZXJhZ2Ugb2YgaWNlIGNyZWFtIGlzIGEgcGFydCBvZiB0aGUgYmFza2V0IGFueXdoZXJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCA5MHRoIG9yZGVyIGFuZCB3aWxsIGhhdmUgMS42IHRvIDIuMCB0eXBlcyBvZiBpY2UgY3JlYW0uIEl0IGRvZXMgZGVjcmVhc2UgLCBidXQgc2luY2UgeW91IGNhbm5vdCBoYXZlIHBhcnRpYWwgaWNlIGNyZWFtIHByb2R1Y3QsIGl0IGlzIG1vc3QgbGlrZWx5IDIgZGlmZmVyZW50IHByb2R1Y3QgaWRzLgoKIVtJY2UgQ3JlYW0gQmFza2V0IFRyZW5kXShiYXNrZXRUcmVuZFBsb3RfRGVwQWlzbGUucG5nKQoKIyMjIEljZSBDcmVhbSBiYXNrZXQgVmFyaWFuY2UKVGhpcyBncmFwaCBzdWdnZXN0cyAyIGRpZmZlcmVudCB0eXBlcyBvZiBpY2UgY3JlYW0gcHJvZHVjdHMgd2l0aGluIGZpcnN0IDIwIG9yZGVyczsgdmFyaWFuY2Ugd2lsbCBpbmNyZWFzZSBieSB1cCB0byA2IHBlcmNlbnQsIGJ1dCBzdGlsbCBub3Qgc2lnbmlmaWNhbnQgZnJvbSB0aGUgZml0dGVkIGxpbmUuCgohW2ljZWNyZWFtIHZhcmlhbmNlXShiYXNrZXRzaXplRmlsdF9wY3RDaGdfUGxvdC5wbmcpCiMjCgoKCmBgYHtyLCBlY2hvPUZBTFNFfQojIGhvbGQgZm9yIHBhdGggbW9zdCB0cmF2ZWxsZWQgZGVwYXJ0bWVudCAtLS0gYWlzbGVzCmBgYAoKXG5ld3BhZ2UKCiMjIFRvcCBTZWxsaW5nIFByb2R1Y3RzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKClRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgdG9wIHByb2R1Y3QgbmFtZXMuIAoKIyMjIEFsbCBEZXB0ICYgQWlzbGUKClRoaXMgdHJlZW1hcCBjb3ZlcnMgYWxsIGRlcGFydG1lbnRzIGFuZCBhaXNsZXMuCgohW0Zyb3plbiBkZXBhcnRtZW50IGFuZCBJY2UgQ3JlYW0gQWlzbGVdKGFsbF9kZXB0LnBuZykKCgpUaGlzIHRhYmxlIHNob3dzIHRvcCBwcm9kdWN0czoKYGBge3IsIGVjaG89RkFMU0V9CnJtYXJrZG93bjo6cGFnZWRfdGFibGUodG9wX3Byb2R1Y3RzKHRvcE4gPSA0MCkpCmBgYAoKIyMjIEZyb3plbiAmIEljZSBDcmVhbSAKQmFycGxvdCBvZiB0aGUgdG9wIHNlbGxpbmcgSWNlIENyZWFtIFByb2R1Y3RzLgoKCiFbRnJvemVuIGRlcGFydG1lbnQgYW5kIEljZSBDcmVhbSBBaXNsZV0oZnJvemVuX2ljZWNyZWFtX2JhcnBsdC5wbmcpCgoKClRhYmxlIHNob3dpbmcgdGhlIHRvIEljZSBDcmVhbSBQcm9kdWN0czoKCgpgYGB7ciwgZWNobz1GQUxTRX0Kcm1hcmtkb3duOjpwYWdlZF90YWJsZSh0b3BfcHJvZHVjdHMoZGVwYXJ0bWVudCA9ICJmcm96ZW4iLCBhaXNsZSA9ICJpY2UgY3JlYW0gaWNlIiwgdG9wTiA9IDE1KSkKYGBgCgoKIyMgCgpccGFnZWJyZWFrCgojIyMjIyBEYXRhIFNvdXJjZToKVGhlIEluc3RhY2FydCBPbmxpbmUgR3JvY2VyeSBTaG9wcGluZyBEYXRhc2V0IDIwMTfigJ0sIEFjY2Vzc2VkIGZyb20gaHR0cHM6Ly93d3cuaW5zdGFjYXJ0LmNvbS9kYXRhc2V0cy9ncm9jZXJ5LXNob3BwaW5nLTIwMTcgb24gSnVseSAyMDE3CgojIyMjIyMgVGhpcyBwcm9qZWN0IHdhcyBkZXZlbG9wZWQgb24gUiBTeXN0ZW0gZm9yIFN0YXRpc3RpY2FsIENvbXB1dGF0aW9uIGFuZCBHcmFwaGljcy4gQWxsIHNvdXJjZSBjb2RlIGlzIGluIFIgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UuIEZvciBpbmZvcm1hdGlvbiBzZWUgaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZy9hYm91dC5odG1sCgojIyMjIyBMaWNlbnNlIGFuZCBDb3B5cmlnaHQKICAgICBQcm9qZWN0OiBpbnN0YV9wdWJsaWNfYW5hbHlzaXMgcHJvamVjdAogICAgIENvcHlyaWdodChDKSBNaWNoYWVsIEdhcmNpYSAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMwogICAgIENvbnRhY3QgQXV0aG9yOiBtZ2FyX2RhdGFzY2llbmNlIGF0IHByb3Rvbm1haWwgZG90IGNvbSAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgICAKICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAgCiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAgIAogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMyBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAKICAgICBTZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzIGZvciBmdWxsIGxpY2Vuc2UuIEFkZGl0aW9uYWwgTGljZW5zZXMgCiAgICAgbWF5IGFwcGx5LiBSdW4gc291cmNlKGxpc3RQY2tnKSBmb3IgYSBsaXN0IG9mIGluc3RhbGxlZCBwYWNrYWdlcyBhbmQKICAgICBsaWNlbnNlcy4KIyMjIyMgQWxzbyBDb250YWlucyBTb3VyY2UgZnJvbTogCiAgICAgUGhpbGlwcCBTcGFjaHRob2x6IGFzIHBlcm1pdHRlZCBieSBBcGFjaGUgMi4wIExpY2Vuc2UgCiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICAgUmVwb3NpdG9yeQogICAgIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcGhpbGlwcHNwL2V4cGxvcmF0b3J5LWFuYWx5c2lzLWluc3RhY2FydC9jb2RlCgo=