1 Data preprocessing (Report)

Definition Data preprocessing is the process of converting raw data into a well-readable format to be used by statistical and psychometric analyses.

pacman::p_load(tidyverse, janitor, arsenal, DT, DataExplorer,summarytools, psych)

1.1 Data import

ds_1<- readxl::read_excel("C:/Users/luisf/Dropbox/Puc-Rio/Projeto - ASQ 4 2021/Datasets/ASQ3_Supplmnt and ASQ4 test1 8.19.21.xlsx", 
    col_types = c("text", "numeric", "text", 
        "numeric", "date", "date", "numeric", 
        "numeric", "numeric", "numeric", 
        "text", "text", "numeric", "text", 
        "numeric", "text", "text", "text", 
        "numeric", "text", "text", "text", 
        "text", "text", "text", "numeric", 
        "numeric", "numeric", "text", "numeric", 
        "date", "date", "numeric", "text", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "text", "numeric", "text", 
        "numeric", "text", "numeric", "text", 
        "numeric", "text", "numeric", "text", 
        "numeric", "text", "numeric", "text", 
        "numeric", "text", "numeric", "text", 
        "numeric", "numeric", "numeric"))

backup_ds_1 <- ds_1

2 Fixes

2.1 Fix 1: Remove empty rows & columns

ds_1 <- clean_names(ds_1)
ds_1 <- remove_empty(ds_1)
value for "which" not specified, defaulting to c("rows", "cols")

2.2 Fix 2: Transtorm dots into mising

ds_1 <- ds_1 %>% 
  mutate_at(vars(-dob,-datcom,-datcom_2,-dob_2),~na_if(., "."))

2.3 Fix 3: Wrong values in ASQ 4 items

x<-ds_1 %>% select(com_a4_1, com_a4_2, com_a4_3, com_a4_4, com_a4_5, com_a4_6,
  gm_a4_1, gm_a4_2, gm_a4_3, gm_a4_4, gm_a4_5, gm_a4_6,
  fm_a4_1, fm_a4_2, fm_a4_3, fm_a4_4, fm_a4_5, fm_a4_6,
  cg_a4_1, cg_a4_2, cg_a4_3, cg_a4_4, cg_a4_5, cg_a4_6,
  ps_a4_1, ps_a4_2, ps_a4_3, ps_a4_4, ps_a4_5, ps_a4_6) %>% 
  mutate_all(., factor) 
arsenal::tableby(~., data = x) %>% summary()
Overall (N=17525)
com_a4_1
   N-Miss 1
   0 1098 (6.3%)
   5 2268 (12.9%)
   6 1 (0.0%)
   7 1 (0.0%)
   8.75 1 (0.0%)
   10 14153 (80.8%)
   10.4210526315789 1 (0.0%)
   10.484962406015 1 (0.0%)
com_a4_2
   N-Miss 1
   0 1836 (10.5%)
   5 2579 (14.7%)
   6 1 (0.0%)
   7 1 (0.0%)
   9 2 (0.0%)
   10 13105 (74.8%)
com_a4_3
   N-Miss 1
   0 2573 (14.7%)
   5 3344 (19.1%)
   7 1 (0.0%)
   10 11605 (66.2%)
   10.484962406015 1 (0.0%)
com_a4_4
   N-Miss 2
   0 2912 (16.6%)
   5 2823 (16.1%)
   7 1 (0.0%)
   8 1 (0.0%)
   10 11786 (67.3%)
com_a4_5
   N-Miss 2
   0 4124 (23.5%)
   5 3346 (19.1%)
   7 1 (0.0%)
   8.75 1 (0.0%)
   10 10050 (57.4%)
   55 1 (0.0%)
com_a4_6
   N-Miss 2
   0 5170 (29.5%)
   5 3127 (17.8%)
   10 9226 (52.7%)
gm_a4_1
   N-Miss 1
   0 551 (3.1%)
   5 1075 (6.1%)
   7.5 1 (0.0%)
   8 4 (0.0%)
   9 1 (0.0%)
   10 15891 (90.7%)
   20 1 (0.0%)
gm_a4_2
   N-Miss 2
   0 1054 (6.0%)
   5 2025 (11.6%)
   7.5 1 (0.0%)
   8 1 (0.0%)
   10 14442 (82.4%)
gm_a4_3
   N-Miss 1
   0 1613 (9.2%)
   5 1829 (10.4%)
   8 1 (0.0%)
   10 14081 (80.4%)
gm_a4_4
   N-Miss 1
   0 1634 (9.3%)
   5 2207 (12.6%)
   8 1 (0.0%)
   9 1 (0.0%)
   10 13681 (78.1%)
gm_a4_5
   N-Miss 2
   0 1930 (11.0%)
   5 2765 (15.8%)
   10 12828 (73.2%)
gm_a4_6
   N-Miss 2
   0 3309 (18.9%)
   5 2350 (13.4%)
   7 1 (0.0%)
   8 1 (0.0%)
   9 1 (0.0%)
   10 11860 (67.7%)
   15 1 (0.0%)
fm_a4_1
   N-Miss 2
   0 1350 (7.7%)
   5 2472 (14.1%)
   9 1 (0.0%)
   10 13700 (78.2%)
fm_a4_2
   N-Miss 1
   0 1859 (10.6%)
   1 1 (0.0%)
   4 2 (0.0%)
   5 2617 (14.9%)
   10 13045 (74.4%)
fm_a4_3
   N-Miss 1
   0 2603 (14.9%)
   5 3018 (17.2%)
   8 1 (0.0%)
   9 1 (0.0%)
   10 11901 (67.9%)
fm_a4_4
   N-Miss 1
   0 2942 (16.8%)
   5 3220 (18.4%)
   7 1 (0.0%)
   9 1 (0.0%)
   10 11360 (64.8%)
fm_a4_5
   N-Miss 1
   0 3221 (18.4%)
   5 3237 (18.5%)
   9 3 (0.0%)
   10 11063 (63.1%)
fm_a4_6
   N-Miss 1
   0 4547 (25.9%)
   3 1 (0.0%)
   4 1 (0.0%)
   5 3339 (19.1%)
   6 1 (0.0%)
   7 2 (0.0%)
   8 2 (0.0%)
   9 2 (0.0%)
   10 9629 (54.9%)
cg_a4_1
   N-Miss 1
   0 1429 (8.2%)
   5 2750 (15.7%)
   7 1 (0.0%)
   8 1 (0.0%)
   9 2 (0.0%)
   10 13341 (76.1%)
cg_a4_2
   N-Miss 1
   0 1567 (8.9%)
   5 2772 (15.8%)
   6 1 (0.0%)
   8 2 (0.0%)
   10 13182 (75.2%)
cg_a4_3
   N-Miss 1
   0 1871 (10.7%)
   5 2868 (16.4%)
   6 1 (0.0%)
   7 2 (0.0%)
   8 1 (0.0%)
   10 12781 (72.9%)
cg_a4_4
   N-Miss 1
   0 2428 (13.9%)
   5 4162 (23.8%)
   6 1 (0.0%)
   8 1 (0.0%)
   10 10932 (62.4%)
cg_a4_5
   N-Miss 2
   0 4226 (24.1%)
   4 1 (0.0%)
   5 3587 (20.5%)
   7 1 (0.0%)
   8 1 (0.0%)
   9 1 (0.0%)
   10 9706 (55.4%)
cg_a4_6
   N-Miss 1
   0 3140 (17.9%)
   5 3576 (20.4%)
   10 10808 (61.7%)
ps_a4_1
   N-Miss 1
   0 1096 (6.3%)
   4 1 (0.0%)
   5 2188 (12.5%)
   7 1 (0.0%)
   9 1 (0.0%)
   9.72556390977444 1 (0.0%)
   10 14236 (81.2%)
ps_a4_2
   N-Miss 1
   0 1963 (11.2%)
   5 2571 (14.7%)
   6 1 (0.0%)
   8 1 (0.0%)
   10 12988 (74.1%)
ps_a4_3
   N-Miss 1
   0 1518 (8.7%)
   5 2724 (15.5%)
   9 1 (0.0%)
   10 13280 (75.8%)
   110 1 (0.0%)
ps_a4_4
   N-Miss 1
   0 1663 (9.5%)
   5 2654 (15.1%)
   10 13206 (75.4%)
   100 1 (0.0%)
ps_a4_5
   N-Miss 2
   0 3275 (18.7%)
   5 3416 (19.5%)
   7 2 (0.0%)
   8 2 (0.0%)
   9 3 (0.0%)
   10 10825 (61.8%)
ps_a4_6
   N-Miss 1
   0 3574 (20.4%)
   5 3358 (19.2%)
   9 1 (0.0%)
   10 10591 (60.4%)
NA
ds_1 <- ds_1 %>% 
  mutate_at(vars(com_a4_1, com_a4_2, com_a4_3, com_a4_4, com_a4_5, com_a4_6,
  gm_a4_1, gm_a4_2, gm_a4_3, gm_a4_4, gm_a4_5, gm_a4_6,
  fm_a4_1, fm_a4_2, fm_a4_3, fm_a4_4, fm_a4_5, fm_a4_6,
  cg_a4_1, cg_a4_2, cg_a4_3, cg_a4_4, cg_a4_5, cg_a4_6,
  ps_a4_1, ps_a4_2, ps_a4_3, ps_a4_4, ps_a4_5, ps_a4_6), ~ifelse(. %in% c(0,5,10), ., NA)) 
rm(x)
ds_1 %>% 
  select(com_a4_1, com_a4_2, com_a4_3, com_a4_4, com_a4_5, com_a4_6,
  gm_a4_1, gm_a4_2, gm_a4_3, gm_a4_4, gm_a4_5, gm_a4_6,
  fm_a4_1, fm_a4_2, fm_a4_3, fm_a4_4, fm_a4_5, fm_a4_6,
  cg_a4_1, cg_a4_2, cg_a4_3, cg_a4_4, cg_a4_5, cg_a4_6,
  ps_a4_1, ps_a4_2, ps_a4_3, ps_a4_4, ps_a4_5, ps_a4_6) %>% 
  pivot_longer(everything()) %>% 
  count(value) %>% 
  mutate(percent = (100 * n / sum(n)) %>% round(digits = 1))

2.4 Fix 4: Total scores / Missing data

profile_missing(ds_1) %>% 
  arrange(desc(num_missing)) %>% 
  mutate(pct_missing = formatC(pct_missing)) %>% 
  DT::datatable(., options = list(dom='t'))
ds_1 %>% 
  group_by(source) %>% 
  summarise_at(vars(contains("sum")), ~sum(is.na(.))) %>% 
  #summarise(sum(is.na(csum))) %>% 
  adorn_totals() %>% 
  datatable(., options = list(dom='t'))
NA
ds_1 <- ds_1 %>% rowwise() %>% 
  mutate(csum = sum(c_across(c(com_a4_1, com_a4_2, com_a4_3, com_a4_4, com_a4_5, com_a4_6)), na.rm=T)) %>% 
  mutate(gmsum = sum(c_across(c(gm_a4_1, gm_a4_2, gm_a4_3, gm_a4_4, gm_a4_5, gm_a4_6)), na.rm=T)) %>% 
  mutate(fmsum = sum(c_across(c(fm_a4_1, fm_a4_2, fm_a4_3, fm_a4_4, fm_a4_5, fm_a4_6)), na.rm=T)) %>% 
  mutate(cgsum_a4 = sum(c_across(c(cg_a4_1, cg_a4_2, cg_a4_3, cg_a4_4, cg_a4_5, cg_a4_6)), na.rm=T)) %>% 
  mutate(psum_a4 = sum(c_across(c(ps_a4_1, ps_a4_2, ps_a4_3, ps_a4_4, ps_a4_5, ps_a4_6)), na.rm=T)) 
