Arithmetic Operators Section
Division
2/3
[1] 0.6666667
Square Root
sqrt(2)
[1] 1.414214
#logarithms
log(2)
[1] 0.6931472
Rational Operators section is to test whether something is less than, greater than or equal.
Checking to see if 3 is equal to 8 since it is not equal returns FALSE
3==8
[1] FALSE
Check to see if 3 is not equal to 8, in this case 3 is not equal returns TRUE
3 != 8
[1] TRUE
Check to see if 3 is less than or equal to 8, this shows that 3 is less than 8 so it is TRUE.
3 <= 8
[1] TRUE
Logical operators Section: logical AND, | for logical OR, and ! for NOT.
Logical Conjuction (OR). FALSE OR FALSE returns a FALSE
FALSE | FALSE
[1] FALSE
Logical Conjuction (AND). A TRUE AND FALSE will be equal to FALSE.
TRUE & FALSE
[1] FALSE
Negation. If not FALSE is TRUE
! FALSE
[1] TRUE
Combination of statements. This can be 2 less than 2 OR 1 == 5, if one is true then it true, if both are true it is true but if both are FALSE then it is FALSE
2 < 3 | 1 == 5
[1] TRUE
Assigning Values to Variables
foo will hold the value of 2 + 2 which would be 4, the you multiply foo by 3 gives a result of 12
foo * 3
[1] 12
Use ls function to obtaine a list variables currently defined.
ls()
[1] "a" "anova_out" "anxiety_ak" "anxiety_hi" "assets.df" "b"
[7] "Batteries" "coffeeA" "coffeeB" "crop_out" "d" "data"
[13] "df" "DFAsg1" "dif" "domestic_rate" "e" "f"
[19] "file" "first_matrix" "flu_med" "flu_nomed" "foo" "foreign_rate"
[25] "g" "gardens" "growth" "h" "Is_x1_greater" "isWinnerTaller"
[31] "k" "metal_data" "myvector" "myvector1" "myvector1a" "myvector2"
[37] "myvector2a" "opponent" "pooledSD" "presid_name" "sample1" "sample2"
[43] "score_buli" "score_bull" "score_normal" "second_matrix" "spcoffe" "sumAB"
[49] "sumTotal" "temp_matrix" "test_matrix" "test_vector" "Two_Means_Ex1" "Two_Means_Ex2"
[55] "twoway_out" "winner" "x" "x1" "x2" "y"
[61] "year"
To remove a variable from the list, use rm = remove
Show list of variable to see if foo was removed.
ls()
[1] "a" "anova_out" "anxiety_ak" "anxiety_hi" "assets.df" "b"
[7] "Batteries" "coffeeA" "coffeeB" "crop_out" "d" "data"
[13] "df" "DFAsg1" "dif" "domestic_rate" "e" "f"
[19] "file" "first_matrix" "flu_med" "flu_nomed" "foreign_rate" "g"
[25] "gardens" "growth" "h" "Is_x1_greater" "isWinnerTaller" "k"
[31] "metal_data" "myvector" "myvector1" "myvector1a" "myvector2" "myvector2a"
[37] "opponent" "pooledSD" "presid_name" "sample1" "sample2" "score_buli"
[43] "score_bull" "score_normal" "second_matrix" "spcoffe" "sumAB" "sumTotal"
[49] "temp_matrix" "test_matrix" "test_vector" "Two_Means_Ex1" "Two_Means_Ex2" "twoway_out"
[55] "winner" "x" "x1" "x2" "y" "year"
Vectors
A vector is a sequence of elements that share the same data type.
Use the c() function as in concatenate or combine. bar will be the vector containing 2,5,10,2,1
Then to see the values in bar just type bar
bar
[1] 2 5 10 2 1
Here will create the vector baz with values 2,2,3,3,3
Then type baz to disply the vector.
baz
[1] 2 2 3 3 3
Use the replicate Function to replicate 2 5 times
rep(2,5)
[1] 2 2 2 2 2
Consecutive Numbers will give create a list of number in this case from 1 to 5
1:5
[1] 1 2 3 4 5
Sequence from 1 to 10 with a step by two or list numbers adding 2 to each number.
Example first number is 1 then 1 + 2 = 3, 3 is your next number and then 3 + 2 = 5, so next number is 5 etc..
seq(1,10,by=2)
[1] 1 3 5 7 9
Adding vectors in this case we will add the bar + baz vector, it will add 1st item 2 in bar to 1st items 2 in baz which is = to 4, then adds the second item in bar to second item in baz 5 + 2 = 7 etc..
bar + baz
[1] 4 7 13 5 4
Compare Vectors here we are compare 1st item in bar to 1st item in baz, the second item in bar to second item in baz, since item 1 in bar is 2 and item 1 in baz is 2 then returns TRUE, Item 1 in bar is 5 and Item 2 in baz is 2 then since they are not equal will return FALSE.
bar == baz
[1] TRUE FALSE FALSE FALSE FALSE
Find the length or size of the vector use length, there are 5 items in bar so 5 is returned.
length(bar)
[1] 5
Find the minium value in a vector. Looking for the minimum/smallest value bar which is 1 in this case.
min(bar)
[1] 1
Find the average or mean of a vector, in this case the average of bar is 4
mean(bar)
[1] 4
Access parts of a vector or recalling a value of the vector bar.
First we display the vector bar to recall what values bar holds.
bar
[1] 2 5 10 2 1
To recall a value from the vector bar we use bar brackets inside the brackets the position of the value you want to recall. This case we are recalling position 1 of the vector which 2.
bar[1]
[1] 2
To obtain the value of the last position we use length of bar which is the last position 5 and obtaining the value of the last position in bar. The value of the last position in the vector bar is 1.
bar[length(bar)]
[1] 1
Extract multiple values from a vector, sample would be the 2nd and 4th values of bar vector. Here we are extracting the values from the 2nd position, 3rd position and the 4th position in bar vector. Which is 5 , 10, 2.
bar[c(2,3,4)]
[1] 5 10 2
Vectors allow to store string values or logical values.
quxx
[1] "a" "b" "cde" "fg"
DATA FRAMES Section:
Data Frames are like spreadsheets, with rows as observation and columns as variables.
To Create a data frame, we use the data.frame() function.
Most often you be using data frames loaded from a file. Here we loaded the schoolsurvey from a web site and called it dat.
HOW TO MAKE A RANDOM SAMPLE
Select a random sample by using the sample() function.
Here we are going to randomly select 5 values between 1 and 10.
The first argument give the vector of data to select elements from 1:10
The second argument (size) gives the size of the sample(s) to select.
sample(1:10, size=5)
[1] 4 1 2 8 6
Taking a sample from a data frame is a little more complicated, having two steps
1. Use sample() to select a sample of size n from a vector of the row numbers of the data frame.
2. Use the index operator [ to selext those rows from the data frame.
Suppose we like to select a random sample of size 5. First, define a variable in this case n with the size of the sample, ie 5.
Now, select a sample of the size 5 from the vector with 1 to 10 (the number of rows in bar). Use the thection nrow(0) this will find the number of rows in bar instead of manually entering the number.
To Vreate a vector with all the integers between 1 and the number of row in bar use samplerows <- sample(1:nrow(bar), size=n)
To display/print sample rows
samplerows
[1] 10 6 9 8 7
The variable samplerows contains the rows of bar which make a randm sample from all the rows in bar.
Create a new data frame called barsample with a random sample of rows from bar.
Extract those rows from bar with the following command:
The same code above can be done in one line of code.
USING TABLES SECTION
The table commands table() to look at tables, Its simplest usage looks like table(x) where x is a categorical variable.
For example, a survey asks peple if the smoke or not. The data is
Yes, No, No, Yes, Yes
We can enter this into R with the c() command, and summarize with the table command as follows:
table(x)
x
No Yes
2 3
NUMERIC MEASURES OF CENTER AND SPREAD
Suppose, CEO yearly comensations are sampled and the following are found (in millions)
12.4, 5, 2, 50, 8, 3, 1, 4, 0.25
To get the means of sals
mean(sals)
[1] 8.565
To find the variance of sals
var(sals)
[1] 225.5145
Find the Standard Deviation of sals
sd(sals)
[1] 15.01714
Tukey’s five number summary, useful for boxplots
To obtain summary statistics for sals
summary(sals)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.250 1.250 3.500 8.565 7.250 50.000
HOW ABOUT THE MODE SECTION:
In R we can write our own functions, and a first example of a function is shown below in order to compute the mode of a vector of observations x.
Create a function to find the mode. i.e. most frequent value
ux[which.max(tabulate(match(x,ux)))]
Error: object 'ux' not found
Find the most frequent value in te vector baz by using function getMode.
getMode(baz)
[1] 3
LS0tDQp0aXRsZTogIkhhbmRvdXQgMSBCYXNpYyBDYWxjdWxhdGlvbnMgUiBOb3RlYm9vayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojIEFyaXRobWV0aWMgT3BlcmF0b3JzIFNlY3Rpb24NCiMgU3VidHJhY3Rpb24gDQoNCmBgYHtyfQ0KMi0zDQpgYGANCiMgRGl2aXNpb24NCmBgYHtyfQ0KMi8zDQpgYGANCiMgRXhwb25lbnRpYXRpb24NCmBgYHtyfQ0KMl4zDQpgYGANCiMgU3F1YXJlIFJvb3QNCmBgYHtyfQ0Kc3FydCgyKQ0KYGBgDQojbG9nYXJpdGhtcw0KYGBge3J9DQpsb2coMikNCmBgYA0KIyBSYXRpb25hbCBPcGVyYXRvcnMgc2VjdGlvbiBpcyB0byB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGxlc3MgdGhhbiwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsLg0KDQojIENoZWNraW5nIHRvIHNlZSBpZiAgMyBpcyBlcXVhbCB0byA4IHNpbmNlIGl0IGlzIG5vdCBlcXVhbCByZXR1cm5zIEZBTFNFDQpgYGB7cn0NCjMgPT0gOA0KYGBgDQojIENoZWNrIHRvIHNlZSBpZiAzIGlzIG5vdCBlcXVhbCB0byA4LCBpbiB0aGlzIGNhc2UgMyBpcyBub3QgZXF1YWwgcmV0dXJucyBUUlVFDQoNCmBgYHtyfQ0KMyAhPSA4DQpgYGANCiMgQ2hlY2sgdG8gc2VlIGlmIDMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDgsIHRoaXMgc2hvd3MgdGhhdCAzIGlzIGxlc3MgdGhhbiA4IHNvIGl0IGlzIFRSVUUuDQpgYGB7cn0NCjMgPD0gOA0KYGBgDQojIExvZ2ljYWwgb3BlcmF0b3JzIFNlY3Rpb246IGxvZ2ljYWwgQU5ELCB8IGZvciBsb2dpY2FsIE9SLCBhbmQgISBmb3IgTk9ULiANCg0KIyBMb2dpY2FsIENvbmp1Y3Rpb24gKE9SKS4gRkFMU0UgT1IgRkFMU0UgcmV0dXJucyBhIEZBTFNFDQpgYGB7cn0NCkZBTFNFIHwgRkFMU0UNCmBgYA0KIyBMb2dpY2FsIENvbmp1Y3Rpb24gKEFORCkuIEEgVFJVRSBBTkQgRkFMU0Ugd2lsbCBiZSBlcXVhbCB0byBGQUxTRS4NCg0KYGBge3J9DQpUUlVFICYgRkFMU0UNCmBgYA0KIyBOZWdhdGlvbi4gSWYgbm90IEZBTFNFIGlzIFRSVUUNCg0KYGBge3J9DQohIEZBTFNFDQpgYGANCiMgQ29tYmluYXRpb24gb2Ygc3RhdGVtZW50cy4gVGhpcyBjYW4gYmUgMiBsZXNzIHRoYW4gMiBPUiAxID09IDUsIGlmIG9uZSBpcyB0cnVlIHRoZW4gaXQgdHJ1ZSwgaWYgYm90aCBhcmUgdHJ1ZSBpdCBpcyB0cnVlIGJ1dCBpZiBib3RoIGFyZSBGQUxTRSB0aGVuIGl0IGlzIEZBTFNFDQpgYGB7cn0NCjIgPCAzIHwgMSA9PSA1DQpgYGANCiMgQXNzaWduaW5nIFZhbHVlcyB0byBWYXJpYWJsZXMNCg0KIyBmb28gd2lsbCBob2xkIHRoZSB2YWx1ZSBvZiAyICsgMiB3aGljaCB3b3VsZCBiZSA0LCB0aGUgeW91IG11bHRpcGx5IGZvbyBieSAzIGdpdmVzIGEgcmVzdWx0IG9mIDEyDQpgYGB7cn0NCmZvbyA8LSAyICsgMg0KZm9vICogMw0KYGBgDQojIFVzZSBscyBmdW5jdGlvbiB0byBvYnRhaW5lIGEgbGlzdCB2YXJpYWJsZXMgY3VycmVudGx5IGRlZmluZWQuDQpgYGB7cn0NCmxzKCkNCmBgYA0KIyBUbyByZW1vdmUgYSB2YXJpYWJsZSBmcm9tIHRoZSBsaXN0LCB1c2Ugcm0gPSByZW1vdmUNCmBgYHtyfQ0Kcm0oZm9vKQ0KYGBgDQoNCiMgU2hvdyBsaXN0IG9mIHZhcmlhYmxlIHRvIHNlZSBpZiBmb28gd2FzIHJlbW92ZWQuDQpgYGB7cn0NCmxzKCkNCmBgYA0KIyBWZWN0b3JzDQojIEEgdmVjdG9yIGlzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBkYXRhIHR5cGUuDQoNCiMgVXNlIHRoZSBjKCkgZnVuY3Rpb24gYXMgaW4gY29uY2F0ZW5hdGUgb3IgY29tYmluZS4gYmFyIHdpbGwgYmUgdGhlIHZlY3RvciBjb250YWluaW5nIDIsNSwxMCwyLDENCiMgVGhlbiB0byBzZWUgdGhlIHZhbHVlcyBpbiBiYXIganVzdCB0eXBlIGJhcg0KYGBge3J9DQpiYXIgPC0gYygyLDUsMTAsMiwxKQ0KYmFyDQpgYGANCiMgSGVyZSB3aWxsIGNyZWF0ZSB0aGUgdmVjdG9yIGJheiB3aXRoIHZhbHVlcyAyLDIsMywzLDMNCiMgVGhlbiB0eXBlIGJheiB0byBkaXNwbHkgdGhlIHZlY3Rvci4NCg0KYGBge3J9DQpiYXogPC0gYygyLDIsMywzLDMpDQpiYXoNCmBgYA0KIyBVc2UgdGhlIHJlcGxpY2F0ZSBGdW5jdGlvbiB0byByZXBsaWNhdGUgMiA1IHRpbWVzDQpgYGB7cn0NCnJlcCgyLDUpDQpgYGANCiMgQ29uc2VjdXRpdmUgTnVtYmVycyB3aWxsIGdpdmUgY3JlYXRlIGEgbGlzdCBvZiBudW1iZXIgaW4gdGhpcyBjYXNlIGZyb20gMSB0byA1DQpgYGB7cn0NCjE6NQ0KYGBgDQojIFNlcXVlbmNlIGZyb20gMSB0byAxMCB3aXRoIGEgc3RlcCBieSB0d28gb3IgbGlzdCBudW1iZXJzIGFkZGluZyAyIHRvIGVhY2ggbnVtYmVyLg0KIyBFeGFtcGxlIGZpcnN0IG51bWJlciBpcyAxIHRoZW4gMSArIDIgPSAzLCAzIGlzIHlvdXIgbmV4dCBudW1iZXIgYW5kIHRoZW4gMyArIDIgPSA1LCBzbyBuZXh0IG51bWJlciBpcyA1IGV0Yy4uDQpgYGB7cn0NCnNlcSgxLDEwLGJ5PTIpDQpgYGANCiMgQWRkaW5nIHZlY3RvcnMgaW4gdGhpcyBjYXNlIHdlIHdpbGwgYWRkIHRoZSBiYXIgKyBiYXogdmVjdG9yLCBpdCB3aWxsIGFkZCAxc3QgaXRlbSAyIGluIGJhciB0byAxc3QgaXRlbXMgMiBpbiBiYXogd2hpY2ggaXMgPSB0byA0LCB0aGVuIGFkZHMgdGhlIHNlY29uZCBpdGVtIGluIGJhciB0byBzZWNvbmQgaXRlbSBpbiBiYXogNSArIDIgPSA3IGV0Yy4uDQoNCmBgYHtyfQ0KYmFyICsgYmF6DQpgYGANCiMgQ29tcGFyZSBWZWN0b3JzIGhlcmUgd2UgYXJlIGNvbXBhcmUgMXN0IGl0ZW0gaW4gYmFyIHRvIDFzdCBpdGVtIGluIGJheiwgdGhlIHNlY29uZCBpdGVtIGluIGJhciB0byBzZWNvbmQgaXRlbSBpbiBiYXosIHNpbmNlIGl0ZW0gMSBpbiBiYXIgaXMgMiBhbmQgaXRlbSAxIGluIGJheiBpcyAyIHRoZW4gcmV0dXJucyBUUlVFLCBJdGVtIDEgaW4gYmFyIGlzIDUgYW5kIEl0ZW0gMiBpbiBiYXogaXMgMiB0aGVuIHNpbmNlIHRoZXkgYXJlIG5vdCBlcXVhbCB3aWxsIHJldHVybiBGQUxTRS4NCmBgYHtyfQ0KYmFyID09IGJheg0KYGBgDQojIEZpbmQgdGhlIGxlbmd0aCBvciBzaXplIG9mIHRoZSB2ZWN0b3IgdXNlIGxlbmd0aCwgdGhlcmUgYXJlIDUgaXRlbXMgaW4gYmFyIHNvIDUgaXMgcmV0dXJuZWQuDQpgYGB7cn0NCmxlbmd0aChiYXIpDQpgYGANCiMgRmluZCB0aGUgbWluaXVtIHZhbHVlIGluIGEgdmVjdG9yLiBMb29raW5nIGZvciB0aGUgbWluaW11bS9zbWFsbGVzdCB2YWx1ZSBiYXIgd2hpY2ggaXMgMSBpbiB0aGlzIGNhc2UuDQpgYGB7cn0NCm1pbihiYXIpDQpgYGANCiMgRmluZCB0aGUgYXZlcmFnZSBvciBtZWFuIG9mIGEgdmVjdG9yLCBpbiB0aGlzIGNhc2UgdGhlIGF2ZXJhZ2Ugb2YgYmFyIGlzIDQNCmBgYHtyfQ0KbWVhbihiYXIpDQpgYGANCiMgQWNjZXNzIHBhcnRzIG9mIGEgdmVjdG9yIG9yIHJlY2FsbGluZyBhIHZhbHVlIG9mIHRoZSB2ZWN0b3IgYmFyLg0KIyBGaXJzdCB3ZSBkaXNwbGF5IHRoZSB2ZWN0b3IgYmFyIHRvIHJlY2FsbCB3aGF0IHZhbHVlcyBiYXIgaG9sZHMuDQpgYGB7cn0NCmJhcg0KYGBgDQojIFRvIHJlY2FsbCBhIHZhbHVlIGZyb20gdGhlIHZlY3RvciBiYXIgd2UgdXNlIGJhciBicmFja2V0cyBpbnNpZGUgdGhlIGJyYWNrZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcmVjYWxsLiBUaGlzIGNhc2Ugd2UgYXJlIHJlY2FsbGluZyBwb3NpdGlvbiAxIG9mIHRoZSB2ZWN0b3Igd2hpY2ggMi4NCmBgYHtyfQ0KYmFyWzFdDQpgYGANCiMgVG8gb2J0YWluIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBwb3NpdGlvbiB3ZSB1c2UgbGVuZ3RoIG9mIGJhciB3aGljaCBpcyB0aGUgbGFzdCBwb3NpdGlvbiA1IGFuZCBvYnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IHBvc2l0aW9uIGluIGJhci4gVGhlIHZhbHVlIG9mIHRoZSBsYXN0IHBvc2l0aW9uIGluIHRoZSB2ZWN0b3IgYmFyIGlzIDEuDQpgYGB7cn0NCmJhcltsZW5ndGgoYmFyKV0NCmBgYA0KIyBFeHRyYWN0IG11bHRpcGxlIHZhbHVlcyBmcm9tIGEgdmVjdG9yLCBzYW1wbGUgd291bGQgYmUgdGhlIDJuZCBhbmQgNHRoIHZhbHVlcyBvZiBiYXIgdmVjdG9yLiBIZXJlIHdlIGFyZSBleHRyYWN0aW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgMm5kIHBvc2l0aW9uLCAzcmQgcG9zaXRpb24gYW5kIHRoZSA0dGggcG9zaXRpb24gaW4gYmFyIHZlY3Rvci4gV2hpY2ggaXMgNSAsIDEwLCAyLg0KYGBge3J9DQpiYXJbYygyLDMsNCldDQpgYGANCiMgVmVjdG9ycyBhbGxvdyB0byBzdG9yZSBzdHJpbmcgdmFsdWVzIG9yIGxvZ2ljYWwgdmFsdWVzLg0KYGBge3J9DQpxdXh4IDwtIGMoImEiLCJiIiwiY2RlIiwiZmciKQ0KcXV4eA0KYGBgDQojIERBVEEgRlJBTUVTIFNlY3Rpb246DQojIERhdGEgRnJhbWVzIGFyZSBsaWtlIHNwcmVhZHNoZWV0cywgd2l0aCByb3dzIGFzIG9ic2VydmF0aW9uIGFuZCBjb2x1bW5zIGFzIHZhcmlhYmxlcy4NCiMgVG8gQ3JlYXRlIGEgZGF0YSBmcmFtZSwgd2UgdXNlIHRoZSBkYXRhLmZyYW1lKCkgZnVuY3Rpb24uDQoNCmBgYHtyfQ0KZGF0YS5mcmFtZShmb28gPSBjKDEsMiwzKSwNCiAgICAgICAgICAgYmFyID0gYygiYSIsImIiLCJjIiksDQogICAgICAgICAgIGJheiA9IGMoMS41LDIuNSwzKSkNCmBgYA0KDQojIE1vc3Qgb2Z0ZW4geW91IGJlIHVzaW5nIGRhdGEgZnJhbWVzIGxvYWRlZCBmcm9tIGEgZmlsZS4gSGVyZSB3ZSBsb2FkZWQgdGhlIHNjaG9vbHN1cnZleSBmcm9tIGEgd2ViIHNpdGUgYW5kIGNhbGxlZCBpdCBkYXQuDQpgYGB7cn0NCmRhdCA8LSByZWFkLmNzdigiaHR0cDovL3d3dzIuaGF3YWlpLmVkdS9+Z2VvcmdlaGEvSGFuZG91dHMvU2Nob29sU3VydmV5LmNzdiIpDQpkYXQNCmBgYA0KDQojIEhPVyBUTyBNQUtFIEEgUkFORE9NIFNBTVBMRQ0KIyBTZWxlY3QgYSByYW5kb20gc2FtcGxlIGJ5IHVzaW5nIHRoZSBzYW1wbGUoKSBmdW5jdGlvbi4NCiMgSGVyZSB3ZSBhcmUgZ29pbmcgdG8gcmFuZG9tbHkgc2VsZWN0IDUgdmFsdWVzIGJldHdlZW4gMSBhbmQgMTAuDQojIFRoZSBmaXJzdCBhcmd1bWVudCBnaXZlIHRoZSB2ZWN0b3Igb2YgZGF0YSB0byBzZWxlY3QgZWxlbWVudHMgZnJvbSAxOjEwDQojIFRoZSBzZWNvbmQgYXJndW1lbnQgKHNpemUpIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUocykgdG8gc2VsZWN0Lg0KDQoNCmBgYHtyfQ0Kc2FtcGxlKDE6MTAsIHNpemU9NSkNCmBgYA0KIyBUYWtpbmcgYSBzYW1wbGUgZnJvbSBhIGRhdGEgZnJhbWUgaXMgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZCwgaGF2aW5nIHR3byBzdGVwcw0KIyAxLiBVc2Ugc2FtcGxlKCkgdG8gc2VsZWN0IGEgc2FtcGxlIG9mIHNpemUgbiBmcm9tIGEgdmVjdG9yIG9mIHRoZSByb3cgbnVtYmVycyBvZiB0aGUgZGF0YSBmcmFtZS4NCiMgMi4gVXNlIHRoZSBpbmRleCBvcGVyYXRvciBbIHRvIHNlbGV4dCB0aG9zZSByb3dzIGZyb20gdGhlIGRhdGEgZnJhbWUuDQpgYGB7cn0NCmJhciA8LSBkYXRhLmZyYW1lKHZhcjEgPSBMRVRURVJTWzE6MTBdLCB2YXIyID0gMToxMCkNCmBgYA0KDQojIENoZWNrIHRoZSBkYXRhIGZyYW1lIGJhcg0KYGBge3J9DQpiYXINCmBgYA0KDQojIFN1cHBvc2Ugd2UgbGlrZSB0byBzZWxlY3QgYSByYW5kb20gc2FtcGxlIG9mIHNpemUgNS4gRmlyc3QsIGRlZmluZSBhIHZhcmlhYmxlIGluIHRoaXMgY2FzZSBuIHdpdGggdGhlIHNpemUgb2YgdGhlIHNhbXBsZSwgaWUgNS4NCmBgYHtyfQ0KbiA8LSA1DQpgYGANCg0KIyBOb3csIHNlbGVjdCBhIHNhbXBsZSBvZiB0aGUgc2l6ZSA1IGZyb20gdGhlIHZlY3RvciB3aXRoIDEgdG8gMTAgKHRoZSBudW1iZXIgb2Ygcm93cyBpbiBiYXIpLiBVc2UgdGhlIHRoZWN0aW9uIG5yb3coMCkgdGhpcyB3aWxsIGZpbmQgdGhlIG51bWJlciBvZiByb3dzIGluIGJhciBpbnN0ZWFkIG9mIG1hbnVhbGx5IGVudGVyaW5nIHRoZSBudW1iZXIuDQoNCiMgVG8gVnJlYXRlIGEgdmVjdG9yIHdpdGggYWxsIHRoZSBpbnRlZ2VycyBiZXR3ZWVuIDEgYW5kIHRoZSBudW1iZXIgb2Ygcm93IGluIGJhciB1c2Ugc2FtcGxlcm93cyA8LSBzYW1wbGUoMTpucm93KGJhciksIHNpemU9bikNCmBgYHtyfQ0Kc2FtcGxlcm93cyA8LSBzYW1wbGUoMTpucm93KGJhciksIHNpemU9bikNCmBgYA0KDQojIFRvIGRpc3BsYXkvcHJpbnQgc2FtcGxlIHJvd3MNCg0KYGBge3J9DQpzYW1wbGVyb3dzDQpgYGANCiMgVGhlIHZhcmlhYmxlIHNhbXBsZXJvd3MgY29udGFpbnMgdGhlIHJvd3Mgb2YgYmFyIHdoaWNoIG1ha2UgYSByYW5kbSBzYW1wbGUgZnJvbSBhbGwgdGhlIHJvd3MgaW4gYmFyLg0KIyBDcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSBjYWxsZWQgYmFyc2FtcGxlIHdpdGggYSByYW5kb20gc2FtcGxlIG9mIHJvd3MgZnJvbSBiYXIuDQojIEV4dHJhY3QgdGhvc2Ugcm93cyBmcm9tIGJhciB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoNCiMgRXh0cmFjdCByb3dzDQpgYGB7cn0NCmJhcnNhbXBsZSA8LSBiYXJbc2FtcGxlcm93cyxdDQpgYGANCg0KIyBQcmludCBiYXJzYW1wbGUNCmBgYHtyfQ0KcHJpbnQoYmFyc2FtcGxlKQ0KYGBgDQojIFRoZSBzYW1lIGNvZGUgYWJvdmUgY2FuIGJlIGRvbmUgaW4gb25lIGxpbmUgb2YgY29kZS4NCg0KYGBge3J9DQpiYXJbc2FtcGxlKDE6bnJvdyhiYXIpLCBuKSxdDQpgYGANCiMgVVNJTkcgVEFCTEVTIFNFQ1RJT04NCiMgVGhlIHRhYmxlIGNvbW1hbmRzIHRhYmxlKCkgdG8gbG9vayBhdCB0YWJsZXMsIEl0cyBzaW1wbGVzdCB1c2FnZSBsb29rcyBsaWtlIHRhYmxlKHgpIHdoZXJlIHggaXMgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZS4NCiMgRm9yIGV4YW1wbGUsIGEgc3VydmV5IGFza3MgcGVwbGUgaWYgdGhlIHNtb2tlIG9yIG5vdC4gVGhlIGRhdGEgaXMgDQojIFllcywgTm8sIE5vLCBZZXMsIFllcw0KIyBXZSBjYW4gZW50ZXIgdGhpcyBpbnRvIFIgd2l0aCB0aGUgYygpIGNvbW1hbmQsIGFuZCBzdW1tYXJpemUgd2l0aCB0aGUgdGFibGUgY29tbWFuZCBhcyBmb2xsb3dzOg0KYGBge3J9DQp4IDwtIGMoIlllcyIsICJObyIsICJObyIsICJZZXMiLCAiWWVzIikNCnRhYmxlKHgpDQpgYGANCiMgTlVNRVJJQyBNRUFTVVJFUyBPRiBDRU5URVIgQU5EIFNQUkVBRA0KIyBTdXBwb3NlLCBDRU8geWVhcmx5IGNvbWVuc2F0aW9ucyBhcmUgc2FtcGxlZCBhbmQgdGhlIGZvbGxvd2luZyBhcmUgZm91bmQgKGluIG1pbGxpb25zKQ0KIyAxMi40LCA1LCAyLCA1MCwgOCwgMywgMSwgNCwgMC4yNQ0KYGBge3J9DQpzYWxzIDwtIGMoMTIsIC40LCA1LCAyLCA1MCwgOCwgMywgMSwgNCwgMC4yNSkNCmBgYA0KDQojIFRvIGdldCB0aGUgbWVhbnMgb2Ygc2Fscw0KYGBge3J9DQptZWFuKHNhbHMpDQpgYGANCiMgVG8gZmluZCB0aGUgdmFyaWFuY2Ugb2Ygc2Fscw0KYGBge3J9DQp2YXIoc2FscykNCmBgYA0KIyBGaW5kIHRoZSBTdGFuZGFyZCBEZXZpYXRpb24gb2Ygc2Fscw0KYGBge3J9DQpzZChzYWxzKQ0KYGBgDQojIEZpbmQgdGhlIG1lZGlhbiBvZiBzYWxzDQpgYGB7cn0NCm1lZGlhbihzYWxzKQ0KYGBgDQojIFR1a2V5J3MgZml2ZSBudW1iZXIgIHN1bW1hcnksIHVzZWZ1bCBmb3IgYm94cGxvdHMNCiMgRml2ZSBudW1iZXJzOiBtaW4sIGxvd2VyIGhpbmdlLCBtZWRpYW4sIHVwcGVyIGhpbmdlLCBtYXgNCg0KYGBge3J9DQpmaXZlbnVtKHNhbHMpDQpgYGANCiMgVG8gb2J0YWluIHN1bW1hcnkgc3RhdGlzdGljcyBmb3Igc2Fscw0KYGBge3J9DQpzdW1tYXJ5KHNhbHMpDQpgYGANCiMgSE9XIEFCT1VUIFRIRSBNT0RFIFNFQ1RJT046DQojIEluIFIgd2UgY2FuIHdyaXRlIG91ciBvd24gZnVuY3Rpb25zLCBhbmQgYSBmaXJzdCBleGFtcGxlIG9mIGEgZnVuY3Rpb24gaXMgc2hvd24gYmVsb3cgaW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgbW9kZSBvZiBhIHZlY3RvciBvZiBvYnNlcnZhdGlvbnMgeC4NCiMgQ3JlYXRlIGEgZnVuY3Rpb24gdG8gZmluZCB0aGUgbW9kZS4gaS5lLiBtb3N0IGZyZXF1ZW50IHZhbHVlDQpgYGB7cn0NCmdldE1vZGUgPC0gZnVuY3Rpb24oeCl7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCx1eCkpKV0NCn0NCmBgYA0KDQojIEZpbmQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUgaW4gdGUgdmVjdG9yIGJheiBieSB1c2luZyBmdW5jdGlvbiBnZXRNb2RlLg0KYGBge3J9DQpnZXRNb2RlKGJheikNCmBgYA0KDQo=