Group/Individual Details

Executive Statement

Objective: This report is written to analyse the price difference of the products of the two giant supermarkets(Coles and Woolworths)

Procedure: To begin with we assume that both are having same prices and one is not cheaper than the other (Null hypothesis). Data was collected manually from the website http://www.grocerycop.com.au/ between 5-May-2017 to 7-May-2017. With 35 products each from 9 product categories a total of 315 products were chosen from the website where product pictures, weight/cupsize/cup volume and Price dates matched.Categories are as follows:

  1. Baby/Health/Beauty
  2. Bakery
  3. Clothing/Household/Pet
  4. Drinks/Tobacco
  5. Entertainment/International food
  6. Pantry
  7. Freezer
  8. Fridge
  9. Fruits/Vegetables

During initial analysis we found that it would be better to drop home brand products and products on special to avoid biasness.

Variables: For this reporting, the following data was captured: a) product category, b) product price, c) price volume, d) Cup price, e) cup volume, f) Supermarket name, g) Price date.

Main Findings: As sample size is greater than 30 we can discard the normality issue and assume that the the data is normally distributed around the mean.

The \(p\)-value generated for the paired t.test with 95%CI was (0.001574) which shows that the test is statistically significant to reject the null hypothesis mentioned above i.e. Coles and Woolworths do not have same prices but one of them(woolworths) is cheaper than the other(coles). In other words the mean difference is not equal to zero which is our alternate hypothesis(\(H_A\)). The confidence interval[0.1643315 0.5115971] did not accomodate the null hypothesis(mean=0).

Load Packages and Data

library(dplyr)
library(readr)
library(magrittr)
library(lattice)
library(ggplot2)
library(Hmisc)
library(car)
library(granova)
library(rmarkdown)
#Loading data where price data of both stores are in two different column
Final_excel <- read_csv("D:/Intro to Statistics/Assignment3/Final_excel.csv")
#Loading data where price data of both stores are in same column ("Price")
SIngleprice_Column <- read_csv("D:/Intro to Statistics/Assignment3/SIngleprice_Column.csv")
#Finding difference between two superstores' prices
Final_excel <- Final_excel %>% mutate(Price_diff = (Price_Coles-Price_Woolworths))

New variable price_diff is created for price difference of the two supermakets.

Summary Statistics with all data samples

From the summary statistics, it has been found that on an average Woolworths products are $0.338 cheaper than Coles. Out of 9 product categories, Woolworths found cheaper in 6 categories. It is also noteworthy that SD is quite higher than the mean depicts the variability of the sample. Boxplot with product categories shows the distribution of products for both supermarkets

#Summary statistics of Prices by store
SIngleprice_Column %>% group_by (Store) %>% summarise(Min = min(Price.,na.rm = TRUE),
                                         Q1 = quantile(Price.,probs = .25,na.rm = TRUE),
                                         Median = median(Price., na.rm = TRUE),
                                         Q3 = quantile(Price.,probs = .75,na.rm = TRUE),
                                         Max = max(Price.,na.rm = TRUE),
                                         Mean = mean(Price., na.rm = TRUE),
                                         SD = sd(Price., na.rm = TRUE),
                                         sum=sum(Price., na.rm = TRUE),
                                         n = n(),
                                         Missing = sum(is.na(Price.)))
#Summary statistics of Prices by Product categories
SIngleprice_Column %>% group_by (Product_Category) %>% summarise(Min = min(Price.,na.rm = TRUE),
                                         Q1 = quantile(Price.,probs = .25,na.rm = TRUE),
                                         Median = median(Price., na.rm = TRUE),
                                         Q3 = quantile(Price.,probs = .75,na.rm = TRUE),
                                         Max = max(Price.,na.rm = TRUE),
                                         Mean = mean(Price., na.rm = TRUE),
                                         SD = sd(Price., na.rm = TRUE),
                                         sum=sum(Price., na.rm = TRUE),
                                         n = n(),
                                         Missing = sum(is.na(Price.)))
#Summary statistics of Prices_difference by Product categories
Final_excel %>% group_by (Product_Category) %>% summarise(Min = min(Price_diff,na.rm = TRUE),
                                         Q1 = quantile(Price_diff,probs = .25,na.rm = TRUE),
                                         Median = median(Price_diff, na.rm = TRUE),
                                         Q3 = quantile(Price_diff,probs = .75,na.rm = TRUE),
                                         Max = max(Price_diff,na.rm = TRUE),
                                         Mean = mean(Price_diff, na.rm = TRUE),
                                         SD = sd(Price_diff, na.rm = TRUE),
                                         sum=sum(Price_diff, na.rm = TRUE),
                                         n = n(),
                                         Missing = sum(is.na(Price_diff)))
#Box plot of Price($) by Store with all 9 categories
SIngleprice_Column %>% boxplot(Price. ~ Store, data = ., xlab = "Price($)", ylab = "Store", col="Cyan", main = "Box plot of Price($) by Stores", horizontal=TRUE)

