#Import data
Countries<- read.csv("https://tkelleman.github.io/tkweb/Week5/countries_total.csv")
Income<-read.csv("https://tkelleman.github.io/tkweb/Week5/income_per_person.csv")
LifeExp<-read.csv("https://tkelleman.github.io/tkweb/Week5/life_expectancy_years.csv")
Population<-read.csv("https://tkelleman.github.io/tkweb/Week5/population_total.csv")

## A - Reshape data set: Income Per Person to make a longitudinal data such that the resulting data set has three columns: country, year, and income.
IncomeEdit <- Income %>%
  gather(key = "Year", value = "Income", - geo, na.rm=TRUE)
names(IncomeEdit)[1] <- "Country"

## B - Do the same for Life Expectancy in Years so that the resulting data set has three columns: country, year, and life expectancy.
LifeExpEdit <- LifeExp %>%
  gather(key = "Year", value = "LifeExpectancy", - geo, na.rm=TRUE)
names(LifeExpEdit)[1] <- "Country"

## C -  Merge/join the above two longitudinal data sets to make a new data set, under name LifeExpIncom that has variables: country, year, lifeExp, and income.
LifeExpIncom <- merge(IncomeEdit, LifeExpEdit, by = c("Country", "Year"))

## D - Merge LifeExpIncom with country region so that the final data set has information about income, life expectancy, and country region.
LifeIncomCount <-merge(LifeExpIncom, Countries, by.x = "Country", by.y = "name", all.x = TRUE)

## E -  Merge the previous resulting data set with population size so that the final data set has information about income, life expectancy, population size, and country region.
PopulationEdit <- Population %>%
  gather(key = "Year", value = "Population", - geo, na.rm=TRUE)
names(PopulationEdit)[1] <- "Country"

FinalData <- merge(LifeIncomCount, PopulationEdit, by = c("Country", "Year"))
FinalData <- subset(FinalData, select = -c(alpha.2, alpha.3, country.code, iso_3166.2, sub.region, region.code, sub.region.code, intermediate.region.code, intermediate.region))
FinalData$Year<-gsub("X","", as.character(FinalData$Year))

#write.csv(FinalData, "FinalData.csv")

## 3 Create a subset of the above resulting longitudinal data set that contains only the data of the year 2000/font> - name it 2000data.
Y2000data<-filter(FinalData, Year==2000)

#Y2000data contains 187 observations of 6 variables
#FinalData contains 40,437 observations of 6 variables

cols1 = c("#332288","#117733","#44AA99","#88CCEE","#DDCC77","#CC6677")
Y2000Plot<-ggplot(Y2000data, aes(x=Income, 
                      y=LifeExpectancy, 
                      size = Population, 
                      color = region)) +
  geom_point(aes(size=Population, ids = Country),
            show.legend = TRUE,
            alpha = 0.8)+
            scale_color_manual(values = cols1)+
    labs(title = 'Plot of Life Expectancy by Income in 2000',
       x = 'Income',
       y = 'Life Expectancy',
       legend = 'Region')+
    transition_states(Year) +
    ease_aes('linear')
Y2000Plot


Figure 1: Plot of Life Expectancy by Income in 2000

This plot shows the relationship between life expectancy and income in the year 2000 in the merged data set. The population of each country is represented by the diameter of the points plotted and the color of the point represents the region of the country. As shown in this figure, countries in the regions of Americas and Europe have a higher life expectancy than most countries in the Africa region, with a few outlier data points. —

### Full Data Set
cols1 = c("#332288","#117733","#44AA99","#88CCEE","#DDCC77","#CC6677")
AllDataPlot<-ggplot(FinalData, aes(x=Income, 
                      y=LifeExpectancy, 
                      size = Population, 
                      color = region)) +
  geom_point(aes(size=Population, ids = Country),
            show.legend = TRUE,
            alpha = 0.8)+
            scale_color_manual(values = cols1)+
    labs(title = 'Plot of Life Expectency by Income at Year: {closest_state}',
       x = 'Income',
       y = 'Life Expectancy',
       fill =  'Region')+
    transition_states(Year) +
    ease_aes('linear')

