Group/Individual Details

Executive Statement

Given a choice of the retailer and budget constraint on the customer’s pocket, which retailer would customers prefer to fill their basket with ?

Data collection

How the data was collected ?

Stratified Sampling

Load Packages and Data

library(dplyr)
library(Rcmdr)

setwd("C:\\Users\\Parikshit\\Desktop\\Stats_Assignment_3\\Coles_Woolworths_Prices")
price_war<-read.csv("assign3_final_data_updt.csv")

price_war<-price_war%>%select(2:7)
price_war<-price_war[complete.cases(price_war),]

##Price data for COLES
coles<-price_war%>%select(1:3,5,6)
coles<-mutate(coles,Store="Coles")
names(coles)[3]<-"Price"

##Price data for woolworths
woolworths<-price_war%>%select(1:2,4:6)
woolworths<-mutate(woolworths,Store="Woolworths")
names(woolworths)[3]<-"Price"

##Combining both the data sets
price_war<-rbind(coles,woolworths)
price_war$Price<-round(price_war$Price,2)
price_war$Store<-as.factor(price_war$Store)       #coercing the Store column to a factor

Summary Statistics

##Calculating price bucket
attach(price_war)
for(i in 1:dim(price_war)[1])if(Price[i]>=0 & Price[i]<=5){
  price_war$price_bucket[i]<-"0-5"}else if(Price[i]>5 & Price[i]<=10){
    price_war$price_bucket[i]<-"5-10"}else if(Price[i] >10 & Price[i]<=15){
      price_war$price_bucket[i]<-"10-15"
}else if(Price[i] >15 & Price[i] <=20){
  price_war$price_bucket[i]<-"15-20"
}else if(Price[i] >20 & Price[i] <=25){
  price_war$price_bucket[i]<-"20-25"
}else if(Price[i] >25& Price[i] <=30){
  price_war$price_bucket[i]<-"25-30"
}else{price_bucket[i]<-"30+"}
price_war$price_bucket<-factor(price_war$price_bucket,levels=c("0-5","5-10","10-15","15-20","20-25","25-30","30+"),ordered=TRUE)
detach(price_war)

No.of products available at Coles and Woolworths based on Price Bucket

#An additional feature called "price_bucket" was derived from the price variable.
table(price_war$Store,price_war$price_bucket)
            
             0-5 5-10 10-15 15-20 20-25 25-30 30+
  Coles       76   23     2     1     1     1   0
  Woolworths  74   24     3     1     1     1   0
price_war%>%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),
                        n = n(),
                        Missing = sum(is.na(Price)))
##Boxplot of the PRICE variable
boxplot(price_war$Price~price_war$Store,ylab="Product Prices"
        ,xlab="Retailer"
        ,main="PRICE WAR\nComparison of product prices between COLES and WOOLWORTHS"
        ,col="Green")

The above box plot confirms a near to same distribution of product prices in both the stores

##Eventhough we have a large sample, we may want to check if our data comes from a normal distribution
##We shall examine this using a Q-Q plot
coles<-price_war%>%filter(Store=="Coles")
woolworths<-price_war%>%filter(Store=="Woolworths")
coles$Price%>%qqPlot(dist="norm",main="COLES",xlab="Standard Normal Quantiles",ylab="Product Prices")

woolworths$Price%>%qqPlot(dist="norm",main="WOOLWORTHS",xlab="Standard Normal Quantiles",ylab="Product Prices") ##There is a mild departure from normality

Hypothesis Test

Product prices of both COLES and WOOLWORTHS have the same variance. This is also verified using the Levenes test conducted below:-

##Homogeneity of Variance test
leveneTest(Price~Store,data=price_war)
##Performing two sample t-test
t.test(price_war$Price~price_war$Store
       ,paired=FALSE
       ,data = price_war
       ,var.equal=TRUE
       ,alternative="two.sided")

Interpretation

Hence the customers need not be weary of their choice of the retailer based on price point of the respective products

Both COLES’ and WOOLWORTHS’ product prices come from the same distribution of prices

Discussion

Findings and Conclusion:

Limitation - Price Point: Price point is not the only factor having a bearing on the customer’s choice of retailer. There are other factors such as brand spread offered at either of the stores, discounts, loyalty programs, location, etc.. that could influence the buying decision/customer footfalls.

