Introduction

This is our first lab when we are considering 2 dimensions and instead of calculating univariate statistics by groups (or factors) of other variable - we will measure their common relationships based on co-variance and correlation coefficients.

*Please be very careful when choosing the measure of correlation! In case of different measurument scales we have to recode one of the variables into weaker scale.

It would be nice to add some additional plots in the background. Feel free to add your own sections and use external packages.

Data

This time we are going to use a typical credit scoring data with predefined “default” variables and personal demografic and income data. Please take a look closer at headers and descriptions of each variable.

Scatterplots

First let’s visualize our quantitative relationships using scatterplots.

## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: size.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

## [1] 0.574346
##    estimate      p.value statistic   n gp  Method
## 1 0.3194263 4.805085e-18  8.899323 700  1 pearson
## [1] 0.1577567

Exercise 1. Contingency analysis.

Do you believe in the Afterlife? https://nationalpost.com/news/canada/millennials-do-you-believe-in-life-after-life A survey was conducted and a random sample of 1091 questionnaires is given in the form of the following contingency table:

##         Believe
## Gender   Yes  No
##   Female 435 375
##   Male   147 134

Our task is to check if there is a significant relationship between the belief in the afterlife and gender. We can perform this procedure with the simple chi-square statistics and chosen qualitative correlation coefficient (two-way 2x2 table).

## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  dane
## X-squared = 0.11103, df = 1, p-value = 0.739
##         Believe
## Gender         Yes        No
##   Female 0.3987168 0.3437214
##   Male   0.1347388 0.1228231

As you can see we can calculate our chi-square statistic really quickly for two-way tables or larger. Now we can standardize this contingency measure to see if the relationship is significant.

## [1] 0.01218871

Conclusion: there does not seem to be any significant correlation between gender and believing in afterlife

Exercise 2. Contingency analysis for the ‘Titanic’ data.

Let’s consider the titanic dataset which contains a complete list of passengers and crew members on the RMS Titanic. It includes a variable indicating whether a person did survive the sinking of the RMS Titanic on April 15, 1912. A data frame contains 2456 observations on 14 variables.

The website http://www.encyclopedia-titanica.org/ offers detailed information about passengers and crew members on the RMS Titanic. According to the website 1317 passengers and 890 crew member were aboard.

8 musicians and 9 employees of the shipyard company are listed as passengers, but travelled with a free ticket, which is why they have NA values in fare. In addition to that, fare is truely missing for a few regular passengers.

# Load the Titanic dataset
download.file("https://github.com/kflisikowski/ds/blob/master/titanic.csv?raw=true", destfile = "titanic.csv", mode = "wb")
titanic <- read.csv("titanic.csv", row.names = 1, sep = ";")

# Show the structure of the data
#str(titanic)

# Summary of the data
#summary(titanic)

# Identify missing values
sapply(titanic, function(x) sum(is.na(x)))
##                           Status                   Disembarked.at 
##                                0                                0 
##                     Home.Country                              Age 
##                                0                               32 
##                    Year.of.Birth               Crew.or.Passenger. 
##                               32                                0 
##                           Gender               Class...Department 
##                                0                                0 
##                         Embarked                              Job 
##                                0                                0 
##                      Job.details                    Ticket.Number 
##                                0                                0 
##                       Fare.Price                         Fare_GBP 
##                                0                             1136 
##                       Fare_today Profile.on.Encyclopedia.Titanica 
##                             1136                                0
# Removing rows with missing 'Fare_GBP' values for regular passengers
titanic_clean <- titanic[!is.na(titanic$Fare_GBP), ]

#removing the poeple who disembarked form the dataset
titanic_clean <- titanic_clean %>%
  filter(Disembarked.at == "Not Disembarked")

# Confirm the removal of rows with NA 'Fare_GBP' values
sapply(titanic_clean, function(x) sum(is.na(x)))
##                           Status                   Disembarked.at 
##                                0                                0 
##                     Home.Country                              Age 
##                                0                                4 
##                    Year.of.Birth               Crew.or.Passenger. 
##                                4                                0 
##                           Gender               Class...Department 
##                                0                                0 
##                         Embarked                              Job 
##                                0                                0 
##                      Job.details                    Ticket.Number 
##                                0                                0 
##                       Fare.Price                         Fare_GBP 
##                                0                                0 
##                       Fare_today Profile.on.Encyclopedia.Titanica 
##                                0                                0
# Create a contingency table for Survival and Passenger Class
table_survived_class <- table(titanic_clean$Status, titanic_clean$Class...Department)

