Solving Problems with R 205-2-7032 Lab assignment no.5
package vegan
The data set that we will be using is a real data set, contributed by Zehava Siegal, who works as an ecologist for the Nature and Parks Authority. The data contain numbers of annual plants from 40 species, collected near Kibutz Sede Boqer. In each plot there were three treatments: HA1-plowing the soil superficially; HA2-plowing the soil deeply; control-the soil was left untouched. This design was replicated in five plots. There are 5 areas, and in each one there were three subplots, with different treatments (HA1, HA2 and Control). So in total there were 15 sites, and in each one of them Zehava recorded the quantity of annual plants she found. The goal of the study was to determine which of the treatments results in a richer annual plant community. There could be many definitions of “rich plant community”, and we will explore several potential measures.
- fill in your name
My_Name <- 'Gal Revivo'
- Use ‘sp.csv’ data file and transform the data into the structure for the package, and call it VegSp. (20 points)
Have a look at the data file. It is in long format. Last week we learnt how to convert wide to long format. This week, we need to do the opposit, because the package we will use (vegan) for the analysis, requires data in wide format.
Structure of the data for the analysis should be: Each row is a location. Do not include location names in the table for analysis. sp1 sp2 sp3 sp4 sp5 sp6 sp7 sp8 6 5 1 3 12 50 0 0 12 21 5 25 2 17 9 0 The data frame sould not contain NA, please replace them to 0 (zero)
tip - try to look for function “dcast”" from package “reshape2”: https://seananderson.ca/2013/10/19/reshape/ .
# import data set and switch format
library(readr)
library(reshape2) #call in the different libraries that i will use for this exercise
library(vegan)
library(readr)
library(ggplot2) #################################################################
Sp <- read_csv(file = 'C:/University/solve problems in R/Sp.csv')
Sp <- as.data.frame(Sp)#call in the Data set
View(Sp)
colnames(Sp)[2] <- "Area.num" #change the name of the column to be more easy to use
colnames(Sp)[5] <- "Obs" # dito
Vegsp <- dcast(Sp, Area.num + Treatment ~ Species, value.var = "Obs") # use dcast function from 'vegan' package to switch to wide format
Vegsp[is.na(Vegsp)] <- 0 # switch from N/A to 0 cells
- The first measure we will look at is species richness (a simple count of number of species). Plot the number of species that were observed for each place in bar graph, use ggplot. rotate the names of locations that will appear in the x axis to be vertical, using “theme(axis.text.x=element_text(angle = -90, hjust = 0))” 20 points
#calculate richness per location and per treatment
Vegsp$richness<-rowSums(Vegsp[,-1:-2] != 0) # add new column labeled 'richness' to sum every row (richness for location and treatment) without taking into account the first two columns
p<- ggplot(Vegsp,aes(Area.num, richness, fill= Treatment)) + # plot graph for the richness of different treatment and areas
geom_bar(stat='identity',position = "dodge") +
theme(axis.text.x=element_text(angle = -90, hjust = 0))
p+scale_fill_manual(values=c("#DA70D6", "#770737", "#673147")) #custom color pellet
3)species diversity with the package vegan- calculate three measures of diversity: Simpson, Shannon and Fisher’s alpha. Combine them with the species richness you calculated before in one data frame, and insert the place names. The different measures names should appear as the column names. 20 points
richness<-rowSums(Vegsp[,-1:-2] != 0) # two ways to calculate the richness - with rows summary and with 'specnumber' function
richness2<-specnumber(Vegsp2)
Vegsp2 <-Vegsp[,-1:-2] # new data frame without the first two columns
# different alpha diversities:
#simpson
Simpson <- diversity(Vegsp2,index = "simpson")
#Shannon
Shannon <- diversity(Vegsp2)
#Fisher
Fisher <- fisher.alpha(Vegsp2)
DiversityTable <- cbind(Vegsp[,1:2], Simpson,Shanon,Fisher, richness2) # take the four vectors from above and add them together
colnames(DiversityTable) <- c("Area.num", "Treatment","Simpson", "Shannon", "Fisher", "Richness") # adding names for the columns
- Based on last weeks’s lesson, make a box plot that summarizes the Shanon median for each treatment. Use diffrent colors for each treatment. Make sure that the axis have a meaning and add a title to the graph (10 points)
#boxplot the different treatment by the shannon median values (the line inside each of the boxplots)
ggplot (as.data.frame(DiversityTable), aes(x = Treatment, y = Shanon, fill = Treatment)) + geom_boxplot(alpha=0.3) +
theme(legend.position="none")+ggtitle("Shannon diversity Median")
- Calculate and compare in a graph the accumulation of species richness for treatment HA1 and HA2. Use the default method for the order of plots accumulation of species. Use function ‘specaccum’ from Vegan. USe “’”Package ‘vegan’" file to know how to use this function. You can find the file in the moodle.
10 points
H1 <- specaccum(Vegsp[Vegsp$Treatment=="HA1",-c(1:2)]) #calculate the accumulation of richness in HA1 treatment
H2 <- specaccum(Vegsp[Vegsp$Treatment=="HA2",-c(1:2)])#calculate the accumulation of richness in HA2 treatment
#plot graph on both treatments for comparison
plot(H1, col="orange")
plot(H2, col="purple", add = T)
- Cluster analysis - build single linkage cluster, do not forget to plot it. Use ‘vegan tutor for Ex5’, section 6. The tutor file is in moodle. 10 points
#Cluster analysis - single linkage cluster
distance<- vegdist(Vegsp[,-c(1:2,42)]) # use vegdist, to preform distance matrix from our original wide data on the 15 samples
clus1 <- hclust(distance, "single") #use single linkage cluster, this dendrogram is the one that the qusetion asked
clus2 <- hclust(distance, "complete") # the complete linkage cluster, just for me to see the differences
clus3 <- hclust(distance, "average") # avrage linkage cluster just for me to see the differences
#ploting the cluster
plot(clus1) # plot the cluster dendrograms
plot(clus2)
plot(clus3)
- Display an interpretation of classes - use the cluster you built before and classify the places in 3 seprate groups. 10 points
plot(clus1) #plot the cluster from question 6
rect.hclust(clus1, 3) # classification into groups of threes
group3 <- cutree(clus1, 3)
Homework: 1. Complete all the tasks that you did not do in class. 2. Go over your chunks, after you made sure it runs, and make sure you wrote a comment for each line - a title that will explain what the line does. Try to use the terminology used in class whenever possible. 10% of every question will be given for comments. 3. Submit the RMD file and the HTML file in moodle. Both file names need to include your first and last name. If I had to submit the files I would name them: ex5_LiranSagi
Good Luck!
LS0tDQp0aXRsZTogIkV4NV9zb2x2ZWQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCg0KU29sdmluZyBQcm9ibGVtcyB3aXRoIFINCjIwNS0yLTcwMzINCkxhYiBhc3NpZ25tZW50IG5vLjUNCg0KIHBhY2thZ2UgdmVnYW4NCiANCiBUaGUgZGF0YSBzZXQgdGhhdCB3ZSB3aWxsIGJlIHVzaW5nIGlzIGEgcmVhbCBkYXRhIHNldCwgY29udHJpYnV0ZWQgYnkgWmVoYXZhIFNpZWdhbCwgd2hvIHdvcmtzIGFzIGFuIGVjb2xvZ2lzdCBmb3IgdGhlIE5hdHVyZSBhbmQgUGFya3MgQXV0aG9yaXR5LiBUaGUgZGF0YSBjb250YWluIG51bWJlcnMgb2YgYW5udWFsIHBsYW50cyBmcm9tIDQwIHNwZWNpZXMsIGNvbGxlY3RlZCBuZWFyIEtpYnV0eiBTZWRlIEJvcWVyLiBJbiBlYWNoIHBsb3QgdGhlcmUgd2VyZSB0aHJlZSB0cmVhdG1lbnRzOiBIQTEtcGxvd2luZyB0aGUgc29pbCBzdXBlcmZpY2lhbGx5OyBIQTItcGxvd2luZyB0aGUgc29pbCBkZWVwbHk7IGNvbnRyb2wtdGhlIHNvaWwgd2FzIGxlZnQgdW50b3VjaGVkLiBUaGlzIGRlc2lnbiB3YXMgcmVwbGljYXRlZCBpbiBmaXZlIHBsb3RzLiANClRoZXJlIGFyZSA1IGFyZWFzLCBhbmQgaW4gZWFjaCBvbmUgdGhlcmUgd2VyZSB0aHJlZSBzdWJwbG90cywgd2l0aCBkaWZmZXJlbnQgdHJlYXRtZW50cyAoSEExLCBIQTIgYW5kIENvbnRyb2wpLiBTbyBpbiB0b3RhbCB0aGVyZSB3ZXJlIDE1IHNpdGVzLCBhbmQgaW4gZWFjaCBvbmUgb2YgdGhlbSBaZWhhdmEgcmVjb3JkZWQgdGhlIHF1YW50aXR5IG9mIGFubnVhbCBwbGFudHMgc2hlIGZvdW5kLg0KVGhlIGdvYWwgb2YgdGhlIHN0dWR5IHdhcyB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlIHRyZWF0bWVudHMgcmVzdWx0cyBpbiBhIHJpY2hlciBhbm51YWwgcGxhbnQgY29tbXVuaXR5LiBUaGVyZSBjb3VsZCBiZSBtYW55IGRlZmluaXRpb25zIG9mICJyaWNoIHBsYW50IGNvbW11bml0eSIsIGFuZCB3ZSB3aWxsIGV4cGxvcmUgc2V2ZXJhbCBwb3RlbnRpYWwgbWVhc3VyZXMuDQogDQowKSBmaWxsIGluIHlvdXIgbmFtZQ0KYGBge3J9DQpNeV9OYW1lIDwtICdHYWwgUmV2aXZvJw0KYGBgDQoNCg0KIA0KMSkgVXNlICdzcC5jc3YnIGRhdGEgZmlsZSBhbmQgdHJhbnNmb3JtIHRoZSBkYXRhIGludG8gdGhlIHN0cnVjdHVyZSBmb3IgdGhlIHBhY2thZ2UsIGFuZCBjYWxsIGl0IFZlZ1NwLiAoMjAgcG9pbnRzKQ0KDQpIYXZlIGEgbG9vayBhdCB0aGUgZGF0YSBmaWxlLiBJdCBpcyBpbiBsb25nIGZvcm1hdC4gTGFzdCB3ZWVrIHdlIGxlYXJudCBob3cgdG8gY29udmVydCB3aWRlIHRvIGxvbmcgZm9ybWF0LiBUaGlzIHdlZWssIHdlIG5lZWQgdG8gZG8gdGhlIG9wcG9zaXQsIGJlY2F1c2UgdGhlIHBhY2thZ2Ugd2Ugd2lsbCB1c2UgKHZlZ2FuKSBmb3IgdGhlIGFuYWx5c2lzLCByZXF1aXJlcyBkYXRhIGluIHdpZGUgZm9ybWF0Lg0KDQpTdHJ1Y3R1cmUgb2YgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNpcyBzaG91bGQgYmU6DQpFYWNoIHJvdyBpcyBhIGxvY2F0aW9uLiBEbyBub3QgaW5jbHVkZSBsb2NhdGlvbiBuYW1lcyBpbiB0aGUgdGFibGUgZm9yIGFuYWx5c2lzLiANCiAgc3AxIHNwMiBzcDMgc3A0IHNwNSBzcDYgc3A3IHNwOA0KICA2IDUgMSAzIDEyIDUwIDAgMA0KICAxMiAyMSA1IDI1IDIgMTcgOSAwDQpUaGUgZGF0YSBmcmFtZSBzb3VsZCBub3QgY29udGFpbiBOQSwgcGxlYXNlIHJlcGxhY2UgdGhlbSB0byAwICh6ZXJvKQ0KDQp0aXAgLSB0cnkgdG8gbG9vayBmb3IgZnVuY3Rpb24gImRjYXN0IiIgZnJvbSBwYWNrYWdlICJyZXNoYXBlMiI6IGh0dHBzOi8vc2VhbmFuZGVyc29uLmNhLzIwMTMvMTAvMTkvcmVzaGFwZS8gLg0KDQoNCmBgYHtyfQ0KIyBpbXBvcnQgZGF0YSBzZXQgYW5kIHN3aXRjaCBmb3JtYXQNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJlc2hhcGUyKSAjY2FsbCBpbiB0aGUgZGlmZmVyZW50IGxpYnJhcmllcyB0aGF0IGkgd2lsbCB1c2UgZm9yIHRoaXMgZXhlcmNpc2UNCmxpYnJhcnkodmVnYW4pDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShnZ3Bsb3QyKSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KU3AgPC0gcmVhZF9jc3YoZmlsZSA9ICdDOi9Vbml2ZXJzaXR5L3NvbHZlIHByb2JsZW1zIGluIFIvU3AuY3N2JykNClNwIDwtIGFzLmRhdGEuZnJhbWUoU3ApI2NhbGwgaW4gdGhlIERhdGEgc2V0DQpWaWV3KFNwKQ0KY29sbmFtZXMoU3ApWzJdIDwtICJBcmVhLm51bSIgI2NoYW5nZSB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJlIG1vcmUgZWFzeSB0byB1c2UNCmNvbG5hbWVzKFNwKVs1XSA8LSAiT2JzIiAjIGRpdG8NCg0KVmVnc3AgPC0gZGNhc3QoU3AsIEFyZWEubnVtICsgVHJlYXRtZW50IH4gU3BlY2llcywgdmFsdWUudmFyID0gIk9icyIpICMgdXNlIGRjYXN0IGZ1bmN0aW9uIGZyb20gJ3ZlZ2FuJyBwYWNrYWdlIHRvIHN3aXRjaCB0byB3aWRlIGZvcm1hdCAgDQoNClZlZ3NwW2lzLm5hKFZlZ3NwKV0gPC0gMCAjIHN3aXRjaCBmcm9tIE4vQSB0byAwIGNlbGxzDQoNCmBgYA0KDQoyKSBUaGUgZmlyc3QgbWVhc3VyZSB3ZSB3aWxsIGxvb2sgYXQgaXMgc3BlY2llcyByaWNobmVzcyAoYSBzaW1wbGUgY291bnQgb2YgbnVtYmVyIG9mIHNwZWNpZXMpLiBQbG90IHRoZSBudW1iZXIgb2Ygc3BlY2llcyB0aGF0IHdlcmUgb2JzZXJ2ZWQgZm9yIGVhY2ggcGxhY2UgaW4gYmFyIGdyYXBoLCB1c2UgZ2dwbG90Lg0Kcm90YXRlIHRoZSBuYW1lcyBvZiBsb2NhdGlvbnMgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgeCBheGlzIHRvIGJlIHZlcnRpY2FsLCB1c2luZyAidGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTkwLCBoanVzdCA9IDApKSINCjIwIHBvaW50cw0KDQpgYGB7cn0NCiNjYWxjdWxhdGUgcmljaG5lc3MgcGVyIGxvY2F0aW9uIGFuZCBwZXIgdHJlYXRtZW50DQoNClZlZ3NwJHJpY2huZXNzPC1yb3dTdW1zKFZlZ3NwWywtMTotMl0gIT0gMCkgIyBhZGQgbmV3IGNvbHVtbiBsYWJlbGVkICdyaWNobmVzcycgdG8gc3VtIGV2ZXJ5IHJvdyAocmljaG5lc3MgZm9yIGxvY2F0aW9uIGFuZCB0cmVhdG1lbnQpIHdpdGhvdXQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgZmlyc3QgdHdvIGNvbHVtbnMNCg0KcDwtIGdncGxvdChWZWdzcCxhZXMoQXJlYS5udW0sIHJpY2huZXNzLCBmaWxsPSBUcmVhdG1lbnQpKSArICMgcGxvdCBncmFwaCBmb3IgdGhlIHJpY2huZXNzIG9mIGRpZmZlcmVudCB0cmVhdG1lbnQgYW5kIGFyZWFzDQogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jyxwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTkwLCBoanVzdCA9IDApKQ0KDQpwK3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjREE3MEQ2IiwgIiM3NzA3MzciLCAiIzY3MzE0NyIpKSAjY3VzdG9tIGNvbG9yIHBlbGxldA0KDQpgYGANCg0KMylzcGVjaWVzIGRpdmVyc2l0eSB3aXRoIHRoZSBwYWNrYWdlIHZlZ2FuLSBjYWxjdWxhdGUgdGhyZWUgbWVhc3VyZXMgb2YgZGl2ZXJzaXR5OiBTaW1wc29uLCBTaGFubm9uIGFuZCBGaXNoZXIncyBhbHBoYS4gDQpDb21iaW5lIHRoZW0gd2l0aCB0aGUgc3BlY2llcyByaWNobmVzcyB5b3UgY2FsY3VsYXRlZCBiZWZvcmUgaW4gb25lIGRhdGEgZnJhbWUsIGFuZCBpbnNlcnQgdGhlIHBsYWNlIG5hbWVzLiBUaGUgZGlmZmVyZW50IG1lYXN1cmVzIG5hbWVzIHNob3VsZCBhcHBlYXIgYXMgdGhlIGNvbHVtbiBuYW1lcy4NCjIwIHBvaW50cw0KYGBge3J9DQpyaWNobmVzczwtcm93U3VtcyhWZWdzcFssLTE6LTJdICE9IDApICMgdHdvIHdheXMgdG8gY2FsY3VsYXRlIHRoZSByaWNobmVzcyAtIHdpdGggcm93cyBzdW1tYXJ5IGFuZCB3aXRoICdzcGVjbnVtYmVyJyBmdW5jdGlvbg0KDQpyaWNobmVzczI8LXNwZWNudW1iZXIoVmVnc3AyKQ0KDQpWZWdzcDIgPC1WZWdzcFssLTE6LTJdICMgbmV3IGRhdGEgZnJhbWUgd2l0aG91dCB0aGUgZmlyc3QgdHdvIGNvbHVtbnMNCg0KIyBkaWZmZXJlbnQgYWxwaGEgZGl2ZXJzaXRpZXM6DQojc2ltcHNvbg0KU2ltcHNvbiA8LSBkaXZlcnNpdHkoVmVnc3AyLGluZGV4ID0gInNpbXBzb24iKQ0KI1NoYW5ub24NClNoYW5ub24gPC0gZGl2ZXJzaXR5KFZlZ3NwMikNCiNGaXNoZXINCkZpc2hlciA8LSBmaXNoZXIuYWxwaGEoVmVnc3AyKQ0KDQpEaXZlcnNpdHlUYWJsZSA8LSBjYmluZChWZWdzcFssMToyXSwgU2ltcHNvbixTaGFub24sRmlzaGVyLCByaWNobmVzczIpICMgdGFrZSB0aGUgZm91ciB2ZWN0b3JzIGZyb20gYWJvdmUgYW5kIGFkZCB0aGVtIHRvZ2V0aGVyIA0KDQpjb2xuYW1lcyhEaXZlcnNpdHlUYWJsZSkgPC0gYygiQXJlYS5udW0iLCAiVHJlYXRtZW50IiwiU2ltcHNvbiIsICJTaGFubm9uIiwgIkZpc2hlciIsICJSaWNobmVzcyIpICMgYWRkaW5nIG5hbWVzIGZvciB0aGUgY29sdW1ucw0KDQoNCmBgYA0KDQo0KSBCYXNlZCBvbiBsYXN0IHdlZWtzJ3MgbGVzc29uLCBtYWtlIGEgYm94IHBsb3QgdGhhdCBzdW1tYXJpemVzIHRoZSBTaGFub24gbWVkaWFuIGZvciBlYWNoIHRyZWF0bWVudC4gVXNlIGRpZmZyZW50IGNvbG9ycyBmb3IgZWFjaCB0cmVhdG1lbnQuIE1ha2Ugc3VyZSB0aGF0IHRoZSBheGlzIGhhdmUgYSBtZWFuaW5nIGFuZCBhZGQgYSB0aXRsZSB0byB0aGUgZ3JhcGggDQooMTAgcG9pbnRzKSAgDQoNCg0KYGBge3J9DQojYm94cGxvdCB0aGUgZGlmZmVyZW50IHRyZWF0bWVudCBieSB0aGUgc2hhbm5vbiBtZWRpYW4gdmFsdWVzICh0aGUgbGluZSBpbnNpZGUgZWFjaCBvZiB0aGUgYm94cGxvdHMpDQpnZ3Bsb3QgKGFzLmRhdGEuZnJhbWUoRGl2ZXJzaXR5VGFibGUpLCBhZXMoeCA9IFRyZWF0bWVudCwgeSA9IFNoYW5vbiwgZmlsbCA9IFRyZWF0bWVudCkpICsgIGdlb21fYm94cGxvdChhbHBoYT0wLjMpICsNCnRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpK2dndGl0bGUoIlNoYW5ub24gZGl2ZXJzaXR5IE1lZGlhbiIpDQoNCmBgYA0KDQo1KSBDYWxjdWxhdGUgYW5kIGNvbXBhcmUgaW4gYSBncmFwaCB0aGUgYWNjdW11bGF0aW9uIG9mIHNwZWNpZXMgcmljaG5lc3MgZm9yIHRyZWF0bWVudCBIQTEgYW5kIEhBMi4gVXNlIHRoZSBkZWZhdWx0IG1ldGhvZCBmb3IgdGhlIG9yZGVyIG9mIHBsb3RzIGFjY3VtdWxhdGlvbiBvZiBzcGVjaWVzLiBVc2UgZnVuY3Rpb24gJ3NwZWNhY2N1bScgZnJvbSBWZWdhbi4gVVNlICInIlBhY2thZ2Ug4oCYdmVnYW7igJkiIGZpbGUgdG8ga25vdyBob3cgdG8gdXNlIHRoaXMgZnVuY3Rpb24uIFlvdSBjYW4gZmluZCB0aGUgZmlsZSBpbiB0aGUgbW9vZGxlLg0KDQoxMCBwb2ludHMNCmBgYHtyfQ0KDQpIMSA8LSBzcGVjYWNjdW0oVmVnc3BbVmVnc3AkVHJlYXRtZW50PT0iSEExIiwtYygxOjIpXSkgI2NhbGN1bGF0ZSB0aGUgYWNjdW11bGF0aW9uIG9mIHJpY2huZXNzIGluIEhBMSB0cmVhdG1lbnQNCkgyIDwtIHNwZWNhY2N1bShWZWdzcFtWZWdzcCRUcmVhdG1lbnQ9PSJIQTIiLC1jKDE6MildKSNjYWxjdWxhdGUgdGhlIGFjY3VtdWxhdGlvbiBvZiByaWNobmVzcyBpbiBIQTIgdHJlYXRtZW50DQoNCiNwbG90IGdyYXBoIG9uIGJvdGggdHJlYXRtZW50cyBmb3IgY29tcGFyaXNvbiANCnBsb3QoSDEsIGNvbD0ib3JhbmdlIikgDQpwbG90KEgyLCBjb2w9InB1cnBsZSIsIGFkZCA9IFQpIA0KDQoNCmBgYA0KDQoNCjYpIENsdXN0ZXIgYW5hbHlzaXMgLSBidWlsZCBzaW5nbGUgbGlua2FnZSBjbHVzdGVyLCBkbyBub3QgZm9yZ2V0IHRvIHBsb3QgaXQuDQpVc2UgJ3ZlZ2FuIHR1dG9yIGZvciBFeDUnLCBzZWN0aW9uIDYuIFRoZSB0dXRvciBmaWxlIGlzIGluIG1vb2RsZS4NCjEwIHBvaW50cw0KYGBge3J9DQojQ2x1c3RlciBhbmFseXNpcyAtIHNpbmdsZSBsaW5rYWdlIGNsdXN0ZXINCg0KZGlzdGFuY2U8LSB2ZWdkaXN0KFZlZ3NwWywtYygxOjIsNDIpXSkgIyB1c2UgdmVnZGlzdCwgdG8gcHJlZm9ybSBkaXN0YW5jZSBtYXRyaXggZnJvbSBvdXIgb3JpZ2luYWwgd2lkZSBkYXRhIG9uIHRoZSAxNSBzYW1wbGVzDQpjbHVzMSA8LSBoY2x1c3QoZGlzdGFuY2UsICJzaW5nbGUiKSAjdXNlIHNpbmdsZSBsaW5rYWdlIGNsdXN0ZXIsIHRoaXMgZGVuZHJvZ3JhbSBpcyB0aGUgb25lIHRoYXQgdGhlIHF1c2V0aW9uIGFza2VkDQpjbHVzMiA8LSBoY2x1c3QoZGlzdGFuY2UsICJjb21wbGV0ZSIpICMgdGhlIGNvbXBsZXRlIGxpbmthZ2UgY2x1c3RlciwganVzdCBmb3IgbWUgdG8gc2VlIHRoZSBkaWZmZXJlbmNlcw0KY2x1czMgPC0gaGNsdXN0KGRpc3RhbmNlLCAiYXZlcmFnZSIpICMgYXZyYWdlIGxpbmthZ2UgY2x1c3RlciBqdXN0IGZvciBtZSB0byBzZWUgdGhlIGRpZmZlcmVuY2VzDQojcGxvdGluZyB0aGUgY2x1c3Rlcg0KcGxvdChjbHVzMSkgIyBwbG90IHRoZSBjbHVzdGVyIGRlbmRyb2dyYW1zDQpwbG90KGNsdXMyKQ0KcGxvdChjbHVzMykNCg0KDQpgYGANCg0KDQo3KSBEaXNwbGF5IGFuIGludGVycHJldGF0aW9uIG9mIGNsYXNzZXMgLSB1c2UgdGhlIGNsdXN0ZXIgeW91IGJ1aWx0IGJlZm9yZSAgYW5kIGNsYXNzaWZ5IHRoZSBwbGFjZXMgaW4gMyBzZXByYXRlIGdyb3Vwcy4gDQoxMCBwb2ludHMNCmBgYHtyfQ0KDQpwbG90KGNsdXMxKSAjcGxvdCB0aGUgY2x1c3RlciBmcm9tIHF1ZXN0aW9uIDYNCg0KcmVjdC5oY2x1c3QoY2x1czEsIDMpICMgY2xhc3NpZmljYXRpb24gaW50byBncm91cHMgb2YgdGhyZWVzDQpncm91cDMgPC0gY3V0cmVlKGNsdXMxLCAzKQ0KDQoNCmBgYA0KDQoNCg0KICBIb21ld29yazoNCjEuCUNvbXBsZXRlIGFsbCB0aGUgdGFza3MgdGhhdCB5b3UgZGlkIG5vdCBkbyBpbiBjbGFzcy4NCjIuCUdvIG92ZXIgeW91ciBjaHVua3MsIGFmdGVyIHlvdSBtYWRlIHN1cmUgaXQgcnVucywgYW5kIG1ha2Ugc3VyZSB5b3Ugd3JvdGUgYSBjb21tZW50IGZvciBlYWNoIGxpbmUgLSBhIHRpdGxlIHRoYXQgd2lsbCBleHBsYWluIHdoYXQgdGhlIGxpbmUgZG9lcy4gVHJ5IHRvIHVzZSB0aGUgdGVybWlub2xvZ3kgdXNlZCBpbiBjbGFzcyB3aGVuZXZlciBwb3NzaWJsZS4gMTAlIG9mIGV2ZXJ5IHF1ZXN0aW9uIHdpbGwgYmUgZ2l2ZW4gZm9yIGNvbW1lbnRzLg0KMy4JU3VibWl0IHRoZSBSTUQgZmlsZSBhbmQgdGhlIEhUTUwgZmlsZSBpbiBtb29kbGUuIEJvdGggZmlsZSBuYW1lcyBuZWVkIHRvIGluY2x1ZGUgeW91ciBmaXJzdCBhbmQgbGFzdCBuYW1lLiBJZiBJIGhhZCB0byBzdWJtaXQgdGhlIGZpbGVzIEkgd291bGQgbmFtZSB0aGVtOiBleDVfTGlyYW5TYWdpDQogIA0KIAkJCQkJCQlHb29kIEx1Y2sh