Strengths: The size and equivalence of our respective data points is the core strength for this analysis.

Analysis tweaking: Another way to investigate the problem is to collect in-house products of COLES and WOOLWORTHS respectively and carry out the same analysis.

LS0tDQp0aXRsZTogIk1BVEgxMzI0IEFzc2lnbm1lbnQgMyINCnN1YnRpdGxlOiAiU3VwZXJtYXJrZXQgUHJpY2UgV2FyczogQ29sZXMgdnMgV29vbHdvcnRocyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIEdyb3VwL0luZGl2aWR1YWwgRGV0YWlscw0KDQoqIFBhcmlrc2hpdCBTcmVlZGhhciAoczM2NDM3OTYpDQoqIEFyanVuIEJhbGFqaSAoczM2Mjk5OTkpDQoqIFJhdmkgTWFkaHVyY2hhbmQgUGFuZGV5IChzMzYzODc4NykNCg0KIyMgRXhlY3V0aXZlIFN0YXRlbWVudA0KDQoqKkdpdmVuIGEgY2hvaWNlIG9mIHRoZSByZXRhaWxlciBhbmQgYnVkZ2V0IGNvbnN0cmFpbnQgb24gdGhlIGN1c3RvbWVyJ3MgcG9ja2V0LCB3aGljaCByZXRhaWxlciB3b3VsZCBjdXN0b21lcnMgcHJlZmVyIHRvIGZpbGwgdGhlaXIgYmFza2V0IHdpdGggPyoqDQoNCiogSW4gd29ya2luZyB0aHJvdWdoIHRoZSBjb250ZXh0OyBkYXRhIG9uIHByb2R1Y3RzLCBicmFuZHMsIHVuaXQgb2YgbWVhc3VyZW1lbnQgYW5kIHByaWNlIGhhZCBiZWVuIGNvbGxlY3RlZCBmcm9tIHRoZSByZXRhaWxlcnM6IF9Db2xlc18gYW5kIF9Xb29sd29ydGhzXw0KKiBQcm9kdWN0cyBmcm9tIGJvdGggcmV0YWlsZXJzIHdlcmUgbWF0Y2hlZCB3aXRoIHNhbWUgdW5pdCBvZiBtZWFzdXJlbWVudA0KKiBUaGUgb3JpZ2luYWwgcHJpY2VzIG9mIHRoZSBwcm9kdWN0cyB3ZXJlIHNhbXBsZWQNCiogQSB0ZXN0IHdhcyBjYXJyaWVkIG91dCB0byBkZXRlcm1pbmUgYW55IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGVpciBwcm9kdWN0IHByaWNlcw0KKiBUaGVyZSBzZWVtcyB0byBiZSBhIG1hcmdpbmFsIGRpZmZlcmVuY2UgaW4gcHJvZHVjdCBwcmljZXMgd2hpY2ggZG9lcyBub3QgaW5mbHVlbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIHJldGFpbGVyDQoNCiMjRGF0YSBjb2xsZWN0aW9uDQoqKkhvdyB0aGUgZGF0YSB3YXMgY29sbGVjdGVkID8qKg0KDQpfKipTdHJhdGlmaWVkIFNhbXBsaW5nKipfDQoNCiogV2UgYSB0ZWFtIG9mIDMgcGVvcGxlLCBzdHJvbGxlZCBhY3Jvc3MgdGhlIGFpc2xlcyBhdCAqQ09MRVMqIGFuZCAqV09PTFdPUlRIUyogc3VwZXJtYXJrZXQ7IHJhbmRvbWx5IHNhbXBsZWQgcHJvZHVjdHMgYW5kIG5vdGVkIGRvd24gdGhlaXIgcHJpY2VzLg0KDQoqIFRoZSB2YXJpYWJsZXMgdGhhdCB3ZXJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhcmUgYXMgZm9sbG93czoNCiAgICArICpQcm9kdWN0IE5hbWUqIA0KICAgICsgKkJyYW5kKiANCiAgICArICpDT0xFUyBQcmljZSogDQogICAgKyAqV09PTFdPUlRIUyBQcmljZSogDQogICAgKyAqVU5JVCBPRiBNRUFTVVJFTUVOVCoNCiAgICArICpBaXNsZSoNCiAgICArICpQcmljZV9idWNrZXQqIC0gQWRkaXRpb25hbCB2YXJpYWJsZQ0KDQojIyBMb2FkIFBhY2thZ2VzIGFuZCBEYXRhDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KFJjbWRyKQ0KDQpzZXR3ZCgiQzpcXFVzZXJzXFxQYXJpa3NoaXRcXERlc2t0b3BcXFN0YXRzX0Fzc2lnbm1lbnRfM1xcQ29sZXNfV29vbHdvcnRoc19QcmljZXMiKQ0KcHJpY2Vfd2FyPC1yZWFkLmNzdigiYXNzaWduM19maW5hbF9kYXRhX3VwZHQuY3N2IikNCg0KcHJpY2Vfd2FyPC1wcmljZV93YXIlPiVzZWxlY3QoMjo3KQ0KcHJpY2Vfd2FyPC1wcmljZV93YXJbY29tcGxldGUuY2FzZXMocHJpY2Vfd2FyKSxdDQoNCiMjUHJpY2UgZGF0YSBmb3IgQ09MRVMNCmNvbGVzPC1wcmljZV93YXIlPiVzZWxlY3QoMTozLDUsNikNCmNvbGVzPC1tdXRhdGUoY29sZXMsU3RvcmU9IkNvbGVzIikNCm5hbWVzKGNvbGVzKVszXTwtIlByaWNlIg0KDQojI1ByaWNlIGRhdGEgZm9yIHdvb2x3b3J0aHMNCndvb2x3b3J0aHM8LXByaWNlX3dhciU+JXNlbGVjdCgxOjIsNDo2KQ0Kd29vbHdvcnRoczwtbXV0YXRlKHdvb2x3b3J0aHMsU3RvcmU9Ildvb2x3b3J0aHMiKQ0KbmFtZXMod29vbHdvcnRocylbM108LSJQcmljZSINCg0KIyNDb21iaW5pbmcgYm90aCB0aGUgZGF0YSBzZXRzDQpwcmljZV93YXI8LXJiaW5kKGNvbGVzLHdvb2x3b3J0aHMpDQpwcmljZV93YXIkUHJpY2U8LXJvdW5kKHByaWNlX3dhciRQcmljZSwyKQ0KcHJpY2Vfd2FyJFN0b3JlPC1hcy5mYWN0b3IocHJpY2Vfd2FyJFN0b3JlKSAgICAgICAjY29lcmNpbmcgdGhlIFN0b3JlIGNvbHVtbiB0byBhIGZhY3Rvcg0KYGBgDQojIyBTdW1tYXJ5IFN0YXRpc3RpY3MNCmBgYHtyfQ0KIyNDYWxjdWxhdGluZyB0aGUgcHJpY2UgYnVja2V0DQphdHRhY2gocHJpY2Vfd2FyKQ0KZm9yKGkgaW4gMTpkaW0ocHJpY2Vfd2FyKVsxXSlpZihQcmljZVtpXT49MCAmIFByaWNlW2ldPD01KXsNCiAgcHJpY2Vfd2FyJHByaWNlX2J1Y2tldFtpXTwtIjAtNSJ9ZWxzZSBpZihQcmljZVtpXT41ICYgUHJpY2VbaV08PTEwKXsNCiAgICBwcmljZV93YXIkcHJpY2VfYnVja2V0W2ldPC0iNS0xMCJ9ZWxzZSBpZihQcmljZVtpXSA+MTAgJiBQcmljZVtpXTw9MTUpew0KICAgICAgcHJpY2Vfd2FyJHByaWNlX2J1Y2tldFtpXTwtIjEwLTE1Ig0KfWVsc2UgaWYoUHJpY2VbaV0gPjE1ICYgUHJpY2VbaV0gPD0yMCl7DQogIHByaWNlX3dhciRwcmljZV9idWNrZXRbaV08LSIxNS0yMCINCn1lbHNlIGlmKFByaWNlW2ldID4yMCAmIFByaWNlW2ldIDw9MjUpew0KICBwcmljZV93YXIkcHJpY2VfYnVja2V0W2ldPC0iMjAtMjUiDQp9ZWxzZSBpZihQcmljZVtpXSA+MjUmIFByaWNlW2ldIDw9MzApew0KICBwcmljZV93YXIkcHJpY2VfYnVja2V0W2ldPC0iMjUtMzAiDQp9ZWxzZXtwcmljZV9idWNrZXRbaV08LSIzMCsifQ0KDQpwcmljZV93YXIkcHJpY2VfYnVja2V0PC1mYWN0b3IocHJpY2Vfd2FyJHByaWNlX2J1Y2tldCxsZXZlbHM9YygiMC01IiwiNS0xMCIsIjEwLTE1IiwiMTUtMjAiLCIyMC0yNSIsIjI1LTMwIiwiMzArIiksb3JkZXJlZD1UUlVFKQ0KDQpkZXRhY2gocHJpY2Vfd2FyKQ0KYGBgDQojIyBOby5vZiBwcm9kdWN0cyBhdmFpbGFibGUgYXQgX0NvbGVzXyBhbmQgX1dvb2x3b3J0aHNfIGJhc2VkIG9uIFByaWNlIEJ1Y2tldA0KYGBge3J9DQojQW4gQWRkaXRpb25hbCBmZWF0dXJlIGNhbGxlZCAicHJpY2VfYnVja2V0IiB3YXMgZGVyaXZlZCBmcm9tIHRoZSBwcmljZSB2YXJpYWJsZS4NCnRhYmxlKHByaWNlX3dhciRTdG9yZSxwcmljZV93YXIkcHJpY2VfYnVja2V0KQ0KYGBgDQoNCmBgYHtyfQ0KI1N0b3JlIGxldmVsIHN1bW1hcnkgc3RhdGlzdGljcw0KcHJpY2Vfd2FyJT4lZ3JvdXBfYnkoU3RvcmUpJT4lc3VtbWFyaXNlKE1pbiA9IG1pbihQcmljZSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUTEgPSBxdWFudGlsZShQcmljZSxwcm9icyA9IC4yNSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFuID0gbWVkaWFuKFByaWNlLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgUTMgPSBxdWFudGlsZShQcmljZSxwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWF4ID0gbWF4KFByaWNlLG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbihQcmljZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFNEID0gc2QoUHJpY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICBuID0gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZyA9IHN1bShpcy5uYShQcmljZSkpKQ0KYGBgDQpgYGB7cn0NCiMjQm94cGxvdCBvZiB0aGUgUFJJQ0UgdmFyaWFibGUNCmJveHBsb3QocHJpY2Vfd2FyJFByaWNlfnByaWNlX3dhciRTdG9yZSx5bGFiPSJQcm9kdWN0IFByaWNlcyINCiAgICAgICAgLHhsYWI9IlJldGFpbGVyIg0KICAgICAgICAsbWFpbj0iUFJJQ0UgV0FSXG5Db21wYXJpc29uIG9mIHByb2R1Y3QgcHJpY2VzIGJldHdlZW4gQ09MRVMgYW5kIFdPT0xXT1JUSFMiDQogICAgICAgICxjb2w9IkdyZWVuIikNCmBgYA0KX1RoZSBhYm92ZSBib3ggcGxvdCBjb25maXJtcyBhIG5lYXIgdG8gc2FtZSBkaXN0cmlidXRpb24gb2YgcHJvZHVjdCBwcmljZXMgaW4gYm90aCB0aGUgc3RvcmVzXw0KYGBge3J9DQojI0V2ZW50aG91Z2ggd2UgaGF2ZSBhIGxhcmdlIHNhbXBsZSwgd2UgbWF5IHdhbnQgdG8gY2hlY2sgaWYgb3VyIGRhdGEgY29tZXMgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24NCiMjV2Ugc2hhbGwgZXhhbWluZSB0aGlzIHVzaW5nIGEgUS1RIHBsb3QNCmNvbGVzPC1wcmljZV93YXIlPiVmaWx0ZXIoU3RvcmU9PSJDb2xlcyIpDQp3b29sd29ydGhzPC1wcmljZV93YXIlPiVmaWx0ZXIoU3RvcmU9PSJXb29sd29ydGhzIikNCmNvbGVzJFByaWNlJT4lcXFQbG90KGRpc3Q9Im5vcm0iLG1haW49IkNPTEVTIix4bGFiPSJTdGFuZGFyZCBOb3JtYWwgUXVhbnRpbGVzIix5bGFiPSJQcm9kdWN0IFByaWNlcyIpDQp3b29sd29ydGhzJFByaWNlJT4lcXFQbG90KGRpc3Q9Im5vcm0iLG1haW49IldPT0xXT1JUSFMiLHhsYWI9IlN0YW5kYXJkIE5vcm1hbCBRdWFudGlsZXMiLHlsYWI9IlByb2R1Y3QgUHJpY2VzIikgIyNUaGVyZSBpcyBhIG1pbGQgZGVwYXJ0dXJlIGZyb20gbm9ybWFsaXR5DQoNCmBgYA0KIyMgSHlwb3RoZXNpcyBUZXN0DQoqICoqQXNzdW10aW9uOioqIFRoZSBzYW1wbGUgb2YgcHJvZHVjdCBwcmljZXMgb2YgX0NPTEVTXyBhbmQgX1dPT0xXT1JUSFNfIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyDQoqIFRoZSBOVUxMIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgbWVhbiBkaWZmZXJlbmNlIGluIHByaWNlcyBvZiBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gaXMgemVybw0KKiBUaGUgYWx0ZXJuYXRlIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgbWVhbiBkaWZmZXJlbmNlIGluIHByaWNlcyBvZiBfQ09MRVNfIGFuZCBXT09MV09SVEhTIGlzIE5PVCB6ZXJvDQoqIEEgdHdvIHNhbXBsZSB0LXRlc3Qgd2lsbCBiZSBjYXJyaWVkIG91dCB3aXRoIGEgY29uZmlkZW5jZSBsZXZlbCBvZiA5NSUgYW5kIHNpZ25pZmljYW5jZSBsZXZlbCBvZiA1JQ0KKiBXZSB1c2UgdGhlIHAtdmFsdWUgYXBwcm9hY2ggdG8gaW50ZXJwcmV0IHRoZSBfdC10ZXN0IHN0YXRpc3RpY18NCiogU2luY2UsIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzAgZGF0YSBwb2ludHMgaW4gYm90aCB0aGUgc2FtcGxlcywgd2UgbmVlZCBub3QgYXNzdW1lIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBwcm9kdWN0IHByaWNlcyBvZiBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gdG8gYmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQNCg0KUHJvZHVjdCBwcmljZXMgb2YgYm90aCBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gaGF2ZSB0aGUgc2FtZSB2YXJpYW5jZS4gVGhpcyBpcyBhbHNvIHZlcmlmaWVkIHVzaW5nIHRoZSBMZXZlbmVzIHRlc3QgY29uZHVjdGVkIGJlbG93Oi0NCmBgYHtyfQ0KIyNIb21vZ2VuZWl0eSBvZiBWYXJpYW5jZSB0ZXN0DQpsZXZlbmVUZXN0KFByaWNlflN0b3JlLGRhdGE9cHJpY2Vfd2FyKQ0KYGBgDQpgYGB7cn0NCiMjUGVyZm9ybWluZyB0d28gc2FtcGxlIHQtdGVzdA0KdC50ZXN0KHByaWNlX3dhciRQcmljZX5wcmljZV93YXIkU3RvcmUNCiAgICAgICAscGFpcmVkPUZBTFNFDQogICAgICAgLGRhdGEgPSBwcmljZV93YXINCiAgICAgICAsdmFyLmVxdWFsPVRSVUUNCiAgICAgICAsYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpDQpgYGANCiMjIEludGVycHJldGF0aW9uDQoqIFRoZSB0ZXN0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50DQogICsgVGhlIHAtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAuMDUuIA0KICArIFRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgYSBkaWZmZXJlbmNlIGluIHByb2R1Y3QgcHJpY2VzIGFzIGhpZ2ggYXMgdGhlIHQtdGVzdCBzdGF0aXN0aWMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSA1JSBzaWduaWZpY2FuY2UgbGV2ZWwNCiAgKyBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbCBob3VzZXMgdGhlIG51bGwgaHlwb3RoZXNpc2VkIHZhbHVlIG9mIHplcm8gDQoqIFRoZXJlIGlzIG5vdyBpbnN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBfTlVMTCBIWVBPVEhFU0lTXyANCg0KXypIZW5jZSB0aGUgY3VzdG9tZXJzIG5lZWQgbm90IGJlIHdlYXJ5IG9mIHRoZWlyIGNob2ljZSBvZiB0aGUgcmV0YWlsZXIgYmFzZWQgb24gcHJpY2UgcG9pbnQgb2YgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdHMqXw0KDQpfKkJvdGggQ09MRVMnIGFuZCBXT09MV09SVEhTJyBwcm9kdWN0IHByaWNlcyBjb21lIGZyb20gdGhlIHNhbWUgZGlzdHJpYnV0aW9uIG9mIHByaWNlcypfDQoNCiMjIERpc2N1c3Npb24NCioqRmluZGluZ3MgYW5kIENvbmNsdXNpb246KioNCg0KKiBCb3RoIF9DT0xFU18gYW5kIF9XT09MV09SVEhTXyBzZWVtcyB0byBoYXZlIHNpbWlsYXIgcHJpY2luZyBzdHJhdGVneQ0KKiBJbiBvcmRlciB0byBjb25kdWN0IGFuIGVmZmljaWVudCBhbmFseXNpcyBvZiB0aGlzIGtpbmQsIHRoZSBxdWFudGl0YXRpdmUgdmFyaWFibGVzIGZyb20gYm90aCB0aGUgc2FtcGxlcyhDT0xFUyBhbmQgV09PTFdPUlRIUyBpbiBvdXIgY2FzZSkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdW5pdCBvZiBtZWFzdXJlbWVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdHMNCiogVGhlIHdob2xlIGFuYWx5c2lzIGhpbmdlcyBvbiBwcm9kdWN0IG1hdGNoaW5nIGFuZCBzdGFuZGFyZGlzYXRpb24gb2YgcHJvZHVjdCBwcmljZXMgYW5kIHVuaXQgb2YgbWVhc3VyZW1lbnQNCiogQmFzZWQgb24gdGhlIHN0dWR5IGNvbmR1Y3RlZCwgcHJvZHVjdCBwcmljZXMgYXQgX0NPTEVTXyBhbmQgX1dPT0xXT1JUSFNfIGhhdmUgYSBuZWdsaWdpYmxlDQpkaWZmZXJlbmNlDQoNCipMaW1pdGF0aW9uIC0gUHJpY2UgUG9pbnQ6KiBQcmljZSBwb2ludCBpcyBub3QgdGhlIG9ubHkgZmFjdG9yIGhhdmluZyBhIGJlYXJpbmcgb24gdGhlIGN1c3RvbWVyJ3MgY2hvaWNlIG9mIHJldGFpbGVyLiBUaGVyZSBhcmUgb3RoZXIgZmFjdG9ycyBzdWNoIGFzIGJyYW5kIHNwcmVhZCBvZmZlcmVkIGF0IGVpdGhlciBvZiB0aGUgc3RvcmVzLCBkaXNjb3VudHMsIGxveWFsdHkgcHJvZ3JhbXMsIGxvY2F0aW9uLCBldGMuLiB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGUgYnV5aW5nIGRlY2lzaW9uL2N1c3RvbWVyIGZvb3RmYWxscy4NCg0KKlN0cmVuZ3RoczoqIFRoZSBzaXplIGFuZCBlcXVpdmFsZW5jZSBvZiBvdXIgcmVzcGVjdGl2ZSBkYXRhIHBvaW50cyBpcyB0aGUgY29yZSBzdHJlbmd0aCBmb3IgdGhpcyBhbmFseXNpcy4NCg0KKkFuYWx5c2lzIHR3ZWFraW5nOiogQW5vdGhlciB3YXkgdG8gaW52ZXN0aWdhdGUgdGhlIHByb2JsZW0gaXMgdG8gY29sbGVjdCBpbi1ob3VzZSBwcm9kdWN0cyBvZiBfQ09MRVNfIGFuZCBfV09PTFdPUlRIU18gcmVzcGVjdGl2ZWx5IGFuZCBjYXJyeSBvdXQgdGhlIHNhbWUgYW5hbHlzaXMu