setwd("F:/")
library(readr)
std <- read_delim("stud.txt", delim="\t",skip=1, col_names=c("StudentName","Math","English"))
Rows: 3 Columns: 3
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (1): StudentName
dbl (2): Math, English

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
std
# A tibble: 3 × 3
  StudentName  Math English
  <chr>       <dbl>   <dbl>
1 Anna           86      90
2 John           43      75
3 Catherine      80      82
library(tidyr)
stdL <- gather(std, Subject, Grade, Math:English)
stdL
# A tibble: 6 × 3
  StudentName Subject Grade
  <chr>       <chr>   <dbl>
1 Anna        Math       86
2 John        Math       43
3 Catherine   Math       80
4 Anna        English    90
5 John        English    75
6 Catherine   English    82
spread(stdL, Subject, Grade)
# A tibble: 3 × 3
  StudentName English  Math
  <chr>         <dbl> <dbl>
1 Anna             90    86
2 Catherine        82    80
3 John             75    43
std2 <- read_delim("stud2.txt", delim="\t",skip=1, col_names=c("StudentName","Math","English","Degree_Year"))
Rows: 2 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (2): StudentName, Degree_Year
dbl (2): Math, English

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
std2
# A tibble: 2 × 4
  StudentName  Math English Degree_Year
  <chr>       <dbl>   <dbl> <chr>      
1 John           43      75 Math_2013  
2 Catherine      80      82 Bio_2012   
std2L <- gather(std2, Subject, Grade, Math:English)
std2L <- separate(std2L, Degree_Year, c("Degree","Year"))
std2L 
# A tibble: 4 × 5
  StudentName Degree Year  Subject Grade
  <chr>       <chr>  <chr> <chr>   <dbl>
1 John        Math   2013  Math       43
2 Catherine   Bio    2012  Math       80
3 John        Math   2013  English    75
4 Catherine   Bio    2012  English    82

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
[1] "2015-10-21"
[1] "2015-11-30"
[1] "2012-11-03"
[1] "2013-12-02 14:05:01 UTC"
[1] "1986-12-01"
[1] "2012-05-21" "2010-12-12" "2007-01-05" "2015-02-04" "2014-12-06" "2013-07-25"
[1] "2015-08-23 18:00:05 +0430"

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
Rows: 200 Columns: 71
── Column specification ───────────────────────────────────────────────────────────
Delimiter: ","
chr (11): X2, X4, X5, X6, X8, X59, X60, X64, X66, X70, X71
lgl (60): X1, X3, X7, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
[1] 200  71
[1] "WARNING: This database should be credited to the original owner whenever"
[2] "         used for any publication whatsoever."                           
[3] ""                                                                        
[1] 178
[1] "   age_gt_60:\t\t     f, t."                            
[2] "   air():\t\t     mild,moderate,severe,normal,profound."
[3] "   airBoneGap:\t\t     f, t."                           
[4] "   ar_c():\t\t     normal,elevated,absent."             
[1] "   age_gt_60"  "   air()"      "   airBoneGap"
[1] "age_gt_60"  "air()"      "airBoneGap"
[1] "age_gt_60"  "air"        "airBoneGap"
Rows: 4 Columns: 2
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (2): X, Y

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
[1] "character"
[1] "integer"
  Sepal.Length       Sepal.Width       Petal.Length      Petal.Width            Species  
 Min.   :-1.86378   Min.   :-2.4258   Min.   :-1.5623   Min.   :-1.4422   setosa    :50  
 1st Qu.:-0.89767   1st Qu.:-0.5904   1st Qu.:-1.2225   1st Qu.:-1.1799   versicolor:50  
 Median :-0.05233   Median :-0.1315   Median : 0.3354   Median : 0.1321   virginica :50  
 Mean   : 0.00000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000                  
 3rd Qu.: 0.67225   3rd Qu.: 0.5567   3rd Qu.: 0.7602   3rd Qu.: 0.7880                  
 Max.   : 2.48370   Max.   : 3.0805   Max.   : 1.7799   Max.   : 1.7064                  
  Sepal.Length     Sepal.Width      Petal.Length     Petal.Width            Species  
 Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.00000   setosa    :50  
 1st Qu.:0.2222   1st Qu.:0.3333   1st Qu.:0.1017   1st Qu.:0.08333   versicolor:50  
 Median :0.4167   Median :0.4167   Median :0.5678   Median :0.50000   virginica :50  
 Mean   :0.4287   Mean   :0.4406   Mean   :0.4675   Mean   :0.45806                  
 3rd Qu.:0.5833   3rd Qu.:0.5417   3rd Qu.:0.6949   3rd Qu.:0.70833                  
 Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.00000                  
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: ‘Hmisc’

The following objects are masked from ‘package:dplyr’:

    src, summarize

The following objects are masked from ‘package:base’:

    format.pval, units
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.90   45.02   77.50   68.57   94.08  100.00 

 (2.8,22.3] (22.3,41.7] (41.7,61.2] (61.2,80.6]  (80.6,100] 
         45          71          70          81         239 

verynew     new  normal     old veryold 
     45      71      70      81     239 

[ 2.9, 38.1) [38.1, 66.1) [66.1, 86.1) [86.1, 95.7) [95.7,100.0] 
         102          101          101          101          101 

verynew     new  normal     old veryold 
    102     101     101     101     101 
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric


######################### Warning from 'xts' package ##########################
#                                                                             #
# The dplyr lag() function breaks how base R's lag() function is supposed to  #
# work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
# source() into this session won't work correctly.                            #
#                                                                             #
# Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
# conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
# dplyr from breaking base R's lag() function.                                #
#                                                                             #
# Code in packages is not affected. It's protected by R's namespace mechanism #
# Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
#                                                                             #
###############################################################################

Attaching package: ‘xts’

The following objects are masked from ‘package:dplyr’:

    first, last
              [,1]
2010-02-25 1102.94
2010-02-26 1104.49
2010-03-01 1115.71
2010-03-02 1118.31
              [,1]
2010-03-02 1118.31
              [,1]
2010-03-01 1115.71
2010-03-02 1118.31
              [,1]
2010-03-01 1115.71
2010-03-02 1118.31
              [,1]
2010-02-26 1104.49
2010-03-01 1115.71
         m.c.seq.row..seq.n...seq.col..drop...FALSE.
Jan 1949                                         112
Feb 1949                                         118
Mar 1949                                         132
Apr 1949                                         129
May 1949                                         121
Jun 1949                                         135
Jul 1949                                         148
Aug 1949                                         148
Sep 1949                                         136
Oct 1949                                         119
     ...                                            
Mar 1960                                         419
Apr 1960                                         461
May 1960                                         472
Jun 1960                                         535
Jul 1960                                         622
Aug 1960                                         606
Sep 1960                                         508
Oct 1960                                         461
Nov 1960                                         390
Dec 1960                                         432
                  e1
Jan 1949          NA
Feb 1949  0.05084746
Mar 1949  0.10606061
Apr 1949 -0.02325581
May 1949 -0.06611570
Jun 1949  0.10370370
Jul 1949  0.08783784
Aug 1949  0.00000000
Sep 1949 -0.08823529
Oct 1949 -0.14285714
     ...            
Feb 1960 -0.06649616
Mar 1960  0.06682578
Apr 1960  0.09110629
May 1960  0.02330508
Jun 1960  0.11775701
Jul 1960  0.13987138
Aug 1960 -0.02640264
Sep 1960 -0.19291339
Oct 1960 -0.10195228
Nov 1960 -0.18205128
         [,1]
Jan 1949  112
Feb 1949  118
Mar 1949  132
Apr 1949  129
May 1949  121
Jun 1949  135
     [,1] [,2] [,3] [,4]
[1,]  129  132  118  112
[2,]  121  129  132  118
[3,]  135  121  129  132
[4,]  148  135  121  129
[5,]  148  148  135  121
[6,]  136  148  148  135
           T T_1 T_2 T_3 T_4
May 1949 121 129 132 118 112
Jun 1949 135 121 129 132 118
Jul 1949 148 135 121 129 132
Aug 1949 148 148 135 121 129
Sep 1949 136 148 148 135 121
Oct 1949 119 136 148 148 135
Rows: 25000 Columns: 13
── Column specification ──────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (13): FID_CID, ano1991, ano1992, ano1993, ano1994, ano1995, ano1996, ano1997, ano1...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
          min      max
long -9.49174 -6.20743
lat  36.98050 42.14360
         long     lat
[1,] -7.31924 38.5406
[2,] -7.63557 40.5022
[3,] -7.90273 40.3418
Object of class SpatialPointsDataFrame
Coordinates:
          min      max
