Required packages

library(readr)
library(tidyr)
library(dplyr)

Attaching package: <U+393C><U+3E31>dplyr<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:stats<U+393C><U+3E32>:

    filter, lag

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    intersect, setdiff, setequal, union
library(Hmisc)
Loading required package: lattice
Loading required package: survival
Loading required package: Formula
Loading required package: ggplot2

Attaching package: <U+393C><U+3E31>Hmisc<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:dplyr<U+393C><U+3E32>:

    src, summarize

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    format.pval, units
library(knitr)
library(outliers)

Executive Summary

During this course we have learnt that ‘Data Preprocessing’ is a process required to prepare all forms of untidy data for statistical analysis. Once I found my data for this assignment, I began preproessing my data. The steps I took throughout this assignment were: 1. Got my two data sets (First data set on Birth Rates from 1960-2017 in various countries, and the second set of data on Death Rates from 1960-2017 in various countries) 2. Understand both data sets and what’s consisted within it (where I decided to only look at data from both tables for only three countries, which were India, Australia and United States) 3. Tidy and manipulate the data (where I tidied the data to a format where I was able to merge both data sets into one) 4. Scan the data for any errors or inconsistencies (where I removed all na’s within the data sets and replaced them with the mean of the columns where the data was missing) 5. Transformed the data to get another view of what it shows (where I transformed the death rate data as this data set had the most outliers)

Data

First set of data is based on birth rates within various countries from 1960 to 2017

Birth Rate Data Source: https://data.worldbank.org/indicator/SP.DYN.CBRT.IN Data fields within thie table are: 1. CountryName (name of country being represented in the data) 2. CountryCode (consisting three letter codes representing the country) 3. IndicatorName (indicating the data value being analysed in this data, which is the Birth rate, crude (per 1,000 people)) 4. IndicatorCode (the code that represents the birth rate indicator) 5. The remainder columns are the years from 1960 to 2017

Second set of data is based on death rates within various countries from 1960 to 2017

Death Rate data source: https://data.worldbank.org/indicator/SP.DYN.CDRT.IN Data fields within thie table are: 1. CountryName (name of country being represented in the data) 2. CountryCode (consisting three letter codes representing the country) 3. IndicatorName (indicating the data value being analysed in this data, which is the Death rate, crude (per 1,000 people)) 4. IndicatorCode (the code that represents the death rate indicator) 5. The remainder columns are the years from 1960 to 2017

Births <- read_csv("Birth Rate.csv") #loading the Birth Rate data from the working directory
Parsed with column specification:
cols(
  .default = col_double(),
  CountryName = col_character(),
  CountryCode = col_character(),
  IndicatorName = col_character(),
  IndicatorCode = col_character(),
  `2017` = col_character()
)
See spec(...) for full column specifications.
Deaths <- read_csv("Death Rate.csv") #loading the Death Rate data from the working directory
Parsed with column specification:
cols(
  .default = col_double(),
  CountryName = col_character(),
  CountryCode = col_character(),
  IndicatorName = col_character(),
  IndicatorCode = col_character(),
  `2017` = col_character()
)
See spec(...) for full column specifications.
 
head(Births)
head(Deaths)
Births <- Births %>%  filter( CountryName %in% c("Australia","India", "United States")) #filtering the birth rate data to only consist Australia, India and USA
Births <- Births %>% gather(Year, Birth_Rate, '1960':'2017') #creating a new column 'Year', and gathering the year columns under it
Births <- Births %>% select(CountryName, CountryCode, Year, Birth_Rate) #selecting the required columns I wish to use in this assignment
head(Births)
Deaths <- Deaths %>%  filter( CountryName %in% c("Australia","India", "United States")) #filtering the death rate data to only consist Australia, India and USA
Deaths <- Deaths %>% gather(Year, Death_Rate, '1960':'2017') #creating a new column 'Year', and gathering the year columns under it
Deaths <- Deaths %>% select(CountryName, CountryCode, Year, Death_Rate) #selecting the required columns I wish to use in this assignment
head(Deaths)
Data <- Births %>% left_join(select(Deaths,CountryName, Year, Death_Rate), by= c ("CountryName", "Year")) #joining the death rate data with the birth rate data
head(Data)

Understand

str(Data) #checking the structure and attributes of the merged data set
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   174 obs. of  5 variables:
 $ CountryName: chr  "Australia" "India" "United States" "Australia" ...
 $ CountryCode: chr  "AUS" "IND" "USA" "AUS" ...
 $ Year       : chr  "1960" "1960" "1960" "1961" ...
 $ Birth_Rate : chr  "22.4" "42.1" "23.7" "22.9" ...
 $ Death_Rate : chr  "8.6" "22.422" "9.5" "8.5" ...
