This notebook uses TidyTuesday Week 11/2021 Bechdel Test data from FiveThirtyEight.
Data set description (from TidyTuesday):
1. raw_bechdel : includes data from 1970 - 2020, for ONLY bechdel testing
2. movies: includes IMDB scores, budget/gross revenue, and ratings but only from 1970 - 2013
# load library
library(tidyverse)
library(tidytuesdayR)
library(gghalves)
library(ggpubr)
library(scales)
library(ggExtra)
library(tidytext)
library(gt)
# load data
tuesdata <- tidytuesdayR::tt_load('2021-03-09')
--- Compiling #TidyTuesday Information for 2021-03-09 ----
--- There are 2 files available ---
--- Starting Download ---
Downloading file 1 of 2: `raw_bechdel.csv`
Downloading file 2 of 2: `movies.csv`
--- Download complete ---
b = tuesdata$raw_bechdel
m = tuesdata$movies
summary(b$year)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1888 1989 2006 1997 2013 2021
summary(m$year)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1970 1998 2005 2003 2009 2013
Outcomes and metascore
# Outcomes and Metascore
# shared on twitter (https://twitter.com/leeolney3/status/1369238810085777410/photo/1)
m %>%
filter(!is.na(metascore)) %>%
filter(between(year, 1970,2020)) %>%
mutate(binary= ifelse(binary=="FAIL","Bechdel Test: Fail","Bechdel Test: Pass")) %>%
ggplot(aes(x=clean_test, y=metascore, color=clean_test)) +
geom_half_point(size=0.8, alpha=0.5) +
geom_half_boxplot(outlier.size = -1) +
facet_grid(~binary,scales = "free", space = "free") +
scale_color_manual(values=c("#f79d65","#f4845f","#f27059","#f25c54","#33658a")) +
theme_bw() +
theme(axis.title=element_text(size=9, face="bold"),
legend.position = "none",
strip.background = element_blank(),
axis.ticks=element_blank(),
plot.title=element_text(face="bold", lineheight = 10),
plot.caption=element_text(color="#6d6a75", size=8),
#plot.title.position = "plot",
plot.margin=unit(c(0.4,1.2,0.4,0.3),"cm")) +
labs(x="Outcomes of Bechdel Test",
y="Metascore",
title="Bechdel Test Outcomes and Metascore of Movies (1970 to 2013)",
caption="Data from FiveThirtyEight")

# Outcomes and Domestic Gross
m1 = m
m1$domgross_2013= as.numeric(m1$domgross_2013)
ylab = c(0,500,1000,1500)
m1 %>%
filter(!is.na(domgross_2013)) %>%
filter(between(year, 1970,2020)) %>%
mutate(binary= ifelse(binary=="FAIL","Bechdel Test: Fail","Bechdel Test: Pass")) %>%
ggplot(aes(x=clean_test, y=domgross_2013, color=clean_test)) +
geom_half_point(size=0.8, alpha=0.5) +
geom_half_boxplot(outlier.size = -1) +
#geom_jitter(size=0.8, alpha=0.2, color="yellow") +
#geom_boxplot(fill=NA) +
facet_grid(~binary,scales = "free", space = "free",) +
scale_y_continuous(labels = paste(ylab, "M"),
breaks = 10^6 * ylab
) +
scale_color_manual(values=c("#f79d65","#f4845f","#f27059","#f25c54","#33658a")) +
theme_bw() +
theme(axis.title=element_text(size=9),
legend.position = "none",
#plot.title.position = "plot",
strip.background = element_blank(),
plot.title=element_text(face="bold")
)+
labs(x="Outcome of Bechdel Test",
y="Domestic gross (in millions)",
title="Bechdel Test Outcomes and Domestic Gross of Movies (1970 to 2013)",
subtitle= "Domestic gross normalised to 2013 dollars")
Bechdel test ratings (0-3)
b %>% group_by(rating) %>% tally() %>% mutate(prop=round(n/sum(n),3))
b %>%
filter(between(year, 1970,2020)) %>%
group_by(year, rating) %>%
tally() %>% mutate(prop=round(n/sum(n),3)) %>%
mutate(rating_long = case_when(rating==0 ~"Unscored",
rating==1 ~"At least two named women",
rating==2 ~"Women talk to each other",
rating==3 ~"About something besides a man"
)) %>%
ggplot(aes(x=year, y=prop, color= rating_long)) +
geom_point(key_glyph = draw_key_point, alpha=0.8) +
scale_color_manual(values=c("#a8201a","#0f8b8d","#143642","#ec9a29")) +
scale_y_continuous(labels = scales::percent_format()) +
theme_light(base_size=10) +
theme(legend.position="top",
#plot.title.position="plot",
legend.justification='left',
legend.title=element_text(size=9),
legend.margin=margin(0,0,0,0),
plot.title=element_text(face="bold")
) +
guides(color=guide_legend(ncol=2,override.aes = list(shape = 15, size =4))) +
labs(x="Year",y="Percentage",color="Rating",
title="Bechdel Test Ratings of Movies from 1970 to 2020",
caption="Data from FiveThirtyEight")

