About
Qualitative Descriptive Analytics aims to gather an in-depth understanding of the underlying reasons and motivations for an event or observation. It is typically represented with visuals or charts.
Quantitative Descriptive Analytics focuses on investigating a phenomenon via statistical, mathematical, and computationaly techniques. It aims to quantify an event with metrics and numbers.
In this lab, we will explore both analytics using the data set provided.
Setup
Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.
Note
For your assignment you may be using different data sets than what is included here. Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.
Execute all code chunks, preview, publish, and submit link on Sakai.
Task 1: Quantitative Analysis
Begin by reading in the data from the ‘marketing.csv’ file, and viewing it to make sure it is read in correctly.
mydata = read.csv(file="data/marketing.csv")
head(mydata)
Now let’s calculate the Range, Min, Max, Mean, STDEV, and Variance for each variable. Below is an example of how to compute the items for the variable ‘sales’.
sales = mydata$sales
#Max Sales
max = max(sales)
max
[1] 20450
#Min Sales
min = min(sales)
min
[1] 11125
#Range
max-min
[1] 9325
#Mean
mean(sales)
[1] 16717.2
#Standard Deviation
sd(sales)
[1] 2617.052
#Variance
var(sales)
[1] 6848961
##### 1A) Repeat the above statistics for the variable radio
radio = mydata$radio #stracting the data
max = max(radio) #max
max
[1] 89
min = min(radio) #min
min
[1] 65
max-min #range
[1] 24
mean(radio) #mean
[1] 76.1
sd(radio) #standard deviation
[1] 7.354912
var(radio) #variance
[1] 54.09474
radio = mydata$radio
summary(radio)
Min. 1st Qu. Median Mean 3rd Qu. Max.
65.00 70.00 74.50 76.10 81.75 89.00
An easy way to calculate many of these statistics is with the summary() function. Below is an example.
summary(sales)
Min. 1st Qu. Median Mean 3rd Qu. Max.
11125 15175 16658 16717 18874 20450
##### 1B) Repeat the above summary calculation for the variable paper. Some statistics are not calculated with the summary() function. Specify which
paper = mydata$paper
summary(paper)
Min. 1st Qu. Median Mean 3rd Qu. Max.
35.00 53.75 62.50 62.30 75.50 89.00
#The statistics which are not calculated with the summary() function are the range, standard deviation, and the variance.
Task 2: Qualitative Analysis
Now, we will produce a basic plot of the ‘sales’ variable . Here we call the plot function and within the plot function we refer the variable we want to plot.
plot(sales)

We can customize the plot by connecting the dots and adding labels to the x- and y- axis.
#xlab labels the x axis, ylab labels the y axis
plot(sales, type="b", xlab = "Case Number", ylab = "Sales in $1,000")

There are further ways to customize plots, such as changing the colors of the lines, adding a heading, or even making them interactive.
Now, lets plot the sales graph, alongside radio, paper, and tv which you will code. Make sure to run the code in the same chunk so they are on the same layout.
#Layout allows us to see all 4 graphs on one screen
layout(matrix(1:4,2,2))
#Example of how to plot the sales variable
plot(sales, type="b", xlab = "Case Number", ylab = "Sales in $1,000")
# Add three other plots here
radio = mydata$radio
plot(radio, type="b", xlab = "case number", ylab = "radio ads in $1,000")
plot(paper, type="b", xlab = "case number", ylab = "paper ads in $1,000")
tv = mydata$tv
plot(tv, type = "b", xlab = "case number", ylab = "tv ads in $1,000")