Data$Year <- as.numeric(Data$Year) #converting Year from character to numeric value
class(Data$Year) #checking class of Year is numeric now
[1] "numeric"
Data$Birth_Rate <- as.numeric(Data$Birth_Rate) #converting Birth_Rate from character to numeric value
class(Data$Birth_Rate) #checking class of Birth_Rate is numeric now
[1] "numeric"
Data$Death_Rate <- as.numeric(Data$Death_Rate) #converting Death_Rate from character to numeric value
class(Data$Death_Rate) #checking class of Death_Rate is numeric now
[1] "numeric"
Data$CountryCode <- Data$CountryCode %>% factor(levels= c("AUS", "IND", "USA"), labels =c("AUS", "IND", "USA"), ordered = TRUE) #converting Countrycode from charatcer to factor while ordering the labels in the column
class(Data$CountryCode)
[1] "ordered" "factor" 
str(Data) #checking the structure and attributes of the updated final data set
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   174 obs. of  5 variables:
 $ CountryName: chr  "Australia" "India" "United States" "Australia" ...
 $ CountryCode: Ord.factor w/ 3 levels "AUS"<"IND"<"USA": 1 2 3 1 2 3 1 2 3 1 ...
 $ Year       : num  1960 1960 1960 1961 1961 ...
 $ Birth_Rate : num  22.4 42.1 23.7 22.9 41.9 ...
 $ Death_Rate : num  8.6 22.4 9.5 8.5 21.9 ...

Tidy & Manipulate Data I

#Prior to merging the Births and Deaths data, I had already structured the data in tidy format which requires each variable in its own column, each observation in its own row and finally each value in its own cell. This can be seen below.
Data

Tidy & Manipulate Data II

#Looking at the Data table above we can see the birth rate as well as the death rate, as a whole we can see that births seem higher than deaths, which shows a increase in population year on year. To be able to visibaly see this I have created a new column using mutate for growth as below
Data <- mutate(Data, Growth = Data$Birth_Rate - Data$Death_Rate)
head(Data)

Scan I

colSums(is.na(Data)) #this is showing the total number of na's per column of the data table
CountryName CountryCode        Year  Birth_Rate  Death_Rate      Growth 
          0           0           0           3           3           3 
#location of na's
head(which(is.na(Data)))
[1] 694 695 696 868 869 870
#checking for inconsistencies in all columns
sum(is.nan(Data$CountryName)) 
[1] 0
sum(is.nan(Data$CountryCode))
[1] 0
sum(is.nan(Data$Year))
[1] 0
sum(is.nan(Data$Death_Rate))
[1] 0
sum(is.nan(Data$Birth_Rate))
[1] 0
sum(is.nan(Data$Growth))
[1] 0
#count for infinite value in all columns
sum(is.infinite(Data$CountryName)) 
[1] 0
sum(is.infinite(Data$CountryCode))
[1] 0
sum(is.infinite(Data$Year))
[1] 0
sum(is.infinite(Data$Death_Rate))
[1] 0
sum(is.infinite(Data$Birth_Rate))
[1] 0
sum(is.infinite(Data$Growth))
[1] 0
#replacing all na's with column mean
Data$Birth_Rate[is.na(Data$Birth_Rate)] <- round(mean(Data$Birth_Rate, na.rm = TRUE))
Data$Death_Rate[is.na(Data$Death_Rate)] <- round(mean(Data$Death_Rate, na.rm = TRUE))
Data$Growth[is.na(Data$Growth)] <- round(mean(Data$Growth, na.rm = TRUE))
colSums(is.na(Data)) #after replacing na's with mean of column, just checking to ensure no na's left in data
CountryName CountryCode        Year  Birth_Rate  Death_Rate      Growth 
          0           0           0           0           0           0 

Scan II

Data$Birth_Rate %>%  boxplot(main="BoxPlot - Birth Rate", ylab="Birth_Rate", col = "grey")  #boxplot to show where the outliers sit within the Birth_Rate data

Data$Death_Rate %>%  boxplot(main="BoxPlot - Death Rate", ylab="Death_Rate", col = "grey")  #boxplot to show where the outliers sit within the Death_Rate data

Data$Growth %>%  boxplot(main="BoxPlot - Growth", ylab="Growth", col = "grey")  #boxplot to show where the outliers sit within the Growth data