long -9.49174 -6.20743
lat  36.98050 42.14360
Is projected: FALSE 
proj4string : [+proj=longlat +ellps=WGS84]
Number of points: 25000
Data attributes:
    ano2000       
 Min.   :0.00000  
 1st Qu.:0.00000  
 Median :0.00000  
 Mean   :0.01612  
 3rd Qu.:0.00000  
 Max.   :1.00000  
Loading required package: ggplot2
ℹ Google's Terms of Service: <https://mapsplatform.google.com>
  Stadia Maps' Terms of Service: <https://stadiamaps.com/terms-of-service/>
  OpenStreetMap's Tile Usage Policy: <https://operations.osmfoundation.org/policies/tiles/>
ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
Error in `get_googlemap()`:
! Google now requires an API key; see `ggmap::register_google()`.
Backtrace:
 1. ggmap::get_map("Portugal", zoom = 7)
 2. ggmap::get_googlemap(...)
LS0tDQp0aXRsZTogIkRhdGEgTWluaW5nIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgVGlkeSBEdGF0LCBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0Kc2V0d2QoIkY6LyIpDQpsaWJyYXJ5KHJlYWRyKQ0Kc3RkIDwtIHJlYWRfZGVsaW0oInN0dWQudHh0IiwgZGVsaW09Ilx0Iixza2lwPTEsIGNvbF9uYW1lcz1jKCJTdHVkZW50TmFtZSIsIk1hdGgiLCJFbmdsaXNoIikpDQpzdGQNCg0KbGlicmFyeSh0aWR5cikNCnN0ZEwgPC0gZ2F0aGVyKHN0ZCwgU3ViamVjdCwgR3JhZGUsIE1hdGg6RW5nbGlzaCkNCnN0ZEwNCg0Kc3ByZWFkKHN0ZEwsIFN1YmplY3QsIEdyYWRlKQ0KDQpzdGQyIDwtIHJlYWRfZGVsaW0oInN0dWQyLnR4dCIsIGRlbGltPSJcdCIsc2tpcD0xLCBjb2xfbmFtZXM9YygiU3R1ZGVudE5hbWUiLCJNYXRoIiwiRW5nbGlzaCIsIkRlZ3JlZV9ZZWFyIikpDQpzdGQyDQoNCnN0ZDJMIDwtIGdhdGhlcihzdGQyLCBTdWJqZWN0LCBHcmFkZSwgTWF0aDpFbmdsaXNoKQ0Kc3RkMkwgPC0gc2VwYXJhdGUoc3RkMkwsIERlZ3JlZV9ZZWFyLCBjKCJEZWdyZWUiLCJZZWFyIikpDQpzdGQyTCANCg0KYGBgDQoNCmBgYHtyIEx1YnJpRGF0ZSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkobHVicmlkYXRlKQ0KeW1kKCIyMDE1MTAyMSIpDQp5bWQoIjIwMTUvMTEvMzAiKQ0KbXlkKCIxMS4yMDEyLjMiKQ0KZG15X2htcygiMi8xMi8yMDEzIDE0OjA1OjAxIikNCm1keSgiMTIwMTg2IikNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRlcyA8LSBjKDIwMTIwNTIxLCAiMjAxMC0xMi0xMiIsICIyMDA3LzAxLzUiLCAiMjAxNS0yLTA0IiwiTWVhc3VyZWQgb24gMjAxNC0xMi02IiwgIjIwMTMtNy0yNSIpDQpkYXRlcyA8LSB5bWQoZGF0ZXMpDQpkYXRlcw0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGEuZnJhbWUoRGF0ZXM9ZGF0ZXMsV2Vla0RheT13ZGF5KGRhdGVzKSxuV2Vla0RheT13ZGF5KGRhdGVzLGxhYmVsPVRSVUUpLFllYXI9eWVhcihkYXRlcyksTW9udGg9bW9udGgoZGF0ZXMsbGFiZWw9VFJVRSkpDQpkYXRlIDwtIHltZF9obXMoIjIwMTUwODIzIDE4OjAwOjA1Iix0ej0iQXNpYS9UZWhyYW4iKQ0KZGF0ZQ0KDQpgYGANCg0KDQpgYGB7ciBTdHJpbmcgUHJvY2Vzc2luZywgZWNobz1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHJlYWRyKQ0KdWNpLnJlcG8gPC0gImh0dHBzOi8vYXJjaGl2ZS5pY3MudWNpLmVkdS9tbC9tYWNoaW5lLWxlYXJuaW5nLWRhdGFiYXNlcy8iDQpkYXRhc2V0IDwtICJhdWRpb2xvZ3kvYXVkaW9sb2d5LnN0YW5kYXJkaXplZCINCmRhdGFGIDwtIHN0cl9jKHVjaS5yZXBvLGRhdGFzZXQsIi5kYXRhIikNCm5hbWVzRiA8LSBzdHJfYyh1Y2kucmVwbyxkYXRhc2V0LCIubmFtZXMiKQ0KIyMgUmVhZGluZyB0aGUgZGF0YSBmaWxlDQpkYXRhIDwtIHJlYWRfY3N2KHVybChkYXRhRiksIGNvbF9uYW1lcz1GQUxTRSwgbmE9Ij8iKQ0KZGF0YQ0KDQpkaW0oZGF0YSkNCnRleHQgPC0gcmVhZF9saW5lcyh1cmwobmFtZXNGKSkNCnRleHRbMTozXQ0KbGVuZ3RoKHRleHQpDQp0ZXh0WzY3OjcwXQ0Kbm1zIDwtIHN0cl9zcGxpdF9maXhlZCh0ZXh0WzY3OjEzNV0sIjoiLG49MilbLDFdICMgZ2V0IHRoZSBuYW1lcw0Kbm1zWzE6M10NCm5tcyA8LSBzdHJfdHJpbShubXMpICMgdHJpbSB3aGl0ZSBzcGFjZQ0Kbm1zWzE6M10NCm5tcyA8LSBzdHJfcmVwbGFjZV9hbGwobm1zLCJcXCh8XFwpIiwiIikgIyBkZWxldGUgaW52YWxpZCBjaGFycy4NCm5tc1sxOjNdDQpjb2xuYW1lcyhkYXRhKVsxOjY5XSA8LSBubXMNCmRhdGFbMTozLDE6MTBdDQpgYGANCg0KDQpgYGB7ciBEZWFsaW5nIHdpdGggVW5rbm93biBWYWx1ZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXR3ZCgiRTovIikNCmxpYnJhcnkocmVhZHIpDQpkYXQgPC0gcmVhZF9kZWxpbSgiRTovZGF0LnR4dCIsZGVsaW0gPSAiXHQiLGNvbF9uYW1lcz1jKCJYIiwiWSIpKQ0KZGF0DQpjbGFzcyhkYXQkWSkNCg0KbGlicmFyeShyZWFkcikNCmRhdCRZIDwtIHBhcnNlX2ludGVnZXIoZGF0JFksIG5hPSI/IikNCmRhdA0KY2xhc3MoZGF0JFkpDQoNCg0KYGBgDQoNCg0KYGBge3IgSGFuZGxpbmcgRGlmZmVyZW50IFNjYWxlcyBvZiBWYXJpYWJsZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KZGF0YShpcmlzKQ0KaXJpcy5zdGFuZCA8LSBjYmluZChzY2FsZShzZWxlY3QoaXJpcywtU3BlY2llcykpLHNlbGVjdChpcmlzLFNwZWNpZXMpKQ0Kc3VtbWFyeShpcmlzLnN0YW5kKQ0KbXhzIDwtIGFwcGx5KHNlbGVjdChpcmlzLC1TcGVjaWVzKSwgMiwgbWF4LCBuYS5ybT1UUlVFKQ0KbW5zIDwtIGFwcGx5KHNlbGVjdChpcmlzLC1TcGVjaWVzKSwgMiwgbWluLCBuYS5ybT1UUlVFKQ0KaXJpcy5ub3JtIDwtIGNiaW5kKHNjYWxlKHNlbGVjdChpcmlzLC1TcGVjaWVzKSwgY2VudGVyPW1ucywgc2NhbGU9bXhzLW1ucyksc2VsZWN0KGlyaXMsU3BlY2llcykpDQpzdW1tYXJ5KGlyaXMubm9ybSkNCmBgYA0KDQoNCmBgYHtyIERpc2NyZXRpemluZyBWYXJpYWJsZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KEhtaXNjKSAjIGZvciBjdXQyKCkNCmRhdGEoQm9zdG9uLCBwYWNrYWdlPSJNQVNTIikgIyBsb2FkaW5nIHRoZSBkYXRhDQpzdW1tYXJ5KEJvc3RvbiRhZ2UpICMgdGhlIG51bWVyaWMgdmFyaWFibGUgd2UgYXJlIGdvaW5nIHRvIGRpc2NyZXRpemUNCg0KQm9zdG9uJG5ld0FnZSA8LSBjdXQoQm9zdG9uJGFnZSw1KQ0KdGFibGUoQm9zdG9uJG5ld0FnZSkNCg0KQm9zdG9uJG5ld0FnZSA8LSBjdXQoQm9zdG9uJGFnZSw1LGxhYmVscz1jKCJ2ZXJ5bmV3IiwibmV3Iiwibm9ybWFsIiwib2xkIiwidmVyeW9sZCIpKSAjIGFsdGVybmF0aXZlIHVzaW5nIG91ciBvd24gbGFiZWxzIGZvciB0aGUgYmlucw0KdGFibGUoQm9zdG9uJG5ld0FnZSkNCkJvc3RvbiRuZXdBZ2UgPC0gY3V0MihCb3N0b24kYWdlLCBnPTUpDQp0YWJsZShCb3N0b24kbmV3QWdlKQ0KDQpCb3N0b24kbmV3QWdlIDwtIGZhY3RvcihjdXQyKEJvc3RvbiRhZ2UsZz01KSxsYWJlbHM9YygidmVyeW5ldyIsIm5ldyIsIm5vcm1hbCIsIm9sZCIsInZlcnlvbGQiKSkNCnRhYmxlKEJvc3RvbiRuZXdBZ2UpDQoNCmBgYA0KDQoNCmBgYHtyIENyZWF0aW5nIFZhcmlhYmxlcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh4dHMpDQpzcDUwMCA8LSB4dHMoYygxMTAyLjk0LDExMDQuNDksMTExNS43MSwxMTE4LjMxKSx5bWQoYygiMjAxMC0wMi0yNSIsIjIwMTAtMDItMjYiLCIyMDEwLTAzLTAxIiwiMjAxMC0wMy0wMiIpKSx0ej1TeXMuZ2V0ZW52KCJUWiIpKQ0Kc3A1MDANCg0Kc3A1MDBbIjIwMTAtMDMtMDIiXQ0Kc3A1MDBbIjIwMTAtMDMiXQ0Kc3A1MDBbIjIwMTAtMDMtMDEvIl0NCnNwNTAwWyIyMDEwLTAyLTI2LzIwMTAtMDMtMDEiXQ0KDQoNCmBgYA0KDQpgYGB7ciBUaW1lIGRlcGVuZGVuY2llcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoeHRzKQ0KZGF0YShBaXJQYXNzZW5nZXJzKQ0KYXAgPC0gYXMueHRzKEFpclBhc3NlbmdlcnMpO2FwDQphcFJlbCA8LSBkaWZmKGFwKS9hcFstbGVuZ3RoKGFwKV07YXBSZWwNCg0KaGVhZChhcCkNCmhlYWQoZW1iZWQoYXAsNCkpDQoNCmNyZWF0ZUVtYmVkRFMgPC0gZnVuY3Rpb24ocywgZW1iPTQpIHtkPC0gZGltKHMpDQppZiAoIWlzLm51bGwoZCkgJiYgZFsyXSA+IDEpIHN0b3AoIk9ubHkgYXBwbGljYWJsZSB0byB1bmktdmFyaWF0ZSB0aW1lIHNlcmllcyIpDQppZiAoZW1iIDwgMiB8fCBlbWIgPiBsZW5ndGgocykpIHN0b3AoIkludmFsaWQgZW1iZWQgc2l6ZSIpDQplIDwtIGVtYmVkKHMsZW1iKQ0KY29sbmFtZXMoZSkgPC0gYygiVCIscGFzdGUoIlQiLDE6KGVtYi0xKSxzZXA9Il8iKSkNCmlmIChpcy54dHMocykpIHJldHVybih4dHMoZSxpbmRleChzKVtlbWI6bGVuZ3RoKHMpXSkpIGVsc2UgcmV0dXJuKGUpDQp9DQpkYXRhU2V0IDwtIGNyZWF0ZUVtYmVkRFMoYXAsZW1iPTUpDQpoZWFkKGRhdGFTZXQpDQoNCg0KDQpgYGANCg0KYGBge3IgU3BhdGlhbCBkZXBlbmRlbmNpZXMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHJlYWRyKQ0Kc2V0d2QoIkU6LyIpDQpmZiA8LSByZWFkX2NzdigiRTovZm9yZXN0RmlyZXMuY3N2IikNCmZmDQoNCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KGRwbHlyKQ0Kc3BhdGlhbENvb3JkcyA8LSBzZWxlY3QoZmYsbG9uZz14LGxhdD15KSAjIHRoZSBjb250ZXh0dWFsIGRhdGENCmZpcmVzRGF0YSA8LSBzZWxlY3QoZmYsYW5vMjAwMCkgIyB0aGUgYmVoYXZpb3JhbCBkYXRhDQpjb29yZFJlZlN5cyA8LSBDUlMoIitwcm9qPWxvbmdsYXQgK2VsbHBzPVdHUzg0IikNCmZpcmVzMjAwMCA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHNwYXRpYWxDb29yZHMsDQpmaXJlc0RhdGEsDQpwcm9qNHN0cmluZz1jb29yZFJlZlN5cykNCmZpcmVzMjAwMFsxOjMsXQ0KDQpiYm94KGZpcmVzMjAwMCkNCmNvb3JkaW5hdGVzKGZpcmVzMjAwMClbMTozLF0NCnN1bW1hcnkoZmlyZXMyMDAwKQ0KDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeSh0aWJibGUpDQptYXBQVCA8LSBnZXRfbWFwKCJQb3J0dWdhbCIsem9vbT03KQ0KZDRwbG90IDwtIGFzX3RpYmJsZShjYmluZChjb29yZGluYXRlcyhmaXJlczIwMDApLGJ1cm50PWZpcmVzMjAwMCRhbm8yMDAwKSkNCmdnbWFwKG1hcFBUKSArIGdlb21fcG9pbnQoZGF0YT1maWx0ZXIoZDRwbG90LCBidXJudD09MSksYWVzKHg9bG9uZyx5PWxhdCksY29sPSJvcmFuZ2UiKQ0KDQpgYGANCg0KYGBge3IgSGFuZGxpbmcgVGV4dCBEYXRhc2V0cywgZXZhbD1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodG0pDQpzZXR3ZCgiRTovIikNCmRvY3MgPC0gQ29ycHVzKERpclNvdXJjZSgiRG9jdW1lbnRzIikpDQpkb2NzDQoNCmRvY3NbWzJdXQ0KY29udGVudChkb2NzW1syXV0pWzE6M10NCg0KZG9jcyA8LSBkb2NzICU+JQ0KdG1fbWFwKHJlbW92ZVB1bmN0dWF0aW9uKSAlPiUNCnRtX21hcChjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKSAlPiUNCnRtX21hcChyZW1vdmVOdW1iZXJzKSAlPiUNCnRtX21hcChyZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbiIpKSAlPiUNCnRtX21hcChzdHJpcFdoaXRlc3BhY2UpICU+JQ0KdG1fbWFwKHN0ZW1Eb2N1bWVudCkNCmNvbnRlbnQoZG9jc1tbMl1dKVsxOjNdDQoNCmRhdGEgPC0gRG9jdW1lbnRUZXJtTWF0cml4KGRvY3MsIGNvbnRyb2w9bGlzdCh3ZWlnaHRpbmc9d2VpZ2h0VGZJZGYpKQ0KZGF0YQ0KDQppbnNwZWN0KGRhdGFbMToyLDE6NV0pDQoNCmZpbmRGcmVxVGVybXMoZGF0YSwwLjkpDQpmaW5kQXNzb2NzKGRhdGEsInJhY2UiLDAuNSkNCg0KbmV3RGF0YSA8LSByZW1vdmVTcGFyc2VUZXJtcyhkYXRhLDAuNykNCm5ld0RhdGENCg0KbGlicmFyeSh0aWJibGUpDQphc190aWJibGUoYXMubWF0cml4KG5ld0RhdGEpKQ0KYGBgDQoNCmBgYHtyIERpbWVuc2lvbmFsaXR5IFJlZHVjdGlvbiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGEoaXJpcykNCnByb3Ayc2FtcGxlIDwtIDAuNQ0Kcm93SURzIDwtIHNhbXBsZSgxOm5yb3coaXJpcyksIGFzLmludGVnZXIocHJvcDJzYW1wbGUqbnJvdyhpcmlzKSksIHJlcGxhY2U9VFJVRSkNCmlyaXMuc2FtcGxlIDwtIGlyaXNbcm93SURzLF0NCg0KbnJMaW5lc0ZpbGUgPC0gZnVuY3Rpb24oZikgew0KaWYgKC5QbGF0Zm9ybSRPUy50eXBlID09ICJ1bml4IikNCmFzLmludGVnZXIoc3Ryc3BsaXQodHJpbXdzKHN5c3RlbShwYXN0ZSgid2MgLWwiLGYpLGludGVybj1UUlVFKSksDQoiICIpW1sxXV1bMV0pDQplbHNlDQpzdG9wKCJUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHVuaXgtYmFzZWQgc3lzdGVtcyIpDQp9DQoNCnNhbXBsZUNTViA8LSBmdW5jdGlvbihmaWxlLCBwZXJjT1JuLCBuckxpbmVzLCBoZWFkZXI9VFJVRSwgbXhQZXJjPTAuNSkgew0KaWYgKC5QbGF0Zm9ybSRPUy50eXBlICE9ICJ1bml4IikNCnN0b3AoIlRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdW5peC1iYXNlZCBzeXN0ZW1zIikNCnJlcXVpcmUocmVhZHIsIHF1aWV0bHk9VFJVRSkNCmlmIChtaXNzaW5nKG5yTGluZXMpKSANCiAgbnJMaW5lcyA8LSBuckxpbmVzRmlsZShmaWxlKQ0KaWYgKHBlcmNPUm4gPCAxKQ0KaWYgKHBlcmNPUm4gPiBteFBlcmMpDQpzdG9wKCJUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhZGVxdWF0ZSBmb3IgdGhhdCBiaWcgc2FtcGxlcy4iKQ0KZWxzZSBwZXJjT1JuIDwtIGFzLmludGVnZXIocGVyY09SbipuckxpbmVzKQ0KcGVyYyA8LSBtaW4oMipwZXJjT1JuL25yTGluZXMsIG14UGVyYykNCnN5c3RlbShwYXN0ZTAoInBlcmwgLW5lICdwcmludCBpZiAocmFuZCgpIDwgIixwZXJjLCIpJyAiLGZpbGUsDQoiICIsZmlsZSwiLnRtcC5jc3YiKSkNCmR0PC0gcmVhZF9jc3YocGFzdGUwKGZpbGUsIi50bXAuY3N2IiksY29sX25hbWVzPWhlYWRlciwgbl9tYXg9cGVyY09SbikNCmZpbGUucmVtb3ZlKHBhc3RlMChmaWxlLCIudG1wLmNzdiIpKQ0KaWYgKG5yb3coZHQpICE9IHBlcmNPUm4pDQp3YXJuaW5nKHBhc3RlKCJFeHBlY3RpbmciLHBlcmNPUm4sInJvd3MsIGJ1dCBnb3QiLG5yb3coZHQpKSkNCmR0DQp9DQoNCnQgPC0gU3lzLnRpbWUoKQ0Kc2V0d2QoIkU6LyIpDQpkIDwtIHNhbXBsZUNTVigiYWxsc2Vuc29ycy5jc3YiLCAwLjAxLCBoZWFkZXI9RkFMU0UpDQoNClN5cy50aW1lKCktdA0KDQpucm93KGQpDQoNCmxpYnJhcnkoREJJKQ0KbGlicmFyeShSTXlTUUwpDQpkcnYgPC0gZGJEcml2ZXIoIk15U1FMIikgIyBMb2FkaW5nIHRoZSBNeVNRTCBkcml2ZXINCmNvbiA8LSBkYkNvbm5lY3QoZHJ2LGRibmFtZT0idHJhbnNEQiIsDQp1c2VybmFtZT0ibXl1c2VyIixwYXNzd29yZD0ibXlwYXNzd29yZCIsDQpob3N0PSJsb2NhbGhvc3QiKQ0KDQoNCnNhbXBsZURCTVMgPC0gZnVuY3Rpb24oZGJDb25uLCB0YmwsIHBlcmNPUm4sIG14UGVyYz0wLjUpIHsNCm5yUmVjb3JkcyA8LSB1bmxpc3QoZGJHZXRRdWVyeShkYkNvbm4sIHBhc3RlKCJzZWxlY3QgY291bnQoKikgZnJvbSIsdGJsKSkpDQppZiAocGVyY09SbiA8IDEpDQppZiAocGVyY09SbiA+bXhQZXJjKQ0Kc3RvcCgiVGhpcyBmdW5jdGlvbiBpcyBub3QgYWRlcXVhdGUgZm9yIHRoYXQgYmlnIHNhbXBsZXMuIikNCmVsc2UgcGVyY09SbiA8LSBhcy5pbnRlZ2VyKHBlcmNPUm4qbnJSZWNvcmRzKQ0KcGVyYyA8LSBtaW4oMipwZXJjT1JuL25yUmVjb3JkcywgbXhQZXJjKQ0KZHQgPC0gZGJHZXRRdWVyeShkYkNvbm4scGFzdGUoInNlbGVjdCAqIGZyb20gKHNlbGVjdCAqIGZyb20iLHRibCwNCiJ3aGVyZSByYW5kKCkgPD0gIixwZXJjLCIpIGFzIHQgbGltaXQgIixwZXJjT1JuKSkNCmlmIChucm93KGR0KSAhPSBwZXJjT1JuKQ0Kd2FybmluZyhwYXN0ZSgiRXhwZWN0aW5nIixwZXJjT1JuLCJyb3dzLCBidXQgZ290Iixucm93KGR0KSkpDQpkdA0KfQ0KDQoNCnQxIDwtIFN5cy50aW1lKCkNCmQgPC0gc2FtcGxlREJNUyhjb24sInNlbnNvcl92YWx1ZXMiLDEwMDAwKQ0KU3lzLnRpbWUoKS10MQ0KDQpucm93KGQpDQoNCmRiRGlzY29ubmVjdChjb24pDQoNCmRiVW5sb2FkRHJpdmVyKGRydikNCg0KYGBgDQoNCmBgYHtyIFZhcmlhYmxlIFNlbGVjdGlvbiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoQ09SRWxlYXJuKQ0KZGF0YShpcmlzKQ0KYXR0ckV2YWwoU3BlY2llcyB+IC4sIGlyaXMsIGVzdGltYXRvcj0iR2FpblJhdGlvIikNCg0KYXR0ckV2YWwoU3BlY2llcyB+IC4sIGlyaXMsIGVzdGltYXRvcj0iSW5mR2FpbiIpDQoNCmF0dHJFdmFsKFNwZWNpZXMgfiAuLCBpcmlzLCBlc3RpbWF0b3I9IkdpbmkiKQ0KDQphdHRyRXZhbChTcGVjaWVzIH4gLiwgaXJpcywgZXN0aW1hdG9yPSJNREwiKQ0KDQppbmZvQ29yZSh3aGF0PSJhdHRyRXZhbCIpDQoNCmRhdGEoYWxnYWUsIHBhY2thZ2UgPSJETXdSMiIpDQphdHRyRXZhbChhMSB+IC4sIGFsZ2FlWywxOjEyXSwgZXN0aW1hdG9yPSJNU0VvZk1lYW4iKQ0KDQphdHRyRXZhbChhMSB+IC4sIGFsZ2FlWywxOjEyXSwgZXN0aW1hdG9yPSJSUmVsaWVmRmV4cFJhbmsiKQ0KDQppbmZvQ29yZSh3aGF0PSJhdHRyRXZhbFJlZyIpDQoNCmRhdGEoaXJpcykNCnBjYS5kYXRhIDwtIGlyaXNbLC01XSAjIGVhY2ggY2FzZSBpcyBkZXNjcmliZWQgYnkgdGhlIGZpcnN0IDQgdmFyaWFibGVzDQpwY2EgPC0gcHJpbmNvbXAocGNhLmRhdGEpDQpsb2FkaW5ncyhwY2EpDQoNCnBjYSRzY29yZXNbMTo1LF0NCg0KZGltKGlyaXMpDQoNCnJlZHVjZWQuaXJpcyA8LSBkYXRhLmZyYW1lKHBjYSRzY29yZXNbLDE6Ml0sU3BlY2llcz1pcmlzJFNwZWNpZXMpDQpkaW0ocmVkdWNlZC5pcmlzKQ0KDQpoZWFkKHJlZHVjZWQuaXJpcykNCmBgYA0KDQoNCg0K