# List of packages
packages <- c("tidyverse", "infer", "fst", "modelsummary", "effects", "survey", "interactions") # add any you need here

# Install packages if they aren't installed already
new_packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)

# Load the packages
lapply(packages, library, character.only = TRUE)
[[1]]
 [1] "broom"        "fstcore"      "interactions" "survey"      
 [5] "survival"     "Matrix"       "grid"         "effects"     
 [9] "carData"      "modelsummary" "fst"          "infer"       
[13] "lubridate"    "forcats"      "stringr"      "dplyr"       
[17] "purrr"        "readr"        "tidyr"        "tibble"      
[21] "ggplot2"      "tidyverse"    "stats"        "graphics"    
[25] "grDevices"    "utils"        "datasets"     "methods"     
[29] "base"        

[[2]]
 [1] "broom"        "fstcore"      "interactions" "survey"      
 [5] "survival"     "Matrix"       "grid"         "effects"     
 [9] "carData"      "modelsummary" "fst"          "infer"       
[13] "lubridate"    "forcats"      "stringr"      "dplyr"       
[17] "purrr"        "readr"        "tidyr"        "tibble"      
[21] "ggplot2"      "tidyverse"    "stats"        "graphics"    
[25] "grDevices"    "utils"        "datasets"     "methods"     
[29] "base"        

[[3]]
 [1] "broom"        "fstcore"      "interactions" "survey"      
 [5] "survival"     "Matrix"       "grid"         "effects"     
 [9] "carData"      "modelsummary" "fst"          "infer"       
[13] "lubridate"    "forcats"      "stringr"      "dplyr"       
[17] "purrr"        "readr"        "tidyr"        "tibble"      
[21] "ggplot2"      "tidyverse"    "stats"        "graphics"    
[25] "grDevices"    "utils"        "datasets"     "methods"     
[29] "base"        

[[4]]
 [1] "broom"        "fstcore"      "interactions" "survey"      
 [5] "survival"     "Matrix"       "grid"         "effects"     
 [9] "carData"      "modelsummary" "fst"          "infer"       
[13] "lubridate"    "forcats"      "stringr"      "dplyr"       
[17] "purrr"        "readr"        "tidyr"        "tibble"      
[21] "ggplot2"      "tidyverse"    "stats"        "graphics"    
[25] "grDevices"    "utils"        "datasets"     "methods"     
[29] "base"        

[[5]]
 [1] "broom"        "fstcore"      "interactions" "survey"      
 [5] "survival"     "Matrix"       "grid"         "effects"     
 [9] "carData"      "modelsummary" "fst"          "infer"       
[13] "lubridate"    "forcats"      "stringr"      "dplyr"       
[17] "purrr"        "readr"        "tidyr"        "tibble"      
[21] "ggplot2"      "tidyverse"    "stats"        "graphics"    
[25] "grDevices"    "utils"        "datasets"     "methods"     
[29] "base"        

[[6]]
 [1] "broom"        "fstcore"      "interactions" "survey"      
 [5] "survival"     "Matrix"       "grid"         "effects"     
 [9] "carData"      "modelsummary" "fst"          "infer"       
[13] "lubridate"    "forcats"      "stringr"      "dplyr"       
[17] "purrr"        "readr"        "tidyr"        "tibble"      
[21] "ggplot2"      "tidyverse"    "stats"        "graphics"    
[25] "grDevices"    "utils"        "datasets"     "methods"     
[29] "base"        

[[7]]
 [1] "broom"        "fstcore"      "interactions" "survey"      
 [5] "survival"     "Matrix"       "grid"         "effects"     
 [9] "carData"      "modelsummary" "fst"          "infer"       
[13] "lubridate"    "forcats"      "stringr"      "dplyr"       
[17] "purrr"        "readr"        "tidyr"        "tibble"      
[21] "ggplot2"      "tidyverse"    "stats"        "graphics"    
[25] "grDevices"    "utils"        "datasets"     "methods"     
[29] "base"        

#TASK 1#

sweden_data <- read.fst("sweden_data.fst")
table(sweden_data$trstplt)

   0    1    2    3    4    5    6    7    8    9   10   77   88   99 
 866  782 1429 2178 2456 3873 2829 2335  934  201  119    9  184   21 
table(sweden_data$trstprl)

   0    1    2    3    4    5    6    7    8    9   10   77   88   99 
 506  311  776 1356 1465 2991 2341 3362 3027 1058  708   10  277   28 
table(sweden_data$trstprt)

   0    1    2    3    4    5    6    7    8    9   10   77   88   99 
 597  593 1192 1877 2142 3694 2511 2139  875  185  101   13  270   28 
sweden_data$trstplt <- ifelse(sweden_data$trstplt > 10, NA, sweden_data$trstplt)


sweden_data$trstprl <- ifelse(sweden_data$trstprl > 10, NA, sweden_data$trstprl)


sweden_data$trstprt <- ifelse(sweden_data$trstprt > 10, NA, sweden_data$trstprt)
table(sweden_data$trstplt)

   0    1    2    3    4    5    6    7    8    9   10 
 866  782 1429 2178 2456 3873 2829 2335  934  201  119 
table(sweden_data$trstprl)

   0    1    2    3    4    5    6    7    8    9   10 
 506  311  776 1356 1465 2991 2341 3362 3027 1058  708 
table(sweden_data$trstprt)

   0    1    2    3    4    5    6    7    8    9   10 
 597  593 1192 1877 2142 3694 2511 2139  875  185  101 
sweden_data$trust <- scales::rescale(sweden_data$trstplt + sweden_data$trstprl + sweden_data$trstprt, na.rm = TRUE, to = c(0, 100))
sweden_data$populist <- scales::rescale(sweden_data$trust, na.rm = TRUE, to = c(100, 0))
ggplot(sweden_data, aes(x = populist)) +
  geom_histogram(bins = 30, fill = "yellow", color = "black") +
  theme_minimal() +
  labs(title = "Distribution of Populist Scale for Sweden")

NA

#INTERPRETATION# Based on the data provided, and through visual observation, we see that the bins on the left of the distribution tend to be higher on average than the bins towards the right side of the distribution. We can hypothetically conclude then, that Sweden is a slightly left populist country.

#TASK 2#

  1. Recoding Educational Attainment
ess <- read.fst("All-ESS-Data.fst")

sweden_data <- ess %>%
  filter(cntry == "SE")
sweden_data <- sweden_data %>%
  mutate(
    edulvla = na_if(edulvla, 55) %>%
      na_if(., 77) %>%
      na_if(., 88),
   
     edulvlb = na_if(edulvlb, 5555) %>%
      na_if(., 7777) %>%
      na_if(., 8888)
  ) %>%
  
  mutate(
    edulvla = case_when(
      essround < 5 & edulvla == 55 ~ NA_real_,
      TRUE ~ edulvla
    ),
    
    edulvlb = case_when(
      essround >= 5 & edulvlb %in% c(5555, 7777, 8888) ~ NA_real_, 
      TRUE ~ edulvlb
    ),
    
    educ_level = case_when(
      essround < 5 & edulvla == 5 ~ "BA",
      essround >= 5 & edulvlb > 600 ~ "BA",
      TRUE ~ "No BA"
    )
  )
table(sweden_data$educ_level)

   BA No BA 
 4644 13572 
  1. Authoritarian Scale
sweden_data <- sweden_data %>%
  mutate(
    behave = ipbhprp,
    secure = impsafe,
    safety = ipstrgv,
    tradition = imptrad,
    rules = ipfrule) %>%
  mutate(across(c("behave", "secure", "safety", "tradition", "rules"), ~ 7 - .x))