summary(Data$Birth_Rate) #summary of Birth_Rate column to ensure no errors in data
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  12.30   14.53   16.95   21.09   24.99   42.10 
summary(Data$Death_Rate) #summary of Death_Rate column to ensure no errors in data
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   6.40    7.50    8.60    9.52    9.50   22.42 
summary(Data$Growth) #summary of Growth column to ensure no errors in data
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   3.96    6.75    8.40   11.59   16.71   22.82 
z.scores.b <- Data$Birth_Rate %>%  scores(type = "z")
z.score.b %>% summary() #z score summary result for Birth_Rate column
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-1.0025 -0.7489 -0.4724  0.0000  0.4445  2.3947 
z.scores.d <- Data$Death_Rate %>%  scores(type = "z")
z.scores.d %>% summary() #z score summary result for Death_Rate column
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-0.929066 -0.601483 -0.273900  0.000000 -0.005877  3.842331 
z.scores.g <- Data$Growth %>%  scores(type = "z")
z.scores.g %>% summary() #z score summary result for Growth column
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-1.2640 -0.8019 -0.5286  0.0000  0.8471  1.8597 
Data$Birth_Rate[ which( abs(z.scores.b) >3 )] #locating outliers in column Birth_Rate
numeric(0)
Data$Death_Rate[ which( abs(z.scores.d) >3 )] #locating outliers in column Death_Rate
[1] 22.422 21.876 21.335 20.798 20.265 19.737
Data$Growth[ which( abs(z.scores.g) >3 )] #locating outliers for Growth column
numeric(0)
summary(Data$Death_Rate)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  6.400   7.500   8.600   9.121   9.500  19.215 

Transform

hist(Data$Death_Rate, main = "Death Rate Histogram") 

#histogram to show distribution of death rate without any manipulation. We can see the histogram is skewed towwrds the left
Transformed_Death_Rate <- sqrt(Data$Death_Rate)
hist(Transformed_Death_Rate, main = "Transformed Death Rate Histogram") 

#used sqare root of death rate  to get more even distridution on the histogram. Still not symmetrical due to the number of outliers within the data



