A. Creating Vectors

In this section, you are expected to be able to shape data in vectors, perform basic mathematical operations, and also manipulate vectors.

Exercise 1

Create a vector A containing numeric values, starting from the last 2 digits of your student id up to 30.

A<-c(14:30)
A
##  [1] 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Exercise 2

Create a vector B containing 12 character values; all names of your classmate including yourself.

    B<-c("Julian","Vanessa","Nikita","Jocelyn","Kefas","Ardifo","Sherly","Putri","Siana","Jeffry","Fallen","Lala")
B
##  [1] "Julian"  "Vanessa" "Nikita"  "Jocelyn" "Kefas"   "Ardifo"  "Sherly" 
##  [8] "Putri"   "Siana"   "Jeffry"  "Fallen"  "Lala"

Exercise 3

Create a vector C containing 12 numeric values, random number between 60 and 100.

    C<-runif(12,60,100)
C
##  [1] 80.61245 89.97707 89.07357 86.57642 82.57597 99.34819 76.92672 60.91355
##  [9] 96.52706 77.44456 86.81054 76.44031

B. Creating Matrices

In this section, you are expected to be able to shape data in Matrices, perform basic mathematical operations, and also manipulate Matrices.

Exercise 4

Create a matrices M1 order by \(rows \times columns \space (4 \times 4)\) containing 16 numeric values, random number between 60 and 100.

    d<-runif(16,60,100)
M1<-matrix(d,nrow=4,ncol=4)
M1
##          [,1]     [,2]     [,3]     [,4]
## [1,] 79.83350 86.89926 83.91380 98.74612
## [2,] 61.57536 66.26130 72.97581 89.35969
## [3,] 76.61996 81.82570 84.40950 83.98317
## [4,] 76.75686 74.27144 63.71366 68.24953

Exercise 5

Create a matrices M2 order by \(rows \times columns \space (4 \times 4)\) containing 16 numeric values, random number between 30 and 60. Find out the following tasks:

  • 3 * M1, give your opinion about the result.
  • M1 + M2, give your opinion about the result.
  • M1 - M2, give your opinion about the result.
  • M1 * M2, give your opinion about the result.
  • M1 / M2, give your opinion about the result.
  • determinan of M1, give your opinion about the result.
  • invers of M1, give your opinion about the result.
d<-runif(16,30,60)
M2<-matrix(d,nrow=4,ncol=4)
M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 45.86164 37.83447 56.83944 58.47246
## [2,] 54.97339 55.93345 44.34845 37.92817
## [3,] 52.56777 40.47395 49.73782 38.57957
## [4,] 46.46820 56.94110 57.01691 54.73341
3*M1                    # M1 multiply by 3
##          [,1]     [,2]     [,3]     [,4]
## [1,] 239.5005 260.6978 251.7414 296.2384
## [2,] 184.7261 198.7839 218.9274 268.0791
## [3,] 229.8599 245.4771 253.2285 251.9495
## [4,] 230.2706 222.8143 191.1410 204.7486
M1+M2                   # M1 plus M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 125.6951 124.7337 140.7532 157.2186
## [2,] 116.5487 122.1947 117.3243 127.2879
## [3,] 129.1877 122.2996 134.1473 122.5627
## [4,] 123.2251 131.2125 120.7306 122.9829
M1-M2                   # M1 minus M2
##           [,1]     [,2]      [,3]     [,4]
## [1,] 33.971860 49.06479 27.074363 40.27367
## [2,]  6.601971 10.32785 28.627357 51.43152
## [3,] 24.052197 41.35175 34.671682 45.40360
## [4,] 30.288659 17.33034  6.696746 13.51612
M1*M2                   # M1 multiplied by M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 3661.295 3287.788 4769.613 5773.929
## [2,] 3385.006 3706.223 3236.364 3389.250
## [3,] 4027.741 3311.809 4198.345 3240.035
## [4,] 3566.753 4229.097 3632.756 3735.530
M1/M2                   # M1 divided by M2
##          [,1]     [,2]     [,3]     [,4]
## [1,] 1.740747 2.296828 1.476331 1.688763
## [2,] 1.120094 1.184645 1.645510 2.356024
## [3,] 1.457546 2.021688 1.697089 2.176882
## [4,] 1.651815 1.304356 1.117452 1.246944
det(M1)                 # Determinant of M1
## [1] 121744.4
library(matlib)
inv(M1)                 # Inverse of M1
##             [,1]        [,2]        [,3]        [,4]
## [1,] -0.16037287  0.11359938 -0.02324926  0.11190611
## [2,]  0.23550530 -0.18782009 -0.00237027 -0.09190726
## [3,] -0.10095159  0.03806419  0.09366849 -0.01903900
## [4,]  0.01832094  0.04109812 -0.05871658  0.00658711

