EDA - Life Expectancy (WHO)

What is Life Expectancy?

Life expectancy is a statistical measure of the average age/time that an organism is expected to live based on several factors. Because life expectancy is an average measure, a particular person or organism may die many years before or many years after the life expectancy.

About the Dataset

For this report, we will use Life Expectancy Data.csv contains 193 countries from 2000 - 2015 consists of 22 columns of several life expectancy factors. The 22 columns are:

  1. Country : Country
  2. Year : Year
  3. Status : Developed or Developing Status
  4. Life.expectancy : Life expectancy in age
  5. Adult.Mortality : Adult Mortality Rates of both sexes (probability of dying between 15 and 60 years per 1000 population)
  6. infant.deaths : Number of Infant Deaths per 1000 population
  7. Alcohol : Alcohol, recorded per capita (15+) consumption (in litres of pure alcohol)
  8. percentage.expenditure : Expenditure on health as a percentage of Gross Domestic Product per capita(%)
  9. Hepatitis.B : Hepatitis B (HepB) immunization coverage among 1-year-olds (%)
  10. Measles : Measles - number of reported cases per 1000 population
  11. BMI : Average Body Mass Index of entire population
  12. under.five.deaths : Number of under-five deaths per 1000 population
  13. Polio : Polio (Pol3) immunization coverage among 1-year-olds (%)
  14. Total.expenditure : General government expenditure on health as a percentage of total government expenditure (%)
  15. Diphtheria : Diphtheria tetanus toxoid and pertussis (DTP3) immunization coverage among 1-year-olds (%)
  16. HIV.AIDS : Deaths per 1000 live births HIV/AIDS (0-4 years)
  17. GDP : Gross Domestic Product per capita (in USD)
  18. Population : Population of the country
  19. thinness..1.19.years : Prevalence of thinness among children and adolescents for Age 10 to 19 (% )
  20. thinness.5.9.years : Prevalence of thinness among children for Age 5 to 9(%)
  21. Income.composotion.of.resources : Human Development Index in terms of income composition of resources (index ranging from 0 to 1)
  22. Schooling : Number of years of Schooling(years)
#Load library
library(tidyr)

# Data input
data <- read.csv("data/Life Expectancy Data.csv")

#Checking data
str(data)
## 'data.frame':    2938 obs. of  22 variables:
##  $ Country                        : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ Year                           : int  2015 2014 2013 2012 2011 2010 2009 2008 2007 2006 ...
##  $ Status                         : chr  "Developing" "Developing" "Developing" "Developing" ...
##  $ Life.expectancy                : num  65 59.9 59.9 59.5 59.2 58.8 58.6 58.1 57.5 57.3 ...
##  $ Adult.Mortality                : int  263 271 268 272 275 279 281 287 295 295 ...
##  $ infant.deaths                  : int  62 64 66 69 71 74 77 80 82 84 ...
##  $ Alcohol                        : num  0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.03 0.02 0.03 ...
##  $ percentage.expenditure         : num  71.3 73.5 73.2 78.2 7.1 ...
##  $ Hepatitis.B                    : int  65 62 64 67 68 66 63 64 63 64 ...
##  $ Measles                        : int  1154 492 430 2787 3013 1989 2861 1599 1141 1990 ...
##  $ BMI                            : num  19.1 18.6 18.1 17.6 17.2 16.7 16.2 15.7 15.2 14.7 ...
##  $ under.five.deaths              : int  83 86 89 93 97 102 106 110 113 116 ...
##  $ Polio                          : int  6 58 62 67 68 66 63 64 63 58 ...
##  $ Total.expenditure              : num  8.16 8.18 8.13 8.52 7.87 9.2 9.42 8.33 6.73 7.43 ...
##  $ Diphtheria                     : int  65 62 64 67 68 66 63 64 63 58 ...
##  $ HIV.AIDS                       : num  0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 ...
##  $ GDP                            : num  584.3 612.7 631.7 670 63.5 ...
##  $ Population                     : num  33736494 327582 31731688 3696958 2978599 ...
##  $ thinness..1.19.years           : num  17.2 17.5 17.7 17.9 18.2 18.4 18.6 18.8 19 19.2 ...
##  $ thinness.5.9.years             : num  17.3 17.5 17.7 18 18.2 18.4 18.7 18.9 19.1 19.3 ...
##  $ Income.composition.of.resources: num  0.479 0.476 0.47 0.463 0.454 0.448 0.434 0.433 0.415 0.405 ...
##  $ Schooling                      : num  10.1 10 9.9 9.8 9.5 9.2 8.9 8.7 8.4 8.1 ...

From this result, we find Year, and Status columns are not in correct data type. we will convert it to factor type.

#Explicit coertion
data$Year <- as.factor(data$Year)
data$Status <- as.factor(data$Status)

str(data)
## 'data.frame':    2938 obs. of  22 variables:
##  $ Country                        : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ Year                           : Factor w/ 16 levels "2000","2001",..: 16 15 14 13 12 11 10 9 8 7 ...
##  $ Status                         : Factor w/ 2 levels "Developed","Developing": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Life.expectancy                : num  65 59.9 59.9 59.5 59.2 58.8 58.6 58.1 57.5 57.3 ...
##  $ Adult.Mortality                : int  263 271 268 272 275 279 281 287 295 295 ...
##  $ infant.deaths                  : int  62 64 66 69 71 74 77 80 82 84 ...
##  $ Alcohol                        : num  0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.03 0.02 0.03 ...
##  $ percentage.expenditure         : num  71.3 73.5 73.2 78.2 7.1 ...
##  $ Hepatitis.B                    : int  65 62 64 67 68 66 63 64 63 64 ...
##  $ Measles                        : int  1154 492 430 2787 3013 1989 2861 1599 1141 1990 ...
##  $ BMI                            : num  19.1 18.6 18.1 17.6 17.2 16.7 16.2 15.7 15.2 14.7 ...
##  $ under.five.deaths              : int  83 86 89 93 97 102 106 110 113 116 ...
##  $ Polio                          : int  6 58 62 67 68 66 63 64 63 58 ...
##  $ Total.expenditure              : num  8.16 8.18 8.13 8.52 7.87 9.2 9.42 8.33 6.73 7.43 ...
##  $ Diphtheria                     : int  65 62 64 67 68 66 63 64 63 58 ...
##  $ HIV.AIDS                       : num  0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 ...
##  $ GDP                            : num  584.3 612.7 631.7 670 63.5 ...
##  $ Population                     : num  33736494 327582 31731688 3696958 2978599 ...
##  $ thinness..1.19.years           : num  17.2 17.5 17.7 17.9 18.2 18.4 18.6 18.8 19 19.2 ...
##  $ thinness.5.9.years             : num  17.3 17.5 17.7 18 18.2 18.4 18.7 18.9 19.1 19.3 ...
##  $ Income.composition.of.resources: num  0.479 0.476 0.47 0.463 0.454 0.448 0.434 0.433 0.415 0.405 ...
##  $ Schooling                      : num  10.1 10 9.9 9.8 9.5 9.2 8.9 8.7 8.4 8.1 ...
#Check missing Value
colSums(is.na(data))
##                         Country                            Year 
##                               0                               0 
##                          Status                 Life.expectancy 
##                               0                              10 
##                 Adult.Mortality                   infant.deaths 
##                              10                               0 
##                         Alcohol          percentage.expenditure 
##                             194                               0 
##                     Hepatitis.B                         Measles 
##                             553                               0 
##                             BMI               under.five.deaths 
##                              34                               0 
##                           Polio               Total.expenditure 
##                              19                             226 
##                      Diphtheria                        HIV.AIDS 
##                              19                               0 
##                             GDP                      Population 
##                             448                             652 
##            thinness..1.19.years              thinness.5.9.years 
##                              34                              34 
## Income.composition.of.resources                       Schooling 
##                             167                             163