sweden_data$auth <- scales::rescale(sweden_data$behave + sweden_data$secure + sweden_data$safety + sweden_data$tradition + sweden_data$rules, to=c(0,100), na.rm = TRUE)

sweden_data <- sweden_data %>%
  filter(!is.na(auth))

table(sweden_data$auth)

   0  7.5 12.5   15 17.5   20 22.5   25 27.5   30 32.5   35 37.5   40 
 601    1   47    1    3    6    6   28   10    7   13   11   17   20 
42.5   45 47.5   50 52.5   55 57.5   60 62.5   65 67.5   70 72.5   75 
  35   75  106  163  284  413  539  665  869  988 1137 1196 1321 1214 
77.5   80 82.5   85 87.5   90 92.5   95 97.5  100 
1185 1030  907  750  654  456  260  182   92   99 
  1. Linear Regression Model
model_data <- sweden_data %>%
  mutate(
    educ.ba = case_when(
      essround < 5 & edulvla == 5 ~ "BA or more",
      essround >= 5 & edulvlb > 600 ~ "BA or more",
      TRUE ~ "No BA"
    ),
    
    edulvla = ifelse(edulvla %in% c(77, 88, 99), NA_integer_, edulvla),
    edulvlb = ifelse(edulvlb %in% c(5555, 7777, 8888), NA_integer_, edulvlb),
    
    educ.ba = factor(educ.ba, levels = c("No BA", "BA or more")),
  )
model_education <- lm(auth ~ educ.ba, data = model_data)
modelsummary(
  list(model_education),
  fmt = 1,
  estimate = c("{estimate} ({std.error}){stars}"),
  statistic = NULL,
  coef_omit = "Intercept"
)
 (1)
educ.baBA or more −1.6 (0.3)***
Num.Obs. 15391
R2 0.001
R2 Adj. 0.001
AIC 133280.4
BIC 133303.4
Log.Lik. −66637.213
RMSE 18.37
  1. Tidy Model
sweden_pop_model <- lm(auth ~ educ.ba, data= model_data )
coefficients_sweden <- coef(sweden_pop_model)
print(coefficients_sweden)
      (Intercept) educ.baBA or more 
         69.79813          -1.62068 
library(broom)
tidy(sweden_pop_model) |>
knitr::kable(digits = 3)
term estimate std.error statistic p.value
(Intercept) 69.798 0.171 408.19 0
educ.baBA or more -1.621 0.342 -4.74 0

#INTERPRETATION#

Firstly, with an intercept of 69.8 tells us that if education is set at 0, the populist level will score 69.8, we can interpret this as saying that swedish people have a natural tendency to score more left on populist attitudes. Regarding a coefficient of -1.62 this indicates a negative correlation between educational attainment and populist levels which resonate with the findings in the distribution from task 1. Further, the provided p-value of 0 indicates statistical significance between the two variables explored.

#TASK 3#

italy_data <- read.fst ("italy_data.fst")
  1. Authoriatrian Scales
table(italy_data$trstplt)

   0    1    2    3    4    5    6    7    8    9   10   77   88   99 
2472  979 1235 1307 1228 1339  851  362  135   50   29   40  144    7 
table(italy_data$trstprl)

   0    1    2    3    4    5    6    7    8    9   10   77   88   99 
1467  613  940 1091 1188 1720 1387  862  463  110   97   39  200    1 
table(italy_data$trstprt)

   0    1    2    3    4    5    6    7    8    9   10   77   88   99 
2327  946 1155 1052 1058 1124  628  302  118   38   23   44  151    5 
italy_data$trstplt <- ifelse(italy_data$trstplt > 10, NA, italy_data$trstplt)

italy_data$trstprl <- ifelse(italy_data$trstprl > 10, NA, italy_data$trstprl)

italy_data$trstprt <- ifelse(italy_data$trstprt > 10, NA, italy_data$trstprt)
table(italy_data$trstplt)

   0    1    2    3    4    5    6    7    8    9   10 
2472  979 1235 1307 1228 1339  851  362  135   50   29 
table(italy_data$trstprl)

   0    1    2    3    4    5    6    7    8    9   10 
1467  613  940 1091 1188 1720 1387  862  463  110   97 
table(italy_data$trstprt)

   0    1    2    3    4    5    6    7    8    9   10 
2327  946 1155 1052 1058 1124  628  302  118   38   23 
sweden_data$year <- NA
replacements <- c(2002, 2004, 2006, 2008, 2010, 2012, 2014, 2016, 2018, 2020)
for (i in 1:10) {
  sweden_data$year[sweden_data$essround == i] <- replacements[i]
}
auth_avg <- sweden_data %>%
  group_by(year) %>%
  summarize(auth_avg = mean(auth, na.rm = TRUE))

plot_auth <- ggplot(auth_avg, aes(x = year, y = auth_avg)) +
  geom_point(aes(color = auth_avg), alpha = 1.0) +
  geom_line(aes(group = 1), color = "black", linetype = "dashed") +
  labs(title = "Authoritarian Scale Average by Year (Italy)",
       x = "Survey Year",
       y = "Authoritarian Scale Average") +
  theme_minimal() +
  theme(legend.position = "none") +
  scale_y_continuous(limits = c(0, 100))

print(plot_auth)

NA
NA

#INTERPRETATION#

Based on the graph of average authoritarian scale by year they tend to strongly score above 50, however between 2005 and 2010 there was a slight dip, but begun to stabilize towards previous settings in the following years showing the country’s natural tendency towards the right.

#TASK 4#

  1. Authoritarian Scale
italy_data <- read.fst ("italy_data.fst")
italy_data <- italy_data %>%
  mutate(
    behave = ipbhprp,
    secure = impsafe, 
    safety = ipstrgv,
    tradition = imptrad,
    rules = ipfrule) %>%
  
  mutate(across(c("behave", "secure", "safety", "tradition", "rules"),
                ~ na_if(.x, 7) %>% na_if(8) %>% na_if(9))) %>%
  
  mutate(across(c("behave", "secure", "safety", "tradition", "rules"), ~ 7 - .x))

italy_data$auth <- scales::rescale(italy_data$behave + 
                      italy_data$secure + 
                      italy_data$safety + 
                      italy_data$tradition + 
                      italy_data$rules, to=c(0,100), na.rm=TRUE)

italy_data <- italy_data %>%
  filter(!is.na(auth))

table(italy_data$secure)

   1    2    3    4    5    6 
  54  139  626 1856 2876 2881 
  1. Generation Variable
model_data_gen <- italy_data %>%
  mutate(
    gen = case_when(
      yrbrn %in% 1900:1945 ~ "1",
      yrbrn %in% 1946:1964 ~ "2",
      yrbrn %in% 1965:1979 ~ "3",
      yrbrn %in% 1980:1996 ~ "4",
      TRUE ~ as.character(yrbrn)
    )
  ) %>%
  mutate(
    gen = factor(gen, 
                 levels = c("1", "2", "3", "4"),
                 labels = c("Interwar", "Baby Boomers", "Gen X", "Millennials"))
  )
model1 <- lm(auth ~ gen, data = model_data_gen)
modelsummary(
  list(model1),
  fmt = 1,
  estimate  = c( "{estimate} ({std.error}){stars}"),
  statistic = NULL,
  coef_omit = "Intercept")
 (1)
genBaby Boomers −1.1 (0.6)*
genGen X −2.1 (0.6)***
genMillennials −3.6 (0.6)***
Num.Obs. 7631
R2 0.006
R2 Adj. 0.006
AIC 62934.0
BIC 62968.7
Log.Lik. −31462.009
RMSE 14.94
models <- list(
  "Model 1" = lm(auth ~ gen, data = model_data_gen)
)

modelsummary(models, fmt = 1,
             estimate = c("{estimate} ({std.error})"), statistic = NULL)