LS0tDQp0aXRsZTogIk1BVEgyMzQ5IFNlbWVzdGVyIDIsIDIwMTgiDQphdXRob3I6ICJLYW1hbHByZWV0IEtoYW5ndXJhIFMzNjg4MTA4Ig0Kc3VidGl0bGU6IEFzc2lnbm1lbnQgMw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCiMjIFJlcXVpcmVkIHBhY2thZ2VzIA0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoSG1pc2MpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShvdXRsaWVycykNCmBgYA0KDQoNCiMjIEV4ZWN1dGl2ZSBTdW1tYXJ5IA0KDQpEdXJpbmcgdGhpcyBjb3Vyc2Ugd2UgaGF2ZSBsZWFybnQgdGhhdCAnRGF0YSBQcmVwcm9jZXNzaW5nJyBpcyBhIHByb2Nlc3MgcmVxdWlyZWQgdG8gcHJlcGFyZSBhbGwgZm9ybXMgb2YgdW50aWR5IGRhdGEgZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzLg0KT25jZSBJIGZvdW5kIG15IGRhdGEgZm9yIHRoaXMgYXNzaWdubWVudCwgSSBiZWdhbiBwcmVwcm9lc3NpbmcgbXkgZGF0YS4gVGhlIHN0ZXBzIEkgdG9vayB0aHJvdWdob3V0IHRoaXMgYXNzaWdubWVudCB3ZXJlOiANCjEuIEdvdCBteSB0d28gZGF0YSBzZXRzIChGaXJzdCBkYXRhIHNldCBvbiBCaXJ0aCBSYXRlcyBmcm9tIDE5NjAtMjAxNyBpbiB2YXJpb3VzIGNvdW50cmllcywgYW5kIHRoZSBzZWNvbmQgc2V0IG9mIGRhdGEgb24gRGVhdGggUmF0ZXMgZnJvbSAxOTYwLTIwMTcgaW4gdmFyaW91cyBjb3VudHJpZXMpDQoyLiBVbmRlcnN0YW5kIGJvdGggZGF0YSBzZXRzIGFuZCB3aGF0J3MgY29uc2lzdGVkIHdpdGhpbiBpdCAod2hlcmUgSSBkZWNpZGVkIHRvIG9ubHkgbG9vayBhdCBkYXRhIGZyb20gYm90aCB0YWJsZXMgZm9yIG9ubHkgdGhyZWUgY291bnRyaWVzLCB3aGljaCB3ZXJlIEluZGlhLCBBdXN0cmFsaWEgYW5kIFVuaXRlZCBTdGF0ZXMpDQozLiBUaWR5IGFuZCBtYW5pcHVsYXRlIHRoZSBkYXRhICh3aGVyZSBJIHRpZGllZCB0aGUgZGF0YSB0byBhIGZvcm1hdCB3aGVyZSBJIHdhcyBhYmxlIHRvIG1lcmdlIGJvdGggZGF0YSBzZXRzIGludG8gb25lKQ0KNC4gU2NhbiB0aGUgZGF0YSBmb3IgYW55IGVycm9ycyBvciBpbmNvbnNpc3RlbmNpZXMgKHdoZXJlIEkgcmVtb3ZlZCBhbGwgbmEncyB3aXRoaW4gdGhlIGRhdGEgc2V0cyBhbmQgcmVwbGFjZWQgdGhlbSB3aXRoIHRoZSBtZWFuIG9mIHRoZSBjb2x1bW5zIHdoZXJlIHRoZSBkYXRhIHdhcyBtaXNzaW5nKQ0KNS4gVHJhbnNmb3JtZWQgdGhlIGRhdGEgdG8gZ2V0IGFub3RoZXIgdmlldyBvZiB3aGF0IGl0IHNob3dzICh3aGVyZSBJIHRyYW5zZm9ybWVkIHRoZSBkZWF0aCByYXRlIGRhdGEgYXMgdGhpcyBkYXRhIHNldCBoYWQgdGhlIG1vc3Qgb3V0bGllcnMpDQoNCg0KDQojIyBEYXRhIA0KDQpGaXJzdCBzZXQgb2YgZGF0YSBpcyBiYXNlZCBvbiBiaXJ0aCByYXRlcyB3aXRoaW4gdmFyaW91cyBjb3VudHJpZXMgZnJvbSAxOTYwIHRvIDIwMTcNCg0KQmlydGggUmF0ZSBEYXRhIFNvdXJjZTogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DQlJULklODQpEYXRhIGZpZWxkcyB3aXRoaW4gdGhpZSB0YWJsZSBhcmU6IA0KMS4gQ291bnRyeU5hbWUgKG5hbWUgb2YgY291bnRyeSBiZWluZyByZXByZXNlbnRlZCBpbiB0aGUgZGF0YSkNCjIuIENvdW50cnlDb2RlIChjb25zaXN0aW5nIHRocmVlIGxldHRlciBjb2RlcyByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkpDQozLiBJbmRpY2F0b3JOYW1lIChpbmRpY2F0aW5nIHRoZSBkYXRhIHZhbHVlIGJlaW5nIGFuYWx5c2VkIGluIHRoaXMgZGF0YSwgd2hpY2ggaXMgdGhlIEJpcnRoIHJhdGUsIGNydWRlIChwZXIgMSwwMDAgcGVvcGxlKSkNCjQuIEluZGljYXRvckNvZGUgKHRoZSBjb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgYmlydGggcmF0ZSBpbmRpY2F0b3IpDQo1LiBUaGUgcmVtYWluZGVyIGNvbHVtbnMgYXJlIHRoZSB5ZWFycyBmcm9tIDE5NjAgdG8gMjAxNw0KDQpTZWNvbmQgc2V0IG9mIGRhdGEgaXMgYmFzZWQgb24gZGVhdGggcmF0ZXMgd2l0aGluIHZhcmlvdXMgY291bnRyaWVzIGZyb20gMTk2MCB0byAyMDE3DQoNCkRlYXRoIFJhdGUgZGF0YSBzb3VyY2U6IGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5EWU4uQ0RSVC5JTg0KRGF0YSBmaWVsZHMgd2l0aGluIHRoaWUgdGFibGUgYXJlOiANCjEuIENvdW50cnlOYW1lIChuYW1lIG9mIGNvdW50cnkgYmVpbmcgcmVwcmVzZW50ZWQgaW4gdGhlIGRhdGEpDQoyLiBDb3VudHJ5Q29kZSAoY29uc2lzdGluZyB0aHJlZSBsZXR0ZXIgY29kZXMgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5KQ0KMy4gSW5kaWNhdG9yTmFtZSAoaW5kaWNhdGluZyB0aGUgZGF0YSB2YWx1ZSBiZWluZyBhbmFseXNlZCBpbiB0aGlzIGRhdGEsIHdoaWNoIGlzIHRoZSBEZWF0aCByYXRlLCBjcnVkZSAocGVyIDEsMDAwIHBlb3BsZSkpDQo0LiBJbmRpY2F0b3JDb2RlICh0aGUgY29kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRlYXRoIHJhdGUgaW5kaWNhdG9yKQ0KNS4gVGhlIHJlbWFpbmRlciBjb2x1bW5zIGFyZSB0aGUgeWVhcnMgZnJvbSAxOTYwIHRvIDIwMTcNCg0KDQpgYGB7cn0NCg0KQmlydGhzIDwtIHJlYWRfY3N2KCJCaXJ0aCBSYXRlLmNzdiIpICNsb2FkaW5nIHRoZSBCaXJ0aCBSYXRlIGRhdGEgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpEZWF0aHMgPC0gcmVhZF9jc3YoIkRlYXRoIFJhdGUuY3N2IikgI2xvYWRpbmcgdGhlIERlYXRoIFJhdGUgZGF0YSBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeQ0KIA0KYGBgDQpgYGB7cn0NCg0KaGVhZChCaXJ0aHMpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpoZWFkKERlYXRocykNCg0KYGBgDQoNCmBgYHtyfQ0KDQpCaXJ0aHMgPC0gQmlydGhzICU+JSAgZmlsdGVyKCBDb3VudHJ5TmFtZSAlaW4lIGMoIkF1c3RyYWxpYSIsIkluZGlhIiwgIlVuaXRlZCBTdGF0ZXMiKSkgI2ZpbHRlcmluZyB0aGUgYmlydGggcmF0ZSBkYXRhIHRvIG9ubHkgY29uc2lzdCBBdXN0cmFsaWEsIEluZGlhIGFuZCBVU0ENCkJpcnRocyA8LSBCaXJ0aHMgJT4lIGdhdGhlcihZZWFyLCBCaXJ0aF9SYXRlLCAnMTk2MCc6JzIwMTcnKSAjY3JlYXRpbmcgYSBuZXcgY29sdW1uICdZZWFyJywgYW5kIGdhdGhlcmluZyB0aGUgeWVhciBjb2x1bW5zIHVuZGVyIGl0DQpCaXJ0aHMgPC0gQmlydGhzICU+JSBzZWxlY3QoQ291bnRyeU5hbWUsIENvdW50cnlDb2RlLCBZZWFyLCBCaXJ0aF9SYXRlKSAjc2VsZWN0aW5nIHRoZSByZXF1aXJlZCBjb2x1bW5zIEkgd2lzaCB0byB1c2UgaW4gdGhpcyBhc3NpZ25tZW50DQoNCmhlYWQoQmlydGhzKQ0KDQpgYGANCg0KYGBge3J9DQoNCkRlYXRocyA8LSBEZWF0aHMgJT4lICBmaWx0ZXIoIENvdW50cnlOYW1lICVpbiUgYygiQXVzdHJhbGlhIiwiSW5kaWEiLCAiVW5pdGVkIFN0YXRlcyIpKSAjZmlsdGVyaW5nIHRoZSBkZWF0aCByYXRlIGRhdGEgdG8gb25seSBjb25zaXN0IEF1c3RyYWxpYSwgSW5kaWEgYW5kIFVTQQ0KRGVhdGhzIDwtIERlYXRocyAlPiUgZ2F0aGVyKFllYXIsIERlYXRoX1JhdGUsICcxOTYwJzonMjAxNycpICNjcmVhdGluZyBhIG5ldyBjb2x1bW4gJ1llYXInLCBhbmQgZ2F0aGVyaW5nIHRoZSB5ZWFyIGNvbHVtbnMgdW5kZXIgaXQNCkRlYXRocyA8LSBEZWF0aHMgJT4lIHNlbGVjdChDb3VudHJ5TmFtZSwgQ291bnRyeUNvZGUsIFllYXIsIERlYXRoX1JhdGUpICNzZWxlY3RpbmcgdGhlIHJlcXVpcmVkIGNvbHVtbnMgSSB3aXNoIHRvIHVzZSBpbiB0aGlzIGFzc2lnbm1lbnQNCg0KaGVhZChEZWF0aHMpDQoNCmBgYA0KDQpgYGB7cn0NCkRhdGEgPC0gQmlydGhzICU+JSBsZWZ0X2pvaW4oc2VsZWN0KERlYXRocyxDb3VudHJ5TmFtZSwgWWVhciwgRGVhdGhfUmF0ZSksIGJ5PSBjICgiQ291bnRyeU5hbWUiLCAiWWVhciIpKSAjam9pbmluZyB0aGUgZGVhdGggcmF0ZSBkYXRhIHdpdGggdGhlIGJpcnRoIHJhdGUgZGF0YQ0KaGVhZChEYXRhKQ0KYGBgDQoNCiMjIFVuZGVyc3RhbmQgDQoNCg0KYGBge3J9DQoNCnN0cihEYXRhKSAjY2hlY2tpbmcgdGhlIHN0cnVjdHVyZSBhbmQgYXR0cmlidXRlcyBvZiB0aGUgbWVyZ2VkIGRhdGEgc2V0DQoNCmBgYA0KDQpgYGB7cn0NCg0KRGF0YSRZZWFyIDwtIGFzLm51bWVyaWMoRGF0YSRZZWFyKSAjY29udmVydGluZyBZZWFyIGZyb20gY2hhcmFjdGVyIHRvIG51bWVyaWMgdmFsdWUNCmNsYXNzKERhdGEkWWVhcikgI2NoZWNraW5nIGNsYXNzIG9mIFllYXIgaXMgbnVtZXJpYyBub3cNCmBgYA0KDQpgYGB7cn0NCg0KRGF0YSRCaXJ0aF9SYXRlIDwtIGFzLm51bWVyaWMoRGF0YSRCaXJ0aF9SYXRlKSAjY29udmVydGluZyBCaXJ0aF9SYXRlIGZyb20gY2hhcmFjdGVyIHRvIG51bWVyaWMgdmFsdWUNCmNsYXNzKERhdGEkQmlydGhfUmF0ZSkgI2NoZWNraW5nIGNsYXNzIG9mIEJpcnRoX1JhdGUgaXMgbnVtZXJpYyBub3cNCg0KYGBgDQoNCg0KYGBge3J9DQoNCkRhdGEkRGVhdGhfUmF0ZSA8LSBhcy5udW1lcmljKERhdGEkRGVhdGhfUmF0ZSkgI2NvbnZlcnRpbmcgRGVhdGhfUmF0ZSBmcm9tIGNoYXJhY3RlciB0byBudW1lcmljIHZhbHVlDQpjbGFzcyhEYXRhJERlYXRoX1JhdGUpICNjaGVja2luZyBjbGFzcyBvZiBEZWF0aF9SYXRlIGlzIG51bWVyaWMgbm93DQoNCmBgYA0KDQpgYGB7cn0NCg0KRGF0YSRDb3VudHJ5Q29kZSA8LSBEYXRhJENvdW50cnlDb2RlICU+JSBmYWN0b3IobGV2ZWxzPSBjKCJBVVMiLCAiSU5EIiwgIlVTQSIpLCBsYWJlbHMgPWMoIkFVUyIsICJJTkQiLCAiVVNBIiksIG9yZGVyZWQgPSBUUlVFKSAjY29udmVydGluZyBDb3VudHJ5Y29kZSBmcm9tIGNoYXJhdGNlciB0byBmYWN0b3Igd2hpbGUgb3JkZXJpbmcgdGhlIGxhYmVscyBpbiB0aGUgY29sdW1uDQpjbGFzcyhEYXRhJENvdW50cnlDb2RlKQ0KYGBgDQoNCg0KYGBge3J9DQoNCnN0cihEYXRhKSAjY2hlY2tpbmcgdGhlIHN0cnVjdHVyZSBhbmQgYXR0cmlidXRlcyBvZiB0aGUgdXBkYXRlZCBmaW5hbCBkYXRhIHNldA0KDQpgYGANCg0KDQojIwlUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIEkgDQoNCg0KYGBge3J9DQojUHJpb3IgdG8gbWVyZ2luZyB0aGUgQmlydGhzIGFuZCBEZWF0aHMgZGF0YSwgSSBoYWQgYWxyZWFkeSBzdHJ1Y3R1cmVkIHRoZSBkYXRhIGluIHRpZHkgZm9ybWF0IHdoaWNoIHJlcXVpcmVzIGVhY2ggdmFyaWFibGUgaW4gaXRzIG93biBjb2x1bW4sIGVhY2ggb2JzZXJ2YXRpb24gaW4gaXRzIG93biByb3cgYW5kIGZpbmFsbHkgZWFjaCB2YWx1ZSBpbiBpdHMgb3duIGNlbGwuIFRoaXMgY2FuIGJlIHNlZW4gYmVsb3cuDQoNCkRhdGENCg0KYGBgDQojIwlUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIElJIA0KDQoNCmBgYHtyfQ0KDQojTG9va2luZyBhdCB0aGUgRGF0YSB0YWJsZSBhYm92ZSB3ZSBjYW4gc2VlIHRoZSBiaXJ0aCByYXRlIGFzIHdlbGwgYXMgdGhlIGRlYXRoIHJhdGUsIGFzIGEgd2hvbGUgd2UgY2FuIHNlZSB0aGF0IGJpcnRocyBzZWVtIGhpZ2hlciB0aGFuIGRlYXRocywgd2hpY2ggc2hvd3MgYSBpbmNyZWFzZSBpbiBwb3B1bGF0aW9uIHllYXIgb24geWVhci4gVG8gYmUgYWJsZSB0byB2aXNpYmFseSBzZWUgdGhpcyBJIGhhdmUgY3JlYXRlZCBhIG5ldyBjb2x1bW4gdXNpbmcgbXV0YXRlIGZvciBncm93dGggYXMgYmVsb3cNCg0KRGF0YSA8LSBtdXRhdGUoRGF0YSwgR3Jvd3RoID0gRGF0YSRCaXJ0aF9SYXRlIC0gRGF0YSREZWF0aF9SYXRlKQ0KaGVhZChEYXRhKQ0KDQpgYGANCg0KDQojIwlTY2FuIEkgDQoNCg0KYGBge3J9DQoNCmNvbFN1bXMoaXMubmEoRGF0YSkpICN0aGlzIGlzIHNob3dpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBuYSdzIHBlciBjb2x1bW4gb2YgdGhlIGRhdGEgdGFibGUNCg0KYGBgDQoNCg0KYGBge3J9DQojbG9jYXRpb24gb2YgbmEncw0KaGVhZCh3aGljaChpcy5uYShEYXRhKSkpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI2NoZWNraW5nIGZvciBpbmNvbnNpc3RlbmNpZXMgaW4gYWxsIGNvbHVtbnMNCnN1bShpcy5uYW4oRGF0YSRDb3VudHJ5TmFtZSkpIA0Kc3VtKGlzLm5hbihEYXRhJENvdW50cnlDb2RlKSkNCnN1bShpcy5uYW4oRGF0YSRZZWFyKSkNCnN1bShpcy5uYW4oRGF0YSREZWF0aF9SYXRlKSkNCnN1bShpcy5uYW4oRGF0YSRCaXJ0aF9SYXRlKSkNCnN1bShpcy5uYW4oRGF0YSRHcm93dGgpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNjb3VudCBmb3IgaW5maW5pdGUgdmFsdWUgaW4gYWxsIGNvbHVtbnMNCnN1bShpcy5pbmZpbml0ZShEYXRhJENvdW50cnlOYW1lKSkgDQpzdW0oaXMuaW5maW5pdGUoRGF0YSRDb3VudHJ5Q29kZSkpDQpzdW0oaXMuaW5maW5pdGUoRGF0YSRZZWFyKSkNCnN1bShpcy5pbmZpbml0ZShEYXRhJERlYXRoX1JhdGUpKQ0Kc3VtKGlzLmluZmluaXRlKERhdGEkQmlydGhfUmF0ZSkpDQpzdW0oaXMuaW5maW5pdGUoRGF0YSRHcm93dGgpKQ0KDQpgYGANCg0KYGBge3J9DQoNCiNyZXBsYWNpbmcgYWxsIG5hJ3Mgd2l0aCBjb2x1bW4gbWVhbg0KDQpEYXRhJEJpcnRoX1JhdGVbaXMubmEoRGF0YSRCaXJ0aF9SYXRlKV0gPC0gcm91bmQobWVhbihEYXRhJEJpcnRoX1JhdGUsIG5hLnJtID0gVFJVRSkpDQoNCkRhdGEkRGVhdGhfUmF0ZVtpcy5uYShEYXRhJERlYXRoX1JhdGUpXSA8LSByb3VuZChtZWFuKERhdGEkRGVhdGhfUmF0ZSwgbmEucm0gPSBUUlVFKSkNCg0KRGF0YSRHcm93dGhbaXMubmEoRGF0YSRHcm93dGgpXSA8LSByb3VuZChtZWFuKERhdGEkR3Jvd3RoLCBuYS5ybSA9IFRSVUUpKQ0KDQpjb2xTdW1zKGlzLm5hKERhdGEpKSAjYWZ0ZXIgcmVwbGFjaW5nIG5hJ3Mgd2l0aCBtZWFuIG9mIGNvbHVtbiwganVzdCBjaGVja2luZyB0byBlbnN1cmUgbm8gbmEncyBsZWZ0IGluIGRhdGENCmBgYA0KDQojIwlTY2FuIElJDQoNCg0KYGBge3J9DQoNCkRhdGEkQmlydGhfUmF0ZSAlPiUgIGJveHBsb3QobWFpbj0iQm94UGxvdCAtIEJpcnRoIFJhdGUiLCB5bGFiPSJCaXJ0aF9SYXRlIiwgY29sID0gImdyZXkiKSAgI2JveHBsb3QgdG8gc2hvdyB3aGVyZSB0aGUgb3V0bGllcnMgc2l0IHdpdGhpbiB0aGUgQmlydGhfUmF0ZSBkYXRhDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpEYXRhJERlYXRoX1JhdGUgJT4lICBib3hwbG90KG1haW49IkJveFBsb3QgLSBEZWF0aCBSYXRlIiwgeWxhYj0iRGVhdGhfUmF0ZSIsIGNvbCA9ICJncmV5IikgICNib3hwbG90IHRvIHNob3cgd2hlcmUgdGhlIG91dGxpZXJzIHNpdCB3aXRoaW4gdGhlIERlYXRoX1JhdGUgZGF0YQ0KDQpgYGANCg0KYGBge3J9DQoNCkRhdGEkR3Jvd3RoICU+JSAgYm94cGxvdChtYWluPSJCb3hQbG90IC0gR3Jvd3RoIiwgeWxhYj0iR3Jvd3RoIiwgY29sID0gImdyZXkiKSAgI2JveHBsb3QgdG8gc2hvdyB3aGVyZSB0aGUgb3V0bGllcnMgc2l0IHdpdGhpbiB0aGUgR3Jvd3RoIGRhdGENCg0KYGBgDQoNCg0KYGBge3J9DQoNCnN1bW1hcnkoRGF0YSRCaXJ0aF9SYXRlKSAjc3VtbWFyeSBvZiBCaXJ0aF9SYXRlIGNvbHVtbiB0byBlbnN1cmUgbm8gZXJyb3JzIGluIGRhdGENCg0KYGBgDQoNCmBgYHtyfQ0KDQpzdW1tYXJ5KERhdGEkRGVhdGhfUmF0ZSkgI3N1bW1hcnkgb2YgRGVhdGhfUmF0ZSBjb2x1bW4gdG8gZW5zdXJlIG5vIGVycm9ycyBpbiBkYXRhDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpzdW1tYXJ5KERhdGEkR3Jvd3RoKSAjc3VtbWFyeSBvZiBHcm93dGggY29sdW1uIHRvIGVuc3VyZSBubyBlcnJvcnMgaW4gZGF0YQ0KDQpgYGANCg0KYGBge3J9DQoNCnouc2NvcmVzLmIgPC0gRGF0YSRCaXJ0aF9SYXRlICU+JSAgc2NvcmVzKHR5cGUgPSAieiIpDQp6LnNjb3JlLmIgJT4lIHN1bW1hcnkoKSAjeiBzY29yZSBzdW1tYXJ5IHJlc3VsdCBmb3IgQmlydGhfUmF0ZSBjb2x1bW4NCg0KYGBgDQoNCg0KYGBge3J9DQoNCnouc2NvcmVzLmQgPC0gRGF0YSREZWF0aF9SYXRlICU+JSAgc2NvcmVzKHR5cGUgPSAieiIpDQp6LnNjb3Jlcy5kICU+JSBzdW1tYXJ5KCkgI3ogc2NvcmUgc3VtbWFyeSByZXN1bHQgZm9yIERlYXRoX1JhdGUgY29sdW1uDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQp6LnNjb3Jlcy5nIDwtIERhdGEkR3Jvd3RoICU+JSAgc2NvcmVzKHR5cGUgPSAieiIpDQp6LnNjb3Jlcy5nICU+JSBzdW1tYXJ5KCkgI3ogc2NvcmUgc3VtbWFyeSByZXN1bHQgZm9yIEdyb3d0aCBjb2x1bW4NCg0KYGBgDQoNCmBgYHtyfQ0KDQpEYXRhJEJpcnRoX1JhdGVbIHdoaWNoKCBhYnMoei5zY29yZXMuYikgPjMgKV0gI2xvY2F0aW5nIG91dGxpZXJzIGluIGNvbHVtbiBCaXJ0aF9SYXRlDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpEYXRhJERlYXRoX1JhdGVbIHdoaWNoKCBhYnMoei5zY29yZXMuZCkgPjMgKV0gI2xvY2F0aW5nIG91dGxpZXJzIGluIGNvbHVtbiBEZWF0aF9SYXRlDQoNCmBgYA0KDQpgYGB7cn0NCg0KRGF0YSRHcm93dGhbIHdoaWNoKCBhYnMoei5zY29yZXMuZykgPjMgKV0gI2xvY2F0aW5nIG91dGxpZXJzIGZvciBHcm93dGggY29sdW1uDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQojZnJvbSBhYm92ZSB3ZSBjYW4gc2VlIHRoYXQgdGhlIERlYXRoX1JhdGUgY29sdW1uIG5lZWRzIHRvIGhhdmUgdGhlIG91dGxpdWVycyBpbXB1dGVkLg0KDQpEYXRhJERlYXRoX1JhdGVbIHdoaWNoKCBhYnMoei5zY29yZXMuZCkgPjMgKV0gPC0gbWVhbihEYXRhJERlYXRoX1JhdGUsIG5hLnJtID0gVFJVRSkgI2ltcHV0aW5nIG91dGxpZXJzIGluIHRoZSBEZWF0aF9SYXRlIGNvbHVtbg0KDQpzdW1tYXJ5KERhdGEkRGVhdGhfUmF0ZSkNCg0KYGBgDQoNCg0KIyMJVHJhbnNmb3JtIA0KDQoNCmBgYHtyfQ0KaGlzdChEYXRhJERlYXRoX1JhdGUsIG1haW4gPSAiRGVhdGggUmF0ZSBIaXN0b2dyYW0iKSANCg0KI2hpc3RvZ3JhbSB0byBzaG93IGRpc3RyaWJ1dGlvbiBvZiBkZWF0aCByYXRlIHdpdGhvdXQgYW55IG1hbmlwdWxhdGlvbi4gV2UgY2FuIHNlZSB0aGUgaGlzdG9ncmFtIGlzIHNrZXdlZCB0b3dhcmRzIHRoZSBsZWZ0DQpgYGANCg0KDQpgYGB7cn0NCg0KVHJhbnNmb3JtZWRfRGVhdGhfUmF0ZSA8LSBzcXJ0KERhdGEkRGVhdGhfUmF0ZSkNCg0KaGlzdChUcmFuc2Zvcm1lZF9EZWF0aF9SYXRlLCBtYWluID0gIlRyYW5zZm9ybWVkIERlYXRoIFJhdGUgSGlzdG9ncmFtIikgDQoNCiN1c2VkIHNxdWFyZSByb290IG9mIGRlYXRoIHJhdGUgIHRvIGdldCBtb3JlIGV2ZW4gZGlzdHJpZHV0aW9uIG9uIHRoZSBoaXN0b2dyYW0uIFNvIGNoYW5naW5nIGl0IGZyb20gYmVpbmcgbGVmdCBza2V3d2VkIHRvIG1vcmUgc3ltbWV0cmljYWwuICBTdGlsbCBub3QgZnVsbHkgc3ltbWV0cmljYWwgZHVlIHRvIHRoZSBkYXRhLg0KDQpgYGANCg0KPGJyPg0KPGJyPg0K