[Fonte dos dados]:
https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_time_series
http://www.citypopulation.de/en/china/cities/hubei/
https://www.worldometers.info/coronavirus/#countries
https://www.worldometers.info/geography/countries-of-the-world/
https://www.worldometers.info/world-population/population-by-region/
#variáveis
#Brazil_c China_c France_c Germany_c Iran_c Italy_c Korea_South_c Spain_c Switzerland_c United_Kingdom_c US_c Brazil_c_1Mpop China_c_1Mpop France_c_1Mpop Germany_c_1Mpop Iran_c_1Mpop Italy_c_1Mpop Korea_South_c_1Mpop Spain_c_1Mpop Switzerland_c_1Mpop United_Kingdom_c_1Mpop US_c_1Mpop Brazil_c_ac China_c_ac France_c_ac Germany_c_ac Iran_c_ac Italy_c_ac Korea_South_c_ac Spain_c_ac Switzerland_c_ac United_Kingdom_c_ac US_c_ac Brazil_c_d China_c_d France_c_d Germany_c_d Iran_c_d Italy_c_d Korea_South_c_d Spain_c_d Switzerland_c_d United_Kingdom_c_d US_c_d Brazil_m China_m France_m Germany_m Iran_m Italy_m Korea_South_m Spain_m Switzerland_m United_Kingdom_m US_m Brazil_m_1Mpop China_m_1Mpop France_m_1Mpop Germany_m_1Mpop Iran_m_1Mpop Italy_m_1Mpop Korea_South_m_1Mpop Spain_m_1Mpop Switzerland_m_1Mpop United_Kingdom_m_1Mpop US_m_1Mpop Brazil_m_ac China_m_ac France_m_ac Germany_m_ac Iran_m_ac Italy_m_ac Korea_South_m_ac Spain_m_ac Switzerland_m_ac United_Kingdom_m_ac US_m_ac Brazil_m_d China_m_d France_m_d Germany_m_d Iran_m_d Italy_m_d Korea_South_m_d Spain_m_d Switzerland_m_d United_Kingdom_m_d US_m_d
#Legenda:
# _c confirmado
# _c_ac confirmado acumulado
# _m morte
# _m_ac morte acumulada
# _c_d confirmado/densidade
# _m_d morte/densidade
# _c_1Mpop confirmado acumulado por M de hab (omiti _ac para preservar o tamanho da variável)
# _m_1Mpop morte acumulada por M de hab (omiti _ac para preservar o tamanho da variável)
# _cd_1Mpop confirmado por dia por M de hab
# Roteiro:
# 1) Top 10 + Brasil
# 2) Graf Novos casos por dia e Mortos por dia
# 3) Matriz
# a) Faixa etária? (idade média)
# b) densidade demog.
# c) início do isolamento social
# d) primeiro caso de corona confirmado
library(tidyverse)
library(readr)
library(scales)
library(ggthemes)
library(reshape2)
library(readxl)
covid <- read_excel("covid19.xlsx", sheet = "r")
#covid %>% slice(86) %>% select(contains("_ac"))
# Bases The Center for Systems Science and Engineering (CSSE) at Johns Hopkins University - Baltimore, MD
covid19_confirmed_global
covid19_deaths_global
Casos Confirmados
# Brazil_c China_c France_c Germany_c Iran_c Italy_c Korea_South_c Spain_c Switzerland_c United_Kingdom_c US_c
ggplot(covid, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) +
theme_bw(base_size = 14,)+ theme(legend.position = "bottom")+
ylab("covid19 - Casos Confirmados") + xlab("dia")+
geom_point(aes(y = Brazil_c, color = "Brazil_c"), size=3)+
geom_line(aes(y = China_c, color = "China_c"), size=1)+
# geom_line(aes(y = France_c, color = "France_c"))+
# geom_line(aes(y = Germany_c, color = "Germany_c"))+
# geom_line(aes(y = Iran_c, color = "Iran_c"))+
geom_line(aes(y = Italy_c, color = "Italy_c"), size=1)+
geom_line(aes(y = Korea_South_c, color = "Korea_South_c"), size=1)+
geom_line(aes(y = Spain_c, color = "Spain_c"), size=1)+
# geom_line(aes(y = Switzerland_c, color = "Switzerland_c"))+
# geom_line(aes(y = United_Kingdom_c, color = "United_Kingdom_c"))+
geom_line(aes(y = US_c, color = "US_c"), size=1)+
scale_x_date(date_labels = "%d-%b-%Y")

NA
NA
NA
NA
Mortes
ggplot(covid, aes(as.Date(Data)))+
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Mortes") + xlab("dia")+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_m, colour = "Brazil_m"), size=2)+
geom_line(aes(y = China_m, colour = "China_m"), size=1)+
# geom_line(aes(y = France_m, colour = "France_m"))+
# geom_line(aes(y = Germany_m, colour = "Germany_m"))+
# geom_line(aes(y = Iran_m, colour = "Iran_m"))+
geom_line(aes(y = Italy_m, colour = "Italy_m"), size=1)+
geom_line(aes(y = Korea_South_m, colour = "Korea_South_m"), size=1)+
geom_line(aes(y = Spain_m, colour = "Spain_m"), size=1)+
# geom_line(aes(y = Switzerland_m, colour = "Switzerland_m"))+
# geom_line(aes(y = United_Kingdom_m, colour = "United_Kingdom_m"))+
geom_line(aes(y = US_m, colour = "US_m"), size=1)+
scale_x_date(date_labels = "%d-%b-%Y")

Casos confirmados (acumulado) por M hab
# Brazil_c_1Mpop China_c_1Mpop France_c_1Mpop Germany_c_1Mpop Iran_c_1Mpop Italy_c_1Mpop Korea_South_c_1Mpop Spain_c_1Mpop Switzerland_c_1Mpop United_Kingdom_c_1Mpop US_c_1Mpop
ggplot(covid, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Casos confirmados (acumulado) por M hab") + xlab("dia")+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_c_1Mpop, colour = "Brazil_c_1Mpop"), size=2)+
geom_line(aes(y = China_c_1Mpop, colour = "China_c_1Mpop"), size=1)+
# geom_line(aes(y = France_c_1Mpop, colour = "France_c_1Mpop"))+
# geom_line(aes(y = Germany_c_1Mpop, colour = "Germany_c_1Mpop"))+
# geom_line(aes(y = Iran_c_1Mpop, colour = "Iran_c_1Mpop"))+
geom_line(aes(y = Italy_c_1Mpop, colour = "Italy_c_1Mpop"), size=1)+
geom_line(aes(y = Korea_South_c_1Mpop, colour = "Korea_South_c_1Mpop"), size=1)+
geom_line(aes(y = Spain_c_1Mpop, colour = "Spain_c_1Mpop"), size=1)+
# geom_line(aes(y = Switzerland_c_1Mpop, colour = "Switzerland_c_1Mpop"))+
# geom_line(aes(y = United_Kingdom_c_1Mpop, colour = "United_Kingdom_c_1Mpop"))+
geom_line(aes(y = US_c_1Mpop, colour = "US_c_1Mpop"), size=1)+
scale_x_date(date_labels = "%d-%b-%Y")

Casos confirmados (acumulado)
# Brazil_c_ac China_c_ac France_c_ac Germany_c_ac Iran_c_ac Italy_c_ac Korea_South_c_ac Spain_c_ac Switzerland_c_ac United_Kingdom_c_ac US_c_ac
ggplot(covid, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + #scale_y_log10 () +
ylab("covid19 - Casos confirmados (acumulado)") + xlab("dia")+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_c_ac, colour = "Brazil_c_ac"), size=2)+
geom_line(aes(y = China_c_ac, colour = "China_c_ac"), size=1)+
# geom_line(aes(y = France_c_ac, colour = "France_c_ac"))+
# geom_line(aes(y = Germany_c_ac, colour = "Germany_c_ac"))+
# geom_line(aes(y = Iran_c_ac, colour = "Iran_c_ac"))+
geom_line(aes(y = Italy_c_ac, colour = "Italy_c_ac"), size=1)+
geom_line(aes(y = Korea_South_c_ac, colour = "Korea_South_c_ac"), size=1)+
geom_line(aes(y = Spain_c_ac, colour = "Spain_c_ac"), size=1)+
# geom_line(aes(y = Switzerland_c_ac, colour = "Switzerland_c_ac"))+
# geom_line(aes(y = United_Kingdom_c_ac, colour = "United_Kingdom_c_ac"))+
geom_line(aes(y = US_c_ac, colour = "US_c_ac"), size=1)+
scale_x_date(date_labels = "%d-%b-%Y")

Casos confirmados (acumulado) - a partir de março
# Brazil_c_ac China_c_ac France_c_ac Germany_c_ac Iran_c_ac Italy_c_ac Korea_South_c_ac Spain_c_ac Switzerland_c_ac United_Kingdom_c_ac US_c_ac
covid_s <- slice(covid, 40:1000)
ggplot(covid_s, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+# scale_y_log10 () +
ylab("covid19 - Casos confirmados (acumulado)") + xlab("dia")+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_c_ac, colour = "Brazil_c_ac"), size=3)+
geom_line(aes(y = China_c_ac, colour = "China_c_ac"), size=1)+
# geom_line(aes(y = France_c_ac, colour = "France_c_ac"), size=1)+
# geom_line(aes(y = Germany_c_ac, colour = "Germany_c_ac"), size=1)+
# geom_line(aes(y = Iran_c_ac, colour = "Iran_c_ac"), size=1)+
geom_line(aes(y = Italy_c_ac, colour = "Italy_c_ac"), size=1)+
geom_line(aes(y = Korea_South_c_ac, colour = "Korea_South_c_ac"), size=1)+
geom_line(aes(y = Spain_c_ac, colour = "Spain_c_ac"), size=1)+
# geom_line(aes(y = Switzerland_c_ac, colour = "Switzerland_c_ac"), size=1)+
# geom_line(aes(y = United_Kingdom_c_ac, colour = "United_Kingdom_c_ac"), size=1)+
geom_line(aes(y = US_c_ac, colour = "US_c_ac"), size=1)+
scale_x_date(date_labels = "%d-%b-%Y")

Casos Confirmados - a partir de março
# Brazil_c China_c France_c Germany_c Iran_c Italy_c Korea_South_c Spain_c Switzerland_c United_Kingdom_c US_c
ggplot(covid_s, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + theme_bw() +# scale_y_log10 () +
theme_bw(base_size = 14,)+ theme(legend.position = "bottom")+
ylab("covid19 - Casos Confirmados") + xlab("dia")+
geom_point(aes(y = Brazil_c, color = "Brazil_c"), size=3)+
geom_line(aes(y = China_c, color = "China_c"), size=1)+
# geom_line(aes(y = France_c, color = "France_c"), size=1)+
# geom_line(aes(y = Germany_c, color = "Germany_c"), size=1)+
# geom_line(aes(y = Iran_c, color = "Iran_c"), size=1)+
geom_line(aes(y = Italy_c, color = "Italy_c"), size=1)+
geom_line(aes(y = Korea_South_c, color = "Korea_South_c"), size=1)+
geom_line(aes(y = Spain_c, color = "Spain_c"), size=1)+
# geom_line(aes(y = Switzerland_c, color = "Switzerland_c"), size=1)+
# geom_line(aes(y = United_Kingdom_c, color = "United_Kingdom_c"), size=1)+
geom_line(aes(y = US_c, color = "US_c"), size=1)+
scale_x_date(date_labels = "%d-%b-%Y")

#ggplot(covid, aes(x=Data, y=Brazil_m)) + geom_point()+stat_smooth(method=loess) + theme_bw()
Casos confirmados (diário) por M hab - a partir de março
covid_d <- slice(covid, 40:1000)
ggplot(covid_d, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Casos confirmados (diário) por M Hab") + xlab("dia")+
theme_bw(base_size = 14)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_cd_1Mpop, colour = "Brazil_cd_1Mpop"), size=4, shape=1)+
geom_line(aes(y = China_cd_1Mpop, colour = "China_cd_1Mpop"), size=1)+
# geom_line(aes(y = France_cd_1Mpop, colour = "France_cd_1Mpop"), size=1)+
# geom_line(aes(y = Germany_cd_1Mpop, colour = "Germany_cd_1Mpop"), size=1)+
# geom_line(aes(y = Iran_cd_1Mpop, colour = "Iran_cd_1Mpop"), size=1)+
geom_line(aes(y = Italy_cd_1Mpop, colour = "Italy_cd_1Mpop"), size=1)+
geom_line(aes(y = Korea_South_cd_1Mpop, colour = "Korea_South_cd_1Mpop"), size=1)+
geom_line(aes(y = Spain_cd_1Mpop, colour = "Spain_cd_1Mpop"), size=1)+
# geom_line(aes(y = Switzerland_cd_1Mpop, colour = "Switzerland_cd_1Mpop"), size=1)+
# geom_line(aes(y = United_Kingdom_cd_1Mpop, colour = "United_Kingdom_cd_1Mpop"), size=1)+
geom_line(aes(y = US_cd_1Mpop, colour = "US_cd_1Mpop"), size=1)+
scale_x_date(date_labels = "%d-%b-%Y")