Model 1
(Intercept) 75.3 (0.5)
genBaby Boomers −1.1 (0.6)
genGen X −2.1 (0.6)
genMillennials −3.6 (0.6)
Num.Obs. 7631
R2 0.006
R2 Adj. 0.006
AIC 62934.0
BIC 62968.7
Log.Lik. −31462.009
RMSE 14.94
modelplot(models, coef_omit = 'Interc')

modelsummary(models, fmt = 1,
             estimate = c("{estimate} ({std.error})"), statistic = NULL,

coef_rename = c("genBaby Boomers" = "Baby Boomers", "genGen X" = "Gen X", "genMillennials" = "Millennials"),

title = "Table 2. Regression models for authoritarian attitudes in Italy"
)
Table 2. Regression models for authoritarian attitudes in Italy
Model 1
(Intercept) 75.3 (0.5)
Baby Boomers −1.1 (0.6)
Gen X −2.1 (0.6)
Millennials −3.6 (0.6)
Num.Obs. 7631
R2 0.006
R2 Adj. 0.006
AIC 62934.0
BIC 62968.7
Log.Lik. −31462.009
RMSE 14.94
NA
tidy(model1) |>
knitr::kable(digits = 3)
term estimate std.error statistic p.value
(Intercept) 72.934 0.373 195.384 0
lrscaleModerate 3.796 0.423 8.974 0
lrscaleRight 6.062 0.471 12.873 0

#INTERPRETATION#

Based on the data provided, coefficients ranged from 1.1 to 3.6, indicating an extremely strong relationship between authoritarian scales/scores and generation birth year, further, all coefficients shown a negative correlation between the two, indicating that as generation year progressed, authoritarian scores declined. In other words, as the years progressed, individuals became slightly more authoritarian. These findings are found to be statistically significant given that P = 0.

Given that r = 0.006, this means that the variance of scores from the line are not significant enough to invalidate the findings. Further, it works towards the validity and strength of the findings between the relationship between generation year and authoritarian scales.

#TASK 5#

  1. Greece Populist
greece_data <- read.fst ("greece_data.fst")
greece_data$trstplt <- ifelse(greece_data$trstplt > 10, NA, greece_data$trstplt)
greece_data$trstprl <- ifelse(greece_data$trstprl > 10, NA, greece_data$trstprl)
greece_data$trstprt <- ifelse(greece_data$trstprt > 10, NA, greece_data$trstprt)
greece_data$trust <- scales::rescale(greece_data$trstplt + greece_data$trstprl + greece_data$trstprt, na.rm = TRUE, to = c(0, 100))
table(greece_data$trstplt)

   0    1    2    3    4    5    6    7    8    9   10 
2834 1551 1589 1619 1326 1774  711  526  317  127   65 
table(greece_data$trstprl)

   0    1    2    3    4    5    6    7    8    9   10 
1894 1102 1196 1348 1225 2224 1178 1018  735  227  203 
table(greece_data$trstprt)

   0    1    2    3    4    5    6    7    8    9   10 
2358 1362 1289 1250 1116 1322  523  380  213   51   41 
greece_data <- greece_data %>%
  mutate(
    behave = ipbhprp,
    secure = impsafe,
    safety = ipstrgv,
    tradition = imptrad,
    rules = ipfrule) %>%
  
  mutate(across(c("behave", "secure", "safety", "tradition", "rules"),
                ~ na_if(.x, 7) %>% na_if(8) %>% na_if(9))) %>%

  mutate(across(c("behave", "secure", "safety", "tradition", "rules"), ~ 7 - .x ))


greece_data$auth <- scales::rescale(greece_data$behave +
                                      greece_data$secure +
                                      greece_data$safety +
                                      greece_data$tradition +
                                      greece_data$rules, to=c(0,100), na.rm = TRUE)
model_data <- greece_data %>%
  mutate(
    gndr = case_when(
      gndr == 1 ~ "Male",
      gndr == 2 ~ "Female",
      gndr == 9 ~ NA_character_,
      TRUE ~ as.character(gndr)
    ),
    
    lrscale = case_when(
      lrscale %in% 0:3 ~ "Left",
      lrscale %in% 7:10 ~ "Right",
      lrscale %in% 4:6 ~ "Moderate",
      lrscale %in% c(77, 88, 99) ~ NA_character_),
    
    Gen = case_when(
      yrbrn %in% 1900:1945 ~ "1",
      yrbrn %in% 1946:1964 ~ "2",
      yrbrn %in% 1965:1979 ~ "3",
      yrbrn %in% 1980:1996 ~ "4",
      TRUE ~ as.character(yrbrn)
    ),
    
    Gen = factor(Gen, levels = c("1", "2", "3", "4"), 
                 labels = c("Interwar", "Baby Boomers", "Gen X", "Millennials"))
    
)

table(greece_data$gndr)

   1    2 
5629 6929 
table(greece_data$lrscale)

   0    1    2    3    4    5    6    7    8    9   10   77   88 
 151  226  440  811 1060 3878  775  961  897  450  439  340 2130 
table(greece_data$Gen)
< table of extent 0 >
model1 <- lm(auth ~ lrscale, data = model_data)
model2 <- lm(auth ~ gndr, data = model_data)
model3 <- lm(auth ~ Gen, data = model_data)
models <- list(
  "Model 1" = lm(auth ~ lrscale, data = model_data),
  "Model 2" = lm(auth ~ gndr, data = model_data),
  "Model 3" = lm(auth ~ Gen, data = model_data))

modelsummary(models, fmt = 1, 
             estimate = c("{estimate} ({std.error}){stars}",
                          "{estimate} ({std.error}){stars}",
                          "{estimate} ({std.error}){stars}"),
             
statistic = NULL,
coef_rename = c("GenBaby Boomers" = "Baby Boomers", "GenGen X" = "Gen X", "GenMillennials" = "Millennials", "gndrMale" = "Male", "lrscaleModerate" = "Moderate", "lrscaleRight" = "Right"),
title = "Table 3. Regression models for authoritarian attitudes for the country of Greece"
             
             
             )
Table 3. Regression models for authoritarian attitudes for the country of Greece
Model 1  Model 2  Model 3
(Intercept) 72.9 (0.4)*** 77.8 (0.2)*** 82.0 (0.3)***
Moderate 3.8 (0.4)***
Right 6.1 (0.5)***
Male −2.0 (0.3)***
Baby Boomers −4.1 (0.4)***
Gen X −6.0 (0.4)***
Millennials −10.3 (0.4)***
Num.Obs. 9926 12303 12042
R2 0.016 0.005 0.054
R2 Adj. 0.016 0.004 0.054
AIC 81830.5 101489.4 98536.4
BIC 81859.3 101511.7 98573.4
Log.Lik. −40911.238 −50741.707 −49263.205
RMSE 14.92 14.96 14.47
coef_rename = c("GenBaby Boomers" = "Baby Boomers", "GenGen X" = "Gen X", "GenMillennials" = "Millennials", "gndrMale" = "Male", "lrscaleModerate" = "Moderate", "lrscaleRight" = "Right")

modelplot(models, coef_omit = 'Interc')

#INTERPRETATION#

Firstly, a 95% CI indicates upon repeated measures we can be 95% sure that the true value would lie between an alpha = .05. Notably, the most extreme results obtained is regarding the lrscale. We see both a positive and an Extremely Strong (3.8 - 6.1) correlation between lrscale and populist scales, which are reasonable to assume since both variables consider the political affiliation of persons. Further, both coefficients indicate a positive relationship which tells us that populist attitudes follow or mimic political affiliation.

Regarding the variable gndr, Males shown an extremely strong correlation (2.0) between populist attitudes. The correlation is also negative which tells us that the opposite gender tend to show an inverse reaction towards populist scores.

