TidyTuesday week 40: NBER papers, data from the National Bureau of Economic Research NBER by way of the nberwp package by Ben Davies.

library(tidyverse)
library(glue)
library(gt)
library(gtExtras)
library(gender)
library(hrbrthemes)
library(ggtext)
library(patchwork)
papers <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/papers.csv')
Rows: 29434 Columns: 4
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): paper, title
dbl (2): year, month

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
authors <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/authors.csv')
Rows: 15437 Columns: 4
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (4): author, name, user_nber, user_repec

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
programs <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/programs.csv')
Rows: 21 Columns: 3
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): program, program_desc, program_category

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
paper_authors <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/paper_authors.csv')
Rows: 67090 Columns: 2
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): paper, author

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
paper_programs <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/paper_programs.csv')
Rows: 53996 Columns: 2
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): paper, program

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
joined_df <- left_join(papers, paper_authors) %>% 
  left_join(authors) %>% 
  left_join(paper_programs) %>% 
  left_join(programs)%>% 
  mutate(
    catalogue_group = str_sub(paper, 1, 1),
    catalogue_group = case_when(
      catalogue_group == "h" ~ "Historical",
      catalogue_group == "t" ~ "Technical",
      catalogue_group == "w" ~ "General"
    ),
    .after = paper
  ) 
Joining, by = "paper"
Joining, by = "author"
Joining, by = "paper"
Joining, by = "program"

Working paper count by program and decade

wp = joined_df %>% group_by(program, program_desc, year) %>%
  summarise(n=n_distinct(paper)) %>%
  arrange(year) %>%
  mutate(decade=case_when(between(year,1980,1989)~"1980s",
                          between(year,1990,1999)~"1990s",
                          between(year,2000,2009)~"2000s",
                          between(year,2010,2019)~"2010s"
                          )) %>%
  drop_na() 
`summarise()` has grouped output by 'program', 'program_desc'. You can override using the `.groups` argument.
wp2 = wp %>% mutate(program=glue::glue("{program_desc} ({program})")) %>%
  group_by(program) %>% mutate(total=sum(n)) %>%
  arrange(year, program) %>%
  mutate(spark=list(n)) %>%
  select(program, spark, total) %>%
  distinct()

wp3 = wp %>% mutate(program=glue::glue("{program_desc} ({program})")) %>%
  group_by(program, decade) %>% tally(n) %>% 
  ungroup() %>%
  pivot_wider(names_from = decade, values_from=n) %>%
  mutate_if(is.numeric, list(~replace_na(., 0)))
wp3 %>% inner_join(wp2, by="program") %>%
  select(Program=program, Total=total, "1980s","1990s","2000s","2010s",Trend=spark) %>%
  arrange(desc(Total)) %>%
  gt() %>%
  gt_theme_espn() %>%
  cols_align(Program, align="left") %>%
  gt_plt_dot(Total, Program,palette = "rcartocolor::ag_GrnYl", max_value=5246) %>%
  gtExtras::gt_sparkline(Trend) %>%
  tab_options(table.font.size = 12.5,
              heading.subtitle.font.size = 14) %>%
  gt_color_box(`1980s`, domain=2:786) %>%
  gt_color_box(`1990s`, domain=2:797) %>%
  gt_color_box(`2000s`, domain=132:1647) %>%
  gt_color_box(`2010s`, domain=200:2424) %>%
  tab_header(title="NBER Papers", subtitle="Working papers count by program and decade") %>%
  tab_source_note(source_note="TidyTuesday Week 40 | Data source: National Bureau of Economic Research (NBER) by way of the nberwp package by Ben Davies") 