Movie count by genre
m= m %>% filter(!is.na(type))
m %>%
select(imdb, genre) %>%
unnest_tokens(word, genre) %>%
filter(!is.na(word)) %>%
group_by(word) %>%
tally(sort=T) %>%
filter(word!="fi") %>% mutate(word=ifelse(word=="sci","sci-fi",word)) %>%
ggplot(aes(y=reorder(word,n), x=n)) +
geom_point() +
theme_light(base_size = 10) +
theme(plot.title=element_text(face="bold")) +
labs(x="Count",
y="Genre",
title="Movies Count by Genre")

Budget, domestic gross, imdb, bechdel test
# budget, domestic gross, imdb, bechdel test (movies 1970 to 2013)
# reference: Sherosha Raj (https://twitter.com/SheroshaR/status/1369455581422092288/photo/1)
p1 = m1 %>%
filter(budget>100000000) %>%
ggplot(aes(x=budget_2013/1000000, y=domgross_2013/1000000, color=binary, size=imdb_votes/1000)) +
geom_point(alpha=0.5) +
scale_color_manual(values = c("#b7094c","#0091ad")) +
scale_x_continuous(label = label_number(suffix="M"), trans = "log10") +
scale_y_continuous(label=label_number(suffix="M"), trans = "log10") +
scale_size_continuous(label=label_number(suffix="K")) +
theme_light(base_size = 10) +
theme(legend.position="bottom",
axis.ticks=element_blank(),
panel.grid=element_blank(),
axis.title = element_text(size=10, face="bold"),
legend.title=element_text(size=9.5, face="bold"),
plot.title=element_text(face="bold")) +
labs(x="Budget (log)",
y="Domestic gross (log)",
size="IMDB votes",
color="Bechdel Test",
subtitle="Budget and domestic gross normalised to 2013 dollars",
title="Movies from 1970 to 2013, with budget over 100 million")
ggMarginal(p1, groupColour = T, groupFill = T) #type='boxplot


Total gross revenue by decade
m1 = m
m1$domgross_2013= as.numeric(m1$domgross_2013)
m1$intgross_2013= as.numeric(m1$intgross_2013)
m1$int_dom_2013 = m1$domgross_2013 + m1$intgross_2013
m1 %>%
mutate(decade= year-(year %% 10)) %>% # get decade
ggplot(aes(x=factor(decade), y=int_dom_2013/1000000000, color=binary)) +
geom_boxplot() +
scale_color_manual(values = c("#b7094c","#0091ad")) +
scale_y_continuous(label=label_number(suffix="B")) +
theme_light(base_size=10) +
theme(plot.title=element_text(face="bold")) +
labs(y="Total Gross",
x="Decade",
color="Bechdel Test",
title="Total Gross Revenue (Domestic and International)",
subtitle="Movies from 1970 to 2013, gross values normalised to 2013 dollars")

