top_quotes_categorized_local <- read_sheet(ss="1Lx2nhdwdgJsxrn047Wnre1S3GsrQAQ1OFZ3UOwTVQfE",sheet="Top quoted Categorized") %>% 
  rename(group=`group 1`,subgroup=`group 1.1`) %>%
  mutate(group=if_else(!is.na(status) & status=="Pois","Pois",group),subgroup=if_else(!is.na(status) & status=="Pois","Pois",subgroup)) %>%
  mutate(subgroup=coalesce(subgroup,group)) %>%
  filter(!is.na(group))  
The googlesheets4 package is requesting access to your Google account.
Select a pre-authorised account or enter '0' to obtain a new token.
Press Esc/Ctrl + C to cancel.

1: jiemakel@gmail.com
1
Auto-refreshing stale OAuth token.
✔ Reading from Lainaukset ja valta -aineisto.
✔ Range ''Top quoted Categorized''.
random_quotes_categorized_local <- read_sheet(ss="1Lx2nhdwdgJsxrn047Wnre1S3GsrQAQ1OFZ3UOwTVQfE",sheet="random quotes") %>% 
  union_all(read_sheet(ss="1Lx2nhdwdgJsxrn047Wnre1S3GsrQAQ1OFZ3UOwTVQfE",sheet="random quotes 2")) %>%
  rename(group=`group 1`,subgroup=`group 1.1`) %>%
  mutate(group=if_else(!is.na(status) & status=="Pois","Pois",group),subgroup=if_else(!is.na(status) & status=="Pois","Pois",subgroup)) %>%
  mutate(subgroup=coalesce(subgroup,group)) %>%
  filter(!is.na(group))
✔ Reading from Lainaukset ja valta -aineisto.
✔ Range ''random quotes''.
✔ Reading from Lainaukset ja valta -aineisto.
✔ Range ''random quotes 2''.
top_quotes_categorized_a <- top_quotes_categorized_local %>%
  copy_to_a(con, unique_indexes=list(c("canonical_name","after","before")))

top_quotes_categorized_c <- top_quotes_categorized_a %>%
  compute_c()

random_quotes_categorized_a <- random_quotes_categorized_local %>%
  copy_to_a(con)

random_quotes_categorized_c <- random_quotes_categorized_a %>%
  compute_c()
yearly_quotes_local <- top_quotes_categorized_c %>%
  select(-c(indirect:canonical_joined_role_all)) %>%
  inner_join(quote_author_names_to_canonical_names_c) %>%
  inner_join(quote_authors_c) %>%
  inner_join(q_qa_c) %>%
  right_join(
    article_types_c %>% 
      filter(type=="Domestic general/political/economic news") %>% 
      inner_join(quotes_c)) %>%
  inner_join(articles_c) %>%
  filter(is.na(after) | year_created>=after, is.na(before) | year_created<before) %>%
  count(canonical_name,group,subgroup,direct,media,year_created) %>%
  ungroup() %>%
  collect() %>%
  mutate(direct=if_else(direct==1,"direct","indirect"))
Joining, by = "canonical_name"Joining, by = "name"Joining, by = "qa_id"Joining, by = "a_id"Joining, by = "q_id"Joining, by = "a_id"

Absolute view of quotes in domestic general/political/economic news

yearly_quotes_local %>%
  group_by(media,group,direct,year_created) %>%
  summarize(n=sum(n),.groups="drop") %>%
  ggplot(aes(x=year_created,y=n,fill=group)) +
  geom_col(width=1) + 
  facet_grid(media~direct) + 
  theme_hsci_discrete(base_family="Arial") +
  theme(legend.position = 'bottom')

Proportional view of quotes in domestic general/political/economic news

yearly_quotes_local %>%
  group_by(media,group,direct,year_created) %>%
  summarize(n=sum(n),.groups="drop") %>%
  ggplot(aes(x=year_created,y=n,fill=group)) +
  geom_col(position='fill',width=1) + 
  facet_grid(media~direct) + 
  theme_hsci_discrete(base_family="Arial") +
  theme(legend.position = 'bottom')

Proportions of quotes categorized in the different main categories in domestic general/political/economic news

yearly_quotes_local %>%
  group_by(media,group,direct,year_created) %>%
  summarize(n=sum(n),.groups="drop") %>%
  group_by(media,direct,year_created) %>%
  mutate(prop=n/sum(n)) %>%
  ungroup() %>%
  filter(!is.na(group)) %>%
  ggplot(aes(x=year_created,y=prop,color=group)) +
  geom_step() + 
  facet_grid(media~direct) + 
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position = 'bottom')

