Setup
# Load the necessary packages required to reproduce the report. For example:
library(magrittr)
library(knitr)
library(kableExtra)
library(readr)
library(tidyr)
library(dplyr)
library(magrittr)
library(stringi)
library(editrules)
Student names, numbers and percentage of
contributions
Executive Summary
#The goal of this report is to process data before it is used by
understanding, organising, manipulating, scanning, and adjusting
data.Country wise malnutrition and life expectancy datasets are used and
merged on the common column ‘Country’. For numeric variables, the box
plot is made using Tukey’s method for finding outliers.
#Histograms
are used to look at how all numerical variables are spread out.Make sure
that the data is free of mistakes, fits together well, and is ready for
further statistical analysis.
Data
Dataset 1 ‘country wise life expectancy’ URL: https://www.kaggle.com/amansaxena/lifeexpectancy?select=Life_expectancy_dataset.csv
Dataset 2 ‘malnutrition data of various countries’ URL: https://www.kaggle.com/ruchi798/malnutrition-across-the-globe?select=country-wise-average.csv
# 1st Dataset
LE_df1 <- read_csv("Life_expectancy_dataset.csv")
spec(LE_df1)
colnames(LE_df1)[4] <- "Male_life" # Rename column
colnames(LE_df1)[5] <- "Female_life" # Rename column
# "Overall Life" column is not required
LE_df1 <- LE_df1[ -c(3) ]
knitr::kable(head(LE_df1), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))
#convert to tidy format and check last rows
LE_df1_tidy <- pivot_longer(LE_df1, names_to = "Gender", values_to = "Life Expectancy", cols = 3:4)
LE_df1_tidy$Country <- stringi::stri_trans_toupper(LE_df1_tidy$Country)
knitr::kable(tail(LE_df1_tidy), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))
# 2nd Dataset
CW_df2 <- read_csv("country-wise-average.csv")
spec(CW_df2)
knitr::kable(head(CW_df2), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))
#finding malnutrition and life expectancy across countries.
df_merged <- left_join(CW_df2,LE_df1_tidy,by="Country")
#check last rows of merged dataset
knitr::kable(tail(df_merged), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))
Understand
I will look at the data and try to figure out what it means by
checking its size, attributes, and structure. Then I’ll go ahead and
change the type of the columns when necessary.
# This is the R chunk for the Understand Section
spec(df_merged)
str(df_merged)
#Continent, Gender and Income Classification seemed to have wrong classifications and fix them
df_merged$Continent <- factor(df_merged$Continent,
levels = c('Africa', 'Europe', 'Asia', 'Oceania', 'North America', 'South America'))
df_merged$Gender <- factor(df_merged$Gender,
levels = c('Male', 'Female'))
df_merged$'Income Classification' <- factor(df_merged$'Income Classification',
levels = c(0,1,2,3),
labels = c('Low Income', 'Lower Middle Income', 'Upper Middle Income', 'High Income'),
ordered = TRUE)
attributes(df_merged)
Tidy & Manipulate Data I
# Before merging it with data set 2, the steps needed to clean up the data have already been taken. Please look at the section "Data."
# refer Line 26 above : reshaped the data into tidy format (this is for 'Tidy & Manipulate Data I' section)
Tidy & Manipulate Data II
# This is the R chunk for the Tidy & Manipulate Data II
# To figure out how many children under 5 years old are either underweight or overweight, new column is created
df_mutated <- mutate(df_merged, 'Under5 Weight Population'=(df_merged$Underweight+df_merged$Overweight)*df_merged$"U5 Population ('000s)"/100)
kable(tail(df_mutated[c(1,2,5,7,8,11:13)]), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))
Scan I
Missing values are scanned and omitted at this step
sapply(df_merged, function(x) sum( is.na(x) ))
#Removing missing data values and no special values are found
df_merged <- df_merged[complete.cases(df_merged), ]
sapply(df_merged, function(x) sum( is.na(x) ))
Scan II
Box plot for each of the numerical variables using Tukey’s method
for finding outliers.
colnames(df_merged)[8] <- "Under 5 Population in thousands"
df_merged$'Under 5 Population in thousands' %>% boxplot(main="Under 5 years Population in thousands", ylab="Population", col = "red")
#Plot stunting percentage and life expectancy
par(mfrow=c(1,2))
df_merged$Stunting %>% boxplot(main="Stunting %", ylab="Percentage", col = "red")
df_merged$`Life Expectancy` %>% boxplot(main="Life expectancy", ylab="Age", col = "red")
par(mfrow=c(1,1))
#Plot numerical variables
par(mfrow=c(2,2))
df_merged$'Severe Wasting' %>% boxplot(main="Severe Wasting %", ylab="Percentage",col = "red")
df_merged$'Wasting' %>% boxplot(main="Wasting %", ylab="Percentage", col = "red")
df_merged$`Overweight` %>% boxplot(main="Over weight %", ylab="Percentage", col = "red")
df_merged$`Underweight` %>% boxplot(main="Under weight %", ylab="Percentage", col = "red")
par(mfrow=c(1,1))
par(mfrow=c(1,2))
df_merged$Stunting %>% boxplot(main="Stunting %", ylab="Percentage", col = "red")
df_merged$`Life Expectancy` %>% boxplot(main="Life expectancy", ylab="Age", col = "red")
par(mfrow=c(1,1))
LS0tDQp0aXRsZTogIkRhdGEgV3JhbmdsaW5nIChEYXRhIFByZXByb2Nlc3NpbmcpIg0KYXV0aG9yOiAiRUkgVEhJUkkgTFdJTiINCnN1YnRpdGxlOiBQcmFjdGljYWwgYXNzZXNzbWVudCAyDQpkYXRlOiAiMyBPQ1QgMjAyMiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCi0tLQ0KDQoNCiMjICoqU2V0dXAqKg0KDQpgYGB7cn0NCg0KIyBMb2FkIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMgcmVxdWlyZWQgdG8gcmVwcm9kdWNlIHRoZSByZXBvcnQuIEZvciBleGFtcGxlOg0KDQoNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGtuaXRyKSANCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkocmVhZHIpIA0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKSANCmxpYnJhcnkoc3RyaW5naSkgIA0KbGlicmFyeShlZGl0cnVsZXMpDQpgYGANCg0KDQojIyAqKlN0dWRlbnQgbmFtZXMsIG51bWJlcnMgYW5kIHBlcmNlbnRhZ2Ugb2YgY29udHJpYnV0aW9ucyoqDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KDQpuYTwtIGMoIkVJIFRISVJJIExXSU4iKQ0Kbm88LSBjKCJTMzg2NjM2MCIpDQpwYzwtIGMoIjEwMCUiKQ0KDQpzPC0gZGF0YS5mcmFtZShjYmluZChuYSxubyxwYykpDQpjb2xuYW1lcyhzKTwtIGMoIlN0dWRlbnQgbmFtZSIsICJTdHVkZW50IG51bWJlciIsICJQZXJjZW50YWdlIG9mIGNvbnRyaWJ1dGlvbiIpDQoNCnMgJT4lIGtibChjYXB0aW9uID0gIkluZGl2aWR1YWwiKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIkNhbWJyaWEiKQ0KDQpgYGANCjxicj4NCjxicj4NCg0KIyMgKipFeGVjdXRpdmUgU3VtbWFyeSoqDQoNCiNUaGUgZ29hbCBvZiB0aGlzIHJlcG9ydCBpcyB0byBwcm9jZXNzIGRhdGEgYmVmb3JlIGl0IGlzIHVzZWQgYnnCoCB1bmRlcnN0YW5kaW5nLCBvcmdhbmlzaW5nLCBtYW5pcHVsYXRpbmcsIHNjYW5uaW5nLCBhbmQgYWRqdXN0aW5nIGRhdGEuQ291bnRyeSB3aXNlIG1hbG51dHJpdGlvbiBhbmQgbGlmZSBleHBlY3RhbmN5IGRhdGFzZXRzIGFyZSB1c2VkIGFuZCBtZXJnZWQgb24gdGhlIGNvbW1vbiBjb2x1bW4g4oCYQ291bnRyeeKAmS4gRm9yIG51bWVyaWMgdmFyaWFibGVzLCB0aGUgYm94IHBsb3QgaXMgbWFkZSB1c2luZyBUdWtleSdzIG1ldGhvZCBmb3IgZmluZGluZyBvdXRsaWVycy4NCjxicj4NCiNIaXN0b2dyYW1zIGFyZSB1c2VkIHRvIGxvb2sgYXQgaG93IGFsbCBudW1lcmljYWwgdmFyaWFibGVzIGFyZSBzcHJlYWQgb3V0Lk1ha2Ugc3VyZSB0aGF0IHRoZSBkYXRhIGlzIGZyZWUgb2YgbWlzdGFrZXMsIGZpdHMgdG9nZXRoZXIgd2VsbCwgYW5kIGlzIHJlYWR5IGZvciBmdXJ0aGVyIHN0YXRpc3RpY2FsIGFuYWx5c2lzLg0KPGJyPg0KDQojIyAqKkRhdGEqKg0KDQpEYXRhc2V0IDEgJ2NvdW50cnkgd2lzZSBsaWZlIGV4cGVjdGFuY3knDQpVUkw6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vYW1hbnNheGVuYS9saWZlZXhwZWN0YW5jeT9zZWxlY3Q9TGlmZV9leHBlY3RhbmN5X2RhdGFzZXQuY3N2DQoNCg0KRGF0YXNldCAyICdtYWxudXRyaXRpb24gZGF0YSBvZiB2YXJpb3VzIGNvdW50cmllcyAnDQpVUkw6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcnVjaGk3OTgvbWFsbnV0cml0aW9uLWFjcm9zcy10aGUtZ2xvYmU/c2VsZWN0PWNvdW50cnktd2lzZS1hdmVyYWdlLmNzdg0KDQpgYGB7cn0NCg0KIyAxc3QgRGF0YXNldA0KTEVfZGYxIDwtIHJlYWRfY3N2KCJMaWZlX2V4cGVjdGFuY3lfZGF0YXNldC5jc3YiKQ0Kc3BlYyhMRV9kZjEpDQoNCmNvbG5hbWVzKExFX2RmMSlbNF0gPC0gIk1hbGVfbGlmZSIgIyBSZW5hbWUgY29sdW1uICANCmNvbG5hbWVzKExFX2RmMSlbNV0gPC0gIkZlbWFsZV9saWZlIiAjIFJlbmFtZSBjb2x1bW4gDQojICJPdmVyYWxsIExpZmUiIGNvbHVtbiBpcyBub3QgcmVxdWlyZWQNCkxFX2RmMSA8LSBMRV9kZjFbIC1jKDMpIF0gDQoNCmtuaXRyOjprYWJsZShoZWFkKExFX2RmMSksIGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSAnbCcpJT4lDQprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIpKQ0KDQojY29udmVydCB0byB0aWR5IGZvcm1hdCBhbmQgY2hlY2sgbGFzdCByb3dzDQpMRV9kZjFfdGlkeSA8LSBwaXZvdF9sb25nZXIoTEVfZGYxLCBuYW1lc190byA9ICJHZW5kZXIiLCB2YWx1ZXNfdG8gPSAiTGlmZSBFeHBlY3RhbmN5IiwgY29scyA9IDM6NCkNCkxFX2RmMV90aWR5JENvdW50cnkgPC0gIHN0cmluZ2k6OnN0cmlfdHJhbnNfdG91cHBlcihMRV9kZjFfdGlkeSRDb3VudHJ5KSANCg0Ka25pdHI6OmthYmxlKHRhaWwoTEVfZGYxX3RpZHkpLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gJ2wnKSU+JQ0Ka2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiKSkgDQoNCiMgMm5kIERhdGFzZXQNCkNXX2RmMiA8LSByZWFkX2NzdigiY291bnRyeS13aXNlLWF2ZXJhZ2UuY3N2IikNCnNwZWMoQ1dfZGYyKQ0KDQprbml0cjo6a2FibGUoaGVhZChDV19kZjIpLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gJ2wnKSU+JQ0Ka2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiKSkgIA0KDQojZmluZGluZyBtYWxudXRyaXRpb24gYW5kIGxpZmUgZXhwZWN0YW5jeSBhY3Jvc3MgY291bnRyaWVzLg0KZGZfbWVyZ2VkIDwtIGxlZnRfam9pbihDV19kZjIsTEVfZGYxX3RpZHksYnk9IkNvdW50cnkiKQ0KI2NoZWNrIGxhc3Qgcm93cyBvZiBtZXJnZWQgZGF0YXNldA0Ka25pdHI6OmthYmxlKHRhaWwoZGZfbWVyZ2VkKSwgZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9ICdsJyklPiUNCmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KIyMgKipVbmRlcnN0YW5kKiogDQoNCkkgd2lsbCBsb29rIGF0IHRoZSBkYXRhIGFuZCB0cnkgdG8gZmlndXJlIG91dCB3aGF0IGl0IG1lYW5zIGJ5IGNoZWNraW5nIGl0cyBzaXplLCBhdHRyaWJ1dGVzLCBhbmQgc3RydWN0dXJlLiBUaGVuIEknbGwgZ28gYWhlYWQgYW5kIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgY29sdW1ucyB3aGVuIG5lY2Vzc2FyeS4NCjxicj4NCjxicj4NCg0KYGBge3J9DQojIFRoaXMgaXMgdGhlIFIgY2h1bmsgZm9yIHRoZSBVbmRlcnN0YW5kIFNlY3Rpb24NCg0Kc3BlYyhkZl9tZXJnZWQpDQpzdHIoZGZfbWVyZ2VkKQ0KI0NvbnRpbmVudCwgR2VuZGVyIGFuZCBJbmNvbWUgQ2xhc3NpZmljYXRpb24gc2VlbWVkIHRvIGhhdmUgd3JvbmcgY2xhc3NpZmljYXRpb25zIGFuZCBmaXggdGhlbQ0KZGZfbWVyZ2VkJENvbnRpbmVudCA8LSBmYWN0b3IoZGZfbWVyZ2VkJENvbnRpbmVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoJ0FmcmljYScsICdFdXJvcGUnLCAnQXNpYScsICdPY2VhbmlhJywgJ05vcnRoIEFtZXJpY2EnLCAnU291dGggQW1lcmljYScpKSANCmRmX21lcmdlZCRHZW5kZXIgPC0gZmFjdG9yKGRmX21lcmdlZCRHZW5kZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCdNYWxlJywgJ0ZlbWFsZScpKQ0KDQpkZl9tZXJnZWQkJ0luY29tZSBDbGFzc2lmaWNhdGlvbicgPC0gZmFjdG9yKGRmX21lcmdlZCQnSW5jb21lIENsYXNzaWZpY2F0aW9uJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLDEsMiwzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnTG93IEluY29tZScsICdMb3dlciBNaWRkbGUgSW5jb21lJywgJ1VwcGVyIE1pZGRsZSBJbmNvbWUnLCAnSGlnaCBJbmNvbWUnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFRSVUUpIA0KYXR0cmlidXRlcyhkZl9tZXJnZWQpDQpgYGANCg0KDQoNCiMjCSoqVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJICoqDQoNCg0KYGBge3J9DQojIEJlZm9yZSBtZXJnaW5nIGl0IHdpdGggZGF0YSBzZXQgMiwgdGhlIHN0ZXBzIG5lZWRlZCB0byBjbGVhbiB1cCB0aGUgZGF0YSBoYXZlIGFscmVhZHkgYmVlbiB0YWtlbi4gUGxlYXNlIGxvb2sgYXQgdGhlIHNlY3Rpb24gIkRhdGEuIg0KIyByZWZlciBMaW5lIDI2IGFib3ZlIDogcmVzaGFwZWQgdGhlIGRhdGEgaW50byB0aWR5IGZvcm1hdCAodGhpcyBpcyBmb3IgJ1RpZHkgJiBNYW5pcHVsYXRlIERhdGEgSScgc2VjdGlvbikNCmBgYA0KDQo8YnI+DQo8YnI+DQoNCiMjICoqVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSoqIA0KDQpgYGB7cn0NCiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSUkgDQojIFRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgY2hpbGRyZW4gdW5kZXIgNSB5ZWFycyBvbGQgYXJlIGVpdGhlciB1bmRlcndlaWdodCBvciBvdmVyd2VpZ2h0LCBuZXcgY29sdW1uIGlzIGNyZWF0ZWQgDQpkZl9tdXRhdGVkIDwtIG11dGF0ZShkZl9tZXJnZWQsICdVbmRlcjUgV2VpZ2h0IFBvcHVsYXRpb24nPShkZl9tZXJnZWQkVW5kZXJ3ZWlnaHQrZGZfbWVyZ2VkJE92ZXJ3ZWlnaHQpKmRmX21lcmdlZCQiVTUgUG9wdWxhdGlvbiAoJzAwMHMpIi8xMDApDQoNCmthYmxlKHRhaWwoZGZfbXV0YXRlZFtjKDEsMiw1LDcsOCwxMToxMyldKSwgZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9ICdsJyklPiUNCmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpDQpgYGANCiANCg0KPGJyPg0KPGJyPg0KDQojIwkqKlNjYW4gSSAqKg0KIyBNaXNzaW5nIHZhbHVlcyBhcmUgc2Nhbm5lZCBhbmQgb21pdHRlZCBhdCB0aGlzIHN0ZXANCmBgYHtyfQ0KDQpzYXBwbHkoZGZfbWVyZ2VkLCBmdW5jdGlvbih4KSBzdW0oIGlzLm5hKHgpICkpDQoNCiNSZW1vdmluZyBtaXNzaW5nIGRhdGEgdmFsdWVzIGFuZCBubyBzcGVjaWFsIHZhbHVlcyBhcmUgZm91bmQNCmRmX21lcmdlZCA8LSBkZl9tZXJnZWRbY29tcGxldGUuY2FzZXMoZGZfbWVyZ2VkKSwgXQ0Kc2FwcGx5KGRmX21lcmdlZCwgZnVuY3Rpb24oeCkgc3VtKCBpcy5uYSh4KSApKQ0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQojIwkqKlNjYW4gSUkqKg0KIyBCb3ggcGxvdCBmb3IgZWFjaCBvZiB0aGUgbnVtZXJpY2FsIHZhcmlhYmxlcyB1c2luZyBUdWtleSdzIG1ldGhvZCBmb3IgZmluZGluZyBvdXRsaWVycy4NCmBgYHtyfQ0KDQoNCmNvbG5hbWVzKGRmX21lcmdlZClbOF0gPC0gIlVuZGVyIDUgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHMiIA0KDQpkZl9tZXJnZWQkJ1VuZGVyIDUgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHMnICU+JSBib3hwbG90KG1haW49IlVuZGVyIDUgeWVhcnMgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHMiLCB5bGFiPSJQb3B1bGF0aW9uIiwgY29sID0gInJlZCIpICANCg0KDQojUGxvdCBzdHVudGluZyBwZXJjZW50YWdlIGFuZCBsaWZlIGV4cGVjdGFuY3kNCnBhcihtZnJvdz1jKDEsMikpDQpkZl9tZXJnZWQkU3R1bnRpbmcgJT4lIGJveHBsb3QobWFpbj0iU3R1bnRpbmcgJSIsIHlsYWI9IlBlcmNlbnRhZ2UiLCBjb2wgPSAicmVkIikNCmRmX21lcmdlZCRgTGlmZSBFeHBlY3RhbmN5YCAlPiUgYm94cGxvdChtYWluPSJMaWZlIGV4cGVjdGFuY3kiLCB5bGFiPSJBZ2UiLCBjb2wgPSAicmVkIikNCnBhcihtZnJvdz1jKDEsMSkpIA0KDQojUGxvdCBudW1lcmljYWwgdmFyaWFibGVzDQpwYXIobWZyb3c9YygyLDIpKQ0KZGZfbWVyZ2VkJCdTZXZlcmUgV2FzdGluZycgJT4lIGJveHBsb3QobWFpbj0iU2V2ZXJlIFdhc3RpbmcgJSIsIHlsYWI9IlBlcmNlbnRhZ2UiLGNvbCA9ICJyZWQiKQ0KZGZfbWVyZ2VkJCdXYXN0aW5nJyAlPiUgYm94cGxvdChtYWluPSJXYXN0aW5nICUiLCB5bGFiPSJQZXJjZW50YWdlIiwgY29sID0gInJlZCIpDQpkZl9tZXJnZWQkYE92ZXJ3ZWlnaHRgICU+JSBib3hwbG90KG1haW49Ik92ZXIgd2VpZ2h0ICUiLCB5bGFiPSJQZXJjZW50YWdlIiwgY29sID0gInJlZCIpDQpkZl9tZXJnZWQkYFVuZGVyd2VpZ2h0YCAlPiUgYm94cGxvdChtYWluPSJVbmRlciB3ZWlnaHQgJSIsIHlsYWI9IlBlcmNlbnRhZ2UiLCBjb2wgPSAicmVkIikNCg0KcGFyKG1mcm93PWMoMSwxKSkNCg0KcGFyKG1mcm93PWMoMSwyKSkNCmRmX21lcmdlZCRTdHVudGluZyAlPiUgYm94cGxvdChtYWluPSJTdHVudGluZyAlIiwgeWxhYj0iUGVyY2VudGFnZSIsIGNvbCA9ICJyZWQiKQ0KZGZfbWVyZ2VkJGBMaWZlIEV4cGVjdGFuY3lgICU+JSBib3hwbG90KG1haW49IkxpZmUgZXhwZWN0YW5jeSIsIHlsYWI9IkFnZSIsIGNvbCA9ICJyZWQiKQ0KcGFyKG1mcm93PWMoMSwxKSkNCg0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQoNCiMjCSoqVHJhbnNmb3JtICoqDQojQ2hlY2sgb3V0IHRoZSBoaXN0b2dyYW1zIG9mIGFsbCB0aGUgbnVtYmVyIHZhbHVlcyBhbmQgY2hvb3NlIHZhcmlhYmxlICJ3YXN0aW5nIiBhcyB0cmFuc2Zvcm1hdGlvbg0KI1NxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIGdpdmVzIGEgYmV0dGVyIHJlc3BvbnNlIHRoYW4gdGhlIGxvZyB0cmFuc2Zvcm1hdGlvbi4NCmBgYHtyfQ0KI2V4cGxvcmUgdGhlIGhpc3RvZ3JhbXMgb2YgYWxsIHRoZSBudW1lcmljYWwgdmFyaWFibGVzLg0KcGFyKG1mcm93ID1jKDMsMykpDQoNCnVuZGVyNV9wb3B1bGF0aW9uIDwtICBkZl9tZXJnZWQkYFVuZGVyIDUgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHNgDQpoaXN0KHVuZGVyNV9wb3B1bGF0aW9uKQ0KDQp1bmRlcl93ZWlnaHQgPC0gZGZfbWVyZ2VkJGBVbmRlcndlaWdodGANCmhpc3QodW5kZXJfd2VpZ2h0KQ0KDQpvdmVyX3dlaWdodDwtIGRmX21lcmdlZCRgT3ZlcndlaWdodGANCmhpc3Qob3Zlcl93ZWlnaHQpDQoNCndhc3RpbmcgPC0gZGZfbWVyZ2VkJGBXYXN0aW5nYA0KaGlzdCh3YXN0aW5nKQ0KDQpzZXZlcmVfd2FzdGluZyA8LSBkZl9tZXJnZWQkYFNldmVyZSBXYXN0aW5nYA0KaGlzdChzZXZlcmVfd2FzdGluZykNCg0Kc3R1bnRpbmcgPC0gZGZfbWVyZ2VkJFN0dW50aW5nDQpoaXN0KHN0dW50aW5nKQ0KDQpsaWZlX2V4cGVjdGFuY3kgPC0gZGZfbWVyZ2VkJGBMaWZlIEV4cGVjdGFuY3lgDQpoaXN0KGxpZmVfZXhwZWN0YW5jeSkNCnBhcihtZnJvdz1jKDEsMSkpDQoNCg0KIyBjb252ZXJ0IHRoZSBkaXN0cmlidXRpb24gaW50byBhIG5vcm1hbCBkaXN0cmlidXRpb24NCnNxcnRfd2FzdGluZyA8LSBzcXJ0KHdhc3RpbmcpDQpoaXN0KHNxcnRfd2FzdGluZykNCg0KIyByZWR1Y2UgdGhlIHJpZ2h0IHNrZXduZXNzDQpsb2dfd2FzdGluZyA8LSBsb2cxMCh3YXN0aW5nKQ0KaGlzdChsb2dfd2FzdGluZykNCg0KbG5fd2FzdGluZyA8LSBsb2cod2FzdGluZykNCmhpc3QobG5fd2FzdGluZykNCmBgYA0KIA0KDQo8YnI+DQo8YnI+DQoNCg==