animate(AllDataPlot, renderer = gifski_renderer(), rewind = FALSE, nframes = 300, fps = 10)


Figure 2: Plot of Life Expectancy by Income for Years 1800-2018

This plot shows the relationship between life expectancy and income all countries in the merged data set. The population of each country is represented by the diameter of the points plotted and the color of the point represents the region of the country. As shown in the plot, all represented countries increase their life expectancy between the given years but not all countries show an increase in income.

LS0tDQp0aXRsZTogIldlZWsgNSAtIEdHUExPVCBSZXZpc2l0ZWQiDQphdXRob3I6ICJUaW0gS2VsbGVtYW4iDQpkYXRlOiAiMjAyNC0wMi0yMiINCg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZmlnX3dpZHRoOiA4DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQpkaXYjVE9DIGE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KZGl2I1RPQyBhOmxpbmsgew0KICBjb2xvcjogYmx1ZTsNCn0NCg0KDQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQpoNC5hdXRob3IgeyANCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IA0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsNCiAgICBmb250LXNpemU6IDI0cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IA0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiBzZWxlY3RlZCBsaW5rICovDQphOmFjdGl2ZSB7DQogIGNvbG9yOiB5ZWxsb3c7DQp9DQo8L3N0eWxlPg0KYGBgDQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgiY293cGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikNCiAgIGxpYnJhcnkoY293cGxvdCkNCn0NCmlmICghcmVxdWlyZSgibGF0ZXgyZXhwIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxhdGV4MmV4cCIpDQogICBsaWJyYXJ5KGxhdGV4MmV4cCkNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgicG5nIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJwbmciKSAgICAgICAgICAgICAjIEluc3RhbGwgcG5nIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJwbmciKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQojIyMgZ2dwbG90IGFuZCBleHRlbnNpb25zDQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dwbG90MiIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdncmlkZ2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3JpZGdlcyIpDQp9DQppZiAoIXJlcXVpcmUoImdyYXBoaWNzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJncmFwaGljcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJncmFwaGljcyIpDQp9DQppZiAoIXJlcXVpcmUoImRwbHlyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJkcGx5ciIpDQp9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEpDQpgYGANCg0KYGBge3IgZXZhbD1UUlVFfQ0KI0ltcG9ydCBkYXRhDQpDb3VudHJpZXM8LSByZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs1L2NvdW50cmllc190b3RhbC5jc3YiKQ0KSW5jb21lPC1yZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs1L2luY29tZV9wZXJfcGVyc29uLmNzdiIpDQpMaWZlRXhwPC1yZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs1L2xpZmVfZXhwZWN0YW5jeV95ZWFycy5jc3YiKQ0KUG9wdWxhdGlvbjwtcmVhZC5jc3YoImh0dHBzOi8vdGtlbGxlbWFuLmdpdGh1Yi5pby90a3dlYi9XZWVrNS9wb3B1bGF0aW9uX3RvdGFsLmNzdiIpDQoNCiMjIEEgLSBSZXNoYXBlIGRhdGEgc2V0OiBJbmNvbWUgUGVyIFBlcnNvbiB0byBtYWtlIGEgbG9uZ2l0dWRpbmFsIGRhdGEgc3VjaCB0aGF0IHRoZSByZXN1bHRpbmcgZGF0YSBzZXQgaGFzIHRocmVlIGNvbHVtbnM6IGNvdW50cnksIHllYXIsIGFuZCBpbmNvbWUuDQpJbmNvbWVFZGl0IDwtIEluY29tZSAlPiUNCiAgZ2F0aGVyKGtleSA9ICJZZWFyIiwgdmFsdWUgPSAiSW5jb21lIiwgLSBnZW8sIG5hLnJtPVRSVUUpDQpuYW1lcyhJbmNvbWVFZGl0KVsxXSA8LSAiQ291bnRyeSINCg0KIyMgQiAtIERvIHRoZSBzYW1lIGZvciBMaWZlIEV4cGVjdGFuY3kgaW4gWWVhcnMgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGRhdGEgc2V0IGhhcyB0aHJlZSBjb2x1bW5zOiBjb3VudHJ5LCB5ZWFyLCBhbmQgbGlmZSBleHBlY3RhbmN5Lg0KTGlmZUV4cEVkaXQgPC0gTGlmZUV4cCAlPiUNCiAgZ2F0aGVyKGtleSA9ICJZZWFyIiwgdmFsdWUgPSAiTGlmZUV4cGVjdGFuY3kiLCAtIGdlbywgbmEucm09VFJVRSkNCm5hbWVzKExpZmVFeHBFZGl0KVsxXSA8LSAiQ291bnRyeSINCg0KIyMgQyAtICBNZXJnZS9qb2luIHRoZSBhYm92ZSB0d28gbG9uZ2l0dWRpbmFsIGRhdGEgc2V0cyB0byBtYWtlIGEgbmV3IGRhdGEgc2V0LCB1bmRlciBuYW1lIExpZmVFeHBJbmNvbSB0aGF0IGhhcyB2YXJpYWJsZXM6IGNvdW50cnksIHllYXIsIGxpZmVFeHAsIGFuZCBpbmNvbWUuDQpMaWZlRXhwSW5jb20gPC0gbWVyZ2UoSW5jb21lRWRpdCwgTGlmZUV4cEVkaXQsIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpDQoNCiMjIEQgLSBNZXJnZSBMaWZlRXhwSW5jb20gd2l0aCBjb3VudHJ5IHJlZ2lvbiBzbyB0aGF0IHRoZSBmaW5hbCBkYXRhIHNldCBoYXMgaW5mb3JtYXRpb24gYWJvdXQgaW5jb21lLCBsaWZlIGV4cGVjdGFuY3ksIGFuZCBjb3VudHJ5IHJlZ2lvbi4NCkxpZmVJbmNvbUNvdW50IDwtbWVyZ2UoTGlmZUV4cEluY29tLCBDb3VudHJpZXMsIGJ5LnggPSAiQ291bnRyeSIsIGJ5LnkgPSAibmFtZSIsIGFsbC54ID0gVFJVRSkNCg0KIyMgRSAtICBNZXJnZSB0aGUgcHJldmlvdXMgcmVzdWx0aW5nIGRhdGEgc2V0IHdpdGggcG9wdWxhdGlvbiBzaXplIHNvIHRoYXQgdGhlIGZpbmFsIGRhdGEgc2V0IGhhcyBpbmZvcm1hdGlvbiBhYm91dCBpbmNvbWUsIGxpZmUgZXhwZWN0YW5jeSwgcG9wdWxhdGlvbiBzaXplLCBhbmQgY291bnRyeSByZWdpb24uDQpQb3B1bGF0aW9uRWRpdCA8LSBQb3B1bGF0aW9uICU+JQ0KICBnYXRoZXIoa2V5ID0gIlllYXIiLCB2YWx1ZSA9ICJQb3B1bGF0aW9uIiwgLSBnZW8sIG5hLnJtPVRSVUUpDQpuYW1lcyhQb3B1bGF0aW9uRWRpdClbMV0gPC0gIkNvdW50cnkiDQoNCkZpbmFsRGF0YSA8LSBtZXJnZShMaWZlSW5jb21Db3VudCwgUG9wdWxhdGlvbkVkaXQsIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpDQpGaW5hbERhdGEgPC0gc3Vic2V0KEZpbmFsRGF0YSwgc2VsZWN0ID0gLWMoYWxwaGEuMiwgYWxwaGEuMywgY291bnRyeS5jb2RlLCBpc29fMzE2Ni4yLCBzdWIucmVnaW9uLCByZWdpb24uY29kZSwgc3ViLnJlZ2lvbi5jb2RlLCBpbnRlcm1lZGlhdGUucmVnaW9uLmNvZGUsIGludGVybWVkaWF0ZS5yZWdpb24pKQ0KRmluYWxEYXRhJFllYXI8LWdzdWIoIlgiLCIiLCBhcy5jaGFyYWN0ZXIoRmluYWxEYXRhJFllYXIpKQ0KDQojd3JpdGUuY3N2KEZpbmFsRGF0YSwgIkZpbmFsRGF0YS5jc3YiKQ0KDQojIyAzIENyZWF0ZSBhIHN1YnNldCBvZiB0aGUgYWJvdmUgcmVzdWx0aW5nIGxvbmdpdHVkaW5hbCBkYXRhIHNldCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGRhdGEgb2YgdGhlIHllYXIgMjAwMC9mb250PiAtIG5hbWUgaXQgMjAwMGRhdGEuDQpZMjAwMGRhdGE8LWZpbHRlcihGaW5hbERhdGEsIFllYXI9PTIwMDApDQoNCiNZMjAwMGRhdGEgY29udGFpbnMgMTg3IG9ic2VydmF0aW9ucyBvZiA2IHZhcmlhYmxlcw0KI0ZpbmFsRGF0YSBjb250YWlucyA0MCw0Mzcgb2JzZXJ2YXRpb25zIG9mIDYgdmFyaWFibGVzDQoNCmBgYA0KDQotLS0NCmBgYHtyIGV2YWw9VFJVRX0NCmNvbHMxID0gYygiIzMzMjI4OCIsIiMxMTc3MzMiLCIjNDRBQTk5IiwiIzg4Q0NFRSIsIiNERENDNzciLCIjQ0M2Njc3IikNClkyMDAwUGxvdDwtZ2dwbG90KFkyMDAwZGF0YSwgYWVzKHg9SW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICB5PUxpZmVFeHBlY3RhbmN5LCANCiAgICAgICAgICAgICAgICAgICAgICBzaXplID0gUG9wdWxhdGlvbiwgDQogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSByZWdpb24pKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemU9UG9wdWxhdGlvbiwgaWRzID0gQ291bnRyeSksDQogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUsDQogICAgICAgICAgICBhbHBoYSA9IDAuOCkrDQogICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sczEpKw0KICAgIGxhYnModGl0bGUgPSAnUGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgYnkgSW5jb21lIGluIDIwMDAnLA0KICAgICAgIHggPSAnSW5jb21lJywNCiAgICAgICB5ID0gJ0xpZmUgRXhwZWN0YW5jeScsDQogICAgICAgbGVnZW5kID0gJ1JlZ2lvbicpKw0KICAgIHRyYW5zaXRpb25fc3RhdGVzKFllYXIpICsNCiAgICBlYXNlX2FlcygnbGluZWFyJykNClkyMDAwUGxvdA0KYGBgDQo8YnI+DQpGaWd1cmUgMTogUGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgYnkgSW5jb21lIGluIDIwMDAgPGJyPiA8YnI+ICBUaGlzIHBsb3Qgc2hvd3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGxpZmUgZXhwZWN0YW5jeSBhbmQgaW5jb21lIGluIHRoZSB5ZWFyIDIwMDAgaW4gdGhlIG1lcmdlZCBkYXRhIHNldC4gVGhlIHBvcHVsYXRpb24gb2YgZWFjaCBjb3VudHJ5IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBkaWFtZXRlciBvZiB0aGUgcG9pbnRzIHBsb3R0ZWQgYW5kIHRoZSBjb2xvciBvZiB0aGUgcG9pbnQgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIHRoZSBjb3VudHJ5LiBBcyBzaG93biBpbiB0aGlzIGZpZ3VyZSwgY291bnRyaWVzIGluIHRoZSByZWdpb25zIG9mIEFtZXJpY2FzIGFuZCBFdXJvcGUgaGF2ZSBhIGhpZ2hlciBsaWZlIGV4cGVjdGFuY3kgdGhhbiBtb3N0IGNvdW50cmllcyBpbiB0aGUgQWZyaWNhIHJlZ2lvbiwgd2l0aCBhIGZldyBvdXRsaWVyIGRhdGEgcG9pbnRzLg0KLS0tDQpgYGB7ciBldmFsPVRSVUV9DQojIyMgRnVsbCBEYXRhIFNldA0KY29sczEgPSBjKCIjMzMyMjg4IiwiIzExNzczMyIsIiM0NEFBOTkiLCIjODhDQ0VFIiwiI0REQ0M3NyIsIiNDQzY2NzciKQ0KQWxsRGF0YVBsb3Q8LWdncGxvdChGaW5hbERhdGEsIGFlcyh4PUluY29tZSwgDQogICAgICAgICAgICAgICAgICAgICAgeT1MaWZlRXhwZWN0YW5jeSwgDQogICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFBvcHVsYXRpb24sIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gcmVnaW9uKSkgKw0KICBnZW9tX3BvaW50KGFlcyhzaXplPVBvcHVsYXRpb24sIGlkcyA9IENvdW50cnkpLA0KICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFLA0KICAgICAgICAgICAgYWxwaGEgPSAwLjgpKw0KICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHMxKSsNCiAgICBsYWJzKHRpdGxlID0gJ1Bsb3Qgb2YgTGlmZSBFeHBlY3RlbmN5IGJ5IEluY29tZSBhdCBZZWFyOiB7Y2xvc2VzdF9zdGF0ZX0nLA0KICAgICAgIHggPSAnSW5jb21lJywNCiAgICAgICB5ID0gJ0xpZmUgRXhwZWN0YW5jeScsDQogICAgICAgZmlsbCA9ICAnUmVnaW9uJykrDQogICAgdHJhbnNpdGlvbl9zdGF0ZXMoWWVhcikgKw0KICAgIGVhc2VfYWVzKCdsaW5lYXInKQ0KDQphbmltYXRlKEFsbERhdGFQbG90LCByZW5kZXJlciA9IGdpZnNraV9yZW5kZXJlcigpLCByZXdpbmQgPSBGQUxTRSwgbmZyYW1lcyA9IDMwMCwgZnBzID0gMTApDQpgYGANCjxicj4NCkZpZ3VyZSAyOiBQbG90IG9mIExpZmUgRXhwZWN0YW5jeSBieSBJbmNvbWUgZm9yIFllYXJzIDE4MDAtMjAxOCA8YnI+IDxicj4gIFRoaXMgcGxvdCBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbGlmZSBleHBlY3RhbmN5IGFuZCBpbmNvbWUgYWxsIGNvdW50cmllcyBpbiB0aGUgbWVyZ2VkIGRhdGEgc2V0LiBUaGUgcG9wdWxhdGlvbiBvZiBlYWNoIGNvdW50cnkgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGRpYW1ldGVyIG9mIHRoZSBwb2ludHMgcGxvdHRlZCBhbmQgdGhlIGNvbG9yIG9mIHRoZSBwb2ludCByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgdGhlIGNvdW50cnkuIEFzIHNob3duIGluIHRoZSBwbG90LCBhbGwgcmVwcmVzZW50ZWQgY291bnRyaWVzIGluY3JlYXNlIHRoZWlyIGxpZmUgZXhwZWN0YW5jeSBiZXR3ZWVuIHRoZSBnaXZlbiB5ZWFycyBidXQgbm90IGFsbCBjb3VudHJpZXMgc2hvdyBhbiBpbmNyZWFzZSBpbiBpbmNvbWUuIA0KDQoNCg0KDQo=