NBER Papers
Working papers count by program and decade
Program Total 1980s 1990s 2000s 2010s Trend
Labor Studies (LS)
5246
489.0
797.0
1536.0
2424.0
Public Economics (PE)
5216
506.0
764.0
1561.0
2385.0
Economic Fluctuations and Growth (EFG)
5200
562.0
680.0
1647.0
2311.0
International Finance and Macroeconomics (IFM)
3820
786.0
699.0
1145.0
1190.0
International Trade and Investment (ITI)
3297
782.0
725.0
911.0
879.0
Monetary Economics (ME)
3020
509.0
504.0
782.0
1225.0
Asset Pricing (AP)
2426
0.0
307.0
927.0
1192.0
Productivity, Innovation, and Entrepreneurship (PR)
2182
111.0
290.0
636.0
1145.0
Health Economics (HE)
2039
87.0
143.0
620.0
1189.0
Corporate Finance (CF)
2034
2.0
175.0
718.0
1139.0
Development of the American Economy (DAE)
1532
59.0
230.0
540.0
703.0
Industrial Organization (IO)
1530
0.0
106.0
489.0
935.0
Children (CH)
1510
2.0
60.0
565.0
883.0
Economics of Aging (AG)
1490
43.0
221.0
495.0
731.0
Health Care (HC)
1464
0.0
153.0
479.0
832.0
Economics of Education (ED)
1417
0.0
2.0
436.0
979.0
Political Economics (POL)
1120
0.0
0.0
260.0
860.0
Environment and Energy Economics (EEE)
1096
2.0
13.0
256.0
825.0
Law and Economics (LE)
1020
20.0
72.0
353.0
575.0
Development Economics (DEV)
999
0.0
0.0
0.0
999.0
Technical Working Papers (TWP)
335
0.0
3.0
132.0
200.0
TidyTuesday Week 40 | Data source: National Bureau of Economic Research (NBER) by way of the nberwp package by Ben Davies

ALT text: The table showing the count of NBER papers, by program and decade, from 1980 to 2019, where Labor studies program have the highest total working paper (n=5246) in the time period and Technical Working papers have the lowest total (n=335). The table includes a spark line showing the yearly counts of working paper, where all programs have higher counts of working papers in recent years, except for International Trade and Investment program.

Female authors

# add gender
paper_authors<-paper_authors%>%
  left_join(papers)%>%
  left_join(authors)%>%
  separate(name,c("given",NA))
name<-gender(paper_authors$given, years = c(2020-60,2020-30))
paper_authors<-paper_authors%>%
  left_join(name,by= c("given"="name"))
female = paper_authors %>% 
  filter(between(year, 1980, 2020)) %>%
  group_by(year,gender) %>%
  tally() %>%
  mutate(prop=n/sum(n)) %>%
  filter(gender=="female")
# count and percent of female authors
female %>% 
  mutate(prop=round(prop*100,2)) %>%
  rename("Count"=n,"Percent"=prop) %>%
  pivot_longer(Count:"Percent") %>%
  mutate(value=ifelse(name=="Percent",-1*value,1*value)) %>%
  ggplot(aes(x=year, y=value, fill=name, alpha=ifelse((value==max(value)|value==min(value)),1,0.55))) +
  scale_alpha_identity() +
  scale_fill_manual(values=c("#0f4c5c","#e36414")) +
  geom_col() +
  facet_grid(str_to_upper(name)~., scales="free",switch="both") +
  #scale_x_continuous(expand=c(0.01,0.01)) +
  scale_y_continuous(labels=abs) +
  theme_ipsum(base_size = 8) +
  theme(panel.spacing = unit(0, "lines"),
        panel.grid.minor=element_blank(),
        strip.placement = "outside",
        strip.text.y.left=element_text(angle=0, size=8, hjust=.5),
        axis.title.x=element_blank(),
        axis.title.y=element_blank(),
        legend.position = "none",
        plot.title.position = "plot",
        plot.title=element_text(size=14, face="plain"),
        plot.subtitle=element_markdown(size=10),
        plot.caption.position="plot",
        plot.caption=element_text(face="plain",size=7, hjust=0)
        ) +
  labs(title="Female Authors in NBER Papers",
       caption="Data source: National Bureau of Economic Research (NBER) by way of the nberwp package by Ben Davies",
       subtitle= "<span style = 'color:#0f4c5c;'><b>Count</b></span> and <span style = 'color:#e36414;'><b>percent</b></span> of female authors in NBER papers by year, from 1980 to 2020")

Gender

gender_df = joined_df %>% separate(name,c("given",NA))
Expected 2 pieces. Additional pieces discarded in 66921 rows [2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 15, 17, 18, 19, 21, 22, 24, 25, 26, 27, ...].Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [98409].
name<-gender(gender_df$given, years = c(2020-60,2020-30))
gender_df<-gender_df %>%
  left_join(name,by= c("given"="name"))
