library(tidyverse)
library(openintro)
library(corrplot)
library(ggthemes)
theme_set(theme_clean())
source("../scripts/prune_race_variables.R")

Load data and packages

grad_race_HH <- read_csv("../data/hh.csv") %>%
    mutate(leaid = as.integer(leaid)) %>%
    left_join(read_csv("../data/race.csv") %>%
                  mutate(leaid = as.integer(leaid)) %>%
                  prune_and_predom(), 
              by = c("leaid" = "leaid")) %>%
    left_join(read_csv("../data/grad.csv") %>%
                  mutate(leaid = as.integer(leaid)), 
              by = c("leaid" = "leaid"))

Summary Statistics

Lets take a look at the summary statistics of graduation rates. The average graduation rates across the US is about 87.84. Interestingly, there are school districts that have as low as 3.23 percent graduation rates.

summary(grad_race_HH$grad_rate_midpt)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    3.23   81.53   87.52   85.68   91.51   97.93    2550

Taking a closer look with the histogram, we can see that there is an abnormal distribution skewed right with the majority of graduation rates centered between 80 and 90 percent. We are able to see where the outlier school district graduation rates are in the boxplot. Lets take a closer look at these outliers.

hist(grad_race_HH$grad_rate_midpt)

ggplot(grad_race_HH, aes(x = grad_rate_midpt))+
  geom_boxplot()
## Warning: Removed 2550 rows containing non-finite values (stat_boxplot).

Outliers

There are 759 school districts that are considered outliers from the normal distribution. The district with the smallest graduation rate is Shannon Country School District with 3.23% graduation rate and 3856 children. Another thing to note is the school district with the second lowest graduation rate is an elementary school district. If there are only Elementary schools in this district, as it is labeled, how did they document a graduation rate? As I continued looking deeper into the schools with the lowest graduation rates, I found that several of them are elementary and middle school districts that do not have high schools. This begs the questions of how many of the outlier districts are elementary/middle school districts and how are they able to document graduation rates?

grad_race_HH_outliers <- grad_race_HH %>%
  filter(grad_rate_midpt < 75) %>%
  select(dist, state, children, grad_rate_midpt) %>%
  arrange(grad_rate_midpt)
grad_race_HH_outliers
## # A tibble: 815 × 4
##    dist                                           state children grad_rate_midpt
##    <chr>                                          <chr>    <dbl>           <dbl>
##  1 Shannon County School District 65-1            Sout…     3856            3.23
##  2 Hermosa Beach City Elementary School District  Cali…     2257           15.4 
##  3 Mitchell School District 55                    Oreg…       31           23.6 
##  4 Vilas School District RE-5                     Colo…       52           24   
##  5 Mackinac Island Public Schools                 Mich…       77           24   
##  6 Vanderbilt Area Schools                        Mich…      253           24   
##  7 College Corner Local School District           Ohio       116           24   
##  8 Annex School District 29                       Oreg…       84           24   
##  9 Manchester City School District                Tenn…     1849           24   
## 10 Kiryas Joel Village Union Free School District New …     9176           24   
## # … with 805 more rows

Lets take a look at Shannon County School District. We can see that the household conditions are quite high with about 52% in poverty, 70% with single parents, 50% without computer access ect. We can also see that just over 90 percent of these students are estimated to be native american, so we can assume it is probably located on an Indian reservation. The rest of the student population consists of minority students with no white population.

US News gives more insight into this school district, reporting that 100% of those attending the school are “economically disadvantaged” https://www.usnews.com/education/best-high-schools/south-dakota/districts/oglala-lakota-county-65-1/oglala-lakota-county-virtual-high-school-92-17876

Here is a link to the shool district if you are curious: https://www.olcsd.com/

Given this information, it makes sense that graduation rates may be low (or it may be that they are under reported due to lack of resources?)

Shannon_County <- grad_race_HH %>%
  filter(dist == "Shannon County School District 65-1"  ) %>%
  glimpse()