##### 2A) Insert in the above code chunk the three other plots for Radio, Paper, and TV. Label the axes properly.
When looking at these plots it is hard to see a particular trend. One way to observe any possible trend in the sales data would be to re-order the data from low to high. The 20 months case studies are in no particular chronological time sequence. The 20 case numbers are independent sequentially generated numbers used as tags. Since each case is independent, we can reorder them. Note that as each case is re-ordered corresponding column values are also re-organised to maintain the relationship integrity.
#Re-order sales from low to high, and save re-ordered data in a new set. As sales data is re-reorded associated other column fields follow.
newdata = mydata[order(sales),]
head(newdata)
# Redefine the new variables
newsales = newdata$sales
newradio = newdata$radio
newtv = newdata$tv
newpaper = newdata$paper
##### 2B) Repeat the previous 4 graphs layout exercise using instead the above defined four new variables for sales, radio, tv, and paper.
layout(matrix(1:4,2,2)) #4x4 layout - all on one screen
plot(newsales, type="b", xlab = "Case Number", ylab = "Sales in $1,000", main="SALES", col="black") #newsales variable plot
plot(newradio, type="b", xlab = "case number", ylab = "radio ads in $1,000", main="RADIO", col="dark green") #newradio variable plot
plot(newpaper, type="b", xlab = "case number", ylab = "paper ads in $1,000", main="PAPER", col="dark red") #newpaper variable plot
plot(newtv, type = "b", xlab = "case number", ylab = "tv ads in $1,000", main="TV", col="dark blue") #newtv variable plot