Proportions of quotes categorized in the different subcategories in domestic general/political/economic news

yearly_quotes_local %>%
  group_by(subgroup,media,direct,year_created) %>%
  summarize(n=sum(n),.groups="drop") %>%
  group_by(media,direct,year_created) %>%
  mutate(prop=n/sum(n)) %>%
  ungroup() %>%
  filter(!is.na(subgroup)) %>%
  ggplot(aes(x=year_created,y=prop,color=subgroup)) +
  geom_step() + 
  facet_grid(media~direct) + 
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position = 'bottom')

Proportions of quotes for top sources in domestic general/political/economic news

yearly_quotes_local %>%
  group_by(canonical_name,group,media,direct,year_created) %>%
  summarize(n=sum(n),.groups="drop") %>%
  group_by(media,direct,year_created) %>%
  mutate(prop=n/sum(n)) %>%
  ungroup() %>%
  filter(group!="Pois") %>%
  mutate(canonical_name=fct_lump_n(canonical_name,12,w=n)) %>%
  filter(canonical_name!="Other") %>%
  ggplot(aes(x=year_created,y=prop,color=canonical_name)) +
  geom_step() + 
  facet_grid(media~direct) + 
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position = 'bottom')

Overall proportions

d <- random_quotes_categorized_local %>%
  mutate(period=year(time_created)>=2009, direct=if_else(direct==0,"indirect","direct")) %>%
  count(group,media,direct,period) %>%
  group_by(media,direct,period) %>%
  group_modify(~bind_cols(.x,scimp_bmde(.x$n, p=1))) %>%
  mutate(prop=n/sum(n),rest=TRUE) %>%
  ungroup() %>%
  right_join(yearly_quotes_local %>%
    mutate(period=year_created>=2009) %>%
    group_by(group,media,direct,period) %>%
    summarize(n=sum(n),.groups="drop") %>%
    group_by(media,direct,period) %>%
    mutate(prop=n/sum(n)) %>%
    ungroup() %>%
    mutate(rest=is.na(group)),by=c("media","direct","period","rest")) %>%
  mutate(group=coalesce(group.x,group.y), prop=if_else(is.na(group.y),prop.y*prop.x,prop.y),upper_limit=if_else(is.na(group.y),prop.y*upper_limit,prop.y), lower_limit=if_else(is.na(group.y),prop.y*lower_limit,prop.y)) %>%
  group_by(media,direct,period,group) %>% 
  summarize(prop=sum(prop),upper_limit=sum(upper_limit),lower_limit=sum(lower_limit),.groups="drop") %>%
  filter(group!="Pois") %>%
  group_by(media,direct,period) %>%
  mutate(prop=prop/sum(prop), upper_limit=upper_limit/sum(upper_limit), lower_limit=lower_limit/sum(lower_limit)) %>%
  ungroup() %>%
  mutate(period=if_else(period==FALSE,"1999-2008","2009-2018"))

d2 <- random_quotes_categorized_local %>%
  mutate(period=year(time_created)>=2009, direct=if_else(direct==0,"indirect","direct")) %>%
  count(subgroup,media,direct,period) %>%
  group_by(media,direct,period) %>%
  group_modify(~bind_cols(.x,scimp_bmde(.x$n, p=1))) %>%
  mutate(prop=n/sum(n),rest=TRUE) %>%
  ungroup() %>%
  right_join(yearly_quotes_local %>%
    mutate(period=year_created>=2009) %>%
    group_by(subgroup,media,direct,period) %>%
    summarize(n=sum(n),.groups="drop") %>%
    group_by(media,direct,period) %>%
    mutate(prop=n/sum(n)) %>%
    ungroup() %>%
    mutate(rest=is.na(subgroup)),by=c("media","direct","period","rest")) %>%
  mutate(subgroup=coalesce(subgroup.x,subgroup.y), prop=if_else(is.na(subgroup.y),prop.y*prop.x,prop.y),upper_limit=if_else(is.na(subgroup.y),prop.y*upper_limit,prop.y), lower_limit=if_else(is.na(subgroup.y),prop.y*lower_limit,prop.y)) %>%
  group_by(media,direct,period,subgroup) %>% 
  summarize(prop=sum(prop),upper_limit=sum(upper_limit),lower_limit=sum(lower_limit),.groups="drop") %>%
  filter(subgroup!="Pois") %>%
  group_by(media,direct,period) %>%
  mutate(prop=prop/sum(prop), upper_limit=upper_limit/sum(upper_limit), lower_limit=lower_limit/sum(lower_limit)) %>%
  ungroup() %>%
  mutate(period=if_else(period==FALSE,"1999-2008","2009-2018"))