We can see above, there are many columns with missing values. for this project, we will fill the missing values with the next value then previous value (first up and then down) for each country because the data ordered by year on descending rule.

#Get country list
country.list <-unique(data$Country)

#Fill the missing values
for (country in country.list) {
  
  data[data$Country == country,] <- data[data$Country == country,] %>%  fill(c(Life.expectancy, 
                         Adult.Mortality, 
                         Alcohol,
                         Hepatitis.B,
                         BMI,
                         Polio,
                         Total.expenditure,
                         Diphtheria,
                         GDP,
                         Population,
                         thinness..1.19.years,
                         thinness.5.9.years,
                         Income.composition.of.resources,
                         Schooling), .direction = "updown")
}
colSums(is.na(data))
##                         Country                            Year 
##                               0                               0 
##                          Status                 Life.expectancy 
##                               0                              10 
##                 Adult.Mortality                   infant.deaths 
##                              10                               0 
##                         Alcohol          percentage.expenditure 
##                              17                               0 
##                     Hepatitis.B                         Measles 
##                             144                               0 
##                             BMI               under.five.deaths 
##                              34                               0 
##                           Polio               Total.expenditure 
##                               0                              32 
##                      Diphtheria                        HIV.AIDS 
##                               0                               0 
##                             GDP                      Population 
##                             405                             648 
##            thinness..1.19.years              thinness.5.9.years 
##                              34                              34 
## Income.composition.of.resources                       Schooling 
##                             167                             163

After we filled missing values with above method, we still see that several columns have missing values. This indicates that there is no recorded data on each country. So, we will fill it all with 0 except for life expectancy column. We will delete the rows that Life.expectancy data is missing because Life.expectancy data is the mandatory data to analyse.

#Delete data with missing Life.expectancy
data <- drop_na(data = data, Life.expectancy)

#Fill missing data with 0
data[is.na(data)] <- 0
anyNA(data)
## [1] FALSE

Great!! Now our data is clean!

summary(data)
##    Country               Year             Status     Life.expectancy
##  Length:2928        2000   : 183   Developed : 512   Min.   :36.30  
##  Class :character   2001   : 183   Developing:2416   1st Qu.:63.10  
##  Mode  :character   2002   : 183                     Median :72.10  
##                     2003   : 183                     Mean   :69.22  
##                     2004   : 183                     3rd Qu.:75.70  
##                     2005   : 183                     Max.   :89.00  
##                     (Other):1830                                    
##  Adult.Mortality infant.deaths        Alcohol       percentage.expenditure
##  Min.   :  1.0   Min.   :   0.00   Min.   : 0.000   Min.   :    0.000     
##  1st Qu.: 74.0   1st Qu.:   0.00   1st Qu.: 0.610   1st Qu.:    4.854     
##  Median :144.0   Median :   3.00   Median : 3.580   Median :   65.611     
##  Mean   :164.8   Mean   :  30.41   Mean   : 4.503   Mean   :  740.321     
##  3rd Qu.:228.0   3rd Qu.:  22.00   3rd Qu.: 7.600   3rd Qu.:  442.614     
##  Max.   :723.0   Max.   :1800.00   Max.   :17.870   Max.   :19479.912     
##                                                                           
##   Hepatitis.B       Measles              BMI        under.five.deaths
##  Min.   : 0.00   Min.   :     0.0   Min.   : 0.00   Min.   :   0.00  
##  1st Qu.:62.00   1st Qu.:     0.0   1st Qu.:19.00   1st Qu.:   0.00  
##  Median :88.00   Median :    17.0   Median :43.00   Median :   4.00  
##  Mean   :72.09   Mean   :  2427.9   Mean   :37.82   Mean   :  42.18  
##  3rd Qu.:96.00   3rd Qu.:   362.2   3rd Qu.:56.10   3rd Qu.:  28.00  
##  Max.   :99.00   Max.   :212183.0   Max.   :77.60   Max.   :2500.00  
##                                                                      
##      Polio      Total.expenditure   Diphtheria       HIV.AIDS     
##  Min.   : 3.0   Min.   : 0.000    Min.   : 2.00   Min.   : 0.100  
##  1st Qu.:77.0   1st Qu.: 4.210    1st Qu.:78.00   1st Qu.: 0.100  
##  Median :93.0   Median : 5.700    Median :93.00   Median : 0.100  
##  Mean   :82.3   Mean   : 5.867    Mean   :82.07   Mean   : 1.748  
##  3rd Qu.:97.0   3rd Qu.: 7.470    3rd Qu.:97.00   3rd Qu.: 0.800  
##  Max.   :99.0   Max.   :17.600    Max.   :99.00   Max.   :50.600  
##                                                                   
##       GDP             Population        thinness..1.19.years thinness.5.9.years
##  Min.   :     0.0   Min.   :0.000e+00   Min.   : 0.000       Min.   : 0.000    
##  1st Qu.:   225.8   1st Qu.:7.336e+03   1st Qu.: 1.500       1st Qu.: 1.500    
##  Median :  1194.6   Median :5.459e+05   Median : 3.300       Median : 3.300    
##  Mean   :  6370.1   Mean   :9.958e+06   Mean   : 4.798       Mean   : 4.828    
##  3rd Qu.:  4793.6   3rd Qu.:4.593e+06   3rd Qu.: 7.100       3rd Qu.: 7.200    
##  Max.   :119172.7   Max.   :1.294e+09   Max.   :27.700       Max.   :28.600    
##                                                                                
##  Income.composition.of.resources   Schooling     
##  Min.   :0.0000                  Min.   : 0.000  
##  1st Qu.:0.4660                  1st Qu.: 9.575  
##  Median :0.6620                  Median :12.100  
##  Mean   :0.5931                  Mean   :11.344  
##  3rd Qu.:0.7730                  3rd Qu.:14.100  
##  Max.   :0.9480                  Max.   :20.700  
## 