Exercise 6

Create a matrix data by column that is contain the following vectors:

  • B that you has been created in the exercise 2. Name it as a ‘names’ variable
  • C that you has been created in the exercise 3. Name it as a ‘scores’ variable.
names<-B
scores<-C
data<-cbind(names,scores)
data
##       names     scores            
##  [1,] "Julian"  "80.6124451942742"
##  [2,] "Vanessa" "89.9770676903427"
##  [3,] "Nikita"  "89.0735739935189"
##  [4,] "Jocelyn" "86.5764235518873"
##  [5,] "Kefas"   "82.5759704783559"
##  [6,] "Ardifo"  "99.3481901660562"
##  [7,] "Sherly"  "76.9267243985087"
##  [8,] "Putri"   "60.913552949205" 
##  [9,] "Siana"   "96.5270642377436"
## [10,] "Jeffry"  "77.4445585533977"
## [11,] "Fallen"  "86.8105422984809"
## [12,] "Lala"    "76.4403099846095"

C. Lists

In this section, you are expected to be able to shape data by using the list() function, perform some basic manipulations.

Exercise 7

Please create a data set as the List variable by using the list() function, contain the following vectors:

  • a variable name, the values including your classmate and yourself
  • a variable age, the values including your classmate and yourself
  • a variable gender, the values including your classmate and yourself
name<-c("vanessa","Julian","Putri","Sherly","Lala","Siana","Jocelyn","Kefas","Fallen","Sofia","Nikita","jeffry","Ardifo")
age<-c(18,19,18,19,19,19,19,19,21,20,18,19,19)
gender<-c("female","male","female","female","female","female","female","male","male","female","female","female","female")
list<-list(name,age,gender)
list
## [[1]]
##  [1] "vanessa" "Julian"  "Putri"   "Sherly"  "Lala"    "Siana"   "Jocelyn"
##  [8] "Kefas"   "Fallen"  "Sofia"   "Nikita"  "jeffry"  "Ardifo" 
## 
## [[2]]
##  [1] 18 19 18 19 19 19 19 19 21 20 18 19 19
## 
## [[3]]
##  [1] "female" "male"   "female" "female" "female" "female" "female" "male"  
##  [9] "male"   "female" "female" "female" "female"

D. Factors

In this section, you are expected to be able to shape data by using the factor() function, perform some basic manipulations.

Exercise 8

Please create a data set as the Factor variable as you have done at Exercise 7. Here, you add one more variable called marital_status by using the factor() function, as the following code:

marital_status <- factor(c("yes","no","yes","no", until 12 students))
marital_status <- factor(c("no","no","no","no", "no", "no", "no", "no", "no", "no", "no", "no"))
marital_status
##  [1] no no no no no no no no no no no no
## Levels: no

E. Data Frames

In this section, you are expected to be able to shape data by using the data.frame() function, perform some basic manipulations.

Exercise 9