By group

d %>% 
  ggplot(aes(x=group,color=period)) +
  geom_point(aes(y=prop)) + 
  geom_errorbar(aes(ymin=lower_limit,ymax=upper_limit)) +
  facet_grid(media~direct) +
  coord_flip() +
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position="bottom") +
  xlab("Group") +
  ylab("Proportion")

d %>%
  ggplot(aes(x=group,group=media,color=media)) +
  geom_point(aes(y=prop),position=position_dodge(width=1)) + 
  geom_errorbar(aes(ymin=lower_limit,ymax=upper_limit),position=position_dodge(width=1)) +
  facet_grid(period~direct) +
  coord_flip() +
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position="bottom") +
  xlab("Group") +
  ylab("Proportion")

d %>%
  ggplot(aes(x=group,group=media,color=direct)) +
  geom_point(aes(y=prop),position=position_dodge(width=1)) + 
  geom_errorbar(aes(ymin=lower_limit,ymax=upper_limit),position=position_dodge(width=1)) +
  facet_grid(media~period) +
  coord_flip() +
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position="bottom") +
  xlab("Subgroup") +
  ylab("Proportion")

By subgroup

d2 %>% 
  ggplot(aes(x=subgroup,color=period)) +
  geom_point(aes(y=prop)) + 
  geom_errorbar(aes(ymin=lower_limit,ymax=upper_limit)) +
  facet_grid(media~direct) +
  coord_flip() +
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position="bottom") +
  xlab("Subgroup") +
  ylab("Proportion")

d2 %>%
  ggplot(aes(x=subgroup,group=media,color=media)) +
  geom_point(aes(y=prop),position=position_dodge(width=1)) + 
  geom_errorbar(aes(ymin=lower_limit,ymax=upper_limit),position=position_dodge(width=1)) +
  facet_grid(period~direct) +
  coord_flip() +
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position="bottom") +
  xlab("Subgroup") +
  ylab("Proportion")

d2 %>%
  ggplot(aes(x=subgroup,group=media,color=direct)) +
  geom_point(aes(y=prop),position=position_dodge(width=1)) + 
  geom_errorbar(aes(ymin=lower_limit,ymax=upper_limit),position=position_dodge(width=1)) +
  facet_grid(media~period) +
  coord_flip() +
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
  theme(legend.position="bottom") +
  xlab("Subgroup") +
  ylab("Proportion")