gender_tab = gender_df %>% 
  select(program_category, program_desc, gender) %>%
  drop_na() %>%
  count(program_category, program_desc, gender)
gt2 = gender_tab %>%
  group_by(gender) %>%
  mutate(prop=n/sum(n)) %>%
  mutate(rank = rank(prop, ties.method = "random"))

gt2 %>%
  ggplot(aes(x=str_to_title(gender), y=rank, color=program_category)) +
  geom_point(size=5) +
  geom_line(aes(group=program_desc), alpha=.5) +
  scale_color_manual(values=c("#219ebc","#e85d04","#023047")) +
  geom_text(data=gt2 %>% filter(gender=="female"), aes(label=program_desc), size=2.5, hjust=1, nudge_x = -.07,family="Arial Narrow") +
  geom_text(data=gt2 %>% filter(gender=="male"), aes(label=program_desc), size=2.5, hjust=0, nudge_x = .07, family="Arial Narrow") +
  geom_text(data=gt2 %>% filter(gender=="female"), aes(label=round(prop*100,1)), 
            size=2.2, color="white",fontface="bold",family="Arial Narrow") +
  geom_text(data=gt2 %>% filter(gender=="male"), aes(label=round(prop*100,1)), 
            size=2.2, color="white",fontface="bold",family="Arial Narrow") +
  scale_x_discrete(position="top", expand=c(0.6,0.6)) +
  theme_minimal(base_size = 10, base_family = "Arial Narrow") +
  guides(color=guide_legend(reverse=T)) +
  theme(legend.margin=margin(t=-5),
        axis.title=element_blank(),
        panel.grid = element_blank(),
        axis.text.y=element_blank(),
        axis.text.x.top=element_text(size=10, margin=margin(b=-2), color="black"),
        legend.text=element_text(size=8),
        legend.title=element_text(size=8),
        plot.margin = unit(c(.5, .5, .5, .5), "cm"),
        plot.title=element_text(margin=margin(b=13))) +
  labs(color="Program Category",
       title="NBER Papers: Percentage of programs by gender")