Morte acumulada por M de hab
# Brazil_m_1Mpop China_m_1Mpop France_m_1Mpop Germany_m_1Mpop Iran_m_1Mpop Italy_m_1Mpop Korea_South_m_1Mpop Spain_m_1Mpop Switzerland_m_1Mpop United_Kingdom_m_1Mpop US_m_1Mpop
ggplot(covid, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Morte acumulada por M de hab ") + xlab("dia")+
geom_point(aes(y = Brazil_m_1Mpop, colour = "Brazil_m_1Mpop"), size=1)+
geom_line(aes(y = China_m_1Mpop, colour = "China_m_1Mpop"), size=1)+
# geom_line(aes(y = France_m_1Mpop, colour = "France_m_1Mpop"))+
# geom_line(aes(y = Germany_m_1Mpop, colour = "Germany_m_1Mpop"))+
# geom_line(aes(y = Iran_m_1Mpop, colour = "Iran_m_1Mpop"))+
geom_line(aes(y = Italy_m_1Mpop, colour = "Italy_m_1Mpop"), size=1)+
geom_line(aes(y = Korea_South_m_1Mpop, colour = "Korea_South_m_1Mpop"), size=1)+
geom_line(aes(y = Spain_m_1Mpop, colour = "Spain_m_1Mpop"), size=1)+
# geom_line(aes(y = Switzerland_m_1Mpop, colour = "Switzerland_m_1Mpop"))+
# geom_line(aes(y = United_Kingdom_m_1Mpop, colour = "United_Kingdom_m_1Mpop"))+
geom_line(aes(y = US_m_1Mpop, colour = "US_m_1Mpop"), size=1)+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
scale_x_date(date_labels = "%d-%b-%Y")

Morte acumulada
# Brazil_m_ac China_m_ac France_m_ac Germany_m_ac Iran_m_ac Italy_m_ac Korea_South_m_ac Spain_m_ac Switzerland_m_ac United_Kingdom_m_ac US_m_ac
ggplot(covid, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Morte acumulada") + xlab("dia")+
geom_point(aes(y = Brazil_m_ac, colour = "Brazil_m_ac"), size=1)+
geom_line(aes(y = China_m_ac, colour = "China_m_ac"), size=1)+
# geom_line(aes(y = France_m_ac, colour = "France_m_ac"))+
# geom_line(aes(y = Germany_m_ac, colour = "Germany_m_ac"))+
# geom_line(aes(y = Iran_m_ac, colour = "Iran_m_ac"))+
geom_line(aes(y = Italy_m_ac, colour = "Italy_m_ac"), size=1)+
geom_line(aes(y = Korea_South_m_ac, colour = "Korea_South_m_ac"), size=1)+
geom_line(aes(y = Spain_m_ac, colour = "Spain_m_ac"), size=1)+
# geom_line(aes(y = Switzerland_m_ac, colour = "Switzerland_m_ac"))+
# geom_line(aes(y = United_Kingdom_m_ac, colour = "United_Kingdom_m_ac"))+
geom_line(aes(y = US_m_ac, colour = "US_m_ac"), size=1)+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
scale_x_date(date_labels = "%d-%b-%Y")

Morte por densidade demográfica
# Brazil_m_d China_m_d France_m_d Germany_m_d Iran_m_d Italy_m_d Korea_South_m_d Spain_m_d Switzerland_m_d United_Kingdom_m_d US_m_d
ggplot(covid, aes(as.Date(Data))) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Morte por densidade demográfica") + xlab("dia")+
geom_point(aes(y = Brazil_m_d, colour = "Brazil_m_d"), size=1)+
geom_line(aes(y = China_m_d, colour = "China_m_d"), size=1)+
# geom_line(aes(y = France_m_d, colour = "France_m_d"))+
# geom_line(aes(y = Germany_m_d, colour = "Germany_m_d"))+
# geom_line(aes(y = Iran_m_d, colour = "Iran_m_d"))+
geom_line(aes(y = Italy_m_d, colour = "Italy_m_d"), size=1)+
geom_line(aes(y = Korea_South_m_d, colour = "Korea_South_m_d"), size=1)+
geom_line(aes(y = Spain_m_d, colour = "Spain_m_d"), size=1)+
# geom_line(aes(y = Switzerland_m_d, colour = "Switzerland_m_d"))+
# geom_line(aes(y = United_Kingdom_m_d, colour = "United_Kingdom_m_d"))+
geom_line(aes(y = US_m_d, colour = "US_m_d"), size=1)+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
scale_x_date(date_labels = "%d-%b-%Y")

library(readxl)
covid3 <- read_excel("covid19.xlsx", sheet = "r2",
col_types = c("text", "numeric", "date",
"date", "numeric", "numeric", "text",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric"))
#covid3
# Tempo de Isolamento após registro do 1º caso x mortos x densidade
#Fonte de dados: [https://www.worldometers.info/coronavirus/#countries]
#covid3 <-na.exclude(covid3)
#ggplot(covid3, aes(x=pais)) +
# theme(axis.text.x = element_text(angle=90)) + theme_hc()+
# ylab("covid19 - Tempo de Isolamento após registro do 1º caso") + xlab("País")+
# geom_point(aes(y = tempo_1_caso_isolamento, size = mortos_28_03, colour = pais))
#ggplot(covid3, aes(x=pais)) +
# theme(axis.text.x = element_text(angle=90)) + theme_hc()+
# ylab("covid19 - Tempo de Isolamento após registro do 1º caso") + xlab("País")+ theme_calc()+
# geom_point(aes(y = tempo_1_caso_isolamento, size = mortos_28_03, colour = densidade))
Casos confirmados (acumulado) x Tempos de Isolamento Social
#x: tempo acumulado em isolamento
#y: casos conf acumum
# US_t Italy_t China_t Spain_t Germany_t France_t United_Kingdom_t Korea_South_t Brazil_t
ggplot(covid, aes(x=China_t)) + theme(axis.text.x = element_text(angle=90)) +
# scale_color_brewer(palette = "Accent") +
theme_bw(base_size = 14)+ theme(legend.position = "bottom") +
ylab("Covid19 - Casos confirmados (acumulado)") +
ggtitle("A linha pontilhada indica quando cada país iniciou o isolamento social") +
xlab("Tempo em isolamento da China")+
geom_point(aes(y = Brazil_c_ac, color = "Brazil_c_ac"), shape=0, size=2) +
geom_point(aes(y = China_c_ac, colour = "China_c_ac"), shape=1, size=2)+
# geom_point(aes(y = France_c_ac, colour = "France_c_ac"), shape=2, size=2)+
# geom_point(aes(y = Germany_c_ac, colour = "Germany_c_ac"), shape=3, size=2)+
geom_point(aes(y = Italy_c_ac, colour = "Italy_c_ac"), shape=4, size=2)+
geom_point(aes(y = Korea_South_c_ac, colour = "Korea_South_c_ac"), shape=5, size=2)+
geom_point(aes(y = Spain_c_ac, colour = "Spain_c_ac"), shape=6, size=2)+
# geom_point(aes(y = United_Kingdom_c_ac, colour = "United_Kingdom_c_ac"), shape=7, size=2)+
geom_point(aes(y = US_c_ac, colour = "US_c_ac"), shape=8, size=2) + geom_text(aes(xx, yy, label=pais))+
geom_segment(aes(x=33, y=0,yend=100000,xend =33), size=1, linetype=8)+
geom_segment(aes(x=0, y=0 ,yend=103000,xend =0), size=1, linetype=8)+
geom_segment(aes(x=9, y=0 ,yend=100000,xend =9), size=1, linetype=8)+
geom_segment(aes(x=5, y=0 ,yend=97000 ,xend =5), size=1, linetype=8)+
geom_segment(aes(x=1, y=0 ,yend=109000,xend =1), size=1, linetype=8)+
geom_segment(aes(x=-2, y=0,yend=100000,xend =-2), size=1, linetype=8)+
geom_segment(aes(x=3, y=0 ,yend=115000,xend =3), size=1, linetype=8)+
geom_segment(aes(x=55, y=0,yend=100000,xend =55), size=1, linetype=8)+
geom_segment(aes(x=40, y=0,yend=100000,xend =40), size=1, linetype=8)

NA
NA
Casos confirmados (acumulado) x Tempos de Isolamento Social
#x: tempo acumulado em isolamento
#y: casos conf acumum
# US_t Italy_t China_t Spain_t Germany_t France_t United_Kingdom_t Korea_South_t Brazil_t
# BASE DE DADOS CHAMADA isolam - COM DADOS SOMENTE DO INÍCIO DE ISOLAM DE CADA PAÍS
grafico_isolam <- read_excel("covid19.xlsx", sheet = "isolam")
ggplot(grafico_isolam, aes(x=China_t)) + theme(axis.text.x = element_text(angle=90)) +
# scale_color_brewer(palette = "Accent") +
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
ylab("Covid19 - Casos confirmados (acumulado)") +
ggtitle("Tempo acumulado em isolamento social x Casos confirmados (acumulado) ") +
xlab("Tempo acumulado em isolamento social")+
geom_point(aes(y = Brazil_c_ac, color = "Brazil_c_ac"), size=4) +
geom_line(aes(y = China_c_ac, colour = "China_c_ac"), size=1)+
# geom_point(aes(y = France_c_ac, colour = "France_c_ac"), shape=2, size=2)+
# geom_point(aes(y = Germany_c_ac, colour = "Germany_c_ac"), shape=3, size=2)+
geom_line(aes(y = Italy_c_ac, colour = "Italy_c_ac"), size=1)+
geom_line(aes(y = Korea_South_c_ac, colour = "Korea_South_c_ac"), size=1)+
geom_line(aes(y = Spain_c_ac, colour = "Spain_c_ac"), size=1)+
# geom_point(aes(y = United_Kingdom_c_ac, colour = "United_Kingdom_c_ac"), shape=7, size=2)+
geom_line(aes(y = US_c_ac, colour = "US_c_ac"), size=1)

Mortes - Box-plot
library(stringr)
covid2 <-covid[,c(1:109)]
covid2 <- stack(covid2)
covid2 <-filter(covid2,str_detect(ind, "_m"))
covid2 <-filter(covid2,str_detect(ind,"_m(?!_ac)"))
covid2 <-filter(covid2,str_detect(ind,"_m(?!_1Mpop)"))
covid2 <-filter(covid2,str_detect(ind,"_m(?!_d)"))
covid2 <- arrange(covid2,values)
ggplot(covid2, aes(x = ind, y = values )) + geom_boxplot(aes(fill = ind))+ theme_bw()+
ylab("covid19 - Mortes") + xlab("País") + theme(axis.text.x = element_text(angle=90)) +
theme(legend.position = "bottom")

ggplot(covid2, aes(x = ind, y = values )) +
geom_dotplot(aes(color = ind), binaxis="y", stackdir='centerwhole', fill = "white",dotsize=0.5) + theme_bw()+
ylab("covid19 - Mortes") + xlab("País") + theme(axis.text.x = element_text(angle=90)) +
theme(legend.position = "bottom")

Casos Confirmados - Box-plot
library(stringr)
covid2 <-covid[,c(1:109)]
covid2 <- stack(covid2)
covid2 <-filter(covid2,str_detect(ind, "_c"))
covid2 <-filter(covid2,str_detect(ind,"_c(?!_ac)"))
covid2 <-filter(covid2,str_detect(ind,"_c(?!_1Mpop)"))
covid2 <-filter(covid2,str_detect(ind,"_c(?!_d)"))
covid2 <- arrange(covid2,values)
ggplot(covid2, aes(x = ind, y = values )) + geom_boxplot(aes(fill = ind))+ theme_bw()+
ylab("covid19 - Casos Confirmados") + xlab("País") + theme(axis.text.x = element_text(angle=90)) +
theme(legend.position = "bottom")

ggplot(covid2, aes(x = ind, y = values )) +
geom_dotplot(aes(color = ind), binaxis="y", stackdir='centerwhole', fill = "white",dotsize=0.5) + theme_bw()+
ylab("covid19 - Casos Confirmados") + xlab("País") + theme(axis.text.x = element_text(angle=90)) +
theme(legend.position = "bottom")

Mortes (acumuladas) desde a 1º morte em cada país
#Italy_m_ac Spain_m_ac China_m_ac US_m_ac Korea_South_m_ac Brazil_m_ac dia
desconto=3000
x=65
covid_1dia <- read_excel("covid19.xlsx", sheet = "1morte")
ggplot(covid_1dia, aes(Dia)) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Mortes (acumulada)") + xlab("dia")+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_m_ac, colour = "Brazil_m_ac"), size=2, shape=10)+
geom_line(aes(y = China_m_ac, colour = "China_m_ac"), size=1)+
# geom_line(aes(y = France_m_ac, colour = "France_m_ac"), size=1)+
# geom_line(aes(y = Germany_m_ac, colour = "Germany_m_ac"), size=1)+
# geom_line(aes(y = Iran_m_ac, colour = "Iran_m_ac"), size=1)+
geom_line(aes(y = Italy_m_ac, colour = "Italy_m_ac"), size=1)+
geom_line(aes(y = Korea_South_m_ac, colour = "Korea_South_m_ac"), size=1)+
geom_line(aes(y = Spain_m_ac, colour = "Spain_m_ac"), size=1)+
# geom_line(aes(y = Switzerland_m_ac, colour = "Switzerland_m_ac"), size=1)+
# geom_line(aes(y = United_Kingdom_m_ac, colour = "United_Kingdom_m_ac"), size=1)+
geom_line(aes(y = US_m_ac, colour = "US_m_ac"), size=1)+
geom_vline(aes(xintercept=30),size=1,linetype="dashed", color="blue" )#+

# geom_text(aes(label = covid_1dia$Brazil_m_ac[30], x=x+20, y=10000+desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$China_m_ac[30], x=x+20, y=10000+2*desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$Italy_m_ac[30], x=x+20, y=10000+3*desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$Korea_South_m_ac[30],x=x+20, y=10000+4*desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$Spain_m_ac[30], x=x+20, y=10000+5*desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$US_m_ac[30], x=x+20, y=10000+6*desconto), color="black", size=7)+
#geom_text(aes(label = "Mortes no 30º Dia", x=15, y=10000+6*desconto), color="blue", size=7)+
#geom_text(aes(label = "desde a 1º morte", x=15, y=10000+6*desconto-2500), color="blue", size=7)+
#geom_text(aes(label = "em cada país", x=15, y=10000+6*desconto-5000), color="blue", size=7)+
# geom_text(aes(label = "Brazil", x=x, y=10000+desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "China", x=x, y=10000+2*desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "Italy", x=x, y=10000+3*desconto), color="black", size=7,nudge_x=-1)+
# geom_text(aes(label = "Korea_South", x=x, y=10000+4*desconto), color="black", size=7,nudge_x=5)+
# geom_text(aes(label = "Spain", x=x, y=10000+5*desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "US", x=x, y=10000+6*desconto), color="black", size=7,nudge_x=-1)
Mortes (acumuladas) desde o 1º caso confirmado em cada país
#Italy_m_ac Spain_m_ac China_m_ac US_m_ac Korea_South_m_ac Brazil_m_ac dia
covid_1dia <- read_excel("covid19.xlsx", sheet = "1caso")
ggplot(covid_1dia, aes(Dia)) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Mortes (acumulada)") + xlab("dia")+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_m_ac, colour = "Brazil_m_ac"), size=2, shape=10)+
geom_line(aes(y = China_m_ac, colour = "China_m_ac"), size=1)+
# geom_line(aes(y = France_m_ac, colour = "France_m_ac"), size=1)+
# geom_line(aes(y = Germany_m_ac, colour = "Germany_m_ac"), size=1)+
# geom_line(aes(y = Iran_m_ac, colour = "Iran_m_ac"), size=1)+
geom_line(aes(y = Italy_m_ac, colour = "Italy_m_ac"), size=1)+
geom_line(aes(y = Korea_South_m_ac, colour = "Korea_South_m_ac"), size=1)+
geom_line(aes(y = Spain_m_ac, colour = "Spain_m_ac"), size=1)+
# geom_line(aes(y = Switzerland_m_ac, colour = "Switzerland_m_ac"), size=1)+
# geom_line(aes(y = United_Kingdom_m_ac, colour = "United_Kingdom_m_ac"), size=1)+
geom_line(aes(y = US_m_ac, colour = "US_m_ac"), size=1)+
geom_vline(aes(xintercept=50),size=1,linetype="dashed", color="blue" )#+

# geom_text(aes(label = covid_1dia$Brazil_m_ac[50], x=x+20, y=10000+desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$China_m_ac[50], x=x+20, y=10000+2*desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$Italy_m_ac[50], x=x+20, y=10000+3*desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$Korea_South_m_ac[50],x=x+20, y=10000+4*desconto), color="black", size=7)+
# geom_text(aes(label = covid_1dia$Spain_m_ac[50], x=x+20, y=10000+5*desconto), color="black", size=7)+
## geom_text(aes(label = covid_1dia$US_m_ac[50], x=x+20, y=10000+6*desconto), color="black", size=7)+
# geom_text(aes(label = "Mortes no 50º Dia", x=15, y=10000+6*desconto), color="blue", size=7)+
# geom_text(aes(label = "desde o 1º caso", x=15, y=10000+6*desconto-2500), color="blue", size=7)+
# geom_text(aes(label = "em cada país", x=15, y=10000+6*desconto-5000), color="blue", size=7)+
# geom_text(aes(label = "Brazil", x=x, y=10000+desconto), color="black", size=7,nudge_x=0)+
## geom_text(aes(label = "China", x=x, y=10000+2*desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "Italy", x=x, y=10000+3*desconto), color="black", size=7,nudge_x=-1)+
# geom_text(aes(label = "Korea_South", x=x, y=10000+4*desconto), color="black", size=7,nudge_x=3)+
# geom_text(aes(label = "Spain", x=x, y=10000+5*desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "US", x=x, y=10000+6*desconto), color="black", size=7,nudge_x=-1)
Mortes (acumuladas) por M hab desde o 1º caso confirmado em cada país
# Italy_m_ac_1Mpop Spain_m_ac_1Mpop China_m_ac_1Mpop US_m_ac_1Mpop Korea_South_m_ac_1Mpop Brazil_m_ac_1Mpop
desconto=50
x=75
covid_1dia <- read_excel("covid19.xlsx", sheet = "1caso")
ggplot(covid_1dia, aes(Dia)) +
theme(axis.text.x = element_text(angle=90)) + theme_bw()+
ylab("covid19 - Mortes (acumulada) por M hab") + xlab("dia")+
theme_bw(base_size = 16)+ theme(legend.position = "bottom") +
geom_point(aes(y = Brazil_m_ac_1Mpop, colour = "Brazil_m_ac_1Mpop"), size=2, shape=10)+
geom_line(aes(y = China_m_ac_1Mpop, colour = "China_m_ac_1Mpop"), size=1)+
# geom_line(aes(y = France_m_ac_1Mpop, colour = "France_m_ac_1Mpop"), size=1)+
# geom_line(aes(y = Germany_m_ac_1Mpop, colour = "Germany_m_ac_1Mpop"), size=1)+
# geom_line(aes(y = Iran_m_ac_1Mpop, colour = "Iran_m_ac_1Mpop"), size=1)+
geom_line(aes(y = Italy_m_ac_1Mpop, colour = "Italy_m_ac_1Mpop"), size=1)+
geom_line(aes(y = Korea_South_m_ac_1Mpop, colour = "Korea_South_m_ac_1Mpop"), size=1)+
geom_line(aes(y = Spain_m_ac_1Mpop, colour = "Spain_m_ac_1Mpop"), size=1)+
# geom_line(aes(y = Switzerland_m_ac_1Mpop, colour = "Switzerland_m_ac_1Mpop"), size=1)+
# geom_line(aes(y = United_Kingdom_m_ac_1Mpop, colour = "United_Kingdom_m_ac_1Mpop"), size=1)+
geom_line(aes(y = US_m_ac_1Mpop, colour = "US_m_ac_1Mpop"), size=1)+
geom_vline(aes(xintercept=50),size=1,linetype="dashed", color="blue" )#+

# geom_text(aes(label = round(covid_1dia$Brazil_m_ac_1Mpop[50],2), x=x+25, y=1+desconto), color="black", size=7)+
# geom_text(aes(label = round(covid_1dia$China_m_ac_1Mpop[50],2), x=x+25, y=1+1.5*desconto), color="black", size=7)+
# geom_text(aes(label = round(covid_1dia$Italy_m_ac_1Mpop[50],2), x=x+25, y=1+2*desconto), color="black", size=7)+
# geom_text(aes(label = round(covid_1dia$Korea_South_m_ac_1Mpop[50],2),x=x+25, y=1+2.5*desconto), color="black", size=7)+
# geom_text(aes(label = round(covid_1dia$Spain_m_ac_1Mpop[50],2), x=x+25, y=1+3*desconto), color="black", size=7)+
# geom_text(aes(label = round(covid_1dia$US_m_ac_1Mpop[50],2), x=x+25, y=1+3.5*desconto), color="black", size=7)+
# geom_text(aes(label = "Mortes no 50º Dia", x=15, y=1+6*desconto), color="blue", size=7)+
# geom_text(aes(label = "desde o 1º caso", x=15, y=1+5*desconto), color="blue", size=7)+
# geom_text(aes(label = "por M Hab em cada país", x=15, y=1+4*desconto), color="blue", size=7)+
# geom_text(aes(label = "Brazil", x=x, y=1+desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "China", x=x, y=1+1.5*desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "Italy", x=x, y=1+2*desconto), color="black", size=7,nudge_x=-1)+
# geom_text(aes(label = "Korea_South", x=x, y=1+2.5*desconto), color="black", size=7,nudge_x=3)+
# geom_text(aes(label = "Spain", x=x, y=1+3*desconto), color="black", size=7,nudge_x=0)+
# geom_text(aes(label = "US", x=x, y=1+3.5*desconto), color="black", size=7,nudge_x=-1)
LS0tDQp0aXRsZTogIkNvdmlkLTE5Ig0KYXV0aG9yOiAiUHJvZmVzc29yIERyLiBMZW9uaSwgUi4gQy4gLSBBTUFOIC0gUmVzZW5kZSAtIFJKLiINCmRhdGU6ICdSZWxhdMOzcmlvIGdlcmFkbyBlbTogYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZCBkZSAlQiBkZSAlWSIpYCcNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQplbWFpbDogbGVvbmkucm9iZXJ0b0BhbWFuLmViLm1pbC5icg0KLS0tDQoNCiAgICBbRm9udGUgZG9zIGRhZG9zXToNCiAgICBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkvdHJlZS9tYXN0ZXIvY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfdGltZV9zZXJpZXMgDQogICAgaHR0cDovL3d3dy5jaXR5cG9wdWxhdGlvbi5kZS9lbi9jaGluYS9jaXRpZXMvaHViZWkvDQogICAgaHR0cHM6Ly93d3cud29ybGRvbWV0ZXJzLmluZm8vY29yb25hdmlydXMvI2NvdW50cmllcw0KICAgIGh0dHBzOi8vd3d3Lndvcmxkb21ldGVycy5pbmZvL2dlb2dyYXBoeS9jb3VudHJpZXMtb2YtdGhlLXdvcmxkLw0KICAgIGh0dHBzOi8vd3d3Lndvcmxkb21ldGVycy5pbmZvL3dvcmxkLXBvcHVsYXRpb24vcG9wdWxhdGlvbi1ieS1yZWdpb24vDQoNCmBgYHtyfQ0KI3ZhcmnDoXZlaXMNCiNCcmF6aWxfYwlDaGluYV9jCUZyYW5jZV9jCUdlcm1hbnlfYwlJcmFuX2MJSXRhbHlfYwlLb3JlYV9Tb3V0aF9jCVNwYWluX2MJU3dpdHplcmxhbmRfYwlVbml0ZWRfS2luZ2RvbV9jCVVTX2MgQnJhemlsX2NfMU1wb3AJQ2hpbmFfY18xTXBvcCBGcmFuY2VfY18xTXBvcAlHZXJtYW55X2NfMU1wb3AJSXJhbl9jXzFNcG9wCUl0YWx5X2NfMU1wb3AJS29yZWFfU291dGhfY18xTXBvcAlTcGFpbl9jXzFNcG9wCVN3aXR6ZXJsYW5kX2NfMU1wb3AJVW5pdGVkX0tpbmdkb21fY18xTXBvcAlVU19jXzFNcG9wIEJyYXppbF9jX2FjCUNoaW5hX2NfYWMJRnJhbmNlX2NfYWMJR2VybWFueV9jX2FjCUlyYW5fY19hYwlJdGFseV9jX2FjCUtvcmVhX1NvdXRoX2NfYWMJU3BhaW5fY19hYwlTd2l0emVybGFuZF9jX2FjCVVuaXRlZF9LaW5nZG9tX2NfYWMJVVNfY19hYyBCcmF6aWxfY19kCUNoaW5hX2NfZAlGcmFuY2VfY19kCUdlcm1hbnlfY19kCUlyYW5fY19kCUl0YWx5X2NfZAlLb3JlYV9Tb3V0aF9jX2QJU3BhaW5fY19kCVN3aXR6ZXJsYW5kX2NfZAlVbml0ZWRfS2luZ2RvbV9jX2QJVVNfY19kIEJyYXppbF9tCUNoaW5hX20JRnJhbmNlX20JR2VybWFueV9tCUlyYW5fbQlJdGFseV9tCUtvcmVhX1NvdXRoX20JU3BhaW5fbQlTd2l0emVybGFuZF9tCVVuaXRlZF9LaW5nZG9tX20JVVNfbSBCcmF6aWxfbV8xTXBvcAlDaGluYV9tXzFNcG9wCUZyYW5jZV9tXzFNcG9wCUdlcm1hbnlfbV8xTXBvcAlJcmFuX21fMU1wb3AJSXRhbHlfbV8xTXBvcAlLb3JlYV9Tb3V0aF9tXzFNcG9wCVNwYWluX21fMU1wb3AJU3dpdHplcmxhbmRfbV8xTXBvcAlVbml0ZWRfS2luZ2RvbV9tXzFNcG9wCVVTX21fMU1wb3AgQnJhemlsX21fYWMJQ2hpbmFfbV9hYwlGcmFuY2VfbV9hYwlHZXJtYW55X21fYWMJSXJhbl9tX2FjCUl0YWx5X21fYWMJS29yZWFfU291dGhfbV9hYwlTcGFpbl9tX2FjCVN3aXR6ZXJsYW5kX21fYWMJVW5pdGVkX0tpbmdkb21fbV9hYwlVU19tX2FjIEJyYXppbF9tX2QJQ2hpbmFfbV9kCUZyYW5jZV9tX2QJR2VybWFueV9tX2QJSXJhbl9tX2QJSXRhbHlfbV9kCUtvcmVhX1NvdXRoX21fZAlTcGFpbl9tX2QJU3dpdHplcmxhbmRfbV9kCVVuaXRlZF9LaW5nZG9tX21fZAlVU19tX2QNCiAgICANCiNMZWdlbmRhOiANCiMgICAgX2MJY29uZmlybWFkbw0KIyAgICBfY19hYwljb25maXJtYWRvIGFjdW11bGFkbw0KIyAgICBfbQltb3J0ZQ0KIyAgICBfbV9hYwltb3J0ZSBhY3VtdWxhZGENCiMgICAgX2NfZAljb25maXJtYWRvL2RlbnNpZGFkZQ0KIyAgICBfbV9kCW1vcnRlL2RlbnNpZGFkZQ0KIyAgICBfY18xTXBvcAljb25maXJtYWRvIGFjdW11bGFkbyBwb3IgTSBkZSBoYWIgKG9taXRpIF9hYyBwYXJhIHByZXNlcnZhciBvIHRhbWFuaG8gZGEgdmFyacOhdmVsKQkJCQkJDQojICAgIF9tXzFNcG9wCW1vcnRlIGFjdW11bGFkYSBwb3IgTSBkZSBoYWIgKG9taXRpIF9hYyBwYXJhIHByZXNlcnZhciBvIHRhbWFuaG8gZGEgdmFyacOhdmVsKQkJCQ0KIyAgICBfY2RfMU1wb3AgY29uZmlybWFkbyBwb3IgZGlhIHBvciBNIGRlIGhhYg0KDQojICAgUm90ZWlybzoNCiMgICAgMSkgVG9wIDEwICsgQnJhc2lsDQojICAgIDIpIEdyYWYgTm92b3MgY2Fzb3MgcG9yIGRpYSBlIE1vcnRvcyBwb3IgZGlhDQojICAgIDMpIE1hdHJpeg0KIyAgICBhKSBGYWl4YSBldMOhcmlhPyAoaWRhZGUgbcOpZGlhKQ0KIyAgICBiKSBkZW5zaWRhZGUgZGVtb2cuDQojICAgIGMpIGluw61jaW8gZG8gaXNvbGFtZW50byBzb2NpYWwNCiMgICAgZCkgcHJpbWVpcm8gY2FzbyBkZSBjb3JvbmEgY29uZmlybWFkbyAgIA0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmNvdmlkIDwtIHJlYWRfZXhjZWwoImNvdmlkMTkueGxzeCIsIHNoZWV0ID0gInIiKSANCg0KI2NvdmlkICU+JSBzbGljZSg4NikgJT4lIHNlbGVjdChjb250YWlucygiX2FjIikpDQoNCg0KYGBgDQogICMgQmFzZXMgVGhlIENlbnRlciBmb3IgU3lzdGVtcyBTY2llbmNlIGFuZCBFbmdpbmVlcmluZyAoQ1NTRSkgYXQgSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5IC0gQmFsdGltb3JlLCBNRCANCiAgICANCiAgICBjb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwNCiAgICBjb3ZpZDE5X2RlYXRoc19nbG9iYWwNCg0KIyBDYXNvcyBDb25maXJtYWRvcw0KYGBge3IgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTJ9DQojIEJyYXppbF9jCUNoaW5hX2MJRnJhbmNlX2MJR2VybWFueV9jCUlyYW5fYwlJdGFseV9jCUtvcmVhX1NvdXRoX2MJU3BhaW5fYwlTd2l0emVybGFuZF9jCVVuaXRlZF9LaW5nZG9tX2MJVVNfYw0KDQpnZ3Bsb3QoY292aWQsIGFlcyhhcy5EYXRlKERhdGEpKSkgKyAgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0LCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsgDQogIHlsYWIoImNvdmlkMTkgLSBDYXNvcyBDb25maXJtYWRvcyIpICsgeGxhYigiZGlhIikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBCcmF6aWxfYywgY29sb3IgPSAiQnJhemlsX2MiKSwgc2l6ZT0zKSsgDQogIGdlb21fbGluZShhZXMoeSA9IENoaW5hX2MsIGNvbG9yID0gIkNoaW5hX2MiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IEZyYW5jZV9jLCBjb2xvciA9ICJGcmFuY2VfYyIpKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IEdlcm1hbnlfYywgY29sb3IgPSAiR2VybWFueV9jIikpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gSXJhbl9jLCBjb2xvciA9ICJJcmFuX2MiKSkrDQogIGdlb21fbGluZShhZXMoeSA9IEl0YWx5X2MsIGNvbG9yID0gIkl0YWx5X2MiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gS29yZWFfU291dGhfYywgY29sb3IgPSAiS29yZWFfU291dGhfYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBTcGFpbl9jLCBjb2xvciA9ICJTcGFpbl9jIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBTd2l0emVybGFuZF9jLCBjb2xvciA9ICJTd2l0emVybGFuZF9jIikpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fYywgY29sb3IgPSAiVW5pdGVkX0tpbmdkb21fYyIpKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfYywgY29sb3IgPSAiVVNfYyIpLCBzaXplPTEpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWQtJWItJVkiKSANCg0KDQogIA0KICANCmBgYA0KDQojIE1vcnRlcw0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMn0NCg0KZ2dwbG90KGNvdmlkLCBhZXMoYXMuRGF0ZShEYXRhKSkpKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArIHRoZW1lX2J3KCkrDQogIHlsYWIoImNvdmlkMTkgLSBNb3J0ZXMiKSArIHhsYWIoImRpYSIpKw0KICAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IEJyYXppbF9tLCBjb2xvdXIgPSAiQnJhemlsX20iKSwgc2l6ZT0yKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfbSwgY29sb3VyID0gIkNoaW5hX20iKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IEZyYW5jZV9tLCBjb2xvdXIgPSAiRnJhbmNlX20iKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55X20sIGNvbG91ciA9ICJHZXJtYW55X20iKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBJcmFuX20sIGNvbG91ciA9ICJJcmFuX20iKSkrDQogIGdlb21fbGluZShhZXMoeSA9IEl0YWx5X20sIGNvbG91ciA9ICJJdGFseV9tIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEtvcmVhX1NvdXRoX20sIGNvbG91ciA9ICJLb3JlYV9Tb3V0aF9tIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX20sIGNvbG91ciA9ICJTcGFpbl9tIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBTd2l0emVybGFuZF9tLCBjb2xvdXIgPSAiU3dpdHplcmxhbmRfbSIpKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX20sIGNvbG91ciA9ICJVbml0ZWRfS2luZ2RvbV9tIikpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBVU19tLCBjb2xvdXIgPSAiVVNfbSIpLCBzaXplPTEpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWQtJWItJVkiKSANCg0KYGBgDQoNCg0KIyBDYXNvcyBjb25maXJtYWRvcyAoYWN1bXVsYWRvKSBwb3IgTSBoYWINCg0KYGBge3IgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTJ9DQojIEJyYXppbF9jXzFNcG9wCUNoaW5hX2NfMU1wb3AJRnJhbmNlX2NfMU1wb3AJR2VybWFueV9jXzFNcG9wCUlyYW5fY18xTXBvcAlJdGFseV9jXzFNcG9wCUtvcmVhX1NvdXRoX2NfMU1wb3AJU3BhaW5fY18xTXBvcAlTd2l0emVybGFuZF9jXzFNcG9wCVVuaXRlZF9LaW5nZG9tX2NfMU1wb3AJVVNfY18xTXBvcA0KDQpnZ3Bsb3QoY292aWQsIGFlcyhhcy5EYXRlKERhdGEpKSkgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArIHRoZW1lX2J3KCkrDQogIHlsYWIoImNvdmlkMTkgLSBDYXNvcyBjb25maXJtYWRvcyAoYWN1bXVsYWRvKSBwb3IgTSBoYWIiKSArIHhsYWIoImRpYSIpKw0KICAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IEJyYXppbF9jXzFNcG9wLCBjb2xvdXIgPSAiQnJhemlsX2NfMU1wb3AiKSwgc2l6ZT0yKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfY18xTXBvcCwgY29sb3VyID0gIkNoaW5hX2NfMU1wb3AiKSwgc2l6ZT0xKSsNCiAjIGdlb21fbGluZShhZXMoeSA9IEZyYW5jZV9jXzFNcG9wLCBjb2xvdXIgPSAiRnJhbmNlX2NfMU1wb3AiKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55X2NfMU1wb3AsIGNvbG91ciA9ICJHZXJtYW55X2NfMU1wb3AiKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBJcmFuX2NfMU1wb3AsIGNvbG91ciA9ICJJcmFuX2NfMU1wb3AiKSkrDQogIGdlb21fbGluZShhZXMoeSA9IEl0YWx5X2NfMU1wb3AsIGNvbG91ciA9ICJJdGFseV9jXzFNcG9wIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEtvcmVhX1NvdXRoX2NfMU1wb3AsIGNvbG91ciA9ICJLb3JlYV9Tb3V0aF9jXzFNcG9wIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX2NfMU1wb3AsIGNvbG91ciA9ICJTcGFpbl9jXzFNcG9wIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBTd2l0emVybGFuZF9jXzFNcG9wLCBjb2xvdXIgPSAiU3dpdHplcmxhbmRfY18xTXBvcCIpKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX2NfMU1wb3AsIGNvbG91ciA9ICJVbml0ZWRfS2luZ2RvbV9jXzFNcG9wIikpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBVU19jXzFNcG9wLCBjb2xvdXIgPSAiVVNfY18xTXBvcCIpLCBzaXplPTEpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWQtJWItJVkiKSANCg0KYGBgDQoNCiMgQ2Fzb3MgY29uZmlybWFkb3MgKGFjdW11bGFkbykNCg0KYGBge3IgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTJ9DQojIEJyYXppbF9jX2FjCUNoaW5hX2NfYWMJRnJhbmNlX2NfYWMJR2VybWFueV9jX2FjCUlyYW5fY19hYwlJdGFseV9jX2FjCUtvcmVhX1NvdXRoX2NfYWMJU3BhaW5fY19hYwlTd2l0emVybGFuZF9jX2FjCVVuaXRlZF9LaW5nZG9tX2NfYWMJVVNfY19hYw0KDQoNCmdncGxvdChjb3ZpZCwgYWVzKGFzLkRhdGUoRGF0YSkpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgICNzY2FsZV95X2xvZzEwICgpICsNCiAgeWxhYigiY292aWQxOSAtIENhc29zIGNvbmZpcm1hZG9zIChhY3VtdWxhZG8pIikgKyB4bGFiKCJkaWEiKSsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgDQogIGdlb21fcG9pbnQoYWVzKHkgPSBCcmF6aWxfY19hYywgY29sb3VyID0gIkJyYXppbF9jX2FjIiksIHNpemU9MikrDQogIGdlb21fbGluZShhZXMoeSA9IENoaW5hX2NfYWMsIGNvbG91ciA9ICJDaGluYV9jX2FjIiksIHNpemU9MSkrDQogIyBnZW9tX2xpbmUoYWVzKHkgPSBGcmFuY2VfY19hYywgY29sb3VyID0gIkZyYW5jZV9jX2FjIikpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gR2VybWFueV9jX2FjLCBjb2xvdXIgPSAiR2VybWFueV9jX2FjIikpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gSXJhbl9jX2FjLCBjb2xvdXIgPSAiSXJhbl9jX2FjIikpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBJdGFseV9jX2FjLCBjb2xvdXIgPSAiSXRhbHlfY19hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBLb3JlYV9Tb3V0aF9jX2FjLCBjb2xvdXIgPSAiS29yZWFfU291dGhfY19hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBTcGFpbl9jX2FjLCBjb2xvdXIgPSAiU3BhaW5fY19hYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gU3dpdHplcmxhbmRfY19hYywgY29sb3VyID0gIlN3aXR6ZXJsYW5kX2NfYWMiKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBVbml0ZWRfS2luZ2RvbV9jX2FjLCBjb2xvdXIgPSAiVW5pdGVkX0tpbmdkb21fY19hYyIpKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfY19hYywgY29sb3VyID0gIlVTX2NfYWMiKSwgc2l6ZT0xKSsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiVkLSViLSVZIikgDQoNCmBgYA0KDQojIENhc29zIGNvbmZpcm1hZG9zIChhY3VtdWxhZG8pIC0gYSBwYXJ0aXIgZGUgbWFyw6dvIA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMn0NCiMgQnJhemlsX2NfYWMJQ2hpbmFfY19hYwlGcmFuY2VfY19hYwlHZXJtYW55X2NfYWMJSXJhbl9jX2FjCUl0YWx5X2NfYWMJS29yZWFfU291dGhfY19hYwlTcGFpbl9jX2FjCVN3aXR6ZXJsYW5kX2NfYWMJVW5pdGVkX0tpbmdkb21fY19hYwlVU19jX2FjDQpjb3ZpZF9zIDwtIHNsaWNlKGNvdmlkLCA0MDoxMDAwKQ0KDQpnZ3Bsb3QoY292aWRfcywgYWVzKGFzLkRhdGUoRGF0YSkpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfYncoKSsjIHNjYWxlX3lfbG9nMTAgKCkgKw0KICB5bGFiKCJjb3ZpZDE5IC0gQ2Fzb3MgY29uZmlybWFkb3MgKGFjdW11bGFkbykiKSArIHhsYWIoImRpYSIpKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBCcmF6aWxfY19hYywgY29sb3VyID0gIkJyYXppbF9jX2FjIiksIHNpemU9MykrDQogIGdlb21fbGluZShhZXMoeSA9IENoaW5hX2NfYWMsIGNvbG91ciA9ICJDaGluYV9jX2FjIiksIHNpemU9MSkrDQogIyBnZW9tX2xpbmUoYWVzKHkgPSBGcmFuY2VfY19hYywgY29sb3VyID0gIkZyYW5jZV9jX2FjIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55X2NfYWMsIGNvbG91ciA9ICJHZXJtYW55X2NfYWMiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IElyYW5fY19hYywgY29sb3VyID0gIklyYW5fY19hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBJdGFseV9jX2FjLCBjb2xvdXIgPSAiSXRhbHlfY19hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBLb3JlYV9Tb3V0aF9jX2FjLCBjb2xvdXIgPSAiS29yZWFfU291dGhfY19hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBTcGFpbl9jX2FjLCBjb2xvdXIgPSAiU3BhaW5fY19hYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gU3dpdHplcmxhbmRfY19hYywgY29sb3VyID0gIlN3aXR6ZXJsYW5kX2NfYWMiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX2NfYWMsIGNvbG91ciA9ICJVbml0ZWRfS2luZ2RvbV9jX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFVTX2NfYWMsIGNvbG91ciA9ICJVU19jX2FjIiksIHNpemU9MSkrDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlZC0lYi0lWSIpIA0KYGBgDQoNCg0KIyBDYXNvcyBDb25maXJtYWRvcyAtIGEgcGFydGlyIGRlIG1hcsOnbyANCmBgYHtyIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEyfQ0KIyBCcmF6aWxfYwlDaGluYV9jCUZyYW5jZV9jCUdlcm1hbnlfYwlJcmFuX2MJSXRhbHlfYwlLb3JlYV9Tb3V0aF9jCVNwYWluX2MJU3dpdHplcmxhbmRfYwlVbml0ZWRfS2luZ2RvbV9jCVVTX2MNCg0KZ2dwbG90KGNvdmlkX3MsIGFlcyhhcy5EYXRlKERhdGEpKSkgKyAgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKyB0aGVtZV9idygpICsjICBzY2FsZV95X2xvZzEwICgpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTQsKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKyANCiAgeWxhYigiY292aWQxOSAtIENhc29zIENvbmZpcm1hZG9zIikgKyB4bGFiKCJkaWEiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IEJyYXppbF9jLCBjb2xvciA9ICJCcmF6aWxfYyIpLCBzaXplPTMpKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfYywgY29sb3IgPSAiQ2hpbmFfYyIpLCBzaXplPTEpKw0KICMgZ2VvbV9saW5lKGFlcyh5ID0gRnJhbmNlX2MsIGNvbG9yID0gIkZyYW5jZV9jIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55X2MsIGNvbG9yID0gIkdlcm1hbnlfYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gSXJhbl9jLCBjb2xvciA9ICJJcmFuX2MiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gSXRhbHlfYywgY29sb3IgPSAiSXRhbHlfYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBLb3JlYV9Tb3V0aF9jLCBjb2xvciA9ICJLb3JlYV9Tb3V0aF9jIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX2MsIGNvbG9yID0gIlNwYWluX2MiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFN3aXR6ZXJsYW5kX2MsIGNvbG9yID0gIlN3aXR6ZXJsYW5kX2MiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX2MsIGNvbG9yID0gIlVuaXRlZF9LaW5nZG9tX2MiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfYywgY29sb3IgPSAiVVNfYyIpLCBzaXplPTEpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWQtJWItJVkiKSANCiAgDQojZ2dwbG90KGNvdmlkLCBhZXMoeD1EYXRhLCB5PUJyYXppbF9tKSkgKyAgZ2VvbV9wb2ludCgpK3N0YXRfc21vb3RoKG1ldGhvZD1sb2VzcykgKyAgdGhlbWVfYncoKSANCmBgYA0KDQoNCg0KIyBDYXNvcyBjb25maXJtYWRvcyAoZGnDoXJpbykgcG9yIE0gaGFiICAtIGEgcGFydGlyIGRlIG1hcsOnbw0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMn0NCg0KDQoNCmNvdmlkX2QgPC0gc2xpY2UoY292aWQsIDQwOjEwMDApDQpnZ3Bsb3QoY292aWRfZCwgYWVzKGFzLkRhdGUoRGF0YSkpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfYncoKSsNCiAgeWxhYigiY292aWQxOSAtIENhc29zIGNvbmZpcm1hZG9zIChkacOhcmlvKSBwb3IgTSBIYWIiKSArIHhsYWIoImRpYSIpKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBCcmF6aWxfY2RfMU1wb3AsIGNvbG91ciA9ICJCcmF6aWxfY2RfMU1wb3AiKSwgc2l6ZT00LCBzaGFwZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfY2RfMU1wb3AsIGNvbG91ciA9ICJDaGluYV9jZF8xTXBvcCIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gRnJhbmNlX2NkXzFNcG9wLCBjb2xvdXIgPSAiRnJhbmNlX2NkXzFNcG9wIiksIHNpemU9MSkrDQogIyBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55X2NkXzFNcG9wLCBjb2xvdXIgPSAiR2VybWFueV9jZF8xTXBvcCIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gSXJhbl9jZF8xTXBvcCwgY29sb3VyID0gIklyYW5fY2RfMU1wb3AiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gSXRhbHlfY2RfMU1wb3AsIGNvbG91ciA9ICJJdGFseV9jZF8xTXBvcCIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBLb3JlYV9Tb3V0aF9jZF8xTXBvcCwgY29sb3VyID0gIktvcmVhX1NvdXRoX2NkXzFNcG9wIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX2NkXzFNcG9wLCBjb2xvdXIgPSAiU3BhaW5fY2RfMU1wb3AiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFN3aXR6ZXJsYW5kX2NkXzFNcG9wLCBjb2xvdXIgPSAiU3dpdHplcmxhbmRfY2RfMU1wb3AiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX2NkXzFNcG9wLCBjb2xvdXIgPSAiVW5pdGVkX0tpbmdkb21fY2RfMU1wb3AiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfY2RfMU1wb3AsIGNvbG91ciA9ICJVU19jZF8xTXBvcCIpLCBzaXplPTEpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWQtJWItJVkiKSANCmBgYA0KDQoNCg0KIyBDYXNvcyBjb25maXJtYWRvcyAoYWN1bXVsYWRvKSBhIHBhcnRpciBkbyAxwrogZGlhIGNvbSAxMDAgY2Fzb3MgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEyfQ0KIyBCcmF6aWxfY19hYwlDaGluYV9jX2FjCUZyYW5jZV9jX2FjCUdlcm1hbnlfY19hYwlJcmFuX2NfYWMJSXRhbHlfY19hYwlLb3JlYV9Tb3V0aF9jX2FjCVNwYWluX2NfYWMJU3dpdHplcmxhbmRfY19hYwlVbml0ZWRfS2luZ2RvbV9jX2FjCVVTX2NfYWMNCg0KDQojIGEgYXBhcnRpciBkZSAxMDAgY2Fzb3MgDQoNCmNvbmYgPC0gcmVhZF9leGNlbCgiY292aWQxOS54bHN4Iiwgc2hlZXQgPSAiY29uZl8xMDAiKSANCg0KDQpnZ3Bsb3QoY29uZiwgYWVzKGRpYXMpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfYncoKSsNCiAgeWxhYigiY292aWQxOSAtIENhc29zIGNvbmZpcm1hZG9zIChhY3VtdWxhZG8pIikgKyB4bGFiKCJkaWEiKSsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gQnJhemlsX2MsIGNvbG91ciA9ICJCcmF6aWxfYyIpLCBzaXplPTEsIHNoYXBlPTEwKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfYywgY29sb3VyID0gIkNoaW5hX2MiKSwgc2l6ZT0xKSsNCiAjIGdlb21fbGluZShhZXMoeSA9IEZyYW5jZV9jLCBjb2xvdXIgPSAiRnJhbmNlX2MiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IEdlcm1hbnlfYywgY29sb3VyID0gIkdlcm1hbnlfYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gSXJhbl9jLCBjb2xvdXIgPSAiSXJhbl9jIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEl0YWx5X2MsIGNvbG91ciA9ICJJdGFseV9jIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEtvcmVhX1NvdXRoX2MsIGNvbG91ciA9ICJLb3JlYV9Tb3V0aF9jIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX2MsIGNvbG91ciA9ICJTcGFpbl9jIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBTd2l0emVybGFuZF9jLCBjb2xvdXIgPSAiU3dpdHplcmxhbmRfYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fYywgY29sb3VyID0gIlVuaXRlZF9LaW5nZG9tX2MiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfYywgY29sb3VyID0gIlVTX2MiKSwgc2l6ZT0xKQ0KDQpgYGANCg0KDQoNCiMgTW9ydGUgYWN1bXVsYWRhIHBvciBNIGRlIGhhYiAgDQoNCmBgYHtyIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEyfQ0KIyBCcmF6aWxfbV8xTXBvcAlDaGluYV9tXzFNcG9wCUZyYW5jZV9tXzFNcG9wCUdlcm1hbnlfbV8xTXBvcAlJcmFuX21fMU1wb3AJSXRhbHlfbV8xTXBvcAlLb3JlYV9Tb3V0aF9tXzFNcG9wCVNwYWluX21fMU1wb3AJU3dpdHplcmxhbmRfbV8xTXBvcAlVbml0ZWRfS2luZ2RvbV9tXzFNcG9wCVVTX21fMU1wb3ANCmdncGxvdChjb3ZpZCwgYWVzKGFzLkRhdGUoRGF0YSkpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfYncoKSsNCiAgeWxhYigiY292aWQxOSAtIE1vcnRlIGFjdW11bGFkYSBwb3IgTSBkZSBoYWIgIikgKyB4bGFiKCJkaWEiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IEJyYXppbF9tXzFNcG9wLCBjb2xvdXIgPSAiQnJhemlsX21fMU1wb3AiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfbV8xTXBvcCwgY29sb3VyID0gIkNoaW5hX21fMU1wb3AiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IEZyYW5jZV9tXzFNcG9wLCBjb2xvdXIgPSAiRnJhbmNlX21fMU1wb3AiKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55X21fMU1wb3AsIGNvbG91ciA9ICJHZXJtYW55X21fMU1wb3AiKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBJcmFuX21fMU1wb3AsIGNvbG91ciA9ICJJcmFuX21fMU1wb3AiKSkrDQogIGdlb21fbGluZShhZXMoeSA9IEl0YWx5X21fMU1wb3AsIGNvbG91ciA9ICJJdGFseV9tXzFNcG9wIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEtvcmVhX1NvdXRoX21fMU1wb3AsIGNvbG91ciA9ICJLb3JlYV9Tb3V0aF9tXzFNcG9wIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX21fMU1wb3AsIGNvbG91ciA9ICJTcGFpbl9tXzFNcG9wIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBTd2l0emVybGFuZF9tXzFNcG9wLCBjb2xvdXIgPSAiU3dpdHplcmxhbmRfbV8xTXBvcCIpKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX21fMU1wb3AsIGNvbG91ciA9ICJVbml0ZWRfS2luZ2RvbV9tXzFNcG9wIikpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBVU19tXzFNcG9wLCBjb2xvdXIgPSAiVVNfbV8xTXBvcCIpLCBzaXplPTEpKw0KICAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiVkLSViLSVZIikgDQpgYGANCg0KDQojIE1vcnRlIGFjdW11bGFkYSAgIA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMn0NCiMgQnJhemlsX21fYWMJQ2hpbmFfbV9hYwlGcmFuY2VfbV9hYwlHZXJtYW55X21fYWMJSXJhbl9tX2FjCUl0YWx5X21fYWMJS29yZWFfU291dGhfbV9hYwlTcGFpbl9tX2FjCVN3aXR6ZXJsYW5kX21fYWMJVW5pdGVkX0tpbmdkb21fbV9hYwlVU19tX2FjDQoNCmdncGxvdChjb3ZpZCwgYWVzKGFzLkRhdGUoRGF0YSkpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfYncoKSsNCiAgeWxhYigiY292aWQxOSAtIE1vcnRlIGFjdW11bGFkYSIpICsgeGxhYigiZGlhIikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBCcmF6aWxfbV9hYywgY29sb3VyID0gIkJyYXppbF9tX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IENoaW5hX21fYWMsIGNvbG91ciA9ICJDaGluYV9tX2FjIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBGcmFuY2VfbV9hYywgY29sb3VyID0gIkZyYW5jZV9tX2FjIikpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gR2VybWFueV9tX2FjLCBjb2xvdXIgPSAiR2VybWFueV9tX2FjIikpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gSXJhbl9tX2FjLCBjb2xvdXIgPSAiSXJhbl9tX2FjIikpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBJdGFseV9tX2FjLCBjb2xvdXIgPSAiSXRhbHlfbV9hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBLb3JlYV9Tb3V0aF9tX2FjLCBjb2xvdXIgPSAiS29yZWFfU291dGhfbV9hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBTcGFpbl9tX2FjLCBjb2xvdXIgPSAiU3BhaW5fbV9hYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gU3dpdHplcmxhbmRfbV9hYywgY29sb3VyID0gIlN3aXR6ZXJsYW5kX21fYWMiKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBVbml0ZWRfS2luZ2RvbV9tX2FjLCBjb2xvdXIgPSAiVW5pdGVkX0tpbmdkb21fbV9hYyIpKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfbV9hYywgY29sb3VyID0gIlVTX21fYWMiKSwgc2l6ZT0xKSsNCiAgICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlZC0lYi0lWSIpIA0KYGBgDQoNCg0KIyBNb3J0ZSBwb3IgZGVuc2lkYWRlIGRlbW9ncsOhZmljYSAgIA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMn0NCiMgQnJhemlsX21fZAlDaGluYV9tX2QJRnJhbmNlX21fZAlHZXJtYW55X21fZAlJcmFuX21fZAlJdGFseV9tX2QJS29yZWFfU291dGhfbV9kCVNwYWluX21fZAlTd2l0emVybGFuZF9tX2QJVW5pdGVkX0tpbmdkb21fbV9kCVVTX21fZA0KZ2dwbG90KGNvdmlkLCBhZXMoYXMuRGF0ZShEYXRhKSkpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKyB0aGVtZV9idygpKw0KICB5bGFiKCJjb3ZpZDE5IC0gTW9ydGUgcG9yIGRlbnNpZGFkZSBkZW1vZ3LDoWZpY2EiKSArIHhsYWIoImRpYSIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gQnJhemlsX21fZCwgY29sb3VyID0gIkJyYXppbF9tX2QiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfbV9kLCBjb2xvdXIgPSAiQ2hpbmFfbV9kIiksIHNpemU9MSkrDQogIyBnZW9tX2xpbmUoYWVzKHkgPSBGcmFuY2VfbV9kLCBjb2xvdXIgPSAiRnJhbmNlX21fZCIpKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IEdlcm1hbnlfbV9kLCBjb2xvdXIgPSAiR2VybWFueV9tX2QiKSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBJcmFuX21fZCwgY29sb3VyID0gIklyYW5fbV9kIikpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBJdGFseV9tX2QsIGNvbG91ciA9ICJJdGFseV9tX2QiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gS29yZWFfU291dGhfbV9kLCBjb2xvdXIgPSAiS29yZWFfU291dGhfbV9kIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX21fZCwgY29sb3VyID0gIlNwYWluX21fZCIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gU3dpdHplcmxhbmRfbV9kLCBjb2xvdXIgPSAiU3dpdHplcmxhbmRfbV9kIikpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fbV9kLCBjb2xvdXIgPSAiVW5pdGVkX0tpbmdkb21fbV9kIikpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBVU19tX2QsIGNvbG91ciA9ICJVU19tX2QiKSwgc2l6ZT0xKSsNCiAgICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlZC0lYi0lWSIpIA0KDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KDQoNCg0KDQoNCmNvdmlkMyA8LSByZWFkX2V4Y2VsKCJjb3ZpZDE5Lnhsc3giLCBzaGVldCA9ICJyMiIsIA0KICAgIGNvbF90eXBlcyA9IGMoInRleHQiLCAibnVtZXJpYyIsICJkYXRlIiwgDQogICAgICAgICJkYXRlIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkNCg0KDQoNCiNjb3ZpZDMNCmBgYA0KDQoNCmBgYHtyIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEyfQ0KIyBUZW1wbyBkZSBJc29sYW1lbnRvIGFww7NzIHJlZ2lzdHJvIGRvIDHCuiBjYXNvIHggbW9ydG9zIHggZGVuc2lkYWRlDQojRm9udGUgZGUgZGFkb3M6IFtodHRwczovL3d3dy53b3JsZG9tZXRlcnMuaW5mby9jb3JvbmF2aXJ1cy8jY291bnRyaWVzXQ0KDQojY292aWQzIDwtbmEuZXhjbHVkZShjb3ZpZDMpDQojZ2dwbG90KGNvdmlkMywgYWVzKHg9cGFpcykpICsgDQojICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfaGMoKSsNCiMgIHlsYWIoImNvdmlkMTkgLSBUZW1wbyBkZSBJc29sYW1lbnRvIGFww7NzIHJlZ2lzdHJvIGRvIDHCuiBjYXNvIikgKyB4bGFiKCJQYcOtcyIpKw0KIyAgZ2VvbV9wb2ludChhZXMoeSA9IHRlbXBvXzFfY2Fzb19pc29sYW1lbnRvLCBzaXplID0gbW9ydG9zXzI4XzAzLCBjb2xvdXIgPSBwYWlzKSkNCiANCg0KI2dncGxvdChjb3ZpZDMsIGFlcyh4PXBhaXMpKSArIA0KIyAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArIHRoZW1lX2hjKCkrDQojICB5bGFiKCJjb3ZpZDE5IC0gVGVtcG8gZGUgSXNvbGFtZW50byBhcMOzcyByZWdpc3RybyBkbyAxwrogY2FzbyIpICsgeGxhYigiUGHDrXMiKSsgdGhlbWVfY2FsYygpKw0KIyAgZ2VvbV9wb2ludChhZXMoeSA9IHRlbXBvXzFfY2Fzb19pc29sYW1lbnRvLCBzaXplID0gbW9ydG9zXzI4XzAzLCBjb2xvdXIgPSBkZW5zaWRhZGUpKQ0KDQpgYGANCg0KDQojIENhc29zIGNvbmZpcm1hZG9zIChhY3VtdWxhZG8pIHggVGVtcG9zIGRlIElzb2xhbWVudG8gU29jaWFsDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xNn0NCiN4OiB0ZW1wbyBhY3VtdWxhZG8gZW0gaXNvbGFtZW50bw0KI3k6IGNhc29zIGNvbmYgYWN1bXVtIA0KDQojIFVTX3QJSXRhbHlfdAlDaGluYV90CVNwYWluX3QJR2VybWFueV90CUZyYW5jZV90CVVuaXRlZF9LaW5nZG9tX3QJS29yZWFfU291dGhfdAlCcmF6aWxfdA0KDQpnZ3Bsb3QoY292aWQsIGFlcyh4PUNoaW5hX3QpKSArICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgIA0KIyAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIHlsYWIoIkNvdmlkMTkgLSBDYXNvcyBjb25maXJtYWRvcyAoYWN1bXVsYWRvKSIpICsNCiAgZ2d0aXRsZSgiQSBsaW5oYSBwb250aWxoYWRhIGluZGljYSBxdWFuZG8gY2FkYSBwYcOtcyBpbmljaW91IG8gaXNvbGFtZW50byBzb2NpYWwiKSArDQogIHhsYWIoIlRlbXBvIGVtIGlzb2xhbWVudG8gZGEgQ2hpbmEiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IEJyYXppbF9jX2FjLCBjb2xvciA9ICJCcmF6aWxfY19hYyIpLCBzaGFwZT0wLCBzaXplPTIpICsgDQogIGdlb21fcG9pbnQoYWVzKHkgPSBDaGluYV9jX2FjLCBjb2xvdXIgPSAiQ2hpbmFfY19hYyIpLCBzaGFwZT0xLCBzaXplPTIpKyANCiMgIGdlb21fcG9pbnQoYWVzKHkgPSBGcmFuY2VfY19hYywgY29sb3VyID0gIkZyYW5jZV9jX2FjIiksIHNoYXBlPTIsIHNpemU9MikrDQojICBnZW9tX3BvaW50KGFlcyh5ID0gR2VybWFueV9jX2FjLCBjb2xvdXIgPSAiR2VybWFueV9jX2FjIiksIHNoYXBlPTMsIHNpemU9MikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBJdGFseV9jX2FjLCBjb2xvdXIgPSAiSXRhbHlfY19hYyIpLCBzaGFwZT00LCBzaXplPTIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gS29yZWFfU291dGhfY19hYywgY29sb3VyID0gIktvcmVhX1NvdXRoX2NfYWMiKSwgc2hhcGU9NSwgc2l6ZT0yKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IFNwYWluX2NfYWMsIGNvbG91ciA9ICJTcGFpbl9jX2FjIiksIHNoYXBlPTYsIHNpemU9MikrDQojICBnZW9tX3BvaW50KGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fY19hYywgY29sb3VyID0gIlVuaXRlZF9LaW5nZG9tX2NfYWMiKSwgc2hhcGU9Nywgc2l6ZT0yKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IFVTX2NfYWMsIGNvbG91ciA9ICJVU19jX2FjIiksIHNoYXBlPTgsIHNpemU9MikgKyAgZ2VvbV90ZXh0KGFlcyh4eCwgeXksIGxhYmVsPXBhaXMpKSsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4PTMzLCB5PTAseWVuZD0xMDAwMDAseGVuZCA9MzMpLCBzaXplPTEsIGxpbmV0eXBlPTgpKw0KICBnZW9tX3NlZ21lbnQoYWVzKHg9MCwgeT0wICx5ZW5kPTEwMzAwMCx4ZW5kID0wKSwgc2l6ZT0xLCBsaW5ldHlwZT04KSsNCiAgICBnZW9tX3NlZ21lbnQoYWVzKHg9OSwgeT0wICx5ZW5kPTEwMDAwMCx4ZW5kID05KSwgc2l6ZT0xLCBsaW5ldHlwZT04KSsgDQogICAgZ2VvbV9zZWdtZW50KGFlcyh4PTUsIHk9MCAseWVuZD05NzAwMCAseGVuZCA9NSksIHNpemU9MSwgbGluZXR5cGU9OCkrDQogICAgZ2VvbV9zZWdtZW50KGFlcyh4PTEsIHk9MCAseWVuZD0xMDkwMDAseGVuZCA9MSksIHNpemU9MSwgbGluZXR5cGU9OCkrDQogICAgZ2VvbV9zZWdtZW50KGFlcyh4PS0yLCB5PTAseWVuZD0xMDAwMDAseGVuZCA9LTIpLCBzaXplPTEsIGxpbmV0eXBlPTgpKw0KICAgIGdlb21fc2VnbWVudChhZXMoeD0zLCB5PTAgLHllbmQ9MTE1MDAwLHhlbmQgPTMpLCBzaXplPTEsIGxpbmV0eXBlPTgpKw0KICAgIGdlb21fc2VnbWVudChhZXMoeD01NSwgeT0wLHllbmQ9MTAwMDAwLHhlbmQgPTU1KSwgc2l6ZT0xLCBsaW5ldHlwZT04KSsNCiAgICBnZW9tX3NlZ21lbnQoYWVzKHg9NDAsIHk9MCx5ZW5kPTEwMDAwMCx4ZW5kID00MCksIHNpemU9MSwgbGluZXR5cGU9OCkNCg0KDQpgYGANCg0KDQoNCg0KIyBDYXNvcyBjb25maXJtYWRvcyAoYWN1bXVsYWRvKSB4IFRlbXBvcyBkZSBJc29sYW1lbnRvIFNvY2lhbA0KYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTE2fQ0KI3g6IHRlbXBvIGFjdW11bGFkbyBlbSBpc29sYW1lbnRvDQojeTogY2Fzb3MgY29uZiBhY3VtdW0gDQoNCiMgVVNfdAlJdGFseV90CUNoaW5hX3QJU3BhaW5fdAlHZXJtYW55X3QJRnJhbmNlX3QJVW5pdGVkX0tpbmdkb21fdAlLb3JlYV9Tb3V0aF90CUJyYXppbF90DQoNCiMgQkFTRSBERSBEQURPUyBDSEFNQURBIGlzb2xhbSAtIENPTSBEQURPUyBTT01FTlRFIERPIElOw41DSU8gREUgSVNPTEFNIERFIENBREEgUEHDjVMNCg0KDQpncmFmaWNvX2lzb2xhbSA8LSByZWFkX2V4Y2VsKCJjb3ZpZDE5Lnhsc3giLCBzaGVldCA9ICJpc29sYW0iKSANCg0KZ2dwbG90KGdyYWZpY29faXNvbGFtLCBhZXMoeD1DaGluYV90KSkgKyAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArICANCiMgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkFjY2VudCIpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICB5bGFiKCJDb3ZpZDE5IC0gQ2Fzb3MgY29uZmlybWFkb3MgKGFjdW11bGFkbykiKSArDQogIGdndGl0bGUoIlRlbXBvIGFjdW11bGFkbyBlbSBpc29sYW1lbnRvIHNvY2lhbCB4IENhc29zIGNvbmZpcm1hZG9zIChhY3VtdWxhZG8pICIpICsNCiAgeGxhYigiVGVtcG8gYWN1bXVsYWRvIGVtIGlzb2xhbWVudG8gc29jaWFsIikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBCcmF6aWxfY19hYywgY29sb3IgPSAiQnJhemlsX2NfYWMiKSwgc2l6ZT00KSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBDaGluYV9jX2FjLCBjb2xvdXIgPSAiQ2hpbmFfY19hYyIpLCBzaXplPTEpKyANCiMgIGdlb21fcG9pbnQoYWVzKHkgPSBGcmFuY2VfY19hYywgY29sb3VyID0gIkZyYW5jZV9jX2FjIiksIHNoYXBlPTIsIHNpemU9MikrDQojICBnZW9tX3BvaW50KGFlcyh5ID0gR2VybWFueV9jX2FjLCBjb2xvdXIgPSAiR2VybWFueV9jX2FjIiksIHNoYXBlPTMsIHNpemU9MikrDQogIGdlb21fbGluZShhZXMoeSA9IEl0YWx5X2NfYWMsIGNvbG91ciA9ICJJdGFseV9jX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEtvcmVhX1NvdXRoX2NfYWMsIGNvbG91ciA9ICJLb3JlYV9Tb3V0aF9jX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX2NfYWMsIGNvbG91ciA9ICJTcGFpbl9jX2FjIiksIHNpemU9MSkrDQojICBnZW9tX3BvaW50KGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fY19hYywgY29sb3VyID0gIlVuaXRlZF9LaW5nZG9tX2NfYWMiKSwgc2hhcGU9Nywgc2l6ZT0yKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfY19hYywgY29sb3VyID0gIlVTX2NfYWMiKSwgc2l6ZT0xKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KIyBNb3J0ZXMgLSBCb3gtcGxvdA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoc3RyaW5ncikNCmNvdmlkMiA8LWNvdmlkWyxjKDE6MTA5KV0NCmNvdmlkMiA8LSBzdGFjayhjb3ZpZDIpDQpjb3ZpZDIgPC1maWx0ZXIoY292aWQyLHN0cl9kZXRlY3QoaW5kLCAiX20iKSkNCmNvdmlkMiA8LWZpbHRlcihjb3ZpZDIsc3RyX2RldGVjdChpbmQsIl9tKD8hX2FjKSIpKQ0KY292aWQyIDwtZmlsdGVyKGNvdmlkMixzdHJfZGV0ZWN0KGluZCwiX20oPyFfMU1wb3ApIikpDQpjb3ZpZDIgPC1maWx0ZXIoY292aWQyLHN0cl9kZXRlY3QoaW5kLCJfbSg/IV9kKSIpKQ0KDQpjb3ZpZDIgPC0gYXJyYW5nZShjb3ZpZDIsdmFsdWVzKQ0KDQpnZ3Bsb3QoY292aWQyLCBhZXMoeCA9IGluZCwgeSA9IHZhbHVlcyApKSArIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IGluZCkpKyB0aGVtZV9idygpKw0KICB5bGFiKCJjb3ZpZDE5IC0gTW9ydGVzIikgKyB4bGFiKCJQYcOtcyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKSArDQogdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpIA0KDQoNCmdncGxvdChjb3ZpZDIsIGFlcyh4ID0gaW5kLCB5ID0gdmFsdWVzICkpICsgDQogIGdlb21fZG90cGxvdChhZXMoY29sb3IgPSBpbmQpLCBiaW5heGlzPSJ5Iiwgc3RhY2tkaXI9J2NlbnRlcndob2xlJywgZmlsbCA9ICJ3aGl0ZSIsZG90c2l6ZT0wLjUpICsgdGhlbWVfYncoKSsNCiAgeWxhYigiY292aWQxOSAtIE1vcnRlcyIpICsgeGxhYigiUGHDrXMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCmBgYA0KDQojIENhc29zIENvbmZpcm1hZG9zIC0gQm94LXBsb3QNCg0KYGBge3IgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHN0cmluZ3IpDQpjb3ZpZDIgPC1jb3ZpZFssYygxOjEwOSldDQpjb3ZpZDIgPC0gc3RhY2soY292aWQyKQ0KY292aWQyIDwtZmlsdGVyKGNvdmlkMixzdHJfZGV0ZWN0KGluZCwgIl9jIikpDQpjb3ZpZDIgPC1maWx0ZXIoY292aWQyLHN0cl9kZXRlY3QoaW5kLCJfYyg/IV9hYykiKSkNCmNvdmlkMiA8LWZpbHRlcihjb3ZpZDIsc3RyX2RldGVjdChpbmQsIl9jKD8hXzFNcG9wKSIpKQ0KY292aWQyIDwtZmlsdGVyKGNvdmlkMixzdHJfZGV0ZWN0KGluZCwiX2MoPyFfZCkiKSkNCmNvdmlkMiA8LSBhcnJhbmdlKGNvdmlkMix2YWx1ZXMpDQoNCmdncGxvdChjb3ZpZDIsIGFlcyh4ID0gaW5kLCB5ID0gdmFsdWVzICkpICsgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gaW5kKSkrIHRoZW1lX2J3KCkrDQogIHlsYWIoImNvdmlkMTkgLSBDYXNvcyBDb25maXJtYWRvcyIpICsgeGxhYigiUGHDrXMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCg0KZ2dwbG90KGNvdmlkMiwgYWVzKHggPSBpbmQsIHkgPSB2YWx1ZXMgKSkgKyANCiAgZ2VvbV9kb3RwbG90KGFlcyhjb2xvciA9IGluZCksIGJpbmF4aXM9InkiLCBzdGFja2Rpcj0nY2VudGVyd2hvbGUnLCBmaWxsID0gIndoaXRlIixkb3RzaXplPTAuNSkgKyB0aGVtZV9idygpKw0KICB5bGFiKCJjb3ZpZDE5IC0gQ2Fzb3MgQ29uZmlybWFkb3MiKSArIHhsYWIoIlBhw61zIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpIA0KYGBgDQoNCg0KIyBNb3J0ZXMgKGFjdW11bGFkYXMpIGRlc2RlIGEgMcK6IG1vcnRlIGVtIGNhZGEgcGHDrXMgIA0KYGBge3IgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTJ9DQoNCiNJdGFseV9tX2FjCVNwYWluX21fYWMJQ2hpbmFfbV9hYwlVU19tX2FjCUtvcmVhX1NvdXRoX21fYWMJQnJhemlsX21fYWMJZGlhDQoNCmRlc2NvbnRvPTMwMDANCng9NjUNCg0KY292aWRfMWRpYSA8LSByZWFkX2V4Y2VsKCJjb3ZpZDE5Lnhsc3giLCBzaGVldCA9ICIxbW9ydGUiKSANCg0KZ2dwbG90KGNvdmlkXzFkaWEsIGFlcyhEaWEpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfYncoKSsNCiAgeWxhYigiY292aWQxOSAtIE1vcnRlcyAoYWN1bXVsYWRhKSIpICsgeGxhYigiZGlhIikrDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IEJyYXppbF9tX2FjLCBjb2xvdXIgPSAiQnJhemlsX21fYWMiKSwgc2l6ZT0yLCBzaGFwZT0xMCkrDQogIGdlb21fbGluZShhZXMoeSA9IENoaW5hX21fYWMsIGNvbG91ciA9ICJDaGluYV9tX2FjIiksIHNpemU9MSkrDQogIyBnZW9tX2xpbmUoYWVzKHkgPSBGcmFuY2VfbV9hYywgY29sb3VyID0gIkZyYW5jZV9tX2FjIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55X21fYWMsIGNvbG91ciA9ICJHZXJtYW55X21fYWMiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IElyYW5fbV9hYywgY29sb3VyID0gIklyYW5fbV9hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBJdGFseV9tX2FjLCBjb2xvdXIgPSAiSXRhbHlfbV9hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBLb3JlYV9Tb3V0aF9tX2FjLCBjb2xvdXIgPSAiS29yZWFfU291dGhfbV9hYyIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBTcGFpbl9tX2FjLCBjb2xvdXIgPSAiU3BhaW5fbV9hYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gU3dpdHplcmxhbmRfbV9hYywgY29sb3VyID0gIlN3aXR6ZXJsYW5kX21fYWMiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX21fYWMsIGNvbG91ciA9ICJVbml0ZWRfS2luZ2RvbV9tX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFVTX21fYWMsIGNvbG91ciA9ICJVU19tX2FjIiksIHNpemU9MSkrDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9MzApLHNpemU9MSxsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsdWUiICkjKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY292aWRfMWRpYSRCcmF6aWxfbV9hY1szMF0sICAgICB4PXgrMjAsIHk9MTAwMDArZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcpKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY292aWRfMWRpYSRDaGluYV9tX2FjWzMwXSwgICAgICB4PXgrMjAsIHk9MTAwMDArMipkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NykrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3ZpZF8xZGlhJEl0YWx5X21fYWNbMzBdLCAgICAgIHg9eCsyMCwgeT0xMDAwMCszKmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03KSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdmlkXzFkaWEkS29yZWFfU291dGhfbV9hY1szMF0seD14KzIwLCB5PTEwMDAwKzQqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcpKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY292aWRfMWRpYSRTcGFpbl9tX2FjWzMwXSwgICAgICB4PXgrMjAsIHk9MTAwMDArNSpkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NykrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3ZpZF8xZGlhJFVTX21fYWNbMzBdLCAgICAgICAgIHg9eCsyMCwgeT0xMDAwMCs2KmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03KSsNCiAgI2dlb21fdGV4dChhZXMobGFiZWwgPSAiTW9ydGVzIG5vIDMwwrogRGlhIiwgICAgIHg9MTUsIHk9MTAwMDArNipkZXNjb250byksIGNvbG9yPSJibHVlIiwgc2l6ZT03KSsNCiAgI2dlb21fdGV4dChhZXMobGFiZWwgPSAiZGVzZGUgYSAxwrogbW9ydGUiLCAgICAgeD0xNSwgeT0xMDAwMCs2KmRlc2NvbnRvLTI1MDApLCBjb2xvcj0iYmx1ZSIsIHNpemU9NykrDQogICNnZW9tX3RleHQoYWVzKGxhYmVsID0gImVtIGNhZGEgcGHDrXMiLCAgICAgeD0xNSwgeT0xMDAwMCs2KmRlc2NvbnRvLTUwMDApLCBjb2xvcj0iYmx1ZSIsIHNpemU9NykrDQogIyAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiQnJhemlsIiwgICAgIHg9eCwgeT0xMDAwMCtkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NyxudWRnZV94PTApKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIkNoaW5hIiwgICAgICB4PXgsIHk9MTAwMDArMipkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NyxudWRnZV94PTApKw0KICMgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIkl0YWx5IiwgICAgICB4PXgsIHk9MTAwMDArMypkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NyxudWRnZV94PS0xKSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJLb3JlYV9Tb3V0aCIsIHg9eCwgeT0xMDAwMCs0KmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03LG51ZGdlX3g9NSkrDQogIyAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiU3BhaW4iLCAgICAgIHg9eCwgeT0xMDAwMCs1KmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03LG51ZGdlX3g9MCkrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiVVMiLCAgICAgICAgIHg9eCwgeT0xMDAwMCs2KmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03LG51ZGdlX3g9LTEpDQoNCmBgYA0KDQoNCg0KDQoNCiMgTW9ydGVzIChhY3VtdWxhZGFzKSBkZXNkZSBvIDHCuiBjYXNvIGNvbmZpcm1hZG8gZW0gY2FkYSBwYcOtcyAgDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMn0NCg0KI0l0YWx5X21fYWMJU3BhaW5fbV9hYwlDaGluYV9tX2FjCVVTX21fYWMJS29yZWFfU291dGhfbV9hYwlCcmF6aWxfbV9hYwlkaWENCg0KY292aWRfMWRpYSA8LSByZWFkX2V4Y2VsKCJjb3ZpZDE5Lnhsc3giLCBzaGVldCA9ICIxY2FzbyIpIA0KDQpnZ3Bsb3QoY292aWRfMWRpYSwgYWVzKERpYSkpICsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkgKyB0aGVtZV9idygpKw0KICB5bGFiKCJjb3ZpZDE5IC0gTW9ydGVzIChhY3VtdWxhZGEpIikgKyB4bGFiKCJkaWEiKSsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gQnJhemlsX21fYWMsIGNvbG91ciA9ICJCcmF6aWxfbV9hYyIpLCBzaXplPTIsIHNoYXBlPTEwKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbmFfbV9hYywgY29sb3VyID0gIkNoaW5hX21fYWMiKSwgc2l6ZT0xKSsNCiAjIGdlb21fbGluZShhZXMoeSA9IEZyYW5jZV9tX2FjLCBjb2xvdXIgPSAiRnJhbmNlX21fYWMiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IEdlcm1hbnlfbV9hYywgY29sb3VyID0gIkdlcm1hbnlfbV9hYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gSXJhbl9tX2FjLCBjb2xvdXIgPSAiSXJhbl9tX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEl0YWx5X21fYWMsIGNvbG91ciA9ICJJdGFseV9tX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IEtvcmVhX1NvdXRoX21fYWMsIGNvbG91ciA9ICJLb3JlYV9Tb3V0aF9tX2FjIiksIHNpemU9MSkrDQogIGdlb21fbGluZShhZXMoeSA9IFNwYWluX21fYWMsIGNvbG91ciA9ICJTcGFpbl9tX2FjIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBTd2l0emVybGFuZF9tX2FjLCBjb2xvdXIgPSAiU3dpdHplcmxhbmRfbV9hYyIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fbV9hYywgY29sb3VyID0gIlVuaXRlZF9LaW5nZG9tX21fYWMiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gVVNfbV9hYywgY29sb3VyID0gIlVTX21fYWMiKSwgc2l6ZT0xKSsNCiBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PTUwKSxzaXplPTEsbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibHVlIiApIysNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdmlkXzFkaWEkQnJhemlsX21fYWNbNTBdLCAgICAgeD14KzIwLCB5PTEwMDAwK2Rlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03KSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdmlkXzFkaWEkQ2hpbmFfbV9hY1s1MF0sICAgICAgeD14KzIwLCB5PTEwMDAwKzIqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcpKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY292aWRfMWRpYSRJdGFseV9tX2FjWzUwXSwgICAgICB4PXgrMjAsIHk9MTAwMDArMypkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NykrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3ZpZF8xZGlhJEtvcmVhX1NvdXRoX21fYWNbNTBdLHg9eCsyMCwgeT0xMDAwMCs0KmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03KSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdmlkXzFkaWEkU3BhaW5fbV9hY1s1MF0sICAgICAgeD14KzIwLCB5PTEwMDAwKzUqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcpKw0KIyMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdmlkXzFkaWEkVVNfbV9hY1s1MF0sICAgICAgICAgeD14KzIwLCB5PTEwMDAwKzYqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcpKw0KIyAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJNb3J0ZXMgbm8gNTDCuiBEaWEiLCAgICAgeD0xNSwgeT0xMDAwMCs2KmRlc2NvbnRvKSwgY29sb3I9ImJsdWUiLCBzaXplPTcpKw0KIyAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJkZXNkZSBvIDHCuiBjYXNvIiwgICAgIHg9MTUsIHk9MTAwMDArNipkZXNjb250by0yNTAwKSwgY29sb3I9ImJsdWUiLCBzaXplPTcpKw0KIyAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJlbSBjYWRhIHBhw61zIiwgICAgIHg9MTUsIHk9MTAwMDArNipkZXNjb250by01MDAwKSwgY29sb3I9ImJsdWUiLCBzaXplPTcpKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIkJyYXppbCIsICAgICB4PXgsIHk9MTAwMDArZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0wKSsNCiMjICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiQ2hpbmEiLCAgICAgIHg9eCwgeT0xMDAwMCsyKmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03LG51ZGdlX3g9MCkrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiSXRhbHkiLCAgICAgIHg9eCwgeT0xMDAwMCszKmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03LG51ZGdlX3g9LTEpKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIktvcmVhX1NvdXRoIiwgeD14LCB5PTEwMDAwKzQqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0zKSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJTcGFpbiIsICAgICAgeD14LCB5PTEwMDAwKzUqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0wKSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJVUyIsICAgICAgICAgeD14LCB5PTEwMDAwKzYqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0tMSkNCg0KYGBgDQoNCg0KDQoNCiMgTW9ydGVzIChhY3VtdWxhZGFzKSBwb3IgTSBoYWIgZGVzZGUgbyAxwrogY2FzbyBjb25maXJtYWRvIGVtIGNhZGEgcGHDrXMgIA0KYGBge3IgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTJ9DQoNCiMgICBJdGFseV9tX2FjXzFNcG9wCVNwYWluX21fYWNfMU1wb3AJQ2hpbmFfbV9hY18xTXBvcAlVU19tX2FjXzFNcG9wCUtvcmVhX1NvdXRoX21fYWNfMU1wb3AJQnJhemlsX21fYWNfMU1wb3ANCg0KZGVzY29udG89NTANCng9NzUNCmNvdmlkXzFkaWEgPC0gcmVhZF9leGNlbCgiY292aWQxOS54bHN4Iiwgc2hlZXQgPSAiMWNhc28iKSANCg0KZ2dwbG90KGNvdmlkXzFkaWEsIGFlcyhEaWEpKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpICsgdGhlbWVfYncoKSsNCiAgeWxhYigiY292aWQxOSAtIE1vcnRlcyAoYWN1bXVsYWRhKSBwb3IgTSBoYWIiKSArIHhsYWIoImRpYSIpKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBCcmF6aWxfbV9hY18xTXBvcCwgY29sb3VyID0gIkJyYXppbF9tX2FjXzFNcG9wIiksIHNpemU9Miwgc2hhcGU9MTApKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBDaGluYV9tX2FjXzFNcG9wLCBjb2xvdXIgPSAiQ2hpbmFfbV9hY18xTXBvcCIpLCBzaXplPTEpKw0KICMgZ2VvbV9saW5lKGFlcyh5ID0gRnJhbmNlX21fYWNfMU1wb3AsIGNvbG91ciA9ICJGcmFuY2VfbV9hY18xTXBvcCIpLCBzaXplPTEpKw0KIyAgZ2VvbV9saW5lKGFlcyh5ID0gR2VybWFueV9tX2FjXzFNcG9wLCBjb2xvdXIgPSAiR2VybWFueV9tX2FjXzFNcG9wIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBJcmFuX21fYWNfMU1wb3AsIGNvbG91ciA9ICJJcmFuX21fYWNfMU1wb3AiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gSXRhbHlfbV9hY18xTXBvcCwgY29sb3VyID0gIkl0YWx5X21fYWNfMU1wb3AiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gS29yZWFfU291dGhfbV9hY18xTXBvcCwgY29sb3VyID0gIktvcmVhX1NvdXRoX21fYWNfMU1wb3AiKSwgc2l6ZT0xKSsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gU3BhaW5fbV9hY18xTXBvcCwgY29sb3VyID0gIlNwYWluX21fYWNfMU1wb3AiKSwgc2l6ZT0xKSsNCiMgIGdlb21fbGluZShhZXMoeSA9IFN3aXR6ZXJsYW5kX21fYWNfMU1wb3AsIGNvbG91ciA9ICJTd2l0emVybGFuZF9tX2FjXzFNcG9wIiksIHNpemU9MSkrDQojICBnZW9tX2xpbmUoYWVzKHkgPSBVbml0ZWRfS2luZ2RvbV9tX2FjXzFNcG9wLCBjb2xvdXIgPSAiVW5pdGVkX0tpbmdkb21fbV9hY18xTXBvcCIpLCBzaXplPTEpKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBVU19tX2FjXzFNcG9wLCBjb2xvdXIgPSAiVVNfbV9hY18xTXBvcCIpLCBzaXplPTEpKw0KIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9NTApLHNpemU9MSxsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsdWUiICkjKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoY292aWRfMWRpYSRCcmF6aWxfbV9hY18xTXBvcFs1MF0sMiksICAgICB4PXgrMjUsIHk9MStkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NykrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChjb3ZpZF8xZGlhJENoaW5hX21fYWNfMU1wb3BbNTBdLDIpLCAgICAgIHg9eCsyNSwgeT0xKzEuNSpkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NykrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChjb3ZpZF8xZGlhJEl0YWx5X21fYWNfMU1wb3BbNTBdLDIpLCAgICAgIHg9eCsyNSwgeT0xKzIqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcpKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoY292aWRfMWRpYSRLb3JlYV9Tb3V0aF9tX2FjXzFNcG9wWzUwXSwyKSx4PXgrMjUsIHk9MSsyLjUqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcpKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoY292aWRfMWRpYSRTcGFpbl9tX2FjXzFNcG9wWzUwXSwyKSwgICAgICB4PXgrMjUsIHk9MSszKmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03KSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGNvdmlkXzFkaWEkVVNfbV9hY18xTXBvcFs1MF0sMiksICAgICAgICAgeD14KzI1LCB5PTErMy41KmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03KSsNCiMgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiTW9ydGVzIG5vIDUwwrogRGlhIiwgICAgIHg9MTUsIHk9MSs2KmRlc2NvbnRvKSwgY29sb3I9ImJsdWUiLCBzaXplPTcpKw0KIyAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJkZXNkZSBvIDHCuiBjYXNvIiwgICAgIHg9MTUsIHk9MSs1KmRlc2NvbnRvKSwgY29sb3I9ImJsdWUiLCBzaXplPTcpKw0KIyAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJwb3IgTSBIYWIgZW0gY2FkYSBwYcOtcyIsICAgICB4PTE1LCB5PTErNCpkZXNjb250byksIGNvbG9yPSJibHVlIiwgc2l6ZT03KSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJCcmF6aWwiLCAgICAgeD14LCB5PTErZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0wKSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJDaGluYSIsICAgICAgeD14LCB5PTErMS41KmRlc2NvbnRvKSwgY29sb3I9ImJsYWNrIiwgc2l6ZT03LG51ZGdlX3g9MCkrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiSXRhbHkiLCAgICAgIHg9eCwgeT0xKzIqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0tMSkrDQojICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSAiS29yZWFfU291dGgiLCB4PXgsIHk9MSsyLjUqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0zKSsNCiMgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9ICJTcGFpbiIsICAgICAgeD14LCB5PTErMypkZXNjb250byksIGNvbG9yPSJibGFjayIsIHNpemU9NyxudWRnZV94PTApKw0KIyAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gIlVTIiwgICAgICAgICB4PXgsIHk9MSszLjUqZGVzY29udG8pLCBjb2xvcj0iYmxhY2siLCBzaXplPTcsbnVkZ2VfeD0tMSkNCg0KDQpgYGANCg0KDQoNCg==