LS0tCnRpdGxlOiAiUXVvdGF0aW9uIGFuYWx5c2lzIgphdXRob3I6ICJFZXR1IE3DpGtlbMOkIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKLS0tCgpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQpzb3VyY2UoaGVyZTo6aGVyZSgiY29kZS9jb21tb25fYmFzaXMuUiIpLCBsb2NhbCA9IGtuaXRyOjprbml0X2dsb2JhbCgpKQpgYGAKCmBgYHtyfQp0b3BfcXVvdGVzX2NhdGVnb3JpemVkX2xvY2FsIDwtIHJlYWRfc2hlZXQoc3M9IjFMeDJuaGR3ZGdKc3hybjA0N1ducmUxUzNHc3JRQVExT0ZaM1VPd1RWUWZFIixzaGVldD0iVG9wIHF1b3RlZCBDYXRlZ29yaXplZCIpICU+JSAKICByZW5hbWUoZ3JvdXA9YGdyb3VwIDFgLHN1Ymdyb3VwPWBncm91cCAxLjFgKSAlPiUKICBtdXRhdGUoZ3JvdXA9aWZfZWxzZSghaXMubmEoc3RhdHVzKSAmIHN0YXR1cz09IlBvaXMiLCJQb2lzIixncm91cCksc3ViZ3JvdXA9aWZfZWxzZSghaXMubmEoc3RhdHVzKSAmIHN0YXR1cz09IlBvaXMiLCJQb2lzIixzdWJncm91cCkpICU+JQogIG11dGF0ZShzdWJncm91cD1jb2FsZXNjZShzdWJncm91cCxncm91cCkpICU+JQogIGZpbHRlcighaXMubmEoZ3JvdXApKSAgCnJhbmRvbV9xdW90ZXNfY2F0ZWdvcml6ZWRfbG9jYWwgPC0gcmVhZF9zaGVldChzcz0iMUx4Mm5oZHdkZ0pzeHJuMDQ3V25yZTFTM0dzclFBUTFPRlozVU93VFZRZkUiLHNoZWV0PSJyYW5kb20gcXVvdGVzIikgJT4lIAogIHVuaW9uX2FsbChyZWFkX3NoZWV0KHNzPSIxTHgybmhkd2RnSnN4cm4wNDdXbnJlMVMzR3NyUUFRMU9GWjNVT3dUVlFmRSIsc2hlZXQ9InJhbmRvbSBxdW90ZXMgMiIpKSAlPiUKICByZW5hbWUoZ3JvdXA9YGdyb3VwIDFgLHN1Ymdyb3VwPWBncm91cCAxLjFgKSAlPiUKICBtdXRhdGUoZ3JvdXA9aWZfZWxzZSghaXMubmEoc3RhdHVzKSAmIHN0YXR1cz09IlBvaXMiLCJQb2lzIixncm91cCksc3ViZ3JvdXA9aWZfZWxzZSghaXMubmEoc3RhdHVzKSAmIHN0YXR1cz09IlBvaXMiLCJQb2lzIixzdWJncm91cCkpICU+JQogIG11dGF0ZShzdWJncm91cD1jb2FsZXNjZShzdWJncm91cCxncm91cCkpICU+JQogIGZpbHRlcighaXMubmEoZ3JvdXApKQpgYGAKCmBgYHtyfQp0b3BfcXVvdGVzX2NhdGVnb3JpemVkX2EgPC0gdG9wX3F1b3Rlc19jYXRlZ29yaXplZF9sb2NhbCAlPiUKICBjb3B5X3RvX2EoY29uLCB1bmlxdWVfaW5kZXhlcz1saXN0KGMoImNhbm9uaWNhbF9uYW1lIiwiYWZ0ZXIiLCJiZWZvcmUiKSkpCgp0b3BfcXVvdGVzX2NhdGVnb3JpemVkX2MgPC0gdG9wX3F1b3Rlc19jYXRlZ29yaXplZF9hICU+JQogIGNvbXB1dGVfYygpCgpyYW5kb21fcXVvdGVzX2NhdGVnb3JpemVkX2EgPC0gcmFuZG9tX3F1b3Rlc19jYXRlZ29yaXplZF9sb2NhbCAlPiUKICBjb3B5X3RvX2EoY29uKQoKcmFuZG9tX3F1b3Rlc19jYXRlZ29yaXplZF9jIDwtIHJhbmRvbV9xdW90ZXNfY2F0ZWdvcml6ZWRfYSAlPiUKICBjb21wdXRlX2MoKQpgYGAKCgpgYGB7cn0KeWVhcmx5X3F1b3Rlc19sb2NhbCA8LSB0b3BfcXVvdGVzX2NhdGVnb3JpemVkX2MgJT4lCiAgc2VsZWN0KC1jKGluZGlyZWN0OmNhbm9uaWNhbF9qb2luZWRfcm9sZV9hbGwpKSAlPiUKICBpbm5lcl9qb2luKHF1b3RlX2F1dGhvcl9uYW1lc190b19jYW5vbmljYWxfbmFtZXNfYykgJT4lCiAgaW5uZXJfam9pbihxdW90ZV9hdXRob3JzX2MpICU+JQogIGlubmVyX2pvaW4ocV9xYV9jKSAlPiUKICByaWdodF9qb2luKAogICAgYXJ0aWNsZV90eXBlc19jICU+JSAKICAgICAgZmlsdGVyKHR5cGU9PSJEb21lc3RpYyBnZW5lcmFsL3BvbGl0aWNhbC9lY29ub21pYyBuZXdzIikgJT4lIAogICAgICBpbm5lcl9qb2luKHF1b3Rlc19jKSkgJT4lCiAgaW5uZXJfam9pbihhcnRpY2xlc19jKSAlPiUKICBmaWx0ZXIoaXMubmEoYWZ0ZXIpIHwgeWVhcl9jcmVhdGVkPj1hZnRlciwgaXMubmEoYmVmb3JlKSB8IHllYXJfY3JlYXRlZDxiZWZvcmUpICU+JQogIGNvdW50KGNhbm9uaWNhbF9uYW1lLGdyb3VwLHN1Ymdyb3VwLGRpcmVjdCxtZWRpYSx5ZWFyX2NyZWF0ZWQpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBjb2xsZWN0KCkgJT4lCiAgbXV0YXRlKGRpcmVjdD1pZl9lbHNlKGRpcmVjdD09MSwiZGlyZWN0IiwiaW5kaXJlY3QiKSkKYGBgCgojIEFic29sdXRlIHZpZXcgb2YgcXVvdGVzIGluIGRvbWVzdGljIGdlbmVyYWwvcG9saXRpY2FsL2Vjb25vbWljIG5ld3MKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NX0KeWVhcmx5X3F1b3Rlc19sb2NhbCAlPiUKICBncm91cF9ieShtZWRpYSxncm91cCxkaXJlY3QseWVhcl9jcmVhdGVkKSAlPiUKICBzdW1tYXJpemUobj1zdW0obiksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdncGxvdChhZXMoeD15ZWFyX2NyZWF0ZWQseT1uLGZpbGw9Z3JvdXApKSArCiAgZ2VvbV9jb2wod2lkdGg9MSkgKyAKICBmYWNldF9ncmlkKG1lZGlhfmRpcmVjdCkgKyAKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgojIFByb3BvcnRpb25hbCB2aWV3IG9mIHF1b3RlcyBpbiBkb21lc3RpYyBnZW5lcmFsL3BvbGl0aWNhbC9lY29ub21pYyBuZXdzCgpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTV9CnllYXJseV9xdW90ZXNfbG9jYWwgJT4lCiAgZ3JvdXBfYnkobWVkaWEsZ3JvdXAsZGlyZWN0LHllYXJfY3JlYXRlZCkgJT4lCiAgc3VtbWFyaXplKG49c3VtKG4pLC5ncm91cHM9ImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhcl9jcmVhdGVkLHk9bixmaWxsPWdyb3VwKSkgKwogIGdlb21fY29sKHBvc2l0aW9uPSdmaWxsJyx3aWR0aD0xKSArIAogIGZhY2V0X2dyaWQobWVkaWF+ZGlyZWN0KSArIAogIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCiMgUHJvcG9ydGlvbnMgb2YgcXVvdGVzIGNhdGVnb3JpemVkIGluIHRoZSBkaWZmZXJlbnQgbWFpbiBjYXRlZ29yaWVzIGluIGRvbWVzdGljIGdlbmVyYWwvcG9saXRpY2FsL2Vjb25vbWljIG5ld3MKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NX0KeWVhcmx5X3F1b3Rlc19sb2NhbCAlPiUKICBncm91cF9ieShtZWRpYSxncm91cCxkaXJlY3QseWVhcl9jcmVhdGVkKSAlPiUKICBzdW1tYXJpemUobj1zdW0obiksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdyb3VwX2J5KG1lZGlhLGRpcmVjdCx5ZWFyX2NyZWF0ZWQpICU+JQogIG11dGF0ZShwcm9wPW4vc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKCFpcy5uYShncm91cCkpICU+JQogIGdncGxvdChhZXMoeD15ZWFyX2NyZWF0ZWQseT1wcm9wLGNvbG9yPWdyb3VwKSkgKwogIGdlb21fc3RlcCgpICsgCiAgZmFjZXRfZ3JpZChtZWRpYX5kaXJlY3QpICsgCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKIyBQcm9wb3J0aW9ucyBvZiBxdW90ZXMgY2F0ZWdvcml6ZWQgaW4gdGhlIGRpZmZlcmVudCBzdWJjYXRlZ29yaWVzIGluIGRvbWVzdGljIGdlbmVyYWwvcG9saXRpY2FsL2Vjb25vbWljIG5ld3MKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NX0KeWVhcmx5X3F1b3Rlc19sb2NhbCAlPiUKICBncm91cF9ieShzdWJncm91cCxtZWRpYSxkaXJlY3QseWVhcl9jcmVhdGVkKSAlPiUKICBzdW1tYXJpemUobj1zdW0obiksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdyb3VwX2J5KG1lZGlhLGRpcmVjdCx5ZWFyX2NyZWF0ZWQpICU+JQogIG11dGF0ZShwcm9wPW4vc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKCFpcy5uYShzdWJncm91cCkpICU+JQogIGdncGxvdChhZXMoeD15ZWFyX2NyZWF0ZWQseT1wcm9wLGNvbG9yPXN1Ymdyb3VwKSkgKwogIGdlb21fc3RlcCgpICsgCiAgZmFjZXRfZ3JpZChtZWRpYX5kaXJlY3QpICsgCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKIyBQcm9wb3J0aW9ucyBvZiBxdW90ZXMgZm9yIHRvcCBzb3VyY2VzIGluIGRvbWVzdGljIGdlbmVyYWwvcG9saXRpY2FsL2Vjb25vbWljIG5ld3MKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NX0KeWVhcmx5X3F1b3Rlc19sb2NhbCAlPiUKICBncm91cF9ieShjYW5vbmljYWxfbmFtZSxncm91cCxtZWRpYSxkaXJlY3QseWVhcl9jcmVhdGVkKSAlPiUKICBzdW1tYXJpemUobj1zdW0obiksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdyb3VwX2J5KG1lZGlhLGRpcmVjdCx5ZWFyX2NyZWF0ZWQpICU+JQogIG11dGF0ZShwcm9wPW4vc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKGdyb3VwIT0iUG9pcyIpICU+JQogIG11dGF0ZShjYW5vbmljYWxfbmFtZT1mY3RfbHVtcF9uKGNhbm9uaWNhbF9uYW1lLDEyLHc9bikpICU+JQogIGZpbHRlcihjYW5vbmljYWxfbmFtZSE9Ik90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXJfY3JlYXRlZCx5PXByb3AsY29sb3I9Y2Fub25pY2FsX25hbWUpKSArCiAgZ2VvbV9zdGVwKCkgKyAKICBmYWNldF9ncmlkKG1lZGlhfmRpcmVjdCkgKyAKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgojIE92ZXJhbGwgcHJvcG9ydGlvbnMKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NX0KZCA8LSByYW5kb21fcXVvdGVzX2NhdGVnb3JpemVkX2xvY2FsICU+JQogIG11dGF0ZShwZXJpb2Q9eWVhcih0aW1lX2NyZWF0ZWQpPj0yMDA5LCBkaXJlY3Q9aWZfZWxzZShkaXJlY3Q9PTAsImluZGlyZWN0IiwiZGlyZWN0IikpICU+JQogIGNvdW50KGdyb3VwLG1lZGlhLGRpcmVjdCxwZXJpb2QpICU+JQogIGdyb3VwX2J5KG1lZGlhLGRpcmVjdCxwZXJpb2QpICU+JQogIGdyb3VwX21vZGlmeSh+YmluZF9jb2xzKC54LHNjaW1wX2JtZGUoLngkbiwgcD0xKSkpICU+JQogIG11dGF0ZShwcm9wPW4vc3VtKG4pLHJlc3Q9VFJVRSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHJpZ2h0X2pvaW4oeWVhcmx5X3F1b3Rlc19sb2NhbCAlPiUKICAgIG11dGF0ZShwZXJpb2Q9eWVhcl9jcmVhdGVkPj0yMDA5KSAlPiUKICAgIGdyb3VwX2J5KGdyb3VwLG1lZGlhLGRpcmVjdCxwZXJpb2QpICU+JQogICAgc3VtbWFyaXplKG49c3VtKG4pLC5ncm91cHM9ImRyb3AiKSAlPiUKICAgIGdyb3VwX2J5KG1lZGlhLGRpcmVjdCxwZXJpb2QpICU+JQogICAgbXV0YXRlKHByb3A9bi9zdW0obikpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgbXV0YXRlKHJlc3Q9aXMubmEoZ3JvdXApKSxieT1jKCJtZWRpYSIsImRpcmVjdCIsInBlcmlvZCIsInJlc3QiKSkgJT4lCiAgbXV0YXRlKGdyb3VwPWNvYWxlc2NlKGdyb3VwLngsZ3JvdXAueSksIHByb3A9aWZfZWxzZShpcy5uYShncm91cC55KSxwcm9wLnkqcHJvcC54LHByb3AueSksdXBwZXJfbGltaXQ9aWZfZWxzZShpcy5uYShncm91cC55KSxwcm9wLnkqdXBwZXJfbGltaXQscHJvcC55KSwgbG93ZXJfbGltaXQ9aWZfZWxzZShpcy5uYShncm91cC55KSxwcm9wLnkqbG93ZXJfbGltaXQscHJvcC55KSkgJT4lCiAgZ3JvdXBfYnkobWVkaWEsZGlyZWN0LHBlcmlvZCxncm91cCkgJT4lIAogIHN1bW1hcml6ZShwcm9wPXN1bShwcm9wKSx1cHBlcl9saW1pdD1zdW0odXBwZXJfbGltaXQpLGxvd2VyX2xpbWl0PXN1bShsb3dlcl9saW1pdCksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGZpbHRlcihncm91cCE9IlBvaXMiKSAlPiUKICBncm91cF9ieShtZWRpYSxkaXJlY3QscGVyaW9kKSAlPiUKICBtdXRhdGUocHJvcD1wcm9wL3N1bShwcm9wKSwgdXBwZXJfbGltaXQ9dXBwZXJfbGltaXQvc3VtKHVwcGVyX2xpbWl0KSwgbG93ZXJfbGltaXQ9bG93ZXJfbGltaXQvc3VtKGxvd2VyX2xpbWl0KSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShwZXJpb2Q9aWZfZWxzZShwZXJpb2Q9PUZBTFNFLCIxOTk5LTIwMDgiLCIyMDA5LTIwMTgiKSkKCmQyIDwtIHJhbmRvbV9xdW90ZXNfY2F0ZWdvcml6ZWRfbG9jYWwgJT4lCiAgbXV0YXRlKHBlcmlvZD15ZWFyKHRpbWVfY3JlYXRlZCk+PTIwMDksIGRpcmVjdD1pZl9lbHNlKGRpcmVjdD09MCwiaW5kaXJlY3QiLCJkaXJlY3QiKSkgJT4lCiAgY291bnQoc3ViZ3JvdXAsbWVkaWEsZGlyZWN0LHBlcmlvZCkgJT4lCiAgZ3JvdXBfYnkobWVkaWEsZGlyZWN0LHBlcmlvZCkgJT4lCiAgZ3JvdXBfbW9kaWZ5KH5iaW5kX2NvbHMoLngsc2NpbXBfYm1kZSgueCRuLCBwPTEpKSkgJT4lCiAgbXV0YXRlKHByb3A9bi9zdW0obikscmVzdD1UUlVFKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcmlnaHRfam9pbih5ZWFybHlfcXVvdGVzX2xvY2FsICU+JQogICAgbXV0YXRlKHBlcmlvZD15ZWFyX2NyZWF0ZWQ+PTIwMDkpICU+JQogICAgZ3JvdXBfYnkoc3ViZ3JvdXAsbWVkaWEsZGlyZWN0LHBlcmlvZCkgJT4lCiAgICBzdW1tYXJpemUobj1zdW0obiksLmdyb3Vwcz0iZHJvcCIpICU+JQogICAgZ3JvdXBfYnkobWVkaWEsZGlyZWN0LHBlcmlvZCkgJT4lCiAgICBtdXRhdGUocHJvcD1uL3N1bShuKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBtdXRhdGUocmVzdD1pcy5uYShzdWJncm91cCkpLGJ5PWMoIm1lZGlhIiwiZGlyZWN0IiwicGVyaW9kIiwicmVzdCIpKSAlPiUKICBtdXRhdGUoc3ViZ3JvdXA9Y29hbGVzY2Uoc3ViZ3JvdXAueCxzdWJncm91cC55KSwgcHJvcD1pZl9lbHNlKGlzLm5hKHN1Ymdyb3VwLnkpLHByb3AueSpwcm9wLngscHJvcC55KSx1cHBlcl9saW1pdD1pZl9lbHNlKGlzLm5hKHN1Ymdyb3VwLnkpLHByb3AueSp1cHBlcl9saW1pdCxwcm9wLnkpLCBsb3dlcl9saW1pdD1pZl9lbHNlKGlzLm5hKHN1Ymdyb3VwLnkpLHByb3AueSpsb3dlcl9saW1pdCxwcm9wLnkpKSAlPiUKICBncm91cF9ieShtZWRpYSxkaXJlY3QscGVyaW9kLHN1Ymdyb3VwKSAlPiUgCiAgc3VtbWFyaXplKHByb3A9c3VtKHByb3ApLHVwcGVyX2xpbWl0PXN1bSh1cHBlcl9saW1pdCksbG93ZXJfbGltaXQ9c3VtKGxvd2VyX2xpbWl0KSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgZmlsdGVyKHN1Ymdyb3VwIT0iUG9pcyIpICU+JQogIGdyb3VwX2J5KG1lZGlhLGRpcmVjdCxwZXJpb2QpICU+JQogIG11dGF0ZShwcm9wPXByb3Avc3VtKHByb3ApLCB1cHBlcl9saW1pdD11cHBlcl9saW1pdC9zdW0odXBwZXJfbGltaXQpLCBsb3dlcl9saW1pdD1sb3dlcl9saW1pdC9zdW0obG93ZXJfbGltaXQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHBlcmlvZD1pZl9lbHNlKHBlcmlvZD09RkFMU0UsIjE5OTktMjAwOCIsIjIwMDktMjAxOCIpKQpgYGAKCiMjIEJ5IGdyb3VwCgpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTV9CmQgJT4lIAogIGdncGxvdChhZXMoeD1ncm91cCxjb2xvcj1wZXJpb2QpKSArCiAgZ2VvbV9wb2ludChhZXMoeT1wcm9wKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxvd2VyX2xpbWl0LHltYXg9dXBwZXJfbGltaXQpKSArCiAgZmFjZXRfZ3JpZChtZWRpYX5kaXJlY3QpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHhsYWIoIkdyb3VwIikgKwogIHlsYWIoIlByb3BvcnRpb24iKQoKYGBgCgpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTV9CmQgJT4lCiAgZ2dwbG90KGFlcyh4PWdyb3VwLGdyb3VwPW1lZGlhLGNvbG9yPW1lZGlhKSkgKwogIGdlb21fcG9pbnQoYWVzKHk9cHJvcCkscG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sb3dlcl9saW1pdCx5bWF4PXVwcGVyX2xpbWl0KSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKwogIGZhY2V0X2dyaWQocGVyaW9kfmRpcmVjdCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgeGxhYigiR3JvdXAiKSArCiAgeWxhYigiUHJvcG9ydGlvbiIpCgpgYGAKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9MTF9CmQgJT4lCiAgZ2dwbG90KGFlcyh4PWdyb3VwLGdyb3VwPW1lZGlhLGNvbG9yPWRpcmVjdCkpICsKICBnZW9tX3BvaW50KGFlcyh5PXByb3ApLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTEpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG93ZXJfbGltaXQseW1heD11cHBlcl9saW1pdCkscG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsKICBmYWNldF9ncmlkKG1lZGlhfnBlcmlvZCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgeGxhYigiU3ViZ3JvdXAiKSArCiAgeWxhYigiUHJvcG9ydGlvbiIpCmBgYAoKIyMgQnkgc3ViZ3JvdXAKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9MTF9CmQyICU+JSAKICBnZ3Bsb3QoYWVzKHg9c3ViZ3JvdXAsY29sb3I9cGVyaW9kKSkgKwogIGdlb21fcG9pbnQoYWVzKHk9cHJvcCkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sb3dlcl9saW1pdCx5bWF4PXVwcGVyX2xpbWl0KSkgKwogIGZhY2V0X2dyaWQobWVkaWF+ZGlyZWN0KSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICB4bGFiKCJTdWJncm91cCIpICsKICB5bGFiKCJQcm9wb3J0aW9uIikKCmBgYAoKYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD0xMX0KZDIgJT4lCiAgZ2dwbG90KGFlcyh4PXN1Ymdyb3VwLGdyb3VwPW1lZGlhLGNvbG9yPW1lZGlhKSkgKwogIGdlb21fcG9pbnQoYWVzKHk9cHJvcCkscG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sb3dlcl9saW1pdCx5bWF4PXVwcGVyX2xpbWl0KSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0xKSkgKwogIGZhY2V0X2dyaWQocGVyaW9kfmRpcmVjdCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgeGxhYigiU3ViZ3JvdXAiKSArCiAgeWxhYigiUHJvcG9ydGlvbiIpCgpgYGAKYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD0xMX0KZDIgJT4lCiAgZ2dwbG90KGFlcyh4PXN1Ymdyb3VwLGdyb3VwPW1lZGlhLGNvbG9yPWRpcmVjdCkpICsKICBnZW9tX3BvaW50KGFlcyh5PXByb3ApLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTEpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bG93ZXJfbGltaXQseW1heD11cHBlcl9saW1pdCkscG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MSkpICsKICBmYWNldF9ncmlkKG1lZGlhfnBlcmlvZCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgeGxhYigiU3ViZ3JvdXAiKSArCiAgeWxhYigiUHJvcG9ydGlvbiIpCmBgYA==