ds_1 %>% 
  select(contains("sum")) %>% 
  plot_missing()

2.5 Fix 5: One wrong ID

ds_1 <- ds_1 %>% mutate(id_2_fix = id)

2.6 Fix 6: Gender

ds_1 %>% count(gender)
ds_1 <- ds_1 %>% 
  mutate(gender_fix = case_when(
    gender == 1 ~ "Male",
    gender == 2 ~ "Female",
    TRUE ~ NA_character_
  )) %>% 
  mutate(gender_fix = as.factor(gender_fix)) 

2.7 Fix 7: Mom educ

ds_1 %>% count(momed)
ds_1 <- ds_1 %>% 
  mutate(momed_fix = if_else(momed == 0, NA_real_, momed))
ds_1 <- ds_1 %>% 
  mutate(momed_fix = factor(momed_fix)) %>% 
  mutate(momed_fix = fct_relevel(momed_fix, sort)) 
ds_1 %>% 
  count(momed_fix)

2.8 Fix 8: Mom’s age (I did not fix it)


ds_1 %>% count(momage) %>% 
    datatable(.)

2.9 Fix 9: Income

ds_1<- ds_1 %>% 
  mutate(income_fix = as.factor(income1)) %>% 
  mutate(income_fix = fct_relevel(income_fix, sort)) 
ds_1 %>% count(income_fix)

2.10 Fix 10: Disability

ds_1 %>% count(disab) 
ds_1 <- ds_1 %>% 
  mutate(disab_fix = case_when(
    disab == 0 ~ "0",
    disab == 1 ~ "1",
    TRUE ~ NA_character_
  )) %>% 
 mutate(disab_fix = as.factor(disab_fix))
ds_1 %>% count(disab_fix)

2.11 Fix 11: At risk

ds_1 %>% count(atrisk)
ds_1 <- ds_1 %>% 
  mutate(atrisk_fix = case_when(
    atrisk == 0 ~ "0",
    atrisk == 1 ~ "1",
    atrisk == 2 ~ "2",
    atrisk == 3 ~ "3",
    TRUE ~ NA_character_
  )) %>% 
 mutate(atrisk_fix = as.factor(atrisk_fix))
ds_1 %>% count(atrisk_fix)

2.12 Fix 12: Language

ds_1 <- ds_1 %>% 
  mutate(language_fix = as.factor(language))
ds_1 %>% count(language_fix)

2.13 Fix 13: Questionnaires

ds_1 %>% count(quest)
ds_1 <- ds_1 %>% filter(id != "17524")
ds_1 <- ds_1 %>% 
  mutate(quest_fix = as.factor(quest)) 

2.14 Fix 14: Race

ds_1 <- ds_1 %>% 
  mutate(race_fix = as.factor(race)) %>%  
  mutate(race_fix = fct_relevel(race_fix, sort)) 
ds_1 %>% count(race_fix)

2.15 Fix 15: Compute a variable of website data collection

ds_1 <- ds_1 %>% mutate(website = if_else(source == "ASQ4website","online","paper"))

2.16 Send it to Kimberly

writexl::write_xlsx(ds_1, "ds_asq4_luis.xlsx")
view(dfSummary(ds_1))

3 Data preprocessing 2

3.1 Data import

library(readxl)
ds_2 <- read_excel("C:/Users/luisf/Dropbox/Puc-Rio/Projeto - ASQ 4 2021/Datasets/ASQ3_Supplmnt and ASQ4 test1 8.19.21.xlsx", 
                                                        col_types = c("text", "numeric", "text", 
                                                                      "numeric", "date", "date", "text", 
                                                                      "text", "numeric", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "numeric", "text", "text", "numeric", 
                                                                      "date", "date", "text", "text", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "text", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "numeric", "numeric", 
                                                                      "numeric", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text", "text", "text", "text", 
                                                                      "text", "text"), sheet = 2)

backup_ds_2 <- ds_2

4 Fixes

4.1 Fix 1: Adjust variable names

ds_2 <- clean_names(ds_2)

4.2 Fix 2: Remove wrong value in language

ds_2 <- ds_2 %>% filter(language != "3302")

4.3 Fix 3: Transtorm dots into mising

ds_2 <- ds_2 %>% #mutate_all(., ~na_if(., "."))
  mutate_at(vars(-dob_5, -datcom_6,-dob_31,-datcom_32),~na_if(., "."))

4.4 Fix 4: Remove empty rows & columns

ds_2 %>% map(., ~sum(is.na(.))) %>% purrr::simplify() 
          source         language             id_3          quest_4            dob_5         datcom_6  weeks_premature         premie_8            age_9 
               0                0                0                0                0                0               95                9                0 
          gender             race           weight            momed           momage        author_15          income1            disab       what_disab 
              18               38              389              349              404               36              324               59              410 
          who_dx          service     what_service           atrisk             eval            valid           reliab           intrtr            state 
            3275               62              354               62             3302             3302             3302             3279                0 
             zip            id_29         quest_30           dob_31        datcom_32        author_33        premie_34           age_35         com_a3_1 
            3283                0                0                0                0               36                9                1                0 
        com_a3_2         com_a3_3         com_a3_4         com_a3_5         com_a3_6            c_sum          gm_a3_1          gm_a3_2          gm_a3_3 
               0                0                2                2                1              410                0                1                0 
         gm_a3_4          gm_a3_5          gm_a3_6           gm_sum          fm_a3_1          fm_a3_2          fm_a3_3          fm_a3_4          fm_a3_5 
               0                0                0              410                1                1                5                1                4 
         fm_a3_6           fm_sum          cg_a3_1          cg_a3_2          cg_a3_3          cg_a3_4          cg_a3_5          cg_a3_6           cg_sum 
               1              410                2                2                1                0                3                3              410 
         ps_a3_1          ps_a3_2          ps_a3_3          ps_a3_4          ps_a3_5          ps_a3_6           ps_sum     overall_a3_1  overalltxt_a3_1 
               4                2                0                0                0                0              410               19             3284 
    overall_a3_2  overalltxt_a3_2     overall_a3_3  overalltxt_a3_3     overall_a3_4  overalltxt_a3_4     overall_a3_5  overalltxt_a3_5     overall_a3_6 
              22             3249               17             3278               17             3279               16             3287               24 
 overalltxt_a3_6     overall_a3_7  overalltxt_a3_7     overall_a3_8  overalltxt_a3_8     overall_a3_9  overalltxt_a3_9    overall_a3_10 overalltxt_a3_10 
            3278              116             3276              121             3272              671             3256             1759             3274 
        com_a4_1         com_a4_2         com_a4_3         com_a4_4         com_a4_5         com_a4_6          gm_a4_1          gm_a4_2          gm_a4_3 
            3302             3123             2995             2861             3025             2988             2927             2240             2707 
         gm_a4_4          gm_a4_5          gm_a4_6          fm_a4_1          fm_a4_2          fm_a4_3          fm_a4_4          fm_a4_5          fm_a4_6 
            2437             2877             2495             2910             2854             2442             2526             3023             2804 
         cg_a4_1          cg_a4_2          cg_a4_3          cg_a4_4          cg_a4_5          cg_a4_6          ps_a4_1          ps_a4_2          ps_a4_3 
            2558             2752             2504             2905             2364             2527             1410             2672             2205 
         ps_a4_4          ps_a4_5          ps_a4_6 
            2400             1614             2765 
ds_2 <- remove_empty(ds_2)
value for "which" not specified, defaulting to c("rows", "cols")

4.5 Fix 5: Wrong values in ASQ items

ds_2 %>% select(com_a3_1, com_a3_2, com_a3_3, com_a3_4, com_a3_5, com_a3_6,
                     gm_a3_1,   gm_a3_2,    gm_a3_3,    gm_a3_4,    gm_a3_5,    gm_a3_6,
                     fm_a3_1,   fm_a3_2,    fm_a3_3,    fm_a3_4,    fm_a3_5,    fm_a3_6,
                     cg_a3_1,   cg_a3_2,    cg_a3_3,    cg_a3_4,    cg_a3_5,    cg_a3_6,
                     ps_a3_1,   ps_a3_2,    ps_a3_3,    ps_a3_4,    ps_a3_5,    ps_a3_6,
                
                     com_a4_2,  com_a4_3,   com_a4_4,   com_a4_5,   com_a4_6,
                     gm_a4_1,   gm_a4_2,    gm_a4_3,    gm_a4_4,    gm_a4_5,    gm_a4_6,
                     fm_a4_1,   fm_a4_2,    fm_a4_3,    fm_a4_4,    fm_a4_5,    fm_a4_6,
                     cg_a4_1,   cg_a4_2, cg_a4_3,   cg_a4_4,    cg_a4_5,    cg_a4_6,
                     ps_a4_1,   ps_a4_2,    ps_a4_3,    ps_a4_4,    ps_a4_5,    ps_a4_6) %>% 
  mutate_all(., factor) %>% arsenal::tableby(~., data = .) %>% summary()
Overall (N=3302)
com_a3_1
   0 134 (4.1%)
   5 266 (8.1%)
   8.75 1 (0.0%)
   10 2901 (87.9%)
com_a3_2
   0 201 (6.1%)
   5 370 (11.2%)
   10 2731 (82.7%)
com_a3_3
   0 251 (7.6%)
   5 496 (15.0%)
   10 2555 (77.4%)
com_a3_4
   N-Miss 2
   0 462 (14.0%)
   5 497 (15.1%)
   10 2341 (70.9%)
com_a3_5
   N-Miss 2
   0 464 (14.1%)
   5 529 (16.0%)
   8.75 1 (0.0%)
   10 2306 (69.9%)
com_a3_6
   N-Miss 1
   0 773 (23.4%)
   5 561 (17.0%)
   6 1 (0.0%)
   10 1966 (59.6%)
gm_a3_1
   0 84 (2.5%)
   5 194 (5.9%)
   9 1 (0.0%)
   10 3023 (91.6%)
gm_a3_2
   N-Miss 1
   0 76 (2.3%)
   5 218 (6.6%)
   10 3007 (91.1%)
gm_a3_3
   0 144 (4.4%)
   5 269 (8.1%)
   8 1 (0.0%)
   9 1 (0.0%)
   10 2887 (87.4%)
gm_a3_4
   0 189 (5.7%)
   4 1 (0.0%)
   5 346 (10.5%)
   10 2766 (83.8%)
gm_a3_5
   0 276 (8.4%)
   5 439 (13.3%)
   9 1 (0.0%)
   10 2586 (78.3%)
gm_a3_6
   0 448 (13.6%)
   5 403 (12.2%)
   10 2451 (74.2%)
fm_a3_1
   N-Miss 1
   0 216 (6.5%)
   5 375 (11.4%)
   10 2710 (82.1%)
fm_a3_2
   N-Miss 1
   0 325 (9.8%)
   2 1 (0.0%)
   5 386 (11.7%)
   9 1 (0.0%)
   10 2588 (78.4%)
fm_a3_3
   N-Miss 5
   0 398 (12.1%)
   10 2356 (71.5%)
   110 1 (0.0%)
   5 542 (16.4%)
fm_a3_4
   N-Miss 1
   0 399 (12.1%)
   3 1 (0.0%)
   5 612 (18.5%)
   8 1 (0.0%)
   10 2287 (69.3%)
   19 1 (0.0%)
fm_a3_5
   N-Miss 4
   0 539 (16.3%)
   5 500 (15.2%)
   7 1 (0.0%)
   9 1 (0.0%)
   10 2257 (68.4%)
fm_a3_6
   N-Miss 1
   0 593 (18.0%)
   3 1 (0.0%)
   5 669 (20.3%)
   10 2038 (61.7%)
cg_a3_1
   N-Miss 2
   0 183 (5.5%)
   5 233 (7.1%)
   10 2884 (87.4%)