Content rating and bechdel test
table(m$rated)
G N/A NC-17 Not Rated PG PG-13 R TV-14 TV-PG Unrated X
36 10 7 15 257 565 691 1 1 5 4
m %>%
filter(rated == "R"| rated =="PG-13" | rated == "PG") %>%
group_by(rated, binary) %>%
tally() %>%
mutate(percent=round(n/sum(n),4)) %>%
mutate(binary = ifelse(binary=="FAIL","Fail","Pass")) %>%
rename("Bechdel Test" = "binary", "Rated"="rated") %>%
ungroup() %>%
gt() %>%
tab_header(title="Movies 1970 to 2013", subtitle= "Content Rating and Bechdel Test Outcome") %>%
fmt_percent(columns=vars(percent)) %>%
#data_color(columns=vars(Rated),
#colors=scales::col_factor(palette=c("#c9ada7","#9a8c98","#4a4e69"),
#domain=c("PG","PG-13","R"))) %>%
data_color(column=vars(percent),
colors=scales::col_numeric(palette=c("#d9ed92","#34a0a4"),
domain=c(0.41,0.59)))
| Rated |
Bechdel Test |
n |
percent |
| PG |
Fail |
150 |
58.37% |
| PG |
Pass |
107 |
41.63% |
| PG-13 |
Fail |
298 |
52.74% |
| PG-13 |
Pass |
267 |
47.26% |
| R |
Fail |
394 |
57.02% |
| R |
Pass |
297 |
42.98% |
NA
Domestic gross by content rating and bechdel test
m1 %>%
filter(rated == "R"| rated =="PG-13" | rated == "PG") %>%
ggplot(aes(x=rated, y=domgross_2013/1000000, color= binary)) +
geom_boxplot() +
scale_color_manual(values = c("#b7094c","#0091ad")) +
scale_y_continuous(name="Domestic Gross", label=label_number(suffix="M")) +
theme_light(base_size=10) +
theme(plot.title=element_text(face="bold")) +
labs(x="Content Rating",
color="Bechdel Test",
title="Domestic Gross by Content Rating and Bechdel Test Outcome",
subtitle="Movies from 1970 to 2013, values normalised to 2013 dollars")