#Box plot of Price by category Where price data are put in single price column
SIngleprice_Column %>% boxplot(Price. ~ Product_Category_code, data = ., ylab = "Price($)", xlab = "Product Category", col="grey", main = "Box plot of Price($) by product categories")

Filter out high-priced product category

After reviewing the data, it is obvious that product category#9 “Drinks_Tobacco” has a very high price ranges from $1.8 to $110 with an average of $35 which is significantly different from other 8 categories. As overall mean price for both coles and woolworths is around $9, so the Drinks-Tobacco products are raising the overall mean considerably. To make a case with similar prices, it has been decided from the summary statistics to filterout the Drinks_Tobacco category from the whole sample. After doing the data filtering, we can observe that there are less outliers in our data set. We assume that coles is expensive, based on the mean value that we get but whether it is statistically significant that should be determined by Hypothesis test.

#Filtered data (Category!=9)
Final_data_filt <- Final_excel %>% filter(Product_Category_code!=9)
SIngleprice_Column_filt <- SIngleprice_Column %>% filter(Product_Category_code!=9)
#Box plot of Price($) by Store after filtering out product category'9'
SIngleprice_Column_filt %>% boxplot(Price. ~ Store, data = ., xlab = "Price($)", ylab = "Store", col="Cyan", main = "Box plot of Price($) by Stores", horizontal=TRUE)

Hypothesis Test

To become more sure about the price difference, hypothesis .It is noteworthy that as total sample is above 30, thus Welch Test has been chosen directly. As exactly same products were chosen to see the price difference between Coles and Woolworths, ‘Paired Sample t-test’ fits with the objective of the test by using 95% confidence interval, test was applied to check whether their mean value for the overall bucket prices are the same or not.

Formulate Hypothesis The population mean of these differences is denoted: \[\mu_\Delta\]

Null Hypothesis: \[H_0: \mu_\Delta = 0\]

Alternate Hypothesis: \[H_A: \mu_\Delta \neq 0\]

#Histogram of price_difference
Final_data_filt$Price_diff %>% histogram()

#paired sample tt-test using the t.test() function
t.test(Final_data_filt$Price_Coles, Final_data_filt$Price_Woolworths,
       paired = TRUE,
       alternative = "two.sided")

    Paired t-test

data:  Final_data_filt$Price_Coles and Final_data_filt$Price_Woolworths
t = 3.8316, df = 279, p-value = 0.0001574
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1643315 0.5115971
sample estimates:
mean of the differences 
              0.3379643 

Through the histogram of price difference we observe that there is a slight trend of left skewed. And we verified the assumption by using the paird sample t-test. A paired-samples T-Test results with 280 sample data from both stores shows that the mean difference between Coles and Woolworths bucket is $0.338. Test results also gives the t value as 3.8316 (with the degree of freedom=279) where \(p\)value (0.0001574) is < 0.05 with 95% CI [0.1643315, 0.5115971]. As \(P\)value<0.05 and null hypothesized value is not captured within the 95% CI values, thus null hypothesis is rejected.

Additional analysis:

  • In addition to the Paired sample t-test for the overall bucket for both stores, product category wise test was performed to see comparison at product category level. To support this the analysis is below: #### T-test result by product categories
result=rep(0,8)
 
  for(i in 1:8){
  a=Final_data_filt$Price_diff[(i*35-34):(i*35)]
  b=t.test(a,mu=0,alternative = "two.sided")
 
  if(b$p.value<0.05)
   result[i]=b$estimate
  else
   result[i]=0}
result=data.frame(result)
row.names(result)=c("Fridge","Bakery","Fruit_Vegetables","Pantry","Freezer","Baby_Health_Beauty","Entertainment_Internationalfoods","Clothing_HH_Pet")
result

The above results show that out of the 8 categories, Coles is expensive in three categories (Fridge, Pantry, Baby_Health_Beauty), while there is no significant difference in the remaining 5 categories i.e. a) Bakery, b) Fruit-Veg, c) Freezer, d) Entertainment-International foods e) Closthing_HH-Pet.

Discussion

Further Improvement areas

  • We conclude that the two supermarkets do not have the same prices for similar product range and coles is slightly expensive than woolworths overall.

  • The limitations here was we did not take into consideration products of home brand and products on special in our analysis,but the strength remains that we could compare them in an unbiased way by dropping home brand products and concentrated more on daily consumables rather than less used products (TV,Mobile Phones,Headphones,DVD etc).

  • We did the analysis from customer perspective to find out which is cheaper in both the supermarkets,but if we were to analyse the data from supermarkets perspective to find how they can benefit from studying the competitors price range and cover more customer base in future by being competitive in prices in certain categories and leading the supermarket scoreborad.

  • These price ranges can vary with time so that constraint needs to be kept in mind always for future analysis as prices keep fluctuating on daily basis.