##### 2C) Explain what the new plots are revealing in terms of trending relationships.
#Taking the sales plot as our reference, the radio and tv plots follow the same trend as the sales plot: the three of them have a positive slope and they increase similarly (positive correlation relationship).
#On the other hand, there is not a specific trend in the paper plot because it does not follow any pattern. This plot fluctuates much and in different ways so it is not possible to establish any trend between this plot and the other 3 (no correlation relationship).
#This analysis is interesting for the performance of the business to be efficient in their marketing campaigns. In this specific case, for example, the Marketing Director could conclude with the observation that radio and tv ads are more efficient because when they increased the amount of ads in these resources, the total amount of sales also increases. However, there is no pattern in paper ads, this type of ads do not directly increase or decrease the total amount of sales with its use (there is no correlation relationship). In further decision such as cost cut, they would rather renounce the paper ads (because they are not directly increasing sales as a trend) than TV or radio ads.
Task 3: Standarized Z-Value
You are given a sales value of $25000. We want to calculate the corresponding z-value or z-score for sales using the mean and standard deviation calculations as shown in task 1. Remember that z-score = (x - mean)/sd.
##### 3A) Calculate the z-value. Based on your result, would you rate a $25000 in sales as poor, average, good, or very good performance? Explain your logic.
z_value = (25000-mean(sales))/sd(sales) #calculating the z-score
z_value
[1] 3.164935
#The z-score is 3.16. The z-score is positive (above the mean) and greater than 3 which means that it is above 3 standard deviations. This means that $25,000 in sales is a very good performance because it is greater than 99.74% of the data.
.
LS0tCnRpdGxlOiAiQlNBRDM0MyBGYWxsIDIwMTggTGFiIFdvcmtzaGVldCAwNCIKYXV0aG9yOiAiRWxlbmEgUMOpcmV6IFZlbGFzY28iCmRhdGU6ICI5LzI4LzE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKc3VidGl0bGU6IFF1YWxpdGF0aXZlICYgUXVhbnRpdGF0aXZlIEFuYWx5dGljcyAoYnNhZC1sYWIwNCkKLS0tCgojIyMgQWJvdXQKClF1YWxpdGF0aXZlIERlc2NyaXB0aXZlIEFuYWx5dGljcyBhaW1zIHRvIGdhdGhlciBhbiBpbi1kZXB0aCB1bmRlcnN0YW5kaW5nIG9mIHRoZSB1bmRlcmx5aW5nIHJlYXNvbnMgYW5kIG1vdGl2YXRpb25zIGZvciBhbiBldmVudCBvciBvYnNlcnZhdGlvbi4gSXQgaXMgdHlwaWNhbGx5IHJlcHJlc2VudGVkIHdpdGggdmlzdWFscyBvciBjaGFydHMuIAoKUXVhbnRpdGF0aXZlIERlc2NyaXB0aXZlIEFuYWx5dGljcyBmb2N1c2VzIG9uIGludmVzdGlnYXRpbmcgYSBwaGVub21lbm9uIHZpYSBzdGF0aXN0aWNhbCwgbWF0aGVtYXRpY2FsLCBhbmQgY29tcHV0YXRpb25hbHkgdGVjaG5pcXVlcy4gSXQgYWltcyB0byBxdWFudGlmeSBhbiBldmVudCB3aXRoIG1ldHJpY3MgYW5kIG51bWJlcnMuIAoKSW4gdGhpcyBsYWIsIHdlIHdpbGwgZXhwbG9yZSBib3RoIGFuYWx5dGljcyB1c2luZyB0aGUgZGF0YSBzZXQgcHJvdmlkZWQuIAoKIyMjIFNldHVwCgpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gCgojIyMgTm90ZQoKRm9yIHlvdXIgYXNzaWdubWVudCB5b3UgbWF5IGJlIHVzaW5nIGRpZmZlcmVudCBkYXRhIHNldHMgdGhhbiB3aGF0IGlzIGluY2x1ZGVkIGhlcmUuIEFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLgoKRXhlY3V0ZSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaS4KCi0tLS0tLS0tLS0tLS0tCgojIyMgVGFzayAxOiBRdWFudGl0YXRpdmUgQW5hbHlzaXMKCkJlZ2luIGJ5IHJlYWRpbmcgaW4gdGhlIGRhdGEgZnJvbSB0aGUgJ21hcmtldGluZy5jc3YnIGZpbGUsIGFuZCB2aWV3aW5nIGl0IHRvIG1ha2Ugc3VyZSBpdCBpcyByZWFkIGluIGNvcnJlY3RseS4gCgpgYGB7cn0KbXlkYXRhID0gcmVhZC5jc3YoZmlsZT0iZGF0YS9tYXJrZXRpbmcuY3N2IikKaGVhZChteWRhdGEpCmBgYAoKTm93IGxldCdzIGNhbGN1bGF0ZSB0aGUgUmFuZ2UsIE1pbiwgTWF4LCBNZWFuLCBTVERFViwgYW5kIFZhcmlhbmNlIGZvciBlYWNoIHZhcmlhYmxlLiBCZWxvdyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBjb21wdXRlIHRoZSBpdGVtcyBmb3IgdGhlIHZhcmlhYmxlICdzYWxlcycuIAoKYGBge3J9CnNhbGVzID0gbXlkYXRhJHNhbGVzCiNNYXggU2FsZXMKbWF4ID0gbWF4KHNhbGVzKQptYXgKCiNNaW4gU2FsZXMKbWluID0gbWluKHNhbGVzKQptaW4KCiNSYW5nZQptYXgtbWluCgojTWVhbgptZWFuKHNhbGVzKQoKI1N0YW5kYXJkIERldmlhdGlvbgpzZChzYWxlcykKCiNWYXJpYW5jZQp2YXIoc2FsZXMpCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFBKSBSZXBlYXQgdGhlIGFib3ZlIHN0YXRpc3RpY3MgZm9yIHRoZSB2YXJpYWJsZSByYWRpbwo8L3NwYW4+CmBgYHtyfQpyYWRpbyA9IG15ZGF0YSRyYWRpbyAjc3RyYWN0aW5nIHRoZSBkYXRhCgptYXggPSBtYXgocmFkaW8pICNtYXgKbWF4CgptaW4gPSBtaW4ocmFkaW8pICNtaW4KbWluCgptYXgtbWluICNyYW5nZQoKbWVhbihyYWRpbykgI21lYW4KCnNkKHJhZGlvKSAjc3RhbmRhcmQgZGV2aWF0aW9uCgp2YXIocmFkaW8pICN2YXJpYW5jZQpgYGAKCgpgYGB7cn0KcmFkaW8gPSBteWRhdGEkcmFkaW8Kc3VtbWFyeShyYWRpbykKYGBgCgpBbiBlYXN5IHdheSB0byBjYWxjdWxhdGUgbWFueSBvZiB0aGVzZSBzdGF0aXN0aWNzIGlzIHdpdGggdGhlIHN1bW1hcnkoKSBmdW5jdGlvbi4gQmVsb3cgaXMgYW4gZXhhbXBsZS4KCmBgYHtyfQpzdW1tYXJ5KHNhbGVzKQpgYGAKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFCKSBSZXBlYXQgdGhlIGFib3ZlIHN1bW1hcnkgY2FsY3VsYXRpb24gZm9yIHRoZSB2YXJpYWJsZSBwYXBlci4gU29tZSBzdGF0aXN0aWNzIGFyZSBub3QgY2FsY3VsYXRlZCB3aXRoIHRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24uIFNwZWNpZnkgd2hpY2gKPC9zcGFuPgpgYGB7cn0KcGFwZXIgPSBteWRhdGEkcGFwZXIKc3VtbWFyeShwYXBlcikKYGBgCmBgYHtyfQojVGhlIHN0YXRpc3RpY3Mgd2hpY2ggYXJlIG5vdCBjYWxjdWxhdGVkIHdpdGggdGhlIHN1bW1hcnkoKSBmdW5jdGlvbiBhcmUgdGhlIHJhbmdlLCBzdGFuZGFyZCBkZXZpYXRpb24sIGFuZCB0aGUgdmFyaWFuY2UuIApgYGAKCi0tLS0tLS0tLS0KCiMjIyBUYXNrIDI6IFF1YWxpdGF0aXZlIEFuYWx5c2lzCgpOb3csIHdlIHdpbGwgcHJvZHVjZSBhIGJhc2ljIHBsb3Qgb2YgdGhlICdzYWxlcycgdmFyaWFibGUgLiBIZXJlIHdlIGNhbGwgdGhlIHBsb3QgZnVuY3Rpb24gYW5kIHdpdGhpbiB0aGUgcGxvdCBmdW5jdGlvbiB3ZSByZWZlciB0aGUgdmFyaWFibGUgd2Ugd2FudCB0byBwbG90LiAKCmBgYHtyfQpwbG90KHNhbGVzKQpgYGAKCldlIGNhbiBjdXN0b21pemUgdGhlIHBsb3QgYnkgY29ubmVjdGluZyB0aGUgZG90cyBhbmQgYWRkaW5nIGxhYmVscyB0byB0aGUgeC0gYW5kIHktIGF4aXMuCgpgYGB7cn0KI3hsYWIgbGFiZWxzIHRoZSB4IGF4aXMsIHlsYWIgbGFiZWxzIHRoZSB5IGF4aXMKcGxvdChzYWxlcywgdHlwZT0iYiIsIHhsYWIgPSAiQ2FzZSBOdW1iZXIiLCB5bGFiID0gIlNhbGVzIGluICQxLDAwMCIpIApgYGAKClRoZXJlIGFyZSBmdXJ0aGVyIHdheXMgdG8gY3VzdG9taXplIHBsb3RzLCBzdWNoIGFzIGNoYW5naW5nIHRoZSBjb2xvcnMgb2YgdGhlIGxpbmVzLCBhZGRpbmcgYSBoZWFkaW5nLCBvciBldmVuIG1ha2luZyB0aGVtIGludGVyYWN0aXZlLiAKCk5vdywgbGV0cyBwbG90IHRoZSBzYWxlcyBncmFwaCwgYWxvbmdzaWRlIHJhZGlvLCBwYXBlciwgYW5kIHR2IHdoaWNoIHlvdSB3aWxsIGNvZGUuIE1ha2Ugc3VyZSB0byBydW4gdGhlIGNvZGUgaW4gdGhlIHNhbWUgY2h1bmsgc28gdGhleSBhcmUgb24gdGhlIHNhbWUgbGF5b3V0LgoKYGBge3J9CiNMYXlvdXQgYWxsb3dzIHVzIHRvIHNlZSBhbGwgNCBncmFwaHMgb24gb25lIHNjcmVlbgpsYXlvdXQobWF0cml4KDE6NCwyLDIpKQoKI0V4YW1wbGUgb2YgaG93IHRvIHBsb3QgdGhlIHNhbGVzIHZhcmlhYmxlCnBsb3Qoc2FsZXMsIHR5cGU9ImIiLCB4bGFiID0gIkNhc2UgTnVtYmVyIiwgeWxhYiA9ICJTYWxlcyBpbiAkMSwwMDAiKQoKIyBBZGQgdGhyZWUgb3RoZXIgcGxvdHMgaGVyZQpyYWRpbyA9IG15ZGF0YSRyYWRpbwpwbG90KHJhZGlvLCB0eXBlPSJiIiwgeGxhYiA9ICJjYXNlIG51bWJlciIsIHlsYWIgPSAicmFkaW8gYWRzIGluICQxLDAwMCIpCgpwbG90KHBhcGVyLCB0eXBlPSJiIiwgeGxhYiA9ICJjYXNlIG51bWJlciIsIHlsYWIgPSAicGFwZXIgYWRzIGluICQxLDAwMCIpCgp0diA9IG15ZGF0YSR0dgpwbG90KHR2LCB0eXBlID0gImIiLCB4bGFiID0gImNhc2UgbnVtYmVyIiwgeWxhYiA9ICJ0diBhZHMgaW4gJDEsMDAwIikKYGBgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkEpIEluc2VydCBpbiB0aGUgYWJvdmUgY29kZSBjaHVuayB0aGUgdGhyZWUgb3RoZXIgcGxvdHMgZm9yIFJhZGlvLCBQYXBlciwgYW5kIFRWLiAgTGFiZWwgdGhlIGF4ZXMgcHJvcGVybHkuCjwvc3Bhbj4KCgpXaGVuIGxvb2tpbmcgYXQgdGhlc2UgcGxvdHMgaXQgaXMgaGFyZCB0byBzZWUgYSBwYXJ0aWN1bGFyIHRyZW5kLiBPbmUgd2F5IHRvIG9ic2VydmUgYW55IHBvc3NpYmxlIHRyZW5kIGluIHRoZSBzYWxlcyBkYXRhIHdvdWxkIGJlIHRvIHJlLW9yZGVyIHRoZSBkYXRhIGZyb20gbG93IHRvIGhpZ2guIFRoZSAyMCBtb250aHMgIGNhc2Ugc3R1ZGllcyBhcmUgaW4gbm8gcGFydGljdWxhciBjaHJvbm9sb2dpY2FsIHRpbWUgc2VxdWVuY2UuIFRoZSAyMCBjYXNlIG51bWJlcnMgYXJlIGluZGVwZW5kZW50IHNlcXVlbnRpYWxseSBnZW5lcmF0ZWQgbnVtYmVycyB1c2VkIGFzIHRhZ3MuIFNpbmNlIGVhY2ggY2FzZSBpcyBpbmRlcGVuZGVudCwgd2UgY2FuIHJlb3JkZXIgdGhlbS4gTm90ZSB0aGF0IGFzIGVhY2ggY2FzZSBpcyByZS1vcmRlcmVkIGNvcnJlc3BvbmRpbmcgY29sdW1uIHZhbHVlcyBhcmUgYWxzbyByZS1vcmdhbmlzZWQgdG8gbWFpbnRhaW4gdGhlIHJlbGF0aW9uc2hpcCBpbnRlZ3JpdHkuCgpgYGB7cn0KI1JlLW9yZGVyIHNhbGVzIGZyb20gbG93IHRvIGhpZ2gsIGFuZCBzYXZlIHJlLW9yZGVyZWQgZGF0YSBpbiBhIG5ldyBzZXQuIEFzIHNhbGVzIGRhdGEgaXMgcmUtcmVvcmRlZCBhc3NvY2lhdGVkIG90aGVyIGNvbHVtbiBmaWVsZHMgZm9sbG93LgpuZXdkYXRhID0gbXlkYXRhW29yZGVyKHNhbGVzKSxdCmhlYWQobmV3ZGF0YSkKIyBSZWRlZmluZSB0aGUgbmV3IHZhcmlhYmxlcyAKbmV3c2FsZXMgPSBuZXdkYXRhJHNhbGVzCm5ld3JhZGlvID0gbmV3ZGF0YSRyYWRpbwpuZXd0diA9IG5ld2RhdGEkdHYKbmV3cGFwZXIgPSBuZXdkYXRhJHBhcGVyCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJCKSBSZXBlYXQgdGhlIHByZXZpb3VzIDQgZ3JhcGhzIGxheW91dCBleGVyY2lzZSB1c2luZyBpbnN0ZWFkIHRoZSBhYm92ZSBkZWZpbmVkIGZvdXIgbmV3IHZhcmlhYmxlcyBmb3Igc2FsZXMsIHJhZGlvLCB0diwgYW5kIHBhcGVyLiAKCmBgYHtyfQpsYXlvdXQobWF0cml4KDE6NCwyLDIpKSAjNHg0IGxheW91dCAtIGFsbCBvbiBvbmUgc2NyZWVuCgpwbG90KG5ld3NhbGVzLCB0eXBlPSJiIiwgeGxhYiA9ICJDYXNlIE51bWJlciIsIHlsYWIgPSAiU2FsZXMgaW4gJDEsMDAwIiwgbWFpbj0iU0FMRVMiLCBjb2w9ImJsYWNrIikgI25ld3NhbGVzIHZhcmlhYmxlIHBsb3QKCnBsb3QobmV3cmFkaW8sIHR5cGU9ImIiLCB4bGFiID0gImNhc2UgbnVtYmVyIiwgeWxhYiA9ICJyYWRpbyBhZHMgaW4gJDEsMDAwIiwgIG1haW49IlJBRElPIiwgY29sPSJkYXJrIGdyZWVuIikgI25ld3JhZGlvIHZhcmlhYmxlIHBsb3QKCnBsb3QobmV3cGFwZXIsIHR5cGU9ImIiLCB4bGFiID0gImNhc2UgbnVtYmVyIiwgeWxhYiA9ICJwYXBlciBhZHMgaW4gJDEsMDAwIiwgbWFpbj0iUEFQRVIiLCBjb2w9ImRhcmsgcmVkIikgI25ld3BhcGVyIHZhcmlhYmxlIHBsb3QKCgpwbG90KG5ld3R2LCB0eXBlID0gImIiLCB4bGFiID0gImNhc2UgbnVtYmVyIiwgeWxhYiA9ICJ0diBhZHMgaW4gJDEsMDAwIiwgbWFpbj0iVFYiLCBjb2w9ImRhcmsgYmx1ZSIpICNuZXd0diB2YXJpYWJsZSBwbG90CmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJDKSBFeHBsYWluIHdoYXQgdGhlIG5ldyBwbG90cyBhcmUgcmV2ZWFsaW5nIGluIHRlcm1zIG9mIHRyZW5kaW5nIHJlbGF0aW9uc2hpcHMuIAo8L3NwYW4+CgpgYGB7cn0KI1Rha2luZyB0aGUgc2FsZXMgcGxvdCBhcyBvdXIgcmVmZXJlbmNlLCB0aGUgcmFkaW8gYW5kIHR2IHBsb3RzIGZvbGxvdyB0aGUgc2FtZSB0cmVuZCBhcyB0aGUgc2FsZXMgcGxvdDogdGhlIHRocmVlIG9mIHRoZW0gaGF2ZSBhIHBvc2l0aXZlIHNsb3BlIGFuZCB0aGV5IGluY3JlYXNlIHNpbWlsYXJseSAocG9zaXRpdmUgY29ycmVsYXRpb24gcmVsYXRpb25zaGlwKS4KCiNPbiB0aGUgb3RoZXIgaGFuZCwgdGhlcmUgaXMgbm90IGEgc3BlY2lmaWMgdHJlbmQgaW4gdGhlIHBhcGVyIHBsb3QgYmVjYXVzZSBpdCBkb2VzIG5vdCBmb2xsb3cgYW55IHBhdHRlcm4uIFRoaXMgcGxvdCBmbHVjdHVhdGVzIG11Y2ggYW5kIGluIGRpZmZlcmVudCB3YXlzIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBlc3RhYmxpc2ggYW55IHRyZW5kIGJldHdlZW4gdGhpcyBwbG90IGFuZCB0aGUgb3RoZXIgMyAobm8gY29ycmVsYXRpb24gcmVsYXRpb25zaGlwKS4KCiNUaGlzIGFuYWx5c2lzIGlzIGludGVyZXN0aW5nIGZvciB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGJ1c2luZXNzIHRvIGJlIGVmZmljaWVudCBpbiB0aGVpciBtYXJrZXRpbmcgY2FtcGFpZ25zLiBJbiB0aGlzIHNwZWNpZmljIGNhc2UsIGZvciBleGFtcGxlLCB0aGUgTWFya2V0aW5nIERpcmVjdG9yIGNvdWxkIGNvbmNsdWRlIHdpdGggdGhlIG9ic2VydmF0aW9uIHRoYXQgcmFkaW8gYW5kIHR2IGFkcyBhcmUgbW9yZSBlZmZpY2llbnQgYmVjYXVzZSB3aGVuIHRoZXkgaW5jcmVhc2VkIHRoZSBhbW91bnQgb2YgYWRzIGluIHRoZXNlIHJlc291cmNlcywgdGhlIHRvdGFsIGFtb3VudCBvZiBzYWxlcyBhbHNvIGluY3JlYXNlcy4gSG93ZXZlciwgdGhlcmUgaXMgbm8gcGF0dGVybiBpbiBwYXBlciBhZHMsIHRoaXMgdHlwZSBvZiBhZHMgZG8gbm90IGRpcmVjdGx5IGluY3JlYXNlIG9yIGRlY3JlYXNlIHRoZSB0b3RhbCBhbW91bnQgb2Ygc2FsZXMgd2l0aCBpdHMgdXNlICh0aGVyZSBpcyBubyBjb3JyZWxhdGlvbiByZWxhdGlvbnNoaXApLiBJbiBmdXJ0aGVyIGRlY2lzaW9uIHN1Y2ggYXMgY29zdCBjdXQsIHRoZXkgd291bGQgcmF0aGVyIHJlbm91bmNlIHRoZSBwYXBlciBhZHMgKGJlY2F1c2UgdGhleSBhcmUgbm90IGRpcmVjdGx5IGluY3JlYXNpbmcgc2FsZXMgYXMgYSB0cmVuZCkgdGhhbiBUViBvciByYWRpbyBhZHMuIApgYGAKCi0tLS0tLS0tLS0KCiMjIyBUYXNrIDM6IFN0YW5kYXJpemVkIFotVmFsdWUKCllvdSBhcmUgZ2l2ZW4gYSBzYWxlcyB2YWx1ZSBvZiAkMjUwMDAuIFdlIHdhbnQgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZXNwb25kaW5nIHotdmFsdWUgb3Igei1zY29yZSBmb3Igc2FsZXMgdXNpbmcgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBjYWxjdWxhdGlvbnMgYXMgc2hvd24gaW4gdGFzayAxLiBSZW1lbWJlciB0aGF0IGB6LXNjb3JlID0gKHggLSBtZWFuKS9zZGAuIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDNBKSBDYWxjdWxhdGUgdGhlIHotdmFsdWUuIEJhc2VkIG9uIHlvdXIgcmVzdWx0LCAgd291bGQgeW91IHJhdGUgYSBgJDI1MDAwYCBpbiBzYWxlcyBhcyBwb29yLCBhdmVyYWdlLCBnb29kLCBvciB2ZXJ5IGdvb2QgcGVyZm9ybWFuY2U/IEV4cGxhaW4geW91ciBsb2dpYy4KPC9zcGFuPgoKYGBge3J9CnpfdmFsdWUgPSAoMjUwMDAtbWVhbihzYWxlcykpL3NkKHNhbGVzKSAjY2FsY3VsYXRpbmcgdGhlIHotc2NvcmUKel92YWx1ZQpgYGAKYGBge3J9CiNUaGUgei1zY29yZSBpcyAzLjE2LiBUaGUgei1zY29yZSBpcyBwb3NpdGl2ZSAoYWJvdmUgdGhlIG1lYW4pIGFuZCBncmVhdGVyIHRoYW4gMyB3aGljaCBtZWFucyB0aGF0IGl0IGlzIGFib3ZlIDMgc3RhbmRhcmQgZGV2aWF0aW9ucy4gVGhpcyBtZWFucyB0aGF0ICQyNSwwMDAgaW4gc2FsZXMgaXMgYSB2ZXJ5IGdvb2QgcGVyZm9ybWFuY2UgYmVjYXVzZSBpdCBpcyBncmVhdGVyIHRoYW4gOTkuNzQlIG9mIHRoZSBkYXRhLgpgYGAKCgouCgo=