Finally, as expected of the generational model between populist scales and generational birth, we see similar findings to that in Task 4, with an extermely strong negative correlation between populist scale and generational birth

LS0tDQp0aXRsZTogIkJBU0FfbCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KIyBMaXN0IG9mIHBhY2thZ2VzDQpwYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiLCAiaW5mZXIiLCAiZnN0IiwgIm1vZGVsc3VtbWFyeSIsICJlZmZlY3RzIiwgInN1cnZleSIsICJpbnRlcmFjdGlvbnMiKSAjIGFkZCBhbnkgeW91IG5lZWQgaGVyZQ0KDQojIEluc3RhbGwgcGFja2FnZXMgaWYgdGhleSBhcmVuJ3QgaW5zdGFsbGVkIGFscmVhZHkNCm5ld19wYWNrYWdlcyA8LSBwYWNrYWdlc1shKHBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ld19wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3X3BhY2thZ2VzKQ0KDQojIExvYWQgdGhlIHBhY2thZ2VzDQpsYXBwbHkocGFja2FnZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCmBgYA0KI1RBU0sgMSMNCg0KYGBge3J9DQpzd2VkZW5fZGF0YSA8LSByZWFkLmZzdCgic3dlZGVuX2RhdGEuZnN0IikNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKHN3ZWRlbl9kYXRhJHRyc3RwbHQpDQp0YWJsZShzd2VkZW5fZGF0YSR0cnN0cHJsKQ0KdGFibGUoc3dlZGVuX2RhdGEkdHJzdHBydCkNCmBgYA0KDQpgYGB7cn0NCnN3ZWRlbl9kYXRhJHRyc3RwbHQgPC0gaWZlbHNlKHN3ZWRlbl9kYXRhJHRyc3RwbHQgPiAxMCwgTkEsIHN3ZWRlbl9kYXRhJHRyc3RwbHQpDQoNCg0Kc3dlZGVuX2RhdGEkdHJzdHBybCA8LSBpZmVsc2Uoc3dlZGVuX2RhdGEkdHJzdHBybCA+IDEwLCBOQSwgc3dlZGVuX2RhdGEkdHJzdHBybCkNCg0KDQpzd2VkZW5fZGF0YSR0cnN0cHJ0IDwtIGlmZWxzZShzd2VkZW5fZGF0YSR0cnN0cHJ0ID4gMTAsIE5BLCBzd2VkZW5fZGF0YSR0cnN0cHJ0KQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoc3dlZGVuX2RhdGEkdHJzdHBsdCkNCnRhYmxlKHN3ZWRlbl9kYXRhJHRyc3RwcmwpDQp0YWJsZShzd2VkZW5fZGF0YSR0cnN0cHJ0KQ0KYGBgDQoNCmBgYHtyfQ0Kc3dlZGVuX2RhdGEkdHJ1c3QgPC0gc2NhbGVzOjpyZXNjYWxlKHN3ZWRlbl9kYXRhJHRyc3RwbHQgKyBzd2VkZW5fZGF0YSR0cnN0cHJsICsgc3dlZGVuX2RhdGEkdHJzdHBydCwgbmEucm0gPSBUUlVFLCB0byA9IGMoMCwgMTAwKSkNCmBgYA0KDQoNCmBgYHtyfQ0Kc3dlZGVuX2RhdGEkcG9wdWxpc3QgPC0gc2NhbGVzOjpyZXNjYWxlKHN3ZWRlbl9kYXRhJHRydXN0LCBuYS5ybSA9IFRSVUUsIHRvID0gYygxMDAsIDApKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KHN3ZWRlbl9kYXRhLCBhZXMoeCA9IHBvcHVsaXN0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzAsIGZpbGwgPSAieWVsbG93IiwgY29sb3IgPSAiYmxhY2siKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIFBvcHVsaXN0IFNjYWxlIGZvciBTd2VkZW4iKQ0KICANCmBgYA0KDQojSU5URVJQUkVUQVRJT04jDQpCYXNlZCBvbiB0aGUgZGF0YSBwcm92aWRlZCwgYW5kIHRocm91Z2ggdmlzdWFsIG9ic2VydmF0aW9uLCB3ZSBzZWUgdGhhdCB0aGUgYmlucyBvbiB0aGUgbGVmdCBvZiB0aGUgZGlzdHJpYnV0aW9uIHRlbmQgdG8gYmUgaGlnaGVyIG9uIGF2ZXJhZ2UgdGhhbiB0aGUgYmlucyB0b3dhcmRzIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkaXN0cmlidXRpb24uIFdlIGNhbiBoeXBvdGhldGljYWxseSBjb25jbHVkZSB0aGVuLCB0aGF0IFN3ZWRlbiBpcyBhIHNsaWdodGx5IGxlZnQgcG9wdWxpc3QgY291bnRyeS4gDQoNCiNUQVNLIDIjDQoNCjEpIFJlY29kaW5nIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQNCg0KYGBge3J9DQplc3MgPC0gcmVhZC5mc3QoIkFsbC1FU1MtRGF0YS5mc3QiKQ0KDQpzd2VkZW5fZGF0YSA8LSBlc3MgJT4lDQogIGZpbHRlcihjbnRyeSA9PSAiU0UiKQ0KYGBgDQoNCmBgYHtyfQ0Kc3dlZGVuX2RhdGEgPC0gc3dlZGVuX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBlZHVsdmxhID0gbmFfaWYoZWR1bHZsYSwgNTUpICU+JQ0KICAgICAgbmFfaWYoLiwgNzcpICU+JQ0KICAgICAgbmFfaWYoLiwgODgpLA0KICAgDQogICAgIGVkdWx2bGIgPSBuYV9pZihlZHVsdmxiLCA1NTU1KSAlPiUNCiAgICAgIG5hX2lmKC4sIDc3NzcpICU+JQ0KICAgICAgbmFfaWYoLiwgODg4OCkNCiAgKSAlPiUNCiAgDQogIG11dGF0ZSgNCiAgICBlZHVsdmxhID0gY2FzZV93aGVuKA0KICAgICAgZXNzcm91bmQgPCA1ICYgZWR1bHZsYSA9PSA1NSB+IE5BX3JlYWxfLA0KICAgICAgVFJVRSB+IGVkdWx2bGENCiAgICApLA0KICAgIA0KICAgIGVkdWx2bGIgPSBjYXNlX3doZW4oDQogICAgICBlc3Nyb3VuZCA+PSA1ICYgZWR1bHZsYiAlaW4lIGMoNTU1NSwgNzc3NywgODg4OCkgfiBOQV9yZWFsXywgDQogICAgICBUUlVFIH4gZWR1bHZsYg0KICAgICksDQogICAgDQogICAgZWR1Y19sZXZlbCA9IGNhc2Vfd2hlbigNCiAgICAgIGVzc3JvdW5kIDwgNSAmIGVkdWx2bGEgPT0gNSB+ICJCQSIsDQogICAgICBlc3Nyb3VuZCA+PSA1ICYgZWR1bHZsYiA+IDYwMCB+ICJCQSIsDQogICAgICBUUlVFIH4gIk5vIEJBIg0KICAgICkNCiAgKQ0KYGBgDQoNCg0KYGBge3J9DQp0YWJsZShzd2VkZW5fZGF0YSRlZHVjX2xldmVsKQ0KYGBgDQoyKSBBdXRob3JpdGFyaWFuIFNjYWxlDQoNCmBgYHtyfQ0Kc3dlZGVuX2RhdGEgPC0gc3dlZGVuX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBiZWhhdmUgPSBpcGJocHJwLA0KICAgIHNlY3VyZSA9IGltcHNhZmUsDQogICAgc2FmZXR5ID0gaXBzdHJndiwNCiAgICB0cmFkaXRpb24gPSBpbXB0cmFkLA0KICAgIHJ1bGVzID0gaXBmcnVsZSkgJT4lDQogIG11dGF0ZShhY3Jvc3MoYygiYmVoYXZlIiwgInNlY3VyZSIsICJzYWZldHkiLCAidHJhZGl0aW9uIiwgInJ1bGVzIiksIH4gNyAtIC54KSkNCg0Kc3dlZGVuX2RhdGEkYXV0aCA8LSBzY2FsZXM6OnJlc2NhbGUoc3dlZGVuX2RhdGEkYmVoYXZlICsgc3dlZGVuX2RhdGEkc2VjdXJlICsgc3dlZGVuX2RhdGEkc2FmZXR5ICsgc3dlZGVuX2RhdGEkdHJhZGl0aW9uICsgc3dlZGVuX2RhdGEkcnVsZXMsIHRvPWMoMCwxMDApLCBuYS5ybSA9IFRSVUUpDQoNCnN3ZWRlbl9kYXRhIDwtIHN3ZWRlbl9kYXRhICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGF1dGgpKQ0KDQp0YWJsZShzd2VkZW5fZGF0YSRhdXRoKQ0KYGBgDQoNCjMpIExpbmVhciBSZWdyZXNzaW9uIE1vZGVsDQoNCmBgYHtyfQ0KbW9kZWxfZGF0YSA8LSBzd2VkZW5fZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGVkdWMuYmEgPSBjYXNlX3doZW4oDQogICAgICBlc3Nyb3VuZCA8IDUgJiBlZHVsdmxhID09IDUgfiAiQkEgb3IgbW9yZSIsDQogICAgICBlc3Nyb3VuZCA+PSA1ICYgZWR1bHZsYiA+IDYwMCB+ICJCQSBvciBtb3JlIiwNCiAgICAgIFRSVUUgfiAiTm8gQkEiDQogICAgKSwNCiAgICANCiAgICBlZHVsdmxhID0gaWZlbHNlKGVkdWx2bGEgJWluJSBjKDc3LCA4OCwgOTkpLCBOQV9pbnRlZ2VyXywgZWR1bHZsYSksDQogICAgZWR1bHZsYiA9IGlmZWxzZShlZHVsdmxiICVpbiUgYyg1NTU1LCA3Nzc3LCA4ODg4KSwgTkFfaW50ZWdlcl8sIGVkdWx2bGIpLA0KICAgIA0KICAgIGVkdWMuYmEgPSBmYWN0b3IoZWR1Yy5iYSwgbGV2ZWxzID0gYygiTm8gQkEiLCAiQkEgb3IgbW9yZSIpKSwNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxfZWR1Y2F0aW9uIDwtIGxtKGF1dGggfiBlZHVjLmJhLCBkYXRhID0gbW9kZWxfZGF0YSkNCmBgYA0KDQpgYGB7cn0NCm1vZGVsc3VtbWFyeSgNCiAgbGlzdChtb2RlbF9lZHVjYXRpb24pLA0KICBmbXQgPSAxLA0KICBlc3RpbWF0ZSA9IGMoIntlc3RpbWF0ZX0gKHtzdGQuZXJyb3J9KXtzdGFyc30iKSwNCiAgc3RhdGlzdGljID0gTlVMTCwNCiAgY29lZl9vbWl0ID0gIkludGVyY2VwdCINCikNCmBgYA0KDQo0KSBUaWR5IE1vZGVsDQoNCmBgYHtyfQ0Kc3dlZGVuX3BvcF9tb2RlbCA8LSBsbShhdXRoIH4gZWR1Yy5iYSwgZGF0YT0gbW9kZWxfZGF0YSApDQpgYGANCg0KYGBge3J9DQpjb2VmZmljaWVudHNfc3dlZGVuIDwtIGNvZWYoc3dlZGVuX3BvcF9tb2RlbCkNCnByaW50KGNvZWZmaWNpZW50c19zd2VkZW4pDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGJyb29tKQ0KdGlkeShzd2VkZW5fcG9wX21vZGVsKSB8Pg0Ka25pdHI6OmthYmxlKGRpZ2l0cyA9IDMpDQpgYGANCg0KI0lOVEVSUFJFVEFUSU9OIw0KDQpGaXJzdGx5LCB3aXRoIGFuIGludGVyY2VwdCBvZiA2OS44IHRlbGxzIHVzIHRoYXQgaWYgZWR1Y2F0aW9uIGlzIHNldCBhdCAwLCB0aGUgcG9wdWxpc3QgbGV2ZWwgd2lsbCBzY29yZSA2OS44LCB3ZSBjYW4gaW50ZXJwcmV0IHRoaXMgYXMgc2F5aW5nIHRoYXQgc3dlZGlzaCBwZW9wbGUgaGF2ZSBhIG5hdHVyYWwgdGVuZGVuY3kgdG8gc2NvcmUgbW9yZSBsZWZ0IG9uIHBvcHVsaXN0IGF0dGl0dWRlcy4gUmVnYXJkaW5nIGEgY29lZmZpY2llbnQgb2YgLTEuNjIgdGhpcyBpbmRpY2F0ZXMgYSBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIHBvcHVsaXN0IGxldmVscyB3aGljaCByZXNvbmF0ZSB3aXRoIHRoZSBmaW5kaW5ncyBpbiB0aGUgZGlzdHJpYnV0aW9uIGZyb20gdGFzayAxLiBGdXJ0aGVyLCB0aGUgcHJvdmlkZWQgcC12YWx1ZSBvZiAwIGluZGljYXRlcyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcyBleHBsb3JlZC4NCg0KDQojVEFTSyAzIw0KDQpgYGB7cn0NCml0YWx5X2RhdGEgPC0gcmVhZC5mc3QgKCJpdGFseV9kYXRhLmZzdCIpDQpgYGANCg0KMSkgQXV0aG9yaWF0cmlhbiBTY2FsZXMNCg0KYGBge3J9DQp0YWJsZShpdGFseV9kYXRhJHRyc3RwbHQpDQp0YWJsZShpdGFseV9kYXRhJHRyc3RwcmwpDQp0YWJsZShpdGFseV9kYXRhJHRyc3RwcnQpDQpgYGANCg0KYGBge3J9DQppdGFseV9kYXRhJHRyc3RwbHQgPC0gaWZlbHNlKGl0YWx5X2RhdGEkdHJzdHBsdCA+IDEwLCBOQSwgaXRhbHlfZGF0YSR0cnN0cGx0KQ0KDQppdGFseV9kYXRhJHRyc3RwcmwgPC0gaWZlbHNlKGl0YWx5X2RhdGEkdHJzdHBybCA+IDEwLCBOQSwgaXRhbHlfZGF0YSR0cnN0cHJsKQ0KDQppdGFseV9kYXRhJHRyc3RwcnQgPC0gaWZlbHNlKGl0YWx5X2RhdGEkdHJzdHBydCA+IDEwLCBOQSwgaXRhbHlfZGF0YSR0cnN0cHJ0KQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoaXRhbHlfZGF0YSR0cnN0cGx0KQ0KdGFibGUoaXRhbHlfZGF0YSR0cnN0cHJsKQ0KdGFibGUoaXRhbHlfZGF0YSR0cnN0cHJ0KQ0KYGBgDQoNCmBgYHtyfQ0Kc3dlZGVuX2RhdGEkeWVhciA8LSBOQQ0KcmVwbGFjZW1lbnRzIDwtIGMoMjAwMiwgMjAwNCwgMjAwNiwgMjAwOCwgMjAxMCwgMjAxMiwgMjAxNCwgMjAxNiwgMjAxOCwgMjAyMCkNCmZvciAoaSBpbiAxOjEwKSB7DQogIHN3ZWRlbl9kYXRhJHllYXJbc3dlZGVuX2RhdGEkZXNzcm91bmQgPT0gaV0gPC0gcmVwbGFjZW1lbnRzW2ldDQp9DQphdXRoX2F2ZyA8LSBzd2VkZW5fZGF0YSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHN1bW1hcml6ZShhdXRoX2F2ZyA9IG1lYW4oYXV0aCwgbmEucm0gPSBUUlVFKSkNCg0KcGxvdF9hdXRoIDwtIGdncGxvdChhdXRoX2F2ZywgYWVzKHggPSB5ZWFyLCB5ID0gYXV0aF9hdmcpKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXV0aF9hdmcpLCBhbHBoYSA9IDEuMCkgKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSksIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBsYWJzKHRpdGxlID0gIkF1dGhvcml0YXJpYW4gU2NhbGUgQXZlcmFnZSBieSBZZWFyIChJdGFseSkiLA0KICAgICAgIHggPSAiU3VydmV5IFllYXIiLA0KICAgICAgIHkgPSAiQXV0aG9yaXRhcmlhbiBTY2FsZSBBdmVyYWdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSkNCg0KcHJpbnQocGxvdF9hdXRoKQ0KICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQojSU5URVJQUkVUQVRJT04jDQoNCkJhc2VkIG9uIHRoZSBncmFwaCBvZiBhdmVyYWdlIGF1dGhvcml0YXJpYW4gc2NhbGUgYnkgeWVhciB0aGV5IHRlbmQgdG8gc3Ryb25nbHkgc2NvcmUgYWJvdmUgNTAsIGhvd2V2ZXIgYmV0d2VlbiAyMDA1IGFuZCAyMDEwIHRoZXJlIHdhcyBhIHNsaWdodCBkaXAsIGJ1dCBiZWd1biB0byBzdGFiaWxpemUgdG93YXJkcyBwcmV2aW91cyBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nIHllYXJzIHNob3dpbmcgdGhlIGNvdW50cnkncyBuYXR1cmFsIHRlbmRlbmN5IHRvd2FyZHMgdGhlIHJpZ2h0LiANCg0KDQojVEFTSyA0Iw0KDQoxKSBBdXRob3JpdGFyaWFuIFNjYWxlDQoNCmBgYHtyfQ0KaXRhbHlfZGF0YSA8LSByZWFkLmZzdCAoIml0YWx5X2RhdGEuZnN0IikNCmBgYA0KDQpgYGB7cn0NCml0YWx5X2RhdGEgPC0gaXRhbHlfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGJlaGF2ZSA9IGlwYmhwcnAsDQogICAgc2VjdXJlID0gaW1wc2FmZSwgDQogICAgc2FmZXR5ID0gaXBzdHJndiwNCiAgICB0cmFkaXRpb24gPSBpbXB0cmFkLA0KICAgIHJ1bGVzID0gaXBmcnVsZSkgJT4lDQogIA0KICBtdXRhdGUoYWNyb3NzKGMoImJlaGF2ZSIsICJzZWN1cmUiLCAic2FmZXR5IiwgInRyYWRpdGlvbiIsICJydWxlcyIpLA0KICAgICAgICAgICAgICAgIH4gbmFfaWYoLngsIDcpICU+JSBuYV9pZig4KSAlPiUgbmFfaWYoOSkpKSAlPiUNCiAgDQogIG11dGF0ZShhY3Jvc3MoYygiYmVoYXZlIiwgInNlY3VyZSIsICJzYWZldHkiLCAidHJhZGl0aW9uIiwgInJ1bGVzIiksIH4gNyAtIC54KSkNCg0KaXRhbHlfZGF0YSRhdXRoIDwtIHNjYWxlczo6cmVzY2FsZShpdGFseV9kYXRhJGJlaGF2ZSArIA0KICAgICAgICAgICAgICAgICAgICAgIGl0YWx5X2RhdGEkc2VjdXJlICsgDQogICAgICAgICAgICAgICAgICAgICAgaXRhbHlfZGF0YSRzYWZldHkgKyANCiAgICAgICAgICAgICAgICAgICAgICBpdGFseV9kYXRhJHRyYWRpdGlvbiArIA0KICAgICAgICAgICAgICAgICAgICAgIGl0YWx5X2RhdGEkcnVsZXMsIHRvPWMoMCwxMDApLCBuYS5ybT1UUlVFKQ0KDQppdGFseV9kYXRhIDwtIGl0YWx5X2RhdGEgJT4lDQogIGZpbHRlcighaXMubmEoYXV0aCkpDQoNCnRhYmxlKGl0YWx5X2RhdGEkc2VjdXJlKQ0KYGBgDQoyKSBHZW5lcmF0aW9uIFZhcmlhYmxlDQoNCmBgYHtyfQ0KbW9kZWxfZGF0YV9nZW4gPC0gaXRhbHlfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGdlbiA9IGNhc2Vfd2hlbigNCiAgICAgIHlyYnJuICVpbiUgMTkwMDoxOTQ1IH4gIjEiLA0KICAgICAgeXJicm4gJWluJSAxOTQ2OjE5NjQgfiAiMiIsDQogICAgICB5cmJybiAlaW4lIDE5NjU6MTk3OSB+ICIzIiwNCiAgICAgIHlyYnJuICVpbiUgMTk4MDoxOTk2IH4gIjQiLA0KICAgICAgVFJVRSB+IGFzLmNoYXJhY3Rlcih5cmJybikNCiAgICApDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBnZW4gPSBmYWN0b3IoZ2VuLCANCiAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMSIsICIyIiwgIjMiLCAiNCIpLA0KICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJJbnRlcndhciIsICJCYWJ5IEJvb21lcnMiLCAiR2VuIFgiLCAiTWlsbGVubmlhbHMiKSkNCiAgKQ0KDQpgYGANCg0KYGBge3J9DQptb2RlbDEgPC0gbG0oYXV0aCB+IGdlbiwgZGF0YSA9IG1vZGVsX2RhdGFfZ2VuKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxzdW1tYXJ5KA0KICBsaXN0KG1vZGVsMSksDQogIGZtdCA9IDEsDQogIGVzdGltYXRlICA9IGMoICJ7ZXN0aW1hdGV9ICh7c3RkLmVycm9yfSl7c3RhcnN9IiksDQogIHN0YXRpc3RpYyA9IE5VTEwsDQogIGNvZWZfb21pdCA9ICJJbnRlcmNlcHQiKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxzIDwtIGxpc3QoDQogICJNb2RlbCAxIiA9IGxtKGF1dGggfiBnZW4sIGRhdGEgPSBtb2RlbF9kYXRhX2dlbikNCikNCg0KbW9kZWxzdW1tYXJ5KG1vZGVscywgZm10ID0gMSwNCiAgICAgICAgICAgICBlc3RpbWF0ZSA9IGMoIntlc3RpbWF0ZX0gKHtzdGQuZXJyb3J9KSIpLCBzdGF0aXN0aWMgPSBOVUxMKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxwbG90KG1vZGVscywgY29lZl9vbWl0ID0gJ0ludGVyYycpDQpgYGANCg0KDQpgYGB7cn0NCm1vZGVsc3VtbWFyeShtb2RlbHMsIGZtdCA9IDEsDQogICAgICAgICAgICAgZXN0aW1hdGUgPSBjKCJ7ZXN0aW1hdGV9ICh7c3RkLmVycm9yfSkiKSwgc3RhdGlzdGljID0gTlVMTCwNCg0KY29lZl9yZW5hbWUgPSBjKCJnZW5CYWJ5IEJvb21lcnMiID0gIkJhYnkgQm9vbWVycyIsICJnZW5HZW4gWCIgPSAiR2VuIFgiLCAiZ2VuTWlsbGVubmlhbHMiID0gIk1pbGxlbm5pYWxzIiksDQoNCnRpdGxlID0gIlRhYmxlIDIuIFJlZ3Jlc3Npb24gbW9kZWxzIGZvciBhdXRob3JpdGFyaWFuIGF0dGl0dWRlcyBpbiBJdGFseSINCikNCg0KYGBgDQoNCmBgYHtyfQ0KdGlkeShtb2RlbDEpIHw+DQprbml0cjo6a2FibGUoZGlnaXRzID0gMykNCmBgYA0KDQoNCiNJTlRFUlBSRVRBVElPTiMNCg0KQmFzZWQgb24gdGhlIGRhdGEgcHJvdmlkZWQsIGNvZWZmaWNpZW50cyByYW5nZWQgZnJvbSAxLjEgdG8gMy42LCBpbmRpY2F0aW5nIGFuIGV4dHJlbWVseSBzdHJvbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gYXV0aG9yaXRhcmlhbiBzY2FsZXMvc2NvcmVzIGFuZCBnZW5lcmF0aW9uIGJpcnRoIHllYXIsIGZ1cnRoZXIsIGFsbCBjb2VmZmljaWVudHMgc2hvd24gYSBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28sIGluZGljYXRpbmcgdGhhdCBhcyBnZW5lcmF0aW9uIHllYXIgcHJvZ3Jlc3NlZCwgYXV0aG9yaXRhcmlhbiBzY29yZXMgZGVjbGluZWQuIEluIG90aGVyIHdvcmRzLCBhcyB0aGUgeWVhcnMgcHJvZ3Jlc3NlZCwgaW5kaXZpZHVhbHMgYmVjYW1lIHNsaWdodGx5IG1vcmUgYXV0aG9yaXRhcmlhbi4gVGhlc2UgZmluZGluZ3MgYXJlIGZvdW5kIHRvIGJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZ2l2ZW4gdGhhdCBQID0gMC4gDQoNCkdpdmVuIHRoYXQgciA9IDAuMDA2LCB0aGlzIG1lYW5zIHRoYXQgdGhlIHZhcmlhbmNlIG9mIHNjb3JlcyBmcm9tIHRoZSBsaW5lIGFyZSBub3Qgc2lnbmlmaWNhbnQgZW5vdWdoIHRvIGludmFsaWRhdGUgdGhlIGZpbmRpbmdzLiBGdXJ0aGVyLCBpdCB3b3JrcyB0b3dhcmRzIHRoZSB2YWxpZGl0eSBhbmQgc3RyZW5ndGggb2YgdGhlIGZpbmRpbmdzIGJldHdlZW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdlbmVyYXRpb24geWVhciBhbmQgYXV0aG9yaXRhcmlhbiBzY2FsZXMuIA0KDQojVEFTSyA1Iw0KDQoxKSBHcmVlY2UgUG9wdWxpc3QNCg0KYGBge3J9DQpncmVlY2VfZGF0YSA8LSByZWFkLmZzdCAoImdyZWVjZV9kYXRhLmZzdCIpDQpgYGANCg0KYGBge3J9DQpncmVlY2VfZGF0YSR0cnN0cGx0IDwtIGlmZWxzZShncmVlY2VfZGF0YSR0cnN0cGx0ID4gMTAsIE5BLCBncmVlY2VfZGF0YSR0cnN0cGx0KQ0KZ3JlZWNlX2RhdGEkdHJzdHBybCA8LSBpZmVsc2UoZ3JlZWNlX2RhdGEkdHJzdHBybCA+IDEwLCBOQSwgZ3JlZWNlX2RhdGEkdHJzdHBybCkNCmdyZWVjZV9kYXRhJHRyc3RwcnQgPC0gaWZlbHNlKGdyZWVjZV9kYXRhJHRyc3RwcnQgPiAxMCwgTkEsIGdyZWVjZV9kYXRhJHRyc3RwcnQpDQpgYGANCg0KYGBge3J9DQpncmVlY2VfZGF0YSR0cnVzdCA8LSBzY2FsZXM6OnJlc2NhbGUoZ3JlZWNlX2RhdGEkdHJzdHBsdCArIGdyZWVjZV9kYXRhJHRyc3RwcmwgKyBncmVlY2VfZGF0YSR0cnN0cHJ0LCBuYS5ybSA9IFRSVUUsIHRvID0gYygwLCAxMDApKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoZ3JlZWNlX2RhdGEkdHJzdHBsdCkNCnRhYmxlKGdyZWVjZV9kYXRhJHRyc3RwcmwpDQp0YWJsZShncmVlY2VfZGF0YSR0cnN0cHJ0KQ0KYGBgDQpgYGB7cn0NCmdyZWVjZV9kYXRhIDwtIGdyZWVjZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYmVoYXZlID0gaXBiaHBycCwNCiAgICBzZWN1cmUgPSBpbXBzYWZlLA0KICAgIHNhZmV0eSA9IGlwc3RyZ3YsDQogICAgdHJhZGl0aW9uID0gaW1wdHJhZCwNCiAgICBydWxlcyA9IGlwZnJ1bGUpICU+JQ0KICANCiAgbXV0YXRlKGFjcm9zcyhjKCJiZWhhdmUiLCAic2VjdXJlIiwgInNhZmV0eSIsICJ0cmFkaXRpb24iLCAicnVsZXMiKSwNCiAgICAgICAgICAgICAgICB+IG5hX2lmKC54LCA3KSAlPiUgbmFfaWYoOCkgJT4lIG5hX2lmKDkpKSkgJT4lDQoNCiAgbXV0YXRlKGFjcm9zcyhjKCJiZWhhdmUiLCAic2VjdXJlIiwgInNhZmV0eSIsICJ0cmFkaXRpb24iLCAicnVsZXMiKSwgfiA3IC0gLnggKSkNCg0KDQpncmVlY2VfZGF0YSRhdXRoIDwtIHNjYWxlczo6cmVzY2FsZShncmVlY2VfZGF0YSRiZWhhdmUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlY2VfZGF0YSRzZWN1cmUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlY2VfZGF0YSRzYWZldHkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlY2VfZGF0YSR0cmFkaXRpb24gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlY2VfZGF0YSRydWxlcywgdG89YygwLDEwMCksIG5hLnJtID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCm1vZGVsX2RhdGEgPC0gZ3JlZWNlX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBnbmRyID0gY2FzZV93aGVuKA0KICAgICAgZ25kciA9PSAxIH4gIk1hbGUiLA0KICAgICAgZ25kciA9PSAyIH4gIkZlbWFsZSIsDQogICAgICBnbmRyID09IDkgfiBOQV9jaGFyYWN0ZXJfLA0KICAgICAgVFJVRSB+IGFzLmNoYXJhY3RlcihnbmRyKQ0KICAgICksDQogICAgDQogICAgbHJzY2FsZSA9IGNhc2Vfd2hlbigNCiAgICAgIGxyc2NhbGUgJWluJSAwOjMgfiAiTGVmdCIsDQogICAgICBscnNjYWxlICVpbiUgNzoxMCB+ICJSaWdodCIsDQogICAgICBscnNjYWxlICVpbiUgNDo2IH4gIk1vZGVyYXRlIiwNCiAgICAgIGxyc2NhbGUgJWluJSBjKDc3LCA4OCwgOTkpIH4gTkFfY2hhcmFjdGVyXyksDQogICAgDQogICAgR2VuID0gY2FzZV93aGVuKA0KICAgICAgeXJicm4gJWluJSAxOTAwOjE5NDUgfiAiMSIsDQogICAgICB5cmJybiAlaW4lIDE5NDY6MTk2NCB+ICIyIiwNCiAgICAgIHlyYnJuICVpbiUgMTk2NToxOTc5IH4gIjMiLA0KICAgICAgeXJicm4gJWluJSAxOTgwOjE5OTYgfiAiNCIsDQogICAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKHlyYnJuKQ0KICAgICksDQogICAgDQogICAgR2VuID0gZmFjdG9yKEdlbiwgbGV2ZWxzID0gYygiMSIsICIyIiwgIjMiLCAiNCIpLCANCiAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiSW50ZXJ3YXIiLCAiQmFieSBCb29tZXJzIiwgIkdlbiBYIiwgIk1pbGxlbm5pYWxzIikpDQogICAgDQopDQoNCnRhYmxlKGdyZWVjZV9kYXRhJGduZHIpDQp0YWJsZShncmVlY2VfZGF0YSRscnNjYWxlKQ0KdGFibGUoZ3JlZWNlX2RhdGEkR2VuKQ0KYGBgDQpgYGB7cn0NCm1vZGVsMSA8LSBsbShhdXRoIH4gbHJzY2FsZSwgZGF0YSA9IG1vZGVsX2RhdGEpDQptb2RlbDIgPC0gbG0oYXV0aCB+IGduZHIsIGRhdGEgPSBtb2RlbF9kYXRhKQ0KbW9kZWwzIDwtIGxtKGF1dGggfiBHZW4sIGRhdGEgPSBtb2RlbF9kYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxzIDwtIGxpc3QoDQogICJNb2RlbCAxIiA9IGxtKGF1dGggfiBscnNjYWxlLCBkYXRhID0gbW9kZWxfZGF0YSksDQogICJNb2RlbCAyIiA9IGxtKGF1dGggfiBnbmRyLCBkYXRhID0gbW9kZWxfZGF0YSksDQogICJNb2RlbCAzIiA9IGxtKGF1dGggfiBHZW4sIGRhdGEgPSBtb2RlbF9kYXRhKSkNCg0KbW9kZWxzdW1tYXJ5KG1vZGVscywgZm10ID0gMSwgDQogICAgICAgICAgICAgZXN0aW1hdGUgPSBjKCJ7ZXN0aW1hdGV9ICh7c3RkLmVycm9yfSl7c3RhcnN9IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIntlc3RpbWF0ZX0gKHtzdGQuZXJyb3J9KXtzdGFyc30iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAie2VzdGltYXRlfSAoe3N0ZC5lcnJvcn0pe3N0YXJzfSIpLA0KICAgICAgICAgICAgIA0Kc3RhdGlzdGljID0gTlVMTCwNCmNvZWZfcmVuYW1lID0gYygiR2VuQmFieSBCb29tZXJzIiA9ICJCYWJ5IEJvb21lcnMiLCAiR2VuR2VuIFgiID0gIkdlbiBYIiwgIkdlbk1pbGxlbm5pYWxzIiA9ICJNaWxsZW5uaWFscyIsICJnbmRyTWFsZSIgPSAiTWFsZSIsICJscnNjYWxlTW9kZXJhdGUiID0gIk1vZGVyYXRlIiwgImxyc2NhbGVSaWdodCIgPSAiUmlnaHQiKSwNCnRpdGxlID0gIlRhYmxlIDMuIFJlZ3Jlc3Npb24gbW9kZWxzIGZvciBhdXRob3JpdGFyaWFuIGF0dGl0dWRlcyBmb3IgdGhlIGNvdW50cnkgb2YgR3JlZWNlIg0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgICkNCmBgYA0KDQpgYGB7cn0NCmNvZWZfcmVuYW1lID0gYygiR2VuQmFieSBCb29tZXJzIiA9ICJCYWJ5IEJvb21lcnMiLCAiR2VuR2VuIFgiID0gIkdlbiBYIiwgIkdlbk1pbGxlbm5pYWxzIiA9ICJNaWxsZW5uaWFscyIsICJnbmRyTWFsZSIgPSAiTWFsZSIsICJscnNjYWxlTW9kZXJhdGUiID0gIk1vZGVyYXRlIiwgImxyc2NhbGVSaWdodCIgPSAiUmlnaHQiKQ0KDQptb2RlbHBsb3QobW9kZWxzLCBjb2VmX29taXQgPSAnSW50ZXJjJykNCg0KYGBgDQoNCg0KDQojSU5URVJQUkVUQVRJT04jDQoNCkZpcnN0bHksIGEgOTUlIENJIGluZGljYXRlcyB1cG9uIHJlcGVhdGVkIG1lYXN1cmVzIHdlIGNhbiBiZSA5NSUgc3VyZSB0aGF0IHRoZSB0cnVlIHZhbHVlIHdvdWxkIGxpZSBiZXR3ZWVuIGFuIGFscGhhID0gLjA1LiBOb3RhYmx5LCB0aGUgbW9zdCBleHRyZW1lIHJlc3VsdHMgb2J0YWluZWQgaXMgcmVnYXJkaW5nIHRoZSBscnNjYWxlLiBXZSBzZWUgYm90aCBhIHBvc2l0aXZlIGFuZCBhbiBFeHRyZW1lbHkgU3Ryb25nICgzLjggLSA2LjEpIGNvcnJlbGF0aW9uIGJldHdlZW4gbHJzY2FsZSBhbmQgcG9wdWxpc3Qgc2NhbGVzLCB3aGljaCBhcmUgcmVhc29uYWJsZSB0byBhc3N1bWUgc2luY2UgYm90aCB2YXJpYWJsZXMgY29uc2lkZXIgdGhlIHBvbGl0aWNhbCBhZmZpbGlhdGlvbiBvZiBwZXJzb25zLiBGdXJ0aGVyLCBib3RoIGNvZWZmaWNpZW50cyBpbmRpY2F0ZSBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCB3aGljaCB0ZWxscyB1cyB0aGF0IHBvcHVsaXN0IGF0dGl0dWRlcyBmb2xsb3cgb3IgbWltaWMgcG9saXRpY2FsIGFmZmlsaWF0aW9uLiANCg0KUmVnYXJkaW5nIHRoZSB2YXJpYWJsZSBnbmRyLCBNYWxlcyBzaG93biBhbiBleHRyZW1lbHkgc3Ryb25nIGNvcnJlbGF0aW9uICgyLjApIGJldHdlZW4gcG9wdWxpc3QgYXR0aXR1ZGVzLiBUaGUgY29ycmVsYXRpb24gaXMgYWxzbyBuZWdhdGl2ZSB3aGljaCB0ZWxscyB1cyB0aGF0IHRoZSBvcHBvc2l0ZSBnZW5kZXIgdGVuZCB0byBzaG93IGFuIGludmVyc2UgcmVhY3Rpb24gdG93YXJkcyBwb3B1bGlzdCBzY29yZXMuDQoNCkZpbmFsbHksIGFzIGV4cGVjdGVkIG9mIHRoZSBnZW5lcmF0aW9uYWwgbW9kZWwgYmV0d2VlbiBwb3B1bGlzdCBzY2FsZXMgYW5kIGdlbmVyYXRpb25hbCBiaXJ0aCwgd2Ugc2VlIHNpbWlsYXIgZmluZGluZ3MgdG8gdGhhdCBpbiBUYXNrIDQsIHdpdGggYW4gZXh0ZXJtZWx5IHN0cm9uZyBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHBvcHVsaXN0IHNjYWxlIGFuZCBnZW5lcmF0aW9uYWwgYmlydGgNCg0KDQo=