Creating vector

Generally created using c()-

> c(1, 2, 3, 4, 5)
[1] 1 2 3 4 5

Using <- or = vector elements can be assigned -

> x <- c(1, 2, 3, 4, 5)
> print(x)
[1] 1 2 3 4 5

Advice: Do some research by yourself after a while to learn the difference in <- and =.

Data types in vector

The data types can be logical, integer, double, character, complex or raw. Data types in a vector can be found using the function typeof() -

> logi <- c(TRUE, FALSE, TRUE)
> typeof(logi)
[1] "logical"
> int <- c(1L, 2L, 5L, 9L)
> typeof(int)
[1] "integer"
> doub <- c(1, 2, 5, 9)
> typeof(doub)
[1] "double"
> char <- c("a", "cat", "Dhaka")
> typeof(char)
[1] "character"
> complx <- c(1+2i, -3i, 2-1i, 10 + 9i)
> typeof(complx)
[1] "complex"

There are functions called mode() and class(). Explore the vectors using these by yourself.

If multiple data types are used then order of importance in data type is: character > complex > double > integer > logical -

> typeof(c(1,"a"))
[1] "character"
> typeof(c(1,"a",3i))
[1] "character"
> typeof(c(1,3i))
[1] "complex"
> typeof(c(TRUE, 4))
[1] "double"
> typeof(c(10L, 4))
[1] "double"
> typeof(c(10L, FALSE))
[1] "integer"
> typeof(c(10L, 1 + 3i))
[1] "complex"

Changing data types

Using as.___() functions -

> int
[1] 1 2 5 9
> as.character(int)  # Changing to character
[1] "1" "2" "5" "9"
> as.double(int)   # Changing to double
[1] 1 2 5 9
> logi <- c(1,0,0,1)
> typeof(logi)
[1] "double"
> as.logical(logi)  # 1 is TRUE and 0 is FALSE in R
[1]  TRUE FALSE FALSE  TRUE
> doub <- c(1.8, 1, 5, pi)
> doub
[1] 1.800000 1.000000 5.000000 3.141593
> typeof(doub)
[1] "double"
> as.integer(doub)
[1] 1 1 5 3

Look how integers require less memory than doubles -

> int <- c(1L, 2L, 5L, 9L)
> doub <- c(1, 2, 5, 9)
> object.size(int)  # Returns memory allocation of int
64 bytes
> object.size(doub)  # Returns memory allocation of doub
80 bytes

Combining vectors

Using c():

> a <- c(1, 2, 3, 4, 5)
> b <- c(10, 11, 12, 13, 14)
> comb <- c(a,b)
> comb
 [1]  1  2  3  4  5 10 11 12 13 14

If combining multiple data types then the data type with most importance will be assiged -

> a <- c(1, 2, 3, 4, 5)
> d <- c("a", "b", "cat")
> comb <- c(a, d)
> comb
[1] "1"   "2"   "3"   "4"   "5"   "a"   "b"   "cat"
> typeof(comb)
[1] "character"

Length of vectors

Using the function length() -

> y <- c(10, 99, 12, 19, 100)
> length(y) # Returns the number of elements in y
[1] 5

Index

In R, array indexes starts at 1. And elements are selected by passing the index in []-

> y <- c(10, 99, 12, 19, 100)
> y[1] # Selects the 1st element in a
[1] 10
> y[4] # Selects the 4th element in a
[1] 19
> y[length(y)]   # Selects the last element in a
[1] 100

Deleting elements

Using - before the indexes -

> y[-1] # Removes the 1st element
[1]  99  12  19 100
> y[-4] # Removes the 4th element
[1]  10  99  12 100
> y[-c(1,4)] #Removed 1st and 4th element
[1]  99  12 100

Notice the original vector y is not changed -

> y
[1]  10  99  12  19 100

To change the original vector just assign the new vector to the old one -

> y <- y[-c(1,4)]
> y
[1]  99  12 100

