About
R can be used for basic visual analytics, which is very helpful in understanding the data holistically. Additionally, R can help find correlations between variables and create scatter plots.
Tableau is a tool more tailored for visual analytics, while R is a powerful tool for statistics and other advanced topics in data analytics. In this lab we will explore both capabilities using the two earlier sets of data for credist risk and marketing.
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 in Sakai 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 provided, before executing any included code chunks and/or adding your own code. For clarity, tasks/questions to be completed/answered are highlighted in red color and numbered according to their particular placement in the task section. The red color is only apparent when in Preview mode. Quite often you will need to add your own code chunk.
Execute all code chunks (already included and own added), preview, check integrity, and submit final work (\(html\) file) in Sakai.
Task 1: Basic Visual Analytics in R
Read the file marketing.csv and make sure all the columns are captured by checking the first couple rows of the dataset “head(mydata)”
mydata = read.csv("marketing.csv")
head(mydata)
How to create a bar chart using a categorical variable
# Extract the State column from mydata
state = mydata$State
# Create a frequency table to extract the count for each state
state_table = table(state)
# Execute the command
barplot(state_table)

##### 1A) Use the code chunk below to repeat the above bar chart by adding proper labels to X and Y axis (1pt)
barplot(state_table, main = 'State Frequency Bar Chart', xlab= 'State', ylab = 'Frequency' )

# Add title and labels to plot by replacing the ?? with the proper wordings
barplot(state_table, main = '??', xlab= '??', ylab = '??' )

A more elegant representation of the bar plot would be to order the bars by increasing value. This is shown in the code chunk below.
# Order and execute
barplot(state_table[order(state_table)])

Next we will create a histogram
# Extract the TV column from the data and create a histogram by running the command hist(variable)
# where variable corresponds to the extracted sales column variable
tv=mydata$tv
hist(tv)

As seen, the histogram differs from a barplot in two distinctive ways: the x-axis is numeric (although not always necessary) broken in continuos intervals called bins, and the y-axis is representative of number of observations or frequency. The number of bins can be adjusted to show a finer resolution or breakdown of intervals. This is demonstrated in the below example.
hist(tv, breaks=20)
##### 1B) Create a new histogram plot for Sales. Explain what the x-axis and y-axis represent. Can one derive the total cummulative sales from the histogram? Explain your answer (2pts)
sales=mydata$sales
hist(sales)

x-axis represents diferent ranges for the amount of dollars in sales that were generated and the y-axis represents the frequency for which sales generated a dollar amount in a certain range.No, one cannot derive the total cumulative sales from the histogram because the histogram only graphs a range of dollar amounts that the sale amount falls in, not the exact amount. Thus, the histogram can give a good estimate of the total cumulative sales, but it will not be exact.
How to create a pie chart
# The command to create a pie chart is pie(variable) where variable is in reference to the particular column extracted from the file. In this example we define a variable called x.
x = c(2,3,4,5)
pie(x)

##### 1C) Create a new pie chart for state count. Refer to earlier defined variable state_table to capture the frequency count (1pt)
state=mydata$state
state = c(2,3,4)
pie(state_table)

##### 1D) What does each slice of the pie represent? Compare the pie chart to earlier bar charts. Which type of charts is a better representation of the data and why so? (1pt) Each slice of the pie represents how frequent the state appears in the data set compared to the total number of frequencies. The larger the slice of the pie, the more frequent the state appears in the data set and the larger its proportion to the data set as a whole. I think the bar chart is a better representation of the data because it is able to more accurately depict the values visually. I feel like you compare the differnt pieces of data within the set better and have an easier time knowing the exact amounts with the bar chart. ———-
Task 2 Scatter Plots & Correlation
The previous task focused on visualizing one variable. A good way to visualize two variables and also very common is a scatter plot. A scatter plot is a good way to study relationships and trends.
How to create a scatter plot
# Plot Sales vs. Radio
# Radio will be on the x-axis
# Sales will be on the y-axis
sales = mydata$sales
radio = mydata$radio
plot(radio,sales)

# It is easier to see the trend and possible relationship by including a line that fit through the points.
# This is done with the command
scatter.smooth(radio,sales)

##### 2A) Create three separate scatter plots for Sales vs TV, Sales vs Paper, and Sales vs Pos. Include the best fitting line in each plot. Pay attention to what variable goes on the x-axis and the y-axis (2pts)
sales = mydata$sales
tv = mydata$tv
paper=mydata$paper
pos=mydata$pos
plot(tv,sales)

scatter.smooth(tv,sales)

plot(paper,sales)

scatter.smooth(paper,sales)

plot(pos,sales)

scatter.smooth(pos,sales)