LS0tDQp0aXRsZTogIk1BVEgxMzI0IEFzc2lnbm1lbnQgMyINCnN1YnRpdGxlOiAiU3VwZXJtYXJrZXQgUHJpY2UgV2FycyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgR3JvdXAvSW5kaXZpZHVhbCBEZXRhaWxzDQoNCg0KKiBBbXJpbiBTaGFpa2ggICAoczM2NTQ3MjkpDQoNCg0KIyBFeGVjdXRpdmUgU3RhdGVtZW50IA0KDQoNCioqT2JqZWN0aXZlOioqIA0KVGhpcyByZXBvcnQgaXMgd3JpdHRlbiB0byBhbmFseXNlIHRoZSBwcmljZSBkaWZmZXJlbmNlIG9mIHRoZSBwcm9kdWN0cyBvZiB0aGUgdHdvIGdpYW50IHN1cGVybWFya2V0cyhDb2xlcyBhbmQgV29vbHdvcnRocykgICANCg0KKipQcm9jZWR1cmU6KioNClRvIGJlZ2luIHdpdGggd2UgYXNzdW1lIHRoYXQgYm90aCBhcmUgaGF2aW5nIHNhbWUgcHJpY2VzIGFuZCBvbmUgaXMgbm90IGNoZWFwZXIgdGhhbiB0aGUgb3RoZXIgKE51bGwgaHlwb3RoZXNpcykuIERhdGEgd2FzIGNvbGxlY3RlZCBtYW51YWxseSBmcm9tIHRoZSB3ZWJzaXRlIDxodHRwOi8vd3d3Lmdyb2Nlcnljb3AuY29tLmF1Lz4gYmV0d2VlbiA1LU1heS0yMDE3IHRvIDctTWF5LTIwMTcuDQpXaXRoIDM1IHByb2R1Y3RzIGVhY2ggZnJvbSA5IHByb2R1Y3QgY2F0ZWdvcmllcyBhIHRvdGFsIG9mIDMxNSBwcm9kdWN0cyB3ZXJlIGNob3NlbiBmcm9tIHRoZSB3ZWJzaXRlIHdoZXJlIHByb2R1Y3QgcGljdHVyZXMsIHdlaWdodC9jdXBzaXplL2N1cCB2b2x1bWUgYW5kIFByaWNlIGRhdGVzIG1hdGNoZWQuQ2F0ZWdvcmllcyBhcmUgYXMgZm9sbG93czoNCg0KDQoxLglCYWJ5L0hlYWx0aC9CZWF1dHkNCjIuCUJha2VyeQ0KMy4JQ2xvdGhpbmcvSG91c2Vob2xkL1BldA0KNC4JRHJpbmtzL1RvYmFjY28NCjUuCUVudGVydGFpbm1lbnQvSW50ZXJuYXRpb25hbCBmb29kDQo2LglQYW50cnkNCjcuCUZyZWV6ZXINCjguCUZyaWRnZQ0KOS4JRnJ1aXRzL1ZlZ2V0YWJsZXMNCg0KRHVyaW5nIGluaXRpYWwgYW5hbHlzaXMgd2UgZm91bmQgdGhhdCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZHJvcCBob21lIGJyYW5kIHByb2R1Y3RzIGFuZCBwcm9kdWN0cyBvbiBzcGVjaWFsIHRvIGF2b2lkIGJpYXNuZXNzLg0KDQoqKlZhcmlhYmxlczoqKg0KRm9yIHRoaXMgcmVwb3J0aW5nLCB0aGUgZm9sbG93aW5nIGRhdGEgd2FzIGNhcHR1cmVkOiBhKSBwcm9kdWN0IGNhdGVnb3J5LCBiKSBwcm9kdWN0IHByaWNlLCBjKSBwcmljZSB2b2x1bWUsIGQpIEN1cCBwcmljZSwgZSkgY3VwIHZvbHVtZSwgZikgU3VwZXJtYXJrZXQgbmFtZSwgZykgUHJpY2UgZGF0ZS4gDQoNCioqTWFpbiBGaW5kaW5nczoqKg0KQXMgc2FtcGxlIHNpemUgaXMgZ3JlYXRlciB0aGFuIDMwIHdlIGNhbiBkaXNjYXJkIHRoZSBub3JtYWxpdHkgaXNzdWUgYW5kIGFzc3VtZSB0aGF0IHRoZSB0aGUgZGF0YSBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBhcm91bmQgdGhlIG1lYW4uDQoNCiAgKyBTdW1tYXJ5IHN0YXRpc3RpY3MgdGVsbHMgdGhhdCBtZWFuIHByaWNlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgQ29sZXMgYW5kIFdvb2x3b3J0aHMgaXMgbWluaW1hbCAqKiQwLjMzOCoqIGFuZCBvdmVyYWxsIGJ1Y2tldCBwcmljZSB3ZXJlICokMjg5NyogYW5kICokMjgwNCogcmVzcGVjdGl2ZWx5LiANCk91dCBvZiA5IHByb2R1Y3QgY2F0ZWdvcmllcywgKkRyaW5rc19Ub2JhY2NvKiBoYXMgYSB2ZXJ5IGhpZ2ggcHJpY2UgcmFuZ2VzIGZyb20gKiQxLjgqIHRvICokMTEwKiB3aXRoIGFuIGF2ZXJhZ2Ugb2YgKiokMzUqKiB3aGljaCBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIG90aGVyIDggY2F0ZWdvcmllcyBhbmQgdGh1cyB3ZSBkZWNpZGVkIHRvIGZpbHRlciBvdXQgdGhpcyBjYXRlZ29yeSBmcm9tIHRoZSBtYWluIGFuYWx5c2lzLiBUb3RhbCBzYW1wbGUgd2FzIHRodXMgMjgwLg0KDQogICsgVGhvdWdoIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgc2F5cyBXb29sd29ydGhzIGlzIGNoZWFwZXIsIGJ1dCB3aXRob3V0IHN0YXRpc3RpY2FsIHRlc3QsIGl0IGNhbnQgYmUgcHJvdmVkLiBCYXNlZCBvbiBkYXRhIG5hdHVyZSwgKipQYWlyZWQgc2FtcGxlIHQtdGVzdCoqIHdhcyBmb3VuZCB0byBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGh5cG90aGVzaXMgdGVzdCBhcyBpdCB0cmllcyB0byBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gbWVhbiBmb3IgZGVwZW5kZW50IHNhbXBsZS4gDQogIA0KVGhlICRwJC12YWx1ZSBnZW5lcmF0ZWQgZm9yIHRoZSBwYWlyZWQgdC50ZXN0IHdpdGggOTUlQ0kgd2FzICgwLjAwMTU3NCkgd2hpY2ggc2hvd3MgdGhhdCB0aGUgdGVzdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIG1lbnRpb25lZCBhYm92ZSBpLmUuIENvbGVzIGFuZCBXb29sd29ydGhzIGRvIG5vdCBoYXZlIHNhbWUgcHJpY2VzIGJ1dCBvbmUgb2YgdGhlbSh3b29sd29ydGhzKSBpcyBjaGVhcGVyIHRoYW4gdGhlIG90aGVyKGNvbGVzKS4gSW4gb3RoZXIgd29yZHMgdGhlIG1lYW4gZGlmZmVyZW5jZSBpcyBub3QgZXF1YWwgdG8gemVybyB3aGljaCBpcyBvdXIgYWx0ZXJuYXRlIGh5cG90aGVzaXMoJEhfQSQpLiBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbFswLjE2NDMzMTUgMC41MTE1OTcxXSBkaWQgbm90IGFjY29tb2RhdGUgdGhlIG51bGwgaHlwb3RoZXNpcyhtZWFuPTApLg0KDQoNCiMgTG9hZCBQYWNrYWdlcyBhbmQgRGF0YQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShsYXR0aWNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShncmFub3ZhKQ0KbGlicmFyeShybWFya2Rvd24pDQoNCg0KI0xvYWRpbmcgZGF0YSB3aGVyZSBwcmljZSBkYXRhIG9mIGJvdGggc3RvcmVzIGFyZSBpbiB0d28gZGlmZmVyZW50IGNvbHVtbg0KRmluYWxfZXhjZWwgPC0gcmVhZF9jc3YoIkQ6L0ludHJvIHRvIFN0YXRpc3RpY3MvQXNzaWdubWVudDMvRmluYWxfZXhjZWwuY3N2IikNCg0KI0xvYWRpbmcgZGF0YSB3aGVyZSBwcmljZSBkYXRhIG9mIGJvdGggc3RvcmVzIGFyZSBpbiBzYW1lIGNvbHVtbiAoIlByaWNlIikNClNJbmdsZXByaWNlX0NvbHVtbiA8LSByZWFkX2NzdigiRDovSW50cm8gdG8gU3RhdGlzdGljcy9Bc3NpZ25tZW50My9TSW5nbGVwcmljZV9Db2x1bW4uY3N2IikNCg0KI0ZpbmRpbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBzdXBlcnN0b3JlcycgcHJpY2VzDQpGaW5hbF9leGNlbCA8LSBGaW5hbF9leGNlbCAlPiUgbXV0YXRlKFByaWNlX2RpZmYgPSAoUHJpY2VfQ29sZXMtUHJpY2VfV29vbHdvcnRocykpDQpgYGANCk5ldyB2YXJpYWJsZSBwcmljZV9kaWZmIGlzIGNyZWF0ZWQgZm9yIHByaWNlIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byBzdXBlcm1ha2V0cy4NCg0KIyBTdW1tYXJ5IFN0YXRpc3RpY3Mgd2l0aCBhbGwgZGF0YSBzYW1wbGVzDQpGcm9tIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MsIGl0IGhhcyBiZWVuIGZvdW5kIHRoYXQgb24gYW4gYXZlcmFnZSBXb29sd29ydGhzIHByb2R1Y3RzIGFyZSAqKiQwLjMzOCoqIGNoZWFwZXIgdGhhbiBDb2xlcy4gT3V0IG9mIDkgcHJvZHVjdCBjYXRlZ29yaWVzLCBXb29sd29ydGhzIGZvdW5kIGNoZWFwZXIgaW4gNiBjYXRlZ29yaWVzLiBJdCBpcyBhbHNvIG5vdGV3b3J0aHkgdGhhdCBTRCBpcyBxdWl0ZSBoaWdoZXIgdGhhbiB0aGUgbWVhbiBkZXBpY3RzIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgc2FtcGxlLiANCkJveHBsb3Qgd2l0aCBwcm9kdWN0IGNhdGVnb3JpZXMgc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwcm9kdWN0cyBmb3IgYm90aCBzdXBlcm1hcmtldHMgICANCg0KYGBge3J9DQojU3VtbWFyeSBzdGF0aXN0aWNzIG9mIFByaWNlcyBieSBzdG9yZQ0KU0luZ2xlcHJpY2VfQ29sdW1uICU+JSBncm91cF9ieSAoU3RvcmUpICU+JSBzdW1tYXJpc2UoTWluID0gbWluKFByaWNlLixuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMSA9IHF1YW50aWxlKFByaWNlLixwcm9icyA9IC4yNSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYW4gPSBtZWRpYW4oUHJpY2UuLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMyA9IHF1YW50aWxlKFByaWNlLixwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggPSBtYXgoUHJpY2UuLG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYW4gPSBtZWFuKFByaWNlLiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0QgPSBzZChQcmljZS4sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bT1zdW0oUHJpY2UuLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNzaW5nID0gc3VtKGlzLm5hKFByaWNlLikpKQ0KDQojU3VtbWFyeSBzdGF0aXN0aWNzIG9mIFByaWNlcyBieSBQcm9kdWN0IGNhdGVnb3JpZXMNClNJbmdsZXByaWNlX0NvbHVtbiAlPiUgZ3JvdXBfYnkgKFByb2R1Y3RfQ2F0ZWdvcnkpICU+JSBzdW1tYXJpc2UoTWluID0gbWluKFByaWNlLixuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMSA9IHF1YW50aWxlKFByaWNlLixwcm9icyA9IC4yNSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYW4gPSBtZWRpYW4oUHJpY2UuLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMyA9IHF1YW50aWxlKFByaWNlLixwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggPSBtYXgoUHJpY2UuLG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYW4gPSBtZWFuKFByaWNlLiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0QgPSBzZChQcmljZS4sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bT1zdW0oUHJpY2UuLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNzaW5nID0gc3VtKGlzLm5hKFByaWNlLikpKQ0KDQojU3VtbWFyeSBzdGF0aXN0aWNzIG9mIFByaWNlc19kaWZmZXJlbmNlIGJ5IFByb2R1Y3QgY2F0ZWdvcmllcw0KRmluYWxfZXhjZWwgJT4lIGdyb3VwX2J5IChQcm9kdWN0X0NhdGVnb3J5KSAlPiUgc3VtbWFyaXNlKE1pbiA9IG1pbihQcmljZV9kaWZmLG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExID0gcXVhbnRpbGUoUHJpY2VfZGlmZixwcm9icyA9IC4yNSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYW4gPSBtZWRpYW4oUHJpY2VfZGlmZiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUTMgPSBxdWFudGlsZShQcmljZV9kaWZmLHByb2JzID0gLjc1LG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCA9IG1heChQcmljZV9kaWZmLG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYW4gPSBtZWFuKFByaWNlX2RpZmYsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEID0gc2QoUHJpY2VfZGlmZiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtPXN1bShQcmljZV9kaWZmLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNzaW5nID0gc3VtKGlzLm5hKFByaWNlX2RpZmYpKSkNCg0KI0JveCBwbG90IG9mIFByaWNlKCQpIGJ5IFN0b3JlIHdpdGggYWxsIDkgY2F0ZWdvcmllcw0KU0luZ2xlcHJpY2VfQ29sdW1uICU+JSBib3hwbG90KFByaWNlLiB+IFN0b3JlLCBkYXRhID0gLiwgeGxhYiA9ICJQcmljZSgkKSIsIHlsYWIgPSAiU3RvcmUiLCBjb2w9IkN5YW4iLCBtYWluID0gIkJveCBwbG90IG9mIFByaWNlKCQpIGJ5IFN0b3JlcyIsIGhvcml6b250YWw9VFJVRSkNCg0KI0JveCBwbG90IG9mIFByaWNlIGJ5IGNhdGVnb3J5IFdoZXJlIHByaWNlIGRhdGEgYXJlIHB1dCBpbiBzaW5nbGUgcHJpY2UgY29sdW1uDQpTSW5nbGVwcmljZV9Db2x1bW4gJT4lIGJveHBsb3QoUHJpY2UuIH4gUHJvZHVjdF9DYXRlZ29yeV9jb2RlLCBkYXRhID0gLiwgeWxhYiA9ICJQcmljZSgkKSIsIHhsYWIgPSAiUHJvZHVjdCBDYXRlZ29yeSIsIGNvbD0iZ3JleSIsIG1haW4gPSAiQm94IHBsb3Qgb2YgUHJpY2UoJCkgYnkgcHJvZHVjdCBjYXRlZ29yaWVzIikNCmBgYA0KDQojIyMgRmlsdGVyIG91dCBoaWdoLXByaWNlZCBwcm9kdWN0IGNhdGVnb3J5DQpBZnRlciByZXZpZXdpbmcgdGhlIGRhdGEsIGl0IGlzIG9idmlvdXMgdGhhdCBwcm9kdWN0IGNhdGVnb3J5IzkgIkRyaW5rc19Ub2JhY2NvIiBoYXMgYSB2ZXJ5IGhpZ2ggcHJpY2UgcmFuZ2VzIGZyb20gKiokMS44KiogdG8gKiokMTEwKiogd2l0aCBhbiBhdmVyYWdlIG9mICoqJDM1Kiogd2hpY2ggaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBvdGhlciA4IGNhdGVnb3JpZXMuIEFzIG92ZXJhbGwgbWVhbiBwcmljZSBmb3IgYm90aCBjb2xlcyBhbmQgd29vbHdvcnRocyBpcyBhcm91bmQgKiokOSoqLCBzbyB0aGUgRHJpbmtzLVRvYmFjY28gcHJvZHVjdHMgYXJlIHJhaXNpbmcgdGhlIG92ZXJhbGwgbWVhbiBjb25zaWRlcmFibHkuIFRvIG1ha2UgYSBjYXNlIHdpdGggc2ltaWxhciBwcmljZXMsIGl0IGhhcyBiZWVuIGRlY2lkZWQgZnJvbSB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzIHRvIGZpbHRlcm91dCB0aGUgRHJpbmtzX1RvYmFjY28gY2F0ZWdvcnkgZnJvbSB0aGUgd2hvbGUgc2FtcGxlLiBBZnRlciBkb2luZyB0aGUgZGF0YSBmaWx0ZXJpbmcsIHdlIGNhbiBvYnNlcnZlIHRoYXQgdGhlcmUgYXJlIGxlc3Mgb3V0bGllcnMgaW4gb3VyIGRhdGEgc2V0LiBXZSBhc3N1bWUgdGhhdCBjb2xlcyBpcyBleHBlbnNpdmUsIGJhc2VkIG9uIHRoZSBtZWFuIHZhbHVlIHRoYXQgd2UgZ2V0IGJ1dCB3aGV0aGVyIGl0IGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgdGhhdCBzaG91bGQgYmUgZGV0ZXJtaW5lZCBieSBIeXBvdGhlc2lzIHRlc3QuDQoNCg0KDQpgYGB7cn0NCg0KI0ZpbHRlcmVkIGRhdGEgKENhdGVnb3J5IT05KQ0KRmluYWxfZGF0YV9maWx0IDwtIEZpbmFsX2V4Y2VsICU+JSBmaWx0ZXIoUHJvZHVjdF9DYXRlZ29yeV9jb2RlIT05KQ0KU0luZ2xlcHJpY2VfQ29sdW1uX2ZpbHQgPC0gU0luZ2xlcHJpY2VfQ29sdW1uICU+JSBmaWx0ZXIoUHJvZHVjdF9DYXRlZ29yeV9jb2RlIT05KQ0KDQojQm94IHBsb3Qgb2YgUHJpY2UoJCkgYnkgU3RvcmUgYWZ0ZXIgZmlsdGVyaW5nIG91dCBwcm9kdWN0IGNhdGVnb3J5JzknDQpTSW5nbGVwcmljZV9Db2x1bW5fZmlsdCAlPiUgYm94cGxvdChQcmljZS4gfiBTdG9yZSwgZGF0YSA9IC4sIHhsYWIgPSAiUHJpY2UoJCkiLCB5bGFiID0gIlN0b3JlIiwgY29sPSJDeWFuIiwgbWFpbiA9ICJCb3ggcGxvdCBvZiBQcmljZSgkKSBieSBTdG9yZXMiLCBob3Jpem9udGFsPVRSVUUpDQpgYGANCg0KDQoNCg0KIyMgSHlwb3RoZXNpcyBUZXN0DQoNClRvIGJlY29tZSBtb3JlIHN1cmUgYWJvdXQgdGhlIHByaWNlIGRpZmZlcmVuY2UsIGh5cG90aGVzaXMgLkl0IGlzIG5vdGV3b3J0aHkgdGhhdCBhcyB0b3RhbCBzYW1wbGUgaXMgIGFib3ZlIDMwLCB0aHVzIFdlbGNoIFRlc3QgaGFzIGJlZW4gY2hvc2VuIGRpcmVjdGx5LiBBcyBleGFjdGx5IHNhbWUgcHJvZHVjdHMgd2VyZSBjaG9zZW4gdG8gc2VlIHRoZSBwcmljZSAgZGlmZmVyZW5jZSBiZXR3ZWVuIENvbGVzIGFuZCBXb29sd29ydGhzLCAqKidQYWlyZWQgU2FtcGxlIHQtdGVzdCcqKiBmaXRzIHdpdGggdGhlIG9iamVjdGl2ZSBvZiB0aGUgdGVzdCBieSB1c2luZyAqKjk1JSBjb25maWRlbmNlIGludGVydmFsKiosIHRlc3Qgd2FzIGFwcGxpZWQgdG8gY2hlY2sgd2hldGhlciB0aGVpciBtZWFuIHZhbHVlIGZvciB0aGUgb3ZlcmFsbCBidWNrZXQgcHJpY2VzIGFyZSB0aGUgc2FtZSBvciBub3QuIA0KDQoqKkZvcm11bGF0ZSBIeXBvdGhlc2lzKioNClRoZSBwb3B1bGF0aW9uIG1lYW4gb2YgdGhlc2UgZGlmZmVyZW5jZXMgaXMgZGVub3RlZDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkXG11X1xEZWx0YSQkDQoNCg0KDQoNCk51bGwgSHlwb3RoZXNpczogICAgICAgICAgICQkSF8wOiBcbXVfXERlbHRhID0gMCQkDQoNCg0KDQoNCkFsdGVybmF0ZSBIeXBvdGhlc2lzOiAgICAgICQkSF9BOiBcbXVfXERlbHRhIFxuZXEgMCQkDQoNCiANCmBgYHtyfQ0KI0hpc3RvZ3JhbSBvZiBwcmljZV9kaWZmZXJlbmNlDQpGaW5hbF9kYXRhX2ZpbHQkUHJpY2VfZGlmZiAlPiUgaGlzdG9ncmFtKCkNCg0KI3BhaXJlZCBzYW1wbGUgdHQtdGVzdCB1c2luZyB0aGUgdC50ZXN0KCkgZnVuY3Rpb24NCnQudGVzdChGaW5hbF9kYXRhX2ZpbHQkUHJpY2VfQ29sZXMsIEZpbmFsX2RhdGFfZmlsdCRQcmljZV9Xb29sd29ydGhzLA0KICAgICAgIHBhaXJlZCA9IFRSVUUsDQogICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCg0KYGBgDQpUaHJvdWdoIHRoZSBoaXN0b2dyYW0gb2YgcHJpY2UgZGlmZmVyZW5jZSB3ZSBvYnNlcnZlIHRoYXQgdGhlcmUgaXMgYSBzbGlnaHQgdHJlbmQgb2YgbGVmdCBza2V3ZWQuIEFuZCB3ZSB2ZXJpZmllZCB0aGUgYXNzdW1wdGlvbiBieSB1c2luZyB0aGUgcGFpcmQgc2FtcGxlIHQtdGVzdC4gDQpBIHBhaXJlZC1zYW1wbGVzIFQtVGVzdCByZXN1bHRzIHdpdGggMjgwIHNhbXBsZSBkYXRhIGZyb20gYm90aCBzdG9yZXMgc2hvd3MgdGhhdCB0aGUgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gQ29sZXMgYW5kIFdvb2x3b3J0aHMgYnVja2V0IGlzICoqJDAuMzM4KiouIFRlc3QgcmVzdWx0cyBhbHNvIGdpdmVzIHRoZSB0IHZhbHVlIGFzIDMuODMxNiAod2l0aCB0aGUgZGVncmVlIG9mIGZyZWVkb209Mjc5KSB3aGVyZSAkcCR2YWx1ZSAqKigwLjAwMDE1NzQpKiogaXMgPCAwLjA1IHdpdGggOTUlIENJIFswLjE2NDMzMTUsIDAuNTExNTk3MV0uIEFzICRQJHZhbHVlPDAuMDUgYW5kIG51bGwgaHlwb3RoZXNpemVkIHZhbHVlIGlzIG5vdCBjYXB0dXJlZCB3aXRoaW4gdGhlIDk1JSBDSSB2YWx1ZXMsIHRodXMgbnVsbCBoeXBvdGhlc2lzIGlzIHJlamVjdGVkLg0KDQogKipBZGRpdGlvbmFsIGFuYWx5c2lzOioqDQogIA0KICArIEluIGFkZGl0aW9uIHRvIHRoZSBQYWlyZWQgc2FtcGxlIHQtdGVzdCBmb3IgdGhlIG92ZXJhbGwgYnVja2V0IGZvciBib3RoIHN0b3JlcywgcHJvZHVjdCBjYXRlZ29yeSB3aXNlIHRlc3Qgd2FzIHBlcmZvcm1lZCB0byBzZWUgY29tcGFyaXNvbiBhdCBwcm9kdWN0IGNhdGVnb3J5IGxldmVsLiANClRvIHN1cHBvcnQgdGhpcyB0aGUgYW5hbHlzaXMgaXMgYmVsb3c6DQojIyMjIFQtdGVzdCByZXN1bHQgYnkgcHJvZHVjdCBjYXRlZ29yaWVzDQoNCmBgYHtyfQ0KcmVzdWx0PXJlcCgwLDgpDQogDQogIGZvcihpIGluIDE6OCl7DQogIGE9RmluYWxfZGF0YV9maWx0JFByaWNlX2RpZmZbKGkqMzUtMzQpOihpKjM1KV0NCiAgYj10LnRlc3QoYSxtdT0wLGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQogDQogIGlmKGIkcC52YWx1ZTwwLjA1KQ0KICAgcmVzdWx0W2ldPWIkZXN0aW1hdGUNCiAgZWxzZQ0KICAgcmVzdWx0W2ldPTB9DQoNCnJlc3VsdD1kYXRhLmZyYW1lKHJlc3VsdCkNCnJvdy5uYW1lcyhyZXN1bHQpPWMoIkZyaWRnZSIsIkJha2VyeSIsIkZydWl0X1ZlZ2V0YWJsZXMiLCJQYW50cnkiLCJGcmVlemVyIiwiQmFieV9IZWFsdGhfQmVhdXR5IiwiRW50ZXJ0YWlubWVudF9JbnRlcm5hdGlvbmFsZm9vZHMiLCJDbG90aGluZ19ISF9QZXQiKQ0KcmVzdWx0DQpgYGANCg0KVGhlIGFib3ZlIHJlc3VsdHMgc2hvdyB0aGF0IG91dCBvZiB0aGUgOCBjYXRlZ29yaWVzLCAqKkNvbGVzIGlzIGV4cGVuc2l2ZSBpbiB0aHJlZSBjYXRlZ29yaWVzKiogKEZyaWRnZSwgUGFudHJ5LCBCYWJ5X0hlYWx0aF9CZWF1dHkpLCB3aGlsZSB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSByZW1haW5pbmcgNSBjYXRlZ29yaWVzIGkuZS4gYSkgQmFrZXJ5LCBiKSBGcnVpdC1WZWcsIGMpIEZyZWV6ZXIsIGQpIEVudGVydGFpbm1lbnQtSW50ZXJuYXRpb25hbCBmb29kcyAgZSkgQ2xvc3RoaW5nX0hILVBldC4NCiANCg0KIyMgRGlzY3Vzc2lvbiANCiMjIyMgRnVydGhlciBJbXByb3ZlbWVudCBhcmVhcw0KDQogICsgV2UgY29uY2x1ZGUgdGhhdCB0aGUgdHdvIHN1cGVybWFya2V0cyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBwcmljZXMgZm9yIHNpbWlsYXIgcHJvZHVjdCByYW5nZSBhbmQgY29sZXMgaXMgc2xpZ2h0bHkgZXhwZW5zaXZlIHRoYW4gd29vbHdvcnRocyBvdmVyYWxsLg0KDQogICsgVGhlIGxpbWl0YXRpb25zIGhlcmUgd2FzIHdlIGRpZCBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gcHJvZHVjdHMgb2YgaG9tZSBicmFuZCBhbmQgcHJvZHVjdHMgb24gc3BlY2lhbCBpbiBvdXIgYW5hbHlzaXMsYnV0IHRoZSBzdHJlbmd0aCByZW1haW5zIHRoYXQgd2UgY291bGQgY29tcGFyZSB0aGVtIGluIGFuIHVuYmlhc2VkIHdheSBieSBkcm9wcGluZyBob21lIGJyYW5kIHByb2R1Y3RzIGFuZCBjb25jZW50cmF0ZWQgbW9yZSBvbiBkYWlseSBjb25zdW1hYmxlcyByYXRoZXIgdGhhbiBsZXNzIHVzZWQgcHJvZHVjdHMgKFRWLE1vYmlsZSBQaG9uZXMsSGVhZHBob25lcyxEVkQgZXRjKS4NCg0KICArIFdlIGRpZCB0aGUgYW5hbHlzaXMgZnJvbSBjdXN0b21lciBwZXJzcGVjdGl2ZSB0byBmaW5kIG91dCB3aGljaCBpcyBjaGVhcGVyIGluIGJvdGggdGhlIHN1cGVybWFya2V0cyxidXQgaWYgd2Ugd2VyZSB0byBhbmFseXNlIHRoZSBkYXRhIGZyb20gc3VwZXJtYXJrZXRzIHBlcnNwZWN0aXZlIHRvIGZpbmQgaG93IHRoZXkgY2FuIGJlbmVmaXQgZnJvbSBzdHVkeWluZyB0aGUgY29tcGV0aXRvcnMgcHJpY2UgcmFuZ2UgYW5kIGNvdmVyIG1vcmUgY3VzdG9tZXIgYmFzZSBpbiBmdXR1cmUgYnkgYmVpbmcgY29tcGV0aXRpdmUgaW4gcHJpY2VzIGluIGNlcnRhaW4gY2F0ZWdvcmllcyBhbmQgbGVhZGluZyB0aGUgc3VwZXJtYXJrZXQgc2NvcmVib3JhZC4NCg0KICArIFRoZXNlIHByaWNlIHJhbmdlcyBjYW4gdmFyeSB3aXRoIHRpbWUgc28gdGhhdCBjb25zdHJhaW50IG5lZWRzIHRvIGJlIGtlcHQgaW4gbWluZCBhbHdheXMgZm9yIGZ1dHVyZSBhbmFseXNpcyBhcyBwcmljZXMga2VlcCBmbHVjdHVhdGluZyBvbiBkYWlseSBiYXNpcy4NCg0KDQo=