Description of the sample
Children by sex and location
The following table presents the number of children in the sample by
sex.
sample_by_sex_table <- table(nut$sex, useNA = "ifany")
sample_by_sex_table
##
## 1 2 <NA>
## 6471 6239 101
There were a total of 6471 male children and
6239 female children in the survey sample. There were
also a total of 101 children whose parents refused to
participate in the survey.
The following table presents the number of children in the sample by
location.
sample_by_location_table <- table(nut$county, useNA = "ifany")
sample_by_location_table
##
## Grand Bassa Urban Montserrado
## 5355 7456
There were a total of 5355 children from Grand Bassa
and 7456 children from Urban Montserrado.
The following table presents the number of children in the sample by
sex and by location.
sample_by_sex_location_table <- table(nut$county, nut$sex, useNA = "ifany")
sample_by_sex_location_table
##
## 1 2 <NA>
## Grand Bassa 2709 2615 31
## Urban Montserrado 3762 3624 70
In Grand Bassa, there were a total of 2709 male
children and 2615 female children in the
survey sample. A total of 31 children in Grand Bassa
had parents who refused to participate in the survey.
In Urban Montserrado, there were a total of 3762 male
children and 3624 female children in the
survey sample. A total of 70 children in Urban
Montserrado had parents who refused to participate in the survey.
Age distribution of children in the sample
Following is a barplot of ages of the children in the sample.
barplot(
height = table(nut$county, nut$age),
beside = FALSE,
legend.text = TRUE,
main = "Distribution of Ages of Children by Location",
xlab = "Age (months)",
ylab = "n"
)
Following is a histogram of ages of children in the sample.
ggplot(
data = nut,
aes(
x = age,
fill = factor(sex, labels = c("Male", "Female")),
group = factor(sex, labels = c("Male", "Female"))
)
) +
geom_histogram(alpha = 0.5, bins = 60) +
scale_x_continuous(n.breaks = 24) +
facet_wrap( ~ county, ncol = 2) +
labs(
title = "Distribution of Ages of Children by Sex and Location",
x = "Age (months)", y = "n",
fill = NULL
) +
theme_bw() +
theme(legend.position = "top")
Nutrition screening coverage
The following data processing was first performed on the data before
continuing on with the analysis.
## Subset data: Transform variables of interest into table nut1
nut1 <- nut %>% select(survey_round,county,sex,muac_screen,oedema_screen)
## Clean data in subset: Change 99 to NA
### Clean data only after having made subset nut1.
### Code don't work if data is cleaned in nut and then subset. ???
nut1$muac_screen <- ifelse(nut1$muac_screen == 99, NA, nut1$muac_screen)
nut1$muac_screen[nut$muac_screen == 1] <- "Y"
nut1$muac_screen[nut$muac_screen == 2] <- "N"
nut1$oedema_screen <- ifelse(nut1$oedema_screen == 99, NA, nut1$oedema_screen)
nut1$oedema_screen[nut$oedema_screen == 1] <- "Y"
nut1$oedema_screen[nut$oedema_screen == 2] <- "N"
nut1$sex <- ifelse(nut1$sex == 1, "Male", "Female")
MUAC screening coverage
The following table presents MUAC screening coverage by survey
round.
nut1 %>%
tbl_summary(
by = survey_round,
include = muac_screen,
statistic = list(all_continuous() ~ "{mean} ({sd})")
)
Characteristic |
Baseline, N = 6,289 |
Endline, N = 6,522 |
muac_screen |
|
|
N |
4,556 (96%) |
6,026 (96%) |
Y |
208 (4.4%) |
230 (3.7%) |
Unknown |
1,525 |
266 |
The endline data shows LITTLE if NO improvement in MUAC screening
coverage among the sample children vs. baseline. Percentage of children
had MUAC screened (answered 1 to survey) stayed relatively the same from
baseline to endline. The percentage of children without MUAC screening
went up from 73% to 93%, mainly due to children from the NA population
at baseline moving over. This may suggest a better awareness in this
population related to not having gotten MUAC screening (?).
The following table presents MUAC screening coverage by survey round
and by sex of the child.
nut1 %>%
tbl_strata(
strata = sex,
.tbl_fun = ~ .x %>%
tbl_summary(
by = survey_round,
include = muac_screen,
statistic = list(all_continuous() ~ "{mean} ({sd})")
)
)
Characteristic |
Female
|
Male
|
NA
|
Baseline, N = 3,048 |
Endline, N = 3,191 |
Baseline, N = 3,186 |
Endline, N = 3,285 |
Baseline, N = 55 |
Endline, N = 46 |
muac_screen |
|
|
|
|
0 (NA%) |
0 (NA%) |
N |
2,215 (96%) |
2,995 (97%) |
2,341 (95%) |
3,031 (96%) |
|
|
Y |
86 (3.7%) |
102 (3.3%) |
122 (5.0%) |
128 (4.1%) |
|
|
Unknown |
747 |
94 |
723 |
126 |
55 |
46 |
There is no apparent difference in MUAC screening coverage between
girls and boys in the sample. Or, gender doesn’t seem to influence MUAC
screening in children.
The following table presents MUAC screening coverage by survey round
and by survey location.
nut1 %>%
tbl_strata(
strata=county,
.tbl_fun = ~ .x %>%
tbl_summary(
by = survey_round,
include = muac_screen,
statistic = list(all_continuous() ~ "{mean} ({sd})")
)
)
Characteristic |
Grand Bassa
|
Urban Montserrado
|
Baseline, N = 2,419 |
Endline, N = 2,936 |
Baseline, N = 3,870 |
Endline, N = 3,586 |
muac_screen |
|
|
|
|
N |
1,863 (98%) |
2,742 (96%) |
2,693 (94%) |
3,284 (97%) |
Y |
37 (1.9%) |
124 (4.3%) |
171 (6.0%) |
106 (3.1%) |
Unknown |
519 |
70 |
1,006 |
196 |
The data suggests an increase in children receiving MUAC screening at
endline in Grand Bassa vs. in Urban Montserrado. In fact, it seems that
the coverage of MUAC screening in Urban Montserrado decreases (from 4.5%
at baseline to 3% at endline). This suggests Grand Bassa to have done a
better job in MUAC screening than Montserrado. However, neither location
has a significant improvement in MUAC screening coverage. The overall
trend of increasing in no screening is observed here but this is again
due to population who answered NA at baseline moving to answered no to
screening at endline.
Oedema screening coverage
The following table presents oedema screening by survey round.
nut1 %>%
tbl_summary(
by = survey_round,
include = oedema_screen,
statistic = list(all_continuous() ~ "{mean} ({sd})")
)
Characteristic |
Baseline, N = 6,289 |
Endline, N = 6,522 |
oedema_screen |
|
|
N |
4,586 (97%) |
5,647 (97%) |
Y |
140 (3.0%) |
155 (2.7%) |
Unknown |
1,563 |
720 |
Similar to MUAC screening, the endline data shows little if no
improvement in oedema screening coverage among the sample children
vs. baseline. The same observation applies for movement of populations
who answered NA for oedema screening at baseline to answering no to
Oedema screening at endline. This may suggest again a better sense of
awareness and may serve as a reflection of public engagement
working?
The following table presents oedema screening by survey round and by
sex.
nut1 %>%
tbl_strata(
strata = sex,
.tbl_fun = ~ .x %>%
tbl_summary(
by = survey_round,
include = oedema_screen,
statistic = list(all_continuous() ~ "{mean} ({sd})")
)
)
Characteristic |
Female
|
Male
|
NA
|
Baseline, N = 3,048 |
Endline, N = 3,191 |
Baseline, N = 3,186 |
Endline, N = 3,285 |
Baseline, N = 55 |
Endline, N = 46 |
oedema_screen |
|
|
|
|
0 (NA%) |
0 (NA%) |
N |
2,227 (98%) |
2,818 (98%) |
2,359 (97%) |
2,829 (97%) |
|
|
Y |
55 (2.4%) |
64 (2.2%) |
85 (3.5%) |
91 (3.1%) |
|
|
Unknown |
766 |
309 |
742 |
365 |
55 |
46 |
The data suggests oedema screening improves SLIGHTLY in females
vs. in males. However, this difference does not seem big enough to call
for gender as a determinant in improvement of oedema screening. p-value
may be needed to determine if the difference is significant.
The following table presents oedema screening by survey round and by
survey location.
nut1 %>%
tbl_strata(
strata = county,
.tbl_fun = ~ .x %>%
tbl_summary(
by = survey_round,
include = oedema_screen,
statistic = list(all_continuous() ~ "{mean} ({sd})")
)
)
Characteristic |
Grand Bassa
|
Urban Montserrado
|
Baseline, N = 2,419 |
Endline, N = 2,936 |
Baseline, N = 3,870 |
Endline, N = 3,586 |
oedema_screen |
|
|
|
|
N |
1,879 (100%) |
2,463 (97%) |
2,707 (95%) |
3,184 (98%) |
Y |
7 (0.4%) |
82 (3.2%) |
133 (4.7%) |
73 (2.2%) |
Unknown |
533 |
391 |
1,030 |
329 |
The same trend is observed here for oedema screening. The data
suggests an increase in oedema screening coverage in Grand Bassa but a
decrease in Urban Montserrado, suggesting Grand Bassa doing a better
job.
The following table presents all the variables of interest with
p-values for chi-squared test comparing results for
each category.
nut1 %>%
tbl_summary(
by = survey_round,
statistic = list(all_continuous() ~ "{mean} ({sd})")
) %>%
add_p()
Characteristic |
Baseline, N = 6,289 |
Endline, N = 6,522 |
p-value |
county |
|
|
<0.001 |
Grand Bassa |
2,419 (38%) |
2,936 (45%) |
|
Urban Montserrado |
3,870 (62%) |
3,586 (55%) |
|
sex |
|
|
0.7 |
Female |
3,048 (49%) |
3,191 (49%) |
|
Male |
3,186 (51%) |
3,285 (51%) |
|
Unknown |
55 |
46 |
|
muac_screen |
|
|
0.066 |
N |
4,556 (96%) |
6,026 (96%) |
|
Y |
208 (4.4%) |
230 (3.7%) |
|
Unknown |
1,525 |
266 |
|
oedema_screen |
|
|
0.4 |
N |
4,586 (97%) |
5,647 (97%) |
|
Y |
140 (3.0%) |
155 (2.7%) |
|
Unknown |
1,563 |
720 |
|
Pearson’s Chi-squared test at the end help to show that
difference between endline and baseline is indeed statistically
significant. But this may be driven mainly by the number answering no to
screening increasing between baseline and endline, not a reflection of
how well the screening has increased between the 2 time points.
Prevalence of acute undernutrition
MAM cases by sex and location
The following steps were taken to process the data to be able to
tabulate the number of MAM cases by sex and location in the sample.
### Assigning male and female to sex
SEX <- ifelse(nut$sex == 1, "Male", "Female")
### Assigning yes and No to oedema
OEDEMA <- ifelse(nut$oedema == 1, "Yes", "No")
### Assigning nut$county to COUNTY
COUNTY <- nut$county
### Assigning the total number of children between 6-59 to Den
Den <- sum(nut$age >= 6 & nut$age < 60, na.rm = TRUE)
## NUMBER AND PREVALENCE OF MAM CASES
### Assigning the moderate MUAC criteria for children between 6-60 for Mod_MUAC
Mod_MUAC <- with(
nut,
muac >= 11.5 & muac < 12.5 & age >= 6 & age < 60
)
### Assigning MAM to table
MAM <- table(SEX, OEDEMA, Mod_MUAC, COUNTY, useNA = "ifany")
### CREATING A DATA FRAME FOR TOTAL MAM CASES
#data.frame(MAM)
### TOTAL MAM FEMALES IN URBAN MONTSERRADO
MAM_num_F1 <- MAM["Female", "No", "TRUE","Urban Montserrado"]
### TOTAL MAM FEMALES IN GRAND BASSA
MAM_num_F2 <- MAM["Female", "No", "TRUE","Grand Bassa"]
### TOTAL MAM MALES IN URBAN MONTSERRADO
MAM_num_M1 <- MAM["Male", "No", "TRUE","Urban Montserrado"]
### TOTAL MAM MALES IN GRAND BASSA
MAM_num_M2 <- MAM ["Male", "No", "TRUE","Grand Bassa"]
MAM_number <- data.frame(
Sex = c("Female", "Female", "Male", "Male"),
County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
Number_of_MAM = c(MAM_num_F1, MAM_num_F2, MAM_num_M1, MAM_num_M2)
)
## CREATING DATA FRAME FOR MAM CASES BY SEX AND COUNTY
### CREATING A TABLE BY SEX AND COUNTY
MAM_number_table <- xtabs(
Number_of_MAM ~ Sex + County, data = MAM_number
)
### VIEW MAM CASES BY SEX AND COUNTY
#MAM_number_table
### PREVALENCE OF FEMALE MAM IN URBAN MONTSERRADO
Prev1_MAM <- MAM["Female", "No", "TRUE","Urban Montserrado"] / Den
### PREVALENCE OF FEMALE MAM IN GRAND BASSA
Prev2_MAM <- MAM["Female", "No", "TRUE","Grand Bassa"] / Den
### PREVALENCE OF MALE MAM IN URBAN MONTSERRADO
Prev3_MAM <- MAM["Male", "No", "TRUE","Urban Montserrado"] / Den
### PREVALENCE OF FEMALE MAM IN GRAND BASSA
Prev4_MAM <- MAM["Male", "No", "TRUE","Grand Bassa"] / Den
### PREVALENCE OF MAM CASES BY SEX AND COUNTY
MAM_prevalences <- data.frame(
Sex = c("Female", "Female", "Male", "Male"),
County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
Prevalence_of_MAM = c(Prev1_MAM, Prev2_MAM, Prev3_MAM, Prev4_MAM)
)
## CREATING TABLE FOR MAM PREVALENCE BY SEX AND COUNTY
MAM_prevalences_table <- xtabs(
Prevalence_of_MAM ~ Sex + County, data = MAM_prevalences
)
### VIEW MAM PREVALENCE CASES BY SEX AND COUNTY
#MAM_prevalences_table
The following table presents the number of MAM cases by sex and by
location.
### CREATING A TABLE BY SEX AND COUNTY
MAM_number_table
## County
## Sex Grand Bassa Urban Montserrado
## Female 80 69
## Male 45 41
In Grand Bassa, there were 80 female MAM cases and
45 male MAM cases. In Urban Montserrado, there were
69 female MAM cases and 41 male MAM
cases.
The following table presents the prevalence of MAM by sex and by
location.
### VIEW MAM PREVALENCE CASES BY SEX AND COUNTY
MAM_prevalences_table
## County
## Sex Grand Bassa Urban Montserrado
## Female 0.006321612 0.005452390
## Male 0.003555907 0.003239826
Of the total MAM cases in the sample, 0.63% were
females from Grand Bassa, 0.36% were males from Grand
Bassa, 0.55% were females from Urban Montserrado and
0.32% were males from Urban Montserrado.
SAM cases by sex and location
The following steps were taken to process the data to be able to
tabulate the number of SAM cases by sex and location in the sample.
### Assigning the severe MUAC criteria for children between 6-59 for Sev_MUAC
Sev_MUAC <- with(nut, age >= 6 & age < 60 & muac < 11.5)
### Assigning SAM
SAM <- table (SEX, OEDEMA, Sev_MUAC, COUNTY, useNA = "ifany")
#data.frame(SAM)
### TOTAL SAM FEMALES IN URBAN MONTSERRADO
SAM_num_F1 <- SAM["Female", "No", "TRUE","Urban Montserrado"]
### TOTAL SAM FEMALES IN GRAND BASSA
SAM_num_F2 <- SAM["Female", "No", "TRUE","Grand Bassa"]
### TOTAL SAM MALES IN URBAN MONTSERRADO
SAM_num_M1 <- SAM["Male", "No", "TRUE","Urban Montserrado"]
### TOTAL SAM MALES IN GRAND BASSA
SAM_num_M2 <- SAM["Male", "No", "TRUE","Grand Bassa"]
### CREATING DATA FRAME FOR SAM CASES BY SEX AND COUNTY
SAM_number <- data.frame(
Sex = c("Female", "Female", "Male", "Male"),
County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
Number_of_SAM = c(SAM_num_F1, SAM_num_F2, SAM_num_M1, SAM_num_M2)
)
## CREATING TABLE FOR SAM CASES BY SEX AND COUNTY
SAM_number_table <- xtabs(
Number_of_SAM ~ Sex + County, data = SAM_number
)
### VIEW SAM CASES BY SEX AND COUNTY
#SAM_number_table
### PREVALENCE OF FEMALE SAM IN URBAN MONTSERRADO
Prev1_SAM <- SAM["Female", "Yes", "TRUE","Urban Montserrado"] / Den
### PREVALENCE OF FEMALE SAM IN GRAND BASSA
Prev2_SAM <- SAM["Female", "No", "TRUE","Grand Bassa"] / Den
### PREVALENCE OF MALE SAM IN URBAN MONTSERRADO
Prev3_SAM <- SAM["Male", "No", "TRUE","Urban Montserrado"] / Den
### PREVALENCE OF MALE SAM IN GRAND BASSA
Prev4_SAM <- SAM["Male", "No", "TRUE","Grand Bassa"] / Den
### PREVALENCE OF SAM CASES BY SEX AND COUNTY
SAM_prevalences <- data.frame(
Sex = c("Female", "Female", "Male", "Male"),
County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
Prevalence_of_SAM = c(Prev1_SAM, Prev2_SAM, Prev3_SAM, Prev4_SAM)
)
## CREATING TABLE FOR SAM PREVALENCE BY SEX AND COUNTY
SAM_prevalences_table <- xtabs(
Prevalence_of_SAM ~ Sex + County, data = SAM_prevalences
)
### VIEW SAM PREVALENCE BY SEX AND COUNTY
#SAM_prevalences_table
The following table presents the number of SAM cases by sex and by
location.
SAM_number_table
## County
## Sex Grand Bassa Urban Montserrado
## Female 22 27
## Male 33 14
In Grand Bassa, there were 22 female SAM cases and
33 male SAM cases. In Urban Montserrado, there were
27 female SAM cases and 14 male SAM
cases.
The following table presents the prevalence of SAM by sex and by
location.
SAM_prevalences_table
## County
## Sex Grand Bassa Urban Montserrado
## Female 0.001738443 0.000000000
## Male 0.002607665 0.001106282
Of the total SAM cases in the sample, 0.17% were
females from Grand Bassa, 0.26% were males from Grand
Bassa, 0% were females from Urban Montserrado and
0.11% were males from Urban Montserrado.
GAM cases by sex and location
The following steps were taken to process the data to be able to
tabulate the number of GAM cases by sex and location in the sample.
## SAM OR MAM CASES:
MALNUTRITION <- ifelse(nut$muac < 11.5 | nut$oedema == 1, "SAM", "No SAM")
MALNUTRITION <- ifelse(
nut$muac >= 11.5 & nut$muac < 12.5 & nut$oedema == 2, "MAM", MALNUTRITION
)
MALNUTRITION <- ifelse(MALNUTRITION == "No SAM", "not SAM or MAM", MALNUTRITION)
MALNUTRITION <- ifelse(nut$age >= 6 & nut$age < 60, MALNUTRITION, NA)
### CREATING A TABLE FOR EITHER MAM OR SAM CASES
final <- table(
SEX, OEDEMA, MALNUTRITION, COUNTY, useNA = "ifany"
)
### CREATING A DATA FRAME FOR TOTAL SAM OR MAM CASES
#data.frame(final)
## NUMBER OF SAM OR MAM CASES
### TOTAL SAM OR MAM FEMALES IN URBAN MONTSERRADO
SAMorMAM_F1 <- final["Female", , c("MAM", "SAM"), "Urban Montserrado"]
### TOTAL SAM OR MAM FEMALES IN GRAND BASSA
SAMorMAM_F2 <- final["Female", , c("MAM", "SAM"), "Grand Bassa"]
### TOTAL SAM OR MAM MALES IN URBAN MONTSERRADO
SAMorMAM_M1 <- final["Male", , c("MAM", "SAM"), "Urban Montserrado"]
### TOTAL SAM OR MAM FEMALES IN GRAND BASSA
SAMorMAM_M2 <- final["Male", , c("MAM", "SAM"), "Grand Bassa"]
### CREATING A DATA FRAME FOR TOTAL SAM OR MAM CASES BY SEX AND COUNTY
SAMorMAM_number <- data.frame(
Sex = c("Female", "Female", "Male", "Male"),
County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
Number_of_SAMorMAM = c(SAMorMAM_F1, SAMorMAM_F2, SAMorMAM_M1, SAMorMAM_M2)
)
### CREATING A TABLE FOR SAM OR MAM CASES BY SEX AND COUNTY
SAMorMAM_number_table <- xtabs(
Number_of_SAMorMAM ~ Sex + County, data = SAMorMAM_number
)
### VIEW SAM OR MAM CASES BY SEX AND COUNTY
#SAMorMAM_number_table
### PREVALENCE OF FEMALE MAM OR SAM CASES IN URBAN MONTSERRADO
Prev1_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Urban Montserrado"] / Den
### PREVALENCE OF FEMALE MAM OR SAM CASES IN GRAND BASSA
Prev2_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Grand Bassa"] / Den
### PREVALENCE OF MALE MAM OR SAM CASES IN URBAN MONTSERRADO
Prev3_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Urban Montserrado"] / Den
### PREVALENCE OF FEMALE MAM OR SAM CASES IN GRAND BASSA
Prev4_SAMorMAM <- final["Female", , c("MAM", "SAM"), "Grand Bassa"] / Den
### CREATING A DATA FRAME FOR PREVALENCE OF SAM OR MAM CASES BY SEX AND COUNTY
SAMorMAM_prevalences <- data.frame(
Sex = c("Female", "Female", "Male", "Male"),
County = c("Urban Montserrado", "Grand Bassa", "Urban Montserrado", "Grand Bassa"),
Prevalence_of_SAM = c(Prev1_SAMorMAM, Prev2_SAMorMAM, Prev3_SAMorMAM, Prev4_SAMorMAM)
)
### CREATING A TABLE FOR PREVALENCE OF SAM OR MAM BY SEX AND COUNTY
SAMorMAM_prevalences_table <- xtabs(
Prevalence_of_SAM ~ Sex + County,
data = SAMorMAM_prevalences
)
### VIEW SAM OR MAM PREVALENCE BY SEX AND COUNTY
#SAMorMAM_prevalences_table
The following table presents the number of GAM cases by sex and by
location.
SAMorMAM_number_table
## County
## Sex Grand Bassa Urban Montserrado
## Female 55 124
## Male 41 139
In Grand Bassa, there were 55 female GAM cases and
41 male GAM cases. In Urban Montserrado, there were
124 female GAM cases and 139 male GAM
cases.
The following table presents the prevalence of GAM by sex and by
location.
SAMorMAM_prevalences_table
## County
## Sex Grand Bassa Urban Montserrado
## Female 0.003476887 0.011853023
## Male 0.004267088 0.013749506
Of the total GAM cases in the sample, 0.35% were
females from Grand Bassa, 0.43% were males from Grand
Bassa, 1.19% were females from Urban Montserrado and
1.37% were males from Urban Montserrado.
Coverage of SAM treatment
Number of SAM cases found
The following table presents the number of cases of SAM found in the
overall sample.
nut$sam[nut$age >= 6 & nut$age < 60 & (nut$muac >= 11.5 | nut$oedema == 2)] <- 'no'
nut$sam[nut$age >= 6 & nut$age < 60 & (nut$muac < 11.5 | nut$oedema == 1)] <-'yes'
sam_table <- table(nut$sam)
sam_table
##
## no yes
## 12531 124
There were a total of 124 SAM cases found in the
overall sample.
The following table presents the number of SAM cases found in the
sample by location.
sam_location_table <- table(nut$sam, nut$county)
sam_location_table
##
## Grand Bassa Urban Montserrado
## no 5249 7282
## yes 69 55
There were a total of 69 SAM cases found in Grand
Bassa compared to 55 SAM cases found in Urban
Montserrado.
The following table presents the number of SAM cases found in the
sample by survey round.
sam_rounds_table <- table(nut$sam, nut$survey_round)
sam_rounds_table
##
## Baseline Endline
## no 6136 6395
## yes 51 73
There were a total of 51 SAM cases found at baseline
survey round compared to 73 SAM cases found at endline
survey round.
The following table presents the number of SAM cases found in the
sample by location and survey round.
sam_location_rounds_table <- table(nut$sam, nut$survey_round, nut$county)
sam_location_rounds_table
## , , = Grand Bassa
##
##
## Baseline Endline
## no 2372 2877
## yes 29 40
##
## , , = Urban Montserrado
##
##
## Baseline Endline
## no 3764 3518
## yes 22 33
In Grand Bassa, there were a total of 29 SAM cases
found at baseline and 40 SAM cases found at
endline.
In Urban Montserrado, there were a total of 22 SAM
cases found at baseline and 33 SAM cases found
at endline.
Case-finding effectiveness
The following table presents the case-finding effectiveness of the
CMAM programme overall.
##
## 1 2
## no 111 12420
## yes 16 108
## 1 2
## 0.1290323 0.8709677
The case-finding effectiveness of the CMAM programme overall was at
0.13%.
The following table presents the case-finding effectiveness of the
CMAM programme by location.
samcovloc <- table(nut$sam, nut$cov_status, nut$county)
samcovloc
## , , = Grand Bassa
##
##
## 1 2
## no 22 5227
## yes 4 65
##
## , , = Urban Montserrado
##
##
## 1 2
## no 89 7193
## yes 12 43
## prop.table(samcovloc) * 100 This code gives proportion of SAM cases in the
## programme by all children in the sample
## which is not consistent with the coverage
## estimator
## This code calculates the proportions for only those children who are SAM
## and in the programme for each location
samcov_grandbassa <- prop.table(samcovloc[2, , 1]) * 100
samcov_grandbassa
## 1 2
## 5.797101 94.202899
samcov_urbanmontserrado <- prop.table(samcovloc[2, , 2]) * 100
samcov_urbanmontserrado
## 1 2
## 21.81818 78.18182
In Grand Bassa, the case-finding effectiveness of the CMAM programme
was at 5.8%. In Urban Montserrado, the case-finding
effectiveness of the CMAM programme was at 21.82%.
LS0tCnRpdGxlOiAiTGliZXJpYSBDb21tdW5pdHktYmFzZWQgTWFuYWdlbWVudCBvZiBBY3V0ZSBNYWxudXRyaXRpb24gQ292ZXJhZ2UgQXNzZXNzbWVudCIKc3VidGl0bGU6ICJBIHJlcG9ydCBwcmVwYXJlZCBmb3IgdGhlIExpYmVyaWEgTWluaXN0cnkgb2YgSGVhbHRoIGFuZCBVTklDRUYgTGliZXJpYSIKYXV0aG9yOiAKICAgIC0gbmFtZTogTVNjIGluIEludGVybmF0aW9uYWwgSGVhbHRoIGFuZCBUcm9waWNhbCBNZWRpY2luZSBDbGFzcyAyMDIzCiAgICAtIG5hbWU6IFVuaXZlcnNpdHkgb2YgT3hmb3JkCmRhdGU6ICdgciBTeXMuRGF0ZSgpYCcKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICB3YXJuaW5nID0gRkFMU0UsCiAgZXJyb3IgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgZWNobyA9IEZBTFNFCikKCiMjIExvYWQgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ3RzdW1tYXJ5KQpsaWJyYXJ5KGdncGxvdDIpCgojIyBMb2FkIGZ1bmN0aW9ucyBpbiBSIGZvbGRlcgpmb3IgKGYgaW4gbGlzdC5maWxlcygiUiIsIGZ1bGwubmFtZXMgPSBUUlVFKSkgc291cmNlIChmKQoKIyMgR2V0IGRhdGEKbnV0IDwtIGdldF9kYXRhKCkKYGBgCgojIyBJbnRyb2R1Y3Rpb24KCkEgdGhyZWUteWVhciBudXRyaXRpb24gcHJvZ3JhbW1lIGhhcyBiZWVuIGltcGxlbWVudGVkIGluIExpYmVyaWEgYnkgdGhlIE1pbmlzdHJ5IG9mIEhlYWx0aCBhbmQgVU5JQ0VGIGFpbWVkIGF0IHRhY2tsaW5nIGNoaWxkIHVuZGVybnV0cml0aW9uIGluIHRoZSBjb3VudHJ5LiBGdW5kZWQgYnkgW1Bvd2VyIG9mIE51dHJpdGlvbl0oaHR0cDovL3d3dy5wb3dlcm9mbnV0cml0aW9uLm9yZykgYW5kIFtVTklDRUYgVUtdKGh0dHBzOi8vd3d3LnVuaWNlZi5vcmcudWspLCB0aGUgcHJvZ3JhbW1lIGhhcyBiZWVuIGltcGxlbWVudGVkIGFjcm9zcyAxNSBjb3VudGllcyBpbiBMaWJlcmlhIHN0YXJ0aW5nIGZyb20gSmFudWFyeSAyMDE3IHVwIHRvIERlY2VtYmVyIDIwMTkuIFRoZSBvdmVyYWxsIGFpbSBvZiB0aGUgcHJvZ3JhbW1lIGlzIHRvIGltcHJvdmUgdGhlIGNvdmVyYWdlIG9mIGRpcmVjdCBudXRyaXRpb24gaW50ZXJ2ZW50aW9ucyBvciB3aGF0IGlzIGNvbW1vbmx5IHRlcm1lZCBudXRyaXRpb24tc3BlY2lmaWMgaW50ZXJ2ZW50aW9ucywgaS5lLiBpbnRlcnZlbnRpb25zIG9yIHByb2dyYW1tZXMgdGhhdCBhZGRyZXNzIHRoZSBpbW1lZGlhdGUgZGV0ZXJtaW5hbnRzIG9mIGZvZXRhbCBhbmQgY2hpbGQgbnV0cml0aW9uIGFuZCBkZXZlbG9wbWVudCDigJQgYWRlcXVhdGUgZm9vZCBhbmQgbnV0cmllbnQgaW50YWtlLCBmZWVkaW5nLCBjYXJlZ2l2aW5nIGFuZCBwYXJlbnRpbmcgcHJhY3RpY2VzLCBhbmQgbG93IGJ1cmRlbiBvZiBpbmZlY3Rpb3VzIGRpc2Vhc2VzLiBUaGUgY3VycmVudCBwcm9ncmFtbWUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzcGVjaWZpYyBrZXkgaW50ZXJ2ZW50aW9uczogMSkgKnRyZWF0bWVudCBvZiBzZXZlcmUgYWN1dGUgbWFsbnV0cml0aW9uIChTQU0pIHdpdGhpbiB0aGUgY29tbXVuaXR5LWJhc2VkIG1hbmFnZW1lbnQgb2YgYWN1dGUgbWFsbnV0cml0aW9uIChDTUFNKSBwcm9ncmFtbWUgZm9yIGNoaWxkcmVuIDYtNTkgbW9udGhzKjsgMikgKnZpdGFtaW4gQSBzdXBwbGVtZW50YXRpb24gZm9yIGNoaWxkcmVuIDYtNTkgbW9udGhzKjsgMykgKnByb21vdGlvbiBvZiBhcHByb3ByaWF0ZSBpbmZhbnQgYW5kIHlvdW5nIGNoaWxkIGZlZWRpbmcgKElZQ0YpIHByYWN0aWNlcyBhbW9uZyBwcmVnbmFudCBvciBsYWN0YXRpbmcgd29tZW4qOyA0KSAqbXVsdGlwbGUgbWljcm9udXRyaWVudCBwb3dkZXIgKE1OUCkgc3VwcGxlbWVudGF0aW9uIGZvciBjaGlsZHJlbiA2LTIzIG1vbnRocyo7IGFuZCwgNSkgKmlyb24gYW5kIGZvbGljIGFjaWQgKElGQSkgc3VwcGxlbWVudGF0aW9uIGZvciBwcmVnbmFudCB3b21lbiouCgpUbyBhc3Nlc3MgdGhlIHByb2dyYW1tZSdzIHByb2dyZXNzIHRvd2FyZHMgaXRzIG92ZXJhbGwgYWltLCB0d28gY292ZXJhZ2UgYXNzZXNzbWVudHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIC0gdGhlIGZpcnN0IGF0IHRoZSBoYWxmd2F5IHBvaW50IG9mIHRoZSBwcm9ncmFtbWUgYW5kIHRoZSBzZWNvbmQgYXQgdGhlIGVuZC4gT25seSB0d28gcHJvZ3JhbW1lIGFyZWFzIHdlcmUgc2VsZWN0ZWQgZm9yIHRoZSBhc3Nlc3NtZW50czogKlVyYmFuIE1vbnRzZXJyYWRvIChHcmVhdGVyIE1vbnJvdmlhKSogZGlzdHJpY3QgYW5kICpHcmFuZCBCYXNzYSogY291bnR5LgoKVGhpcyBkb2N1bWVudCByZXBvcnRzIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBjb3ZlcmFnZSBhc3Nlc3NtZW50IG9mIHRoZSBDTUFNIHByb2dyYW1tZSBmb3IgdHJlYXRpbmcgU0FNIGNoaWxkcmVuIDYtNTkgbW9udGhzIG9sZC4KCiMjIERlc2NyaXB0aW9uIG9mIHRoZSBzYW1wbGUKPCEtLS0gSU5TRVJUIFRFWFQgQU5EIExJVEVSQVRFIENPREUgQkVMT1cgVEhJUyBMSU5FIC0tLT4KCiMjIyBDaGlsZHJlbiBieSBzZXggYW5kIGxvY2F0aW9uCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZSBieSBzZXguCgpgYGB7ciBzYW1wbGVfYnlfc2V4LCBlY2hvID0gVFJVRX0Kc2FtcGxlX2J5X3NleF90YWJsZSA8LSB0YWJsZShudXQkc2V4LCB1c2VOQSA9ICJpZmFueSIpCgpzYW1wbGVfYnlfc2V4X3RhYmxlCmBgYAoKVGhlcmUgd2VyZSBhIHRvdGFsIG9mICoqYHIgc2FtcGxlX2J5X3NleF90YWJsZVsxXWAgbWFsZSBjaGlsZHJlbioqIGFuZCAqKmByIHNhbXBsZV9ieV9zZXhfdGFibGVbMl1gIGZlbWFsZSBjaGlsZHJlbioqIGluIHRoZSBzdXJ2ZXkgc2FtcGxlLiBUaGVyZSB3ZXJlIGFsc28gYSB0b3RhbCBvZiAqKmByIHNhbXBsZV9ieV9zZXhfdGFibGVbM11gIGNoaWxkcmVuKiogd2hvc2UgcGFyZW50cyByZWZ1c2VkIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBzdXJ2ZXkuCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZSBieSBsb2NhdGlvbi4KCmBgYHtyIHNhbXBsZV9ieV9sb2NhdGlvbiwgZWNobyA9IFRSVUV9CnNhbXBsZV9ieV9sb2NhdGlvbl90YWJsZSA8LSB0YWJsZShudXQkY291bnR5LCB1c2VOQSA9ICJpZmFueSIpCgpzYW1wbGVfYnlfbG9jYXRpb25fdGFibGUKYGBgCgpUaGVyZSB3ZXJlIGEgdG90YWwgb2YgKipgciBzYW1wbGVfYnlfbG9jYXRpb25fdGFibGVbMV1gIGNoaWxkcmVuIGZyb20gR3JhbmQgQmFzc2EqKiBhbmQgKipgciBzYW1wbGVfYnlfbG9jYXRpb25fdGFibGVbMl1gIGNoaWxkcmVuIGZyb20gVXJiYW4gTW9udHNlcnJhZG8qKi4KClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGUgc2FtcGxlIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uLCBlY2hvID0gVFJVRX0Kc2FtcGxlX2J5X3NleF9sb2NhdGlvbl90YWJsZSA8LSB0YWJsZShudXQkY291bnR5LCBudXQkc2V4LCB1c2VOQSA9ICJpZmFueSIpCgpzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgYSB0b3RhbCBvZiAqKmByIHNhbXBsZV9ieV9zZXhfbG9jYXRpb25fdGFibGVbMSwgMV1gIG1hbGUgY2hpbGRyZW4qKiBhbmQgKipgciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlWzEsIDJdYCBmZW1hbGUgY2hpbGRyZW4qKiBpbiB0aGUgc3VydmV5IHNhbXBsZS4gQSB0b3RhbCBvZiAqKmByIHNhbXBsZV9ieV9zZXhfbG9jYXRpb25fdGFibGVbMSwgM11gIGNoaWxkcmVuKiogaW4gR3JhbmQgQmFzc2EgaGFkIHBhcmVudHMgd2hvIHJlZnVzZWQgdG8gcGFydGljaXBhdGUgaW4gdGhlIHN1cnZleS4KCkluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGVyZSB3ZXJlIGEgdG90YWwgb2YgKipgciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlWzIsIDFdYCBtYWxlIGNoaWxkcmVuKiogYW5kICoqYHIgc2FtcGxlX2J5X3NleF9sb2NhdGlvbl90YWJsZVsyLCAyXWAgZmVtYWxlIGNoaWxkcmVuKiogaW4gdGhlIHN1cnZleSBzYW1wbGUuIEEgdG90YWwgb2YgKipgciBzYW1wbGVfYnlfc2V4X2xvY2F0aW9uX3RhYmxlWzIsIDNdYCBjaGlsZHJlbioqIGluIFVyYmFuIE1vbnRzZXJyYWRvIGhhZCBwYXJlbnRzIHdobyByZWZ1c2VkIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBzdXJ2ZXkuCgojIyMgQWdlIGRpc3RyaWJ1dGlvbiBvZiBjaGlsZHJlbiBpbiB0aGUgc2FtcGxlCgpGb2xsb3dpbmcgaXMgYSBiYXJwbG90IG9mIGFnZXMgb2YgdGhlIGNoaWxkcmVuIGluIHRoZSBzYW1wbGUuCgpgYGB7ciBzYW1wbGUtYmFycGxvdCwgZWNobyA9IFRSVUUsIGZpZy5jYXAgPSAiRGlzdHJpYnV0aW9uIG9mIGFnZXMgb2YgY2hpbGRyZW4gYnkgbG9jYXRpb24iLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQpiYXJwbG90KAogIGhlaWdodCA9IHRhYmxlKG51dCRjb3VudHksIG51dCRhZ2UpLAogIGJlc2lkZSA9IEZBTFNFLAogIGxlZ2VuZC50ZXh0ID0gVFJVRSwKICBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBBZ2VzIG9mIENoaWxkcmVuIGJ5IExvY2F0aW9uIiwKICB4bGFiID0gIkFnZSAobW9udGhzKSIsCiAgeWxhYiA9ICJuIgopCmBgYAoKRm9sbG93aW5nIGlzIGEgaGlzdG9ncmFtIG9mIGFnZXMgb2YgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZS4KCmBgYHtyIHNhbXBsZS1oaXN0b2dyYW0sIGVjaG8gPSBUUlVFLCBmaWcuY2FwID0gIkRpc3RyaWJ1dGlvbiBvZiBhZ2VzIG9mIGNoaWxkcmVuIiwgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KZ2dwbG90KAogIGRhdGEgPSBudXQsIAogIGFlcygKICAgIHggPSBhZ2UsIAogICAgZmlsbCA9IGZhY3RvcihzZXgsIGxhYmVscyA9IGMoIk1hbGUiLCAiRmVtYWxlIikpLAogICAgZ3JvdXAgPSBmYWN0b3Ioc2V4LCBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpKQogICkKKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWxwaGEgPSAwLjUsIGJpbnMgPSA2MCkgKwogIHNjYWxlX3hfY29udGludW91cyhuLmJyZWFrcyA9IDI0KSArCiAgZmFjZXRfd3JhcCggfiBjb3VudHksIG5jb2wgPSAyKSArCiAgbGFicygKICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBBZ2VzIG9mIENoaWxkcmVuIGJ5IFNleCBhbmQgTG9jYXRpb24iLCAKICAgIHggPSAiQWdlIChtb250aHMpIiwgeSA9ICJuIiwKICAgIGZpbGwgPSBOVUxMCiAgKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKIyMgTnV0cml0aW9uIHNjcmVlbmluZyBjb3ZlcmFnZQo8IS0tLSBJTlNFUlQgVEVYVCBBTkQgTElURVJBVEUgQ09ERSBCRUxPVyBUSElTIExJTkUgLS0tPgoKVGhlIGZvbGxvd2luZyBkYXRhIHByb2Nlc3Npbmcgd2FzIGZpcnN0IHBlcmZvcm1lZCBvbiB0aGUgZGF0YSBiZWZvcmUgY29udGludWluZyBvbiB3aXRoIHRoZSBhbmFseXNpcy4KCmBgYHtyIHByb2Nlc3NfZGF0YV9zY3JlZW4sIGVjaG8gPSBUUlVFfQojIyBTdWJzZXQgZGF0YTogVHJhbnNmb3JtIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCBpbnRvIHRhYmxlIG51dDEgCm51dDEgPC0gbnV0ICU+JSBzZWxlY3Qoc3VydmV5X3JvdW5kLGNvdW50eSxzZXgsbXVhY19zY3JlZW4sb2VkZW1hX3NjcmVlbikKCiMjIENsZWFuIGRhdGEgaW4gc3Vic2V0OiBDaGFuZ2UgOTkgdG8gTkEgCiMjIyBDbGVhbiBkYXRhIG9ubHkgYWZ0ZXIgaGF2aW5nIG1hZGUgc3Vic2V0IG51dDEuIAojIyMgQ29kZSBkb24ndCB3b3JrIGlmIGRhdGEgaXMgY2xlYW5lZCBpbiBudXQgYW5kIHRoZW4gc3Vic2V0LiA/Pz8KbnV0MSRtdWFjX3NjcmVlbiA8LSBpZmVsc2UobnV0MSRtdWFjX3NjcmVlbiA9PSA5OSwgTkEsIG51dDEkbXVhY19zY3JlZW4pCm51dDEkbXVhY19zY3JlZW5bbnV0JG11YWNfc2NyZWVuID09IDFdIDwtICJZIgpudXQxJG11YWNfc2NyZWVuW251dCRtdWFjX3NjcmVlbiA9PSAyXSA8LSAiTiIKCm51dDEkb2VkZW1hX3NjcmVlbiA8LSBpZmVsc2UobnV0MSRvZWRlbWFfc2NyZWVuID09IDk5LCBOQSwgbnV0MSRvZWRlbWFfc2NyZWVuKQpudXQxJG9lZGVtYV9zY3JlZW5bbnV0JG9lZGVtYV9zY3JlZW4gPT0gMV0gPC0gIlkiCm51dDEkb2VkZW1hX3NjcmVlbltudXQkb2VkZW1hX3NjcmVlbiA9PSAyXSA8LSAiTiIKCm51dDEkc2V4IDwtIGlmZWxzZShudXQxJHNleCA9PSAxLCAiTWFsZSIsICJGZW1hbGUiKQpgYGAKCiMjIyBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZQoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZSBieSBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBtdWFjX3NjcmVlbl90YWJsZSwgZWNobyA9IFRSVUV9Cm51dDEgJT4lIAogIHRibF9zdW1tYXJ5KAogICAgYnkgPSBzdXJ2ZXlfcm91bmQsIAogICAgaW5jbHVkZSA9IG11YWNfc2NyZWVuLAogICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICkKYGBgCgpUaGUgZW5kbGluZSBkYXRhIHNob3dzIExJVFRMRSBpZiBOTyBpbXByb3ZlbWVudCBpbiBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZSBhbW9uZyB0aGUgc2FtcGxlIGNoaWxkcmVuIHZzLiBiYXNlbGluZS4gUGVyY2VudGFnZSBvZiBjaGlsZHJlbiBoYWQgTVVBQyBzY3JlZW5lZCAoYW5zd2VyZWQgMSB0byBzdXJ2ZXkpIHN0YXllZCByZWxhdGl2ZWx5IHRoZSBzYW1lIGZyb20gYmFzZWxpbmUgdG8gZW5kbGluZS4gVGhlIHBlcmNlbnRhZ2Ugb2YgY2hpbGRyZW4gd2l0aG91dCBNVUFDIHNjcmVlbmluZyB3ZW50IHVwIGZyb20gNzMlIHRvIDkzJSwgbWFpbmx5IGR1ZSB0byBjaGlsZHJlbiBmcm9tIHRoZSBOQSBwb3B1bGF0aW9uIGF0IGJhc2VsaW5lIG1vdmluZyBvdmVyLiBUaGlzIG1heSBzdWdnZXN0IGEgYmV0dGVyIGF3YXJlbmVzcyBpbiB0aGlzIHBvcHVsYXRpb24gcmVsYXRlZCB0byBub3QgaGF2aW5nIGdvdHRlbiBNVUFDIHNjcmVlbmluZyAoPykuCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIE1VQUMgc2NyZWVuaW5nIGNvdmVyYWdlIGJ5IHN1cnZleSByb3VuZCBhbmQgYnkgc2V4IG9mIHRoZSBjaGlsZC4KCmBgYHtyIG11YWNfc2NyZWVuX2J5X3NleF90YWJsZSwgZWNobyA9IFRSVUV9Cm51dDEgJT4lIAogIHRibF9zdHJhdGEoCiAgICBzdHJhdGEgPSBzZXgsIAogICAgLnRibF9mdW4gPSB+IC54ICU+JSAKICAgICAgdGJsX3N1bW1hcnkoCiAgICAgICAgYnkgPSBzdXJ2ZXlfcm91bmQsCiAgICAgICAgaW5jbHVkZSA9IG11YWNfc2NyZWVuLAogICAgICAgIHN0YXRpc3RpYyA9IGxpc3QoYWxsX2NvbnRpbnVvdXMoKSB+ICJ7bWVhbn0gKHtzZH0pIikKICAgICAgKQogICkKYGBgCgpUaGVyZSBpcyBubyBhcHBhcmVudCBkaWZmZXJlbmNlIGluIE1VQUMgc2NyZWVuaW5nIGNvdmVyYWdlIGJldHdlZW4gZ2lybHMgYW5kIGJveXMgaW4gdGhlIHNhbXBsZS4gT3IsIGdlbmRlciBkb2Vzbid0IHNlZW0gdG8gaW5mbHVlbmNlIE1VQUMgc2NyZWVuaW5nIGluIGNoaWxkcmVuLgoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZSBieSBzdXJ2ZXkgcm91bmQgYW5kIGJ5IHN1cnZleSBsb2NhdGlvbi4KCmBgYHtyIG11YWNfc2NyZWVuX2J5X2xvY2F0aW9uX3RhYmxlLCBlY2hvID0gVFJVRX0KbnV0MSAlPiUgCiAgdGJsX3N0cmF0YSgKICAgIHN0cmF0YT1jb3VudHksCiAgICAudGJsX2Z1biA9IH4gLnggJT4lIAogICAgICB0Ymxfc3VtbWFyeSgKICAgICAgICBieSA9IHN1cnZleV9yb3VuZCwKICAgICAgICBpbmNsdWRlID0gbXVhY19zY3JlZW4sCiAgICAgICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICAgICApCiAgICkKYGBgCgpUaGUgZGF0YSBzdWdnZXN0cyBhbiBpbmNyZWFzZSBpbiBjaGlsZHJlbiByZWNlaXZpbmcgTVVBQyBzY3JlZW5pbmcgYXQgZW5kbGluZSBpbiBHcmFuZCBCYXNzYSB2cy4gaW4gVXJiYW4gTW9udHNlcnJhZG8uIEluIGZhY3QsIGl0IHNlZW1zIHRoYXQgdGhlIGNvdmVyYWdlIG9mIE1VQUMgc2NyZWVuaW5nIGluIFVyYmFuIE1vbnRzZXJyYWRvIGRlY3JlYXNlcyAoZnJvbSA0LjUlIGF0IGJhc2VsaW5lIHRvIDMlIGF0IGVuZGxpbmUpLiBUaGlzIHN1Z2dlc3RzIEdyYW5kIEJhc3NhIHRvIGhhdmUgZG9uZSBhIGJldHRlciBqb2IgaW4gTVVBQyBzY3JlZW5pbmcgdGhhbiBNb250c2VycmFkby4gSG93ZXZlciwgbmVpdGhlciBsb2NhdGlvbiBoYXMgYSBzaWduaWZpY2FudCBpbXByb3ZlbWVudCBpbiBNVUFDIHNjcmVlbmluZyBjb3ZlcmFnZS4gVGhlIG92ZXJhbGwgdHJlbmQgb2YgaW5jcmVhc2luZyBpbiBubyBzY3JlZW5pbmcgaXMgb2JzZXJ2ZWQgaGVyZSBidXQgdGhpcyBpcyBhZ2FpbiBkdWUgdG8gcG9wdWxhdGlvbiB3aG8gYW5zd2VyZWQgTkEgYXQgYmFzZWxpbmUgbW92aW5nIHRvIGFuc3dlcmVkIG5vIHRvIHNjcmVlbmluZyBhdCBlbmRsaW5lLgoKIyMjIE9lZGVtYSBzY3JlZW5pbmcgY292ZXJhZ2UKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgb2VkZW1hIHNjcmVlbmluZyBieSBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBvZWRlbWFfc2NyZWVuX3RhYmxlLCBlY2hvID0gVFJVRX0KbnV0MSAlPiUgCiAgdGJsX3N1bW1hcnkoCiAgICBieSA9IHN1cnZleV9yb3VuZCwgCiAgICBpbmNsdWRlID0gb2VkZW1hX3NjcmVlbiwKICAgIHN0YXRpc3RpYyA9IGxpc3QoYWxsX2NvbnRpbnVvdXMoKSB+ICJ7bWVhbn0gKHtzZH0pIikKICApCmBgYAoKU2ltaWxhciB0byBNVUFDIHNjcmVlbmluZywgdGhlIGVuZGxpbmUgZGF0YSBzaG93cyBsaXR0bGUgaWYgbm8gaW1wcm92ZW1lbnQgaW4gb2VkZW1hIHNjcmVlbmluZyBjb3ZlcmFnZSBhbW9uZyB0aGUgc2FtcGxlIGNoaWxkcmVuIHZzLiBiYXNlbGluZS4gVGhlIHNhbWUgb2JzZXJ2YXRpb24gYXBwbGllcyBmb3IgbW92ZW1lbnQgb2YgcG9wdWxhdGlvbnMgd2hvIGFuc3dlcmVkIE5BIGZvciBvZWRlbWEgc2NyZWVuaW5nIGF0IGJhc2VsaW5lIHRvIGFuc3dlcmluZyBubyB0byBPZWRlbWEgc2NyZWVuaW5nIGF0IGVuZGxpbmUuIFRoaXMgbWF5IHN1Z2dlc3QgYWdhaW4gYSBiZXR0ZXIgc2Vuc2Ugb2YgYXdhcmVuZXNzIGFuZCBtYXkgc2VydmUgYXMgYSByZWZsZWN0aW9uIG9mIHB1YmxpYyBlbmdhZ2VtZW50IHdvcmtpbmc/CgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIG9lZGVtYSBzY3JlZW5pbmcgYnkgc3VydmV5IHJvdW5kIGFuZCBieSBzZXguCgpgYGB7ciBvZWRlbWFfc2NyZWVuX2J5X3NleCwgZWNobyA9IFRSVUV9Cm51dDEgJT4lIAogIHRibF9zdHJhdGEoCiAgICBzdHJhdGEgPSBzZXgsCiAgICAudGJsX2Z1biA9IH4gLnggJT4lIAogICAgICB0Ymxfc3VtbWFyeSgKICAgICAgICBieSA9IHN1cnZleV9yb3VuZCwKICAgICAgICBpbmNsdWRlID0gb2VkZW1hX3NjcmVlbiwgCiAgICAgICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICAgICApCiAgKQpgYGAKClRoZSBkYXRhIHN1Z2dlc3RzIG9lZGVtYSBzY3JlZW5pbmcgaW1wcm92ZXMgU0xJR0hUTFkgaW4gZmVtYWxlcyB2cy4gaW4gbWFsZXMuIEhvd2V2ZXIsIHRoaXMgZGlmZmVyZW5jZSBkb2VzIG5vdCBzZWVtIGJpZyBlbm91Z2ggdG8gY2FsbCBmb3IgZ2VuZGVyIGFzIGEgZGV0ZXJtaW5hbnQgaW4gaW1wcm92ZW1lbnQgb2Ygb2VkZW1hIHNjcmVlbmluZy4gcC12YWx1ZSBtYXkgYmUgbmVlZGVkIHRvIGRldGVybWluZSBpZiB0aGUgZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudC4KClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgb2VkZW1hIHNjcmVlbmluZyBieSBzdXJ2ZXkgcm91bmQgYW5kIGJ5IHN1cnZleSBsb2NhdGlvbi4KCmBgYHtyIG9lZGVtYV9zY3JlZW5fYnlfbG9jYXRpb24sIGVjaG8gPSBUUlVFfQpudXQxICU+JSAKICB0Ymxfc3RyYXRhKAogICAgc3RyYXRhID0gY291bnR5LAogICAgLnRibF9mdW4gPSB+IC54ICU+JSAKICAgICAgdGJsX3N1bW1hcnkoCiAgICAgICAgYnkgPSBzdXJ2ZXlfcm91bmQsCiAgICAgICAgaW5jbHVkZSA9IG9lZGVtYV9zY3JlZW4sCiAgICAgICAgc3RhdGlzdGljID0gbGlzdChhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiKQogICAgICApCiAgKQpgYGAKClRoZSBzYW1lIHRyZW5kIGlzIG9ic2VydmVkIGhlcmUgZm9yIG9lZGVtYSBzY3JlZW5pbmcuIFRoZSBkYXRhIHN1Z2dlc3RzIGFuIGluY3JlYXNlIGluIG9lZGVtYSBzY3JlZW5pbmcgY292ZXJhZ2UgaW4gR3JhbmQgQmFzc2EgYnV0IGEgZGVjcmVhc2UgaW4gVXJiYW4gTW9udHNlcnJhZG8sIHN1Z2dlc3RpbmcgR3JhbmQgQmFzc2EgZG9pbmcgYSBiZXR0ZXIgam9iLiAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgYWxsIHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3Qgd2l0aCAqcC12YWx1ZXMqIGZvciAqY2hpLXNxdWFyZWQgdGVzdCogY29tcGFyaW5nIHJlc3VsdHMgZm9yIGVhY2ggY2F0ZWdvcnkuCgpgYGB7ciBzdW1tYXJ5X3RhYmxlLCBlY2hvID0gVFJVRX0KbnV0MSAlPiUgCiAgdGJsX3N1bW1hcnkoCiAgICBieSA9IHN1cnZleV9yb3VuZCwgCiAgICBzdGF0aXN0aWMgPSBsaXN0KGFsbF9jb250aW51b3VzKCkgfiAie21lYW59ICh7c2R9KSIpCiAgKSAlPiUgCiAgYWRkX3AoKSAKYGBgCgoqUGVhcnNvbidzIENoaS1zcXVhcmVkIHRlc3QqIGF0IHRoZSBlbmQgaGVscCB0byBzaG93IHRoYXQgZGlmZmVyZW5jZSBiZXR3ZWVuIGVuZGxpbmUgYW5kIGJhc2VsaW5lIGlzIGluZGVlZCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBCdXQgdGhpcyBtYXkgYmUgZHJpdmVuIG1haW5seSBieSB0aGUgbnVtYmVyIGFuc3dlcmluZyBubyB0byBzY3JlZW5pbmcgaW5jcmVhc2luZyBiZXR3ZWVuIGJhc2VsaW5lIGFuZCBlbmRsaW5lLCBub3QgYSByZWZsZWN0aW9uIG9mIGhvdyB3ZWxsIHRoZSBzY3JlZW5pbmcgaGFzIGluY3JlYXNlZCBiZXR3ZWVuIHRoZSAyIHRpbWUgcG9pbnRzLgoKIyMgUHJldmFsZW5jZSBvZiBhY3V0ZSB1bmRlcm51dHJpdGlvbgo8IS0tLSBJTlNFUlQgVEVYVCBBTkQgTElURVJBVEUgQ09ERSBCRUxPVyBUSElTIExJTkUgLS0tPgoKIyMjIE1BTSBjYXNlcyBieSBzZXggYW5kIGxvY2F0aW9uCgpUaGUgZm9sbG93aW5nIHN0ZXBzIHdlcmUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgZGF0YSB0byBiZSBhYmxlIHRvIHRhYnVsYXRlIHRoZSBudW1iZXIgb2YgTUFNIGNhc2VzIGJ5IHNleCBhbmQgbG9jYXRpb24gaW4gdGhlIHNhbXBsZS4KCmBgYHtyIG1hbV90YWJsZV9jb2RlLCBlY2hvID0gVFJVRX0KIyMjIEFzc2lnbmluZyBtYWxlIGFuZCBmZW1hbGUgdG8gc2V4ClNFWCA8LSBpZmVsc2UobnV0JHNleCA9PSAxLCAiTWFsZSIsICJGZW1hbGUiKSAKCiMjIyBBc3NpZ25pbmcgeWVzIGFuZCBObyB0byBvZWRlbWEKT0VERU1BIDwtIGlmZWxzZShudXQkb2VkZW1hID09IDEsICJZZXMiLCAiTm8iKSAKCiMjIyBBc3NpZ25pbmcgbnV0JGNvdW50eSB0byBDT1VOVFkKQ09VTlRZIDwtIG51dCRjb3VudHkgCgojIyMgQXNzaWduaW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hpbGRyZW4gYmV0d2VlbiA2LTU5IHRvIERlbgpEZW4gPC0gc3VtKG51dCRhZ2UgPj0gNiAmIG51dCRhZ2UgPCA2MCwgbmEucm0gPSBUUlVFKSAKCiMjIE5VTUJFUiBBTkQgUFJFVkFMRU5DRSBPRiBNQU0gQ0FTRVMKCiMjIyBBc3NpZ25pbmcgdGhlIG1vZGVyYXRlIE1VQUMgY3JpdGVyaWEgZm9yIGNoaWxkcmVuIGJldHdlZW4gNi02MCBmb3IgTW9kX01VQUMKTW9kX01VQUMgPC0gd2l0aCgKICBudXQsIAogIG11YWMgPj0gMTEuNSAmIG11YWMgPCAxMi41ICYgYWdlID49IDYgJiBhZ2UgPCA2MAopIAoKIyMjIEFzc2lnbmluZyBNQU0gdG8gdGFibGUKTUFNIDwtIHRhYmxlKFNFWCwgT0VERU1BLCBNb2RfTVVBQywgQ09VTlRZLCB1c2VOQSA9ICJpZmFueSIpICAKCiMjIyBDUkVBVElORyBBIERBVEEgRlJBTUUgRk9SIFRPVEFMIE1BTSBDQVNFUwojZGF0YS5mcmFtZShNQU0pIAoKIyMjIFRPVEFMIE1BTSBGRU1BTEVTIElOIFVSQkFOIE1PTlRTRVJSQURPCk1BTV9udW1fRjEgPC0gTUFNWyJGZW1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gCgojIyMgVE9UQUwgTUFNIEZFTUFMRVMgSU4gR1JBTkQgQkFTU0EKTUFNX251bV9GMiA8LSBNQU1bIkZlbWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAKCiMjIyBUT1RBTCBNQU0gTUFMRVMgSU4gVVJCQU4gTU9OVFNFUlJBRE8KTUFNX251bV9NMSA8LSBNQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0KCiMjIyBUT1RBTCBNQU0gTUFMRVMgSU4gR1JBTkQgQkFTU0EKTUFNX251bV9NMiA8LSBNQU0gWyJNYWxlIiwgIk5vIiwgIlRSVUUiLCJHcmFuZCBCYXNzYSJdIAoKTUFNX251bWJlciA8LSBkYXRhLmZyYW1lKAogIFNleCA9IGMoIkZlbWFsZSIsICJGZW1hbGUiLCAiTWFsZSIsICJNYWxlIiksCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwgCiAgTnVtYmVyX29mX01BTSA9IGMoTUFNX251bV9GMSwgTUFNX251bV9GMiwgTUFNX251bV9NMSwgTUFNX251bV9NMikKKSAKCiMjIENSRUFUSU5HIERBVEEgRlJBTUUgRk9SIE1BTSBDQVNFUyBCWSBTRVggQU5EIENPVU5UWQoKIyMjIENSRUFUSU5HIEEgVEFCTEUgQlkgU0VYIEFORCBDT1VOVFkKTUFNX251bWJlcl90YWJsZSA8LSB4dGFicygKICBOdW1iZXJfb2ZfTUFNIH4gU2V4ICsgQ291bnR5LCBkYXRhID0gTUFNX251bWJlcgopIAoKIyMjIFZJRVcgTUFNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZCiNNQU1fbnVtYmVyX3RhYmxlIAoKIyMjIFBSRVZBTEVOQ0UgT0YgRkVNQUxFIE1BTSBJTiBVUkJBTiBNT05UU0VSUkFETwpQcmV2MV9NQU0gPC0gTUFNWyJGZW1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIElOIEdSQU5EIEJBU1NBClByZXYyX01BTSA8LSBNQU1bIkZlbWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAvIERlbiAKCiMjIyBQUkVWQUxFTkNFIE9GIE1BTEUgTUFNIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYzX01BTSA8LSBNQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIElOIEdSQU5EIEJBU1NBClByZXY0X01BTSA8LSBNQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIkdyYW5kIEJhc3NhIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBNQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKTUFNX3ByZXZhbGVuY2VzIDwtIGRhdGEuZnJhbWUoCiAgU2V4ID0gYygiRmVtYWxlIiwgIkZlbWFsZSIsICJNYWxlIiwgIk1hbGUiKSwKICBDb3VudHkgPSBjKCJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIsICJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIpLAogIFByZXZhbGVuY2Vfb2ZfTUFNID0gYyhQcmV2MV9NQU0sIFByZXYyX01BTSwgUHJldjNfTUFNLCBQcmV2NF9NQU0pCikgCgojIyBDUkVBVElORyBUQUJMRSBGT1IgTUFNIFBSRVZBTEVOQ0UgQlkgU0VYIEFORCBDT1VOVFkKCk1BTV9wcmV2YWxlbmNlc190YWJsZSA8LSB4dGFicygKICBQcmV2YWxlbmNlX29mX01BTSB+IFNleCArIENvdW50eSwgZGF0YSA9IE1BTV9wcmV2YWxlbmNlcwopIAoKIyMjIFZJRVcgTUFNIFBSRVZBTEVOQ0UgQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKI01BTV9wcmV2YWxlbmNlc190YWJsZSAKYGBgCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgTUFNIGNhc2VzIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBtYW1fY291bnRzX3RhYmxlLCBlY2hvID0gVFJVRX0KIyMjIENSRUFUSU5HIEEgVEFCTEUgQlkgU0VYIEFORCBDT1VOVFkKTUFNX251bWJlcl90YWJsZQpgYGAKCkluIEdyYW5kIEJhc3NhLCB0aGVyZSB3ZXJlICoqYHIgTUFNX251bWJlcl90YWJsZVsxLCAxXWAgZmVtYWxlIE1BTSBjYXNlcyoqIGFuZCAqKmByIE1BTV9udW1iZXJfdGFibGVbMiwgMV1gIG1hbGUgTUFNIGNhc2VzKiouIEluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGVyZSB3ZXJlICoqYHIgTUFNX251bWJlcl90YWJsZVsxLCAyXWAgZmVtYWxlIE1BTSBjYXNlcyoqIGFuZCAqKmByIE1BTV9udW1iZXJfdGFibGVbMiwgMl1gIG1hbGUgTUFNIGNhc2VzKiouIAoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyB0aGUgcHJldmFsZW5jZSBvZiBNQU0gYnkgc2V4IGFuZCBieSBsb2NhdGlvbi4KCmBgYHtyIG1hbV9wcmV2YWxlbmNlX3RhYmxlLCBlY2hvID0gVFJVRX0KIyMjIFZJRVcgTUFNIFBSRVZBTEVOQ0UgQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKTUFNX3ByZXZhbGVuY2VzX3RhYmxlIApgYGAKCk9mIHRoZSB0b3RhbCBNQU0gY2FzZXMgaW4gdGhlIHNhbXBsZSwgKipgciByb3VuZChNQU1fcHJldmFsZW5jZXNfdGFibGVbMSwgMV0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIGZlbWFsZXMgZnJvbSBHcmFuZCBCYXNzYSwgKipgciByb3VuZChNQU1fcHJldmFsZW5jZXNfdGFibGVbMiwgMV0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIG1hbGVzIGZyb20gR3JhbmQgQmFzc2EsICoqYHIgcm91bmQoTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzEsIDJdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBmZW1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8gYW5kICoqYHIgcm91bmQoTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzIsIDJdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBtYWxlcyBmcm9tIFVyYmFuIE1vbnRzZXJyYWRvLiAKCiMjIyBTQU0gY2FzZXMgYnkgc2V4IGFuZCBsb2NhdGlvbgoKVGhlIGZvbGxvd2luZyBzdGVwcyB3ZXJlIHRha2VuIHRvIHByb2Nlc3MgdGhlIGRhdGEgdG8gYmUgYWJsZSB0byB0YWJ1bGF0ZSB0aGUgbnVtYmVyIG9mIFNBTSBjYXNlcyBieSBzZXggYW5kIGxvY2F0aW9uIGluIHRoZSBzYW1wbGUuCgpgYGB7ciBzYW1fdGFibGVfY29kZSwgZWNobyA9IFRSVUV9CiMjIyBBc3NpZ25pbmcgdGhlIHNldmVyZSBNVUFDIGNyaXRlcmlhIGZvciBjaGlsZHJlbiBiZXR3ZWVuIDYtNTkgZm9yIFNldl9NVUFDClNldl9NVUFDIDwtIHdpdGgobnV0LCBhZ2UgPj0gNiAmIGFnZSA8IDYwICYgbXVhYyA8IDExLjUpIAoKIyMjIEFzc2lnbmluZyBTQU0KU0FNIDwtIHRhYmxlIChTRVgsIE9FREVNQSwgU2V2X01VQUMsIENPVU5UWSwgdXNlTkEgPSAiaWZhbnkiKSAKCiNkYXRhLmZyYW1lKFNBTSkKCiMjIyBUT1RBTCBTQU0gRkVNQUxFUyBJTiBVUkJBTiBNT05UU0VSUkFETwpTQU1fbnVtX0YxIDwtIFNBTVsiRmVtYWxlIiwgIk5vIiwgIlRSVUUiLCJVcmJhbiBNb250c2VycmFkbyJdIAoKIyMjIFRPVEFMIFNBTSBGRU1BTEVTIElOIEdSQU5EIEJBU1NBClNBTV9udW1fRjIgPC0gU0FNWyJGZW1hbGUiLCAiTm8iLCAiVFJVRSIsIkdyYW5kIEJhc3NhIl0gCgojIyMgVE9UQUwgU0FNIE1BTEVTIElOIFVSQkFOIE1PTlRTRVJSQURPClNBTV9udW1fTTEgPC0gU0FNWyJNYWxlIiwgIk5vIiwgIlRSVUUiLCJVcmJhbiBNb250c2VycmFkbyJdIAoKIyMjIFRPVEFMIFNBTSBNQUxFUyBJTiBHUkFORCBCQVNTQQpTQU1fbnVtX00yIDwtIFNBTVsiTWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAKCiMjIyBDUkVBVElORyBEQVRBIEZSQU1FIEZPUiBTQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKU0FNX251bWJlciA8LSBkYXRhLmZyYW1lKAogIFNleCA9IGMoIkZlbWFsZSIsICJGZW1hbGUiLCAiTWFsZSIsICJNYWxlIiksCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwgCiAgTnVtYmVyX29mX1NBTSA9IGMoU0FNX251bV9GMSwgU0FNX251bV9GMiwgU0FNX251bV9NMSwgU0FNX251bV9NMikKKQoKIyMgQ1JFQVRJTkcgVEFCTEUgRk9SIFNBTSBDQVNFUyBCWSBTRVggQU5EIENPVU5UWQpTQU1fbnVtYmVyX3RhYmxlIDwtIHh0YWJzKAogIE51bWJlcl9vZl9TQU0gfiBTZXggKyBDb3VudHksIGRhdGEgPSBTQU1fbnVtYmVyCikgCgojIyMgVklFVyBTQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKI1NBTV9udW1iZXJfdGFibGUgCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgU0FNIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYxX1NBTSA8LSBTQU1bIkZlbWFsZSIsICJZZXMiLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgU0FNIElOIEdSQU5EIEJBU1NBClByZXYyX1NBTSA8LSBTQU1bIkZlbWFsZSIsICJObyIsICJUUlVFIiwiR3JhbmQgQmFzc2EiXSAvIERlbiAKCiMjIyBQUkVWQUxFTkNFIE9GIE1BTEUgU0FNIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYzX1NBTSA8LSBTQU1bIk1hbGUiLCAiTm8iLCAiVFJVRSIsIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBNQUxFIFNBTSBJTiBHUkFORCBCQVNTQQpQcmV2NF9TQU0gPC0gU0FNWyJNYWxlIiwgIk5vIiwgIlRSVUUiLCJHcmFuZCBCYXNzYSJdIC8gRGVuIAoKIyMjIFBSRVZBTEVOQ0UgT0YgU0FNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZClNBTV9wcmV2YWxlbmNlcyA8LSBkYXRhLmZyYW1lKAogIFNleCA9IGMoIkZlbWFsZSIsICJGZW1hbGUiLCAiTWFsZSIsICJNYWxlIiksCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwKICBQcmV2YWxlbmNlX29mX1NBTSA9IGMoUHJldjFfU0FNLCBQcmV2Ml9TQU0sIFByZXYzX1NBTSwgUHJldjRfU0FNKQopIAoKIyMgQ1JFQVRJTkcgVEFCTEUgRk9SIFNBTSBQUkVWQUxFTkNFIEJZIFNFWCBBTkQgQ09VTlRZClNBTV9wcmV2YWxlbmNlc190YWJsZSA8LSB4dGFicygKICBQcmV2YWxlbmNlX29mX1NBTSB+IFNleCArIENvdW50eSwgZGF0YSA9IFNBTV9wcmV2YWxlbmNlcwopIAoKIyMjIFZJRVcgU0FNIFBSRVZBTEVOQ0UgQlkgU0VYIEFORCBDT1VOVFkKI1NBTV9wcmV2YWxlbmNlc190YWJsZQpgYGAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBTQU0gY2FzZXMgYnkgc2V4IGFuZCBieSBsb2NhdGlvbi4KCmBgYHtyIHNhbV9jb3VudHNfdGFibGUsIGVjaG8gPSBUUlVFfQpTQU1fbnVtYmVyX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgKipgciBTQU1fbnVtYmVyX3RhYmxlWzEsIDFdYCBmZW1hbGUgU0FNIGNhc2VzKiogYW5kICoqYHIgU0FNX251bWJlcl90YWJsZVsyLCAxXWAgbWFsZSBTQU0gY2FzZXMqKi4gSW4gVXJiYW4gTW9udHNlcnJhZG8sIHRoZXJlIHdlcmUgKipgciBTQU1fbnVtYmVyX3RhYmxlWzEsIDJdYCBmZW1hbGUgU0FNIGNhc2VzKiogYW5kICoqYHIgU0FNX251bWJlcl90YWJsZVsyLCAyXWAgbWFsZSBTQU0gY2FzZXMqKi4gCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBwcmV2YWxlbmNlIG9mIFNBTSBieSBzZXggYW5kIGJ5IGxvY2F0aW9uLgoKYGBge3Igc2FtX3ByZXZhbGVuY2VfdGFibGUsIGVjaG8gPSBUUlVFfQpTQU1fcHJldmFsZW5jZXNfdGFibGUgCmBgYAoKT2YgdGhlIHRvdGFsIFNBTSBjYXNlcyBpbiB0aGUgc2FtcGxlLCAqKmByIHJvdW5kKFNBTV9wcmV2YWxlbmNlc190YWJsZVsxLCAxXSAqIDEwMCwgZGlnaXRzID0gMilgJSoqIHdlcmUgZmVtYWxlcyBmcm9tIEdyYW5kIEJhc3NhLCAqKmByIHJvdW5kKFNBTV9wcmV2YWxlbmNlc190YWJsZVsyLCAxXSAqIDEwMCwgZGlnaXRzID0gMilgJSoqIHdlcmUgbWFsZXMgZnJvbSBHcmFuZCBCYXNzYSwgKipgciByb3VuZChTQU1fcHJldmFsZW5jZXNfdGFibGVbMSwgMl0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIGZlbWFsZXMgZnJvbSBVcmJhbiBNb250c2VycmFkbyBhbmQgKipgciByb3VuZChTQU1fcHJldmFsZW5jZXNfdGFibGVbMiwgMl0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIG1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8uIAoKIyMjIEdBTSBjYXNlcyBieSBzZXggYW5kIGxvY2F0aW9uCgpUaGUgZm9sbG93aW5nIHN0ZXBzIHdlcmUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgZGF0YSB0byBiZSBhYmxlIHRvIHRhYnVsYXRlIHRoZSBudW1iZXIgb2YgR0FNIGNhc2VzIGJ5IHNleCBhbmQgbG9jYXRpb24gaW4gdGhlIHNhbXBsZS4KCmBgYHtyIGdhbV90YWJsZV9jb2RlLCBlY2hvID0gVFJVRX0KIyMgU0FNIE9SIE1BTSBDQVNFUzoKTUFMTlVUUklUSU9OIDwtIGlmZWxzZShudXQkbXVhYyA8IDExLjUgfCBudXQkb2VkZW1hID09IDEsICJTQU0iLCAiTm8gU0FNIikKCk1BTE5VVFJJVElPTiA8LSBpZmVsc2UoCiAgbnV0JG11YWMgPj0gMTEuNSAmIG51dCRtdWFjIDwgMTIuNSAmIG51dCRvZWRlbWEgPT0gMiwgIk1BTSIsIE1BTE5VVFJJVElPTgopCgpNQUxOVVRSSVRJT04gPC0gaWZlbHNlKE1BTE5VVFJJVElPTiA9PSAiTm8gU0FNIiwgIm5vdCBTQU0gb3IgTUFNIiwgTUFMTlVUUklUSU9OKQoKTUFMTlVUUklUSU9OIDwtIGlmZWxzZShudXQkYWdlID49IDYgJiBudXQkYWdlIDwgNjAsIE1BTE5VVFJJVElPTiwgTkEpCgojIyMgQ1JFQVRJTkcgQSBUQUJMRSBGT1IgRUlUSEVSIE1BTSBPUiBTQU0gQ0FTRVMKZmluYWwgPC0gdGFibGUoCiAgU0VYLCBPRURFTUEsIE1BTE5VVFJJVElPTiwgQ09VTlRZLCB1c2VOQSA9ICJpZmFueSIKKSAKCiMjIyBDUkVBVElORyBBIERBVEEgRlJBTUUgRk9SIFRPVEFMIFNBTSBPUiBNQU0gQ0FTRVMKI2RhdGEuZnJhbWUoZmluYWwpIAoKIyMgTlVNQkVSIE9GIFNBTSBPUiBNQU0gQ0FTRVMKCiMjIyBUT1RBTCBTQU0gT1IgTUFNIEZFTUFMRVMgSU4gVVJCQU4gTU9OVFNFUlJBRE8KU0FNb3JNQU1fRjEgPC0gZmluYWxbIkZlbWFsZSIsICwgYygiTUFNIiwgIlNBTSIpLCAiVXJiYW4gTW9udHNlcnJhZG8iXSAKCiMjIyBUT1RBTCBTQU0gT1IgTUFNIEZFTUFMRVMgSU4gR1JBTkQgQkFTU0EKU0FNb3JNQU1fRjIgPC0gZmluYWxbIkZlbWFsZSIsICwgYygiTUFNIiwgIlNBTSIpLCAiR3JhbmQgQmFzc2EiXSAKCiMjIyBUT1RBTCBTQU0gT1IgTUFNIE1BTEVTIElOIFVSQkFOIE1PTlRTRVJSQURPClNBTW9yTUFNX00xIDwtIGZpbmFsWyJNYWxlIiwgLCBjKCJNQU0iLCAiU0FNIiksICJVcmJhbiBNb250c2VycmFkbyJdIAoKIyMjIFRPVEFMIFNBTSBPUiBNQU0gRkVNQUxFUyBJTiBHUkFORCBCQVNTQQpTQU1vck1BTV9NMiA8LSBmaW5hbFsiTWFsZSIsICwgYygiTUFNIiwgIlNBTSIpLCAiR3JhbmQgQmFzc2EiXSAKCiMjIyBDUkVBVElORyBBIERBVEEgRlJBTUUgRk9SIFRPVEFMIFNBTSBPUiBNQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKU0FNb3JNQU1fbnVtYmVyIDwtIGRhdGEuZnJhbWUoCiAgU2V4ID0gYygiRmVtYWxlIiwgIkZlbWFsZSIsICJNYWxlIiwgIk1hbGUiKSwgCiAgQ291bnR5ID0gYygiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiLCAiVXJiYW4gTW9udHNlcnJhZG8iLCAiR3JhbmQgQmFzc2EiKSwgCiAgTnVtYmVyX29mX1NBTW9yTUFNID0gYyhTQU1vck1BTV9GMSwgU0FNb3JNQU1fRjIsIFNBTW9yTUFNX00xLCBTQU1vck1BTV9NMikKKSAKCiMjIyBDUkVBVElORyBBIFRBQkxFIEZPUiBTQU0gT1IgTUFNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZClNBTW9yTUFNX251bWJlcl90YWJsZSA8LSB4dGFicygKICBOdW1iZXJfb2ZfU0FNb3JNQU0gfiBTZXggKyBDb3VudHksIGRhdGEgPSBTQU1vck1BTV9udW1iZXIKKSAKCiMjIyBWSUVXIFNBTSBPUiBNQU0gQ0FTRVMgQlkgU0VYIEFORCBDT1VOVFkKI1NBTW9yTUFNX251bWJlcl90YWJsZSAKCiMjIyBQUkVWQUxFTkNFIE9GIEZFTUFMRSBNQU0gT1IgU0FNIENBU0VTIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYxX1NBTW9yTUFNIDwtIGZpbmFsWyJGZW1hbGUiLCAsIGMoIk1BTSIsICJTQU0iKSwgIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIE9SIFNBTSBDQVNFUyBJTiBHUkFORCBCQVNTQQpQcmV2Ml9TQU1vck1BTSA8LSBmaW5hbFsiRmVtYWxlIiwgLCBjKCJNQU0iLCAiU0FNIiksICJHcmFuZCBCYXNzYSJdIC8gRGVuIAoKIyMjIFBSRVZBTEVOQ0UgT0YgTUFMRSBNQU0gT1IgU0FNIENBU0VTIElOIFVSQkFOIE1PTlRTRVJSQURPClByZXYzX1NBTW9yTUFNIDwtIGZpbmFsWyJGZW1hbGUiLCAsIGMoIk1BTSIsICJTQU0iKSwgIlVyYmFuIE1vbnRzZXJyYWRvIl0gLyBEZW4gCgojIyMgUFJFVkFMRU5DRSBPRiBGRU1BTEUgTUFNIE9SIFNBTSBDQVNFUyBJTiBHUkFORCBCQVNTQQpQcmV2NF9TQU1vck1BTSA8LSBmaW5hbFsiRmVtYWxlIiwgLCBjKCJNQU0iLCAiU0FNIiksICJHcmFuZCBCYXNzYSJdIC8gRGVuIAoKIyMjIENSRUFUSU5HIEEgREFUQSBGUkFNRSBGT1IgUFJFVkFMRU5DRSBPRiBTQU0gT1IgTUFNIENBU0VTIEJZIFNFWCBBTkQgQ09VTlRZClNBTW9yTUFNX3ByZXZhbGVuY2VzIDwtIGRhdGEuZnJhbWUoCiAgU2V4ID0gYygiRmVtYWxlIiwgIkZlbWFsZSIsICJNYWxlIiwgIk1hbGUiKSwKICBDb3VudHkgPSBjKCJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIsICJVcmJhbiBNb250c2VycmFkbyIsICJHcmFuZCBCYXNzYSIpLAogIFByZXZhbGVuY2Vfb2ZfU0FNID0gYyhQcmV2MV9TQU1vck1BTSwgUHJldjJfU0FNb3JNQU0sIFByZXYzX1NBTW9yTUFNLCBQcmV2NF9TQU1vck1BTSkKKSAKCiMjIyBDUkVBVElORyBBIFRBQkxFIEZPUiBQUkVWQUxFTkNFIE9GIFNBTSBPUiBNQU0gQlkgU0VYIEFORCBDT1VOVFkKU0FNb3JNQU1fcHJldmFsZW5jZXNfdGFibGUgPC0geHRhYnMoCiAgUHJldmFsZW5jZV9vZl9TQU0gfiBTZXggKyBDb3VudHksIAogIGRhdGEgPSBTQU1vck1BTV9wcmV2YWxlbmNlcwopIAoKIyMjIFZJRVcgU0FNIE9SIE1BTSBQUkVWQUxFTkNFIEJZIFNFWCBBTkQgQ09VTlRZCiNTQU1vck1BTV9wcmV2YWxlbmNlc190YWJsZSAKYGBgCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgR0FNIGNhc2VzIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBnYW1fY291bnRzX3RhYmxlLCBlY2hvID0gVFJVRX0KU0FNb3JNQU1fbnVtYmVyX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgKipgciBTQU1vck1BTV9udW1iZXJfdGFibGVbMSwgMV1gIGZlbWFsZSBHQU0gY2FzZXMqKiBhbmQgKipgciBTQU1vck1BTV9udW1iZXJfdGFibGVbMiwgMV1gIG1hbGUgR0FNIGNhc2VzKiouIEluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGVyZSB3ZXJlICoqYHIgU0FNb3JNQU1fbnVtYmVyX3RhYmxlWzEsIDJdYCBmZW1hbGUgR0FNIGNhc2VzKiogYW5kICoqYHIgU0FNb3JNQU1fbnVtYmVyX3RhYmxlWzIsIDJdYCBtYWxlIEdBTSBjYXNlcyoqLiAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIHByZXZhbGVuY2Ugb2YgR0FNIGJ5IHNleCBhbmQgYnkgbG9jYXRpb24uCgpgYGB7ciBnYW1fcHJldmFsZW5jZV90YWJsZSwgZWNobyA9IFRSVUV9ClNBTW9yTUFNX3ByZXZhbGVuY2VzX3RhYmxlIApgYGAKCk9mIHRoZSB0b3RhbCBHQU0gY2FzZXMgaW4gdGhlIHNhbXBsZSwgKipgciByb3VuZChTQU1vck1BTV9wcmV2YWxlbmNlc190YWJsZVsxLCAxXSAqIDEwMCwgZGlnaXRzID0gMilgJSoqIHdlcmUgZmVtYWxlcyBmcm9tIEdyYW5kIEJhc3NhLCAqKmByIHJvdW5kKFNBTW9yTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzIsIDFdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBtYWxlcyBmcm9tIEdyYW5kIEJhc3NhLCAqKmByIHJvdW5kKFNBTW9yTUFNX3ByZXZhbGVuY2VzX3RhYmxlWzEsIDJdICogMTAwLCBkaWdpdHMgPSAyKWAlKiogd2VyZSBmZW1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8gYW5kICoqYHIgcm91bmQoU0FNb3JNQU1fcHJldmFsZW5jZXNfdGFibGVbMiwgMl0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUqKiB3ZXJlIG1hbGVzIGZyb20gVXJiYW4gTW9udHNlcnJhZG8uIAoKIyMgQ292ZXJhZ2Ugb2YgU0FNIHRyZWF0bWVudAo8IS0tLSBJTlNFUlQgVEVYVCBBTkQgTElURVJBVEUgQ09ERSBCRUxPVyBUSElTIExJTkUgLS0tPgoKIyMjIE51bWJlciBvZiBTQU0gY2FzZXMgZm91bmQKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBjYXNlcyBvZiBTQU0gZm91bmQgaW4gdGhlIG92ZXJhbGwgc2FtcGxlLgoKYGBge3Igc2FtX2NvdW50cywgZWNobyA9IFRSVUV9Cm51dCRzYW1bbnV0JGFnZSA+PSA2ICYgbnV0JGFnZSA8IDYwICYgKG51dCRtdWFjID49IDExLjUgfCBudXQkb2VkZW1hID09IDIpXSA8LSAnbm8nCm51dCRzYW1bbnV0JGFnZSA+PSA2ICYgbnV0JGFnZSA8IDYwICYgKG51dCRtdWFjIDwgMTEuNSB8IG51dCRvZWRlbWEgPT0gMSldIDwtJ3llcycKCnNhbV90YWJsZSA8LSB0YWJsZShudXQkc2FtKQoKc2FtX3RhYmxlCmBgYAoKVGhlcmUgd2VyZSBhIHRvdGFsIG9mICoqYHIgc2FtX3RhYmxlWzJdYCBTQU0gY2FzZXMqKiBmb3VuZCBpbiB0aGUgb3ZlcmFsbCBzYW1wbGUuCgpUaGUgZm9sbG93aW5nIHRhYmxlIHByZXNlbnRzIHRoZSBudW1iZXIgb2YgU0FNIGNhc2VzIGZvdW5kIGluIHRoZSBzYW1wbGUgYnkgbG9jYXRpb24uCgpgYGB7ciBzYW1fY291bnRzX2xvY2F0aW9uLCBlY2hvID0gVFJVRX0Kc2FtX2xvY2F0aW9uX3RhYmxlIDwtIHRhYmxlKG51dCRzYW0sIG51dCRjb3VudHkpCgpzYW1fbG9jYXRpb25fdGFibGUKYGBgCgpUaGVyZSB3ZXJlIGEgdG90YWwgb2YgKipgciBzYW1fbG9jYXRpb25fdGFibGVbMiwgMV1gIFNBTSBjYXNlcyoqIGZvdW5kIGluIEdyYW5kIEJhc3NhIGNvbXBhcmVkIHRvICoqYHIgc2FtX2xvY2F0aW9uX3RhYmxlWzIsIDJdYCBTQU0gY2FzZXMqKiBmb3VuZCBpbiBVcmJhbiBNb250c2VycmFkby4KClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIG51bWJlciBvZiBTQU0gY2FzZXMgZm91bmQgaW4gdGhlIHNhbXBsZSBieSBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBzYW1fY291bnRzX3JvdW5kLCBlY2hvID0gVFJVRX0Kc2FtX3JvdW5kc190YWJsZSA8LSB0YWJsZShudXQkc2FtLCBudXQkc3VydmV5X3JvdW5kKQoKc2FtX3JvdW5kc190YWJsZQpgYGAKClRoZXJlIHdlcmUgYSB0b3RhbCBvZiAqKmByIHNhbV9yb3VuZHNfdGFibGVbMiwgMV1gIFNBTSBjYXNlcyoqIGZvdW5kIGF0IGJhc2VsaW5lIHN1cnZleSByb3VuZCBjb21wYXJlZCB0byAqKmByIHNhbV9yb3VuZHNfdGFibGVbMiwgMl1gIFNBTSBjYXNlcyoqIGZvdW5kIGF0IGVuZGxpbmUgc3VydmV5IHJvdW5kLgoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyB0aGUgbnVtYmVyIG9mIFNBTSBjYXNlcyBmb3VuZCBpbiB0aGUgc2FtcGxlIGJ5IGxvY2F0aW9uIGFuZCBzdXJ2ZXkgcm91bmQuCgpgYGB7ciBzYW1fbG9jYXRpb25fcm91bmQsIGVjaG8gPSBUUlVFfQpzYW1fbG9jYXRpb25fcm91bmRzX3RhYmxlIDwtIHRhYmxlKG51dCRzYW0sIG51dCRzdXJ2ZXlfcm91bmQsIG51dCRjb3VudHkpCgpzYW1fbG9jYXRpb25fcm91bmRzX3RhYmxlCmBgYAoKSW4gR3JhbmQgQmFzc2EsIHRoZXJlIHdlcmUgYSB0b3RhbCBvZiAqKmByIHNhbV9sb2NhdGlvbl9yb3VuZHNfdGFibGVbMiwgMSwgMV1gIFNBTSBjYXNlcyoqIGZvdW5kIGF0IGJhc2VsaW5lIGFuZCAqKmByIHNhbV9sb2NhdGlvbl9yb3VuZHNfdGFibGVbMiwgMiwgMV1gKiogU0FNIGNhc2VzIGZvdW5kIGF0IGVuZGxpbmUuCgpJbiBVcmJhbiBNb250c2VycmFkbywgdGhlcmUgd2VyZSBhIHRvdGFsIG9mICoqYHIgc2FtX2xvY2F0aW9uX3JvdW5kc190YWJsZVsyLCAxLCAyXWAgU0FNIGNhc2VzKiogZm91bmQgYXQgYmFzZWxpbmUgYW5kICoqYHIgc2FtX2xvY2F0aW9uX3JvdW5kc190YWJsZVsyLCAyLCAyXWAqKiBTQU0gY2FzZXMgZm91bmQgYXQgZW5kbGluZS4KCiMjIyBDYXNlLWZpbmRpbmcgZWZmZWN0aXZlbmVzcwoKVGhlIGZvbGxvd2luZyB0YWJsZSBwcmVzZW50cyB0aGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIG92ZXJhbGwuCgpgYGB7ciBjYXNlLWZpbmRpbmd9CnNhbWNvdiA8LSB0YWJsZShudXQkc2FtLCBudXQkY292X3N0YXR1cykKCnNhbWNvdgojIyBwcm9wLnRhYmxlKHNhbWNvdikgKiAxMDAgICAgICBUaGlzIGNvZGUgZ2l2ZXMgcHJvcG9ydGlvbiBvZiBTQU0gY2FzZXMgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIHByb2dyYW1tZSBieSBhbGwgY2hpbGRyZW4gaW4gdGhlIHNhbXBsZSB3aGljaCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgY292ZXJhZ2UgZXN0aW1hdG9yCgojIyBUaGlzIGNvZGUgY2FsY3VsYXRlcyB0aGUgcHJvcG9ydGlvbnMgZm9yIG9ubHkgdGhvc2UgY2hpbGRyZW4gd2hvIGFyZSBTQU0gYW5kIAojIyBpbiB0aGUgcHJvZ3JhbW1lCnNhbWNvdnByb3AgPC0gcHJvcC50YWJsZShzYW1jb3ZbMiwgXSAqIDEwMCkKCnNhbWNvdnByb3AKYGBgCgpUaGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIG92ZXJhbGwgd2FzIGF0ICoqYHIgcm91bmQoc2FtY292cHJvcFsxXSwgZGlnaXRzID0gMilgJSoqLiAKClRoZSBmb2xsb3dpbmcgdGFibGUgcHJlc2VudHMgdGhlIGNhc2UtZmluZGluZyBlZmZlY3RpdmVuZXNzIG9mIHRoZSBDTUFNIHByb2dyYW1tZSBieSBsb2NhdGlvbi4KCmBgYHtyIGNhc2UtZmluZGluZy1sb2NhdGlvbiwgZWNobyA9IFRSVUV9CnNhbWNvdmxvYyA8LSB0YWJsZShudXQkc2FtLCBudXQkY292X3N0YXR1cywgbnV0JGNvdW50eSkKCnNhbWNvdmxvYwoKIyMgcHJvcC50YWJsZShzYW1jb3Zsb2MpICogMTAwICAgICBUaGlzIGNvZGUgZ2l2ZXMgcHJvcG9ydGlvbiBvZiBTQU0gY2FzZXMgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgcHJvZ3JhbW1lIGJ5IGFsbCBjaGlsZHJlbiBpbiB0aGUgc2FtcGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgd2hpY2ggaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgY292ZXJhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBlc3RpbWF0b3IKCiMjIFRoaXMgY29kZSBjYWxjdWxhdGVzIHRoZSBwcm9wb3J0aW9ucyBmb3Igb25seSB0aG9zZSBjaGlsZHJlbiB3aG8gYXJlIFNBTQojIyBhbmQgaW4gdGhlIHByb2dyYW1tZSBmb3IgZWFjaCBsb2NhdGlvbgpzYW1jb3ZfZ3JhbmRiYXNzYSA8LSBwcm9wLnRhYmxlKHNhbWNvdmxvY1syLCAsIDFdKSAqIDEwMAoKc2FtY292X2dyYW5kYmFzc2EKCnNhbWNvdl91cmJhbm1vbnRzZXJyYWRvIDwtIHByb3AudGFibGUoc2FtY292bG9jWzIsICwgMl0pICogMTAwCgpzYW1jb3ZfdXJiYW5tb250c2VycmFkbwpgYGAKCkluIEdyYW5kIEJhc3NhLCB0aGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIHdhcyBhdCAqKmByIHJvdW5kKHNhbWNvdl9ncmFuZGJhc3NhWzFdLCBkaWdpdHMgPSAyKWAlKiouIEluIFVyYmFuIE1vbnRzZXJyYWRvLCB0aGUgY2FzZS1maW5kaW5nIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIENNQU0gcHJvZ3JhbW1lIHdhcyBhdCAqKmByIHJvdW5kKHNhbWNvdl91cmJhbm1vbnRzZXJyYWRvWzFdLCBkaWdpdHMgPSAyKWAlKiouCgo8YnIvPgo8YnIvPg==