Notebook Instructions
For your assignment you may be using different dataset than what is included here.
Always read carefully the instructions on Sakai.
Tasks/questions to be completed/answered are highlighted in larger bolded fonts and numbered according to their section.
Load Packages in R/RStudio
We are going to use tidyverse a collection of R packages designed for data science.
Loading required package: tidyverse
[30m── [1mAttaching packages[22m ─────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──[39m
[30m[32m✔[30m [34mggplot2[30m 2.2.1 [32m✔[30m [34mpurrr [30m 0.2.4
[32m✔[30m [34mtibble [30m 1.4.1 [32m✔[30m [34mdplyr [30m 0.7.4
[32m✔[30m [34mtidyr [30m 0.7.2 [32m✔[30m [34mstringr[30m 1.2.0
[32m✔[30m [34mreadr [30m 1.1.1 [32m✔[30m [34mforcats[30m 0.2.0[39m
[30m── [1mConflicts[22m ────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31m✖[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
Loading required package: gridExtra
Attaching package: ‘gridExtra’
The following object is masked from ‘package:dplyr’:
combine
Task 1: Quantitative Analysis
1A) Read the csv file into R Studio and display the dataset.
Change the variable name “X1” to case_number using the function rename()
- mydata <- rename(mydata, “NEW_VAR_NAME” = “OLD_VAR_NAME”)
1B) Find the range ( difference between min and max ), min, max, standard deviation and variance for each assigned feature ( Use separate chunks for each feature ). Compare each feature and note any significant differences
SALES
#variable_max
ilmax <- max(mydata$Total_State_Tax_Illinois)
#variable_min
#variable_Range max-min
#variable_mean
#variable_sd Standard Deviation
#variable_variance
RADIO
TV
NEWSPAPER
1C) Use the summary() function on all the dataset to give you a general description of the data. Note any differences between features.
Are there any outliers, if not explain the lack of outliers? if any explain what the outliers represent and how many records are outliers? ( Use code from notebook-03 to find outliers)
# lowerq = quantile(VARIABLE)[2]
# upperq = quantile(VARIABLE)[4]
# iqr = upperq - lowerq
# upper_threshold = (iqr * 1.5) + upperq
# lower_threshold = lowerq - (iqr * 1.5)
# VARIABLE[ VARIABLE > upper_threshold][1:10]
# VARIABLE[ VARIABLE < lower_threshold][1:10]
1D) Write a general description of the dataset using the statistics found in the steps above. Use the min,max range to compare the features, note any significant differences.
Task 2: Qualitative Analysis
2A) Plot all the assigned features as y-axis for x-axis use case_number. Use the given commands to create each plot and create a grid to plot all features Note any trends/patters in the data
- Commands: VARIABLE_plot <- ggplot(data = mydata, aes(x = VARIABLE, y = VARIABLE)) + geom_point()
- Commands: grid.arrange(VARIABLE_plot1, VARIABLE_plot2, VARIABLE_plot3, VARIABLE_plot4, ncol=2)
corp_plot <- ggplot(data = mydata, aes(x = year, y = `Corporate_Income_Tax _Illinois`)) + geom_point()
personal_plot <- ggplot(data = mydata, aes(x = year, y = Personal_Income_Tax_Illinois)) + geom_point()
general_plot <- ggplot(data = mydata, aes(x = year, y = General_Sales_Tax_Illinois)) + geom_point()
motor_plot <- ggplot(data = mydata, aes(x = year, y = Motor_Fuel_Sales_Illinois)) + geom_point()
grid.arrange(corp_plot, personal_plot, general_plot, motor_plot, ncol=2)

- 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 200 months observations are in no particular chronological time sequence.
- The case numbers are independent sequentially generated numbers. Since each case is independent, we can reorder them.
2B) 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.
- Commands: newdata <- mydata[ order(mydata$VARIABLE), ]
newdata <- mydata[ order(mydata$Total_Tax_US), ]
# Extract case_number from the newdata
case_number <- newdata$Total_Tax_US
head(newdata)
2C) Repeat the 4 graphs with the newdata to spot any trends. Note your observations on what the new plots are revealing in terms of trending relationship.
- Commands: VARIABLE_plot <- ggplot(data = mydata, aes(x = VARIABLE, y = VARIABLE)) + geom_point()
- Commands: For x variable in the plot use: aes(x = case_number[order(case_number)])
- Commands: grid.arrange(VARIABLE_plot1, VARIABLE_plot2, VARIABLE_plot3, VARIABLE_plot4, ncol=2)
corp_plot <- ggplot(data = newdata, aes(x = case_number[order(case_number)], y = `Corporate_Income_Tax _Illinois`)) + geom_point()
personal_plot <- ggplot(data = newdata, aes(x = case_number[order(case_number)], y = Personal_Income_Tax_Illinois)) + geom_point()
general_plot <- ggplot(data = newdata, aes(x = case_number[order(case_number)], y = General_Sales_Tax_Illinois)) + geom_point()
motor_plot <- ggplot(data = newdata, aes(x = case_number[order(case_number)], y = Motor_Fuel_Sales_Illinois)) + geom_point()
grid.arrange(corp_plot, personal_plot, general_plot, motor_plot, ncol=2)

Task 3: Standardized Z-Value
3A) Create a histogram of the assigned feature z-scores. Describe the output note any relevant values.
- Command: z_scores = ( VARIABLE - mean(VARIABLE) ) / sd(VARIABLE)
- Commands: qplot( x = VARIABLE , geom=“histogram”, binwidth = 0.3)
il_personal <- scale(il_personal)
qplot( x = il_personal , binwidth = 0.3)

3B) Given a sales value of $26700, calculate the corresponding z-value or z-score.
- Command: z_score = ( x - mean(VARIABLE) ) / sd(VARIABLE)
personal <- mydata$Personal_Income_Tax_Illinois
z_scores = ( personal - mean(personal) ) / sd(personal)
qplot( x = z_scores, binwidth = 0.3)

x = 4009160
z_score = ( x - mean(personal) ) / sd(personal)
z_score
[1] 1.607937
3C) Based on the z-value, how would you rate a $26700 sales value: poor, average, good, or very good performance? Explain your logic.
LS0tCnRpdGxlOiAiRGVzY3JpcHRpdmUgQW5hbHl0aWNzIgphdXRob3I6ICJKb3NlIEx1aXMgUm9kcmlndWV6IgpkYXRlOiAiRmVicnVhcnkgMjAsIDIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogQ01FIEdyb3VwIEZvdW5kYXRpb24gQnVzaW5lc3MgQW5hbHl0aWNzIExhYgotLS0KCi0tLS0tLS0tLS0tLS0KCiMjIE5vdGVib29rIEluc3RydWN0aW9ucwoKLS0tLS0tLS0tLS0tLQoKKiBGb3IgeW91ciBhc3NpZ25tZW50IHlvdSBtYXkgYmUgdXNpbmcgZGlmZmVyZW50IGRhdGFzZXQgdGhhbiB3aGF0IGlzIGluY2x1ZGVkIGhlcmUuIAoKKiBBbHdheXMgcmVhZCBjYXJlZnVsbHkgdGhlIGluc3RydWN0aW9ucyBvbiBTYWthaS4gIAoKKiBUYXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiBsYXJnZXIgYm9sZGVkIGZvbnRzIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgc2VjdGlvbi4KCiMjIyBMb2FkIFBhY2thZ2VzIGluIFIvUlN0dWRpbyAKCldlIGFyZSBnb2luZyB0byB1c2UgdGlkeXZlcnNlIGEgY29sbGVjdGlvbiBvZiBSIHBhY2thZ2VzIGRlc2lnbmVkIGZvciBkYXRhIHNjaWVuY2UuIAoKKiBJbmZvOiBodHRwczovL3d3dy50aWR5dmVyc2Uub3JnLwoKYGBge3IsIGVjaG89RkFMU0V9CgojIEhlcmUgd2UgYXJlIGNoZWNraW5nIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZAppZighcmVxdWlyZSh0aWR5dmVyc2UpKXsKICAKICAjIElmIHRoZSBwYWNrYWdlIGlzIG5vdCBpbiB0aGUgc3lzdGVtIHRoZW4gaXQgd2lsbCBiZSBpbnN0YWxsCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKICAKICAjIEhlcmUgd2UgYXJlIGxvYWRpbmcgdGhlIHBhY2thZ2UKICBsaWJyYXJ5KHRpZHl2ZXJzZSkKfQoKaWYoIXJlcXVpcmUoZ3JpZEV4dHJhKSl7CiAgCiAgIyBJZiB0aGUgcGFja2FnZSBpcyBub3QgaW4gdGhlIHN5c3RlbSB0aGVuIGl0IHdpbGwgYmUgaW5zdGFsbAogIGluc3RhbGwucGFja2FnZXMoImdyaWRFeHRyYSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiAgCiAgIyBIZXJlIHdlIGFyZSBsb2FkaW5nIHRoZSBwYWNrYWdlCiAgbGlicmFyeShncmlkRXh0cmEpCn0KCmBgYAoKLS0tLS0tLS0tLS0tLQoKIyMgVGFzayAxOiBRdWFudGl0YXRpdmUgQW5hbHlzaXMKCi0tLS0tLS0tLS0tLS0KCiMjIyAxQSkgUmVhZCB0aGUgY3N2IGZpbGUgaW50byBSIFN0dWRpbyBhbmQgZGlzcGxheSB0aGUgZGF0YXNldC4gCgoqIE5hbWUgeW91ciBkYXRhc2V0ICdteWRhdGEnIHNvIGl0IGVhc3kgdG8gd29yayB3aXRoLgoKKiBDb21tYW5kczogcmVhZF9jc3YoKSBoZWFkKCkgbWF4KCkgbWluKCkgdmFyKCkgc2QoKQoKIyMjIyBFeHRyYWN0IHRoZSBhc3NpZ25lZCBmZWF0dXJlcyAoY29sdW1ucykgdG8gcGVyZm9ybSBzb21lIGFuYWx5dGljcy4gCgpgYGB7cn0gCm15ZGF0YSA8LSByZWFkX2NzdigiZGF0YS9zdGF0ZV90YXhfaWxsaW5vaXMuY3N2IikKaWxfdGF4IDwtIG15ZGF0YSRUb3RhbF9TdGF0ZV9UYXhfSWxsaW5vaXMKaWxfcGVyc29uYWwgPC0gbXlkYXRhJFBlcnNvbmFsX0luY29tZV9UYXhfSWxsaW5vaXMKCmhlYWQobXlkYXRhKQoKYGBgCgojIyMjIENoYW5nZSB0aGUgdmFyaWFibGUgbmFtZSAiWDEiIHRvIGNhc2VfbnVtYmVyIHVzaW5nIHRoZSBmdW5jdGlvbiByZW5hbWUoKQoKKiBteWRhdGEgPC0gcmVuYW1lKG15ZGF0YSwgIk5FV19WQVJfTkFNRSIgPSAiT0xEX1ZBUl9OQU1FIikKCmBgYHtyfSAKCmBgYAoKIyMjIDFCKSBGaW5kIHRoZSByYW5nZSAoIGRpZmZlcmVuY2UgYmV0d2VlbiBtaW4gYW5kIG1heCApLCBtaW4sIG1heCwgc3RhbmRhcmQgZGV2aWF0aW9uIGFuZCB2YXJpYW5jZSBmb3IgZWFjaCBhc3NpZ25lZCBmZWF0dXJlICggVXNlIHNlcGFyYXRlIGNodW5rcyBmb3IgZWFjaCBmZWF0dXJlICkuIENvbXBhcmUgZWFjaCBmZWF0dXJlIGFuZCBub3RlIGFueSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcwoKKipTQUxFUyoqCgpgYGB7cn0KCiN2YXJpYWJsZV9tYXgKaWxtYXggPC0gbWF4KG15ZGF0YSRUb3RhbF9TdGF0ZV9UYXhfSWxsaW5vaXMpCgojdmFyaWFibGVfbWluCgojdmFyaWFibGVfUmFuZ2UgbWF4LW1pbgoKI3ZhcmlhYmxlX21lYW4gCgojdmFyaWFibGVfc2QgU3RhbmRhcmQgRGV2aWF0aW9uCgojdmFyaWFibGVfdmFyaWFuY2UKCmBgYAoKCioqUkFESU8qKgoKYGBge3J9CgpgYGAKCioqVFYqKgoKYGBge3J9CgpgYGAKCioqTkVXU1BBUEVSKioKCmBgYHtyfQoKYGBgCgoKIyMjIDFDKSBVc2UgdGhlIHN1bW1hcnkoKSBmdW5jdGlvbiBvbiBhbGwgdGhlIGRhdGFzZXQgdG8gZ2l2ZSB5b3UgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhLiBOb3RlIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGZlYXR1cmVzLgoKYGBge3J9CgpgYGAKCiMjIyMgQXJlIHRoZXJlIGFueSBvdXRsaWVycywgaWYgbm90IGV4cGxhaW4gdGhlIGxhY2sgb2Ygb3V0bGllcnM/IGlmIGFueSBleHBsYWluIHdoYXQgdGhlIG91dGxpZXJzIHJlcHJlc2VudCBhbmQgaG93IG1hbnkgcmVjb3JkcyBhcmUgb3V0bGllcnM/ICggVXNlIGNvZGUgZnJvbSBub3RlYm9vay0wMyB0byBmaW5kIG91dGxpZXJzKSAKCmBgYHtyfQoKIyBsb3dlcnEgPSBxdWFudGlsZShWQVJJQUJMRSlbMl0KIyB1cHBlcnEgPSBxdWFudGlsZShWQVJJQUJMRSlbNF0KIyBpcXIgPSB1cHBlcnEgLSBsb3dlcnEKIyB1cHBlcl90aHJlc2hvbGQgPSAoaXFyICogMS41KSArIHVwcGVycSAKIyBsb3dlcl90aHJlc2hvbGQgPSBsb3dlcnEgLSAoaXFyICogMS41KQojIFZBUklBQkxFWyBWQVJJQUJMRSA+IHVwcGVyX3RocmVzaG9sZF1bMToxMF0KIyBWQVJJQUJMRVsgVkFSSUFCTEUgPCBsb3dlcl90aHJlc2hvbGRdWzE6MTBdCgpgYGAKCgojIyMgMUQpIFdyaXRlIGEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YXNldCB1c2luZyB0aGUgc3RhdGlzdGljcyBmb3VuZCBpbiB0aGUgc3RlcHMgYWJvdmUuIFVzZSB0aGUgbWluLG1heCByYW5nZSB0byBjb21wYXJlIHRoZSBmZWF0dXJlcywgbm90ZSBhbnkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMuCgoKLS0tLS0tLS0tLS0tLQoKIyMgVGFzayAyOiBRdWFsaXRhdGl2ZSBBbmFseXNpcwoKLS0tLS0tLS0tLS0tLQoKCiMjIyAyQSkgUGxvdCBhbGwgdGhlIGFzc2lnbmVkIGZlYXR1cmVzIGFzIHktYXhpcyBmb3IgeC1heGlzIHVzZSBjYXNlX251bWJlci4gVXNlIHRoZSBnaXZlbiBjb21tYW5kcyB0byBjcmVhdGUgZWFjaCBwbG90IGFuZCBjcmVhdGUgYSBncmlkIHRvIHBsb3QgYWxsIGZlYXR1cmVzIE5vdGUgYW55IHRyZW5kcy9wYXR0ZXJzIGluIHRoZSBkYXRhCgoqIENvbW1hbmRzOiBWQVJJQUJMRV9wbG90IDwtIGdncGxvdChkYXRhID0gbXlkYXRhLCBhZXMoeCA9IFZBUklBQkxFLCB5ID0gVkFSSUFCTEUpKSArIGdlb21fcG9pbnQoKQoqIENvbW1hbmRzOiBncmlkLmFycmFuZ2UoVkFSSUFCTEVfcGxvdDEsIFZBUklBQkxFX3Bsb3QyLCBWQVJJQUJMRV9wbG90MywgVkFSSUFCTEVfcGxvdDQsIG5jb2w9MikKCmBgYHtyfQoKY29ycF9wbG90IDwtIGdncGxvdChkYXRhID0gbXlkYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBgQ29ycG9yYXRlX0luY29tZV9UYXggX0lsbGlub2lzYCkpICsgZ2VvbV9wb2ludCgpCnBlcnNvbmFsX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBteWRhdGEsIGFlcyh4ID0geWVhciwgeSA9IFBlcnNvbmFsX0luY29tZV9UYXhfSWxsaW5vaXMpKSArIGdlb21fcG9pbnQoKQpnZW5lcmFsX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBteWRhdGEsIGFlcyh4ID0geWVhciwgeSA9IEdlbmVyYWxfU2FsZXNfVGF4X0lsbGlub2lzKSkgKyBnZW9tX3BvaW50KCkKbW90b3JfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG15ZGF0YSwgYWVzKHggPSB5ZWFyLCB5ID0gTW90b3JfRnVlbF9TYWxlc19JbGxpbm9pcykpICsgZ2VvbV9wb2ludCgpCgpncmlkLmFycmFuZ2UoY29ycF9wbG90LCBwZXJzb25hbF9wbG90LCBnZW5lcmFsX3Bsb3QsIG1vdG9yX3Bsb3QsIG5jb2w9MikKCmBgYAoKCiogV2hlbiBsb29raW5nIGF0IHRoZXNlIHBsb3RzIGl0IGlzIGhhcmQgdG8gc2VlIGEgcGFydGljdWxhciB0cmVuZC4gCiogT25lIHdheSB0byBvYnNlcnZlIGFueSBwb3NzaWJsZSB0cmVuZCBpbiB0aGUgc2FsZXMgZGF0YSB3b3VsZCBiZSB0byByZS1vcmRlciB0aGUgZGF0YSBmcm9tIGxvdyB0byBoaWdoLiAKKiBUaGUgMjAwIG1vbnRocyBvYnNlcnZhdGlvbnMgYXJlIGluIG5vIHBhcnRpY3VsYXIgY2hyb25vbG9naWNhbCB0aW1lIHNlcXVlbmNlLiAKKiBUaGUgY2FzZSBudW1iZXJzIGFyZSBpbmRlcGVuZGVudCBzZXF1ZW50aWFsbHkgZ2VuZXJhdGVkIG51bWJlcnMuIFNpbmNlIGVhY2ggY2FzZSBpcyBpbmRlcGVuZGVudCwgd2UgY2FuIHJlb3JkZXIgdGhlbS4gCgoKIyMjIDJCKSBSZS1vcmRlciBzYWxlcyBmcm9tIGxvdyB0byBoaWdoLCBhbmQgc2F2ZSByZS1vcmRlcmVkIGRhdGEgaW4gYSBuZXcgc2V0LiBBcyBzYWxlcyBkYXRhIGlzIHJlLXJlb3JkZWQgYXNzb2NpYXRlZCBvdGhlciBjb2x1bW4gZmllbGRzIGZvbGxvdy4KCiogQ29tbWFuZHM6IG5ld2RhdGEgPC0gbXlkYXRhWyBvcmRlcihteWRhdGEkVkFSSUFCTEUpLCBdCgpgYGB7cn0KbmV3ZGF0YSA8LSBteWRhdGFbIG9yZGVyKG15ZGF0YSRUb3RhbF9UYXhfVVMpLCBdCgojIEV4dHJhY3QgY2FzZV9udW1iZXIgZnJvbSB0aGUgbmV3ZGF0YQpjYXNlX251bWJlciA8LSBuZXdkYXRhJFRvdGFsX1RheF9VUwoKaGVhZChuZXdkYXRhKQpgYGAKCgojIyMjIEV4dHJhY3QgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBuZXcgZGF0YQoKYGBge3J9CiMgbmV3X1ZBUklBQkxFID0gbmV3ZGF0YSRWQVJJQUJMRQoKYGBgCgojIyMgMkMpIFJlcGVhdCB0aGUgNCBncmFwaHMgd2l0aCB0aGUgbmV3ZGF0YSB0byBzcG90IGFueSB0cmVuZHMuIE5vdGUgeW91ciBvYnNlcnZhdGlvbnMgb24gd2hhdCB0aGUgbmV3IHBsb3RzIGFyZSByZXZlYWxpbmcgaW4gdGVybXMgb2YgdHJlbmRpbmcgcmVsYXRpb25zaGlwLiAKCiogQ29tbWFuZHM6IFZBUklBQkxFX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBteWRhdGEsIGFlcyh4ID0gVkFSSUFCTEUsIHkgPSBWQVJJQUJMRSkpICsgZ2VvbV9wb2ludCgpCiogQ29tbWFuZHM6IEZvciB4IHZhcmlhYmxlIGluIHRoZSBwbG90IHVzZTogYWVzKHggPSBjYXNlX251bWJlcltvcmRlcihjYXNlX251bWJlcildKQoqIENvbW1hbmRzOiBncmlkLmFycmFuZ2UoVkFSSUFCTEVfcGxvdDEsIFZBUklBQkxFX3Bsb3QyLCBWQVJJQUJMRV9wbG90MywgVkFSSUFCTEVfcGxvdDQsIG5jb2w9MikKCmBgYHtyfQoKY29ycF9wbG90IDwtIGdncGxvdChkYXRhID0gbmV3ZGF0YSwgYWVzKHggPSBjYXNlX251bWJlcltvcmRlcihjYXNlX251bWJlcildLCB5ID0gYENvcnBvcmF0ZV9JbmNvbWVfVGF4IF9JbGxpbm9pc2ApKSArIGdlb21fcG9pbnQoKQpwZXJzb25hbF9wbG90IDwtIGdncGxvdChkYXRhID0gbmV3ZGF0YSwgYWVzKHggPSBjYXNlX251bWJlcltvcmRlcihjYXNlX251bWJlcildLCB5ID0gUGVyc29uYWxfSW5jb21lX1RheF9JbGxpbm9pcykpICsgZ2VvbV9wb2ludCgpCmdlbmVyYWxfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG5ld2RhdGEsIGFlcyh4ID0gY2FzZV9udW1iZXJbb3JkZXIoY2FzZV9udW1iZXIpXSwgeSA9IEdlbmVyYWxfU2FsZXNfVGF4X0lsbGlub2lzKSkgKyBnZW9tX3BvaW50KCkKbW90b3JfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG5ld2RhdGEsIGFlcyh4ID0gY2FzZV9udW1iZXJbb3JkZXIoY2FzZV9udW1iZXIpXSwgeSA9IE1vdG9yX0Z1ZWxfU2FsZXNfSWxsaW5vaXMpKSArIGdlb21fcG9pbnQoKQoKZ3JpZC5hcnJhbmdlKGNvcnBfcGxvdCwgcGVyc29uYWxfcGxvdCwgZ2VuZXJhbF9wbG90LCBtb3Rvcl9wbG90LCBuY29sPTIpCgpgYGAKCi0tLS0tLS0tLS0KCiMjIFRhc2sgMzogU3RhbmRhcmRpemVkIFotVmFsdWUKCi0tLS0tLS0tLS0KCgojIyMgM0EpIENyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgYXNzaWduZWQgZmVhdHVyZSB6LXNjb3Jlcy4gRGVzY3JpYmUgdGhlIG91dHB1dCBub3RlIGFueSByZWxldmFudCB2YWx1ZXMuCgoqIENvbW1hbmQ6IHpfc2NvcmVzID0gKCBWQVJJQUJMRSAtIG1lYW4oVkFSSUFCTEUpICkgLyBzZChWQVJJQUJMRSkKKiBDb21tYW5kczogcXBsb3QoIHggPSBWQVJJQUJMRSAsIGdlb209Imhpc3RvZ3JhbSIsIGJpbndpZHRoID0gMC4zKQoKYGBge3J9CgppbF9wZXJzb25hbCA8LSBzY2FsZShpbF9wZXJzb25hbCkKCnFwbG90KCB4ID0gaWxfcGVyc29uYWwgLCBiaW53aWR0aCA9IDAuMykKCmBgYAoKCgojIyMgM0IpIEdpdmVuIGEgc2FsZXMgdmFsdWUgb2YgJDI2NzAwLCBjYWxjdWxhdGUgdGhlIGNvcnJlc3BvbmRpbmcgei12YWx1ZSBvciB6LXNjb3JlLiAKCiogQ29tbWFuZDogel9zY29yZSA9ICggeCAtIG1lYW4oVkFSSUFCTEUpICkgLyBzZChWQVJJQUJMRSkKCmBgYHtyfQoKcGVyc29uYWwgPC0gbXlkYXRhJFBlcnNvbmFsX0luY29tZV9UYXhfSWxsaW5vaXMKCnpfc2NvcmVzID0gKCBwZXJzb25hbCAtIG1lYW4ocGVyc29uYWwpICkgLyBzZChwZXJzb25hbCkKCnFwbG90KCB4ID0gel9zY29yZXMsIGJpbndpZHRoID0gMC4zKQoKCmBgYAoKYGBge3J9CnggPSA0MDA5MTYwCnpfc2NvcmUgPSAoIHggLSBtZWFuKHBlcnNvbmFsKSApIC8gc2QocGVyc29uYWwpCnpfc2NvcmUKCgpgYGAKCgojIyMgM0MpIEJhc2VkIG9uIHRoZSB6LXZhbHVlLCBob3cgd291bGQgeW91IHJhdGUgYSAkMjY3MDAgc2FsZXMgdmFsdWU6IHBvb3IsIGF2ZXJhZ2UsIGdvb2QsIG9yIHZlcnkgZ29vZCBwZXJmb3JtYW5jZT8gRXhwbGFpbiB5b3VyIGxvZ2ljLiAKCgo=