LS0tCnRpdGxlOiAiVGlkeSBUdWVzZGF5IDIwMjEgV2VlayA0MCIKZGF0ZTogIjIwMjEvMDkvMjgiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRpZHlUdWVzZGF5IHdlZWsgNDA6IE5CRVIgcGFwZXJzLCBkYXRhIGZyb20gdGhlIE5hdGlvbmFsIEJ1cmVhdSBvZiBFY29ub21pYyBSZXNlYXJjaCBbTkJFUl0oaHR0cHM6Ly93d3cyLm5iZXIub3JnL1JlUEVjL25ici9uYmVyd28vKSBieSB3YXkgb2YgdGhlIFtuYmVyd3AgcGFja2FnZSBieSBCZW4gRGF2aWVzXShodHRwczovL2dpdGh1Yi5jb20vYmxkYXZpZXMvbmJlcndwKS4KCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2x1ZSkKbGlicmFyeShndCkKbGlicmFyeShndEV4dHJhcykKbGlicmFyeShnZW5kZXIpCmxpYnJhcnkoaHJicnRoZW1lcykKbGlicmFyeShnZ3RleHQpCmxpYnJhcnkocGF0Y2h3b3JrKQpgYGAKCmBgYHtyfQpwYXBlcnMgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wOS0yOC9wYXBlcnMuY3N2JykKYXV0aG9ycyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTA5LTI4L2F1dGhvcnMuY3N2JykKcHJvZ3JhbXMgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wOS0yOC9wcm9ncmFtcy5jc3YnKQpwYXBlcl9hdXRob3JzIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDktMjgvcGFwZXJfYXV0aG9ycy5jc3YnKQpwYXBlcl9wcm9ncmFtcyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTA5LTI4L3BhcGVyX3Byb2dyYW1zLmNzdicpCmBgYAoKYGBge3J9CmpvaW5lZF9kZiA8LSBsZWZ0X2pvaW4ocGFwZXJzLCBwYXBlcl9hdXRob3JzKSAlPiUgCiAgbGVmdF9qb2luKGF1dGhvcnMpICU+JSAKICBsZWZ0X2pvaW4ocGFwZXJfcHJvZ3JhbXMpICU+JSAKICBsZWZ0X2pvaW4ocHJvZ3JhbXMpJT4lIAogIG11dGF0ZSgKICAgIGNhdGFsb2d1ZV9ncm91cCA9IHN0cl9zdWIocGFwZXIsIDEsIDEpLAogICAgY2F0YWxvZ3VlX2dyb3VwID0gY2FzZV93aGVuKAogICAgICBjYXRhbG9ndWVfZ3JvdXAgPT0gImgiIH4gIkhpc3RvcmljYWwiLAogICAgICBjYXRhbG9ndWVfZ3JvdXAgPT0gInQiIH4gIlRlY2huaWNhbCIsCiAgICAgIGNhdGFsb2d1ZV9ncm91cCA9PSAidyIgfiAiR2VuZXJhbCIKICAgICksCiAgICAuYWZ0ZXIgPSBwYXBlcgogICkgCmBgYAoKIyMjIFdvcmtpbmcgcGFwZXIgY291bnQgYnkgcHJvZ3JhbSBhbmQgZGVjYWRlCiogc2hhcmVkIG9uIFtUd2l0dGVyXShodHRwczovL3R3aXR0ZXIuY29tL2xlZW9sbmV5My9zdGF0dXMvMTQ0MjY3MTg1NzAxNTA4NzEwNikKCmBgYHtyfQp3cCA9IGpvaW5lZF9kZiAlPiUgZ3JvdXBfYnkocHJvZ3JhbSwgcHJvZ3JhbV9kZXNjLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2Uobj1uX2Rpc3RpbmN0KHBhcGVyKSkgJT4lCiAgYXJyYW5nZSh5ZWFyKSAlPiUKICBtdXRhdGUoZGVjYWRlPWNhc2Vfd2hlbihiZXR3ZWVuKHllYXIsMTk4MCwxOTg5KX4iMTk4MHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4oeWVhciwxOTkwLDE5OTkpfiIxOTkwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2Vlbih5ZWFyLDIwMDAsMjAwOSl+IjIwMDBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuKHllYXIsMjAxMCwyMDE5KX4iMjAxMHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZHJvcF9uYSgpIAoKd3AyID0gd3AgJT4lIG11dGF0ZShwcm9ncmFtPWdsdWU6OmdsdWUoIntwcm9ncmFtX2Rlc2N9ICh7cHJvZ3JhbX0pIikpICU+JQogIGdyb3VwX2J5KHByb2dyYW0pICU+JSBtdXRhdGUodG90YWw9c3VtKG4pKSAlPiUKICBhcnJhbmdlKHllYXIsIHByb2dyYW0pICU+JQogIG11dGF0ZShzcGFyaz1saXN0KG4pKSAlPiUKICBzZWxlY3QocHJvZ3JhbSwgc3BhcmssIHRvdGFsKSAlPiUKICBkaXN0aW5jdCgpCgp3cDMgPSB3cCAlPiUgbXV0YXRlKHByb2dyYW09Z2x1ZTo6Z2x1ZSgie3Byb2dyYW1fZGVzY30gKHtwcm9ncmFtfSkiKSkgJT4lCiAgZ3JvdXBfYnkocHJvZ3JhbSwgZGVjYWRlKSAlPiUgdGFsbHkobikgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGVjYWRlLCB2YWx1ZXNfZnJvbT1uKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgbGlzdCh+cmVwbGFjZV9uYSguLCAwKSkpCmBgYAoKCmBgYHtyfQp3cDMgJT4lIGlubmVyX2pvaW4od3AyLCBieT0icHJvZ3JhbSIpICU+JQogIHNlbGVjdChQcm9ncmFtPXByb2dyYW0sIFRvdGFsPXRvdGFsLCAiMTk4MHMiLCIxOTkwcyIsIjIwMDBzIiwiMjAxMHMiLFRyZW5kPXNwYXJrKSAlPiUKICBhcnJhbmdlKGRlc2MoVG90YWwpKSAlPiUKICBndCgpICU+JQogIGd0X3RoZW1lX2VzcG4oKSAlPiUKICBjb2xzX2FsaWduKFByb2dyYW0sIGFsaWduPSJsZWZ0IikgJT4lCiAgZ3RfcGx0X2RvdChUb3RhbCwgUHJvZ3JhbSxwYWxldHRlID0gInJjYXJ0b2NvbG9yOjphZ19Hcm5ZbCIsIG1heF92YWx1ZT01MjQ2KSAlPiUKICBndEV4dHJhczo6Z3Rfc3BhcmtsaW5lKFRyZW5kKSAlPiUKICB0YWJfb3B0aW9ucyh0YWJsZS5mb250LnNpemUgPSAxMi41LAogICAgICAgICAgICAgIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplID0gMTQpICU+JQogIGd0X2NvbG9yX2JveChgMTk4MHNgLCBkb21haW49Mjo3ODYpICU+JQogIGd0X2NvbG9yX2JveChgMTk5MHNgLCBkb21haW49Mjo3OTcpICU+JQogIGd0X2NvbG9yX2JveChgMjAwMHNgLCBkb21haW49MTMyOjE2NDcpICU+JQogIGd0X2NvbG9yX2JveChgMjAxMHNgLCBkb21haW49MjAwOjI0MjQpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9IkVjb25vbWljIFBhcGVycyIsIHN1YnRpdGxlPSJXb3JraW5nIHBhcGVycyBjb3VudCBieSBwcm9ncmFtIGFuZCBkZWNhZGUiKSAlPiUKICB0YWJfc291cmNlX25vdGUoc291cmNlX25vdGU9IlRpZHlUdWVzZGF5IFdlZWsgNDAgfCBEYXRhIHNvdXJjZTogTmF0aW9uYWwgQnVyZWF1IG9mIEVjb25vbWljIFJlc2VhcmNoIChOQkVSKSBieSB3YXkgb2YgdGhlIG5iZXJ3cCBwYWNrYWdlIGJ5IEJlbiBEYXZpZXMiKSAKYGBgCgpBTFQgdGV4dDogVGhlIHRhYmxlIHNob3dpbmcgdGhlIGNvdW50IG9mIE5CRVIgcGFwZXJzLCBieSBwcm9ncmFtIGFuZCBkZWNhZGUsIGZyb20gMTk4MCB0byAyMDE5LCB3aGVyZSBMYWJvciBzdHVkaWVzIHByb2dyYW0gaGF2ZSB0aGUgaGlnaGVzdCB0b3RhbCB3b3JraW5nIHBhcGVyIChuPTUyNDYpIGluIHRoZSB0aW1lIHBlcmlvZCBhbmQgVGVjaG5pY2FsIFdvcmtpbmcgcGFwZXJzIGhhdmUgdGhlIGxvd2VzdCB0b3RhbCAobj0zMzUpLiBUaGUgdGFibGUgaW5jbHVkZXMgYSBzcGFyayBsaW5lIHNob3dpbmcgdGhlIHllYXJseSBjb3VudHMgb2Ygd29ya2luZyBwYXBlciwgd2hlcmUgYWxsIHByb2dyYW1zIGhhdmUgaGlnaGVyIGNvdW50cyBvZiB3b3JraW5nIHBhcGVycyBpbiByZWNlbnQgeWVhcnMsIGV4Y2VwdCBmb3IgSW50ZXJuYXRpb25hbCBUcmFkZSBhbmQgSW52ZXN0bWVudCBwcm9ncmFtLiAKCiMjIyBGZW1hbGUgYXV0aG9ycwpgYGB7cn0KIyBhZGQgZ2VuZGVyCnBhcGVyX2F1dGhvcnM8LXBhcGVyX2F1dGhvcnMlPiUKICBsZWZ0X2pvaW4ocGFwZXJzKSU+JQogIGxlZnRfam9pbihhdXRob3JzKSU+JQogIHNlcGFyYXRlKG5hbWUsYygiZ2l2ZW4iLE5BKSkKbmFtZTwtZ2VuZGVyKHBhcGVyX2F1dGhvcnMkZ2l2ZW4sIHllYXJzID0gYygyMDIwLTYwLDIwMjAtMzApKQpwYXBlcl9hdXRob3JzPC1wYXBlcl9hdXRob3JzJT4lCiAgbGVmdF9qb2luKG5hbWUsYnk9IGMoImdpdmVuIj0ibmFtZSIpKQpgYGAKCmBgYHtyfQpmZW1hbGUgPSBwYXBlcl9hdXRob3JzICU+JSAKICBmaWx0ZXIoYmV0d2Vlbih5ZWFyLCAxOTgwLCAyMDIwKSkgJT4lCiAgZ3JvdXBfYnkoeWVhcixnZW5kZXIpICU+JQogIHRhbGx5KCkgJT4lCiAgbXV0YXRlKHByb3A9bi9zdW0obikpICU+JQogIGZpbHRlcihnZW5kZXI9PSJmZW1hbGUiKQpgYGAKCmBgYHtyfQojIGNvdW50IGFuZCBwZXJjZW50IG9mIGZlbWFsZSBhdXRob3JzCmZlbWFsZSAlPiUgCiAgbXV0YXRlKHByb3A9cm91bmQocHJvcCoxMDAsMikpICU+JQogIHJlbmFtZSgiQ291bnQiPW4sIlBlcmNlbnQiPXByb3ApICU+JQogIHBpdm90X2xvbmdlcihDb3VudDoiUGVyY2VudCIpICU+JQogIG11dGF0ZSh2YWx1ZT1pZmVsc2UobmFtZT09IlBlcmNlbnQiLC0xKnZhbHVlLDEqdmFsdWUpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT12YWx1ZSwgZmlsbD1uYW1lLCBhbHBoYT1pZmVsc2UoKHZhbHVlPT1tYXgodmFsdWUpfHZhbHVlPT1taW4odmFsdWUpKSwxLDAuNTUpKSkgKwogIHNjYWxlX2FscGhhX2lkZW50aXR5KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMGY0YzVjIiwiI2UzNjQxNCIpKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfZ3JpZChzdHJfdG9fdXBwZXIobmFtZSl+Liwgc2NhbGVzPSJmcmVlIixzd2l0Y2g9ImJvdGgiKSArCiAgI3NjYWxlX3hfY29udGludW91cyhleHBhbmQ9YygwLjAxLDAuMDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1hYnMpICsKICB0aGVtZV9pcHN1bShiYXNlX3NpemUgPSA4KSArCiAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMCwgImxpbmVzIiksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiLAogICAgICAgIHN0cmlwLnRleHQueS5sZWZ0PWVsZW1lbnRfdGV4dChhbmdsZT0wLCBzaXplPTgsIGhqdXN0PS41KSwKICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIsCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0icGxhaW4iKSwKICAgICAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfbWFya2Rvd24oc2l6ZT0xMCksCiAgICAgICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uPSJwbG90IiwKICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGZhY2U9InBsYWluIixzaXplPTcsIGhqdXN0PTApCiAgICAgICAgKSArCiAgbGFicyh0aXRsZT0iRmVtYWxlIEF1dGhvcnMgaW4gTkJFUiBQYXBlcnMiLAogICAgICAgY2FwdGlvbj0iRGF0YSBzb3VyY2U6IE5hdGlvbmFsIEJ1cmVhdSBvZiBFY29ub21pYyBSZXNlYXJjaCAoTkJFUikgYnkgd2F5IG9mIHRoZSBuYmVyd3AgcGFja2FnZSBieSBCZW4gRGF2aWVzIiwKICAgICAgIHN1YnRpdGxlPSAiPHNwYW4gc3R5bGUgPSAnY29sb3I6IzBmNGM1YzsnPjxiPkNvdW50PC9iPjwvc3Bhbj4gYW5kIDxzcGFuIHN0eWxlID0gJ2NvbG9yOiNlMzY0MTQ7Jz48Yj5QZXJjZW50PC9iPjwvc3Bhbj4gb2YgZmVtYWxlIGF1dGhvcnMgaW4gTkJFUiBwYXBlcnMgYnkgeWVhciwgZnJvbSAxOTgwIHRvIDIwMjAiKQpgYGAKCiMjIyBHZW5kZXIKYGBge3J9CmdlbmRlcl9kZiA9IGpvaW5lZF9kZiAlPiUgc2VwYXJhdGUobmFtZSxjKCJnaXZlbiIsTkEpKQpuYW1lPC1nZW5kZXIoZ2VuZGVyX2RmJGdpdmVuLCB5ZWFycyA9IGMoMjAyMC02MCwyMDIwLTMwKSkKZ2VuZGVyX2RmPC1nZW5kZXJfZGYgJT4lCiAgbGVmdF9qb2luKG5hbWUsYnk9IGMoImdpdmVuIj0ibmFtZSIpKQpgYGAKCgpgYGB7cn0KZ2VuZGVyX3RhYiA9IGdlbmRlcl9kZiAlPiUgCiAgc2VsZWN0KHByb2dyYW1fY2F0ZWdvcnksIHByb2dyYW1fZGVzYywgZ2VuZGVyKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgY291bnQocHJvZ3JhbV9jYXRlZ29yeSwgcHJvZ3JhbV9kZXNjLCBnZW5kZXIpCmBgYAoKYGBge3J9Cmd0MiA9IGdlbmRlcl90YWIgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyKSAlPiUKICBtdXRhdGUocHJvcD1uL3N1bShuKSkgJT4lCiAgbXV0YXRlKHJhbmsgPSByYW5rKHByb3AsIHRpZXMubWV0aG9kID0gInJhbmRvbSIpKQoKZ3QyICU+JQogIGdncGxvdChhZXMoeD1zdHJfdG9fdGl0bGUoZ2VuZGVyKSwgeT1yYW5rLCBjb2xvcj1wcm9ncmFtX2NhdGVnb3J5KSkgKwogIGdlb21fcG9pbnQoc2l6ZT01KSArCiAgZ2VvbV9saW5lKGFlcyhncm91cD1wcm9ncmFtX2Rlc2MpLCBhbHBoYT0uNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzIxOWViYyIsIiNlODVkMDQiLCIjMDIzMDQ3IikpICsKICBnZW9tX3RleHQoZGF0YT1ndDIgJT4lIGZpbHRlcihnZW5kZXI9PSJmZW1hbGUiKSwgYWVzKGxhYmVsPXByb2dyYW1fZGVzYyksIHNpemU9Mi41LCBoanVzdD0xLCBudWRnZV94ID0gLS4wNyxmYW1pbHk9IkFyaWFsIE5hcnJvdyIpICsKICBnZW9tX3RleHQoZGF0YT1ndDIgJT4lIGZpbHRlcihnZW5kZXI9PSJtYWxlIiksIGFlcyhsYWJlbD1wcm9ncmFtX2Rlc2MpLCBzaXplPTIuNSwgaGp1c3Q9MCwgbnVkZ2VfeCA9IC4wNywgZmFtaWx5PSJBcmlhbCBOYXJyb3ciKSArCiAgZ2VvbV90ZXh0KGRhdGE9Z3QyICU+JSBmaWx0ZXIoZ2VuZGVyPT0iZmVtYWxlIiksIGFlcyhsYWJlbD1yb3VuZChwcm9wKjEwMCwxKSksIAogICAgICAgICAgICBzaXplPTIuMiwgY29sb3I9IndoaXRlIixmb250ZmFjZT0iYm9sZCIsZmFtaWx5PSJBcmlhbCBOYXJyb3ciKSArCiAgZ2VvbV90ZXh0KGRhdGE9Z3QyICU+JSBmaWx0ZXIoZ2VuZGVyPT0ibWFsZSIpLCBhZXMobGFiZWw9cm91bmQocHJvcCoxMDAsMSkpLCAKICAgICAgICAgICAgc2l6ZT0yLjIsIGNvbG9yPSJ3aGl0ZSIsZm9udGZhY2U9ImJvbGQiLGZhbWlseT0iQXJpYWwgTmFycm93IikgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb249InRvcCIsIGV4cGFuZD1jKDAuNiwwLjYpKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMCwgYmFzZV9mYW1pbHkgPSAiQXJpYWwgTmFycm93IikgKwogIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQocmV2ZXJzZT1UKSkgKwogIHRoZW1lKGxlZ2VuZC5tYXJnaW49bWFyZ2luKHQ9LTUpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54LnRvcD1lbGVtZW50X3RleHQoc2l6ZT0xMCwgbWFyZ2luPW1hcmdpbihiPS0yKSwgY29sb3I9ImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKC41LCAuNSwgLjUsIC41KSwgImNtIiksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQobWFyZ2luPW1hcmdpbihiPTEzKSkpICsKICBsYWJzKGNvbG9yPSJQcm9ncmFtIENhdGVnb3J5IiwKICAgICAgIHRpdGxlPSJOQkVSIFBhcGVyczogUGVyY2VudGFnZSBvZiBwcm9ncmFtcyBieSBnZW5kZXIiKQpgYGAKCgoKCgo=