##### 2B) Share your observations on trends and relationships. How do your observations reconcile with your findings from lab05? (1pt) Sales and tv has a very high positive correlation. Sales and paper has a low negative correlation. And sales and pos has a very low positive correlation. The observations resemble those in lab05 because as TV ads increased the more sales were made creating a positive relationship, similar to the one here. And the paper sales had a fluxuating relationship that created a low negative relationship similar to the one here as well.
As part of any data anlytics it is important to consider both qualitative and quantitative analysis. Scatter plots provide us with qualitative insights on possible trends and relationships. To quantify the strength of any relationships in the data, we need to look at the correlation between two variables.
To compute the correlation coefficient or strength between variables follow the below example
cor(sales,radio)
[1] 0.9771381
##### 2C) Repeat the correlation calculation for the following pair of variables (sales,tv), (sales,paper), and (sales,pos) (1pt)
cor(sales,tv)
[1] 0.9579703
cor(sales,paper)
[1] -0.2830683
cor(sales,pos)
[1] 0.0126486
##### 2D) Which pair has the highest correlation? How do these results reconcile with your scatter plots observations? (1pt) Sales and TV have the highest correlation. And they reconcile with the scatter plot observations well because these results are representative of the plots and they give a visual representation of the calculations. ———-
Task 3 - Basic Visual Analytics in Tableau
Follow the directions on the worksheet, download tableau academic on your personal computer or use one of the labs computers. Make sure to download the academic version and not the free limited trial version.
– Download Tableau academic here: https://www.tableau.com/academic/students
– Refer to file ‘creditrisk.csv’ in the data folder
– Start Tableau and enter your LUC email if prompted.
– Import the file into Tableau. Choose the Text File option when importing

– Under the dimensions tab located on the left side of the screen DOUBLE click on the ‘Loan Purpose’, then DOUBLE click on ‘Number of Records’ variable located under Measures on the bottom left of the screen.

– From the upper right corner of the screen select the horizontal bars view and note the new chart. Familiarize yourself with the tool by trying other views. Only valid views will be highlighted in the menu.

– Create a new sheet by clicking on the icon in the bottom next to your current sheet.

##### 3A) Double-click on the ‘Age’ variable in Measures and select the ‘Histogram’ view. Capture a screen shot and include here. Which age bin has the highest age count and what is the count? (2pts) 
The ‘22’ age bin has the highest age count and the count is 97. ##### 3B) Drag-drop the variable ’Marital Status’found under Dimensions into the Marks Color box. Capture a screen shot and include here. Which age bin has the highest divorce count and what is the count? (2pts) 
The age bin with the highest divorce rate is 22 and the count is 46.

##### 3C) Create another new sheet. Double-click ‘Months Employed’ and then double-click ‘Age’. Make sure Age appears in the columns field as shown in the image below. From the Sum(Age) drop down menu select Dimension. Repeat for Sum(Months Employed). Add another variable to the scatter plot by drag-drop the dimension variable ‘Gender’ into the Marks Color box. Capture a screen shot and include here. Share insights on what the data is telling us (3pts) 
The data here is giving us a visual breakdown of people at different ages and how long they were employed, with the colors blue and orange signifying males and females respectively.In this specific scatter plot, age is on the x-axis, months employed is on the y-axis, and gender is broken down by the different colors.