cg_a3_2
   N-Miss 2
   0 241 (7.3%)
   2 1 (0.0%)
   5 333 (10.1%)
   10 2725 (82.6%)
cg_a3_3
   N-Miss 1
   0 185 (5.6%)
   5 344 (10.4%)
   10 2772 (84.0%)
cg_a3_4
   0 306 (9.3%)
   5 363 (11.0%)
   8 1 (0.0%)
   10 2632 (79.7%)
cg_a3_5
   N-Miss 3
   0 539 (16.3%)
   5 514 (15.6%)
   10 2246 (68.1%)
cg_a3_6
   N-Miss 3
   0 497 (15.1%)
   5 509 (15.4%)
   8 1 (0.0%)
   10 2292 (69.5%)
ps_a3_1
   N-Miss 4
   0 209 (6.3%)
   5 404 (12.2%)
   8.75 1 (0.0%)
   10 2684 (81.4%)
ps_a3_2
   N-Miss 2
   0 180 (5.5%)
   3 1 (0.0%)
   5 426 (12.9%)
   9 1 (0.0%)
   10 2692 (81.6%)
ps_a3_3
   0 194 (5.9%)
   5 344 (10.4%)
   10 2763 (83.7%)
   110 1 (0.0%)
ps_a3_4
   0 412 (12.5%)
   5 674 (20.4%)
   10 2216 (67.1%)
ps_a3_5
   0 480 (14.5%)
   5 553 (16.7%)
   7.5 1 (0.0%)
   8.75 1 (0.0%)
   9 1 (0.0%)
   10 2266 (68.6%)
ps_a3_6
   0 399 (12.1%)
   5 606 (18.4%)
   7.5 1 (0.0%)
   10 2296 (69.5%)
com_a4_2
   N-Miss 3123
   0 18 (10.1%)
   10 119 (66.5%)
   5 42 (23.5%)
com_a4_3
   N-Miss 2995
   0 4 (1.3%)
   10 278 (90.6%)
   3 1 (0.3%)
   5 24 (7.8%)
com_a4_4
   N-Miss 2861
   0 23 (5.2%)
   10 383 (86.8%)
   5 35 (7.9%)
com_a4_5
   N-Miss 3025
   0 15 (5.4%)
   10 242 (87.4%)
   5 20 (7.2%)
com_a4_6
   N-Miss 2988
   0 26 (8.3%)
   10 265 (84.4%)
   5 23 (7.3%)
gm_a4_1
   N-Miss 2927
   0 3 (0.8%)
   10 354 (94.4%)
   20 1 (0.3%)
   5 17 (4.5%)
gm_a4_2
   N-Miss 2240
   <U+F739> 1 (0.1%)
   0 44 (4.1%)
   10 890 (83.8%)
   5 127 (12.0%)
gm_a4_3
   N-Miss 2707
   0 52 (8.7%)
   10 474 (79.7%)
   5 69 (11.6%)
gm_a4_4
   N-Miss 2437
   0 56 (6.5%)
   10 707 (81.7%)
   5 102 (11.8%)
gm_a4_5
   N-Miss 2877
   0 24 (5.6%)
   10 365 (85.9%)
   5 36 (8.5%)
gm_a4_6
   N-Miss 2495
   0 31 (3.8%)
   10 740 (91.7%)
   5 36 (4.5%)
fm_a4_1
   N-Miss 2910
   0 22 (5.6%)
   10 307 (78.3%)
   20 1 (0.3%)
   5 62 (15.8%)
fm_a4_2
   N-Miss 2854
   0 17 (3.8%)
   10 376 (83.9%)
   5 55 (12.3%)
fm_a4_3
   N-Miss 2442
   0 104 (12.1%)
   10 535 (62.2%)
   5 221 (25.7%)
fm_a4_4
   N-Miss 2526
   0 91 (11.7%)
   10 599 (77.2%)
   5 86 (11.1%)
fm_a4_5
   N-Miss 3023
   0 25 (9.0%)
   10 195 (69.9%)
   5 59 (21.1%)
fm_a4_6
   N-Miss 2804
   0 78 (15.7%)
   10 278 (55.8%)
   5 142 (28.5%)
cg_a4_1
   N-Miss 2558
   0 24 (3.2%)
   10 636 (85.5%)
   5 84 (11.3%)
cg_a4_2
   N-Miss 2752
   0 25 (4.5%)
   10 467 (84.9%)
   5 58 (10.5%)
cg_a4_3
   N-Miss 2504
   0 38 (4.8%)
   10 656 (82.2%)
   5 104 (13.0%)
cg_a4_4
   N-Miss 2905
   0 9 (2.3%)
   10 349 (87.9%)
   5 39 (9.8%)
cg_a4_5
   N-Miss 2364
   0 83 (8.8%)
   10 695 (74.1%)
   5 160 (17.1%)
cg_a4_6
   N-Miss 2527
   0 65 (8.4%)
   10 574 (74.1%)
   5 136 (17.5%)
ps_a4_1
   N-Miss 1410
   0 165 (8.7%)
   10 1439 (76.1%)
   5 288 (15.2%)
ps_a4_2
   N-Miss 2672
   0 41 (6.5%)
   10 441 (70.0%)
   5 148 (23.5%)
ps_a4_3
   N-Miss 2205
   0 116 (10.6%)
   10 845 (77.0%)
   5 136 (12.4%)
ps_a4_4
   N-Miss 2400
   0 57 (6.3%)
   10 643 (71.3%)
   5 202 (22.4%)
ps_a4_5
   N-Miss 1614
   0 317 (18.8%)
   10 1048 (62.1%)
   5 323 (19.1%)
ps_a4_6
   N-Miss 2765
   0 67 (12.5%)
   10 391 (72.8%)
   5 79 (14.7%)
NA
ds_2 <- ds_2 %>% 
  mutate_at(vars(com_a3_1, com_a3_2, com_a3_3, com_a3_4, com_a3_5, com_a3_6,
                     gm_a3_1,   gm_a3_2,    gm_a3_3,    gm_a3_4,    gm_a3_5,    gm_a3_6,
                     fm_a3_1,   fm_a3_2,    fm_a3_3,    fm_a3_4,    fm_a3_5,    fm_a3_6,
                     cg_a3_1,   cg_a3_2,    cg_a3_3,    cg_a3_4,    cg_a3_5,    cg_a3_6,
                     ps_a3_1,   ps_a3_2,    ps_a3_3,    ps_a3_4,    ps_a3_5,    ps_a3_6,
                
                     com_a4_2,  com_a4_3,   com_a4_4,   com_a4_5,   com_a4_6,
                     gm_a4_1,   gm_a4_2,    gm_a4_3,    gm_a4_4,    gm_a4_5,    gm_a4_6,
                     fm_a4_1,   fm_a4_2,    fm_a4_3,    fm_a4_4,    fm_a4_5,    fm_a4_6,
                     cg_a4_1,   cg_a4_2, cg_a4_3,   cg_a4_4,    cg_a4_5,    cg_a4_6,
                     ps_a4_1,   ps_a4_2,    ps_a4_3,    ps_a4_4,    ps_a4_5,    ps_a4_6), 
            ~ifelse(. %in% c(0,5,10), ., NA)) 
ds_2 %>% select(com_a3_1, com_a3_2, com_a3_3, com_a3_4, com_a3_5, com_a3_6,
                     gm_a3_1,   gm_a3_2,    gm_a3_3,    gm_a3_4,    gm_a3_5,    gm_a3_6,
                     fm_a3_1,   fm_a3_2,    fm_a3_3,    fm_a3_4,    fm_a3_5,    fm_a3_6,
                     cg_a3_1,   cg_a3_2,    cg_a3_3,    cg_a3_4,    cg_a3_5,    cg_a3_6,
                     ps_a3_1,   ps_a3_2,    ps_a3_3,    ps_a3_4,    ps_a3_5,    ps_a3_6,
                
                     com_a4_2,  com_a4_3,   com_a4_4,   com_a4_5,   com_a4_6,
                     gm_a4_1,   gm_a4_2,    gm_a4_3,    gm_a4_4,    gm_a4_5,    gm_a4_6,
                     fm_a4_1,   fm_a4_2,    fm_a4_3,    fm_a4_4,    fm_a4_5,    fm_a4_6,
                     cg_a4_1,   cg_a4_2, cg_a4_3,   cg_a4_4,    cg_a4_5,    cg_a4_6,
                     ps_a4_1,   ps_a4_2,    ps_a4_3,    ps_a4_4,    ps_a4_5,    ps_a4_6) %>% 
  mutate_all(., factor) %>% arsenal::tableby(~., data = .) %>% summary()
Overall (N=3302)
com_a3_1
   N-Miss 1
   0 134 (4.1%)
   5 266 (8.1%)
   10 2901 (87.9%)
com_a3_2
   0 201 (6.1%)
   5 370 (11.2%)
   10 2731 (82.7%)
com_a3_3
   0 251 (7.6%)
   5 496 (15.0%)
   10 2555 (77.4%)
com_a3_4
   N-Miss 2
   0 462 (14.0%)
   5 497 (15.1%)
   10 2341 (70.9%)
com_a3_5
   N-Miss 3
   0 464 (14.1%)
   5 529 (16.0%)
   10 2306 (69.9%)
com_a3_6
   N-Miss 2
   0 773 (23.4%)
   5 561 (17.0%)
   10 1966 (59.6%)
gm_a3_1
   N-Miss 1
   0 84 (2.5%)
   5 194 (5.9%)
   10 3023 (91.6%)
gm_a3_2
   N-Miss 1
   0 76 (2.3%)
   5 218 (6.6%)
   10 3007 (91.1%)
gm_a3_3
   N-Miss 2
   0 144 (4.4%)
   5 269 (8.2%)
   10 2887 (87.5%)
gm_a3_4
   N-Miss 1
   0 189 (5.7%)
   5 346 (10.5%)
   10 2766 (83.8%)
gm_a3_5
   N-Miss 1
   0 276 (8.4%)
   5 439 (13.3%)
   10 2586 (78.3%)
gm_a3_6
   0 448 (13.6%)
   5 403 (12.2%)
   10 2451 (74.2%)
fm_a3_1
   N-Miss 1
   0 216 (6.5%)
   5 375 (11.4%)
   10 2710 (82.1%)
fm_a3_2
   N-Miss 3
   0 325 (9.9%)
   5 386 (11.7%)
   10 2588 (78.4%)
fm_a3_3
   N-Miss 6
   0 398 (12.1%)
   10 2356 (71.5%)
   5 542 (16.4%)
fm_a3_4
   N-Miss 4
   0 399 (12.1%)
   5 612 (18.6%)
   10 2287 (69.3%)
fm_a3_5
   N-Miss 6
   0 539 (16.4%)
   5 500 (15.2%)
   10 2257 (68.5%)
fm_a3_6
   N-Miss 2
   0 593 (18.0%)
   5 669 (20.3%)
   10 2038 (61.8%)
cg_a3_1
   N-Miss 2
   0 183 (5.5%)
   5 233 (7.1%)
   10 2884 (87.4%)
cg_a3_2
   N-Miss 3
   0 241 (7.3%)
   5 333 (10.1%)
   10 2725 (82.6%)
cg_a3_3
   N-Miss 1
   0 185 (5.6%)
   5 344 (10.4%)
   10 2772 (84.0%)
cg_a3_4
   N-Miss 1
   0 306 (9.3%)
   5 363 (11.0%)
   10 2632 (79.7%)
cg_a3_5
   N-Miss 3
   0 539 (16.3%)
   5 514 (15.6%)
   10 2246 (68.1%)
cg_a3_6
   N-Miss 4
   0 497 (15.1%)
   5 509 (15.4%)
   10 2292 (69.5%)
ps_a3_1
   N-Miss 5
   0 209 (6.3%)
   5 404 (12.3%)
   10 2684 (81.4%)