Sequence

: method

Using : a sequence of integers can be created -

> 1:10  # Sequence of 1 to 10
 [1]  1  2  3  4  5  6  7  8  9 10
> 10:1  # Sequence of 10 to 1
 [1] 10  9  8  7  6  5  4  3  2  1
> -1:-10  # Sequence of -1 to -10
 [1]  -1  -2  -3  -4  -5  -6  -7  -8  -9 -10

seq() function

> seq(from=4, to=10)  # Sequence of integers from 4 to 10
[1]  4  5  6  7  8  9 10

Using the argument names is not necessary in all the cases -

> seq(4,10)
[1]  4  5  6  7  8  9 10

Passing only an integer will return the integers from 1 to that specific integer -

> seq(7)  # Returns integers from 1 to 7
[1] 1 2 3 4 5 6 7
> seq(-5) # Returns integers from 1 to -10
[1]  1  0 -1 -2 -3 -4 -5

by

To get a sequence of integers with an increment of 3 use the by argument-

> seq(1, 10, by = 3)
[1]  1  4  7 10

More example -

> seq(1, 2, by = 0.1) # Sequence of double increment by 0.1
 [1] 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0

longth.out

If we want specific number of values in an interval then length.out argument can be used -

> seq(0, 20, length.out = 5)  # Returns exactly 5 numbers between 0 and 20
[1]  0  5 10 15 20
> seq(0, 1, length.out = 10)  # Returns exactly 10 numbers between 0 and 1
 [1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444 0.5555556 0.6666667
 [8] 0.7777778 0.8888889 1.0000000

Arguments can be written in short form unless they match other argument names -

> seq(0, 1, len = 10) 
 [1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444 0.5555556 0.6666667
 [8] 0.7777778 0.8888889 1.0000000

Sequence of date

> start_date <- as.Date("2020-01-01")
> end_date <- as.Date("2021-12-31")
> months_seq <- seq(start_date, end_date, by="+1 months")
> format(months_seq, "%d %B %Y")
 [1] "01 January 2020"   "01 February 2020"  "01 March 2020"    
 [4] "01 April 2020"     "01 May 2020"       "01 June 2020"     
 [7] "01 July 2020"      "01 August 2020"    "01 September 2020"
[10] "01 October 2020"   "01 November 2020"  "01 December 2020" 
[13] "01 January 2021"   "01 February 2021"  "01 March 2021"    
[16] "01 April 2021"     "01 May 2021"       "01 June 2021"     
[19] "01 July 2021"      "01 August 2021"    "01 September 2021"
[22] "01 October 2021"   "01 November 2021"  "01 December 2021" 

Visit this link to learn in detail about dates in R.

Repeatation

rep() function

To get a vector with repeated values use the rep() function -

> rep(2, times = 10) # Returns 10 2s
 [1] 2 2 2 2 2 2 2 2 2 2

When passing a vector with length more than 1, the whole vector will repeat -

> rep(c(1,2, 99), times = 5) 
 [1]  1  2 99  1  2 99  1  2 99  1  2 99  1  2 99

Using the argument each we can get the elements repeated by each at a time -

> rep(c(1, 2, 99), each = 3)
[1]  1  1  1  2  2  2 99 99 99

Using both each and times-

> rep(c(1, 2, 99), each = 3, times = 2)
 [1]  1  1  1  2  2  2 99 99 99  1  1  1  2  2  2 99 99 99

gl() function

To create a sequence of factor type data `gl() function can be used -

> fac_seq <- gl(n = 2, k = 3)
> fac_seq
[1] 1 1 1 2 2 2
Levels: 1 2
> class(fac_seq)
[1] "factor"

We can specify the levels using the argument labels-

> fac_seq <- gl(n = 2, k = 3, labels = c("Control", "Treatment"))
> fac_seq
[1] Control   Control   Control   Treatment Treatment Treatment
Levels: Control Treatment

If we want the levels to be ordered then ordered argument can be used -

> gl(n = 2, k = 3, labels = c("January", "May"), ordered = T)
[1] January January January May     May     May    
Levels: January < May

To know more about factors visit here.

Names in vector

While creating vector we can specify names of elements -

> x <- c("1st"=98, "2nd"=93, "3rd"=89, "4th"=88)
> x
1st 2nd 3rd 4th 
 98  93  89  88 

We can access the names using names() function -

> names(x)
[1] "1st" "2nd" "3rd" "4th"

So we can replace the names too!

> names(x) <- c("First", "Second", "Third", "Fourth")
> x
 First Second  Third Fourth 
    98     93     89     88 

To select elements in vectors like these we can use either indexes or names -

> x[1]
First 
   98 
> x["First"]
First 
   98 

To delete the names simply assign NULL to the names of the vector -

> names(x) <- NULL
> x
[1] 98 93 89 88

R class hierarchy

> x <- 1L
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "integer" "numeric" "integer" "integer"
> x <- 1
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "numeric" "numeric" "double"  "double" 
> x <- letters
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "character" "character" "character" "character"
> x <- TRUE
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "logical" "logical" "logical" "logical"
> x <- cars
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "data.frame" "list"       "list"       "list"      
> x <- cars[1]
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "data.frame" "list"       "list"       "list"      
> x <- cars[[1]]
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "numeric" "numeric" "double"  "double" 
> x <- matrix(cars)
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "matrix" "array"  "list"   "list"   "list"  
> x <- new.env()
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "environment" "environment" "environment" "environment"
> x <- expression(1 + 1)
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "expression" "expression" "expression" "expression"
> x <- quote(y <- 1 + 1)
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "<-"       "call"     "language" "language"
> x <- ls
> print(c(class(x), mode(x), storage.mode(x), typeof(x)))
[1] "function" "function" "function" "closure" 
LS0tDQp0aXRsZTogIlZlY3RvciINCmF1dGhvcjogJ01EIEFIU0FOVUwgSVNMQU0nDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgY29tbWVudCA9ICIiLCBwcm9tcHQgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRQ0KKQ0KYGBgDQoNCi0tLQ0KDQojIENyZWF0aW5nIHZlY3Rvcg0KR2VuZXJhbGx5IGNyZWF0ZWQgdXNpbmcgYGMoKWAtDQpgYGB7cn0NCmMoMSwgMiwgMywgNCwgNSkNCmBgYA0KDQpVc2luZyBgPC1gIG9yIGA9YCB2ZWN0b3IgZWxlbWVudHMgY2FuIGJlIGFzc2lnbmVkIC0NCmBgYHtyfQ0KeCA8LSBjKDEsIDIsIDMsIDQsIDUpDQpwcmludCh4KQ0KYGBgDQoNCkFkdmljZTogRG8gc29tZSByZXNlYXJjaCBieSB5b3Vyc2VsZiBhZnRlciBhIHdoaWxlIHRvIGxlYXJuIHRoZSBkaWZmZXJlbmNlIGluIGA8LWAgYW5kIGA9YC4NCg0KIyBEYXRhIHR5cGVzIGluIHZlY3Rvcg0KDQpUaGUgZGF0YSB0eXBlcyBjYW4gYmUgbG9naWNhbCwgaW50ZWdlciwgZG91YmxlLCBjaGFyYWN0ZXIsIGNvbXBsZXggb3IgcmF3LiBEYXRhIHR5cGVzIGluIGEgdmVjdG9yIGNhbiBiZSBmb3VuZCB1c2luZyB0aGUgZnVuY3Rpb24gYHR5cGVvZigpYCAtIA0KYGBge3J9DQpsb2dpIDwtIGMoVFJVRSwgRkFMU0UsIFRSVUUpDQp0eXBlb2YobG9naSkNCmludCA8LSBjKDFMLCAyTCwgNUwsIDlMKQ0KdHlwZW9mKGludCkNCmRvdWIgPC0gYygxLCAyLCA1LCA5KQ0KdHlwZW9mKGRvdWIpDQpjaGFyIDwtIGMoImEiLCAiY2F0IiwgIkRoYWthIikNCnR5cGVvZihjaGFyKQ0KY29tcGx4IDwtIGMoMSsyaSwgLTNpLCAyLTFpLCAxMCArIDlpKQ0KdHlwZW9mKGNvbXBseCkNCmBgYA0KDQpUaGVyZSBhcmUgZnVuY3Rpb25zIGNhbGxlZCBgbW9kZSgpYCBhbmQgYGNsYXNzKClgLiBFeHBsb3JlIHRoZSB2ZWN0b3JzIHVzaW5nIHRoZXNlIGJ5IHlvdXJzZWxmLg0KDQpJZiBtdWx0aXBsZSBkYXRhIHR5cGVzIGFyZSB1c2VkIHRoZW4gb3JkZXIgb2YgaW1wb3J0YW5jZSBpbiBkYXRhIHR5cGUgaXM6IGNoYXJhY3RlciA+IGNvbXBsZXggPiBkb3VibGUgPiBpbnRlZ2VyID4gbG9naWNhbCAtDQpgYGB7cn0NCnR5cGVvZihjKDEsImEiKSkNCnR5cGVvZihjKDEsImEiLDNpKSkNCnR5cGVvZihjKDEsM2kpKQ0KdHlwZW9mKGMoVFJVRSwgNCkpDQp0eXBlb2YoYygxMEwsIDQpKQ0KdHlwZW9mKGMoMTBMLCBGQUxTRSkpDQp0eXBlb2YoYygxMEwsIDEgKyAzaSkpDQpgYGANCg0KIyBDaGFuZ2luZyBkYXRhIHR5cGVzDQpVc2luZyBgYXMuX19fKClgIGZ1bmN0aW9ucyAtIA0KYGBge3J9DQppbnQNCmFzLmNoYXJhY3RlcihpbnQpICAjIENoYW5naW5nIHRvIGNoYXJhY3Rlcg0KYXMuZG91YmxlKGludCkgICAjIENoYW5naW5nIHRvIGRvdWJsZQ0KbG9naSA8LSBjKDEsMCwwLDEpDQp0eXBlb2YobG9naSkNCmFzLmxvZ2ljYWwobG9naSkgICMgMSBpcyBUUlVFIGFuZCAwIGlzIEZBTFNFIGluIFINCmRvdWIgPC0gYygxLjgsIDEsIDUsIHBpKQ0KZG91Yg0KdHlwZW9mKGRvdWIpDQphcy5pbnRlZ2VyKGRvdWIpDQpgYGANCg0KTG9vayBob3cgaW50ZWdlcnMgcmVxdWlyZSBsZXNzIG1lbW9yeSB0aGFuIGRvdWJsZXMgLSANCmBgYHtyfQ0KaW50IDwtIGMoMUwsIDJMLCA1TCwgOUwpDQpkb3ViIDwtIGMoMSwgMiwgNSwgOSkNCm9iamVjdC5zaXplKGludCkgICMgUmV0dXJucyBtZW1vcnkgYWxsb2NhdGlvbiBvZiBpbnQNCm9iamVjdC5zaXplKGRvdWIpICAjIFJldHVybnMgbWVtb3J5IGFsbG9jYXRpb24gb2YgZG91Yg0KYGBgDQoNCg0KIyBDb21iaW5pbmcgdmVjdG9ycw0KDQpVc2luZyBgYygpYDoNCmBgYHtyfQ0KYSA8LSBjKDEsIDIsIDMsIDQsIDUpDQpiIDwtIGMoMTAsIDExLCAxMiwgMTMsIDE0KQ0KY29tYiA8LSBjKGEsYikNCmNvbWINCmBgYA0KDQpJZiBjb21iaW5pbmcgbXVsdGlwbGUgZGF0YSB0eXBlcyB0aGVuIHRoZSBkYXRhIHR5cGUgd2l0aCBtb3N0IGltcG9ydGFuY2Ugd2lsbCBiZSBhc3NpZ2VkIC0gDQpgYGB7cn0NCmEgPC0gYygxLCAyLCAzLCA0LCA1KQ0KZCA8LSBjKCJhIiwgImIiLCAiY2F0IikNCmNvbWIgPC0gYyhhLCBkKQ0KY29tYg0KdHlwZW9mKGNvbWIpDQpgYGANCg0KIyBMZW5ndGggb2YgdmVjdG9ycw0KVXNpbmcgdGhlIGZ1bmN0aW9uIGBsZW5ndGgoKWAgLQ0KYGBge3J9DQp5IDwtIGMoMTAsIDk5LCAxMiwgMTksIDEwMCkNCmxlbmd0aCh5KSAjIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB5DQpgYGANCg0KIyBJbmRleA0KSW4gYFJgLCBhcnJheSBpbmRleGVzIHN0YXJ0cyBhdCAxLiBBbmQgZWxlbWVudHMgYXJlIHNlbGVjdGVkIGJ5IHBhc3NpbmcgdGhlIGluZGV4IGluIGBbXWAtDQpgYGB7cn0NCnkgPC0gYygxMCwgOTksIDEyLCAxOSwgMTAwKQ0KeVsxXSAjIFNlbGVjdHMgdGhlIDFzdCBlbGVtZW50IGluIGENCnlbNF0gIyBTZWxlY3RzIHRoZSA0dGggZWxlbWVudCBpbiBhDQp5W2xlbmd0aCh5KV0gICAjIFNlbGVjdHMgdGhlIGxhc3QgZWxlbWVudCBpbiBhDQpgYGANCg0KIyBEZWxldGluZyBlbGVtZW50cw0KVXNpbmcgYC1gIGJlZm9yZSB0aGUgaW5kZXhlcyAtIA0KYGBge3J9DQp5Wy0xXSAjIFJlbW92ZXMgdGhlIDFzdCBlbGVtZW50DQp5Wy00XSAjIFJlbW92ZXMgdGhlIDR0aCBlbGVtZW50DQp5Wy1jKDEsNCldICNSZW1vdmVkIDFzdCBhbmQgNHRoIGVsZW1lbnQNCmBgYA0KTm90aWNlIHRoZSBvcmlnaW5hbCB2ZWN0b3IgYHlgIGlzIG5vdCBjaGFuZ2VkIC0gDQpgYGB7cn0NCnkNCmBgYA0KDQpUbyBjaGFuZ2UgdGhlIG9yaWdpbmFsIHZlY3RvciBqdXN0IGFzc2lnbiB0aGUgbmV3IHZlY3RvciB0byB0aGUgb2xkIG9uZSAtIA0KYGBge3J9DQp5IDwtIHlbLWMoMSw0KV0NCnkNCmBgYA0KDQojIFNlcXVlbmNlDQoNCiMjIGA6YCBtZXRob2QNCg0KVXNpbmcgYDpgIGEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgY2FuIGJlIGNyZWF0ZWQgLSANCmBgYHtyfQ0KMToxMCAgIyBTZXF1ZW5jZSBvZiAxIHRvIDEwDQoxMDoxICAjIFNlcXVlbmNlIG9mIDEwIHRvIDENCi0xOi0xMCAgIyBTZXF1ZW5jZSBvZiAtMSB0byAtMTANCmBgYA0KDQojIyBzZXEoKSBmdW5jdGlvbg0KYGBge3J9DQpzZXEoZnJvbT00LCB0bz0xMCkgICMgU2VxdWVuY2Ugb2YgaW50ZWdlcnMgZnJvbSA0IHRvIDEwDQpgYGANClVzaW5nIHRoZSBhcmd1bWVudCBuYW1lcyBpcyBub3QgbmVjZXNzYXJ5IGluIGFsbCB0aGUgY2FzZXMgLSANCmBgYHtyfQ0Kc2VxKDQsMTApDQpgYGANClBhc3Npbmcgb25seSBhbiBpbnRlZ2VyIHdpbGwgcmV0dXJuIHRoZSBpbnRlZ2VycyBmcm9tIDEgdG8gdGhhdCBzcGVjaWZpYyBpbnRlZ2VyIC0gDQpgYGB7cn0NCnNlcSg3KSAgIyBSZXR1cm5zIGludGVnZXJzIGZyb20gMSB0byA3DQpzZXEoLTUpICMgUmV0dXJucyBpbnRlZ2VycyBmcm9tIDEgdG8gLTEwDQpgYGANCg0KIyMjIGBieWANClRvIGdldCBhIHNlcXVlbmNlIG9mIGludGVnZXJzIHdpdGggYW4gaW5jcmVtZW50IG9mIDMgdXNlIHRoZSBgYnlgIGFyZ3VtZW50LQ0KYGBge3J9DQpzZXEoMSwgMTAsIGJ5ID0gMykNCmBgYA0KTW9yZSBleGFtcGxlIC0NCmBgYHtyfQ0Kc2VxKDEsIDIsIGJ5ID0gMC4xKSAjIFNlcXVlbmNlIG9mIGRvdWJsZSBpbmNyZW1lbnQgYnkgMC4xDQpgYGANCg0KIyMjIGBsb25ndGgub3V0YA0KDQpJZiB3ZSB3YW50IHNwZWNpZmljIG51bWJlciBvZiB2YWx1ZXMgaW4gYW4gaW50ZXJ2YWwgdGhlbiBgbGVuZ3RoLm91dGAgYXJndW1lbnQgY2FuIGJlIHVzZWQgLQ0KYGBge3J9DQpzZXEoMCwgMjAsIGxlbmd0aC5vdXQgPSA1KSAgIyBSZXR1cm5zIGV4YWN0bHkgNSBudW1iZXJzIGJldHdlZW4gMCBhbmQgMjANCnNlcSgwLCAxLCBsZW5ndGgub3V0ID0gMTApICAjIFJldHVybnMgZXhhY3RseSAxMCBudW1iZXJzIGJldHdlZW4gMCBhbmQgMQ0KYGBgDQpBcmd1bWVudHMgY2FuIGJlIHdyaXR0ZW4gaW4gc2hvcnQgZm9ybSB1bmxlc3MgdGhleSBtYXRjaCBvdGhlciBhcmd1bWVudCBuYW1lcyAtIA0KYGBge3J9DQpzZXEoMCwgMSwgbGVuID0gMTApIA0KYGBgDQoNCiMjIFNlcXVlbmNlIG9mIGRhdGUNCg0KYGBge3J9DQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoIjIwMjAtMDEtMDEiKQ0KZW5kX2RhdGUgPC0gYXMuRGF0ZSgiMjAyMS0xMi0zMSIpDQptb250aHNfc2VxIDwtIHNlcShzdGFydF9kYXRlLCBlbmRfZGF0ZSwgYnk9IisxIG1vbnRocyIpDQpmb3JtYXQobW9udGhzX3NlcSwgIiVkICVCICVZIikNCmBgYA0KDQpWaXNpdCB0aGlzIFtsaW5rXShodHRwczovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS82NjczMzBfMzZjMWYyM2NhZDVjNDE2YThkODFiZGVlM2U3NzUxM2QuaHRtbCNzZXF1ZW5jZS1vZi1kYXRlcykgdG8gbGVhcm4gaW4gZGV0YWlsIGFib3V0IGRhdGVzIGluIFIuDQoNCiMgUmVwZWF0YXRpb24NCg0KIyMgcmVwKCkgZnVuY3Rpb24NClRvIGdldCBhIHZlY3RvciB3aXRoIHJlcGVhdGVkIHZhbHVlcyB1c2UgdGhlIGByZXAoKWAgZnVuY3Rpb24gLSANCmBgYHtyfQ0KcmVwKDIsIHRpbWVzID0gMTApICMgUmV0dXJucyAxMCAycw0KYGBgDQpXaGVuIHBhc3NpbmcgYSB2ZWN0b3Igd2l0aCBsZW5ndGggbW9yZSB0aGFuIDEsIHRoZSB3aG9sZSB2ZWN0b3Igd2lsbCByZXBlYXQgLSANCmBgYHtyfQ0KcmVwKGMoMSwyLCA5OSksIHRpbWVzID0gNSkgDQpgYGANClVzaW5nIHRoZSBhcmd1bWVudCBgZWFjaGAgd2UgY2FuIGdldCB0aGUgZWxlbWVudHMgcmVwZWF0ZWQgYnkgZWFjaCBhdCBhIHRpbWUgLSANCmBgYHtyfQ0KcmVwKGMoMSwgMiwgOTkpLCBlYWNoID0gMykNCmBgYA0KVXNpbmcgYm90aCBgZWFjaGAgYW5kIGB0aW1lc2AtDQpgYGB7cn0NCnJlcChjKDEsIDIsIDk5KSwgZWFjaCA9IDMsIHRpbWVzID0gMikNCmBgYA0KDQojIyBnbCgpIGZ1bmN0aW9uDQpUbyBjcmVhdGUgYSBzZXF1ZW5jZSBvZiBmYWN0b3IgdHlwZSBkYXRhIGBnbCgpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIC0gDQpgYGB7cn0NCmZhY19zZXEgPC0gZ2wobiA9IDIsIGsgPSAzKQ0KZmFjX3NlcQ0KY2xhc3MoZmFjX3NlcSkNCmBgYA0KV2UgY2FuIHNwZWNpZnkgdGhlIGxldmVscyB1c2luZyB0aGUgYXJndW1lbnQgYGxhYmVsc2AtDQpgYGB7cn0NCmZhY19zZXEgPC0gZ2wobiA9IDIsIGsgPSAzLCBsYWJlbHMgPSBjKCJDb250cm9sIiwgIlRyZWF0bWVudCIpKQ0KZmFjX3NlcQ0KYGBgDQpJZiB3ZSB3YW50IHRoZSBsZXZlbHMgdG8gYmUgb3JkZXJlZCB0aGVuIGBvcmRlcmVkYCBhcmd1bWVudCBjYW4gYmUgdXNlZCAtDQpgYGB7cn0NCmdsKG4gPSAyLCBrID0gMywgbGFiZWxzID0gYygiSmFudWFyeSIsICJNYXkiKSwgb3JkZXJlZCA9IFQpDQpgYGANClRvIGtub3cgbW9yZSBhYm91dCBmYWN0b3JzIHZpc2l0IFtoZXJlXShodHRwczovL3JwdWJzLmNvbS9NZEFoc2FudWwvZmFjdG9yKS4NCg0KIyBOYW1lcyBpbiB2ZWN0b3INCg0KV2hpbGUgY3JlYXRpbmcgdmVjdG9yIHdlIGNhbiBzcGVjaWZ5IG5hbWVzIG9mIGVsZW1lbnRzIC0gDQpgYGB7cn0NCnggPC0gYygiMXN0Ij05OCwgIjJuZCI9OTMsICIzcmQiPTg5LCAiNHRoIj04OCkNCngNCmBgYA0KV2UgY2FuIGFjY2VzcyB0aGUgbmFtZXMgdXNpbmcgYG5hbWVzKClgIGZ1bmN0aW9uIC0gDQpgYGB7cn0NCm5hbWVzKHgpDQpgYGANClNvIHdlIGNhbiByZXBsYWNlIHRoZSBuYW1lcyB0b28hDQpgYGB7cn0NCm5hbWVzKHgpIDwtIGMoIkZpcnN0IiwgIlNlY29uZCIsICJUaGlyZCIsICJGb3VydGgiKQ0KeA0KYGBgDQpUbyBzZWxlY3QgZWxlbWVudHMgaW4gdmVjdG9ycyBsaWtlIHRoZXNlIHdlIGNhbiB1c2UgZWl0aGVyIGluZGV4ZXMgb3IgbmFtZXMgLQ0KYGBge3J9DQp4WzFdDQp4WyJGaXJzdCJdDQpgYGANClRvIGRlbGV0ZSB0aGUgbmFtZXMgc2ltcGx5IGFzc2lnbiBOVUxMIHRvIHRoZSBuYW1lcyBvZiB0aGUgdmVjdG9yIC0gDQpgYGB7cn0NCm5hbWVzKHgpIDwtIE5VTEwNCngNCmBgYA0KDQojIFIgY2xhc3MgaGllcmFyY2h5DQoNCmBgYHtyfQ0KeCA8LSAxTA0KcHJpbnQoYyhjbGFzcyh4KSwgbW9kZSh4KSwgc3RvcmFnZS5tb2RlKHgpLCB0eXBlb2YoeCkpKQ0KDQp4IDwtIDENCnByaW50KGMoY2xhc3MoeCksIG1vZGUoeCksIHN0b3JhZ2UubW9kZSh4KSwgdHlwZW9mKHgpKSkNCg0KeCA8LSBsZXR0ZXJzDQpwcmludChjKGNsYXNzKHgpLCBtb2RlKHgpLCBzdG9yYWdlLm1vZGUoeCksIHR5cGVvZih4KSkpDQoNCnggPC0gVFJVRQ0KcHJpbnQoYyhjbGFzcyh4KSwgbW9kZSh4KSwgc3RvcmFnZS5tb2RlKHgpLCB0eXBlb2YoeCkpKQ0KDQp4IDwtIGNhcnMNCnByaW50KGMoY2xhc3MoeCksIG1vZGUoeCksIHN0b3JhZ2UubW9kZSh4KSwgdHlwZW9mKHgpKSkNCg0KeCA8LSBjYXJzWzFdDQpwcmludChjKGNsYXNzKHgpLCBtb2RlKHgpLCBzdG9yYWdlLm1vZGUoeCksIHR5cGVvZih4KSkpDQoNCnggPC0gY2Fyc1tbMV1dDQpwcmludChjKGNsYXNzKHgpLCBtb2RlKHgpLCBzdG9yYWdlLm1vZGUoeCksIHR5cGVvZih4KSkpDQoNCnggPC0gbWF0cml4KGNhcnMpDQpwcmludChjKGNsYXNzKHgpLCBtb2RlKHgpLCBzdG9yYWdlLm1vZGUoeCksIHR5cGVvZih4KSkpDQoNCnggPC0gbmV3LmVudigpDQpwcmludChjKGNsYXNzKHgpLCBtb2RlKHgpLCBzdG9yYWdlLm1vZGUoeCksIHR5cGVvZih4KSkpDQoNCnggPC0gZXhwcmVzc2lvbigxICsgMSkNCnByaW50KGMoY2xhc3MoeCksIG1vZGUoeCksIHN0b3JhZ2UubW9kZSh4KSwgdHlwZW9mKHgpKSkNCg0KeCA8LSBxdW90ZSh5IDwtIDEgKyAxKQ0KcHJpbnQoYyhjbGFzcyh4KSwgbW9kZSh4KSwgc3RvcmFnZS5tb2RlKHgpLCB0eXBlb2YoeCkpKQ0KDQp4IDwtIGxzDQpwcmludChjKGNsYXNzKHgpLCBtb2RlKHgpLCBzdG9yYWdlLm1vZGUoeCksIHR5cGVvZih4KSkpDQpgYGANCg0K