Based on the summary, we can conclude that the average life expectancy from 193 countries is 69.22 years old, minimum and maximum life expectancy are 36.30 and 89 years old.

Highest and Lowest Life Expectancy

Highest Life Expectancy Country

Now, we want to know country with the highest average life expectancy.

country_avg_le <- aggregate(Life.expectancy ~ Country,
                            data = data,
                            FUN = mean)
#Get Top 10 Country with highest Life Expectancy
country_avg_le_10_up <- tail(country_avg_le[order(country_avg_le$Life.expectancy),], 10)
country_avg_le_10_up
#Create barplot
a <- barplot(height = country_avg_le_10_up$Life.expectancy,
        names = country_avg_le_10_up$Country,
        horiz = T,
        las = 1,
        main = "Top 10 Countries with Highest Average Life Expectancy",
        xlab = "Life Expectancy",
        col="#2685de")
text(y = a, x = country_avg_le_10_up[,2]-5, label=country_avg_le_10_up[,2])

Based on above result, we find that Japan have the highest life expectancy average with 82.53750 years old.

Lowest Life Expectancy Country

#Get Top 10 Country with Lowest Life Expectancy
country_avg_le_10_down <- tail(country_avg_le[order(country_avg_le$Life.expectancy, decreasing = T),], 10)
country_avg_le_10_down
#Create barplot
b <- barplot(height = country_avg_le_10_down$Life.expectancy,
        names = country_avg_le_10_down$Country,
        horiz = T,
        las = 1,
        main = "Top 10 Countries with Lowest Average Life Expectancy",
        xlab = "Life Expectancy",
        col="#2685de", cex.names = 0.6)
text(y = b, x = country_avg_le_10_down[,2]-3, label=country_avg_le_10_down[,2])

Based on above result, we find that Sierra Leone have the lowest life expectancy average with 46.11250 years old which under the world life expectancy average.

Country Status Comparison on Life Expectancy

In this data, country status is devied to Developed and Developing Country. we want to compare the average life expectancy betweeen developed and developing country.

average_status <- aggregate(Life.expectancy ~ Status,
                            data = data,
                            FUN = mean)
average_status
c <- barplot(height = average_status$Life.expectancy,
        names = average_status$Status,
        ylab = "Life Expectancy",
        col="#2685de")
text(x = c, y = average_status[,2]-2, labels = average_status[,2])

Is Countries GDP have Correlation on Life Expectancy?

#Subset GDP and Life.expectancy columns
gdp_le <- data[, c("GDP", "Life.expectancy")]
#Delete 0 values
gdp_le <- gdp_le[gdp_le$GDP != 0,]

#Corelation Value
cor(gdp_le$Life.expectancy, gdp_le$GDP)
## [1] 0.4615107
#Scatter plot
plot(gdp_le$Life.expectancy,
     gdp_le$GDP,
     xlab = "Life Expectancy",
     ylab = "GDP")
abline(lm(gdp_le$GDP ~ gdp_le$Life.expectancy),
       col = "red")

Based on that result, we can conclude that correlation between GDP and life expctancy is weak-positif which mean life expectancy will increase as long as the GDP increases.

Whats Parameter have the Most Impact on Life Expectancy?

#we need GGally library to use ggcor() function
library(GGally)
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
ggcorr(data, label = T, hjust = 1, layout.exp = 5)
## Warning in ggcorr(data, label = T, hjust = 1, layout.exp = 5): data in column(s)
## 'Country', 'Year', 'Status' are not numeric and were ignored

Based on result, we find that there are some life expectancy parameter having positif and negative corelation. Some strong positive corelation parameter are Schooling, income composition, and measles. Negative corelation parameters are thinness..1.19.years, thinness.5.9.years, and HIV.AIDS.

How about Indonesian Condition?

indonesia_data <- data[data$Country == "Indonesia",]
summary(indonesia_data)
##    Country               Year           Status   Life.expectancy
##  Length:16          2000   : 1   Developed : 0   Min.   :65.30  
##  Class :character   2001   : 1   Developing:16   1st Qu.:66.85  
##  Mode  :character   2002   : 1                   Median :67.60  
##                     2003   : 1                   Mean   :67.56  
##                     2004   : 1                   3rd Qu.:68.35  
##                     2005   : 1                   Max.   :69.10  
##                     (Other):10                                  
##  Adult.Mortality infant.deaths      Alcohol      percentage.expenditure
##  Min.   : 19.0   Min.   :114.0   Min.   :0.050   Min.   :  0.000       
##  1st Qu.:180.5   1st Qu.:132.8   1st Qu.:0.060   1st Qu.:  9.813       
##  Median :187.5   Median :151.5   Median :0.065   Median : 49.270       
##  Mean   :166.6   Mean   :151.2   Mean   :0.070   Mean   : 83.768       
##  3rd Qu.:189.0   3rd Qu.:173.2   3rd Qu.:0.080   3rd Qu.:141.985       
##  Max.   :213.0   Max.   :187.0   Max.   :0.090   Max.   :254.469       
##                                                                        
##   Hepatitis.B       Measles           BMI        under.five.deaths
##  Min.   :62.00   Min.   : 3344   Min.   : 2.50   Min.   :136.0    
##  1st Qu.:64.75   1st Qu.:14105   1st Qu.:17.30   1st Qu.:159.2    
##  Median :77.00   Median :15671   Median :20.50   Median :184.5    
##  Mean   :73.56   Mean   :16245   Mean   :19.96   Mean   :186.6    
##  3rd Qu.:82.00   3rd Qu.:20521   3rd Qu.:24.02   3rd Qu.:216.8    
##  Max.   :85.00   Max.   :29171   Max.   :27.40   Max.   :237.0    
##                                                                   
##      Polio       Total.expenditure   Diphtheria       HIV.AIDS  
##  Min.   : 8.00   Min.   :1.980     Min.   : 7.00   Min.   :0.1  
##  1st Qu.:56.00   1st Qu.:2.490     1st Qu.:72.00   1st Qu.:0.1  
##  Median :78.50   Median :2.800     Median :76.50   Median :0.2  
##  Mean   :62.19   Mean   :2.675     Mean   :72.38   Mean   :0.2  
##  3rd Qu.:82.25   3rd Qu.:2.862     3rd Qu.:78.75   3rd Qu.:0.3  
##  Max.   :86.00   Max.   :3.100     Max.   :85.00   Max.   :0.3  
##                                                                 
##       GDP            Population        thinness..1.19.years thinness.5.9.years
##  Min.   :  78.93   Min.   :  2145652   Min.   : 1.400       Min.   : 1.200    
##  1st Qu.: 326.13   1st Qu.: 22639758   1st Qu.: 1.575       1st Qu.: 1.475    
##  Median :1367.41   Median : 24904887   Median : 1.750       Median : 1.700    
##  Mean   :1669.12   Mean   :116555259   Mean   : 3.419       Mean   : 3.944    
##  3rd Qu.:3169.16   3rd Qu.:237750488   3rd Qu.: 1.900       3rd Qu.: 4.175    
##  Max.   :3687.95   Max.   :258162113   Max.   :11.000       Max.   :11.200    
##                                                                               
##  Income.composition.of.resources   Schooling    
##  Min.   :0.5970                  Min.   :10.60  
##  1st Qu.:0.6212                  1st Qu.:10.88  
##  Median :0.6395                  Median :11.40  
##  Mean   :0.6414                  Mean   :11.61  
##  3rd Qu.:0.6637                  3rd Qu.:12.38  
##  Max.   :0.6860                  Max.   :12.90  
## 
d <- plot(x = indonesia_data$Year, y = indonesia_data$Life.expectancy,
          xlab = "Year",
          ylab = "Life Expectancy")