## Rows: 1
## Columns: 26
## $ state           <chr> "South Dakota"
## $ leaid           <int> 4665460
## $ dist            <chr> "Shannon County School District 65-1"
## $ children        <dbl> 3856
## $ pct_pov         <dbl> 0.5222682
## $ pct_SP          <dbl> 0.6934171
## $ SP_MOE          <dbl> 0.075
## $ pct_HHVJ        <dbl> 0.2386855
## $ HHVJ_MOE        <dbl> 0.05
## $ pct_CC          <dbl> 0.3375886
## $ CC_MOE          <dbl> 0.055
## $ pct_NCI         <dbl> 0.4896849
## $ nci_MOE         <dbl> 0.08
## $ pct_CD          <dbl> 0.06224066
## $ CD_MOE          <dbl> 0.02
## $ pct_CLI         <dbl> 0
## $ CLI_MOE         <dbl> 0.005
## $ region          <chr> "North Central"
## $ predom_race     <fct> Native American
## $ pct_hisp_latino <dbl> 5
## $ pct_white       <dbl> 0
## $ pct_black       <dbl> 0
## $ pct_native      <dbl> 90.7
## $ pct_asian       <dbl> 0
## $ pct_PI          <dbl> 0
## $ grad_rate_midpt <dbl> 3.22963

Correlation Matrices

Graduation rates have the strongest negative correlation with households in poverty and those with single parents in the entire US.

grad_race_HH_corr <- grad_race_HH %>%
  select(dist, 
         children, 
         grad_rate_midpt, 
         pct_pov:pct_CLI, 
         pct_hisp_latino, 
         pct_white, 
         pct_black, 
         pct_native, 
         pct_asian)%>%
  na.omit()

grad_race_HH_corr[,2:ncol(grad_race_HH_corr)] %>% 
    cor() %>%
    corrplot(method = "number")

I am curious how this matrix would change if I filtered out the outliers with grad rates specifically. It did not change it much, in fact it made the correlations between grad rates and the household conditions less significant.

grad_race_HH_norm <- grad_race_HH%>% 
  filter(grad_rate_midpt > 75) %>%
  select(dist, 
         children, 
         grad_rate_midpt, 
         pct_pov:pct_CLI, 
         pct_hisp_latino, 
         pct_white, 
         pct_black, 
         pct_native, 
         pct_asian) %>%
  na.omit()

grad_race_HH_norm[,2:ncol(grad_race_HH_norm)] %>% 
    cor() %>%
    corrplot(method = "number")

Lets look into some regional differences. Here is a correlation matrix of the Bible Belt states.

bible_belt <- grad_race_HH %>%
  filter(state == "Alabama" |
         state == "Arkansas" |
         state == "Georgia"|
         state == "Kentucky"|
         state == "Louisiana"|
         state == "Mississippi"|
         state == "North Carolina"|
         state == "Oklahoma"|
         state == "South Carolina"|
         state == "Tennessee"|
         state == "Texas"|
         state == "Utah") %>%
  select(dist, 
         children, 
         grad_rate_midpt, 
         pct_pov:pct_CLI, 
         pct_hisp_latino, 
         pct_white, 
         pct_black, 
         pct_native, 
         pct_asian) %>%
  na.omit()

bible_belt[,2:ncol(bible_belt)] %>% 
    cor() %>%
    corrplot(method = "number")