Please create a data set as the DF1 variable, contain the following vectors:

  • id, assume 1 up to 6
  • name the values according to your classmate and yourself
  • gender the values according to your classmate and yourself
  • age the values according to your classmate and yourself
  • marital_status the values according to your classmate and yourself
  • address_by_city the values according to your classmate and yourself
DF1<-data.frame(id=c(1:6),name=c("Julian","Nikita","Vanessa","Jocelyn","Sherly","Putri"),gender=c("male","female","female","female","female","female"),age=c(19,18,18,19,19,18),marital_status=c("single","single","single","single","single","single"),address_by_city=c("Tangerang","Tangerang","Manado","Tangerang","Tangerang","Tangerang"), stringsAsFactors = F)
DF1
##   id    name gender age marital_status address_by_city
## 1  1  Julian   male  19         single       Tangerang
## 2  2  Nikita female  18         single       Tangerang
## 3  3 Vanessa female  18         single          Manado
## 4  4 Jocelyn female  19         single       Tangerang
## 5  5  Sherly female  19         single       Tangerang
## 6  6   Putri female  18         single       Tangerang

Please create a data set as the DF2 variable, contain the following vectors:

  • id, assume 7 up to 12
  • name the values according to your classmate and yourself
  • gender the values according to your classmate and yourself
  • age the values according to your classmate and yourself
  • marital_status the values according to your classmate and yourself
  • address_by_city the values according to your classmate and yourself
DF2<-data.frame(id=c(7:12),name=c("Fallen","Sofia","Lala","Jeffry","Kefas","Ardifo"),gender=c("male","female","female","male","female","female"),age=c(21,20,19,19,19,19),marital_status=c("single","single","single","single","single","single"),address_by_city=c("Tangerang","Tangerang","Tangerang","Tangerang","Tangerang","Tangerang"), stringsAsFactors = F)
DF2
##   id   name gender age marital_status address_by_city
## 1  7 Fallen   male  21         single       Tangerang
## 2  8  Sofia female  20         single       Tangerang
## 3  9   Lala female  19         single       Tangerang
## 4 10 Jeffry   male  19         single       Tangerang
## 5 11  Kefas female  19         single       Tangerang
## 6 12 Ardifo female  19         single       Tangerang

Exercise 10

In this final exercise, please consider the following tasks:

  • Combine DF1 and DF2, assign it as SB19 variable!
DF3<-rbind(DF1,DF2)
SB19<-DF3
SB19
##    id    name gender age marital_status address_by_city
## 1   1  Julian   male  19         single       Tangerang
## 2   2  Nikita female  18         single       Tangerang
## 3   3 Vanessa female  18         single          Manado
## 4   4 Jocelyn female  19         single       Tangerang
## 5   5  Sherly female  19         single       Tangerang
## 6   6   Putri female  18         single       Tangerang
## 7   7  Fallen   male  21         single       Tangerang
## 8   8   Sofia female  20         single       Tangerang
## 9   9    Lala female  19         single       Tangerang
## 10 10  Jeffry   male  19         single       Tangerang
## 11 11   Kefas female  19         single       Tangerang
## 12 12  Ardifo female  19         single       Tangerang
  • Print the result of data frame SB19!
print(SB19)
##    id    name gender age marital_status address_by_city
## 1   1  Julian   male  19         single       Tangerang
## 2   2  Nikita female  18         single       Tangerang
## 3   3 Vanessa female  18         single          Manado
## 4   4 Jocelyn female  19         single       Tangerang
## 5   5  Sherly female  19         single       Tangerang
## 6   6   Putri female  18         single       Tangerang
## 7   7  Fallen   male  21         single       Tangerang
## 8   8   Sofia female  20         single       Tangerang
## 9   9    Lala female  19         single       Tangerang
## 10 10  Jeffry   male  19         single       Tangerang
## 11 11   Kefas female  19         single       Tangerang
## 12 12  Ardifo female  19         single       Tangerang
  • Print first 3 rows of the SB19 dataset!