Based on above summary, Indonesia still in Developing country status, having 67.56 years average life expectancy, below the world average life expectancy 69.22 years old. But, from 2000 until 2015, Indonesian life expectancy always increse.

Conclusion

Life expectancy is number of age that organism expected to life. This have several parameter that having positive corelation and negative corelation. positive corelation means, if value of parameter increases, so the life expectancy increases. And negative corelation means, if value of parameter decreases, so the life expectancy decreases.

The average of life expecancy from 193 countries is 69.22 years old. Japan have the highest life expectancy in 82.53750 years old and Sierra Leone have the lowest life expectancy in just 46.11250 years old.

Indonesia have average life expectancy in 67.56 years old. This still below the global average life expectancy. Country with developing status have life expectancy below the global average. So they need to increases the positive corelation life expectancy parameter significantly and decreases the negative corelation life expectancy parameter significantly. Thats will make their life expectancy increases.

LS0tDQp0aXRsZTogIkVEQSAtIExpZmUgRXhwZWN0YW5jeSAoV0hPKSINCmF1dGhvcjogIkNoYWlkYXIgQWppIE51Z3JvaG8iDQpkYXRlOiAiMjAyMi0xMS0wMiINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyMgKipXaGF0IGlzIExpZmUgRXhwZWN0YW5jeT8qKg0KDQpMaWZlIGV4cGVjdGFuY3kgaXMgYSBzdGF0aXN0aWNhbCBtZWFzdXJlIG9mIHRoZSBhdmVyYWdlIGFnZS90aW1lIHRoYXQgYW4gb3JnYW5pc20gaXMgZXhwZWN0ZWQgdG8gbGl2ZSBiYXNlZCBvbiBzZXZlcmFsIGZhY3RvcnMuIEJlY2F1c2UgbGlmZSBleHBlY3RhbmN5IGlzIGFuIGF2ZXJhZ2UgbWVhc3VyZSwgYSBwYXJ0aWN1bGFyIHBlcnNvbiBvciBvcmdhbmlzbSBtYXkgZGllIG1hbnkgeWVhcnMgYmVmb3JlIG9yIG1hbnkgeWVhcnMgYWZ0ZXIgdGhlIGxpZmUgZXhwZWN0YW5jeS4NCg0KIyMgKipBYm91dCB0aGUgRGF0YXNldCoqDQpGb3IgdGhpcyByZXBvcnQsIHdlIHdpbGwgdXNlICoqTGlmZSBFeHBlY3RhbmN5IERhdGEuY3N2KiogY29udGFpbnMgMTkzIGNvdW50cmllcyBmcm9tIDIwMDAgLSAyMDE1IGNvbnNpc3RzIG9mIDIyIGNvbHVtbnMgb2Ygc2V2ZXJhbCBsaWZlIGV4cGVjdGFuY3kgZmFjdG9ycy4gVGhlIDIyIGNvbHVtbnMgYXJlOg0KDQoxLiBDb3VudHJ5ICAgICAgICAgICAgICAgIDogQ291bnRyeQ0KMi4gWWVhciAgICAgICAgICAgICAgICAgICA6IFllYXINCjMuIFN0YXR1cyAgICAgICAgICAgICAgICAgOiBEZXZlbG9wZWQgb3IgRGV2ZWxvcGluZyBTdGF0dXMNCjQuIExpZmUuZXhwZWN0YW5jeSAgICAgICAgOiBMaWZlIGV4cGVjdGFuY3kgaW4gYWdlDQo1LiBBZHVsdC5Nb3J0YWxpdHkgICAgICAgIDogQWR1bHQgTW9ydGFsaXR5IFJhdGVzIG9mIGJvdGggc2V4ZXMgKHByb2JhYmlsaXR5IG9mIGR5aW5nIGJldHdlZW4gMTUgYW5kIDYwIHllYXJzIHBlciAxMDAwIHBvcHVsYXRpb24pDQo2LiBpbmZhbnQuZGVhdGhzICAgICAgICAgIDogTnVtYmVyIG9mIEluZmFudCBEZWF0aHMgcGVyIDEwMDAgcG9wdWxhdGlvbg0KNy4gQWxjb2hvbCAgICAgICAgICAgICAgICA6IEFsY29ob2wsIHJlY29yZGVkIHBlciBjYXBpdGEgKDE1KykgY29uc3VtcHRpb24gKGluIGxpdHJlcyBvZiBwdXJlIGFsY29ob2wpDQo4LiBwZXJjZW50YWdlLmV4cGVuZGl0dXJlIDogRXhwZW5kaXR1cmUgb24gaGVhbHRoIGFzIGEgcGVyY2VudGFnZSBvZiBHcm9zcyBEb21lc3RpYyBQcm9kdWN0IHBlciBjYXBpdGEoJSkNCjkuIEhlcGF0aXRpcy5CICAgICAgICAgICAgOiBIZXBhdGl0aXMgQiAoSGVwQikgaW1tdW5pemF0aW9uIGNvdmVyYWdlIGFtb25nIDEteWVhci1vbGRzICglKQ0KMTAuIE1lYXNsZXMgICAgICAgICAgICAgICA6IE1lYXNsZXMgLSBudW1iZXIgb2YgcmVwb3J0ZWQgY2FzZXMgcGVyIDEwMDAgcG9wdWxhdGlvbg0KMTEuIEJNSSAgICAgICAgICAgICAgICAgICA6IEF2ZXJhZ2UgQm9keSBNYXNzIEluZGV4IG9mIGVudGlyZSBwb3B1bGF0aW9uDQoxMi4gdW5kZXIuZml2ZS5kZWF0aHMgICAgIDogTnVtYmVyIG9mIHVuZGVyLWZpdmUgZGVhdGhzIHBlciAxMDAwIHBvcHVsYXRpb24NCjEzLiBQb2xpbyAgICAgICAgICAgICAgICAgOiBQb2xpbyAoUG9sMykgaW1tdW5pemF0aW9uIGNvdmVyYWdlIGFtb25nIDEteWVhci1vbGRzICglKQ0KMTQuIFRvdGFsLmV4cGVuZGl0dXJlICAgICA6IEdlbmVyYWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBoZWFsdGggYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgKCUpDQoxNS4gRGlwaHRoZXJpYSAgICAgICAgICAgIDogRGlwaHRoZXJpYSB0ZXRhbnVzIHRveG9pZCBhbmQgcGVydHVzc2lzIChEVFAzKSBpbW11bml6YXRpb24gY292ZXJhZ2UgYW1vbmcgMS15ZWFyLW9sZHMgKCUpDQoxNi4gSElWLkFJRFMgICAgICAgICAgICAgIDogRGVhdGhzIHBlciAxMDAwIGxpdmUgYmlydGhzIEhJVi9BSURTICgwLTQgeWVhcnMpDQoxNy4gR0RQICAgICAgICAgICAgICAgICAgIDogR3Jvc3MgRG9tZXN0aWMgUHJvZHVjdCBwZXIgY2FwaXRhIChpbiBVU0QpDQoxOC4gUG9wdWxhdGlvbiAgICAgICAgICAgIDogUG9wdWxhdGlvbiBvZiB0aGUgY291bnRyeQ0KMTkuIHRoaW5uZXNzLi4xLjE5LnllYXJzICA6IFByZXZhbGVuY2Ugb2YgdGhpbm5lc3MgYW1vbmcgY2hpbGRyZW4gYW5kIGFkb2xlc2NlbnRzIGZvciBBZ2UgMTAgdG8gMTkgKCUgKQ0KMjAuIHRoaW5uZXNzLjUuOS55ZWFycyAgICA6IFByZXZhbGVuY2Ugb2YgdGhpbm5lc3MgYW1vbmcgY2hpbGRyZW4gZm9yIEFnZSA1IHRvIDkoJSkNCjIxLiBJbmNvbWUuY29tcG9zb3Rpb24ub2YucmVzb3VyY2VzIDogSHVtYW4gRGV2ZWxvcG1lbnQgSW5kZXggaW4gdGVybXMgb2YgaW5jb21lIGNvbXBvc2l0aW9uIG9mIHJlc291cmNlcyAoaW5kZXggcmFuZ2luZyBmcm9tIDAgdG8gMSkNCjIyLiBTY2hvb2xpbmcgICAgICAgICAgICAgOiBOdW1iZXIgb2YgeWVhcnMgb2YgU2Nob29saW5nKHllYXJzKQ0KDQpgYGB7ciBjYXJzfQ0KI0xvYWQgbGlicmFyeQ0KbGlicmFyeSh0aWR5cikNCg0KIyBEYXRhIGlucHV0DQpkYXRhIDwtIHJlYWQuY3N2KCJkYXRhL0xpZmUgRXhwZWN0YW5jeSBEYXRhLmNzdiIpDQoNCiNDaGVja2luZyBkYXRhDQpzdHIoZGF0YSkNCmBgYA0KRnJvbSB0aGlzIHJlc3VsdCwgd2UgZmluZCAqKlllYXIqKiwgYW5kICoqU3RhdHVzKiogY29sdW1ucyBhcmUgbm90IGluIGNvcnJlY3QgZGF0YSB0eXBlLiB3ZSB3aWxsIGNvbnZlcnQgaXQgdG8gKipmYWN0b3IqKiB0eXBlLg0KDQpgYGB7cn0NCiNFeHBsaWNpdCBjb2VydGlvbg0KZGF0YSRZZWFyIDwtIGFzLmZhY3RvcihkYXRhJFllYXIpDQpkYXRhJFN0YXR1cyA8LSBhcy5mYWN0b3IoZGF0YSRTdGF0dXMpDQoNCnN0cihkYXRhKQ0KYGBgDQpgYGB7cn0NCiNDaGVjayBtaXNzaW5nIFZhbHVlDQpjb2xTdW1zKGlzLm5hKGRhdGEpKQ0KYGBgDQpXZSBjYW4gc2VlIGFib3ZlLCB0aGVyZSBhcmUgbWFueSBjb2x1bW5zIHdpdGggbWlzc2luZyB2YWx1ZXMuIGZvciB0aGlzIHByb2plY3QsIHdlIHdpbGwgZmlsbCB0aGUgbWlzc2luZyB2YWx1ZXMgd2l0aCB0aGUgbmV4dCB2YWx1ZSB0aGVuIHByZXZpb3VzIHZhbHVlIChmaXJzdCB1cCBhbmQgdGhlbiBkb3duKSBmb3IgZWFjaCBjb3VudHJ5IGJlY2F1c2UgdGhlIGRhdGEgb3JkZXJlZCBieSB5ZWFyIG9uIGRlc2NlbmRpbmcgcnVsZS4NCg0KYGBge3J9DQojR2V0IGNvdW50cnkgbGlzdA0KY291bnRyeS5saXN0IDwtdW5pcXVlKGRhdGEkQ291bnRyeSkNCg0KI0ZpbGwgdGhlIG1pc3NpbmcgdmFsdWVzDQpmb3IgKGNvdW50cnkgaW4gY291bnRyeS5saXN0KSB7DQogIA0KICBkYXRhW2RhdGEkQ291bnRyeSA9PSBjb3VudHJ5LF0gPC0gZGF0YVtkYXRhJENvdW50cnkgPT0gY291bnRyeSxdICU+JSAgZmlsbChjKExpZmUuZXhwZWN0YW5jeSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgQWR1bHQuTW9ydGFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBBbGNvaG9sLA0KICAgICAgICAgICAgICAgICAgICAgICAgIEhlcGF0aXRpcy5CLA0KICAgICAgICAgICAgICAgICAgICAgICAgIEJNSSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBQb2xpbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbC5leHBlbmRpdHVyZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBEaXBodGhlcmlhLA0KICAgICAgICAgICAgICAgICAgICAgICAgIEdEUCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBQb3B1bGF0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5uZXNzLi4xLjE5LnllYXJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5uZXNzLjUuOS55ZWFycywNCiAgICAgICAgICAgICAgICAgICAgICAgICBJbmNvbWUuY29tcG9zaXRpb24ub2YucmVzb3VyY2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFNjaG9vbGluZyksIC5kaXJlY3Rpb24gPSAidXBkb3duIikNCn0NCmNvbFN1bXMoaXMubmEoZGF0YSkpDQpgYGANCkFmdGVyIHdlIGZpbGxlZCBtaXNzaW5nIHZhbHVlcyB3aXRoIGFib3ZlIG1ldGhvZCwgd2Ugc3RpbGwgc2VlIHRoYXQgc2V2ZXJhbCBjb2x1bW5zIGhhdmUgbWlzc2luZyB2YWx1ZXMuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gcmVjb3JkZWQgZGF0YSBvbiBlYWNoIGNvdW50cnkuIFNvLCB3ZSB3aWxsIGZpbGwgaXQgYWxsIHdpdGggMCBleGNlcHQgZm9yIGxpZmUgZXhwZWN0YW5jeSBjb2x1bW4uIFdlIHdpbGwgZGVsZXRlIHRoZSByb3dzIHRoYXQgTGlmZS5leHBlY3RhbmN5IGRhdGEgaXMgbWlzc2luZyBiZWNhdXNlIExpZmUuZXhwZWN0YW5jeSBkYXRhIGlzIHRoZSBtYW5kYXRvcnkgZGF0YSB0byBhbmFseXNlLg0KYGBge3J9DQojRGVsZXRlIGRhdGEgd2l0aCBtaXNzaW5nIExpZmUuZXhwZWN0YW5jeQ0KZGF0YSA8LSBkcm9wX25hKGRhdGEgPSBkYXRhLCBMaWZlLmV4cGVjdGFuY3kpDQoNCiNGaWxsIG1pc3NpbmcgZGF0YSB3aXRoIDANCmRhdGFbaXMubmEoZGF0YSldIDwtIDANCmFueU5BKGRhdGEpDQpgYGANCkdyZWF0ISEgTm93IG91ciBkYXRhIGlzIGNsZWFuIQ0KDQpgYGB7cn0NCnN1bW1hcnkoZGF0YSkNCmBgYA0KDQpCYXNlZCBvbiB0aGUgc3VtbWFyeSwgd2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlIGF2ZXJhZ2UgbGlmZSBleHBlY3RhbmN5IGZyb20gMTkzIGNvdW50cmllcyBpcyAqKjY5LjIyKiogeWVhcnMgb2xkLCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxpZmUgZXhwZWN0YW5jeSBhcmUgKiozNi4zMCoqIGFuZCAqKjg5KiogeWVhcnMgb2xkLg0KDQojIyAqKkhpZ2hlc3QgYW5kIExvd2VzdCBMaWZlIEV4cGVjdGFuY3kqKg0KDQojIyMgKipIaWdoZXN0IExpZmUgRXhwZWN0YW5jeSBDb3VudHJ5KioNCg0KTm93LCB3ZSB3YW50IHRvIGtub3cgY291bnRyeSB3aXRoIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgbGlmZSBleHBlY3RhbmN5Lg0KYGBge3J9DQpjb3VudHJ5X2F2Z19sZSA8LSBhZ2dyZWdhdGUoTGlmZS5leHBlY3RhbmN5IH4gQ291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBtZWFuKQ0KI0dldCBUb3AgMTAgQ291bnRyeSB3aXRoIGhpZ2hlc3QgTGlmZSBFeHBlY3RhbmN5DQpjb3VudHJ5X2F2Z19sZV8xMF91cCA8LSB0YWlsKGNvdW50cnlfYXZnX2xlW29yZGVyKGNvdW50cnlfYXZnX2xlJExpZmUuZXhwZWN0YW5jeSksXSwgMTApDQpjb3VudHJ5X2F2Z19sZV8xMF91cA0KYGBgDQpgYGB7cn0NCiNDcmVhdGUgYmFycGxvdA0KYSA8LSBiYXJwbG90KGhlaWdodCA9IGNvdW50cnlfYXZnX2xlXzEwX3VwJExpZmUuZXhwZWN0YW5jeSwNCiAgICAgICAgbmFtZXMgPSBjb3VudHJ5X2F2Z19sZV8xMF91cCRDb3VudHJ5LA0KICAgICAgICBob3JpeiA9IFQsDQogICAgICAgIGxhcyA9IDEsDQogICAgICAgIG1haW4gPSAiVG9wIDEwIENvdW50cmllcyB3aXRoIEhpZ2hlc3QgQXZlcmFnZSBMaWZlIEV4cGVjdGFuY3kiLA0KICAgICAgICB4bGFiID0gIkxpZmUgRXhwZWN0YW5jeSIsDQogICAgICAgIGNvbD0iIzI2ODVkZSIpDQp0ZXh0KHkgPSBhLCB4ID0gY291bnRyeV9hdmdfbGVfMTBfdXBbLDJdLTUsIGxhYmVsPWNvdW50cnlfYXZnX2xlXzEwX3VwWywyXSkNCmBgYA0KDQpCYXNlZCBvbiBhYm92ZSByZXN1bHQsIHdlIGZpbmQgdGhhdCBKYXBhbiBoYXZlIHRoZSBoaWdoZXN0IGxpZmUgZXhwZWN0YW5jeSBhdmVyYWdlIHdpdGggKio4Mi41Mzc1MCoqIHllYXJzIG9sZC4NCg0KIyMjICoqTG93ZXN0IExpZmUgRXhwZWN0YW5jeSBDb3VudHJ5KioNCg0KYGBge3J9DQojR2V0IFRvcCAxMCBDb3VudHJ5IHdpdGggTG93ZXN0IExpZmUgRXhwZWN0YW5jeQ0KY291bnRyeV9hdmdfbGVfMTBfZG93biA8LSB0YWlsKGNvdW50cnlfYXZnX2xlW29yZGVyKGNvdW50cnlfYXZnX2xlJExpZmUuZXhwZWN0YW5jeSwgZGVjcmVhc2luZyA9IFQpLF0sIDEwKQ0KY291bnRyeV9hdmdfbGVfMTBfZG93bg0KYGBgDQoNCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJ30NCiNDcmVhdGUgYmFycGxvdA0KYiA8LSBiYXJwbG90KGhlaWdodCA9IGNvdW50cnlfYXZnX2xlXzEwX2Rvd24kTGlmZS5leHBlY3RhbmN5LA0KICAgICAgICBuYW1lcyA9IGNvdW50cnlfYXZnX2xlXzEwX2Rvd24kQ291bnRyeSwNCiAgICAgICAgaG9yaXogPSBULA0KICAgICAgICBsYXMgPSAxLA0KICAgICAgICBtYWluID0gIlRvcCAxMCBDb3VudHJpZXMgd2l0aCBMb3dlc3QgQXZlcmFnZSBMaWZlIEV4cGVjdGFuY3kiLA0KICAgICAgICB4bGFiID0gIkxpZmUgRXhwZWN0YW5jeSIsDQogICAgICAgIGNvbD0iIzI2ODVkZSIsIGNleC5uYW1lcyA9IDAuNikNCnRleHQoeSA9IGIsIHggPSBjb3VudHJ5X2F2Z19sZV8xMF9kb3duWywyXS0zLCBsYWJlbD1jb3VudHJ5X2F2Z19sZV8xMF9kb3duWywyXSkNCmBgYA0KDQpCYXNlZCBvbiBhYm92ZSByZXN1bHQsIHdlIGZpbmQgdGhhdCBTaWVycmEgTGVvbmUgaGF2ZSB0aGUgbG93ZXN0IGxpZmUgZXhwZWN0YW5jeSBhdmVyYWdlIHdpdGggKio0Ni4xMTI1MCoqIHllYXJzIG9sZCB3aGljaCB1bmRlciB0aGUgd29ybGQgbGlmZSBleHBlY3RhbmN5IGF2ZXJhZ2UuDQoNCiMjICoqQ291bnRyeSBTdGF0dXMgQ29tcGFyaXNvbiBvbiBMaWZlIEV4cGVjdGFuY3kqKg0KDQpJbiB0aGlzIGRhdGEsIGNvdW50cnkgc3RhdHVzIGlzIGRldmllZCB0byAqRGV2ZWxvcGVkKiBhbmQgKkRldmVsb3BpbmcqIENvdW50cnkuIHdlIHdhbnQgdG8gY29tcGFyZSB0aGUgYXZlcmFnZSBsaWZlIGV4cGVjdGFuY3kgYmV0d2VlZW4gZGV2ZWxvcGVkIGFuZCBkZXZlbG9waW5nIGNvdW50cnkuDQoNCmBgYHtyfQ0KYXZlcmFnZV9zdGF0dXMgPC0gYWdncmVnYXRlKExpZmUuZXhwZWN0YW5jeSB+IFN0YXR1cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBtZWFuKQ0KYXZlcmFnZV9zdGF0dXMNCmBgYA0KYGBge3J9DQpjIDwtIGJhcnBsb3QoaGVpZ2h0ID0gYXZlcmFnZV9zdGF0dXMkTGlmZS5leHBlY3RhbmN5LA0KICAgICAgICBuYW1lcyA9IGF2ZXJhZ2Vfc3RhdHVzJFN0YXR1cywNCiAgICAgICAgeWxhYiA9ICJMaWZlIEV4cGVjdGFuY3kiLA0KICAgICAgICBjb2w9IiMyNjg1ZGUiKQ0KdGV4dCh4ID0gYywgeSA9IGF2ZXJhZ2Vfc3RhdHVzWywyXS0yLCBsYWJlbHMgPSBhdmVyYWdlX3N0YXR1c1ssMl0pDQpgYGANCg0KIyMgKipJcyBDb3VudHJpZXMgR0RQIGhhdmUgQ29ycmVsYXRpb24gb24gTGlmZSBFeHBlY3RhbmN5PyoqDQoNCmBgYHtyfQ0KI1N1YnNldCBHRFAgYW5kIExpZmUuZXhwZWN0YW5jeSBjb2x1bW5zDQpnZHBfbGUgPC0gZGF0YVssIGMoIkdEUCIsICJMaWZlLmV4cGVjdGFuY3kiKV0NCiNEZWxldGUgMCB2YWx1ZXMNCmdkcF9sZSA8LSBnZHBfbGVbZ2RwX2xlJEdEUCAhPSAwLF0NCg0KI0NvcmVsYXRpb24gVmFsdWUNCmNvcihnZHBfbGUkTGlmZS5leHBlY3RhbmN5LCBnZHBfbGUkR0RQKQ0KDQpgYGANCg0KYGBge3J9DQojU2NhdHRlciBwbG90DQpwbG90KGdkcF9sZSRMaWZlLmV4cGVjdGFuY3ksDQogICAgIGdkcF9sZSRHRFAsDQogICAgIHhsYWIgPSAiTGlmZSBFeHBlY3RhbmN5IiwNCiAgICAgeWxhYiA9ICJHRFAiKQ0KYWJsaW5lKGxtKGdkcF9sZSRHRFAgfiBnZHBfbGUkTGlmZS5leHBlY3RhbmN5KSwNCiAgICAgICBjb2wgPSAicmVkIikNCmBgYA0KDQpCYXNlZCBvbiB0aGF0IHJlc3VsdCwgd2UgY2FuIGNvbmNsdWRlIHRoYXQgY29ycmVsYXRpb24gYmV0d2VlbiBHRFAgYW5kIGxpZmUgZXhwY3RhbmN5IGlzIHdlYWstcG9zaXRpZiB3aGljaCBtZWFuIGxpZmUgZXhwZWN0YW5jeSB3aWxsIGluY3JlYXNlIGFzIGxvbmcgYXMgdGhlIEdEUCBpbmNyZWFzZXMuDQoNCiMjICoqV2hhdHMgUGFyYW1ldGVyIGhhdmUgdGhlIE1vc3QgSW1wYWN0IG9uIExpZmUgRXhwZWN0YW5jeT8qKg0KDQpgYGB7cn0NCiN3ZSBuZWVkIEdHYWxseSBsaWJyYXJ5IHRvIHVzZSBnZ2NvcigpIGZ1bmN0aW9uDQpsaWJyYXJ5KEdHYWxseSkNCg0KZ2djb3JyKGRhdGEsIGxhYmVsID0gVCwgaGp1c3QgPSAxLCBsYXlvdXQuZXhwID0gNSkNCmBgYA0KDQpCYXNlZCBvbiByZXN1bHQsIHdlIGZpbmQgdGhhdCB0aGVyZSBhcmUgc29tZSBsaWZlIGV4cGVjdGFuY3kgcGFyYW1ldGVyIGhhdmluZyBwb3NpdGlmIGFuZCBuZWdhdGl2ZSBjb3JlbGF0aW9uLiBTb21lIHN0cm9uZyBwb3NpdGl2ZSBjb3JlbGF0aW9uIHBhcmFtZXRlciBhcmUgKlNjaG9vbGluZyosICppbmNvbWUgY29tcG9zaXRpb24qLCBhbmQgKm1lYXNsZXMqLiBOZWdhdGl2ZSBjb3JlbGF0aW9uIHBhcmFtZXRlcnMgYXJlICp0aGlubmVzcy4uMS4xOS55ZWFycyosICp0aGlubmVzcy41LjkueWVhcnMqLCBhbmQgKkhJVi5BSURTKi4NCg0KIyMgKipIb3cgYWJvdXQgSW5kb25lc2lhbiBDb25kaXRpb24/KioNCg0KYGBge3J9DQppbmRvbmVzaWFfZGF0YSA8LSBkYXRhW2RhdGEkQ291bnRyeSA9PSAiSW5kb25lc2lhIixdDQpzdW1tYXJ5KGluZG9uZXNpYV9kYXRhKQ0KYGBgDQoNCmBgYHtyfQ0KZCA8LSBwbG90KHggPSBpbmRvbmVzaWFfZGF0YSRZZWFyLCB5ID0gaW5kb25lc2lhX2RhdGEkTGlmZS5leHBlY3RhbmN5LA0KICAgICAgICAgIHhsYWIgPSAiWWVhciIsDQogICAgICAgICAgeWxhYiA9ICJMaWZlIEV4cGVjdGFuY3kiKQ0KYGBgDQoNCg0KQmFzZWQgb24gYWJvdmUgc3VtbWFyeSwgSW5kb25lc2lhIHN0aWxsIGluICpEZXZlbG9waW5nKiBjb3VudHJ5IHN0YXR1cywgaGF2aW5nICoqNjcuNTYqKiB5ZWFycyBhdmVyYWdlIGxpZmUgZXhwZWN0YW5jeSwgYmVsb3cgdGhlIHdvcmxkIGF2ZXJhZ2UgbGlmZSBleHBlY3RhbmN5ICoqNjkuMjIqKiB5ZWFycyBvbGQuIEJ1dCwgZnJvbSAyMDAwIHVudGlsIDIwMTUsIEluZG9uZXNpYW4gbGlmZSBleHBlY3RhbmN5IGFsd2F5cyBpbmNyZXNlLg0KDQojIyAqKkNvbmNsdXNpb24qKg0KDQpMaWZlIGV4cGVjdGFuY3kgaXMgbnVtYmVyIG9mIGFnZSB0aGF0IG9yZ2FuaXNtIGV4cGVjdGVkIHRvIGxpZmUuIFRoaXMgaGF2ZSBzZXZlcmFsIHBhcmFtZXRlciB0aGF0IGhhdmluZyBwb3NpdGl2ZSBjb3JlbGF0aW9uIGFuZCBuZWdhdGl2ZSBjb3JlbGF0aW9uLiBwb3NpdGl2ZSBjb3JlbGF0aW9uIG1lYW5zLCBpZiB2YWx1ZSBvZiBwYXJhbWV0ZXIgaW5jcmVhc2VzLCBzbyB0aGUgbGlmZSBleHBlY3RhbmN5IGluY3JlYXNlcy4gQW5kIG5lZ2F0aXZlIGNvcmVsYXRpb24gbWVhbnMsIGlmIHZhbHVlIG9mIHBhcmFtZXRlciBkZWNyZWFzZXMsIHNvIHRoZSBsaWZlIGV4cGVjdGFuY3kgZGVjcmVhc2VzLg0KDQpUaGUgYXZlcmFnZSBvZiBsaWZlIGV4cGVjYW5jeSBmcm9tIDE5MyBjb3VudHJpZXMgaXMgNjkuMjIgeWVhcnMgb2xkLiBKYXBhbiBoYXZlIHRoZSBoaWdoZXN0IGxpZmUgZXhwZWN0YW5jeSBpbiA4Mi41Mzc1MCB5ZWFycyBvbGQgYW5kIFNpZXJyYSBMZW9uZSBoYXZlIHRoZSBsb3dlc3QgbGlmZSBleHBlY3RhbmN5IGluIGp1c3QgNDYuMTEyNTAgeWVhcnMgb2xkLg0KDQpJbmRvbmVzaWEgaGF2ZSBhdmVyYWdlIGxpZmUgZXhwZWN0YW5jeSBpbiA2Ny41NiB5ZWFycyBvbGQuIFRoaXMgc3RpbGwgYmVsb3cgdGhlIGdsb2JhbCBhdmVyYWdlIGxpZmUgZXhwZWN0YW5jeS4gQ291bnRyeSB3aXRoIGRldmVsb3Bpbmcgc3RhdHVzIGhhdmUgbGlmZSBleHBlY3RhbmN5IGJlbG93IHRoZSBnbG9iYWwgYXZlcmFnZS4gU28gdGhleSBuZWVkIHRvIGluY3JlYXNlcyB0aGUgcG9zaXRpdmUgY29yZWxhdGlvbiBsaWZlIGV4cGVjdGFuY3kgcGFyYW1ldGVyIHNpZ25pZmljYW50bHkgYW5kIGRlY3JlYXNlcyB0aGUgbmVnYXRpdmUgY29yZWxhdGlvbiBsaWZlIGV4cGVjdGFuY3kgcGFyYW1ldGVyIHNpZ25pZmljYW50bHkuIFRoYXRzIHdpbGwgbWFrZSB0aGVpciBsaWZlIGV4cGVjdGFuY3kgaW5jcmVhc2VzLg0KDQoNCiMjICoqUmVmZXJlbmNlcyoqDQoNCjEuIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMva3VtYXJhamFyc2hpL2xpZmUtZXhwZWN0YW5jeS13aG8NCjIuIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpZmVfZXhwZWN0YW5jeSM=