# Perform chi-square test
chisq_test <- chisq.test(table_survived_class)

# Display the results
print(table_survived_class)
##           
##            1st Class 2nd Class 3rd Class
##   Survivor       200       119       179
##   Victim         117       152       524
print(chisq_test)
## 
##  Pearson's Chi-squared test
## 
## data:  table_survived_class
## X-squared = 134.68, df = 2, p-value < 2.2e-16
# Plotting the contingency table
mosaicplot(table_survived_class, main = "Survival by Passenger Class", shade = TRUE)

# Create a contingency table for Survival and Gender
table_survived_gender <- table(titanic_clean$Status, titanic_clean$Gender)

# Perform chi-square test
chisq_test_gender <- chisq.test(table_survived_gender)

# Display the results
print(table_survived_gender)
##           
##            Female Male
##   Survivor    339  159
##   Victim      127  666
print(chisq_test_gender)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_survived_gender
## X-squared = 357.12, df = 1, p-value < 2.2e-16
# Plotting the contingency table
mosaicplot(table_survived_gender, main = "Survival by Gender", shade = TRUE)

in both cases p-value is lower than 2.2e-16, observed differences in the tables are extremely unlikely to have occurred by random chance alone.

LS0tDQp0aXRsZTogJ0Rlc2NyaXB0aXZlIFN0YXRpc3RpY3MnDQpzdWJ0aXRsZTogJ0JpdmFyaWF0ZSBBbmFseXNpcycNCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCmF1dGhvcjogIkFubmEgUmFkb3N6LCBTenltb24gV2nFm25pZXdza2ksIEpha3ViIEt3aWF0a293c2tpIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgZm9udHNpemU6IDEwcHQNCiAgICB0b2M6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICBkZl9wcmludDogZGVmYXVsdA0KICAgIHRvY19kZXB0aDogNQ0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogNzINCi0tLQ0KDQpgYGB7ciBzZXR1cCwJbWVzc2FnZSA9IEZBTFNFLAl3YXJuaW5nID0gRkFMU0UsCWluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoSFNBVVIzKQ0KbGlicmFyeShoYXZlbikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShwcGNvcikgIyB0aGlzIHBhY2thZ2UgY29tcHV0ZXMgcGFydGlhbCBhbmQgc2VtaXBhcnRpYWwgY29ycmVsYXRpb25zLg0KbGlicmFyeShsdG0pICMgdGhpcyBwYWNrYWdlIGNvbXB1dGVzIHBvaW50LWJpc2VyaWFsIGNvcnJlbGF0aW9ucy4NCmxpYnJhcnkoZGV2dG9vbHMpIA0KI2luc3RhbGxfZ2l0aHViKCJtYXJraGVja21hbm4vcnlvdXJlYWR5IikgIyBwbGVhc2UgaW5zdGFsbCBwYWNrYWdlICJyeW91cmVhZHkiIGZyb20gZ2l0aHViISAodGhlbiAjIGl0KQ0KI2xpYnJhcnkocnlvdXJlYWR5KSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBub25saW5lYXIgImV0YSIgY29ycmVsYXRpb25zLg0KbGlicmFyeShHR2FsbHkpICMgdGhpcyBwYWNrYWdlIGNvbXB1dGVzIGNvcnJlbGF0aW9uIG1hdHJpeC4NCmxpYnJhcnkocHN5Y2gpICMgdGhpcyBwYWNrYWdlIGNvbXB1dGVzIHF1YWxpdGF0aXZlIGNvcnJlbGF0aW9ucy4NCmxpYnJhcnkoRGVzY1Rvb2xzKSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBxdWFsaXRhdGl2ZSBjb3JyZWxhdGlvbnMuDQpgYGANCg0KDQojIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyBpcyBvdXIgZmlyc3QgbGFiIHdoZW4gd2UgYXJlIGNvbnNpZGVyaW5nIDIgZGltZW5zaW9ucyBhbmQgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyB1bml2YXJpYXRlIHN0YXRpc3RpY3MgYnkgZ3JvdXBzIChvciBmYWN0b3JzKSBvZiBvdGhlciB2YXJpYWJsZSAtIHdlIHdpbGwgbWVhc3VyZSB0aGVpciBjb21tb24gcmVsYXRpb25zaGlwcyBiYXNlZCBvbiBjby12YXJpYW5jZSBhbmQgY29ycmVsYXRpb24gY29lZmZpY2llbnRzLiANCg0KKlBsZWFzZSBiZSB2ZXJ5IGNhcmVmdWwgd2hlbiBjaG9vc2luZyB0aGUgbWVhc3VyZSBvZiBjb3JyZWxhdGlvbiEgSW4gY2FzZSBvZiBkaWZmZXJlbnQgbWVhc3VydW1lbnQgc2NhbGVzIHdlIGhhdmUgdG8gcmVjb2RlIG9uZSBvZiB0aGUgdmFyaWFibGVzIGludG8gd2Vha2VyIHNjYWxlLg0KDQpJdCB3b3VsZCBiZSBuaWNlIHRvIGFkZCBzb21lIGFkZGl0aW9uYWwgcGxvdHMgaW4gdGhlIGJhY2tncm91bmQuIEZlZWwgZnJlZSB0byBhZGQgeW91ciBvd24gc2VjdGlvbnMgYW5kIHVzZSBleHRlcm5hbCBwYWNrYWdlcy4NCg0KIyMgRGF0YQ0KDQpUaGlzIHRpbWUgd2UgYXJlIGdvaW5nIHRvIHVzZSBhIHR5cGljYWwgY3JlZGl0IHNjb3JpbmcgZGF0YSB3aXRoIHByZWRlZmluZWQgImRlZmF1bHQiIHZhcmlhYmxlcyBhbmQgcGVyc29uYWwgZGVtb2dyYWZpYyBhbmQgaW5jb21lIGRhdGEuIFBsZWFzZSB0YWtlIGEgbG9vayBjbG9zZXIgYXQgaGVhZGVycyBhbmQgZGVzY3JpcHRpb25zIG9mIGVhY2ggdmFyaWFibGUuDQoNCmBgYHtyIGxvYWQtZGF0YSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly9naXRodWIuY29tL2tmbGlzaWtvd3NraS9kcy9ibG9iL21hc3Rlci9iYW5rX2RlZmF1bHRzLnNhdj9yYXc9dHJ1ZSIsIGRlc3RmaWxlID0iYmFua19kZWZhdWx0cy5zYXYiLG1vZGU9IndiIikNCmJhbmtfZGVmYXVsdHMgPC0gcmVhZF9zYXYoImJhbmtfZGVmYXVsdHMuc2F2IikNCmJhbms8LW5hLm9taXQoYmFua19kZWZhdWx0cykNCmJhbmskZGVmPC1hcy5mYWN0b3IoYmFuayRkZWZhdWx0KQ0KYmFuayRlZHVjPC1hcy5mYWN0b3IoYmFuayRlZCkNCmBgYA0KDQojIyBTY2F0dGVycGxvdHMNCg0KRmlyc3QgbGV0J3MgdmlzdWFsaXplIG91ciBxdWFudGl0YXRpdmUgcmVsYXRpb25zaGlwcyB1c2luZyBzY2F0dGVycGxvdHMuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQojIEJhc2ljIHNjYXR0ZXIgcGxvdA0KYXR0YWNoKGJhbmspDQpiYW5rJGxvZ2luY29tZSA8LSBsb2coaW5jb21lKQ0KZ2dwbG90KGJhbmssIGFlcyhhZ2UsIGxvZ2luY29tZSxzaXplPWVtcGxveSxjb2xvcj1kZWYpKSArDQogIGdlb21fcG9pbnQoKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pDQoNCiMgKHVzaW5nIGJhbmskIHNpbmNlIG9ubHkgbG9naW5jb21lIGRvZXNuJ3Qgc2VlbSB0byB3b3JrKQ0KY29yKGJhbmskbG9naW5jb21lLCBhZ2UpDQpwY29yLnRlc3QoYmFuayRsb2dpbmNvbWUsYWdlLGVtcGxveSkNCmNvcihiYW5rJGxvZ2luY29tZSxlZCxtZXRob2Q9ImtlbmRhbGwiKQ0KDQojIENoYW5nZSB0aGUgcG9pbnQgc2l6ZSwgYW5kIHNoYXBlDQoNCmdncGxvdChiYW5rLCBhZXMoWD1lZHVjLHk9aW5jb21lKSkrDQogIGdlb21fYm94cGxvdChhZXMoZ3JvdXA9ZWQpKSsNCiAgZmFjZXRfZ3JpZCh+ZGVmKQ0KDQoNCmBgYA0KDQojIyBFeGVyY2lzZSAxLiBDb250aW5nZW5jeSBhbmFseXNpcy4NCg0KRG8geW91IGJlbGlldmUgaW4gdGhlIEFmdGVybGlmZT8NCmh0dHBzOi8vbmF0aW9uYWxwb3N0LmNvbS9uZXdzL2NhbmFkYS9taWxsZW5uaWFscy1kby15b3UtYmVsaWV2ZS1pbi1saWZlLWFmdGVyLWxpZmUNCkEgc3VydmV5IHdhcyBjb25kdWN0ZWQgYW5kIGEgcmFuZG9tIHNhbXBsZSBvZiAxMDkxIHF1ZXN0aW9ubmFpcmVzIGlzIGdpdmVuIGluIHRoZSBmb3JtIG9mIHRoZSBmb2xsb3dpbmcgY29udGluZ2VuY3kgdGFibGU6DQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp4PWMoNDM1LDE0NywzNzUsMTM0KQ0KZGltKHgpPWMoMiwyKQ0KZGFuZTwtYXMudGFibGUoeCkNCmRpbW5hbWVzKGRhbmUpPWxpc3QoR2VuZGVyPWMoJ0ZlbWFsZScsJ01hbGUnKSxCZWxpZXZlPWMoJ1llcycsJ05vJykpDQpkYW5lDQpmb3VyZm9sZHBsb3QoZGFuZSkNCmBgYA0KDQpPdXIgdGFzayBpcyB0byBjaGVjayBpZiB0aGVyZSBpcyBhIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBiZWxpZWYgaW4gdGhlIGFmdGVybGlmZSBhbmQgZ2VuZGVyLiBXZSBjYW4gcGVyZm9ybSB0aGlzIHByb2NlZHVyZSB3aXRoIHRoZSBzaW1wbGUgY2hpLXNxdWFyZSBzdGF0aXN0aWNzIGFuZCBjaG9zZW4gcXVhbGl0YXRpdmUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgKHR3by13YXkgMngyIHRhYmxlKS4NCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnllczwtYyg0MzUsMTQ3KQ0Kbm88LWMoMzc1LDEzNCkNCiNjb2hlbi5rYXBwYShjYmluZCh5ZXMsbm8pKQ0KY2hpc3EudGVzdChkYW5lKQ0KcHJvcC50YWJsZShkYW5lKQ0KYGBgDQoNCkFzIHlvdSBjYW4gc2VlIHdlIGNhbiBjYWxjdWxhdGUgb3VyIGNoaS1zcXVhcmUgc3RhdGlzdGljIHJlYWxseSBxdWlja2x5IGZvciB0d28td2F5IHRhYmxlcyBvciBsYXJnZXIuIA0KTm93IHdlIGNhbiBzdGFuZGFyZGl6ZSB0aGlzIGNvbnRpbmdlbmN5IG1lYXN1cmUgdG8gc2VlIGlmIHRoZSByZWxhdGlvbnNoaXAgaXMgc2lnbmlmaWNhbnQuDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpQaGkoZGFuZSkNCiM/Q29udENvZWYNCiNDb250Q29lZihkYW5lKQ0KI0NyYW1lclYoZGFuZSkNCiNUc2NodXByb3dUKGRhbmUpDQptb3NhaWNwbG90KGRhbmUpDQpiYXJwbG90KGRhbmUpDQpgYGANCkNvbmNsdXNpb246IHRoZXJlIGRvZXMgbm90IHNlZW0gdG8gYmUgYW55IHNpZ25pZmljYW50IGNvcnJlbGF0aW9uIGJldHdlZW4gZ2VuZGVyIGFuZCBiZWxpZXZpbmcgaW4gYWZ0ZXJsaWZlDQoNCiMjIEV4ZXJjaXNlIDIuIENvbnRpbmdlbmN5IGFuYWx5c2lzIGZvciB0aGUgJ1RpdGFuaWMnIGRhdGEuDQoNCkxldCdzIGNvbnNpZGVyIHRoZSB0aXRhbmljIGRhdGFzZXQgd2hpY2ggY29udGFpbnMgYSBjb21wbGV0ZSBsaXN0IG9mIHBhc3NlbmdlcnMgYW5kIGNyZXcgbWVtYmVycyBvbiB0aGUgUk1TIFRpdGFuaWMuIEl0IGluY2x1ZGVzIGEgdmFyaWFibGUgaW5kaWNhdGluZyB3aGV0aGVyIGEgcGVyc29uIGRpZCBzdXJ2aXZlIHRoZSBzaW5raW5nIG9mIHRoZSBSTVMgVGl0YW5pYyBvbiBBcHJpbCAxNSwgMTkxMi4NCkEgZGF0YSBmcmFtZSBjb250YWlucyAyNDU2IG9ic2VydmF0aW9ucyBvbiAxNCB2YXJpYWJsZXMuDQoNCmBgYHtyIGxvYWQtZGF0YTIsIHdhcm5pbmc9VFJVRSwgaW5jbHVkZT1GQUxTRX0NCmRvd25sb2FkLmZpbGUoImh0dHBzOi8vZ2l0aHViLmNvbS9rZmxpc2lrb3dza2kvZHMvYmxvYi9tYXN0ZXIvdGl0YW5pYy5jc3Y/cmF3PXRydWUiLCBkZXN0ZmlsZSA9InRpdGFuaWMuY3N2Iixtb2RlPSJ3YiIpDQp0aXRhbmljIDwtIHJlYWQuY3N2KCJ0aXRhbmljLmNzdiIscm93Lm5hbWVzPTEsc2VwPSI7IikNCmBgYA0KDQpUaGUgd2Vic2l0ZSBodHRwOi8vd3d3LmVuY3ljbG9wZWRpYS10aXRhbmljYS5vcmcvIG9mZmVycyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBwYXNzZW5nZXJzIGFuZCBjcmV3IG1lbWJlcnMgb24gdGhlIFJNUyBUaXRhbmljLiBBY2NvcmRpbmcgdG8gdGhlIHdlYnNpdGUgMTMxNyBwYXNzZW5nZXJzIGFuZCA4OTAgY3JldyBtZW1iZXIgd2VyZSBhYm9hcmQuDQoNCjggbXVzaWNpYW5zIGFuZCA5IGVtcGxveWVlcyBvZiB0aGUgc2hpcHlhcmQgY29tcGFueSBhcmUgbGlzdGVkIGFzIHBhc3NlbmdlcnMsIGJ1dCB0cmF2ZWxsZWQgd2l0aCBhIGZyZWUgdGlja2V0LCB3aGljaCBpcyB3aHkgdGhleSBoYXZlIE5BIHZhbHVlcyBpbiBmYXJlLiBJbiBhZGRpdGlvbiB0byB0aGF0LCBmYXJlIGlzIHRydWVseSBtaXNzaW5nIGZvciBhIGZldyByZWd1bGFyIHBhc3NlbmdlcnMuIA0KDQpgYGB7cn0NCiMgTG9hZCB0aGUgVGl0YW5pYyBkYXRhc2V0DQpkb3dubG9hZC5maWxlKCJodHRwczovL2dpdGh1Yi5jb20va2ZsaXNpa293c2tpL2RzL2Jsb2IvbWFzdGVyL3RpdGFuaWMuY3N2P3Jhdz10cnVlIiwgZGVzdGZpbGUgPSAidGl0YW5pYy5jc3YiLCBtb2RlID0gIndiIikNCnRpdGFuaWMgPC0gcmVhZC5jc3YoInRpdGFuaWMuY3N2Iiwgcm93Lm5hbWVzID0gMSwgc2VwID0gIjsiKQ0KDQojIFNob3cgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YQ0KI3N0cih0aXRhbmljKQ0KDQojIFN1bW1hcnkgb2YgdGhlIGRhdGENCiNzdW1tYXJ5KHRpdGFuaWMpDQoNCiMgSWRlbnRpZnkgbWlzc2luZyB2YWx1ZXMNCnNhcHBseSh0aXRhbmljLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQ0KDQojIFJlbW92aW5nIHJvd3Mgd2l0aCBtaXNzaW5nICdGYXJlX0dCUCcgdmFsdWVzIGZvciByZWd1bGFyIHBhc3NlbmdlcnMNCnRpdGFuaWNfY2xlYW4gPC0gdGl0YW5pY1shaXMubmEodGl0YW5pYyRGYXJlX0dCUCksIF0NCg0KI3JlbW92aW5nIHRoZSBwb2VwbGUgd2hvIGRpc2VtYmFya2VkIGZvcm0gdGhlIGRhdGFzZXQNCnRpdGFuaWNfY2xlYW4gPC0gdGl0YW5pY19jbGVhbiAlPiUNCiAgZmlsdGVyKERpc2VtYmFya2VkLmF0ID09ICJOb3QgRGlzZW1iYXJrZWQiKQ0KDQojIENvbmZpcm0gdGhlIHJlbW92YWwgb2Ygcm93cyB3aXRoIE5BICdGYXJlX0dCUCcgdmFsdWVzDQpzYXBwbHkodGl0YW5pY19jbGVhbiwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkNCg0KIyBDcmVhdGUgYSBjb250aW5nZW5jeSB0YWJsZSBmb3IgU3Vydml2YWwgYW5kIFBhc3NlbmdlciBDbGFzcw0KdGFibGVfc3Vydml2ZWRfY2xhc3MgPC0gdGFibGUodGl0YW5pY19jbGVhbiRTdGF0dXMsIHRpdGFuaWNfY2xlYW4kQ2xhc3MuLi5EZXBhcnRtZW50KQ0KDQojIFBlcmZvcm0gY2hpLXNxdWFyZSB0ZXN0DQpjaGlzcV90ZXN0IDwtIGNoaXNxLnRlc3QodGFibGVfc3Vydml2ZWRfY2xhc3MpDQoNCiMgRGlzcGxheSB0aGUgcmVzdWx0cw0KcHJpbnQodGFibGVfc3Vydml2ZWRfY2xhc3MpDQpwcmludChjaGlzcV90ZXN0KQ0KDQojIFBsb3R0aW5nIHRoZSBjb250aW5nZW5jeSB0YWJsZQ0KbW9zYWljcGxvdCh0YWJsZV9zdXJ2aXZlZF9jbGFzcywgbWFpbiA9ICJTdXJ2aXZhbCBieSBQYXNzZW5nZXIgQ2xhc3MiLCBzaGFkZSA9IFRSVUUpDQoNCiMgQ3JlYXRlIGEgY29udGluZ2VuY3kgdGFibGUgZm9yIFN1cnZpdmFsIGFuZCBHZW5kZXINCnRhYmxlX3N1cnZpdmVkX2dlbmRlciA8LSB0YWJsZSh0aXRhbmljX2NsZWFuJFN0YXR1cywgdGl0YW5pY19jbGVhbiRHZW5kZXIpDQoNCiMgUGVyZm9ybSBjaGktc3F1YXJlIHRlc3QNCmNoaXNxX3Rlc3RfZ2VuZGVyIDwtIGNoaXNxLnRlc3QodGFibGVfc3Vydml2ZWRfZ2VuZGVyKQ0KDQojIERpc3BsYXkgdGhlIHJlc3VsdHMNCnByaW50KHRhYmxlX3N1cnZpdmVkX2dlbmRlcikNCnByaW50KGNoaXNxX3Rlc3RfZ2VuZGVyKQ0KDQojIFBsb3R0aW5nIHRoZSBjb250aW5nZW5jeSB0YWJsZQ0KbW9zYWljcGxvdCh0YWJsZV9zdXJ2aXZlZF9nZW5kZXIsIG1haW4gPSAiU3Vydml2YWwgYnkgR2VuZGVyIiwgc2hhZGUgPSBUUlVFKQ0KDQoNCmBgYA0KDQppbiBib3RoIGNhc2VzICBwLXZhbHVlIGlzIGxvd2VyIHRoYW4gMi4yZS0xNiwgb2JzZXJ2ZWQgZGlmZmVyZW5jZXMgaW4gdGhlIHRhYmxlcyBhcmUgZXh0cmVtZWx5IHVubGlrZWx5IHRvIGhhdmUgb2NjdXJyZWQgYnkgcmFuZG9tIGNoYW5jZSBhbG9uZS4NCg==