ps_a3_2
   N-Miss 4
   0 180 (5.5%)
   5 426 (12.9%)
   10 2692 (81.6%)
ps_a3_3
   N-Miss 1
   0 194 (5.9%)
   5 344 (10.4%)
   10 2763 (83.7%)
ps_a3_4
   0 412 (12.5%)
   5 674 (20.4%)
   10 2216 (67.1%)
ps_a3_5
   N-Miss 3
   0 480 (14.5%)
   5 553 (16.8%)
   10 2266 (68.7%)
ps_a3_6
   N-Miss 1
   0 399 (12.1%)
   5 606 (18.4%)
   10 2296 (69.6%)
com_a4_2
   N-Miss 3123
   0 18 (10.1%)
   10 119 (66.5%)
   5 42 (23.5%)
com_a4_3
   N-Miss 2996
   0 4 (1.3%)
   10 278 (90.8%)
   5 24 (7.8%)
com_a4_4
   N-Miss 2861
   0 23 (5.2%)
   10 383 (86.8%)
   5 35 (7.9%)
com_a4_5
   N-Miss 3025
   0 15 (5.4%)
   10 242 (87.4%)
   5 20 (7.2%)
com_a4_6
   N-Miss 2988
   0 26 (8.3%)
   10 265 (84.4%)
   5 23 (7.3%)
gm_a4_1
   N-Miss 2928
   0 3 (0.8%)
   10 354 (94.7%)
   5 17 (4.5%)
gm_a4_2
   N-Miss 2241
   0 44 (4.1%)
   10 890 (83.9%)
   5 127 (12.0%)
gm_a4_3
   N-Miss 2707
   0 52 (8.7%)
   10 474 (79.7%)
   5 69 (11.6%)
gm_a4_4
   N-Miss 2437
   0 56 (6.5%)
   10 707 (81.7%)
   5 102 (11.8%)
gm_a4_5
   N-Miss 2877
   0 24 (5.6%)
   10 365 (85.9%)
   5 36 (8.5%)
gm_a4_6
   N-Miss 2495
   0 31 (3.8%)
   10 740 (91.7%)
   5 36 (4.5%)
fm_a4_1
   N-Miss 2911
   0 22 (5.6%)
   10 307 (78.5%)
   5 62 (15.9%)
fm_a4_2
   N-Miss 2854
   0 17 (3.8%)
   10 376 (83.9%)
   5 55 (12.3%)
fm_a4_3
   N-Miss 2442
   0 104 (12.1%)
   10 535 (62.2%)
   5 221 (25.7%)
fm_a4_4
   N-Miss 2526
   0 91 (11.7%)
   10 599 (77.2%)
   5 86 (11.1%)
fm_a4_5
   N-Miss 3023
   0 25 (9.0%)
   10 195 (69.9%)
   5 59 (21.1%)
fm_a4_6
   N-Miss 2804
   0 78 (15.7%)
   10 278 (55.8%)
   5 142 (28.5%)
cg_a4_1
   N-Miss 2558
   0 24 (3.2%)
   10 636 (85.5%)
   5 84 (11.3%)
cg_a4_2
   N-Miss 2752
   0 25 (4.5%)
   10 467 (84.9%)
   5 58 (10.5%)
cg_a4_3
   N-Miss 2504
   0 38 (4.8%)
   10 656 (82.2%)
   5 104 (13.0%)
cg_a4_4
   N-Miss 2905
   0 9 (2.3%)
   10 349 (87.9%)
   5 39 (9.8%)
cg_a4_5
   N-Miss 2364
   0 83 (8.8%)
   10 695 (74.1%)
   5 160 (17.1%)
cg_a4_6
   N-Miss 2527
   0 65 (8.4%)
   10 574 (74.1%)
   5 136 (17.5%)
ps_a4_1
   N-Miss 1410
   0 165 (8.7%)
   10 1439 (76.1%)
   5 288 (15.2%)
ps_a4_2
   N-Miss 2672
   0 41 (6.5%)
   10 441 (70.0%)
   5 148 (23.5%)
ps_a4_3
   N-Miss 2205
   0 116 (10.6%)
   10 845 (77.0%)
   5 136 (12.4%)
ps_a4_4
   N-Miss 2400
   0 57 (6.3%)
   10 643 (71.3%)
   5 202 (22.4%)
ps_a4_5
   N-Miss 1614
   0 317 (18.8%)
   10 1048 (62.1%)
   5 323 (19.1%)
ps_a4_6
   N-Miss 2765
   0 67 (12.5%)
   10 391 (72.8%)
   5 79 (14.7%)
NA

4.6 Fix 6: Certify that all numbers are computed with the right coding

ds_2 <- ds_2 %>% 
  mutate_at(vars(com_a3_1, com_a3_2, com_a3_3, com_a3_4, com_a3_5, com_a3_6,
                 gm_a3_1,   gm_a3_2,    gm_a3_3,    gm_a3_4,    gm_a3_5,    gm_a3_6,
                 fm_a3_1,   fm_a3_2,    fm_a3_3,    fm_a3_4,    fm_a3_5,    fm_a3_6,
                 cg_a3_1,   cg_a3_2,    cg_a3_3,    cg_a3_4,    cg_a3_5,    cg_a3_6,
                 ps_a3_1,   ps_a3_2,    ps_a3_3,    ps_a3_4,    ps_a3_5,    ps_a3_6,
                 
                 com_a4_2,  com_a4_3,   com_a4_4,   com_a4_5,   com_a4_6,
                 gm_a4_1,   gm_a4_2,    gm_a4_3,    gm_a4_4,    gm_a4_5,    gm_a4_6,
                 fm_a4_1,   fm_a4_2,    fm_a4_3,    fm_a4_4,    fm_a4_5,    fm_a4_6,
                 cg_a4_1,   cg_a4_2,  cg_a4_3,  cg_a4_4,    cg_a4_5,    cg_a4_6,
                 ps_a4_1,   ps_a4_2,    ps_a4_3,    ps_a4_4,    ps_a4_5,    ps_a4_6), ~as.numeric(.))

4.7 Fix 7: Total scores / Missing data

ds_2 %>% 
  group_by(source) %>% 
  summarise_at(vars(contains("sum")), ~sum(is.na(.))) %>% 
  #summarise(sum(is.na(csum))) %>% 
  adorn_totals() %>% 
  datatable(., options = list(dom='t'))
NA
ds_2 <- ds_2 %>% rowwise() %>% 
  mutate(c_sum = sum(c_across(c(com_a3_1, com_a3_2, com_a3_3, com_a3_4, com_a3_5, com_a3_6)), na.rm=T)) %>% 
  mutate(gm_sum = sum(c_across(c(gm_a3_1,   gm_a3_2,    gm_a3_3,    gm_a3_4,    gm_a3_5,    gm_a3_6)), na.rm=T)) %>% 
  mutate(fm_sum = sum(c_across(c(fm_a3_1,   fm_a3_2,    fm_a3_3,    fm_a3_4,    fm_a3_5,    fm_a3_6)), na.rm=T)) %>% 
  mutate(cg_sum = sum(c_across(c(cg_a3_1,   cg_a3_2,    cg_a3_3,    cg_a3_4,    cg_a3_5,    cg_a3_6)), na.rm=T)) %>% 
  mutate(ps_sum = sum(c_across(c(ps_a3_1,   ps_a3_2,    ps_a3_3,    ps_a3_4,    ps_a3_5,    ps_a3_6)), na.rm=T)) 
                     
ds_2 %>% 
  select(contains("sum")) %>% 
  plot_missing()

4.8 Fix 8: Inconsistecy in ids (repeated)

ds_2 %>% 
  rename(id = id_3) %>% 
  mutate(ds="ds2") %>% 
  add_count(id) %>% 
  filter(n>1) %>% 
  select(id, contains("sum")) %>% 
  arrange(id)
ds_2 <- ds_2 %>% 
  distinct(id_3, .keep_all = TRUE)

4.9 Fix 9: Inconsistency in ids (change)

ds_2 %>% 
  filter(id_3 != id_29) %>% 
  select(id_3)

4.10 Full ds (Waiting for Kimberly’s response)

bind_rows(
ds_1 %>% 
  mutate(ds="ds1") %>% 
  select(id)
,
ds_2 %>% 
  rename(id = id_3) %>% 
  mutate(ds="ds2") %>% 
  select(id)
)%>% 
  add_count(id) %>% 
  filter(n>1)
  distinct(id, .keep_all = T)
view(dfSummary(ds_2))

LS0tDQp0aXRsZTogIkFTUSA0IC0gRGF0YSBQcm9jZXNzaW5nIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LWluZm8gcm9sZT0iYWxlcnQifQ0KDQoqKkRBVEE6IEZpbGUxX0RlbW9fQVNRNFRlc3QxKiogIA0KKipPbiBTZXQgMTIqKiwganVzdCBtaXNzaW5nIG1vbSdzIGFnZSB2YXJpYWJsZS4gSSBhc2tlZCBLaW1iZXJseSBpZiBJIGNhbiBiZSBvZiBhbnkgYXNzaXN0YW5jZS4NCkxhc3QgdXBkYXRlOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYA0KOjo6DQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1pbmZvIHJvbGU9ImFsZXJ0In0NCg0KKipGaWxlMl9EZW1vX0FTUTNhbmRTdXBwbGVtZW50KiogIA0KDQpLaW1iZXJseSwgcGxlYXNlICoqY2xpY2sgW2hlcmVdKCNwcmVwcm9jMikqKiB0byBjaGVjayB0aGUgY2hhbmdlcyBJIG1hZGUgdG8gdGhlIHNlY29uZCBzcHJlYWRzaGVldCANCg0KOjo6DQoNCiMgRGF0YSBwcmVwcm9jZXNzaW5nIChSZXBvcnQpDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC13YXJuaW5nfQ0KPHU+RGVmaW5pdGlvbjwvdT4gRGF0YSBwcmVwcm9jZXNzaW5nIGlzIHRoZSBwcm9jZXNzIG9mIGNvbnZlcnRpbmcgcmF3IGRhdGEgaW50byBhIHdlbGwtcmVhZGFibGUgZm9ybWF0IHRvIGJlIHVzZWQgYnkgc3RhdGlzdGljYWwgYW5kIHBzeWNob21ldHJpYyBhbmFseXNlcy4NCjo6Og0KDQpgYGB7cn0NCnBhY21hbjo6cF9sb2FkKHRpZHl2ZXJzZSwgamFuaXRvciwgYXJzZW5hbCwgRFQsIERhdGFFeHBsb3JlcixzdW1tYXJ5dG9vbHMsIHBzeWNoKQ0KYGBgDQoNCiMjIERhdGEgaW1wb3J0DQoNCmBgYHtyfQ0KZHNfMTwtIHJlYWR4bDo6cmVhZF9leGNlbCgiQzovVXNlcnMvbHVpc2YvRHJvcGJveC9QdWMtUmlvL1Byb2pldG8gLSBBU1EgNCAyMDIxL0RhdGFzZXRzL0FTUTNfU3VwcGxtbnQgYW5kIEFTUTQgdGVzdDEgOC4xOS4yMS54bHN4IiwgDQogICAgY29sX3R5cGVzID0gYygidGV4dCIsICJudW1lcmljIiwgInRleHQiLCANCiAgICAgICAgIm51bWVyaWMiLCAiZGF0ZSIsICJkYXRlIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgDQogICAgICAgICJkYXRlIiwgImRhdGUiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKQ0KDQpiYWNrdXBfZHNfMSA8LSBkc18xDQpgYGANCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KRGF0YSB3YXMgaW1wb3J0ZWQgaW50byBSLiBTb21lIHdhcm5pbmcgd2VyZSByZXBvcnRlZC4NCjo6Og0KDQojIEZpeGVzDQoNCiMjIEZpeCAxOiBSZW1vdmUgZW1wdHkgcm93cyAmIGNvbHVtbnMNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KU29tZSBjb2x1bW5zIGFuZCByb3dzIHdlcmUgY29tcGxldGVseSBlbXB0eS4gRXhhbXBsZTogd2Vla3MgcHJlbWllIChFeGNlbCwgQ29sdW1uIDYpDQpJJ3ZlIGV4Y2x1ZGVkIHRoZXNlIGNvbHVtbnMuDQo6OjoNCg0KYGBge3J9DQpkc18xIDwtIGNsZWFuX25hbWVzKGRzXzEpDQpkc18xIDwtIHJlbW92ZV9lbXB0eShkc18xKQ0KYGBgDQoNCiMjIEZpeCAyOiBUcmFuc3Rvcm0gZG90cyBpbnRvIG1pc2luZw0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpBY2NvcmRpbmcgdG8gb3VyIGxhc3QgZS1tYWlsLCB2YWx1ZXMgZXF1YWwgdG8gIi4iIChkb3RzKSB3ZXJlDQp0cmFuc2Zvcm1lZCBpbnRvIG1pc3NpbmcuDQo6OjoNCg0KYGBge3J9DQpkc18xIDwtIGRzXzEgJT4lIA0KICBtdXRhdGVfYXQodmFycygtZG9iLC1kYXRjb20sLWRhdGNvbV8yLC1kb2JfMiksfm5hX2lmKC4sICIuIikpDQpgYGANCg0KDQojIyBGaXggMzogV3JvbmcgdmFsdWVzIGluIEFTUSA0IGl0ZW1zDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1kYW5nZXIgcm9sZT0iYWxlcnQifQ0KPGI+QUxFUlQ8L2I+OiBLaW1iZXJseSwgcGxlYXNlIGNoZWNrIHRoZSB2YWx1ZXMgb2YgQVNRLTQgdmFyaWFibGVzLiBUaGUgdGFibGUgYmVsb3cgc2hvd2Nhc3Qgc29tZSBpbmNvbnNpc3RlbmNpZXMuIFBsZWFzZSBjaGVjayBpdCBpbiBFeGNlbC4gR28gdG8gbGluZSAzNTI0LCBjb2x1bW4gQUogYW5kIGNsaWNrIHRoZXJlLiBZb3UnbGwgc2VlIHRoYXQgZXhjZWwgY2hhbmdlZCAiMTAiIHRvICIxMC40ODQ5NjI0MDYwMTUiLiBTYW1lIHRoaW5nIGF0IGxpbmUgMTA0NzYuDQo6OjoNCg0KDQo6Ojogey5hbGVydCAuYWxlcnQtaW5mbyByb2xlPSJhbGVydCJ9DQpvbiBTZXAgMTAsIEZpeGVkIGFmdGVyIHRhbGtpbmcgd2l0aCBLaW1iZXJseSANCjo6Og0KDQpgYGB7cn0NCng8LWRzXzEgJT4lIHNlbGVjdChjb21fYTRfMSwgY29tX2E0XzIsIGNvbV9hNF8zLCBjb21fYTRfNCwgY29tX2E0XzUsIGNvbV9hNF82LA0KICBnbV9hNF8xLCBnbV9hNF8yLCBnbV9hNF8zLCBnbV9hNF80LCBnbV9hNF81LCBnbV9hNF82LA0KICBmbV9hNF8xLCBmbV9hNF8yLCBmbV9hNF8zLCBmbV9hNF80LCBmbV9hNF81LCBmbV9hNF82LA0KICBjZ19hNF8xLCBjZ19hNF8yLCBjZ19hNF8zLCBjZ19hNF80LCBjZ19hNF81LCBjZ19hNF82LA0KICBwc19hNF8xLCBwc19hNF8yLCBwc19hNF8zLCBwc19hNF80LCBwc19hNF81LCBwc19hNF82KSAlPiUgDQogIG11dGF0ZV9hbGwoLiwgZmFjdG9yKSANCmFyc2VuYWw6OnRhYmxlYnkofi4sIGRhdGEgPSB4KSAlPiUgc3VtbWFyeSgpDQpgYGANCg0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpFeGNlcHQgZm9yIDAsNSwgYW5kIDEwLCBJJ2xsIGNoYW5nZSBhbGwgb3RoZXIgdmFsdWVzIHRvIG1pc3NpbmcgY2FzZXMuICANCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMSA8LSBkc18xICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY29tX2E0XzEsIGNvbV9hNF8yLCBjb21fYTRfMywgY29tX2E0XzQsIGNvbV9hNF81LCBjb21fYTRfNiwNCiAgZ21fYTRfMSwgZ21fYTRfMiwgZ21fYTRfMywgZ21fYTRfNCwgZ21fYTRfNSwgZ21fYTRfNiwNCiAgZm1fYTRfMSwgZm1fYTRfMiwgZm1fYTRfMywgZm1fYTRfNCwgZm1fYTRfNSwgZm1fYTRfNiwNCiAgY2dfYTRfMSwgY2dfYTRfMiwgY2dfYTRfMywgY2dfYTRfNCwgY2dfYTRfNSwgY2dfYTRfNiwNCiAgcHNfYTRfMSwgcHNfYTRfMiwgcHNfYTRfMywgcHNfYTRfNCwgcHNfYTRfNSwgcHNfYTRfNiksIH5pZmVsc2UoLiAlaW4lIGMoMCw1LDEwKSwgLiwgTkEpKSANCmBgYA0KDQpgYGB7cn0NCnJtKHgpDQpgYGANCg0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpQbGVhc2UgdGVsbCBtZSBpZiB5b3UgYWdyZWUgd2l0aCBteSBzb2x1dGlvbi4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMSAlPiUgDQogIHNlbGVjdChjb21fYTRfMSwgY29tX2E0XzIsIGNvbV9hNF8zLCBjb21fYTRfNCwgY29tX2E0XzUsIGNvbV9hNF82LA0KICBnbV9hNF8xLCBnbV9hNF8yLCBnbV9hNF8zLCBnbV9hNF80LCBnbV9hNF81LCBnbV9hNF82LA0KICBmbV9hNF8xLCBmbV9hNF8yLCBmbV9hNF8zLCBmbV9hNF80LCBmbV9hNF81LCBmbV9hNF82LA0KICBjZ19hNF8xLCBjZ19hNF8yLCBjZ19hNF8zLCBjZ19hNF80LCBjZ19hNF81LCBjZ19hNF82LA0KICBwc19hNF8xLCBwc19hNF8yLCBwc19hNF8zLCBwc19hNF80LCBwc19hNF81LCBwc19hNF82KSAlPiUgDQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCkpICU+JSANCiAgY291bnQodmFsdWUpICU+JSANCiAgbXV0YXRlKHBlcmNlbnQgPSAoMTAwICogbiAvIHN1bShuKSkgJT4lIHJvdW5kKGRpZ2l0cyA9IDEpKQ0KYGBgDQoNCg0KIyMgRml4IDQ6IFRvdGFsIHNjb3JlcyAvIE1pc3NpbmcgZGF0YQ0KDQo6Ojogey5hbGVydCAuYWxlcnQtZGFuZ2VyIHJvbGU9ImFsZXJ0In0NCjxiPkFMRVJUPC9iPjogS2ltYmVybHksIHBsZWFzZSBjbGljayAiMyIgaW4gdGhlIHRhYmxlIGJlbG93LiBZb3Ugd2lsbA0Kc2VlIHRoYXQgYWJvdXQgNyUgKG49MTI5MSkgb2YgdGhlIHRvdGFscyBvZiBjb21tdW5pY2F0aW9uLCBncm9zcyBtb3RvciwNCmZpbmUgbW90b3IsIHByb2JsZW0gc29sdmluZywgYW5kIHBlcnNuYWwgYW5kIHNvY2lhbCBhcmUgbWlzc2luZy4NCjo6Og0KDQo6Ojogey5hbGVydCAuYWxlcnQtaW5mbyByb2xlPSJhbGVydCJ9DQpvbiBTZXAgMTAsIEZpeGVkIGFmdGVyIHRhbGtpbmcgd2l0aCBLaW1iZXJseSANCjo6Og0KDQoNCmBgYHtyfQ0KcHJvZmlsZV9taXNzaW5nKGRzXzEpICU+JSANCiAgYXJyYW5nZShkZXNjKG51bV9taXNzaW5nKSkgJT4lIA0KICBtdXRhdGUocGN0X21pc3NpbmcgPSBmb3JtYXRDKHBjdF9taXNzaW5nKSkgJT4lIA0KICBEVDo6ZGF0YXRhYmxlKC4sIG9wdGlvbnMgPSBsaXN0KGRvbT0ndCcpKQ0KYGBgDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1pbmZvIHJvbGU9ImFsZXJ0In0NCkluIHRoZSB0YWJsZSBiZWxvdywgeW91J2xsIHNlZSB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgY2FzZXMgZm9yIGVhY2gNCnNvdXJjZS4gRm9yIGVhbXBsZSwgdGhlIHNvdXJjZSAiQVNRIEJESSIgaGFzIDUxOSBtaXNzaW5nIGNhc2VzLg0KOjo6DQoNCmBgYHtyfQ0KZHNfMSAlPiUgDQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhjb250YWlucygic3VtIikpLCB+c3VtKGlzLm5hKC4pKSkgJT4lIA0KICAjc3VtbWFyaXNlKHN1bShpcy5uYShjc3VtKSkpICU+JSANCiAgYWRvcm5fdG90YWxzKCkgJT4lIA0KICBkYXRhdGFibGUoLiwgb3B0aW9ucyA9IGxpc3QoZG9tPSd0JykpDQoNCmBgYA0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpJJ2xsIGNvbXB1dGUgdGhlIHNjb3JlcyBmb3IgZWFjaCBjaGlsZCBhbmQgdGhlbiBjaGVjayB0aGUgbWlzc2luZyBjYXNlcw0KYWdhaW4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMSA8LSBkc18xICU+JSByb3d3aXNlKCkgJT4lIA0KICBtdXRhdGUoY3N1bSA9IHN1bShjX2Fjcm9zcyhjKGNvbV9hNF8xLCBjb21fYTRfMiwgY29tX2E0XzMsIGNvbV9hNF80LCBjb21fYTRfNSwgY29tX2E0XzYpKSwgbmEucm09VCkpICU+JSANCiAgbXV0YXRlKGdtc3VtID0gc3VtKGNfYWNyb3NzKGMoZ21fYTRfMSwgZ21fYTRfMiwgZ21fYTRfMywgZ21fYTRfNCwgZ21fYTRfNSwgZ21fYTRfNikpLCBuYS5ybT1UKSkgJT4lIA0KICBtdXRhdGUoZm1zdW0gPSBzdW0oY19hY3Jvc3MoYyhmbV9hNF8xLCBmbV9hNF8yLCBmbV9hNF8zLCBmbV9hNF80LCBmbV9hNF81LCBmbV9hNF82KSksIG5hLnJtPVQpKSAlPiUgDQogIG11dGF0ZShjZ3N1bV9hNCA9IHN1bShjX2Fjcm9zcyhjKGNnX2E0XzEsIGNnX2E0XzIsIGNnX2E0XzMsIGNnX2E0XzQsIGNnX2E0XzUsIGNnX2E0XzYpKSwgbmEucm09VCkpICU+JSANCiAgbXV0YXRlKHBzdW1fYTQgPSBzdW0oY19hY3Jvc3MoYyhwc19hNF8xLCBwc19hNF8yLCBwc19hNF8zLCBwc19hNF80LCBwc19hNF81LCBwc19hNF82KSksIG5hLnJtPVQpKSANCmBgYA0KDQpgYGB7cn0NCmRzXzEgJT4lIA0KICBzZWxlY3QoY29udGFpbnMoInN1bSIpKSAlPiUgDQogIHBsb3RfbWlzc2luZygpDQpgYGANCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KUGxlYXNlIHRlbGwgbWUgaWYgeW91IGFncmVlIHdpdGggbXkgc29sdXRpb24uDQo6OjoNCg0KIyMgRml4IDU6IE9uZSB3cm9uZyBJRA0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQppZCBhbmQgaWRfMiBhcmUgcHJldHR5IG11Y2ggdGhlIHNhbWUsIGJ1dCBmb3Igb25lIHBhcnRpY2lwYW50LiBUaGlzIHdhcyBmaXhlZCBhbmQgS2ltYmVybHkgd2lsbCBjaGVjayB0aGUgYWNjdXJhY3kgb2YgdGhpcyBwcm9jZWR1cmUuIA0KOjo6DQoNCg0KYGBge3J9DQpkc18xIDwtIGRzXzEgJT4lIG11dGF0ZShpZF8yX2ZpeCA9IGlkKQ0KYGBgDQoNCg0KIyMgRml4IDY6IEdlbmRlcg0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQoxNCBwYXJ0aWNpcGFudHMgaGFkIGdlbmRlciBudW1iZXIgMy4gDQo6OjoNCg0KYGBge3J9DQpkc18xICU+JSBjb3VudChnZW5kZXIpDQpgYGANCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KSSd2ZSBjcmVhdGVkIGEgbmV3IHZhcmlhYmxlDQooZ2VuZGVyX2ZpeCkgaW4gd2hpY2ggdGhlc2UgbnVtYmVycyB3ZXJlIHJlcGxhY2VkIHRvICptaXNzaW5nKi4gV2UgY2FuDQpjaGFuZ2UgdGhpcyBsYXRlci4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMSA8LSBkc18xICU+JSANCiAgbXV0YXRlKGdlbmRlcl9maXggPSBjYXNlX3doZW4oDQogICAgZ2VuZGVyID09IDEgfiAiTWFsZSIsDQogICAgZ2VuZGVyID09IDIgfiAiRmVtYWxlIiwNCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICApKSAlPiUgDQogIG11dGF0ZShnZW5kZXJfZml4ID0gYXMuZmFjdG9yKGdlbmRlcl9maXgpKSANCg0KYGBgDQoNCiMjIEZpeCA3OiBNb20gZWR1Yw0KDQo6Ojogey5hbGVydCAuYWxlcnQtaW5mbyByb2xlPSJhbGVydCJ9DQpJbiB0aGUgY3VycmVudCBkcywgbW9tIGVkdWNhdGlvbiBoYWQgNiBvcHRpb25zLiBTZWUgdGFibGUgYmVsb3cuDQo6OjoNCg0KDQpgYGB7cn0NCmRzXzEgJT4lIGNvdW50KG1vbWVkKQ0KYGBgDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NCkkgdHJhbnNmb3JtZWQgdGhpcyAwIHZhbHVlIGludG8gbWlzc2luZw0KOjo6DQoNCmBgYHtyfQ0KZHNfMSA8LSBkc18xICU+JSANCiAgbXV0YXRlKG1vbWVkX2ZpeCA9IGlmX2Vsc2UobW9tZWQgPT0gMCwgTkFfcmVhbF8sIG1vbWVkKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZHNfMSA8LSBkc18xICU+JSANCiAgbXV0YXRlKG1vbWVkX2ZpeCA9IGZhY3Rvcihtb21lZF9maXgpKSAlPiUgDQogIG11dGF0ZShtb21lZF9maXggPSBmY3RfcmVsZXZlbChtb21lZF9maXgsIHNvcnQpKSANCmBgYA0KDQpgYGB7cn0NCmRzXzEgJT4lIA0KICBjb3VudChtb21lZF9maXgpDQpgYGANCg0KDQoNCiMjIEZpeCA4OiBNb20ncyBhZ2UgKEkgZGlkIG5vdCBmaXggaXQpDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1kYW5nZXIgcm9sZT0iYWxlcnQifQ0KPGI+QUxFUlQ8L2I+OiBTb21lIHVua293biB2YWx1ZXMgd2VyZSBwcmVzZW50ZWQgaW4gdGhpcyB2YXJpYWJsZS4gU2VlIHRhYmxlIGJlbG93DQo6OjoNCg0KYGBge3J9DQoNCmRzXzEgJT4lIGNvdW50KG1vbWFnZSkgJT4lIA0KICAgIGRhdGF0YWJsZSguKQ0KYGBgDQoNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LWluZm8gcm9sZT0iYWxlcnQifQ0KS2ltYmVybHksIHRoaXMgdmFyaWFibGUgd2FzIG5vdCBjaGFuZ2VkIChvciBmaXhlZCkNCjo6Og0KDQoNCiMjIEZpeCA5OiBJbmNvbWUNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KVGhpcyB2YXJpYWJsZSB3YXMgcHJldmlvdXNseSBkZWZpbmVkIGFzIG51bWVyaWMuIEkndmUgY2hhbmdlZCB0byBmYWN0b3INCjo6Og0KDQpgYGB7cn0NCmRzXzE8LSBkc18xICU+JSANCiAgbXV0YXRlKGluY29tZV9maXggPSBhcy5mYWN0b3IoaW5jb21lMSkpICU+JSANCiAgbXV0YXRlKGluY29tZV9maXggPSBmY3RfcmVsZXZlbChpbmNvbWVfZml4LCBzb3J0KSkgDQpgYGANCg0KYGBge3J9DQpkc18xICU+JSBjb3VudChpbmNvbWVfZml4KQ0KYGBgDQoNCiMjIEZpeCAxMDogRGlzYWJpbGl0eQ0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpJbiB0aGUgY3VycmVudCBkcywgZGlzYWJpbGl0eSBoYWQgNCBvcHRpb25zLiBTZWUgdGFibGUgYmVsb3cuDQo6OjoNCg0KYGBge3J9DQpkc18xICU+JSBjb3VudChkaXNhYikgDQpgYGANCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KSSd2ZSBjcmVhdGVkIGEgZGlzYWJfZml4IHdpdGggMCAobm8gZGlzYWJpbGl0eSksIDEgKGRpc2FiaWxpdHkpLCBhbmQNCm1pc3NpbmcgY2FzZXMgKGFsbCBvdGhlciB2YWx1ZXMpDQo6OjoNCg0KYGBge3J9DQpkc18xIDwtIGRzXzEgJT4lIA0KICBtdXRhdGUoZGlzYWJfZml4ID0gY2FzZV93aGVuKA0KICAgIGRpc2FiID09IDAgfiAiMCIsDQogICAgZGlzYWIgPT0gMSB+ICIxIiwNCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICApKSAlPiUgDQogbXV0YXRlKGRpc2FiX2ZpeCA9IGFzLmZhY3RvcihkaXNhYl9maXgpKQ0KDQpgYGANCg0KYGBge3J9DQpkc18xICU+JSBjb3VudChkaXNhYl9maXgpDQpgYGANCg0KIyMgRml4IDExOiBBdCByaXNrDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NCkF0IHJpc2sgd2FzIGNvbXBvc2VkIGZvciAxNjI3MCBkb3RzIChtaXNzaW5nIGNhc2VzKS4gVGhlIG51bWJlciAxDQphcHBlYXJlZCA2MyB0aW1lcywgMiBhcHBlYXJlZCA4NSwgYW5kIDMgd2FzIDUyLg0KOjo6DQoNCmBgYHtyfQ0KZHNfMSAlPiUgY291bnQoYXRyaXNrKQ0KYGBgDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NClVwZGF0ZWQgb25lIFNlcCAxMi4gTWlzc2luZyBjYXNlcyB3ZXJlICoqbm90KiogdHJhbnNmb3JtZWQgdG8gMC4gDQo6OjoNCg0KYGBge3J9DQpkc18xIDwtIGRzXzEgJT4lIA0KICBtdXRhdGUoYXRyaXNrX2ZpeCA9IGNhc2Vfd2hlbigNCiAgICBhdHJpc2sgPT0gMCB+ICIwIiwNCiAgICBhdHJpc2sgPT0gMSB+ICIxIiwNCiAgICBhdHJpc2sgPT0gMiB+ICIyIiwNCiAgICBhdHJpc2sgPT0gMyB+ICIzIiwNCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICApKSAlPiUgDQogbXV0YXRlKGF0cmlza19maXggPSBhcy5mYWN0b3IoYXRyaXNrX2ZpeCkpDQpgYGANCg0KYGBge3J9DQpkc18xICU+JSBjb3VudChhdHJpc2tfZml4KQ0KYGBgDQoNCiMjIEZpeCAxMjogTGFuZ3VhZ2UNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KVGhpcyB2YXJpYWJsZSB3YXMgcHJldmlvdXNseSBkZWZpbmVkIGFzIG51bWVyaWMuIEkndmUgY2hhbmdlZCB0byBmYWN0b3INCjo6Og0KDQpgYGB7cn0NCmRzXzEgPC0gZHNfMSAlPiUgDQogIG11dGF0ZShsYW5ndWFnZV9maXggPSBhcy5mYWN0b3IobGFuZ3VhZ2UpKQ0KYGBgDQoNCmBgYHtyfQ0KZHNfMSAlPiUgY291bnQobGFuZ3VhZ2VfZml4KQ0KYGBgDQojIyBGaXggMTM6IFF1ZXN0aW9ubmFpcmVzDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NClJvdyBudW1iZXIgMTc1MjcgKGV4Y2VsKSB3YXMgdXNlZCB0byBjb21wdXRlIHRoZSBudW1iZXIgb2YgcXVlc3Rpb25uYWlyZXMuIEhvd2V2ZXIsIHRoaXMgaW5mbyB3YXMgYWRkZWQgaW4gdGhlICJJRCIgY29sdW1uLiBJJ3ZlIGRlbGV0ZWQgdGhpcyByb3cuIFRoZXJlZm9yZSwgUiB3YXMgKGluY29ycmVjdGx5KSB0aGlua2luZyB3YXMgcGFydGljaXBhbnQgaGFkIG1pc3NpbmcgY2FzZXMgaW4gYWxtb3N0IGFsbCB2YXJpYWJsZXMuDQo6OjoNCg0KDQpgYGB7cn0NCmRzXzEgJT4lIGNvdW50KHF1ZXN0KQ0KYGBgDQpgYGB7cn0NCmRzXzEgPC0gZHNfMSAlPiUgZmlsdGVyKGlkICE9ICIxNzUyNCIpDQpgYGANCg0KDQpgYGB7cn0NCmRzXzEgPC0gZHNfMSAlPiUgDQogIG11dGF0ZShxdWVzdF9maXggPSBhcy5mYWN0b3IocXVlc3QpKSANCmBgYA0KDQoNCiMjIEZpeCAxNDogUmFjZQ0KDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NClRoaXMgdmFyaWFibGUgd2FzIHByZXZpb3VzbHkgZGVmaW5lZCBhcyBudW1lcmljLiBJJ3ZlIGNoYW5nZWQgdG8gZmFjdG9yDQo6OjoNCg0KDQpgYGB7cn0NCmRzXzEgPC0gZHNfMSAlPiUgDQogIG11dGF0ZShyYWNlX2ZpeCA9IGFzLmZhY3RvcihyYWNlKSkgJT4lICANCiAgbXV0YXRlKHJhY2VfZml4ID0gZmN0X3JlbGV2ZWwocmFjZV9maXgsIHNvcnQpKSANCmBgYA0KDQpgYGB7cn0NCmRzXzEgJT4lIGNvdW50KHJhY2VfZml4KQ0KYGBgDQoNCg0KIyMgRml4IDE1OiBDb21wdXRlIGEgdmFyaWFibGUgb2Ygd2Vic2l0ZSBkYXRhIGNvbGxlY3Rpb24NCg0KYGBge3J9DQpkc18xIDwtIGRzXzEgJT4lIG11dGF0ZSh3ZWJzaXRlID0gaWZfZWxzZShzb3VyY2UgPT0gIkFTUTR3ZWJzaXRlIiwib25saW5lIiwicGFwZXIiKSkNCmBgYA0KDQoNCg0KIyMgU2VuZCBpdCB0byBLaW1iZXJseQ0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0Kd3JpdGV4bDo6d3JpdGVfeGxzeChkc18xLCAiZHNfYXNxNF9sdWlzLnhsc3giKQ0KYGBgDQoNCg0KYGBge3J9DQp2aWV3KGRmU3VtbWFyeShkc18xKSkNCmBgYA0KDQoNCiMgRGF0YSBwcmVwcm9jZXNzaW5nIDIgeyNwcmVwcm9jMn0NCg0KDQojIyBEYXRhIGltcG9ydA0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KZHNfMiA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9sdWlzZi9Ecm9wYm94L1B1Yy1SaW8vUHJvamV0byAtIEFTUSA0IDIwMjEvRGF0YXNldHMvQVNRM19TdXBwbG1udCBhbmQgQVNRNCB0ZXN0MSA4LjE5LjIxLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gYygidGV4dCIsICJudW1lcmljIiwgInRleHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJkYXRlIiwgImRhdGUiLCAidGV4dCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZSIsICJkYXRlIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgInRleHQiKSwgc2hlZXQgPSAyKQ0KDQpiYWNrdXBfZHNfMiA8LSBkc18yDQpgYGANCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KRGF0YSB3YXMgaW1wb3J0ZWQgaW50byBSLiBTb21lIHdhcm5pbmcgd2VyZSByZXBvcnRlZC4NCjo6Og0KDQoNCiMgRml4ZXMNCg0KIyMgRml4IDE6IEFkanVzdCB2YXJpYWJsZSBuYW1lcw0KDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NCkludGVybmFsIGlzc3VlLiBKdXN0IHRvIG1ha2UgdGhlIHZhcmlhYmxlcyBuYW1lcyBjb3JyZWNseSBjb2RlZCBmb3Igc3RhdGlzdGljYWwgYW5hbHlzaXMuDQo6OjoNCg0KYGBge3J9DQpkc18yIDwtIGNsZWFuX25hbWVzKGRzXzIpDQpgYGANCg0KDQojIyBGaXggMjogUmVtb3ZlIHdyb25nIHZhbHVlIGluIGxhbmd1YWdlDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NClRoZSBudW1iZXIgb2Ygcm93cyB3YXMgYWRkZWQgaW4gdGhlIGV4Y2VsIHJvdyBudW1iZXIgMzMwNS4gUiB0aGlua3MgdGhpcyByb3cgcmVwcmVzZW50cyBhIGNhc2UuIEkgcmVtb3ZlZCB0aGlzIHJvdy4NCjo6Og0KDQpgYGB7cn0NCmRzXzIgPC0gZHNfMiAlPiUgZmlsdGVyKGxhbmd1YWdlICE9ICIzMzAyIikNCmBgYA0KDQoNCiMjIEZpeCAzOiBUcmFuc3Rvcm0gZG90cyBpbnRvIG1pc2luZw0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpBY2NvcmRpbmcgdG8gb3VyIGxhc3QgZS1tYWlsLCB2YWx1ZXMgZXF1YWwgdG8gIi4iIChkb3RzKSB3ZXJlDQp0cmFuc2Zvcm1lZCBpbnRvIG1pc3NpbmcuDQo6OjoNCg0KYGBge3J9DQpkc18yIDwtIGRzXzIgJT4lICNtdXRhdGVfYWxsKC4sIH5uYV9pZiguLCAiLiIpKQ0KICBtdXRhdGVfYXQodmFycygtZG9iXzUsIC1kYXRjb21fNiwtZG9iXzMxLC1kYXRjb21fMzIpLH5uYV9pZiguLCAiLiIpKQ0KYGBgDQoNCg0KDQojIyBGaXggNDogUmVtb3ZlIGVtcHR5IHJvd3MgJiBjb2x1bW5zDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NClNvbWUgcm93cy9jb2x1bW5zIGFuZCByb3dzIHdlcmUgZW1wdHkuIENoZWNrICJldmFsIiwgdmFsaWQiLCAicmVsaWFiJywgKiJjb21fYTRfMSIqDQo6OjoNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LWRhbmdlciByb2xlPSJhbGVydCJ9DQo8Yj5BTEVSVDwvYj46IEtpbWJlcmx5LCBjb21fYTRfMSBpcyAxMDAlIC4gSXMgdGhpcyBhbHJpZ2h0ID8NCjo6Og0KDQoNCg0KYGBge3J9DQpkc18yICU+JSBtYXAoLiwgfnN1bShpcy5uYSguKSkpICU+JSBwdXJycjo6c2ltcGxpZnkoKSANCmBgYA0KDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NCkkndmUgZXhjbHVkZWQgdGhlc2UgY29sdW1ucy4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMiA8LSByZW1vdmVfZW1wdHkoZHNfMikNCmBgYA0KDQoNCg0KIyMgRml4IDU6IFdyb25nIHZhbHVlcyBpbiBBU1EgaXRlbXMNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LWRhbmdlciByb2xlPSJhbGVydCJ9DQo8Yj5BTEVSVDwvYj46IEtpbWJlcmx5LCBwbGVhc2UgY2hlY2sgdGhlIHZhbHVlcyBvZiBBU1EtMyB2YXJpYWJsZXMgKHNwcmVlZHNoZWV0IDIpLiBUaGUgdGFibGUgYmVsb3cgc2hvd2Nhc3Qgc29tZSBpbmNvbnNpc3RlbmNpZXMuIFBsZWFzZSBjaGVjayBpdCBpbiB5b3VyIEV4Y2VsIGZpbGUgcm93IDIyMTYsIGNvbHVtbiBBUyAoZ21fYTNfM18pIGFuZC9vciByb3cgMjgzNCwgY29sdW1uIEFaIChmbV9hM18zKS4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMiAlPiUgc2VsZWN0KGNvbV9hM18xLCBjb21fYTNfMiwgY29tX2EzXzMsIGNvbV9hM180LCBjb21fYTNfNSwgY29tX2EzXzYsDQogICAgICAgICAgICAgICAgICAgICBnbV9hM18xLAlnbV9hM18yLAlnbV9hM18zLAlnbV9hM180LAlnbV9hM181LAlnbV9hM182LA0KICAgICAgICAgICAgICAgICAgICAgZm1fYTNfMSwJZm1fYTNfMiwJZm1fYTNfMywJZm1fYTNfNCwJZm1fYTNfNSwJZm1fYTNfNiwNCiAgICAgICAgICAgICAgICAgICAgIGNnX2EzXzEsCWNnX2EzXzIsCWNnX2EzXzMsCWNnX2EzXzQsCWNnX2EzXzUsCWNnX2EzXzYsDQogICAgICAgICAgICAgICAgICAgICBwc19hM18xLAlwc19hM18yLAlwc19hM18zLAlwc19hM180LAlwc19hM181LAlwc19hM182LA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgY29tX2E0XzIsCWNvbV9hNF8zLAljb21fYTRfNCwJY29tX2E0XzUsCWNvbV9hNF82LA0KICAgICAgICAgICAgICAgICAgICAgZ21fYTRfMSwJZ21fYTRfMiwJZ21fYTRfMywJZ21fYTRfNCwJZ21fYTRfNSwJZ21fYTRfNiwNCiAgICAgICAgICAgICAgICAgICAgIGZtX2E0XzEsCWZtX2E0XzIsCWZtX2E0XzMsCWZtX2E0XzQsCWZtX2E0XzUsCWZtX2E0XzYsDQogICAgICAgICAgICAgICAgICAgICBjZ19hNF8xLAljZ19hNF8yLCBjZ19hNF8zLAljZ19hNF80LAljZ19hNF81LAljZ19hNF82LA0KICAgICAgICAgICAgICAgICAgICAgcHNfYTRfMSwJcHNfYTRfMiwJcHNfYTRfMywJcHNfYTRfNCwJcHNfYTRfNSwJcHNfYTRfNikgJT4lIA0KICBtdXRhdGVfYWxsKC4sIGZhY3RvcikgJT4lIGFyc2VuYWw6OnRhYmxlYnkofi4sIGRhdGEgPSAuKSAlPiUgc3VtbWFyeSgpDQpgYGANCg0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpFeGNlcHQgZm9yIDAsNSwgYW5kIDEwLCBJJ2xsIGNoYW5nZSBhbGwgb3RoZXIgdmFsdWVzIHRvIG1pc3NpbmcgY2FzZXMuICANCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMiA8LSBkc18yICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY29tX2EzXzEsIGNvbV9hM18yLCBjb21fYTNfMywgY29tX2EzXzQsIGNvbV9hM181LCBjb21fYTNfNiwNCiAgICAgICAgICAgICAgICAgICAgIGdtX2EzXzEsCWdtX2EzXzIsCWdtX2EzXzMsCWdtX2EzXzQsCWdtX2EzXzUsCWdtX2EzXzYsDQogICAgICAgICAgICAgICAgICAgICBmbV9hM18xLAlmbV9hM18yLAlmbV9hM18zLAlmbV9hM180LAlmbV9hM181LAlmbV9hM182LA0KICAgICAgICAgICAgICAgICAgICAgY2dfYTNfMSwJY2dfYTNfMiwJY2dfYTNfMywJY2dfYTNfNCwJY2dfYTNfNSwJY2dfYTNfNiwNCiAgICAgICAgICAgICAgICAgICAgIHBzX2EzXzEsCXBzX2EzXzIsCXBzX2EzXzMsCXBzX2EzXzQsCXBzX2EzXzUsCXBzX2EzXzYsDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICBjb21fYTRfMiwJY29tX2E0XzMsCWNvbV9hNF80LAljb21fYTRfNSwJY29tX2E0XzYsDQogICAgICAgICAgICAgICAgICAgICBnbV9hNF8xLAlnbV9hNF8yLAlnbV9hNF8zLAlnbV9hNF80LAlnbV9hNF81LAlnbV9hNF82LA0KICAgICAgICAgICAgICAgICAgICAgZm1fYTRfMSwJZm1fYTRfMiwJZm1fYTRfMywJZm1fYTRfNCwJZm1fYTRfNSwJZm1fYTRfNiwNCiAgICAgICAgICAgICAgICAgICAgIGNnX2E0XzEsCWNnX2E0XzIsIGNnX2E0XzMsCWNnX2E0XzQsCWNnX2E0XzUsCWNnX2E0XzYsDQogICAgICAgICAgICAgICAgICAgICBwc19hNF8xLAlwc19hNF8yLAlwc19hNF8zLAlwc19hNF80LAlwc19hNF81LAlwc19hNF82KSwgDQogICAgICAgICAgICB+aWZlbHNlKC4gJWluJSBjKDAsNSwxMCksIC4sIE5BKSkgDQpgYGANCg0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpQbGVhc2UgdGVsbCBtZSBpZiB5b3UgYWdyZWUgd2l0aCBteSBzb2x1dGlvbi4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMiAlPiUgc2VsZWN0KGNvbV9hM18xLCBjb21fYTNfMiwgY29tX2EzXzMsIGNvbV9hM180LCBjb21fYTNfNSwgY29tX2EzXzYsDQogICAgICAgICAgICAgICAgICAgICBnbV9hM18xLAlnbV9hM18yLAlnbV9hM18zLAlnbV9hM180LAlnbV9hM181LAlnbV9hM182LA0KICAgICAgICAgICAgICAgICAgICAgZm1fYTNfMSwJZm1fYTNfMiwJZm1fYTNfMywJZm1fYTNfNCwJZm1fYTNfNSwJZm1fYTNfNiwNCiAgICAgICAgICAgICAgICAgICAgIGNnX2EzXzEsCWNnX2EzXzIsCWNnX2EzXzMsCWNnX2EzXzQsCWNnX2EzXzUsCWNnX2EzXzYsDQogICAgICAgICAgICAgICAgICAgICBwc19hM18xLAlwc19hM18yLAlwc19hM18zLAlwc19hM180LAlwc19hM181LAlwc19hM182LA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgY29tX2E0XzIsCWNvbV9hNF8zLAljb21fYTRfNCwJY29tX2E0XzUsCWNvbV9hNF82LA0KICAgICAgICAgICAgICAgICAgICAgZ21fYTRfMSwJZ21fYTRfMiwJZ21fYTRfMywJZ21fYTRfNCwJZ21fYTRfNSwJZ21fYTRfNiwNCiAgICAgICAgICAgICAgICAgICAgIGZtX2E0XzEsCWZtX2E0XzIsCWZtX2E0XzMsCWZtX2E0XzQsCWZtX2E0XzUsCWZtX2E0XzYsDQogICAgICAgICAgICAgICAgICAgICBjZ19hNF8xLAljZ19hNF8yLCBjZ19hNF8zLAljZ19hNF80LAljZ19hNF81LAljZ19hNF82LA0KICAgICAgICAgICAgICAgICAgICAgcHNfYTRfMSwJcHNfYTRfMiwJcHNfYTRfMywJcHNfYTRfNCwJcHNfYTRfNSwJcHNfYTRfNikgJT4lIA0KICBtdXRhdGVfYWxsKC4sIGZhY3RvcikgJT4lIGFyc2VuYWw6OnRhYmxlYnkofi4sIGRhdGEgPSAuKSAlPiUgc3VtbWFyeSgpDQpgYGANCg0KDQoNCiMjIEZpeCA2OiBDZXJ0aWZ5IHRoYXQgYWxsIG51bWJlcnMgYXJlIGNvbXB1dGVkIHdpdGggdGhlIHJpZ2h0IGNvZGluZw0KDQo6Ojogey5hbGVydCAuYWxlcnQtc3VjY2VzcyByb2xlPSJhbGVydCJ9DQpUaGlzIGlzIGEgUiBpbnRlcm5hbCBpc3N1ZS4gRG9uJ3QgbmVlZCB0byBiZSB3b3JyaWVkIGFib3V0IGl0Lg0KOjo6DQoNCmBgYHtyIH0NCmRzXzIgPC0gZHNfMiAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNvbV9hM18xLCBjb21fYTNfMiwgY29tX2EzXzMsIGNvbV9hM180LCBjb21fYTNfNSwgY29tX2EzXzYsDQogICAgICAgICAgICAgICAgIGdtX2EzXzEsCWdtX2EzXzIsCWdtX2EzXzMsCWdtX2EzXzQsCWdtX2EzXzUsCWdtX2EzXzYsDQogICAgICAgICAgICAgICAgIGZtX2EzXzEsCWZtX2EzXzIsCWZtX2EzXzMsCWZtX2EzXzQsCWZtX2EzXzUsCWZtX2EzXzYsDQogICAgICAgICAgICAgICAgIGNnX2EzXzEsCWNnX2EzXzIsCWNnX2EzXzMsCWNnX2EzXzQsCWNnX2EzXzUsCWNnX2EzXzYsDQogICAgICAgICAgICAgICAgIHBzX2EzXzEsCXBzX2EzXzIsCXBzX2EzXzMsCXBzX2EzXzQsCXBzX2EzXzUsCXBzX2EzXzYsDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICBjb21fYTRfMiwJY29tX2E0XzMsCWNvbV9hNF80LAljb21fYTRfNSwJY29tX2E0XzYsDQogICAgICAgICAgICAgICAgIGdtX2E0XzEsCWdtX2E0XzIsCWdtX2E0XzMsCWdtX2E0XzQsCWdtX2E0XzUsCWdtX2E0XzYsDQogICAgICAgICAgICAgICAgIGZtX2E0XzEsCWZtX2E0XzIsCWZtX2E0XzMsCWZtX2E0XzQsCWZtX2E0XzUsCWZtX2E0XzYsDQogICAgICAgICAgICAgICAgIGNnX2E0XzEsCWNnX2E0XzIsICBjZ19hNF8zLAljZ19hNF80LAljZ19hNF81LAljZ19hNF82LA0KICAgICAgICAgICAgICAgICBwc19hNF8xLAlwc19hNF8yLAlwc19hNF8zLAlwc19hNF80LAlwc19hNF81LAlwc19hNF82KSwgfmFzLm51bWVyaWMoLikpDQpgYGANCg0KDQoNCg0KIyMgRml4IDc6IFRvdGFsIHNjb3JlcyAvIE1pc3NpbmcgZGF0YQ0KDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1pbmZvIHJvbGU9ImFsZXJ0In0NCktpbWJlcmx5LCBJbiB0aGUgdGFibGUgYmVsb3csIHlvdSdsbCBzZWUgdGhlIG51bWJlciBvZiBtaXNzaW5nIGNhc2VzIGZvciBlYWNoIHNvdXJjZS4gICANCkZvciBlYW1wbGUsIHRoZSBzb3VyY2UgIkxhbmVDbyBIU1QiIGhhcyAyMDggbWlzc2luZyBjYXNlcy4gIllhbGVDaGlsZENlbnRlciIgaGFzIDE5Lg0KOjo6DQoNCmBgYHtyfQ0KZHNfMiAlPiUgDQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhjb250YWlucygic3VtIikpLCB+c3VtKGlzLm5hKC4pKSkgJT4lIA0KICAjc3VtbWFyaXNlKHN1bShpcy5uYShjc3VtKSkpICU+JSANCiAgYWRvcm5fdG90YWxzKCkgJT4lIA0KICBkYXRhdGFibGUoLiwgb3B0aW9ucyA9IGxpc3QoZG9tPSd0JykpDQoNCmBgYA0KDQoNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LXN1Y2Nlc3Mgcm9sZT0iYWxlcnQifQ0KSSdsbCBjb21wdXRlIHRoZSBzY29yZXMgZm9yIGVhY2ggY2hpbGQgYW5kIHRoZW4gY2hlY2sgdGhlIG1pc3NpbmcgY2FzZXMNCmFnYWluDQo6OjoNCg0KDQpgYGB7cn0NCmRzXzIgPC0gZHNfMiAlPiUgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKGNfc3VtID0gc3VtKGNfYWNyb3NzKGMoY29tX2EzXzEsIGNvbV9hM18yLCBjb21fYTNfMywgY29tX2EzXzQsIGNvbV9hM181LCBjb21fYTNfNikpLCBuYS5ybT1UKSkgJT4lIA0KICBtdXRhdGUoZ21fc3VtID0gc3VtKGNfYWNyb3NzKGMoZ21fYTNfMSwJZ21fYTNfMiwJZ21fYTNfMywJZ21fYTNfNCwJZ21fYTNfNSwJZ21fYTNfNikpLCBuYS5ybT1UKSkgJT4lIA0KICBtdXRhdGUoZm1fc3VtID0gc3VtKGNfYWNyb3NzKGMoZm1fYTNfMSwJZm1fYTNfMiwJZm1fYTNfMywJZm1fYTNfNCwJZm1fYTNfNSwJZm1fYTNfNikpLCBuYS5ybT1UKSkgJT4lIA0KICBtdXRhdGUoY2dfc3VtID0gc3VtKGNfYWNyb3NzKGMoY2dfYTNfMSwJY2dfYTNfMiwJY2dfYTNfMywJY2dfYTNfNCwJY2dfYTNfNSwJY2dfYTNfNikpLCBuYS5ybT1UKSkgJT4lIA0KICBtdXRhdGUocHNfc3VtID0gc3VtKGNfYWNyb3NzKGMocHNfYTNfMSwJcHNfYTNfMiwJcHNfYTNfMywJcHNfYTNfNCwJcHNfYTNfNSwJcHNfYTNfNikpLCBuYS5ybT1UKSkgDQogICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQoNCg0KYGBge3J9DQpkc18yICU+JSANCiAgc2VsZWN0KGNvbnRhaW5zKCJzdW0iKSkgJT4lIA0KICBwbG90X21pc3NpbmcoKQ0KYGBgDQoNCg0KIyMgRml4IDg6IEluY29uc2lzdGVjeSBpbiBpZHMgKHJlcGVhdGVkKQ0KDQo6Ojogey5hbGVydCAuYWxlcnQtZGFuZ2VyIHJvbGU9ImFsZXJ0In0NCjxiPkFMRVJUPC9iPjogS2ltYmVybHksIDYgY2hpbGRyZW4gd2VyZSByZXBlYXRlZC4gUGxlYXNlIGNoZWNrIHRoZSB0YWJsZSBiZWxvdy4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMiAlPiUgDQogIHJlbmFtZShpZCA9IGlkXzMpICU+JSANCiAgbXV0YXRlKGRzPSJkczIiKSAlPiUgDQogIGFkZF9jb3VudChpZCkgJT4lIA0KICBmaWx0ZXIobj4xKSAlPiUgDQogIHNlbGVjdChpZCwgY29udGFpbnMoInN1bSIpKSAlPiUgDQogIGFycmFuZ2UoaWQpDQpgYGANCg0KYGBge3J9DQpkc18yIDwtIGRzXzIgJT4lIA0KICBkaXN0aW5jdChpZF8zLCAua2VlcF9hbGwgPSBUUlVFKQ0KYGBgDQoNCjo6OiB7LmFsZXJ0IC5hbGVydC1zdWNjZXNzIHJvbGU9ImFsZXJ0In0NCkknbGwgZHJvcCB0aGUgZHVwbGljYXRlZCB2YWx1ZXMuIElzIHRoaXMgc29sdXRpb24gYWRlcXVhdGU/DQo6OjoNCg0KDQojIyBGaXggOTogSW5jb25zaXN0ZW5jeSBpbiBpZHMgKGNoYW5nZSkNCg0KOjo6IHsuYWxlcnQgLmFsZXJ0LWRhbmdlciByb2xlPSJhbGVydCJ9DQo8Yj5BTEVSVDwvYj46IEtpbWJlcmx5LCA2IGNoaWxkcmVuIGhhdmUgZGlmZmVyZW50IGlkcyBhY3Jvc3MgdGhlIGRhdGFzZXQuIFBsZWFzZSBsZXQgbWUga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlbS4NCjo6Og0KDQoNCmBgYHtyfQ0KZHNfMiAlPiUgDQogIGZpbHRlcihpZF8zICE9IGlkXzI5KSAlPiUgDQogIHNlbGVjdChpZF8zKQ0KYGBgDQoNCg0KDQoNCiMjIEZ1bGwgZHMgKFdhaXRpbmcgZm9yIEtpbWJlcmx5J3MgcmVzcG9uc2UpDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KYmluZF9yb3dzKA0KZHNfMSAlPiUgDQogIG11dGF0ZShkcz0iZHMxIikgJT4lIA0KICBzZWxlY3QoaWQpDQosDQpkc18yICU+JSANCiAgcmVuYW1lKGlkID0gaWRfMykgJT4lIA0KICBtdXRhdGUoZHM9ImRzMiIpICU+JSANCiAgc2VsZWN0KGlkKQ0KKSU+JSANCiAgYWRkX2NvdW50KGlkKSAlPiUgDQogIGZpbHRlcihuPjEpDQogIGRpc3RpbmN0KGlkLCAua2VlcF9hbGwgPSBUKQ0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQp2aWV3KGRmU3VtbWFyeShkc18yKSkNCmBgYA0K