Now lets see about grad rates in states with the “worst” school systems. (https://www.newsnationnow.com/us-news/list-states-with-the-best-and-worst-public-school-systems/)

worst_states <- grad_race_HH %>%
  filter(state == "Alabama" |
         state == "Alaska" |
         state == "Arizona"|
         state == "Louisiana"|
         state == "New Mexico") %>%
  select(dist, 
         children, 
         grad_rate_midpt, 
         pct_pov:pct_CLI, 
         pct_hisp_latino, 
         pct_white, 
         pct_black, 
         pct_native, 
         pct_asian) %>%
  na.omit()

worst_states[,2:ncol(worst_states)] %>% 
    cor() %>%
    corrplot(method = "number")

What about the states with the “best” school systems? This plot is especially fascinating with a significantly higher negative correlation between grad rates and household conditions, as well as for black and Hispanic students.

best_states <- grad_race_HH %>%
  filter(state == "Massachusetts" |
         state == "Connecticut" |
         state == "New Jersey"|
         state == "Virginia"|
         state == "New Hampshire") %>%
  select(dist, 
         children, 
         grad_rate_midpt, 
         pct_pov:pct_CLI, 
         pct_hisp_latino, 
         pct_white, 
         pct_black, 
         pct_native, 
         pct_asian) %>%
  na.omit()

best_states[,2:ncol(best_states)] %>% 
    cor() %>%
    corrplot(method = "number")

Visualizations

ggplot(grad_race_HH, 
       aes(x = pct_native, y = grad_rate_midpt)) + 
    geom_point(alpha = 0.1) + 
    geom_smooth(method = "lm", se = T) + 
    scale_x_log10()
## Warning: Transformation introduced infinite values in continuous x-axis
## Transformation introduced infinite values in continuous x-axis
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 9788 rows containing non-finite values (stat_smooth).
## Warning: Removed 3112 rows containing missing values (geom_point).

LS0tCnRpdGxlOiAiR3JhZCBSYXRlczogQnJpZWYgQW5hbHlzaXMgYW5kIENvcnJlbGF0aW9uIE1hdHJpY2VzIgphdXRob3I6ICJKb24gR2VpZ2VyLCBOb2VsIEdvb2R3aW4sIEFiaWdhaWwgSm9wcGEiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQKLS0tCgpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShvcGVuaW50cm8pCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkoZ2d0aGVtZXMpCnRoZW1lX3NldCh0aGVtZV9jbGVhbigpKQpzb3VyY2UoIi4uL3NjcmlwdHMvcHJ1bmVfcmFjZV92YXJpYWJsZXMuUiIpCmBgYAoKIyMjIExvYWQgZGF0YSBhbmQgcGFja2FnZXMKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpncmFkX3JhY2VfSEggPC0gcmVhZF9jc3YoIi4uL2RhdGEvaGguY3N2IikgJT4lCiAgICBtdXRhdGUobGVhaWQgPSBhcy5pbnRlZ2VyKGxlYWlkKSkgJT4lCiAgICBsZWZ0X2pvaW4ocmVhZF9jc3YoIi4uL2RhdGEvcmFjZS5jc3YiKSAlPiUKICAgICAgICAgICAgICAgICAgbXV0YXRlKGxlYWlkID0gYXMuaW50ZWdlcihsZWFpZCkpICU+JQogICAgICAgICAgICAgICAgICBwcnVuZV9hbmRfcHJlZG9tKCksIAogICAgICAgICAgICAgIGJ5ID0gYygibGVhaWQiID0gImxlYWlkIikpICU+JQogICAgbGVmdF9qb2luKHJlYWRfY3N2KCIuLi9kYXRhL2dyYWQuY3N2IikgJT4lCiAgICAgICAgICAgICAgICAgIG11dGF0ZShsZWFpZCA9IGFzLmludGVnZXIobGVhaWQpKSwgCiAgICAgICAgICAgICAgYnkgPSBjKCJsZWFpZCIgPSAibGVhaWQiKSkKYGBgCgojIyMgU3VtbWFyeSBTdGF0aXN0aWNzCgpMZXRzIHRha2UgYSBsb29rIGF0IHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgZ3JhZHVhdGlvbiByYXRlcy4gVGhlIGF2ZXJhZ2UgZ3JhZHVhdGlvbiByYXRlcyBhY3Jvc3MgdGhlIFVTIGlzIGFib3V0IDg3Ljg0LiBJbnRlcmVzdGluZ2x5LCB0aGVyZSBhcmUgc2Nob29sIGRpc3RyaWN0cyB0aGF0IGhhdmUgYXMgbG93IGFzIDMuMjMgcGVyY2VudCBncmFkdWF0aW9uIHJhdGVzLiAKYGBge3J9IApzdW1tYXJ5KGdyYWRfcmFjZV9ISCRncmFkX3JhdGVfbWlkcHQpCmBgYAoKVGFraW5nIGEgY2xvc2VyIGxvb2sgd2l0aCB0aGUgaGlzdG9ncmFtLCB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgaXMgYW4gYWJub3JtYWwgZGlzdHJpYnV0aW9uIHNrZXdlZCByaWdodCB3aXRoIHRoZSBtYWpvcml0eSBvZiBncmFkdWF0aW9uIHJhdGVzIGNlbnRlcmVkIGJldHdlZW4gODAgYW5kIDkwIHBlcmNlbnQuIFdlIGFyZSBhYmxlIHRvIHNlZSB3aGVyZSB0aGUgb3V0bGllciBzY2hvb2wgZGlzdHJpY3QgZ3JhZHVhdGlvbiByYXRlcyBhcmUgaW4gdGhlIGJveHBsb3QuIExldHMgdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZXNlIG91dGxpZXJzLiAKCmBgYHtyfQpoaXN0KGdyYWRfcmFjZV9ISCRncmFkX3JhdGVfbWlkcHQpCgpnZ3Bsb3QoZ3JhZF9yYWNlX0hILCBhZXMoeCA9IGdyYWRfcmF0ZV9taWRwdCkpKwogIGdlb21fYm94cGxvdCgpCmBgYAoKIyMjIE91dGxpZXJzCgpUaGVyZSBhcmUgNzU5IHNjaG9vbCBkaXN0cmljdHMgdGhhdCBhcmUgY29uc2lkZXJlZCBvdXRsaWVycyBmcm9tIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLiBUaGUgZGlzdHJpY3Qgd2l0aCB0aGUgc21hbGxlc3QgZ3JhZHVhdGlvbiByYXRlIGlzIFNoYW5ub24gQ291bnRyeSBTY2hvb2wgRGlzdHJpY3Qgd2l0aCAzLjIzJSBncmFkdWF0aW9uIHJhdGUgYW5kIDM4NTYgY2hpbGRyZW4uIEFub3RoZXIgdGhpbmcgdG8gbm90ZSBpcyB0aGUgc2Nob29sIGRpc3RyaWN0IHdpdGggdGhlIHNlY29uZCBsb3dlc3QgZ3JhZHVhdGlvbiByYXRlIGlzIGFuIGVsZW1lbnRhcnkgc2Nob29sIGRpc3RyaWN0LiBJZiB0aGVyZSBhcmUgb25seSBFbGVtZW50YXJ5IHNjaG9vbHMgaW4gdGhpcyBkaXN0cmljdCwgYXMgaXQgaXMgbGFiZWxlZCwgaG93IGRpZCB0aGV5IGRvY3VtZW50IGEgZ3JhZHVhdGlvbiByYXRlPyBBcyBJIGNvbnRpbnVlZCBsb29raW5nIGRlZXBlciBpbnRvIHRoZSBzY2hvb2xzIHdpdGggdGhlIGxvd2VzdCBncmFkdWF0aW9uIHJhdGVzLCBJIGZvdW5kIHRoYXQgc2V2ZXJhbCBvZiB0aGVtIGFyZSBlbGVtZW50YXJ5IGFuZCBtaWRkbGUgc2Nob29sIGRpc3RyaWN0cyB0aGF0IGRvIG5vdCBoYXZlIGhpZ2ggc2Nob29scy4gVGhpcyBiZWdzIHRoZSBxdWVzdGlvbnMgb2YgaG93IG1hbnkgb2YgdGhlIG91dGxpZXIgZGlzdHJpY3RzIGFyZSBlbGVtZW50YXJ5L21pZGRsZSBzY2hvb2wgZGlzdHJpY3RzIGFuZCBob3cgYXJlIHRoZXkgYWJsZSB0byBkb2N1bWVudCBncmFkdWF0aW9uIHJhdGVzPyAKCmBgYHtyfQpncmFkX3JhY2VfSEhfb3V0bGllcnMgPC0gZ3JhZF9yYWNlX0hIICU+JQogIGZpbHRlcihncmFkX3JhdGVfbWlkcHQgPCA3NSkgJT4lCiAgc2VsZWN0KGRpc3QsIHN0YXRlLCBjaGlsZHJlbiwgZ3JhZF9yYXRlX21pZHB0KSAlPiUKICBhcnJhbmdlKGdyYWRfcmF0ZV9taWRwdCkKZ3JhZF9yYWNlX0hIX291dGxpZXJzCgpgYGAKCkxldHMgdGFrZSBhIGxvb2sgYXQgU2hhbm5vbiBDb3VudHkgU2Nob29sIERpc3RyaWN0LiBXZSBjYW4gc2VlIHRoYXQgdGhlIGhvdXNlaG9sZCBjb25kaXRpb25zIGFyZSBxdWl0ZSBoaWdoIHdpdGggYWJvdXQgNTIlIGluIHBvdmVydHksIDcwJSB3aXRoIHNpbmdsZSBwYXJlbnRzLCA1MCUgd2l0aG91dCBjb21wdXRlciBhY2Nlc3MgZWN0LiBXZSBjYW4gYWxzbyBzZWUgdGhhdCBqdXN0IG92ZXIgOTAgcGVyY2VudCBvZiB0aGVzZSBzdHVkZW50cyBhcmUgZXN0aW1hdGVkIHRvIGJlIG5hdGl2ZSBhbWVyaWNhbiwgc28gd2UgY2FuIGFzc3VtZSBpdCBpcyBwcm9iYWJseSBsb2NhdGVkIG9uIGFuIEluZGlhbiByZXNlcnZhdGlvbi4gVGhlIHJlc3Qgb2YgdGhlIHN0dWRlbnQgcG9wdWxhdGlvbiBjb25zaXN0cyBvZiBtaW5vcml0eSBzdHVkZW50cyB3aXRoIG5vIHdoaXRlIHBvcHVsYXRpb24uIAoKVVMgTmV3cyBnaXZlcyBtb3JlIGluc2lnaHQgaW50byB0aGlzIHNjaG9vbCBkaXN0cmljdCwgcmVwb3J0aW5nIHRoYXQgMTAwJSBvZiB0aG9zZSBhdHRlbmRpbmcgdGhlIHNjaG9vbCBhcmUgImVjb25vbWljYWxseSBkaXNhZHZhbnRhZ2VkIiBodHRwczovL3d3dy51c25ld3MuY29tL2VkdWNhdGlvbi9iZXN0LWhpZ2gtc2Nob29scy9zb3V0aC1kYWtvdGEvZGlzdHJpY3RzL29nbGFsYS1sYWtvdGEtY291bnR5LTY1LTEvb2dsYWxhLWxha290YS1jb3VudHktdmlydHVhbC1oaWdoLXNjaG9vbC05Mi0xNzg3NiAKCkhlcmUgaXMgYSBsaW5rIHRvIHRoZSBzaG9vbCBkaXN0cmljdCBpZiB5b3UgYXJlIGN1cmlvdXM6IGh0dHBzOi8vd3d3Lm9sY3NkLmNvbS8KCkdpdmVuIHRoaXMgaW5mb3JtYXRpb24sIGl0IG1ha2VzIHNlbnNlIHRoYXQgZ3JhZHVhdGlvbiByYXRlcyBtYXkgYmUgbG93IChvciBpdCBtYXkgYmUgdGhhdCB0aGV5IGFyZSB1bmRlciByZXBvcnRlZCBkdWUgdG8gbGFjayBvZiByZXNvdXJjZXM/KSAKYGBge3J9ClNoYW5ub25fQ291bnR5IDwtIGdyYWRfcmFjZV9ISCAlPiUKICBmaWx0ZXIoZGlzdCA9PSAiU2hhbm5vbiBDb3VudHkgU2Nob29sIERpc3RyaWN0IDY1LTEiCSkgJT4lCiAgZ2xpbXBzZSgpCmBgYAoKCiMjIyBDb3JyZWxhdGlvbiBNYXRyaWNlcwoKR3JhZHVhdGlvbiByYXRlcyBoYXZlIHRoZSBzdHJvbmdlc3QgbmVnYXRpdmUgY29ycmVsYXRpb24gd2l0aCBob3VzZWhvbGRzIGluIHBvdmVydHkgYW5kIHRob3NlIHdpdGggc2luZ2xlIHBhcmVudHMgaW4gdGhlIGVudGlyZSBVUy4gIAoKYGBge3J9CmdyYWRfcmFjZV9ISF9jb3JyIDwtIGdyYWRfcmFjZV9ISCAlPiUKICBzZWxlY3QoZGlzdCwgCiAgICAgICAgIGNoaWxkcmVuLCAKICAgICAgICAgZ3JhZF9yYXRlX21pZHB0LCAKICAgICAgICAgcGN0X3BvdjpwY3RfQ0xJLCAKICAgICAgICAgcGN0X2hpc3BfbGF0aW5vLCAKICAgICAgICAgcGN0X3doaXRlLCAKICAgICAgICAgcGN0X2JsYWNrLCAKICAgICAgICAgcGN0X25hdGl2ZSwgCiAgICAgICAgIHBjdF9hc2lhbiklPiUKICBuYS5vbWl0KCkKCmdyYWRfcmFjZV9ISF9jb3JyWywyOm5jb2woZ3JhZF9yYWNlX0hIX2NvcnIpXSAlPiUgCiAgICBjb3IoKSAlPiUKICAgIGNvcnJwbG90KG1ldGhvZCA9ICJudW1iZXIiKQoKYGBgCgpJIGFtIGN1cmlvdXMgaG93IHRoaXMgbWF0cml4IHdvdWxkIGNoYW5nZSBpZiBJIGZpbHRlcmVkIG91dCB0aGUgb3V0bGllcnMgd2l0aCBncmFkIHJhdGVzIHNwZWNpZmljYWxseS4gSXQgZGlkIG5vdCBjaGFuZ2UgaXQgbXVjaCwgaW4gZmFjdCBpdCBtYWRlIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBncmFkIHJhdGVzIGFuZCB0aGUgaG91c2Vob2xkIGNvbmRpdGlvbnMgbGVzcyBzaWduaWZpY2FudC4gCmBgYHtyfQpncmFkX3JhY2VfSEhfbm9ybSA8LSBncmFkX3JhY2VfSEglPiUgCiAgZmlsdGVyKGdyYWRfcmF0ZV9taWRwdCA+IDc1KSAlPiUKICBzZWxlY3QoZGlzdCwgCiAgICAgICAgIGNoaWxkcmVuLCAKICAgICAgICAgZ3JhZF9yYXRlX21pZHB0LCAKICAgICAgICAgcGN0X3BvdjpwY3RfQ0xJLCAKICAgICAgICAgcGN0X2hpc3BfbGF0aW5vLCAKICAgICAgICAgcGN0X3doaXRlLCAKICAgICAgICAgcGN0X2JsYWNrLCAKICAgICAgICAgcGN0X25hdGl2ZSwgCiAgICAgICAgIHBjdF9hc2lhbikgJT4lCiAgbmEub21pdCgpCgpncmFkX3JhY2VfSEhfbm9ybVssMjpuY29sKGdyYWRfcmFjZV9ISF9ub3JtKV0gJT4lIAogICAgY29yKCkgJT4lCiAgICBjb3JycGxvdChtZXRob2QgPSAibnVtYmVyIikKYGBgCkxldHMgbG9vayBpbnRvIHNvbWUgcmVnaW9uYWwgZGlmZmVyZW5jZXMuIEhlcmUgaXMgYSBjb3JyZWxhdGlvbiBtYXRyaXggb2YgdGhlIEJpYmxlIEJlbHQgc3RhdGVzLiAKYGBge3J9CmJpYmxlX2JlbHQgPC0gZ3JhZF9yYWNlX0hIICU+JQogIGZpbHRlcihzdGF0ZSA9PSAiQWxhYmFtYSIgfAogICAgICAgICBzdGF0ZSA9PSAiQXJrYW5zYXMiIHwKICAgICAgICAgc3RhdGUgPT0gIkdlb3JnaWEifAogICAgICAgICBzdGF0ZSA9PSAiS2VudHVja3kifAogICAgICAgICBzdGF0ZSA9PSAiTG91aXNpYW5hInwKICAgICAgICAgc3RhdGUgPT0gIk1pc3Npc3NpcHBpInwKICAgICAgICAgc3RhdGUgPT0gIk5vcnRoIENhcm9saW5hInwKICAgICAgICAgc3RhdGUgPT0gIk9rbGFob21hInwKICAgICAgICAgc3RhdGUgPT0gIlNvdXRoIENhcm9saW5hInwKICAgICAgICAgc3RhdGUgPT0gIlRlbm5lc3NlZSJ8CiAgICAgICAgIHN0YXRlID09ICJUZXhhcyJ8CiAgICAgICAgIHN0YXRlID09ICJVdGFoIikgJT4lCiAgc2VsZWN0KGRpc3QsIAogICAgICAgICBjaGlsZHJlbiwgCiAgICAgICAgIGdyYWRfcmF0ZV9taWRwdCwgCiAgICAgICAgIHBjdF9wb3Y6cGN0X0NMSSwgCiAgICAgICAgIHBjdF9oaXNwX2xhdGlubywgCiAgICAgICAgIHBjdF93aGl0ZSwgCiAgICAgICAgIHBjdF9ibGFjaywgCiAgICAgICAgIHBjdF9uYXRpdmUsIAogICAgICAgICBwY3RfYXNpYW4pICU+JQogIG5hLm9taXQoKQoKYmlibGVfYmVsdFssMjpuY29sKGJpYmxlX2JlbHQpXSAlPiUgCiAgICBjb3IoKSAlPiUKICAgIGNvcnJwbG90KG1ldGhvZCA9ICJudW1iZXIiKQpgYGAKCgpOb3cgbGV0cyBzZWUgYWJvdXQgZ3JhZCByYXRlcyBpbiBzdGF0ZXMgd2l0aCB0aGUgIndvcnN0IiBzY2hvb2wgc3lzdGVtcy4gIChodHRwczovL3d3dy5uZXdzbmF0aW9ubm93LmNvbS91cy1uZXdzL2xpc3Qtc3RhdGVzLXdpdGgtdGhlLWJlc3QtYW5kLXdvcnN0LXB1YmxpYy1zY2hvb2wtc3lzdGVtcy8pCmBgYHtyfQp3b3JzdF9zdGF0ZXMgPC0gZ3JhZF9yYWNlX0hIICU+JQogIGZpbHRlcihzdGF0ZSA9PSAiQWxhYmFtYSIgfAogICAgICAgICBzdGF0ZSA9PSAiQWxhc2thIiB8CiAgICAgICAgIHN0YXRlID09ICJBcml6b25hInwKICAgICAgICAgc3RhdGUgPT0gIkxvdWlzaWFuYSJ8CiAgICAgICAgIHN0YXRlID09ICJOZXcgTWV4aWNvIikgJT4lCiAgc2VsZWN0KGRpc3QsIAogICAgICAgICBjaGlsZHJlbiwgCiAgICAgICAgIGdyYWRfcmF0ZV9taWRwdCwgCiAgICAgICAgIHBjdF9wb3Y6cGN0X0NMSSwgCiAgICAgICAgIHBjdF9oaXNwX2xhdGlubywgCiAgICAgICAgIHBjdF93aGl0ZSwgCiAgICAgICAgIHBjdF9ibGFjaywgCiAgICAgICAgIHBjdF9uYXRpdmUsIAogICAgICAgICBwY3RfYXNpYW4pICU+JQogIG5hLm9taXQoKQoKd29yc3Rfc3RhdGVzWywyOm5jb2wod29yc3Rfc3RhdGVzKV0gJT4lIAogICAgY29yKCkgJT4lCiAgICBjb3JycGxvdChtZXRob2QgPSAibnVtYmVyIikKCgpgYGAKCgpXaGF0IGFib3V0IHRoZSBzdGF0ZXMgd2l0aCB0aGUgImJlc3QiIHNjaG9vbCBzeXN0ZW1zPyBUaGlzIHBsb3QgaXMgZXNwZWNpYWxseSBmYXNjaW5hdGluZyB3aXRoIGEgc2lnbmlmaWNhbnRseSBoaWdoZXIgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBncmFkIHJhdGVzIGFuZCBob3VzZWhvbGQgY29uZGl0aW9ucywgYXMgd2VsbCBhcyBmb3IgYmxhY2sgYW5kIEhpc3BhbmljIHN0dWRlbnRzLiAKYGBge3J9CgpiZXN0X3N0YXRlcyA8LSBncmFkX3JhY2VfSEggJT4lCiAgZmlsdGVyKHN0YXRlID09ICJNYXNzYWNodXNldHRzIiB8CiAgICAgICAgIHN0YXRlID09ICJDb25uZWN0aWN1dCIgfAogICAgICAgICBzdGF0ZSA9PSAiTmV3IEplcnNleSJ8CiAgICAgICAgIHN0YXRlID09ICJWaXJnaW5pYSJ8CiAgICAgICAgIHN0YXRlID09ICJOZXcgSGFtcHNoaXJlIikgJT4lCiAgc2VsZWN0KGRpc3QsIAogICAgICAgICBjaGlsZHJlbiwgCiAgICAgICAgIGdyYWRfcmF0ZV9taWRwdCwgCiAgICAgICAgIHBjdF9wb3Y6cGN0X0NMSSwgCiAgICAgICAgIHBjdF9oaXNwX2xhdGlubywgCiAgICAgICAgIHBjdF93aGl0ZSwgCiAgICAgICAgIHBjdF9ibGFjaywgCiAgICAgICAgIHBjdF9uYXRpdmUsIAogICAgICAgICBwY3RfYXNpYW4pICU+JQogIG5hLm9taXQoKQoKYmVzdF9zdGF0ZXNbLDI6bmNvbChiZXN0X3N0YXRlcyldICU+JSAKICAgIGNvcigpICU+JQogICAgY29ycnBsb3QobWV0aG9kID0gIm51bWJlciIpCgpgYGAKCgojIyMgVmlzdWFsaXphdGlvbnMKCmBgYHtyfQpnZ3Bsb3QoZ3JhZF9yYWNlX0hILCAKICAgICAgIGFlcyh4ID0gcGN0X25hdGl2ZSwgeSA9IGdyYWRfcmF0ZV9taWRwdCkpICsgCiAgICBnZW9tX3BvaW50KGFscGhhID0gMC4xKSArIAogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUKSArIAogICAgc2NhbGVfeF9sb2cxMCgpCmBgYAoK