LS0tCnRpdGxlOiAiMTEvMjAyMSBCZWNoZGVsIFRlc3QiCmRhdGU6ICIyMDIxLzAzLzA5IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIG5vdGVib29rIHVzZXMgW1RpZHlUdWVzZGF5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5KSBXZWVrIDExLzIwMjEgW0JlY2hkZWwgVGVzdF0oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9ibG9iL21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMy0wOS9yZWFkbWUubWQpIGRhdGEgZnJvbSBbRml2ZVRoaXJ0eUVpZ2h0XShodHRwczovL2dpdGh1Yi5jb20vZml2ZXRoaXJ0eWVpZ2h0L2RhdGEvdHJlZS9tYXN0ZXIvYmVjaGRlbCkuIAoKRGF0YSBzZXQgZGVzY3JpcHRpb24gKGZyb20gW1RpZHlUdWVzZGF5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L2Jsb2IvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAzLTA5L3JlYWRtZS5tZCkpOiAgICAgCjEuICoqcmF3X2JlY2hkZWwqKiA6IGluY2x1ZGVzIGRhdGEgZnJvbSAxOTcwIC0gMjAyMCwgZm9yIE9OTFkgYmVjaGRlbCB0ZXN0aW5nICAgIAoyLiAqKm1vdmllcyoqOiBpbmNsdWRlcyBJTURCIHNjb3JlcywgYnVkZ2V0L2dyb3NzIHJldmVudWUsIGFuZCByYXRpbmdzIGJ1dCBvbmx5IGZyb20gMTk3MCAtIDIwMTMgICAgCgoKYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBsb2FkIGxpYnJhcnkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeXR1ZXNkYXlSKQpsaWJyYXJ5KGdnaGFsdmVzKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZ2dFeHRyYSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeShndCkKYGBgCgoKYGBge3J9CiMgbG9hZCBkYXRhCnR1ZXNkYXRhIDwtIHRpZHl0dWVzZGF5Ujo6dHRfbG9hZCgnMjAyMS0wMy0wOScpCmIgPSB0dWVzZGF0YSRyYXdfYmVjaGRlbAptID0gdHVlc2RhdGEkbW92aWVzCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KGIkeWVhcikKc3VtbWFyeShtJHllYXIpCmBgYAoKIyMjIE91dGNvbWVzIGFuZCBtZXRhc2NvcmUKCmBgYHtyfQojIE91dGNvbWVzIGFuZCBNZXRhc2NvcmUKIyBzaGFyZWQgb24gdHdpdHRlciAoaHR0cHM6Ly90d2l0dGVyLmNvbS9sZWVvbG5leTMvc3RhdHVzLzEzNjkyMzg4MTAwODU3Nzc0MTAvcGhvdG8vMSkKbSAlPiUgCiAgZmlsdGVyKCFpcy5uYShtZXRhc2NvcmUpKSAlPiUKICBmaWx0ZXIoYmV0d2Vlbih5ZWFyLCAxOTcwLDIwMjApKSAlPiUKICBtdXRhdGUoYmluYXJ5PSBpZmVsc2UoYmluYXJ5PT0iRkFJTCIsIkJlY2hkZWwgVGVzdDogRmFpbCIsIkJlY2hkZWwgVGVzdDogUGFzcyIpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Y2xlYW5fdGVzdCwgeT1tZXRhc2NvcmUsIGNvbG9yPWNsZWFuX3Rlc3QpKSArIAogIGdlb21faGFsZl9wb2ludChzaXplPTAuOCwgYWxwaGE9MC41KSArIAogIGdlb21faGFsZl9ib3hwbG90KG91dGxpZXIuc2l6ZSA9IC0xKSArIAogIGZhY2V0X2dyaWQofmJpbmFyeSxzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjZjc5ZDY1IiwiI2Y0ODQ1ZiIsIiNmMjcwNTkiLCIjZjI1YzU0IiwiIzMzNjU4YSIpKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9OSwgZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBsaW5laGVpZ2h0ID0gMTApLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoY29sb3I9IiM2ZDZhNzUiLCBzaXplPTgpLAogICAgICAgICNwbG90LnRpdGxlLnBvc2l0aW9uID0gInBsb3QiLAogICAgICAgIHBsb3QubWFyZ2luPXVuaXQoYygwLjQsMS4yLDAuNCwwLjMpLCJjbSIpKSArCiAgbGFicyh4PSJPdXRjb21lcyBvZiBCZWNoZGVsIFRlc3QiLAogICAgICAgeT0iTWV0YXNjb3JlIiwKICAgICAgIHRpdGxlPSJCZWNoZGVsIFRlc3QgT3V0Y29tZXMgYW5kIE1ldGFzY29yZSBvZiBNb3ZpZXMgKDE5NzAgdG8gMjAxMykiLAogICAgICAgY2FwdGlvbj0iRGF0YSBmcm9tIEZpdmVUaGlydHlFaWdodCIpCmBgYAoKCmBgYHtyfQojIE91dGNvbWVzIGFuZCBEb21lc3RpYyBHcm9zcyAKbTEgPSBtCm0xJGRvbWdyb3NzXzIwMTM9IGFzLm51bWVyaWMobTEkZG9tZ3Jvc3NfMjAxMykKCnlsYWIgPSBjKDAsNTAwLDEwMDAsMTUwMCkKbTEgJT4lIAogIGZpbHRlcighaXMubmEoZG9tZ3Jvc3NfMjAxMykpICU+JQogIGZpbHRlcihiZXR3ZWVuKHllYXIsIDE5NzAsMjAyMCkpICU+JQogIG11dGF0ZShiaW5hcnk9IGlmZWxzZShiaW5hcnk9PSJGQUlMIiwiQmVjaGRlbCBUZXN0OiBGYWlsIiwiQmVjaGRlbCBUZXN0OiBQYXNzIikpICU+JQogIGdncGxvdChhZXMoeD1jbGVhbl90ZXN0LCB5PWRvbWdyb3NzXzIwMTMsIGNvbG9yPWNsZWFuX3Rlc3QpKSArIAogIGdlb21faGFsZl9wb2ludChzaXplPTAuOCwgYWxwaGE9MC41KSArIAogIGdlb21faGFsZl9ib3hwbG90KG91dGxpZXIuc2l6ZSA9IC0xKSArIAogICNnZW9tX2ppdHRlcihzaXplPTAuOCwgYWxwaGE9MC4yLCBjb2xvcj0ieWVsbG93IikgKyAKICAjZ2VvbV9ib3hwbG90KGZpbGw9TkEpICsgCiAgZmFjZXRfZ3JpZCh+YmluYXJ5LHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIsKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBhc3RlKHlsYWIsICJNIiksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IDEwXjYgKiB5bGFiCiAgKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI2Y3OWQ2NSIsIiNmNDg0NWYiLCIjZjI3MDU5IiwiI2YyNWM1NCIsIiMzMzY1OGEiKSkgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTkpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAjcGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwbG90IiwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKQogICAgICAgICkrCiAgbGFicyh4PSJPdXRjb21lIG9mIEJlY2hkZWwgVGVzdCIsCiAgICAgICB5PSJEb21lc3RpYyBncm9zcyAoaW4gbWlsbGlvbnMpIiwKICAgICAgIHRpdGxlPSJCZWNoZGVsIFRlc3QgT3V0Y29tZXMgYW5kIERvbWVzdGljIEdyb3NzIG9mIE1vdmllcyAoMTk3MCB0byAyMDEzKSIsCiAgICAgICBzdWJ0aXRsZT0gIkRvbWVzdGljIGdyb3NzIG5vcm1hbGlzZWQgdG8gMjAxMyBkb2xsYXJzIikKCmBgYAoKCgojIyMgQmVjaGRlbCB0ZXN0IHJhdGluZ3MgKDAtMykKCmBgYHtyfQpiICU+JSBncm91cF9ieShyYXRpbmcpICU+JSB0YWxseSgpICU+JSBtdXRhdGUocHJvcD1yb3VuZChuL3N1bShuKSwzKSkKYGBgCgoKYGBge3J9CmIgJT4lIAogIGZpbHRlcihiZXR3ZWVuKHllYXIsIDE5NzAsMjAyMCkpICU+JQogIGdyb3VwX2J5KHllYXIsIHJhdGluZykgJT4lCiAgdGFsbHkoKSAlPiUgbXV0YXRlKHByb3A9cm91bmQobi9zdW0obiksMykpICU+JQogIG11dGF0ZShyYXRpbmdfbG9uZyA9IGNhc2Vfd2hlbihyYXRpbmc9PTAgfiJVbnNjb3JlZCIsCiAgICAgICAgICAgICAgICAgICByYXRpbmc9PTEgfiJBdCBsZWFzdCB0d28gbmFtZWQgd29tZW4iLAogICAgICAgICAgICAgICAgICAgcmF0aW5nPT0yIH4iV29tZW4gdGFsayB0byBlYWNoIG90aGVyIiwKICAgICAgICAgICAgICAgICAgIHJhdGluZz09MyB+IkFib3V0IHNvbWV0aGluZyBiZXNpZGVzIGEgbWFuIgogICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9cHJvcCwgY29sb3I9IHJhdGluZ19sb25nKSkgKyAKICBnZW9tX3BvaW50KGtleV9nbHlwaCA9IGRyYXdfa2V5X3BvaW50LCBhbHBoYT0wLjgpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjYTgyMDFhIiwiIzBmOGI4ZCIsIiMxNDM2NDIiLCIjZWM5YTI5IikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArCiAgdGhlbWVfbGlnaHQoYmFzZV9zaXplPTEwKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIiwKICAgICAgICAjcGxvdC50aXRsZS5wb3NpdGlvbj0icGxvdCIsCiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249J2xlZnQnLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05KSwKICAgICAgICBsZWdlbmQubWFyZ2luPW1hcmdpbigwLDAsMCwwKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikKICAgICAgICApICsKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MixvdmVycmlkZS5hZXMgPSBsaXN0KHNoYXBlID0gMTUsIHNpemUgPTQpKSkgKyAKICBsYWJzKHg9IlllYXIiLHk9IlBlcmNlbnRhZ2UiLGNvbG9yPSJSYXRpbmciLAogICAgICAgdGl0bGU9IkJlY2hkZWwgVGVzdCBSYXRpbmdzIG9mIE1vdmllcyBmcm9tIDE5NzAgdG8gMjAyMCIsCiAgICAgICBjYXB0aW9uPSJEYXRhIGZyb20gRml2ZVRoaXJ0eUVpZ2h0IikKYGBgCgojIyMgTW92aWUgY291bnQgYnkgZ2VucmUKCmBgYHtyfQptPSBtICU+JSBmaWx0ZXIoIWlzLm5hKHR5cGUpKSAKbSAlPiUgCiAgc2VsZWN0KGltZGIsIGdlbnJlKSAlPiUgCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBnZW5yZSkgJT4lIAogIGZpbHRlcighaXMubmEod29yZCkpICU+JSAKICBncm91cF9ieSh3b3JkKSAlPiUgCiAgdGFsbHkoc29ydD1UKSAlPiUgCiAgZmlsdGVyKHdvcmQhPSJmaSIpICU+JSBtdXRhdGUod29yZD1pZmVsc2Uod29yZD09InNjaSIsInNjaS1maSIsd29yZCkpICU+JSAKICBnZ3Bsb3QoYWVzKHk9cmVvcmRlcih3b3JkLG4pLCB4PW4pKSArIAogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZSA9IDEwKSArIAogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSkgKwogIGxhYnMoeD0iQ291bnQiLAogICAgICAgeT0iR2VucmUiLAogICAgICAgdGl0bGU9Ik1vdmllcyBDb3VudCBieSBHZW5yZSIpCmBgYAoKCiMjIyBNZWRpYW4gSU1EQiByYXRpbmcgYW5kIG1ldGFzY2FyZQoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgbWVkaWFuIElNREIgcmF0aW5nIGFuZCBNZXRhc2NvcmUgCiMgcmVmZXJlbmNlOiBUb2JpYXMgU3RhbGRlciAoaHR0cHM6Ly90d2l0dGVyLmNvbS90b2ViMTgvc3RhdHVzLzEzNjkyNjU1Mjc3MTQxMDMyOTgvcGhvdG8vMSkKCm1fbWVkaWFuPSBtICU+JSAKICBzZWxlY3QoeWVhciwgYmluYXJ5LCBidWRnZXQsIG1ldGFzY29yZSwgaW1kYl9yYXRpbmcsIGdlbnJlLCB0eXBlKSU+JQogIGRyb3BfbmEoZ2VucmUsIG1ldGFzY29yZSwgYmluYXJ5LCBpbWRiX3JhdGluZywgdHlwZSkgJT4lIAogIGZpbHRlcih5ZWFyPj0xOTgwKSAlPiUKICBncm91cF9ieSh5ZWFyLCBiaW5hcnkpICU+JQogIHN1bW1hcmlzZShgTWV0YXNjb3JlYCA9IG1lZGlhbihtZXRhc2NvcmUpLAogICAgICAgICAgICBgSU1EQiBSYXRpbmdgID0gbWVkaWFuKGltZGJfcmF0aW5nKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHM9YE1ldGFzY29yZWA6YElNREIgUmF0aW5nYCwgdmFsdWVzX2Ryb3BfbmE9VFJVRSkgJT4lCiAgbXV0YXRlKGJpbmFyeT0gaWZlbHNlKGJpbmFyeT09IkZBSUwiLCJGYWlsIiwiUGFzcyIpKQoKZ2dwbG90KG1fbWVkaWFuLCBhZXMoeD15ZWFyLCB5PSB2YWx1ZSwgY29sb3I9YmluYXJ5KSkgKyAKICBnZ2J1bXA6Omdlb21fYnVtcChhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSwgY29sb3IgPSBiaW5hcnkpLCBzaG93LmxlZ2VuZCA9IFRSVUUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2I3MDk0YyIsIiMwMDkxYWQiKSkgKyAKICBmYWNldF93cmFwKH5uYW1lLCBzY2FsZXM9ImZyZWUiKSArIAogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZSA9IDEwKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gImxlZnQiLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05KSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yPSJ3aGl0ZSIsIGZhY2U9ImJvbGQiKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InNsYXRlZ3JleSIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSkgKyAKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2hhcGUgPSAxNSwgc2l6ZSA9NykpKSArIAogIGxhYnMoeD0iIix5PSIiLCBjb2xvcj0iQmVjaGRlbCBUZXN0IiwgdGl0bGU9Ik1lZGlhbiBJTURCIFJhdGluZyBhbmQgTWV0YXNjb3JlLCBieSBCZWNoZGVsIFRlc3QgT3V0Y29tZSIpCiAKYGBgCgojIyMgQnVkZ2V0LCBkb21lc3RpYyBncm9zcywgaW1kYiwgYmVjaGRlbCB0ZXN0CgpgYGB7ciwgd2FybmluZz1GQUxTRX0KIyBidWRnZXQsIGRvbWVzdGljIGdyb3NzLCBpbWRiLCBiZWNoZGVsIHRlc3QgKG1vdmllcyAxOTcwIHRvIDIwMTMpCiMgcmVmZXJlbmNlOiBTaGVyb3NoYSBSYWogKGh0dHBzOi8vdHdpdHRlci5jb20vU2hlcm9zaGFSL3N0YXR1cy8xMzY5NDU1NTgxNDIyMDkyMjg4L3Bob3RvLzEpCgpwMSA9IG0xICU+JQogIGZpbHRlcihidWRnZXQ+MTAwMDAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9YnVkZ2V0XzIwMTMvMTAwMDAwMCwgeT1kb21ncm9zc18yMDEzLzEwMDAwMDAsIGNvbG9yPWJpbmFyeSwgc2l6ZT1pbWRiX3ZvdGVzLzEwMDApKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNiNzA5NGMiLCIjMDA5MWFkIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBsYWJlbF9udW1iZXIoc3VmZml4PSJNIiksIHRyYW5zID0gImxvZzEwIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1sYWJlbF9udW1iZXIoc3VmZml4PSJNIiksIHRyYW5zID0gImxvZzEwIikgKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobGFiZWw9bGFiZWxfbnVtYmVyKHN1ZmZpeD0iSyIpKSArIAogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgZmFjZT0iYm9sZCIpLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT05LjUsIGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikpICsgCiAgbGFicyh4PSJCdWRnZXQgKGxvZykiLAogICAgICAgeT0iRG9tZXN0aWMgZ3Jvc3MgKGxvZykiLAogICAgICAgc2l6ZT0iSU1EQiB2b3RlcyIsCiAgICAgICBjb2xvcj0iQmVjaGRlbCBUZXN0IiwKICAgICAgIHN1YnRpdGxlPSJCdWRnZXQgYW5kIGRvbWVzdGljIGdyb3NzIG5vcm1hbGlzZWQgdG8gMjAxMyBkb2xsYXJzIiwKICAgICAgIHRpdGxlPSJNb3ZpZXMgZnJvbSAxOTcwIHRvIDIwMTMsIHdpdGggYnVkZ2V0IG92ZXIgMTAwIG1pbGxpb24iKSAKCmdnTWFyZ2luYWwocDEsIGdyb3VwQ29sb3VyID0gVCwgZ3JvdXBGaWxsID0gVCkgI3R5cGU9J2JveHBsb3QKYGBgCgojIyMgVG90YWwgZ3Jvc3MgcmV2ZW51ZSBieSBkZWNhZGUKCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQptMSA9IG0KbTEkZG9tZ3Jvc3NfMjAxMz0gYXMubnVtZXJpYyhtMSRkb21ncm9zc18yMDEzKQptMSRpbnRncm9zc18yMDEzPSBhcy5udW1lcmljKG0xJGludGdyb3NzXzIwMTMpCm0xJGludF9kb21fMjAxMyA9IG0xJGRvbWdyb3NzXzIwMTMgKyBtMSRpbnRncm9zc18yMDEzCgptMSAlPiUgCiAgbXV0YXRlKGRlY2FkZT0geWVhci0oeWVhciAlJSAxMCkpICU+JSAjIGdldCBkZWNhZGUgCiAgZ2dwbG90KGFlcyh4PWZhY3RvcihkZWNhZGUpLCB5PWludF9kb21fMjAxMy8xMDAwMDAwMDAwLCBjb2xvcj1iaW5hcnkpKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNiNzA5NGMiLCIjMDA5MWFkIikpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPWxhYmVsX251bWJlcihzdWZmaXg9IkIiKSkgKwogIHRoZW1lX2xpZ2h0KGJhc2Vfc2l6ZT0xMCkgKyAKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikpICsKICBsYWJzKHk9IlRvdGFsIEdyb3NzIiwKICAgICAgIHg9IkRlY2FkZSIsCiAgICAgICBjb2xvcj0iQmVjaGRlbCBUZXN0IiwgCiAgICAgICB0aXRsZT0iVG90YWwgR3Jvc3MgUmV2ZW51ZSAoRG9tZXN0aWMgYW5kIEludGVybmF0aW9uYWwpIiwKICAgICAgIHN1YnRpdGxlPSJNb3ZpZXMgZnJvbSAxOTcwIHRvIDIwMTMsIGdyb3NzIHZhbHVlcyBub3JtYWxpc2VkIHRvIDIwMTMgZG9sbGFycyIpCmBgYAoKIyMjIENvbnRlbnQgcmF0aW5nIGFuZCBiZWNoZGVsIHRlc3QgCgpgYGB7cn0KdGFibGUobSRyYXRlZCkKCm0gJT4lIAogIGZpbHRlcihyYXRlZCA9PSAiUiJ8IHJhdGVkID09IlBHLTEzIiB8IHJhdGVkID09ICJQRyIpICU+JSAKICBncm91cF9ieShyYXRlZCwgYmluYXJ5KSAlPiUgCiAgdGFsbHkoKSAlPiUKICBtdXRhdGUocGVyY2VudD1yb3VuZChuL3N1bShuKSw0KSkgJT4lCiAgbXV0YXRlKGJpbmFyeSA9IGlmZWxzZShiaW5hcnk9PSJGQUlMIiwiRmFpbCIsIlBhc3MiKSkgJT4lIAogIHJlbmFtZSgiQmVjaGRlbCBUZXN0IiA9ICJiaW5hcnkiLCAiUmF0ZWQiPSJyYXRlZCIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9Ik1vdmllcyAxOTcwIHRvIDIwMTMiLCBzdWJ0aXRsZT0gIkNvbnRlbnQgUmF0aW5nIGFuZCBCZWNoZGVsIFRlc3QgT3V0Y29tZSIpICU+JQogIGZtdF9wZXJjZW50KGNvbHVtbnM9dmFycyhwZXJjZW50KSkgJT4lCiAgI2RhdGFfY29sb3IoY29sdW1ucz12YXJzKFJhdGVkKSwKICAgICAgICAgICAgICNjb2xvcnM9c2NhbGVzOjpjb2xfZmFjdG9yKHBhbGV0dGU9YygiI2M5YWRhNyIsIiM5YThjOTgiLCIjNGE0ZTY5IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkb21haW49YygiUEciLCJQRy0xMyIsIlIiKSkpICU+JQogIGRhdGFfY29sb3IoY29sdW1uPXZhcnMocGVyY2VudCksCiAgICAgICAgICAgICBjb2xvcnM9c2NhbGVzOjpjb2xfbnVtZXJpYyhwYWxldHRlPWMoIiNkOWVkOTIiLCIjMzRhMGE0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW49YygwLjQxLDAuNTkpKSkKICAKYGBgCgojIyMgRG9tZXN0aWMgZ3Jvc3MgYnkgY29udGVudCByYXRpbmcgYW5kIGJlY2hkZWwgdGVzdAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9Cm0xICU+JQogIGZpbHRlcihyYXRlZCA9PSAiUiJ8IHJhdGVkID09IlBHLTEzIiB8IHJhdGVkID09ICJQRyIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmF0ZWQsIHk9ZG9tZ3Jvc3NfMjAxMy8xMDAwMDAwLCBjb2xvcj0gYmluYXJ5KSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjYjcwOTRjIiwiIzAwOTFhZCIpKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJEb21lc3RpYyBHcm9zcyIsIGxhYmVsPWxhYmVsX251bWJlcihzdWZmaXg9Ik0iKSkgKyAKICB0aGVtZV9saWdodChiYXNlX3NpemU9MTApICsgCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpKSArCiAgbGFicyh4PSJDb250ZW50IFJhdGluZyIsCiAgICAgICBjb2xvcj0iQmVjaGRlbCBUZXN0IiwgCiAgICAgICB0aXRsZT0iRG9tZXN0aWMgR3Jvc3MgYnkgQ29udGVudCBSYXRpbmcgYW5kIEJlY2hkZWwgVGVzdCBPdXRjb21lIiwKICAgICAgIHN1YnRpdGxlPSJNb3ZpZXMgZnJvbSAxOTcwIHRvIDIwMTMsIHZhbHVlcyBub3JtYWxpc2VkIHRvIDIwMTMgZG9sbGFycyIpCmBgYAoKCgoKCgo=