head(SB19,3)
##   id    name gender age marital_status address_by_city
## 1  1  Julian   male  19         single       Tangerang
## 2  2  Nikita female  18         single       Tangerang
## 3  3 Vanessa female  18         single          Manado
  • How can you preview the SB19 dataset like an Excel file on your Rstudio?
View(SB19)
  • Review the structure of the data frame SB19!
str(SB19)
## 'data.frame':    12 obs. of  6 variables:
##  $ id             : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ name           : chr  "Julian" "Nikita" "Vanessa" "Jocelyn" ...
##  $ gender         : chr  "male" "female" "female" "female" ...
##  $ age            : num  19 18 18 19 19 18 21 20 19 19 ...
##  $ marital_status : chr  "single" "single" "single" "single" ...
##  $ address_by_city: chr  "Tangerang" "Tangerang" "Manado" "Tangerang" ...
  • Check the dimension of the data.
dim(SB19)
## [1] 12  6
  • Please apply piping functions to the data frame SB19, filter it by their gender accordingly! (as you have learn last week)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
male<-SB19%>%filter(gender=="male")%>%print()
##   id   name gender age marital_status address_by_city
## 1  1 Julian   male  19         single       Tangerang
## 2  7 Fallen   male  21         single       Tangerang
## 3 10 Jeffry   male  19         single       Tangerang
female<-SB19%>%filter(gender=="female")%>%print()
##   id    name gender age marital_status address_by_city
## 1  2  Nikita female  18         single       Tangerang
## 2  3 Vanessa female  18         single          Manado
## 3  4 Jocelyn female  19         single       Tangerang
## 4  5  Sherly female  19         single       Tangerang
## 5  6   Putri female  18         single       Tangerang
## 6  8   Sofia female  20         single       Tangerang
## 7  9    Lala female  19         single       Tangerang
## 8 11   Kefas female  19         single       Tangerang
## 9 12  Ardifo female  19         single       Tangerang
LS0tDQp0aXRsZTogIkxhYjM6IFIgQmFzaWNzIg0KYXV0aG9yOiAiVmFuZXNzYSBTdXBpdCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgTG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICc0MCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vZ2l0aHViLmNvbS9CYWt0aS1TaXJlZ2FyL2ltYWdlcy9ibG9iL21hc3Rlci9sb2dvLnBuZz9yYXc9dHJ1ZSIpDQpgYGANCg0KIyMgQS4gQ3JlYXRpbmcgVmVjdG9ycyANCg0KSW4gdGhpcyBzZWN0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gc2hhcGUgZGF0YSBpbiB2ZWN0b3JzLCBwZXJmb3JtIGJhc2ljIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zLCBhbmQgYWxzbyBtYW5pcHVsYXRlIHZlY3RvcnMuDQoNCiMjIyBFeGVyY2lzZSAxDQoNCkNyZWF0ZSBhIHZlY3RvciBgQWAgY29udGFpbmluZyBudW1lcmljIHZhbHVlcywgc3RhcnRpbmcgZnJvbSB0aGUgbGFzdCAyIGRpZ2l0cyBvZiB5b3VyIHN0dWRlbnQgaWQgdXAgdG8gMzAuDQoNCmBgYHtyfQ0KQTwtYygxNDozMCkNCkENCmBgYA0KDQojIyMgRXhlcmNpc2UgMg0KDQpDcmVhdGUgYSB2ZWN0b3IgYEJgIGNvbnRhaW5pbmcgMTIgY2hhcmFjdGVyIHZhbHVlczsgYWxsIG5hbWVzIG9mIHlvdXIgY2xhc3NtYXRlIGluY2x1ZGluZyB5b3Vyc2VsZi4NCg0KYGBge3J9DQogICAgQjwtYygiSnVsaWFuIiwiVmFuZXNzYSIsIk5pa2l0YSIsIkpvY2VseW4iLCJLZWZhcyIsIkFyZGlmbyIsIlNoZXJseSIsIlB1dHJpIiwiU2lhbmEiLCJKZWZmcnkiLCJGYWxsZW4iLCJMYWxhIikNCkINCmBgYA0KDQojIyMgRXhlcmNpc2UgMw0KDQpDcmVhdGUgYSB2ZWN0b3IgIGBDYCBjb250YWluaW5nIDEyIG51bWVyaWMgdmFsdWVzLCByYW5kb20gbnVtYmVyIGJldHdlZW4gNjAgYW5kIDEwMC4NCg0KYGBge3J9DQogICAgQzwtcnVuaWYoMTIsNjAsMTAwKQ0KQw0KDQpgYGANCg0KDQojIyBCLiBDcmVhdGluZyBNYXRyaWNlcyANCg0KSW4gdGhpcyBzZWN0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gc2hhcGUgZGF0YSBpbiBNYXRyaWNlcywgcGVyZm9ybSBiYXNpYyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucywgYW5kIGFsc28gbWFuaXB1bGF0ZSBNYXRyaWNlcy4NCg0KDQojIyMgRXhlcmNpc2UgNA0KDQpDcmVhdGUgYSBtYXRyaWNlcyBgTTFgIG9yZGVyIGJ5ICRyb3dzIFx0aW1lcyBjb2x1bW5zIFxzcGFjZSAoNCBcdGltZXMgNCkkIGNvbnRhaW5pbmcgMTYgbnVtZXJpYyB2YWx1ZXMsIHJhbmRvbSBudW1iZXIgYmV0d2VlbiA2MCBhbmQgMTAwLg0KDQpgYGB7cn0NCiAgICBkPC1ydW5pZigxNiw2MCwxMDApDQpNMTwtbWF0cml4KGQsbnJvdz00LG5jb2w9NCkNCk0xDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgNQ0KDQpDcmVhdGUgYSBtYXRyaWNlcyBgTTJgIG9yZGVyIGJ5ICRyb3dzIFx0aW1lcyBjb2x1bW5zIFxzcGFjZSAoNCBcdGltZXMgNCkkIGNvbnRhaW5pbmcgMTYgbnVtZXJpYyB2YWx1ZXMsIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAzMCBhbmQgNjAuIEZpbmQgb3V0IHRoZSBmb2xsb3dpbmcgdGFza3M6DQoNCiogYDMgKiBNMWAsIGdpdmUgeW91ciBvcGluaW9uIGFib3V0IHRoZSByZXN1bHQuIA0KKiBgTTEgKyBNMmAsIGdpdmUgeW91ciBvcGluaW9uIGFib3V0IHRoZSByZXN1bHQuIA0KKiBgTTEgLSBNMmAsIGdpdmUgeW91ciBvcGluaW9uIGFib3V0IHRoZSByZXN1bHQuDQoqIGBNMSAqIE0yYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4gDQoqIGBNMSAvIE0yYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4gDQoqIGRldGVybWluYW4gb2YgYE0xYCwgZ2l2ZSB5b3VyIG9waW5pb24gYWJvdXQgdGhlIHJlc3VsdC4gDQoqIGludmVycyBvZiBgTTFgLCBnaXZlIHlvdXIgb3BpbmlvbiBhYm91dCB0aGUgcmVzdWx0Lg0KDQoNCmBgYHtyfQ0KZDwtcnVuaWYoMTYsMzAsNjApDQpNMjwtbWF0cml4KGQsbnJvdz00LG5jb2w9NCkNCk0yDQozKk0xICAgICAgICAgICAgICAgICAgICAjIE0xIG11bHRpcGx5IGJ5IDMNCk0xK00yICAgICAgICAgICAgICAgICAgICMgTTEgcGx1cyBNMg0KTTEtTTIgICAgICAgICAgICAgICAgICAgIyBNMSBtaW51cyBNMg0KTTEqTTIgICAgICAgICAgICAgICAgICAgIyBNMSBtdWx0aXBsaWVkIGJ5IE0yDQpNMS9NMiAgICAgICAgICAgICAgICAgICAjIE0xIGRpdmlkZWQgYnkgTTINCmRldChNMSkgICAgICAgICAgICAgICAgICMgRGV0ZXJtaW5hbnQgb2YgTTENCmxpYnJhcnkobWF0bGliKQ0KaW52KE0xKSAgICAgICAgICAgICAgICAgIyBJbnZlcnNlIG9mIE0xDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDYNCg0KQ3JlYXRlIGEgbWF0cml4IGBkYXRhYCBieSBjb2x1bW4gdGhhdCBpcyBjb250YWluIHRoZSBmb2xsb3dpbmcgdmVjdG9yczoNCg0KKiBgQmAgdGhhdCB5b3UgaGFzIGJlZW4gY3JlYXRlZCBpbiB0aGUgZXhlcmNpc2UgMi4gTmFtZSBpdCBhcyBhICduYW1lcycgdmFyaWFibGUNCiogYENgIHRoYXQgeW91IGhhcyBiZWVuIGNyZWF0ZWQgaW4gdGhlIGV4ZXJjaXNlIDMuIE5hbWUgaXQgYXMgYSAnc2NvcmVzJyB2YXJpYWJsZS4NCg0KYGBge3J9DQpuYW1lczwtQg0Kc2NvcmVzPC1DDQpkYXRhPC1jYmluZChuYW1lcyxzY29yZXMpDQpkYXRhDQpgYGANCg0KDQojIyBDLiBMaXN0cyANCg0KSW4gdGhpcyBzZWN0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gc2hhcGUgZGF0YSBieSB1c2luZyB0aGUgYGxpc3QoKWAgZnVuY3Rpb24sIHBlcmZvcm0gc29tZSBiYXNpYyBtYW5pcHVsYXRpb25zLg0KDQoNCiMjIyBFeGVyY2lzZSA3DQoNClBsZWFzZSBjcmVhdGUgYSBkYXRhIHNldCBhcyB0aGUgYExpc3RgIHZhcmlhYmxlIGJ5IHVzaW5nIHRoZSBgbGlzdCgpYCBmdW5jdGlvbiwgY29udGFpbiB0aGUgZm9sbG93aW5nIHZlY3RvcnM6DQoNCiogYSB2YXJpYWJsZSBgbmFtZWAsIHRoZSB2YWx1ZXMgaW5jbHVkaW5nIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBhIHZhcmlhYmxlIGBhZ2VgLCB0aGUgdmFsdWVzIGluY2x1ZGluZyB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYSB2YXJpYWJsZSBgZ2VuZGVyYCwgdGhlIHZhbHVlcyBpbmNsdWRpbmcgeW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoNCmBgYHtyfQ0KbmFtZTwtYygidmFuZXNzYSIsIkp1bGlhbiIsIlB1dHJpIiwiU2hlcmx5IiwiTGFsYSIsIlNpYW5hIiwiSm9jZWx5biIsIktlZmFzIiwiRmFsbGVuIiwiU29maWEiLCJOaWtpdGEiLCJqZWZmcnkiLCJBcmRpZm8iKQ0KYWdlPC1jKDE4LDE5LDE4LDE5LDE5LDE5LDE5LDE5LDIxLDIwLDE4LDE5LDE5KQ0KZ2VuZGVyPC1jKCJmZW1hbGUiLCJtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiwibWFsZSIsIm1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiKQ0KbGlzdDwtbGlzdChuYW1lLGFnZSxnZW5kZXIpDQpsaXN0DQpgYGANCg0KDQojIyBELiBGYWN0b3JzDQoNCkluIHRoaXMgc2VjdGlvbiwgeW91IGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHNoYXBlIGRhdGEgYnkgdXNpbmcgdGhlIGBmYWN0b3IoKWAgZnVuY3Rpb24sIHBlcmZvcm0gc29tZSBiYXNpYyBtYW5pcHVsYXRpb25zLg0KDQoNCiMjIyBFeGVyY2lzZSA4DQoNClBsZWFzZSBjcmVhdGUgYSBkYXRhIHNldCBhcyB0aGUgYEZhY3RvcmAgdmFyaWFibGUgYXMgeW91IGhhdmUgZG9uZSBhdCBFeGVyY2lzZSA3LiBIZXJlLCB5b3UgYWRkIG9uZSBtb3JlIHZhcmlhYmxlIGNhbGxlZCBgbWFyaXRhbF9zdGF0dXNgIGJ5IHVzaW5nIHRoZSBgZmFjdG9yKClgIGZ1bmN0aW9uLCBhcyB0aGUgZm9sbG93aW5nIGNvZGU6DQoNCmBgYHlhbWwNCm1hcml0YWxfc3RhdHVzIDwtIGZhY3RvcihjKCJ5ZXMiLCJubyIsInllcyIsIm5vIiwgdW50aWwgMTIgc3R1ZGVudHMpKQ0KYGBgDQoNCmBgYHtyfQ0KbWFyaXRhbF9zdGF0dXMgPC0gZmFjdG9yKGMoIm5vIiwibm8iLCJubyIsIm5vIiwgIm5vIiwgIm5vIiwgIm5vIiwgIm5vIiwgIm5vIiwgIm5vIiwgIm5vIiwgIm5vIikpDQptYXJpdGFsX3N0YXR1cw0KYGBgDQoNCg0KIyMgRS4gRGF0YSBGcmFtZXMNCg0KSW4gdGhpcyBzZWN0aW9uLCB5b3UgYXJlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gc2hhcGUgZGF0YSBieSB1c2luZyB0aGUgYGRhdGEuZnJhbWUoKWAgZnVuY3Rpb24sIHBlcmZvcm0gc29tZSBiYXNpYyBtYW5pcHVsYXRpb25zLg0KDQoNCiMjIyBFeGVyY2lzZSA5DQoNClBsZWFzZSBjcmVhdGUgYSBkYXRhIHNldCBhcyB0aGUgYERGMWAgdmFyaWFibGUsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2ZWN0b3JzOg0KDQoqIGBpZGAsIGFzc3VtZSAxIHVwIHRvIDYNCiogYG5hbWVgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgZ2VuZGVyYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYGFnZWAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGBtYXJpdGFsX3N0YXR1c2AgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGBhZGRyZXNzX2J5X2NpdHlgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KDQpgYGB7cn0NCkRGMTwtZGF0YS5mcmFtZShpZD1jKDE6NiksbmFtZT1jKCJKdWxpYW4iLCJOaWtpdGEiLCJWYW5lc3NhIiwiSm9jZWx5biIsIlNoZXJseSIsIlB1dHJpIiksZ2VuZGVyPWMoIm1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiKSxhZ2U9YygxOSwxOCwxOCwxOSwxOSwxOCksbWFyaXRhbF9zdGF0dXM9Yygic2luZ2xlIiwic2luZ2xlIiwic2luZ2xlIiwic2luZ2xlIiwic2luZ2xlIiwic2luZ2xlIiksYWRkcmVzc19ieV9jaXR5PWMoIlRhbmdlcmFuZyIsIlRhbmdlcmFuZyIsIk1hbmFkbyIsIlRhbmdlcmFuZyIsIlRhbmdlcmFuZyIsIlRhbmdlcmFuZyIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRikNCkRGMQ0KYGBgDQoNClBsZWFzZSBjcmVhdGUgYSBkYXRhIHNldCBhcyB0aGUgYERGMmAgdmFyaWFibGUsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2ZWN0b3JzOg0KDQoqIGBpZGAsIGFzc3VtZSA3IHVwIHRvIDEyDQoqIGBuYW1lYCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCiogYGdlbmRlcmAgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8geW91ciBjbGFzc21hdGUgYW5kIHlvdXJzZWxmDQoqIGBhZ2VgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgbWFyaXRhbF9zdGF0dXNgIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIHlvdXIgY2xhc3NtYXRlIGFuZCB5b3Vyc2VsZg0KKiBgYWRkcmVzc19ieV9jaXR5YCB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB5b3VyIGNsYXNzbWF0ZSBhbmQgeW91cnNlbGYNCg0KYGBge3J9DQpERjI8LWRhdGEuZnJhbWUoaWQ9Yyg3OjEyKSxuYW1lPWMoIkZhbGxlbiIsIlNvZmlhIiwiTGFsYSIsIkplZmZyeSIsIktlZmFzIiwiQXJkaWZvIiksZ2VuZGVyPWMoIm1hbGUiLCJmZW1hbGUiLCJmZW1hbGUiLCJtYWxlIiwiZmVtYWxlIiwiZmVtYWxlIiksYWdlPWMoMjEsMjAsMTksMTksMTksMTkpLG1hcml0YWxfc3RhdHVzPWMoInNpbmdsZSIsInNpbmdsZSIsInNpbmdsZSIsInNpbmdsZSIsInNpbmdsZSIsInNpbmdsZSIpLGFkZHJlc3NfYnlfY2l0eT1jKCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciLCJUYW5nZXJhbmciKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpDQpERjINCg0KDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMTANCg0KSW4gdGhpcyBmaW5hbCBleGVyY2lzZSwgcGxlYXNlIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdGFza3M6IA0KDQoqIENvbWJpbmUgYERGMWAgYW5kIGBERjJgLCAgYXNzaWduIGl0IGFzIGBTQjE5YCB2YXJpYWJsZSENCmBgYHtyfQ0KREYzPC1yYmluZChERjEsREYyKQ0KU0IxOTwtREYzDQpTQjE5DQpgYGANCg0KKiBQcmludCB0aGUgcmVzdWx0IG9mIGRhdGEgZnJhbWUgYFNCMTlgIQ0KYGBge3J9DQpwcmludChTQjE5KQ0KYGBgDQoNCiogUHJpbnQgZmlyc3QgMyByb3dzIG9mIHRoZSBgU0IxOWAgZGF0YXNldCENCmBgYHtyfQ0KaGVhZChTQjE5LDMpDQpgYGANCg0KDQoqIEhvdyBjYW4geW91IHByZXZpZXcgIHRoZSBgU0IxOWAgZGF0YXNldCBsaWtlIGFuIEV4Y2VsIGZpbGUgb24geW91ciBSc3R1ZGlvPw0KYGBge3J9DQpWaWV3KFNCMTkpDQpgYGANCg0KKiBSZXZpZXcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSBmcmFtZSBgU0IxOWAhDQpgYGB7cn0NCnN0cihTQjE5KQ0KYGBgDQoNCiogQ2hlY2sgdGhlIGRpbWVuc2lvbiBvZiB0aGUgZGF0YS4gDQpgYGB7cn0NCmRpbShTQjE5KQ0KYGBgDQoNCiogUGxlYXNlIGFwcGx5IHBpcGluZyBmdW5jdGlvbnMgdG8gdGhlIGRhdGEgZnJhbWUgYFNCMTlgLCBmaWx0ZXIgaXQgYnkgdGhlaXIgZ2VuZGVyIGFjY29yZGluZ2x5ISAoYXMgeW91IGhhdmUgbGVhcm4gbGFzdCB3ZWVrKQ0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbWFsZTwtU0IxOSU+JWZpbHRlcihnZW5kZXI9PSJtYWxlIiklPiVwcmludCgpDQpmZW1hbGU8LVNCMTklPiVmaWx0ZXIoZ2VuZGVyPT0iZmVtYWxlIiklPiVwcmludCgpDQpgYGANCg0KDQoNCg==