##### 3D) In a new sheet generate a view of Gender, Number of Records, and Marital Status. Choose the best fitting view of your choice for the intended scope. Capture a screen shot and include here. Share insights on what the data is telling us (3pts) 
Here the data is breaking down three variables: gender, number of rrecords, and marital status. The gender is on the x-axis which makes 3 columns. Number of records are on the y-axis and the blue and orange colors signify females and males respectively.
LS0tDQp0aXRsZTogIkJhc2ljIFZpc3VhbCBBbmFseXRpY3MgKGxhYjA2KSINCmF1dGhvcjogInlhY2hlbmcgc29uZyINCmRhdGU6ICIyMDIwMi8yNyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQpzdWJ0aXRsZTogQlNBRCAzNDMsIEJ1c2luZXNzIEFuYWx5dGljcywgU3ByaW5nIDIwMjANCi0tLQ0KDQojIyMgQWJvdXQNCg0KUiBjYW4gYmUgdXNlZCBmb3IgYmFzaWMgdmlzdWFsIGFuYWx5dGljcywgd2hpY2ggaXMgdmVyeSBoZWxwZnVsIGluIHVuZGVyc3RhbmRpbmcgdGhlIGRhdGEgaG9saXN0aWNhbGx5LiBBZGRpdGlvbmFsbHksIFIgY2FuIGhlbHAgZmluZCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBzY2F0dGVyIHBsb3RzLiANCg0KVGFibGVhdSBpcyBhIHRvb2wgbW9yZSB0YWlsb3JlZCBmb3IgdmlzdWFsIGFuYWx5dGljcywgd2hpbGUgUiBpcyBhICBwb3dlcmZ1bCB0b29sIGZvciBzdGF0aXN0aWNzIGFuZCBvdGhlciBhZHZhbmNlZCB0b3BpY3MgaW4gZGF0YSBhbmFseXRpY3MuIEluIHRoaXMgbGFiICB3ZSB3aWxsIGV4cGxvcmUgYm90aCBjYXBhYmlsaXRpZXMgdXNpbmcgdGhlIHR3byBlYXJsaWVyIHNldHMgb2YgZGF0YSBmb3IgY3JlZGlzdCByaXNrIGFuZCBtYXJrZXRpbmcuIA0KDQojIyMgU2V0dXANCg0KUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgaW4gU2FrYWkgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIA0KDQojIyMgTm90ZQ0KDQpGb3IgeW91ciBhc3NpZ25tZW50IHlvdSBtYXkgYmUgdXNpbmcgZGlmZmVyZW50IGRhdGEgc2V0cyB0aGFuIHdoYXQgaXMgaW5jbHVkZWQgaGVyZS4gQWx3YXlzIHJlYWQgY2FyZWZ1bGx5IHRoZSBpbnN0cnVjdGlvbnMgcHJvdmlkZWQsIGJlZm9yZSBleGVjdXRpbmcgYW55IGluY2x1ZGVkIGNvZGUgY2h1bmtzIGFuZC9vciBhZGRpbmcgeW91ciBvd24gY29kZS4gIEZvciBjbGFyaXR5LCB0YXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgY29sb3IgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgVGhlIHJlZCBjb2xvciBpcyBvbmx5IGFwcGFyZW50IHdoZW4gaW4gUHJldmlldyBtb2RlLiBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLg0KDQpFeGVjdXRlIGFsbCBjb2RlIGNodW5rcyAoYWxyZWFkeSBpbmNsdWRlZCBhbmQgb3duIGFkZGVkKSwgcHJldmlldywgY2hlY2sgaW50ZWdyaXR5LCBhbmQgc3VibWl0IGZpbmFsIHdvcmsgKCRodG1sJCBmaWxlKSBpbiBTYWthaS4NCg0KLS0tLS0tLS0tLS0tLS0NCg0KDQojIyMgVGFzayAxOiBCYXNpYyBWaXN1YWwgQW5hbHl0aWNzIGluIFINCg0KUmVhZCB0aGUgZmlsZSBgbWFya2V0aW5nLmNzdmAgYW5kIG1ha2Ugc3VyZSBhbGwgdGhlIGNvbHVtbnMgYXJlIGNhcHR1cmVkIGJ5IGNoZWNraW5nIHRoZSBmaXJzdCBjb3VwbGUgIHJvd3Mgb2YgdGhlIGRhdGFzZXQgImhlYWQobXlkYXRhKSINCg0KYGBge3J9DQpteWRhdGEgPSByZWFkLmNzdigibWFya2V0aW5nLmNzdiIpDQpoZWFkKG15ZGF0YSkNCmBgYA0KDQpIb3cgdG8gY3JlYXRlIGEgYmFyIGNoYXJ0IHVzaW5nIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUNCg0KYGBge3J9DQojIEV4dHJhY3QgdGhlIFN0YXRlIGNvbHVtbiBmcm9tIG15ZGF0YQ0Kc3RhdGUgPSBteWRhdGEkU3RhdGUNCiMgQ3JlYXRlIGEgZnJlcXVlbmN5IHRhYmxlIHRvIGV4dHJhY3QgdGhlIGNvdW50IGZvciBlYWNoIHN0YXRlDQpzdGF0ZV90YWJsZSA9IHRhYmxlKHN0YXRlKQ0KIyBFeGVjdXRlIHRoZSAgY29tbWFuZCANCmJhcnBsb3Qoc3RhdGVfdGFibGUpDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQSkgVXNlIHRoZSBjb2RlIGNodW5rIGJlbG93IHRvIHJlcGVhdCB0aGUgYWJvdmUgYmFyIGNoYXJ0IGJ5IGFkZGluZyBwcm9wZXIgbGFiZWxzIHRvIFggYW5kIFkgYXhpcyAoMXB0KQ0KPC9zcGFuPg0KYGBge3J9DQpiYXJwbG90KHN0YXRlX3RhYmxlLCBtYWluID0gJ1N0YXRlIEZyZXF1ZW5jeSBCYXIgQ2hhcnQnLCB4bGFiPSAnU3RhdGUnLCB5bGFiID0gJ0ZyZXF1ZW5jeScgKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBZGQgdGl0bGUgYW5kIGxhYmVscyB0byBwbG90IGJ5IHJlcGxhY2luZyB0aGUgPz8gd2l0aCB0aGUgcHJvcGVyIHdvcmRpbmdzDQpiYXJwbG90KHN0YXRlX3RhYmxlLCBtYWluID0gJz8/JywgeGxhYj0gJz8/JywgeWxhYiA9ICc/PycgKQ0KYGBgDQoNCkEgbW9yZSBlbGVnYW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYXIgcGxvdCB3b3VsZCBiZSB0byBvcmRlciB0aGUgYmFycyBieSBpbmNyZWFzaW5nIHZhbHVlLiAgVGhpcyBpcyBzaG93biBpbiB0aGUgY29kZSBjaHVuayBiZWxvdy4NCg0KYGBge3J9DQojIE9yZGVyIGFuZCBleGVjdXRlDQpiYXJwbG90KHN0YXRlX3RhYmxlW29yZGVyKHN0YXRlX3RhYmxlKV0pDQpgYGANCg0KDQpOZXh0IHdlIHdpbGwgY3JlYXRlIGEgaGlzdG9ncmFtIA0KYGBge3J9DQojIEV4dHJhY3QgdGhlIFRWIGNvbHVtbiBmcm9tIHRoZSBkYXRhIGFuZCBjcmVhdGUgYSBoaXN0b2dyYW0gYnkgcnVubmluZyB0aGUgY29tbWFuZCBoaXN0KHZhcmlhYmxlKSANCiMgd2hlcmUgdmFyaWFibGUgY29ycmVzcG9uZHMgdG8gdGhlIGV4dHJhY3RlZCBzYWxlcyBjb2x1bW4gdmFyaWFibGUNCnR2PW15ZGF0YSR0dg0KaGlzdCh0dikNCmBgYA0KDQpBcyBzZWVuLCB0aGUgaGlzdG9ncmFtIGRpZmZlcnMgZnJvbSBhIGJhcnBsb3QgaW4gdHdvIGRpc3RpbmN0aXZlIHdheXM6IHRoZSB4LWF4aXMgaXMgbnVtZXJpYyAoYWx0aG91Z2ggbm90IGFsd2F5cyBuZWNlc3NhcnkpIGJyb2tlbiBpbiBjb250aW51b3MgaW50ZXJ2YWxzIGNhbGxlZCBiaW5zLCBhbmQgdGhlIHktYXhpcyBpcyByZXByZXNlbnRhdGl2ZSBvZiBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIG9yIGZyZXF1ZW5jeS4gIFRoZSBudW1iZXIgb2YgYmlucyBjYW4gYmUgYWRqdXN0ZWQgdG8gc2hvdyBhIGZpbmVyIHJlc29sdXRpb24gb3IgYnJlYWtkb3duIG9mIGludGVydmFscy4gIFRoaXMgaXMgZGVtb25zdHJhdGVkIGluIHRoZSBiZWxvdyBleGFtcGxlLg0KDQpgYGB7cn0NCmhpc3QodHYsIGJyZWFrcz0yMCkNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFCKSBDcmVhdGUgYSBuZXcgaGlzdG9ncmFtIHBsb3QgZm9yIFNhbGVzLiBFeHBsYWluIHdoYXQgdGhlIHgtYXhpcyBhbmQgeS1heGlzIHJlcHJlc2VudC4gQ2FuIG9uZSBkZXJpdmUgdGhlIHRvdGFsIGN1bW11bGF0aXZlIHNhbGVzIGZyb20gdGhlIGhpc3RvZ3JhbT8gRXhwbGFpbiB5b3VyIGFuc3dlciAoMnB0cykNCjwvc3Bhbj4NCmBgYHtyfQ0Kc2FsZXM9bXlkYXRhJHNhbGVzDQpoaXN0KHNhbGVzKQ0KYGBgDQp4LWF4aXMgcmVwcmVzZW50cyBkaWZlcmVudCByYW5nZXMgZm9yIHRoZSBhbW91bnQgb2YgZG9sbGFycyBpbiBzYWxlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFuZCB0aGUgeS1heGlzIHJlcHJlc2VudHMgdGhlIGZyZXF1ZW5jeSBmb3Igd2hpY2ggc2FsZXMgZ2VuZXJhdGVkIGEgZG9sbGFyIGFtb3VudCBpbiBhIGNlcnRhaW4gcmFuZ2UuTm8sIG9uZSBjYW5ub3QgZGVyaXZlIHRoZSB0b3RhbCBjdW11bGF0aXZlIHNhbGVzIGZyb20gdGhlIGhpc3RvZ3JhbSBiZWNhdXNlIHRoZSBoaXN0b2dyYW0gb25seSBncmFwaHMgYSByYW5nZSBvZiBkb2xsYXIgYW1vdW50cyB0aGF0IHRoZSBzYWxlIGFtb3VudCBmYWxscyBpbiwgbm90IHRoZSBleGFjdCBhbW91bnQuIFRodXMsIHRoZSBoaXN0b2dyYW0gY2FuIGdpdmUgYSBnb29kIGVzdGltYXRlIG9mIHRoZSB0b3RhbCBjdW11bGF0aXZlIHNhbGVzLCBidXQgaXQgd2lsbCBub3QgYmUgZXhhY3QuDQoNCg0KSG93IHRvIGNyZWF0ZSBhIHBpZSBjaGFydA0KYGBge3J9DQojIFRoZSBjb21tYW5kIHRvIGNyZWF0ZSBhIHBpZSBjaGFydCBpcyBwaWUodmFyaWFibGUpIHdoZXJlICB2YXJpYWJsZSBpcyBpbiByZWZlcmVuY2UgdG8gdGhlIHBhcnRpY3VsYXIgY29sdW1uIGV4dHJhY3RlZCBmcm9tIHRoZSBmaWxlLiBJbiB0aGlzIGV4YW1wbGUgd2UgZGVmaW5lIGEgdmFyaWFibGUgY2FsbGVkIHguIA0KeCA9IGMoMiwzLDQsNSkNCnBpZSh4KQ0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUMpIENyZWF0ZSBhIG5ldyBwaWUgY2hhcnQgZm9yIHN0YXRlIGNvdW50LiBSZWZlciB0byBlYXJsaWVyIGRlZmluZWQgdmFyaWFibGUgYHN0YXRlX3RhYmxlYCB0byBjYXB0dXJlIHRoZSBmcmVxdWVuY3kgY291bnQgKDFwdCkNCjwvc3Bhbj4NCmBgYHtyfQ0Kc3RhdGU9bXlkYXRhJHN0YXRlDQpzdGF0ZSA9IGMoMiwzLDQpDQpwaWUoc3RhdGVfdGFibGUpDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxRCkgV2hhdCBkb2VzIGVhY2ggc2xpY2Ugb2YgdGhlIHBpZSByZXByZXNlbnQ/IENvbXBhcmUgdGhlIHBpZSBjaGFydCB0byBlYXJsaWVyIGJhciBjaGFydHMuIFdoaWNoIHR5cGUgb2YgY2hhcnRzIGlzIGEgYmV0dGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIGFuZCB3aHkgc28/ICgxcHQpDQo8L3NwYW4+DQpFYWNoIHNsaWNlIG9mIHRoZSBwaWUgcmVwcmVzZW50cyBob3cgZnJlcXVlbnQgdGhlIHN0YXRlIGFwcGVhcnMgaW4gdGhlIGRhdGEgc2V0IGNvbXBhcmVkIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgZnJlcXVlbmNpZXMuIFRoZSBsYXJnZXIgdGhlIHNsaWNlIG9mIHRoZSBwaWUsIHRoZSBtb3JlIGZyZXF1ZW50IHRoZSBzdGF0ZSBhcHBlYXJzIGluIHRoZSBkYXRhIHNldCBhbmQgdGhlIGxhcmdlciBpdHMgcHJvcG9ydGlvbiB0byB0aGUgZGF0YSBzZXQgYXMgYSB3aG9sZS4NCkkgdGhpbmsgdGhlIGJhciBjaGFydCBpcyBhIGJldHRlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSBiZWNhdXNlIGl0IGlzIGFibGUgdG8gbW9yZSBhY2N1cmF0ZWx5IGRlcGljdCB0aGUgdmFsdWVzIHZpc3VhbGx5LiBJIGZlZWwgbGlrZSB5b3UgY29tcGFyZSB0aGUgZGlmZmVybnQgcGllY2VzIG9mIGRhdGEgd2l0aGluIHRoZSBzZXQgYmV0dGVyIGFuZCBoYXZlIGFuIGVhc2llciB0aW1lIGtub3dpbmcgdGhlIGV4YWN0IGFtb3VudHMgd2l0aCB0aGUgYmFyIGNoYXJ0Lg0KLS0tLS0tLS0tLQ0KDQojIyMgVGFzayAyIFNjYXR0ZXIgUGxvdHMgJiBDb3JyZWxhdGlvbiANCg0KVGhlIHByZXZpb3VzIHRhc2sgZm9jdXNlZCBvbiB2aXN1YWxpemluZyBvbmUgdmFyaWFibGUuIEEgZ29vZCB3YXkgdG8gdmlzdWFsaXplIHR3byB2YXJpYWJsZXMgYW5kIGFsc28gdmVyeSBjb21tb24gaXMgYSBzY2F0dGVyIHBsb3QuIEEgc2NhdHRlciBwbG90IGlzIGEgZ29vZCB3YXkgdG8gc3R1ZHkgcmVsYXRpb25zaGlwcyBhbmQgdHJlbmRzLg0KDQpIb3cgdG8gY3JlYXRlIGEgc2NhdHRlciBwbG90DQpgYGB7cn0NCiMgUGxvdCBTYWxlcyB2cy4gUmFkaW8NCiMgUmFkaW8gd2lsbCBiZSBvbiB0aGUgeC1heGlzDQojIFNhbGVzIHdpbGwgYmUgb24gdGhlIHktYXhpcw0KDQpzYWxlcyA9IG15ZGF0YSRzYWxlcw0KcmFkaW8gPSBteWRhdGEkcmFkaW8NCnBsb3QocmFkaW8sc2FsZXMpDQoNCiMgSXQgaXMgZWFzaWVyIHRvIHNlZSB0aGUgdHJlbmQgYW5kIHBvc3NpYmxlIHJlbGF0aW9uc2hpcCBieSBpbmNsdWRpbmcgYSBsaW5lIHRoYXQgZml0IHRocm91Z2ggdGhlIHBvaW50cy4NCiMgVGhpcyBpcyBkb25lIHdpdGggdGhlIGNvbW1hbmQgDQpzY2F0dGVyLnNtb290aChyYWRpbyxzYWxlcykNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJBKSBDcmVhdGUgdGhyZWUgc2VwYXJhdGUgc2NhdHRlciBwbG90cyBmb3IgU2FsZXMgdnMgVFYsIFNhbGVzIHZzIFBhcGVyLCBhbmQgU2FsZXMgdnMgUG9zLiBJbmNsdWRlIHRoZSBiZXN0IGZpdHRpbmcgbGluZSBpbiBlYWNoIHBsb3QuIFBheSBhdHRlbnRpb24gdG8gd2hhdCB2YXJpYWJsZSBnb2VzIG9uIHRoZSB4LWF4aXMgYW5kIHRoZSB5LWF4aXMgKDJwdHMpDQo8L3NwYW4+DQpgYGB7cn0NCnNhbGVzID0gbXlkYXRhJHNhbGVzDQp0diA9IG15ZGF0YSR0dg0KcGFwZXI9bXlkYXRhJHBhcGVyDQpwb3M9bXlkYXRhJHBvcw0KcGxvdCh0dixzYWxlcykNCmBgYA0KYGBge3J9DQpzY2F0dGVyLnNtb290aCh0dixzYWxlcykNCmBgYA0KYGBge3J9DQpwbG90KHBhcGVyLHNhbGVzKQ0KYGBgDQpgYGB7cn0NCnNjYXR0ZXIuc21vb3RoKHBhcGVyLHNhbGVzKQ0KYGBgDQpgYGB7cn0NCnBsb3QocG9zLHNhbGVzKQ0KYGBgDQpgYGB7cn0NCnNjYXR0ZXIuc21vb3RoKHBvcyxzYWxlcykNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJCKSBTaGFyZSB5b3VyIG9ic2VydmF0aW9ucyBvbiB0cmVuZHMgYW5kIHJlbGF0aW9uc2hpcHMuIEhvdyBkbyB5b3VyIG9ic2VydmF0aW9ucyByZWNvbmNpbGUgd2l0aCB5b3VyIGZpbmRpbmdzIGZyb20gbGFiMDU/ICgxcHQpDQo8L3NwYW4+DQpTYWxlcyBhbmQgdHYgaGFzIGEgdmVyeSBoaWdoIHBvc2l0aXZlIGNvcnJlbGF0aW9uLiBTYWxlcyBhbmQgcGFwZXIgaGFzIGEgbG93IG5lZ2F0aXZlIGNvcnJlbGF0aW9uLiBBbmQgc2FsZXMgYW5kIHBvcyBoYXMgYSB2ZXJ5IGxvdyBwb3NpdGl2ZSBjb3JyZWxhdGlvbi4gVGhlIG9ic2VydmF0aW9ucyByZXNlbWJsZSB0aG9zZSBpbiBsYWIwNSBiZWNhdXNlIGFzIFRWIGFkcyBpbmNyZWFzZWQgdGhlIG1vcmUgc2FsZXMgd2VyZSBtYWRlIGNyZWF0aW5nIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwLCBzaW1pbGFyIHRvIHRoZSBvbmUgaGVyZS4gQW5kIHRoZSBwYXBlciBzYWxlcyBoYWQgYSBmbHV4dWF0aW5nIHJlbGF0aW9uc2hpcCB0aGF0IGNyZWF0ZWQgYSBsb3cgbmVnYXRpdmUgcmVsYXRpb25zaGlwIHNpbWlsYXIgdG8gdGhlIG9uZSBoZXJlIGFzIHdlbGwuDQoNCkFzIHBhcnQgb2YgYW55IGRhdGEgYW5seXRpY3MgaXQgaXMgaW1wb3J0YW50IHRvIGNvbnNpZGVyIGJvdGggcXVhbGl0YXRpdmUgYW5kIHF1YW50aXRhdGl2ZSBhbmFseXNpcy4gIFNjYXR0ZXIgcGxvdHMgcHJvdmlkZSB1cyB3aXRoIHF1YWxpdGF0aXZlIGluc2lnaHRzIG9uIHBvc3NpYmxlIHRyZW5kcyBhbmQgcmVsYXRpb25zaGlwcy4gIFRvIHF1YW50aWZ5IHRoZSBzdHJlbmd0aCBvZiBhbnkgcmVsYXRpb25zaGlwcyBpbiB0aGUgZGF0YSwgd2UgbmVlZCB0byBsb29rIGF0IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHR3byB2YXJpYWJsZXMuDQoNClRvIGNvbXB1dGUgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IG9yIHN0cmVuZ3RoIGJldHdlZW4gdmFyaWFibGVzIGZvbGxvdyB0aGUgYmVsb3cgZXhhbXBsZQ0KDQpgYGB7cn0NCmNvcihzYWxlcyxyYWRpbykNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJDKSBSZXBlYXQgdGhlIGNvcnJlbGF0aW9uIGNhbGN1bGF0aW9uIGZvciB0aGUgZm9sbG93aW5nIHBhaXIgb2YgdmFyaWFibGVzICAoc2FsZXMsdHYpLCAoc2FsZXMscGFwZXIpLCBhbmQgKHNhbGVzLHBvcykgKDFwdCkNCjwvc3Bhbj4NCmBgYHtyfQ0KY29yKHNhbGVzLHR2KQ0KYGBgDQpgYGB7cn0NCmNvcihzYWxlcyxwYXBlcikNCmBgYA0KYGBge3J9DQpjb3Ioc2FsZXMscG9zKQ0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMkQpIFdoaWNoIHBhaXIgaGFzIHRoZSBoaWdoZXN0IGNvcnJlbGF0aW9uPyAgSG93IGRvIHRoZXNlIHJlc3VsdHMgcmVjb25jaWxlIHdpdGggeW91ciBzY2F0dGVyIHBsb3RzIG9ic2VydmF0aW9ucz8gKDFwdCkNCjwvc3Bhbj4NClNhbGVzIGFuZCBUViBoYXZlIHRoZSBoaWdoZXN0IGNvcnJlbGF0aW9uLiBBbmQgdGhleSByZWNvbmNpbGUgd2l0aCB0aGUgc2NhdHRlciBwbG90IG9ic2VydmF0aW9ucyB3ZWxsIGJlY2F1c2UgdGhlc2UgcmVzdWx0cyBhcmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIHBsb3RzIGFuZCB0aGV5IGdpdmUgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNhbGN1bGF0aW9ucy4NCi0tLS0tLS0tLS0NCg0KIyMjIFRhc2sgMyAtIEJhc2ljIFZpc3VhbCBBbmFseXRpY3MgaW4gVGFibGVhdQ0KDQpGb2xsb3cgdGhlIGRpcmVjdGlvbnMgb24gdGhlIHdvcmtzaGVldCwgZG93bmxvYWQgdGFibGVhdSBhY2FkZW1pYyBvbiB5b3VyIHBlcnNvbmFsIGNvbXB1dGVyIG9yIHVzZSBvbmUgb2YgdGhlIGxhYnMgY29tcHV0ZXJzLiBNYWtlIHN1cmUgdG8gZG93bmxvYWQgdGhlIGFjYWRlbWljIHZlcnNpb24gYW5kIG5vdCB0aGUgZnJlZSBsaW1pdGVkIHRyaWFsIHZlcnNpb24uDQoNCi0tIERvd25sb2FkIFRhYmxlYXUgYWNhZGVtaWMgaGVyZTogaHR0cHM6Ly93d3cudGFibGVhdS5jb20vYWNhZGVtaWMvc3R1ZGVudHMNCg0KLS0gUmVmZXIgdG8gZmlsZSAnY3JlZGl0cmlzay5jc3YnIGluIHRoZSBkYXRhIGZvbGRlcg0KDQotLSBTdGFydCBUYWJsZWF1IGFuZCBlbnRlciB5b3VyIExVQyBlbWFpbCBpZiBwcm9tcHRlZC4NCg0KLS0gSW1wb3J0IHRoZSBmaWxlIGludG8gVGFibGVhdS4gQ2hvb3NlIHRoZSBUZXh0IEZpbGUgb3B0aW9uIHdoZW4gaW1wb3J0aW5nDQoNCiFbXSh0YWJsZWF1X2ltcG9ydGZpbGUucG5nKQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi0tIFVuZGVyIHRoZSBkaW1lbnNpb25zIHRhYiBsb2NhdGVkIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNjcmVlbiBET1VCTEUgY2xpY2sgb24gdGhlICdMb2FuIFB1cnBvc2UnLCB0aGVuIERPVUJMRSBjbGljayBvbiAnTnVtYmVyIG9mIFJlY29yZHMnIHZhcmlhYmxlIGxvY2F0ZWQgdW5kZXIgTWVhc3VyZXMgb24gdGhlIGJvdHRvbSBsZWZ0IG9mIHRoZSBzY3JlZW4uIA0KDQohW10odGFibGVhdV92YXJpYWJsZXMucG5nKQ0KDQoNCg0KLS0gRnJvbSB0aGUgdXBwZXIgcmlnaHQgY29ybmVyIG9mIHRoZSBzY3JlZW4gc2VsZWN0IHRoZSBob3Jpem9udGFsIGJhcnMgdmlldyBhbmQgbm90ZSB0aGUgbmV3IGNoYXJ0LiAgRmFtaWxpYXJpemUgeW91cnNlbGYgd2l0aCB0aGUgdG9vbCBieSB0cnlpbmcgb3RoZXIgdmlld3MuIE9ubHkgdmFsaWQgdmlld3Mgd2lsbCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgbWVudS4gIA0KDQohW10odGFibGVhdV9zaG93bWUucG5nKQ0KDQoNCi0tIENyZWF0ZSBhIG5ldyBzaGVldCBieSBjbGlja2luZyBvbiB0aGUgaWNvbiBpbiB0aGUgYm90dG9tIG5leHQgdG8geW91ciBjdXJyZW50IHNoZWV0Lg0KDQohW10odGFibGVhdV9uZXdzaGVldC5wbmcpDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgM0EpIERvdWJsZS1jbGljayBvbiB0aGUgJ0FnZScgdmFyaWFibGUgaW4gTWVhc3VyZXMgYW5kIHNlbGVjdCB0aGUgJ0hpc3RvZ3JhbScgdmlldy4gIENhcHR1cmUgYSBzY3JlZW4gc2hvdCBhbmQgaW5jbHVkZSBoZXJlLiAgV2hpY2ggYWdlIGJpbiBoYXMgdGhlIGhpZ2hlc3QgYWdlIGNvdW50IGFuZCB3aGF0IGlzIHRoZSBjb3VudD8gKDJwdHMpDQo8L3NwYW4+DQohW10oc2NyZWVuc2hvdDEucG5nKQ0KDQpUaGUg4oCYMjLigJkgYWdlIGJpbiBoYXMgdGhlIGhpZ2hlc3QgYWdlIGNvdW50IGFuZCB0aGUgY291bnQgaXMgOTcuDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDNCKSBEcmFnLWRyb3AgdGhlIHZhcmlhYmxlICdNYXJpdGFsIFN0YXR1cydmb3VuZCB1bmRlciBEaW1lbnNpb25zIGludG8gdGhlIE1hcmtzIENvbG9yIGJveC4gIENhcHR1cmUgYSBzY3JlZW4gc2hvdCBhbmQgaW5jbHVkZSBoZXJlLiAgV2hpY2ggYWdlIGJpbiBoYXMgdGhlIGhpZ2hlc3QgZGl2b3JjZSBjb3VudCBhbmQgd2hhdCBpcyB0aGUgY291bnQ/ICAoMnB0cykNCjwvc3Bhbj4NCiFbXShzY3JlZW5zaG90Mi5wbmcpDQoNClRoZSBhZ2UgYmluIHdpdGggdGhlIGhpZ2hlc3QgZGl2b3JjZSByYXRlIGlzIDIyIGFuZCB0aGUgY291bnQgaXMgNDYuDQoNCiFbXSh0YWJsZWF1X21hcmtzLnBuZykNCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDNDKSBDcmVhdGUgYW5vdGhlciBuZXcgc2hlZXQuIERvdWJsZS1jbGljayAnTW9udGhzIEVtcGxveWVkJyBhbmQgdGhlbiBkb3VibGUtY2xpY2sgJ0FnZScuIE1ha2Ugc3VyZSBBZ2UgYXBwZWFycyBpbiB0aGUgY29sdW1ucyBmaWVsZCBhcyBzaG93biBpbiB0aGUgaW1hZ2UgYmVsb3cuIEZyb20gdGhlIFN1bShBZ2UpIGRyb3AgZG93biBtZW51IHNlbGVjdCBEaW1lbnNpb24uIFJlcGVhdCBmb3IgU3VtKE1vbnRocyBFbXBsb3llZCkuIEFkZCBhbm90aGVyIHZhcmlhYmxlIHRvIHRoZSBzY2F0dGVyIHBsb3QgYnkgZHJhZy1kcm9wIHRoZSBkaW1lbnNpb24gdmFyaWFibGUgJ0dlbmRlcicgaW50byB0aGUgTWFya3MgQ29sb3IgYm94LiBDYXB0dXJlIGEgc2NyZWVuIHNob3QgYW5kIGluY2x1ZGUgaGVyZS4gU2hhcmUgaW5zaWdodHMgb24gd2hhdCB0aGUgZGF0YSBpcyB0ZWxsaW5nIHVzICgzcHRzKQ0KPC9zcGFuPg0KIVtdKHNjcmVlbnNob3QzLnBuZykNCg0KVGhlIGRhdGEgaGVyZSBpcyBnaXZpbmcgdXMgYSB2aXN1YWwgYnJlYWtkb3duIG9mIHBlb3BsZSBhdCBkaWZmZXJlbnQgYWdlcyBhbmQgaG93IGxvbmcgdGhleSB3ZXJlIGVtcGxveWVkLCB3aXRoIHRoZSBjb2xvcnMgYmx1ZSBhbmQgb3JhbmdlIHNpZ25pZnlpbmcgbWFsZXMgYW5kIGZlbWFsZXMgcmVzcGVjdGl2ZWx5LkluIHRoaXMgc3BlY2lmaWMgc2NhdHRlciBwbG90LCBhZ2UgaXMgb24gdGhlIHgtYXhpcywgbW9udGhzIGVtcGxveWVkIGlzIG9uIHRoZSB5LWF4aXMsIGFuZCBnZW5kZXIgaXMgYnJva2VuIGRvd24gYnkgdGhlIGRpZmZlcmVudCBjb2xvcnMuDQoNCiFbXSh0YWJsZWF1X2RpbWVuc2lvbi5wbmcpDQoNCg0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgM0QpIEluIGEgbmV3IHNoZWV0IGdlbmVyYXRlIGEgdmlldyBvZiBHZW5kZXIsIE51bWJlciBvZiBSZWNvcmRzLCBhbmQgTWFyaXRhbCBTdGF0dXMuIENob29zZSB0aGUgYmVzdCBmaXR0aW5nIHZpZXcgb2YgeW91ciBjaG9pY2UgZm9yIHRoZSBpbnRlbmRlZCBzY29wZS4gICBDYXB0dXJlIGEgc2NyZWVuIHNob3QgYW5kIGluY2x1ZGUgaGVyZS4gU2hhcmUgaW5zaWdodHMgb24gd2hhdCB0aGUgZGF0YSBpcyB0ZWxsaW5nIHVzICgzcHRzKQ0KPC9zcGFuPg0KIVtdKHNjcmVlbnNob3Q0LnBuZykNCg0KSGVyZSB0aGUgZGF0YSBpcyBicmVha2luZyBkb3duIHRocmVlIHZhcmlhYmxlczogZ2VuZGVyLCBudW1iZXIgb2YgcnJlY29yZHMsIGFuZCBtYXJpdGFsIHN0YXR1cy4gVGhlIGdlbmRlciBpcyBvbiB0aGUgeC1heGlzIHdoaWNoIG1ha2VzIDMgY29sdW1ucy4gTnVtYmVyIG9mIHJlY29yZHMgYXJlIG9uIHRoZSB5LWF4aXMgYW5kIHRoZSBibHVlIGFuZCBvcmFuZ2UgY29sb3JzIHNpZ25pZnkgZmVtYWxlcyBhbmQgbWFsZXMgcmVzcGVjdGl2ZWx5Lg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCg==