Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. El repo del trabajo está aquí. La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1. Introducción

El fútbol femenino es el deporte de equipo más practicado por mujeres en todo el mundo. Este deporte empezó a ser practicado en una sección femenina hace mucho tiempo, a finales del siglo XIX, en Londres pero fue a causa de las distintas guerras y los problemas económicos y sociales de los años siguientes que este deporte dejó de ser practicado.
Actualmente, hace años que el fútbol femenino dejó de ser un mundo de hombres y las mujeres dieron el paso para practicar este deporte, a pesar de que tienen que seguir aguantando comentarios despectivos y frases como “el fútbol es un deporte de hombres”.
Según los datos oficiales de la FIFA, más o menos 26 millones de mujeres juegan al fútbol en 180 países del mundo. Europa es el continente que ha experimentado un mayor crecimiento en los últimos años donde el número de mujeres que practican este deporte se ha multiplicado por cinco.
En nuestro país, España, también ha habido un gran progreso y la selección nacional femenina ha estado presente en los últimos años en Mundiales y Eurocopas.
Poco a poco se está normalizando esta modalidad del fútbol pero todavía faltan muchos aspectos para mejorar como el sueldo de las profesionales, ni comparable con las cifras que se mueven en el fútbol masculino.
Selección española

Selección española

Debido a la necesidad de dar mayor visibilidad al fútbol femenino y ya que yo también practico este deporte he decidido tratar este tema en el trabajo de la asignatura “Programación y manejo de datos en la era del Big Data”.
La finalidad y objetivo de este análisis es observar el desarrollo a lo largo del tiempo del fútbol femenino en los diferentes países del mundo.

2. Datos

Los datos que he utilizado para hacer el análisis se encuantran en el siguiente link: Datos

En estos datos aparecen los partidos de las selecciones de fútbol femenino desde el año 1969 hasta marzo del año 2020, donde pararon los partidos debido a la pandemia por el Coronavirus.

2.1. Procesando los datos


futfem <- read_excel("./Datos/results_futfem.xlsx")

# Con la siguiente función he separado la columna "date" para poder tener los años en una sola columna y mostrar la evolución a lo largo de los años.

date <- futfem %>%  separate(col = date, 
              into = c("Año", "Mes", "Dia"),
              sep  = "-")

3. Análisis de selecciones

3.1. Evolución del fútbol femenino a lo largo del tiempo

# A partir de la tabla que ya habia arreglado anteriormente, agrupo los años para saber cuantos partidos se jugaron cada año.

evol <- date %>% group_by(Año)%>% count()

# Hago el gráfico que en este caso es un 'barplot'

ggplot(evol, aes(x=Año, y=n,  col='red')) + 
  geom_bar(stat = "identity") + theme(legend.position="none") +
  theme(axis.ticks = element_line(linetype = "blank"), 
    axis.text = element_text(size = 7), axis.text.y = element_text(size = 15), 
    panel.background = element_rect(fill = "grey100", 
        size = 0.6)) +labs(title = "Evolución partidos por año", 
    x = "Años", y = "Nº Partidos") + theme(axis.text.x = element_text(angle = 90))

Podemos ver que ha habido un notable crecimiento de los partidos de fútbol femenino a lo largo del tiempo.
En el año 1969 tan solo se disputaron 4 partidos y en los últimos años ha habido un máximo de 349 partidos oficiales en el mismo año (2018).
Se puede observar una clara tendencia a que hay tres años seguidos con un número alto de partidos seguido de uno que baja el número notablemente, hasta llegar al año 2014 que se han ido igualando. Esto se debe a que cada año se disputa un torneo diferente según el continente, menos el Mundial y los Juegos Olímpicos que ambos son a nivel mundial.
Los años que tenían un mayor número de partidos coinciden con los partidos para la clasificación a la Eurocopa, el Mundial y la clasificación para este, que como veremos más adelante son los torneos oficiales con más partidos disputados.
month <- date %>% group_by(Mes)%>% count()

gr_month <- ggplot (month, aes(x=Mes, y = n), aes(fct_rev(Mes))) + geom_bar(stat="identity", fill = "aquamarine") + coord_flip() + labs(x = "Mes", y = "Número de partidos")+labs(title = "Evolución partidos por mes")
ggplotly(gr_month)
Con respecto a este gráfico, podemos ver los meses en los que más partidos se disputan. En este caso el mes con más partidos y esto se debe a que muchos partidos de la clasificación a la Eurocopa, el Mundial y la Copa de América se juegan en este mes ya que estos torneos se juegan durante los meses de junio y julio. Además, el torneo amistoso de la Copa de Algarve es el segundo torneo que más partidos tiene disputados y este se juega todos los años en marzo desde el año 1994.

3.2. Torneos

Mundial de Francia 2019

Mundial de Francia 2019


tourn <- futfem %>% group_by(tournament)%>% count()
x <- c(86, 115, 268, 173, 226, 16, 545, 42, 126, 145, 6, 157, 20, 284, 172, 106, 78, 32, 6, 130, 30, 6, 153, 1241)
lbl <- c("AFC Asian Cup", "AFC Asian Cup qualification", "AFC Championship", "African Championship", "  
African Championship qualification", "African Cup of Nations", "Algarve Cup", "CONCACAF Championship", "    
CONCACAF Gold Cup", "CONCACAF Gold Cup qualification", "CONCACAF Invitational Tournament", "Copa América", "Euro", "FIFA World Cup", "FIFA World Cup qualification", "Four Nations Tournament", "OFC Championship", "OFC Nations Cup", "OFC Nations Cup qualification", "Olympic Games", "SheBelieves Cup", "Tournoi de France", "UEFA Euro", " 
UEFA Euro qualification")

pie3D(x, labels = lbl, explode = 0.1, main = "Torneos", labelcex = 0.5)

Como ya había mencionado en el apartado anterior y que ahora podemos ver en el gráfico los torneos donde se juegan una mayor cantidad de partidos son las fases de clasificación a la Eurocopa femenina, la Copa de Algarve y el Mundial. Entre estos tres, la Eurocopa y el Mundial son torneos oficiales mientras que la copa de Algarve es un torneo amistoso.
El último campeón de la copa del mundo fue EEUU en 2019, esta misma selección es la que más veces ha ganado este campeonato, un total de 4 veces.
Con respecto a la Eurocopa, el último ganador fue Países Bajos en 2017, sin embargo, la selección que más veces ha ganado este torneo es la selección femenina alemana, un total de 8 títulos.

3.3. Selecciones que más partidos han jugado en casa y más partidos fuera

Partidos jugados en casa


selec_home <- futfem %>% group_by(home_team)%>% count()
selec_home <- selec_home %>% arrange(desc(n))


reactable(selec_home, defaultPageSize =  10,  paginationType = "jump", showPageSizeOptions =  TRUE , pageSizeOptions =  c ( 10 , 50 , 100 ),defaultColDef = colDef(
    align = "center",
    minWidth = 70,
    headerStyle = list(background = "cyan"),
    filterable = TRUE),  highlight = TRUE, outlined = TRUE,
    columns = list(
  `Movies&TVShow/año` = colDef(style = function(value) {
    if (value > 0) {
      color <- "#e00000"}
      else {
      color <- "#008000"
    }
    list(color = color, fontWeight = "bold")
  })))

Partidos jugados fuera


selec_away <- futfem %>% group_by(away_team)%>% count()
selec_away <- selec_away %>% arrange(desc(n))


reactable(selec_away, defaultPageSize =  10,  paginationType = "jump", showPageSizeOptions =  TRUE , pageSizeOptions =  c ( 10 , 50 , 100 ),defaultColDef = colDef(
    align = "center",
    minWidth = 70,
    headerStyle = list(background = "cyan"),
    filterable = TRUE),  highlight = TRUE, outlined = TRUE,
    columns = list(
  `Movies&TVShow/año` = colDef(style = function(value) {
    if (value > 0) {
      color <- "#e00000"}
      else {
      color <- "#008000"
    }
    list(color = color, fontWeight = "bold")
  })))

3.4. Pais donde más partidos se han jugado

country <- futfem %>% group_by(country)%>% count() %>% rename(pais = country)

country <- country %>% arrange(desc(n)) %>% rename(partidos = n) 

country %>% DT::datatable(extensions = 'Buttons', 
               options = list(dom = 'Blfrtip', 
                              buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), 
                              pageLength = 5, autoWidth = TRUE ))
El país donde más veces se ha jugado un partido es Portugal, un total de 580 partidos ya que ahí se disputa el torneo de Algarve Cup que es uno de los torneos con más partidos jugados ya que se juega todos los años. A este, le siguen China y Estados Unidos que son dos de los países más importantes respecto al fútbol femenino porque suelen estar presentes en todos los torneos y sobre todo EEUU, la selección femenino siempre ha tenido un mayor apoyo por la población en comparación con otros países.

# Voy a crear un gráfico para poder visualizar mejor los paises. Cogiendo un código de un mapa de una página de internet  y he cambiado los paises y las coordenadas de estos.
mapa <- map_data("world") %>% mutate(color = case_when(region == "Portugal" ~ 1,
                                                        region == "China" ~ 2,
                                                        region == "USA" ~ 3,
                                                        region == "Sweden" ~ 4,
                                                        region == "Germany" ~ 5,
                                                        region == "France" ~ 6,
                                                        region == "Canada" ~ 7,
                                                        region == "Italy" ~ 8,
                                                        region == "Netherlands" ~ 9)) %>% mutate(color = if_else(is.na(color),0,color))
                                                        
                                                        

paises <- c("Portugal","China","USA","Sweden","Germany","France","Canada","Italy","Netherlands")

lat <- c(37.17944,19.99194,19.01201,56.29053,53.87075,42.80542,43.93960,36.75703,51.38647)
long <- c(-7.406153,110.8888,-155.58134,16.52852,14.213672,9.480371,59.78760,12.051270,4.226171)

latlong <- data.frame(paises,lat,long)
                     

mapa1 <- ggplot() + geom_map(data = mapa, map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#f7eca1") +
                    geom_map(data = mapa %>% filter(color==1), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "red") +
                    geom_map(data = mapa %>% filter(color==2), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "green") +
                    geom_map(data = mapa %>% filter(color==3), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "cyan") +
                    geom_map(data = mapa %>% filter(color==4), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#ab6800") +
                    geom_map(data = mapa %>% filter(color==5), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "yellow") +
                    geom_map(data = mapa %>% filter(color==6), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#004dff") +
                    geom_map(data = mapa %>% filter(color==7), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#ff9300") +
                    geom_map(data = mapa %>% filter(color==8), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#a4034b") +
                    geom_map(data = mapa %>% filter(color==9), map = mapa, aes(long, lat, map_id = region), color = "#000000", fill = "#238a00") +
                    geom_point(data = latlong, aes(x = long,y = lat), size = 2) +
                    ylim(-55,NA) +
                    theme(panel.background = element_rect(fill = "#a6fffb") , panel.grid = element_line(colour = "#000000"), axis.title = element_blank(),
                    axis.text = element_blank(), axis.ticks = element_blank())  
                    
mapa1      + theme(panel.background = element_rect(fill = "gray100")) +labs(title = "Países donde más partidos se han jugado")

3.5. Mundial vs Eurocopa

comp <- date %>% group_by(Año) %>% count(tournament) %>% filter(tournament %in% c("FIFA World Cup", "UEFA Euro qualification")) 

ggplot(comp, aes(fill=tournament, y=n, x=Año)) + 
    geom_bar(position="dodge", stat="identity") + theme(axis.line = element_line(colour = "gray", 
    linetype = "solid"), axis.text.x = element_text(angle = 90), 
    panel.background = element_rect(fill = "gray100")) +labs(title = "Mundial vs Eurocopa")

La Copa Mundial Femenina de la FIFA es el torneo internacional de fútbol femenino a nivel de selecciones nacionales más importante del mundo. Además, existen otras competencias juveniles como la Copa Mundial Femenina de Fútbol Sub-20 y la Copa Mundial Femenina de Fútbol Sub-17, ambas organizadas por la FIFA. La primera edición de este torneo fue en 1991 y a partir de ahí se decidió que se jugaría cada 4 años aunque ha habido años en los que se ha disputado aunque no tocaba. En un principio, este torneo contaba con 16 selecciones y ha ido evolucionando y haciéndose grande hasta que en 2015 subió a 24 y se espera que en el mundial de 2023 se dispute con 32 selecciones.
El Campeonato de Europa Femenino de la UEFA, comúnmente conocido como Eurocopa Femenina, es la competición internacional futbolística más importante entre selecciones nacionales femeninas de la UEFA. Este torneo comenzó a disputarse en 1969 sin embargo estos años no fue considerado oficial y la primera edición del torneo respaldado por la UEFA fue en 1982.

3.6. Tipo de campo


neutral <- date %>% group_by(neutral) %>% count() 

datos <- c(2324, 1839)

pie3D(datos, labels = datos, col = 2:3, labelcol = "red", border = "white", main = "Tipo de campo") 

legend(x = "topright", legend = c("False", "True"), fill = c("pink", "green"), 
       title = "Legend")

Con estos datos obtenemos que de 4163 partidos oficiales que se han disputado desde el año 1969, 2324 han sido disputados en campo propio de alguno de los dos paises.

4. Selección española

4.1. Número de partidos jugados en España


spain <- date %>% group_by(Año) %>% count(country) %>% filter(country == "Spain")

ggplot(spain, aes(x=Año, y=n)) + 
  geom_point(size=3) + 
  geom_segment(aes(x=Año, 
                   xend=Año, 
                   y=0, 
                   yend=n)) + 
  labs(title="Partidos jugados en España") + 
  theme(axis.text.x = element_text(angle=90, vjust=0.6))+labs(x = "Años", y = "nº partidos")

5. Conclusión

Como conclusión, se puede observar que el fútbol femenino ha experimentado un gran crecimiento desde sus inicios hasta ahora, sin embargo todavía falta mucho que mejorar. Este crecimiento no solo está relacionado con los datos analizados como son el número de partidos por año de goles o de selecciones sino que cada vez hay más personas interesadas en este deporte y esto hace que gane más popularidad.
Hay países como por ejemplo EEUU, Alemania o Francia donde los clubes ya destinan una cantidad considerable de dinero para esta sección del fútbol profesional haciendo también que sus selecciones mejoren y sean referentes para todo el mundo.
España es el noveno país en cuanto a la inversión de los clubes y las federaciones con 4 millones de euros. Es una posición bastante buena para España que en poco tiempo ha superado a muchos otros países en este aspecto.

6. Trabajos en los que me he basado

En la página de donde he cogido los datos, hay algunos análisis con estos mismos datos que aunque no están en lenguaje r me han servido como ejemplos para algunos de los gráficos y mapas que he utilizado en este.

Estos se pueden ver aqui

8. Sesión Informativa

    sessioninfo::session_info() %>% details::details(summary = 'current session info')

current session info


─ Session info ───────────────────────────────────────────────────────────────
 setting  value                       
 version  R version 4.0.2 (2020-06-22)
 os       macOS Catalina 10.15.7      
 system   x86_64, darwin17.0          
 ui       X11                         
 language (EN)                        
 collate  en_US.UTF-8                 
 ctype    en_US.UTF-8                 
 tz       Europe/Madrid               
 date     2021-01-16                  

─ Packages ───────────────────────────────────────────────────────────────────
 package       * version    date       lib source                        
 assertthat      0.2.1      2019-03-21 [1] CRAN (R 4.0.2)                
 backports       1.1.9      2020-08-24 [1] CRAN (R 4.0.2)                
 base64enc       0.1-3      2015-07-28 [1] CRAN (R 4.0.2)                
 blob            1.2.1      2020-01-20 [1] CRAN (R 4.0.2)                
 broom           0.7.0      2020-07-09 [1] CRAN (R 4.0.2)                
 cellranger      1.1.0      2016-07-27 [1] CRAN (R 4.0.2)                
 class           7.3-17     2020-04-26 [1] CRAN (R 4.0.2)                
 classInt        0.4-3      2020-04-07 [1] CRAN (R 4.0.2)                
 cli             2.0.2      2020-02-28 [1] CRAN (R 4.0.2)                
 colorspace      1.4-1      2019-03-18 [1] CRAN (R 4.0.2)                
 cpp11           0.2.1      2020-08-11 [1] CRAN (R 4.0.2)                
 crayon          1.3.4      2017-09-16 [1] CRAN (R 4.0.2)                
 crosstalk       1.1.0.1    2020-03-13 [1] CRAN (R 4.0.2)                
 data.table      1.13.0     2020-07-24 [1] CRAN (R 4.0.2)                
 DBI             1.1.0      2019-12-15 [1] CRAN (R 4.0.2)                
 dbplyr          1.4.4      2020-05-27 [1] CRAN (R 4.0.2)                
 digest          0.6.27     2020-10-24 [1] CRAN (R 4.0.2)                
 dplyr         * 1.0.2      2020-08-18 [1] CRAN (R 4.0.2)                
 DT              0.15       2020-08-05 [1] CRAN (R 4.0.2)                
 e1071           1.7-3      2019-11-26 [1] CRAN (R 4.0.2)                
 ellipsis        0.3.1      2020-05-15 [1] CRAN (R 4.0.2)                
 evaluate        0.14       2019-05-28 [1] CRAN (R 4.0.1)                
 extrafont       0.17       2014-12-08 [1] CRAN (R 4.0.2)                
 extrafontdb     1.0        2012-06-11 [1] CRAN (R 4.0.2)                
 fansi           0.4.1      2020-01-08 [1] CRAN (R 4.0.2)                
 farver          2.0.3      2020-01-16 [1] CRAN (R 4.0.2)                
 fastmap         1.0.1      2019-10-08 [1] CRAN (R 4.0.2)                
 forcats       * 0.5.0      2020-03-01 [1] CRAN (R 4.0.2)                
 formatR         1.7        2019-06-11 [1] CRAN (R 4.0.2)                
 fs              1.5.0      2020-07-31 [1] CRAN (R 4.0.2)                
 gdtools         0.2.2      2020-04-03 [1] CRAN (R 4.0.2)                
 generics        0.0.2      2018-11-29 [1] CRAN (R 4.0.2)                
 gganimate     * 1.0.7      2020-10-15 [1] CRAN (R 4.0.2)                
 ggplot2       * 3.3.2      2020-06-19 [1] CRAN (R 4.0.2)                
 ggThemeAssist * 0.1.5      2016-08-13 [1] CRAN (R 4.0.2)                
 glue            1.4.2      2020-08-27 [1] CRAN (R 4.0.2)                
 gtable          0.3.0      2019-03-25 [1] CRAN (R 4.0.2)                
 haven           2.3.1      2020-06-01 [1] CRAN (R 4.0.2)                
 here            0.1        2017-05-28 [1] CRAN (R 4.0.2)                
 highr           0.8        2019-03-20 [1] CRAN (R 4.0.2)                
 hms             0.5.3      2020-01-08 [1] CRAN (R 4.0.2)                
 hrbrthemes    * 0.8.0      2020-03-06 [1] CRAN (R 4.0.2)                
 htmltools       0.5.0      2020-06-16 [1] CRAN (R 4.0.2)                
 htmlwidgets     1.5.1      2019-10-08 [1] CRAN (R 4.0.2)                
 httpuv          1.5.4      2020-06-06 [1] CRAN (R 4.0.2)                
 httr            1.4.2      2020-07-20 [1] CRAN (R 4.0.2)                
 jsonlite        1.7.1      2020-09-07 [1] CRAN (R 4.0.2)                
 kableExtra    * 1.3.1      2020-10-22 [1] CRAN (R 4.0.2)                
 KernSmooth      2.23-17    2020-04-26 [1] CRAN (R 4.0.2)                
 klippy        * 0.0.0.9500 2020-11-15 [1] Github (rlesur/klippy@378c247)
 knitr         * 1.29       2020-06-23 [1] CRAN (R 4.0.2)                
 labeling        0.3        2014-08-23 [1] CRAN (R 4.0.2)                
 later           1.1.0.1    2020-06-05 [1] CRAN (R 4.0.2)                
 lazyeval        0.2.2      2019-03-15 [1] CRAN (R 4.0.2)                
 lifecycle       0.2.0      2020-03-06 [1] CRAN (R 4.0.2)                
 lubridate       1.7.9      2020-06-08 [1] CRAN (R 4.0.2)                
 magick          2.4.0      2020-06-23 [1] CRAN (R 4.0.2)                
 magrittr        1.5        2014-11-22 [1] CRAN (R 4.0.2)                
 maps            3.3.0      2018-04-03 [1] CRAN (R 4.0.2)                
 mime            0.9        2020-02-04 [1] CRAN (R 4.0.2)                
 miniUI          0.1.1.1    2018-05-18 [1] CRAN (R 4.0.2)                
 modelr          0.1.8      2020-05-19 [1] CRAN (R 4.0.2)                
 munsell         0.5.0      2018-06-12 [1] CRAN (R 4.0.2)                
 pillar          1.4.6      2020-07-10 [1] CRAN (R 4.0.2)                
 pkgconfig       2.0.3      2019-09-22 [1] CRAN (R 4.0.2)                
 plotly        * 4.9.2.1    2020-04-04 [1] CRAN (R 4.0.2)                
 plotrix       * 3.7-8      2020-04-16 [1] CRAN (R 4.0.2)                
 prettyunits     1.1.1      2020-01-24 [1] CRAN (R 4.0.2)                
 progress        1.2.2      2019-05-16 [1] CRAN (R 4.0.2)                
 promises        1.1.1      2020-06-09 [1] CRAN (R 4.0.2)                
 purrr         * 0.3.4      2020-04-17 [1] CRAN (R 4.0.2)                
 R6              2.4.1      2019-11-12 [1] CRAN (R 4.0.2)                
 RColorBrewer  * 1.1-2      2014-12-07 [1] CRAN (R 4.0.2)                
 Rcpp            1.0.5      2020-07-06 [1] CRAN (R 4.0.2)                
 reactable     * 0.2.3      2020-10-04 [1] CRAN (R 4.0.2)                
 reactR          0.4.3      2020-07-12 [1] CRAN (R 4.0.2)                
 readr         * 1.3.1      2018-12-21 [1] CRAN (R 4.0.2)                
 readxl        * 1.3.1      2019-03-13 [1] CRAN (R 4.0.2)                
 reprex          0.3.0      2019-05-16 [1] CRAN (R 4.0.2)                
 rlang           0.4.8      2020-10-08 [1] CRAN (R 4.0.2)                
 rmarkdown       2.3        2020-06-18 [1] CRAN (R 4.0.2)                
 rprojroot       1.3-2      2018-01-03 [1] CRAN (R 4.0.2)                
 rstudioapi      0.11       2020-02-07 [1] CRAN (R 4.0.2)                
 Rttf2pt1        1.3.8      2020-01-10 [1] CRAN (R 4.0.2)                
 rvest           0.3.6      2020-07-25 [1] CRAN (R 4.0.2)                
 scales          1.1.1      2020-05-11 [1] CRAN (R 4.0.2)                
 sessioninfo     1.1.1      2018-11-05 [1] CRAN (R 4.0.2)                
 sf            * 0.9-6      2020-09-13 [1] CRAN (R 4.0.2)                
 shiny           1.5.0      2020-06-23 [1] CRAN (R 4.0.2)                
 stringi         1.5.3      2020-09-09 [1] CRAN (R 4.0.2)                
 stringr       * 1.4.0      2019-02-10 [1] CRAN (R 4.0.2)                
 systemfonts     0.3.1      2020-09-08 [1] CRAN (R 4.0.2)                
 tibble        * 3.0.3      2020-07-10 [1] CRAN (R 4.0.2)                
 tidyr         * 1.1.2      2020-08-27 [1] CRAN (R 4.0.2)                
 tidyselect      1.1.0      2020-05-11 [1] CRAN (R 4.0.2)                
 tidyverse     * 1.3.0      2019-11-21 [1] CRAN (R 4.0.2)                
 tweenr          1.0.1      2018-12-14 [1] CRAN (R 4.0.2)                
 units           0.6-7      2020-06-13 [1] CRAN (R 4.0.2)                
 vctrs           0.3.4      2020-08-29 [1] CRAN (R 4.0.2)                
 viridisLite     0.3.0      2018-02-01 [1] CRAN (R 4.0.1)                
 webshot         0.5.2      2019-11-22 [1] CRAN (R 4.0.2)                
 withr           2.2.0      2020-04-20 [1] CRAN (R 4.0.2)                
 xfun            0.17       2020-09-09 [1] CRAN (R 4.0.2)                
 xml2            1.3.2      2020-04-23 [1] CRAN (R 4.0.2)                
 xtable          1.8-4      2019-04-21 [1] CRAN (R 4.0.2)                
 yaml            2.2.1      2020-02-01 [1] CRAN (R 4.0.2)                

[1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library


LS0tCnRpdGxlOiAiRsO6dGJvbCBmZW1lbmlubyIKc3VidGl0bGU6ICJNYXJ0YSBPbGl2ZXIgQmVsdHLDoW4ob2JlbG1hckBhbHVtbmkudXYuZXMpIiAKYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIgpkYXRlOiAiRW5lcm8gZGUgMjAyMSAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgI2NzczogIi4vYXNzZXRzL215X2Nzc19maWxlLmNzcyIKICAgIHRoZW1lOiBwYXBlcgogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAzIAogICAgdG9jX2Zsb2F0OiAKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBkZl9wcmludDoga2FibGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoa2xpcHB5KSAKbGlicmFyeShrbml0cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dUaGVtZUFzc2lzdCkKbGlicmFyeShyZWFjdGFibGUpCmxpYnJhcnkoc2YpCmxpYnJhcnkocGxvdHJpeCkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoaHJicnRoZW1lcykKYGBgCgpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwKICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwKICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICAKICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywKICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQpgYGAKCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSAKYGBgCgoKYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9CmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikKYGBgCgo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4KClRyYWJham8gZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIwLTIwMjEuIEVsIHJlcG8gZGVsIHRyYWJham8gZXN0w6EgW2FxdcOtXShodHRwczovL2dpdGh1Yi5jb20vbWFydGFvbGl2ZXIvdHJhYmFqb19CaWdEYXRhKXt0YXJnZXQ9Il9ibGFuayJ9LiBMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHkgbG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIvMDctdHJhYmFqb3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4KCjxociBjbGFzcz0ibGluZWEtcmVkIj4KCiMgKioxLiBJbnRyb2R1Y2Npw7NuKioKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RWwgZsO6dGJvbCBmZW1lbmlubyBlcyBlbCBkZXBvcnRlIGRlIGVxdWlwbyBtw6FzIHByYWN0aWNhZG8gcG9yIG11amVyZXMgZW4gdG9kbyBlbCBtdW5kby4gRXN0ZSBkZXBvcnRlIGVtcGV6w7MgYSBzZXIgcHJhY3RpY2FkbyBlbiB1bmEgc2VjY2nDs24gZmVtZW5pbmEgaGFjZSBtdWNobyB0aWVtcG8sIGEgZmluYWxlcyBkZWwgc2lnbG8gWElYLCBlbiBMb25kcmVzIHBlcm8gZnVlIGEgY2F1c2EgZGUgbGFzIGRpc3RpbnRhcyBndWVycmFzIHkgbG9zIHByb2JsZW1hcyBlY29uw7NtaWNvcyB5IHNvY2lhbGVzIGRlIGxvcyBhw7FvcyBzaWd1aWVudGVzIHF1ZSBlc3RlIGRlcG9ydGUgZGVqw7MgZGUgc2VyIHByYWN0aWNhZG8uPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5BY3R1YWxtZW50ZSwgaGFjZSBhw7FvcyBxdWUgZWwgZsO6dGJvbCBmZW1lbmlubyBkZWrDsyBkZSBzZXIgdW4gbXVuZG8gZGUgaG9tYnJlcyB5IGxhcyBtdWplcmVzIGRpZXJvbiBlbCBwYXNvIHBhcmEgcHJhY3RpY2FyIGVzdGUgZGVwb3J0ZSwgYSBwZXNhciBkZSBxdWUgdGllbmVuIHF1ZSBzZWd1aXIgYWd1YW50YW5kbyBjb21lbnRhcmlvcyBkZXNwZWN0aXZvcyB5IGZyYXNlcyBjb21vICJlbCBmw7p0Ym9sIGVzIHVuIGRlcG9ydGUgZGUgaG9tYnJlcyIuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5TZWfDum4gbG9zIGRhdG9zIG9maWNpYWxlcyBkZSBsYSBGSUZBLCBtw6FzIG8gbWVub3MgMjYgbWlsbG9uZXMgZGUgbXVqZXJlcyBqdWVnYW4gYWwgZsO6dGJvbCBlbiAxODAgcGHDrXNlcyBkZWwgbXVuZG8uIEV1cm9wYSBlcyBlbCBjb250aW5lbnRlIHF1ZSBoYSBleHBlcmltZW50YWRvIHVuIG1heW9yIGNyZWNpbWllbnRvIGVuIGxvcyDDumx0aW1vcyBhw7FvcyBkb25kZSBlbCBuw7ptZXJvIGRlIG11amVyZXMgcXVlIHByYWN0aWNhbiBlc3RlIGRlcG9ydGUgc2UgaGEgbXVsdGlwbGljYWRvIHBvciBjaW5jby48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkVuIG51ZXN0cm8gcGHDrXMsIEVzcGHDsWEsIHRhbWJpw6luIGhhIGhhYmlkbyB1biBncmFuIHByb2dyZXNvIHkgbGEgc2VsZWNjacOzbiBuYWNpb25hbCBmZW1lbmluYSBoYSBlc3RhZG8gcHJlc2VudGUgZW4gbG9zIMO6bHRpbW9zIGHDsW9zIGVuIE11bmRpYWxlcyB5IEV1cm9jb3Bhcy48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPlBvY28gYSBwb2NvIHNlIGVzdMOhIG5vcm1hbGl6YW5kbyBlc3RhIG1vZGFsaWRhZCBkZWwgZsO6dGJvbCBwZXJvIHRvZGF2w61hIGZhbHRhbiBtdWNob3MgYXNwZWN0b3MgcGFyYSBtZWpvcmFyIGNvbW8gZWwgc3VlbGRvIGRlIGxhcyBwcm9mZXNpb25hbGVzLCBuaSBjb21wYXJhYmxlIGNvbiBsYXMgY2lmcmFzIHF1ZSBzZSBtdWV2ZW4gZW4gZWwgZsO6dGJvbCBtYXNjdWxpbm8uPC9kaXYvPgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUUsIG91dC53aWR0aCA9ICI1MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLmNhcD0iU2VsZWNjacOzbiBlc3Bhw7FvbGEifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJmdXRmZW1fZXNwYcOxYS5qcGciKSApIApgYGAKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RGViaWRvIGEgbGEgbmVjZXNpZGFkIGRlIGRhciBtYXlvciB2aXNpYmlsaWRhZCBhbCBmw7p0Ym9sIGZlbWVuaW5vIHkgeWEgcXVlIHlvIHRhbWJpw6luIHByYWN0aWNvIGVzdGUgZGVwb3J0ZSBoZSBkZWNpZGlkbyB0cmF0YXIgZXN0ZSB0ZW1hIGVuIGVsIHRyYWJham8gZGUgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIi48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkxhIGZpbmFsaWRhZCB5IG9iamV0aXZvIGRlIGVzdGUgYW7DoWxpc2lzIGVzIG9ic2VydmFyIGVsIGRlc2Fycm9sbG8gYSBsbyBsYXJnbyBkZWwgdGllbXBvIGRlbCBmw7p0Ym9sIGZlbWVuaW5vIGVuIGxvcyBkaWZlcmVudGVzIHBhw61zZXMgZGVsIG11bmRvLjwvZGl2Lz4KCiMgKioyLiBEYXRvcyoqCgpMb3MgZGF0b3MgcXVlIGhlIHV0aWxpemFkbyBwYXJhIGhhY2VyIGVsIGFuw6FsaXNpcyBzZSBlbmN1YW50cmFuIGVuIGVsIHNpZ3VpZW50ZSBsaW5rOgpbRGF0b3NdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vbWFydGo0Mi93b21lbnMtaW50ZXJuYXRpb25hbC1mb290YmFsbC1yZXN1bHRzKQoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5FbiBlc3RvcyBkYXRvcyBhcGFyZWNlbiBsb3MgcGFydGlkb3MgZGUgbGFzIHNlbGVjY2lvbmVzIGRlIGbDunRib2wgZmVtZW5pbm8gZGVzZGUgZWwgYcOxbyAxOTY5IGhhc3RhIG1hcnpvIGRlbCBhw7FvIDIwMjAsIGRvbmRlIHBhcmFyb24gbG9zIHBhcnRpZG9zIGRlYmlkbyBhIGxhIHBhbmRlbWlhIHBvciBlbCBDb3JvbmF2aXJ1cy48L2Rpdi8+CgojIyAqKjIuMS4gUHJvY2VzYW5kbyBsb3MgZGF0b3MqKgoKYGBge3IsIGluY2x1ZGUgPSBUUlVFLCBlY2hvPVRSVUV9CgpmdXRmZW0gPC0gcmVhZF9leGNlbCgiLi9EYXRvcy9yZXN1bHRzX2Z1dGZlbS54bHN4IikKCiMgQ29uIGxhIHNpZ3VpZW50ZSBmdW5jacOzbiBoZSBzZXBhcmFkbyBsYSBjb2x1bW5hICJkYXRlIiBwYXJhIHBvZGVyIHRlbmVyIGxvcyBhw7FvcyBlbiB1bmEgc29sYSBjb2x1bW5hIHkgbW9zdHJhciBsYSBldm9sdWNpw7NuIGEgbG8gbGFyZ28gZGUgbG9zIGHDsW9zLgoKZGF0ZSA8LSBmdXRmZW0gJT4lICBzZXBhcmF0ZShjb2wgPSBkYXRlLCAKICAgICAgICAgICAgICBpbnRvID0gYygiQcOxbyIsICJNZXMiLCAiRGlhIiksCiAgICAgICAgICAgICAgc2VwICA9ICItIikKCmBgYAoKIyAqKjMuIEFuw6FsaXNpcyBkZSBzZWxlY2Npb25lcyoqCiMjICoqMy4xLiBFdm9sdWNpw7NuIGRlbCBmw7p0Ym9sIGZlbWVuaW5vIGEgbG8gbGFyZ28gZGVsIHRpZW1wbyoqCgpgYGB7ciBldmFsPVRSVUUsIGVjaG89VFJVRX0KIyBBIHBhcnRpciBkZSBsYSB0YWJsYSBxdWUgeWEgaGFiaWEgYXJyZWdsYWRvIGFudGVyaW9ybWVudGUsIGFncnVwbyBsb3MgYcOxb3MgcGFyYSBzYWJlciBjdWFudG9zIHBhcnRpZG9zIHNlIGp1Z2Fyb24gY2FkYSBhw7FvLgoKZXZvbCA8LSBkYXRlICU+JSBncm91cF9ieShBw7FvKSU+JSBjb3VudCgpCgojIEhhZ28gZWwgZ3LDoWZpY28gcXVlIGVuIGVzdGUgY2FzbyBlcyB1biAnYmFycGxvdCcKCmdncGxvdChldm9sLCBhZXMoeD1Bw7FvLCB5PW4sICBjb2w9J3JlZCcpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICB0aGVtZShheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImJsYW5rIiksIAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTEwMCIsIAogICAgICAgIHNpemUgPSAwLjYpKSArbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIHBhcnRpZG9zIHBvciBhw7FvIiwgCiAgICB4ID0gIkHDsW9zIiwgeSA9ICJOwrogUGFydGlkb3MiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKCmBgYAoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Qb2RlbW9zIHZlciBxdWUgaGEgaGFiaWRvIHVuIG5vdGFibGUgY3JlY2ltaWVudG8gZGUgbG9zIHBhcnRpZG9zIGRlIGbDunRib2wgZmVtZW5pbm8gYSBsbyBsYXJnbyBkZWwgdGllbXBvLjwvZGl2Lz4KCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RW4gZWwgYcOxbyAxOTY5IHRhbiBzb2xvIHNlIGRpc3B1dGFyb24gNCBwYXJ0aWRvcyB5IGVuIGxvcyDDumx0aW1vcyBhw7FvcyBoYSBoYWJpZG8gdW4gbcOheGltbyBkZSAzNDkgcGFydGlkb3Mgb2ZpY2lhbGVzIGVuIGVsIG1pc21vIGHDsW8gKDIwMTgpLjwvZGl2Lz4KCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+U2UgcHVlZGUgb2JzZXJ2YXIgdW5hIGNsYXJhIHRlbmRlbmNpYSBhIHF1ZSBoYXkgdHJlcyBhw7FvcyBzZWd1aWRvcyBjb24gdW4gbsO6bWVybyBhbHRvIGRlIHBhcnRpZG9zIHNlZ3VpZG8gZGUgdW5vIHF1ZSBiYWphIGVsIG7Dum1lcm8gbm90YWJsZW1lbnRlLCBoYXN0YSBsbGVnYXIgYWwgYcOxbyAyMDE0IHF1ZSBzZSBoYW4gaWRvIGlndWFsYW5kby4gRXN0byBzZSBkZWJlIGEgcXVlIGNhZGEgYcOxbyBzZSBkaXNwdXRhIHVuIHRvcm5lbyBkaWZlcmVudGUgc2Vnw7puIGVsIGNvbnRpbmVudGUsIG1lbm9zIGVsIE11bmRpYWwgeSBsb3MgSnVlZ29zIE9sw61tcGljb3MgcXVlIGFtYm9zIHNvbiBhIG5pdmVsIG11bmRpYWwuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Mb3MgYcOxb3MgcXVlIHRlbsOtYW4gdW4gbWF5b3IgbsO6bWVybyBkZSBwYXJ0aWRvcyBjb2luY2lkZW4gY29uIGxvcyBwYXJ0aWRvcyBwYXJhIGxhIGNsYXNpZmljYWNpw7NuIGEgbGEgRXVyb2NvcGEsICBlbCBNdW5kaWFsIHkgbGEgY2xhc2lmaWNhY2nDs24gcGFyYSBlc3RlLCBxdWUgY29tbyB2ZXJlbW9zIG3DoXMgYWRlbGFudGUgc29uIGxvcyB0b3JuZW9zIG9maWNpYWxlcyBjb24gbcOhcyBwYXJ0aWRvcyBkaXNwdXRhZG9zLjwvZGl2Lz4KCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1UUlVFLCBvdXQud2lkdGggPSAiNTAlIiwgZmlnLmFsaWduID0gImNlbnRlciJ9Cm1vbnRoIDwtIGRhdGUgJT4lIGdyb3VwX2J5KE1lcyklPiUgY291bnQoKQoKZ3JfbW9udGggPC0gZ2dwbG90IChtb250aCwgYWVzKHg9TWVzLCB5ID0gbiksIGFlcyhmY3RfcmV2KE1lcykpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbCA9ICJhcXVhbWFyaW5lIikgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHggPSAiTWVzIiwgeSA9ICJOw7ptZXJvIGRlIHBhcnRpZG9zIikrbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIHBhcnRpZG9zIHBvciBtZXMiKQpnZ3Bsb3RseShncl9tb250aCkKYGBgCgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkNvbiByZXNwZWN0byBhIGVzdGUgZ3LDoWZpY28sIHBvZGVtb3MgdmVyIGxvcyBtZXNlcyBlbiBsb3MgcXVlIG3DoXMgcGFydGlkb3Mgc2UgZGlzcHV0YW4uIEVuIGVzdGUgY2FzbyBlbCBtZXMgY29uIG3DoXMgcGFydGlkb3MgeSBlc3RvIHNlIGRlYmUgYSBxdWUgbXVjaG9zIHBhcnRpZG9zIGRlIGxhIGNsYXNpZmljYWNpw7NuIGEgbGEgRXVyb2NvcGEsIGVsIE11bmRpYWwgeSBsYSBDb3BhIGRlIEFtw6lyaWNhIHNlIGp1ZWdhbiBlbiBlc3RlIG1lcyB5YSBxdWUgZXN0b3MgdG9ybmVvcyBzZSBqdWVnYW4gZHVyYW50ZSBsb3MgbWVzZXMgZGUganVuaW8geSBqdWxpby4gQWRlbcOhcywgZWwgdG9ybmVvIGFtaXN0b3NvIGRlIGxhIENvcGEgZGUgQWxnYXJ2ZSBlcyBlbCBzZWd1bmRvIHRvcm5lbyBxdWUgbcOhcyBwYXJ0aWRvcyB0aWVuZSBkaXNwdXRhZG9zIHkgZXN0ZSBzZSBqdWVnYSB0b2RvcyBsb3MgYcOxb3MgZW4gbWFyem8gZGVzZGUgZWwgYcOxbyAxOTk0LjwvZGl2Lz4KCiMjICoqMy4yLiBUb3JuZW9zKioKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFLCBvdXQud2lkdGggPSAiNTAlIiwgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy5jYXA9Ik11bmRpYWwgZGUgRnJhbmNpYSAyMDE5In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAibXVuZGlhbF9mZW0yMDE5LnBuZyIpICkgCmBgYAoKYGBge3IgZXZhbD1UUlVFLCBlY2hvPVRSVUV9Cgp0b3VybiA8LSBmdXRmZW0gJT4lIGdyb3VwX2J5KHRvdXJuYW1lbnQpJT4lIGNvdW50KCkKeCA8LSBjKDg2LCAxMTUsIDI2OCwgMTczLCAyMjYsIDE2LCA1NDUsIDQyLCAxMjYsIDE0NSwgNiwgMTU3LCAyMCwgMjg0LCAxNzIsIDEwNiwgNzgsIDMyLCA2LCAxMzAsIDMwLCA2LCAxNTMsIDEyNDEpCmxibCA8LSBjKCJBRkMgQXNpYW4gQ3VwIiwgIkFGQyBBc2lhbiBDdXAgcXVhbGlmaWNhdGlvbiIsICJBRkMgQ2hhbXBpb25zaGlwIiwgIkFmcmljYW4gQ2hhbXBpb25zaGlwIiwgIgkKQWZyaWNhbiBDaGFtcGlvbnNoaXAgcXVhbGlmaWNhdGlvbiIsICJBZnJpY2FuIEN1cCBvZiBOYXRpb25zIiwgIkFsZ2FydmUgQ3VwIiwgIkNPTkNBQ0FGIENoYW1waW9uc2hpcCIsICIJCkNPTkNBQ0FGIEdvbGQgQ3VwIiwgIkNPTkNBQ0FGIEdvbGQgQ3VwIHF1YWxpZmljYXRpb24iLCAiQ09OQ0FDQUYgSW52aXRhdGlvbmFsIFRvdXJuYW1lbnQiLCAiQ29wYSBBbcOpcmljYSIsICJFdXJvIiwgIkZJRkEgV29ybGQgQ3VwIiwgIkZJRkEgV29ybGQgQ3VwIHF1YWxpZmljYXRpb24iLCAiRm91ciBOYXRpb25zIFRvdXJuYW1lbnQiLCAiT0ZDIENoYW1waW9uc2hpcCIsICJPRkMgTmF0aW9ucyBDdXAiLCAiT0ZDIE5hdGlvbnMgQ3VwIHF1YWxpZmljYXRpb24iLCAiT2x5bXBpYyBHYW1lcyIsICJTaGVCZWxpZXZlcyBDdXAiLCAiVG91cm5vaSBkZSBGcmFuY2UiLCAiVUVGQSBFdXJvIiwgIgkKVUVGQSBFdXJvIHF1YWxpZmljYXRpb24iKQoKcGllM0QoeCwgbGFiZWxzID0gbGJsLCBleHBsb2RlID0gMC4xLCBtYWluID0gIlRvcm5lb3MiLCBsYWJlbGNleCA9IDAuNSkKCgpgYGAKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+Q29tbyB5YSBoYWLDrWEgbWVuY2lvbmFkbyBlbiBlbCBhcGFydGFkbyBhbnRlcmlvciB5IHF1ZSBhaG9yYSBwb2RlbW9zIHZlciBlbiBlbCBncsOhZmljbyBsb3MgdG9ybmVvcyBkb25kZSBzZSBqdWVnYW4gdW5hIG1heW9yIGNhbnRpZGFkIGRlIHBhcnRpZG9zIHNvbiBsYXMgZmFzZXMgZGUgY2xhc2lmaWNhY2nDs24gYSBsYSBFdXJvY29wYSBmZW1lbmluYSwgbGEgQ29wYSBkZSBBbGdhcnZlIHkgZWwgTXVuZGlhbC4gRW50cmUgZXN0b3MgdHJlcywgbGEgRXVyb2NvcGEgeSBlbCBNdW5kaWFsIHNvbiB0b3JuZW9zIG9maWNpYWxlcyBtaWVudHJhcyBxdWUgbGEgY29wYSBkZSBBbGdhcnZlIGVzIHVuIHRvcm5lbyBhbWlzdG9zby48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkVsIMO6bHRpbW8gY2FtcGXDs24gZGUgbGEgY29wYSBkZWwgbXVuZG8gZnVlIEVFVVUgZW4gMjAxOSwgZXN0YSBtaXNtYSBzZWxlY2Npw7NuIGVzIGxhIHF1ZSBtw6FzIHZlY2VzIGhhIGdhbmFkbyBlc3RlIGNhbXBlb25hdG8sIHVuIHRvdGFsIGRlIDQgdmVjZXMuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Db24gcmVzcGVjdG8gYSBsYSBFdXJvY29wYSwgZWwgw7psdGltbyBnYW5hZG9yIGZ1ZSBQYcOtc2VzIEJham9zIGVuIDIwMTcsIHNpbiBlbWJhcmdvLCBsYSBzZWxlY2Npw7NuIHF1ZSBtw6FzIHZlY2VzIGhhIGdhbmFkbyBlc3RlIHRvcm5lbyBlcyBsYSBzZWxlY2Npw7NuIGZlbWVuaW5hIGFsZW1hbmEsIHVuIHRvdGFsIGRlIDggdMOtdHVsb3MuPC9kaXYvPgoKCiMjICoqMy4zLiBTZWxlY2Npb25lcyBxdWUgbcOhcyBwYXJ0aWRvcyBoYW4ganVnYWRvIGVuIGNhc2EgeSBtw6FzIHBhcnRpZG9zIGZ1ZXJhKip7LnRhYnNldH0KCiMjIyBQYXJ0aWRvcyBqdWdhZG9zIGVuIGNhc2EKCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1UUlVFfQoKc2VsZWNfaG9tZSA8LSBmdXRmZW0gJT4lIGdyb3VwX2J5KGhvbWVfdGVhbSklPiUgY291bnQoKQpzZWxlY19ob21lIDwtIHNlbGVjX2hvbWUgJT4lIGFycmFuZ2UoZGVzYyhuKSkKCgpyZWFjdGFibGUoc2VsZWNfaG9tZSwgZGVmYXVsdFBhZ2VTaXplID0gIDEwLCAgcGFnaW5hdGlvblR5cGUgPSAianVtcCIsIHNob3dQYWdlU2l6ZU9wdGlvbnMgPSAgVFJVRSAsIHBhZ2VTaXplT3B0aW9ucyA9ICBjICggMTAgLCA1MCAsIDEwMCApLGRlZmF1bHRDb2xEZWYgPSBjb2xEZWYoCiAgICBhbGlnbiA9ICJjZW50ZXIiLAogICAgbWluV2lkdGggPSA3MCwKICAgIGhlYWRlclN0eWxlID0gbGlzdChiYWNrZ3JvdW5kID0gImN5YW4iKSwKICAgIGZpbHRlcmFibGUgPSBUUlVFKSwgIGhpZ2hsaWdodCA9IFRSVUUsIG91dGxpbmVkID0gVFJVRSwKICAgIGNvbHVtbnMgPSBsaXN0KAogIGBNb3ZpZXMmVFZTaG93L2HDsW9gID0gY29sRGVmKHN0eWxlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmICh2YWx1ZSA+IDApIHsKICAgICAgY29sb3IgPC0gIiNlMDAwMDAifQogICAgICBlbHNlIHsKICAgICAgY29sb3IgPC0gIiMwMDgwMDAiCiAgICB9CiAgICBsaXN0KGNvbG9yID0gY29sb3IsIGZvbnRXZWlnaHQgPSAiYm9sZCIpCiAgfSkpKQoKYGBgCgojIyMgUGFydGlkb3MganVnYWRvcyBmdWVyYQoKYGBge3IgZXZhbD1UUlVFLCBlY2hvPVRSVUV9CgpzZWxlY19hd2F5IDwtIGZ1dGZlbSAlPiUgZ3JvdXBfYnkoYXdheV90ZWFtKSU+JSBjb3VudCgpCnNlbGVjX2F3YXkgPC0gc2VsZWNfYXdheSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKCnJlYWN0YWJsZShzZWxlY19hd2F5LCBkZWZhdWx0UGFnZVNpemUgPSAgMTAsICBwYWdpbmF0aW9uVHlwZSA9ICJqdW1wIiwgc2hvd1BhZ2VTaXplT3B0aW9ucyA9ICBUUlVFICwgcGFnZVNpemVPcHRpb25zID0gIGMgKCAxMCAsIDUwICwgMTAwICksZGVmYXVsdENvbERlZiA9IGNvbERlZigKICAgIGFsaWduID0gImNlbnRlciIsCiAgICBtaW5XaWR0aCA9IDcwLAogICAgaGVhZGVyU3R5bGUgPSBsaXN0KGJhY2tncm91bmQgPSAiY3lhbiIpLAogICAgZmlsdGVyYWJsZSA9IFRSVUUpLCAgaGlnaGxpZ2h0ID0gVFJVRSwgb3V0bGluZWQgPSBUUlVFLAogICAgY29sdW1ucyA9IGxpc3QoCiAgYE1vdmllcyZUVlNob3cvYcOxb2AgPSBjb2xEZWYoc3R5bGUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKHZhbHVlID4gMCkgewogICAgICBjb2xvciA8LSAiI2UwMDAwMCJ9CiAgICAgIGVsc2UgewogICAgICBjb2xvciA8LSAiIzAwODAwMCIKICAgIH0KICAgIGxpc3QoY29sb3IgPSBjb2xvciwgZm9udFdlaWdodCA9ICJib2xkIikKICB9KSkpCgpgYGAKCiMjICoqMy40LiBQYWlzIGRvbmRlIG3DoXMgcGFydGlkb3Mgc2UgaGFuIGp1Z2FkbyoqCgpgYGB7ciBldmFsPVRSVUUsIGVjaG89VFJVRX0KY291bnRyeSA8LSBmdXRmZW0gJT4lIGdyb3VwX2J5KGNvdW50cnkpJT4lIGNvdW50KCkgJT4lIHJlbmFtZShwYWlzID0gY291bnRyeSkKCmNvdW50cnkgPC0gY291bnRyeSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgcmVuYW1lKHBhcnRpZG9zID0gbikgCgpjb3VudHJ5ICU+JSBEVDo6ZGF0YXRhYmxlKGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIAogICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmxmcnRpcCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnLCAncGRmJywgJ3ByaW50JyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gNSwgYXV0b1dpZHRoID0gVFJVRSApKQogIApgYGAKCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+RWwgcGHDrXMgZG9uZGUgbcOhcyB2ZWNlcyBzZSBoYSBqdWdhZG8gdW4gcGFydGlkbyBlcyBQb3J0dWdhbCwgdW4gdG90YWwgZGUgNTgwIHBhcnRpZG9zIHlhIHF1ZSBhaMOtIHNlIGRpc3B1dGEgZWwgdG9ybmVvIGRlIEFsZ2FydmUgQ3VwIHF1ZSBlcyB1bm8gZGUgbG9zIHRvcm5lb3MgY29uIG3DoXMgcGFydGlkb3MganVnYWRvcyB5YSBxdWUgc2UganVlZ2EgdG9kb3MgbG9zIGHDsW9zLiBBIGVzdGUsIGxlIHNpZ3VlbiBDaGluYSB5IEVzdGFkb3MgVW5pZG9zIHF1ZSBzb24gZG9zIGRlIGxvcyBwYcOtc2VzIG3DoXMgaW1wb3J0YW50ZXMgcmVzcGVjdG8gYWwgZsO6dGJvbCBmZW1lbmlubyBwb3JxdWUgc3VlbGVuIGVzdGFyIHByZXNlbnRlcyBlbiB0b2RvcyBsb3MgdG9ybmVvcyB5IHNvYnJlIHRvZG8gRUVVVSwgbGEgc2VsZWNjacOzbiBmZW1lbmlubyBzaWVtcHJlIGhhIHRlbmlkbyB1biBtYXlvciBhcG95byBwb3IgbGEgcG9ibGFjacOzbiBlbiBjb21wYXJhY2nDs24gY29uIG90cm9zIHBhw61zZXMuPC9kaXYvPgoKYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRX0KCiMgVm95IGEgY3JlYXIgdW4gZ3LDoWZpY28gcGFyYSBwb2RlciB2aXN1YWxpemFyIG1lam9yIGxvcyBwYWlzZXMuIENvZ2llbmRvIHVuIGPDs2RpZ28gZGUgdW4gbWFwYSBkZSB1bmEgcMOhZ2luYSBkZSBpbnRlcm5ldCAgeSBoZSBjYW1iaWFkbyBsb3MgcGFpc2VzIHkgbGFzIGNvb3JkZW5hZGFzIGRlIGVzdG9zLgptYXBhIDwtIG1hcF9kYXRhKCJ3b3JsZCIpICU+JSBtdXRhdGUoY29sb3IgPSBjYXNlX3doZW4ocmVnaW9uID09ICJQb3J0dWdhbCIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiQ2hpbmEiIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIlVTQSIgfiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiU3dlZGVuIiB+IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJHZXJtYW55IiB+IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJGcmFuY2UiIH4gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIkNhbmFkYSIgfiA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiSXRhbHkiIH4gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIk5ldGhlcmxhbmRzIiB+IDkpKSAlPiUgbXV0YXRlKGNvbG9yID0gaWZfZWxzZShpcy5uYShjb2xvciksMCxjb2xvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgpwYWlzZXMgPC0gYygiUG9ydHVnYWwiLCJDaGluYSIsIlVTQSIsIlN3ZWRlbiIsIkdlcm1hbnkiLCJGcmFuY2UiLCJDYW5hZGEiLCJJdGFseSIsIk5ldGhlcmxhbmRzIikKCmxhdCA8LSBjKDM3LjE3OTQ0LDE5Ljk5MTk0LDE5LjAxMjAxLDU2LjI5MDUzLDUzLjg3MDc1LDQyLjgwNTQyLDQzLjkzOTYwLDM2Ljc1NzAzLDUxLjM4NjQ3KQpsb25nIDwtIGMoLTcuNDA2MTUzLDExMC44ODg4LC0xNTUuNTgxMzQsMTYuNTI4NTIsMTQuMjEzNjcyLDkuNDgwMzcxLDU5Ljc4NzYwLDEyLjA1MTI3MCw0LjIyNjE3MSkKCmxhdGxvbmcgPC0gZGF0YS5mcmFtZShwYWlzZXMsbGF0LGxvbmcpCiAgICAgICAgICAgICAgICAgICAgIAoKbWFwYTEgPC0gZ2dwbG90KCkgKyBnZW9tX21hcChkYXRhID0gbWFwYSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAiI2Y3ZWNhMSIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT0xKSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAicmVkIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTIpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICJncmVlbiIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT0zKSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAiY3lhbiIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT00KSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAiI2FiNjgwMCIpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gbWFwYSAlPiUgZmlsdGVyKGNvbG9yPT01KSwgbWFwID0gbWFwYSwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAieWVsbG93IikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTYpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjMDA0ZGZmIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTcpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjZmY5MzAwIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTgpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjYTQwMzRiIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSBtYXBhICU+JSBmaWx0ZXIoY29sb3I9PTkpLCBtYXAgPSBtYXBhLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICIjMjM4YTAwIikgKwogICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGxhdGxvbmcsIGFlcyh4ID0gbG9uZyx5ID0gbGF0KSwgc2l6ZSA9IDIpICsKICAgICAgICAgICAgICAgICAgICB5bGltKC01NSxOQSkgKwogICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjYTZmZmZiIikgLCBwYW5lbC5ncmlkID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjMDAwMDAwIiksIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKSAgCiAgICAgICAgICAgICAgICAgICAgCm1hcGExICAgICAgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTEwMCIpKSArbGFicyh0aXRsZSA9ICJQYcOtc2VzIGRvbmRlIG3DoXMgcGFydGlkb3Mgc2UgaGFuIGp1Z2FkbyIpCgpgYGAKCiMjICoqMy41LiBNdW5kaWFsIHZzIEV1cm9jb3BhKioKCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUV9CmNvbXAgPC0gZGF0ZSAlPiUgZ3JvdXBfYnkoQcOxbykgJT4lIGNvdW50KHRvdXJuYW1lbnQpICU+JSBmaWx0ZXIodG91cm5hbWVudCAlaW4lIGMoIkZJRkEgV29ybGQgQ3VwIiwgIlVFRkEgRXVybyBxdWFsaWZpY2F0aW9uIikpIAoKZ2dwbG90KGNvbXAsIGFlcyhmaWxsPXRvdXJuYW1lbnQsIHk9biwgeD1Bw7FvKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyYXkiLCAKICAgIGxpbmV0eXBlID0gInNvbGlkIiksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLCAKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MTAwIikpICtsYWJzKHRpdGxlID0gIk11bmRpYWwgdnMgRXVyb2NvcGEiKQoKCmBgYAoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5MYSBDb3BhIE11bmRpYWwgRmVtZW5pbmEgZGUgbGEgRklGQSBlcyBlbCB0b3JuZW8gaW50ZXJuYWNpb25hbCBkZSBmw7p0Ym9sIGZlbWVuaW5vIGEgbml2ZWwgZGUgc2VsZWNjaW9uZXMgbmFjaW9uYWxlcyBtw6FzIGltcG9ydGFudGUgZGVsIG11bmRvLiBBZGVtw6FzLCBleGlzdGVuIG90cmFzIGNvbXBldGVuY2lhcyBqdXZlbmlsZXMgY29tbyBsYSBDb3BhIE11bmRpYWwgRmVtZW5pbmEgZGUgRsO6dGJvbCBTdWItMjAgeSBsYSBDb3BhIE11bmRpYWwgRmVtZW5pbmEgZGUgRsO6dGJvbCBTdWItMTcsIGFtYmFzIG9yZ2FuaXphZGFzIHBvciBsYSBGSUZBLiBMYSBwcmltZXJhIGVkaWNpw7NuIGRlIGVzdGUgdG9ybmVvIGZ1ZSBlbiAxOTkxIHkgYSBwYXJ0aXIgZGUgYWjDrSBzZSBkZWNpZGnDsyBxdWUgc2UganVnYXLDrWEgY2FkYSA0IGHDsW9zIGF1bnF1ZSBoYSBoYWJpZG8gYcOxb3MgZW4gbG9zIHF1ZSBzZSBoYSBkaXNwdXRhZG8gYXVucXVlIG5vIHRvY2FiYS4gRW4gdW4gcHJpbmNpcGlvLCBlc3RlIHRvcm5lbyBjb250YWJhIGNvbiAxNiBzZWxlY2Npb25lcyB5IGhhIGlkbyBldm9sdWNpb25hbmRvIHkgaGFjacOpbmRvc2UgZ3JhbmRlIGhhc3RhIHF1ZSBlbiAyMDE1IHN1YmnDsyBhIDI0IHkgc2UgZXNwZXJhIHF1ZSBlbiBlbCBtdW5kaWFsIGRlIDIwMjMgc2UgZGlzcHV0ZSBjb24gMzIgc2VsZWNjaW9uZXMuPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5FbCBDYW1wZW9uYXRvIGRlIEV1cm9wYSBGZW1lbmlubyBkZSBsYSBVRUZBLCBjb23Dum5tZW50ZSBjb25vY2lkbyBjb21vIEV1cm9jb3BhIEZlbWVuaW5hLCBlcyBsYSBjb21wZXRpY2nDs24gaW50ZXJuYWNpb25hbCBmdXRib2zDrXN0aWNhIG3DoXMgaW1wb3J0YW50ZSBlbnRyZSBzZWxlY2Npb25lcyBuYWNpb25hbGVzIGZlbWVuaW5hcyBkZSBsYSBVRUZBLiBFc3RlIHRvcm5lbyBjb21lbnrDsyBhIGRpc3B1dGFyc2UgZW4gMTk2OSBzaW4gZW1iYXJnbyBlc3RvcyBhw7FvcyBubyBmdWUgY29uc2lkZXJhZG8gb2ZpY2lhbCB5IGxhIHByaW1lcmEgZWRpY2nDs24gZGVsIHRvcm5lbyByZXNwYWxkYWRvIHBvciBsYSBVRUZBIGZ1ZSBlbiAxOTgyLjwvZGl2Lz4KCiMjICoqMy42LiBUaXBvIGRlIGNhbXBvKioKCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUV9CgpuZXV0cmFsIDwtIGRhdGUgJT4lIGdyb3VwX2J5KG5ldXRyYWwpICU+JSBjb3VudCgpIAoKZGF0b3MgPC0gYygyMzI0LCAxODM5KQoKcGllM0QoZGF0b3MsIGxhYmVscyA9IGRhdG9zLCBjb2wgPSAyOjMsIGxhYmVsY29sID0gInJlZCIsIGJvcmRlciA9ICJ3aGl0ZSIsIG1haW4gPSAiVGlwbyBkZSBjYW1wbyIpIAoKbGVnZW5kKHggPSAidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJGYWxzZSIsICJUcnVlIiksIGZpbGwgPSBjKCJwaW5rIiwgImdyZWVuIiksIAogICAgICAgdGl0bGUgPSAiTGVnZW5kIikKCmBgYAoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Db24gZXN0b3MgZGF0b3Mgb2J0ZW5lbW9zIHF1ZSBkZSA0MTYzIHBhcnRpZG9zIG9maWNpYWxlcyBxdWUgc2UgaGFuIGRpc3B1dGFkbyBkZXNkZSBlbCBhw7FvIDE5NjksIDIzMjQgaGFuIHNpZG8gZGlzcHV0YWRvcyBlbiBjYW1wbyBwcm9waW8gZGUgYWxndW5vIGRlIGxvcyBkb3MgcGFpc2VzLjwvZGl2Lz4KCiMgKio0LiBTZWxlY2Npw7NuIGVzcGHDsW9sYSoqCgojIyAqKjQuMS4gTsO6bWVybyBkZSBwYXJ0aWRvcyBqdWdhZG9zIGVuIEVzcGHDsWEqKgoKYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRX0KCnNwYWluIDwtIGRhdGUgJT4lIGdyb3VwX2J5KEHDsW8pICU+JSBjb3VudChjb3VudHJ5KSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlNwYWluIikKCmdncGxvdChzcGFpbiwgYWVzKHg9QcOxbywgeT1uKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MykgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHg9QcOxbywgCiAgICAgICAgICAgICAgICAgICB4ZW5kPUHDsW8sIAogICAgICAgICAgICAgICAgICAgeT0wLCAKICAgICAgICAgICAgICAgICAgIHllbmQ9bikpICsgCiAgbGFicyh0aXRsZT0iUGFydGlkb3MganVnYWRvcyBlbiBFc3Bhw7FhIikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCwgdmp1c3Q9MC42KSkrbGFicyh4ID0gIkHDsW9zIiwgeSA9ICJuwrogcGFydGlkb3MiKQoKYGBgCgojICoqNS4gQ29uY2x1c2nDs24qKgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Db21vIGNvbmNsdXNpw7NuLCBzZSBwdWVkZSBvYnNlcnZhciBxdWUgZWwgZsO6dGJvbCBmZW1lbmlubyBoYSBleHBlcmltZW50YWRvIHVuIGdyYW4gY3JlY2ltaWVudG8gZGVzZGUgc3VzIGluaWNpb3MgaGFzdGEgYWhvcmEsIHNpbiBlbWJhcmdvIHRvZGF2w61hIGZhbHRhIG11Y2hvIHF1ZSBtZWpvcmFyLiBFc3RlIGNyZWNpbWllbnRvIG5vIHNvbG8gZXN0w6EgcmVsYWNpb25hZG8gY29uIGxvcyBkYXRvcyBhbmFsaXphZG9zIGNvbW8gc29uIGVsIG7Dum1lcm8gZGUgcGFydGlkb3MgcG9yIGHDsW8gZGUgZ29sZXMgbyBkZSBzZWxlY2Npb25lcyBzaW5vIHF1ZSBjYWRhIHZleiBoYXkgbcOhcyBwZXJzb25hcyBpbnRlcmVzYWRhcyBlbiBlc3RlIGRlcG9ydGUgeSBlc3RvIGhhY2UgcXVlIGdhbmUgbcOhcyBwb3B1bGFyaWRhZC48L2Rpdi8+Cgo8ZGl2IHN0eWxlID0gInRleHQtYWxpZ246IGp1c3RpZnkiPkhheSBwYcOtc2VzIGNvbW8gcG9yIGVqZW1wbG8gRUVVVSwgQWxlbWFuaWEgbyBGcmFuY2lhIGRvbmRlIGxvcyBjbHViZXMgeWEgZGVzdGluYW4gdW5hIGNhbnRpZGFkIGNvbnNpZGVyYWJsZSBkZSBkaW5lcm8gcGFyYSBlc3RhIHNlY2Npw7NuIGRlbCBmw7p0Ym9sIHByb2Zlc2lvbmFsIGhhY2llbmRvIHRhbWJpw6luIHF1ZSBzdXMgc2VsZWNjaW9uZXMgbWVqb3JlbiB5IHNlYW4gcmVmZXJlbnRlcyBwYXJhIHRvZG8gZWwgbXVuZG8uPC9kaXYvPgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5Fc3Bhw7FhIGVzIGVsIG5vdmVubyBwYcOtcyBlbiBjdWFudG8gYSBsYSBpbnZlcnNpw7NuIGRlIGxvcyBjbHViZXMgeSBsYXMgZmVkZXJhY2lvbmVzIGNvbiA0IG1pbGxvbmVzIGRlIGV1cm9zLiBFcyB1bmEgcG9zaWNpw7NuIGJhc3RhbnRlIGJ1ZW5hIHBhcmEgRXNwYcOxYSBxdWUgZW4gcG9jbyB0aWVtcG8gaGEgc3VwZXJhZG8gYSBtdWNob3Mgb3Ryb3MgcGHDrXNlcyBlbiBlc3RlIGFzcGVjdG8uPC9kaXYvPgoKCiMgKio2LiBUcmFiYWpvcyBlbiBsb3MgcXVlICBtZSBoZSBiYXNhZG8qKgoKPGRpdiBzdHlsZSA9ICJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5FbiBsYSBww6FnaW5hIGRlIGRvbmRlIGhlIGNvZ2lkbyBsb3MgZGF0b3MsIGhheSBhbGd1bm9zIGFuw6FsaXNpcyBjb24gZXN0b3MgbWlzbW9zIGRhdG9zIHF1ZSBhdW5xdWUgbm8gZXN0w6FuIGVuIGxlbmd1YWplIHIgbWUgaGFuIHNlcnZpZG8gY29tbyBlamVtcGxvcyBwYXJhIGFsZ3Vub3MgZGUgbG9zIGdyw6FmaWNvcyB5IG1hcGFzIHF1ZSBoZSB1dGlsaXphZG8gZW4gZXN0ZS48L2Rpdi8+CgpFc3RvcyBzZSBwdWVkZW4gdmVyIFthcXVpXShodHRwczovL3d3dy5rYWdnbGUuY29tL21hcnRqNDIvd29tZW5zLWludGVybmF0aW9uYWwtZm9vdGJhbGwtcmVzdWx0cy9ub3RlYm9va3MpCgoKIyAqKjcuIEJpYmxpb2dyYWZpYSoqCgotIFtlbmxhY2UgYSBsYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIvMDQtdHV0b3JpYWxlcy5odG1sKQotIFtlamVtcGxvcyBkZSBncsOhZmljb3MgeSBtYXBhc10oaHR0cHM6Ly93d3cuci1ncmFwaC1nYWxsZXJ5LmNvbS8pCi0gW2RhdG9zIGRlbCB0cmFiYWpvXShodHRwczovL3d3dy5rYWdnbGUuY29tL21hcnRqNDIvd29tZW5zLWludGVybmF0aW9uYWwtZm9vdGJhbGwtcmVzdWx0cykKLSBbZWplbXBsbyBkZSBhbsOhbGlzaXNdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZ2NkYXRraW4vd29tZW4tcy1mb290YmFsbC13aW4tcHJlZGljdGlvbikKLSBbZWplbXBsbyBkZSBhbsOhbGlzaXNdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vY211bGU5MC9lZGEtd29tZW4tcy1pbnRlcm5hdGlvbmFsLWZvb3RiYWxsKQotIFtlamVtcGxvIGRlIGFuw6FsaXNpc10oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9hcmluZGFtYmFydWFoL3dvbWVuLXMtZm9vdGJhbGwtaXMtb24tYS1yaXNlKQoKCiMgKio4LiBTZXNpw7NuIEluZm9ybWF0aXZhKioKYGBge3J9CiAgICBzZXNzaW9uaW5mbzo6c2Vzc2lvbl9pbmZvKCkgJT4lIGRldGFpbHM6OmRldGFpbHMoc3VtbWFyeSA9ICdjdXJyZW50IHNlc3Npb24gaW5mbycpCmBgYA==