Start Date: 3 May 2025

Report Date: 31 May 2025

Source: Psi Chi R

In May 2024, Psi Chi R conducted a workshop at APS to help everyone learn R! That workshop was a success, and while we will not be at APS this year, we wanted to re-share that workshop as a resource for you! This month’s contest is a revamped version of what we covered in the workshop. I hope you enjoy! Enjoy the remainder of your semesters – summer is on the horizon!

knitr::opts_chunk$set(echo = T,message = F,warning = F)

#setwd("C:/Users/alanh/Documents/R/Psi_Chi_R")

rm(list=ls())

setwd("~/R/Psi_Chi_R")

library(tidyverse)

#total for bottom row
sum_rows = function(x) {
  x = as.data.frame(x)
  sums = sapply(x,function(col) if (is.numeric(col)) sum(col, na.rm = T) else NA)
  sums = as.data.frame(t(sums))
  names(sums) = names(x)
  rbind(x, sums)
}

## right column for total
sum_cols = function(x) {
  x$Total = rowSums(x[sapply(x, is.numeric)], na.rm = T)
  x
}

#dollar format function
dollars = function(x) {
  paste0("$",format(x,big.mark= ",",scientific=F))
}

desc_stats = function(x){
  c(min = min(x,na.rm=T),
    median = median(x,na.rm=T),
    max = max(x,na.rm=T),
    mean = mean(x,na.rm=T),
    sd = sd(x,na.rm=T))
}

#numeric notations
options(scipen=9999)

Clean and EDA

data=read_csv('data.csv')

names(data) = make.names(colnames(data))

SmartEDA::ExpData(data,type=2) %>% 
  arrange(desc(Per_of_Missing))

Level 1: Preparing the data

#   Remove participants who are missing ‘Age’
#   Remove participants who are missing ‘Gender’
data1= data %>% 
  filter(!is.na(Age) & !is.na(Gender))

Test your skills: Remove participants missing ‘Age’ and ‘Gender’ in one step, instead of two.

#   Create the following variable ‘FACEenmesh’ which measures the extent to which a family is enmeshed, by summing the following items: FACES4, FACES10, FACES16,  FACES22, FACES28, FACES34, FACES40

data2 = data1 %>% 
  mutate(FACEenmesh = FACES4+ FACES10+ FACES16+  FACES22+FACES28+ FACES34+FACES40) %>% 
  select(FACEenmesh,everything())

Level 2: Data inspection + Descriptives

Identify participants with values considered outliers for ‘FACEenmesh’.

data2.1 = data2%>% 
  filter(FACEenmesh > 25)

print(data2.1)
## # A tibble: 12 × 300
##    FACEenmesh ParticipantID   Age Gender Countryborn Stateborn Countrycurrent
##         <dbl>         <dbl> <dbl>  <dbl>       <dbl>     <dbl>          <dbl>
##  1         35             5    19      1         187        25            187
##  2         35            22    18      1         187        25            187
##  3         26            23    18      1         187        25            187
##  4         35            43    19      2         187        44            187
##  5         26            60    18      2         187        25            187
##  6         26           202    18      1         187        51            187
##  7         26           288    18      1         187        25            187
##  8         28           343    19      1         187        44            187
##  9         35           349    18      1         187        11            187
## 10         28           408    18      1         187        25            187
## 11         29           445    19      1         187        25            187
## 12         29           463    19      1         187        25            187
## # ℹ 293 more variables: Statecurrent <dbl>, Yearscurrent <chr>,
## #   Ethnicity <chr>, Race <dbl>, OtherText <chr>, Primarychild <dbl>,
## #   Primarynow <dbl>, Samesex <dbl>, Parentdecease <dbl>,
## #   Parentdeceasetext <chr>, Siblings <dbl>, Primmomnow <chr>,
## #   Primdadnow <chr>, Hoursmom <dbl>, Hoursdad <dbl>, SubSES <dbl>,
## #   FatherEd <dbl>, FatherEdText <chr>, MotherEd <dbl>, MotherEdText <chr>,
## #   Religionnow <dbl>, ReligChristother <chr>, ReligOther <chr>, …

Test your skills: Visualize outlier values for ‘FACEenmesh’.

boxplot(data2$FACEenmesh)
title(main="Looking for FACEenmesh outliers")

Remove participants with values considered outliers on ‘FACEenmesh’; Find the mean of ‘FACEenmesh’; Find the standard deviation of ‘FACEenmesh’; Find the median of ‘FACEenmesh’; Find the range of ‘FACEenmesh’

Test your skills: Find the mean, standard deviation, median, and range of FACEenmesh in one step.

data3 = data2 %>% 
  filter(FACEenmesh <= 25)

#range is from 7 to 25
desc_stats(data3$FACEenmesh) %>% 
  print()
##      min   median      max     mean       sd 
##  7.00000 14.00000 25.00000 14.83878  4.23854

Level 3: Inferential + Other Statistics

Is there a statistically significant correlation between the number of siblings someone has and their enmeshment score?

No, there isn’t.

#No, there isn't a significant correlation.
data4 = data3 %>% 
  filter(!is.na(FACEenmesh) & !is.na(Siblings)) %>% 
  select(Siblings,everything())

cor.test(data4$FACEenmesh,data4$Siblings)
## 
##  Pearson's product-moment correlation
## 
## data:  data4$FACEenmesh and data4$Siblings
## t = -0.35127, df = 457, p-value = 0.7256
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.10779408  0.07521062
## sample estimates:
##         cor 
## -0.01642932
data4 %>% 
  ggplot(aes(y=FACEenmesh,x=Siblings))+
  geom_point()+
  geom_smooth()

Test your skills: Is there a statistically significant difference in enmeshment between people who have siblings and those who do not? *Note, you may need to create a new variable to test this

data5 = data4 %>% 
  mutate(have_siblings = case_when(Siblings > 0 ~ "YES",
                              TRUE ~ 'NO')) %>% 
  select(have_siblings,everything())

shapiro.test(data5$FACEenmesh[data5$have_siblings=='YES'])
## 
##  Shapiro-Wilk normality test
## 
## data:  data5$FACEenmesh[data5$have_siblings == "YES"]
## W = 0.97319, p-value = 0.0000004684
shapiro.test(data5$FACEenmesh[data5$have_siblings=='NO'])
## 
##  Shapiro-Wilk normality test
## 
## data:  data5$FACEenmesh[data5$have_siblings == "NO"]
## W = 0.96121, p-value = 0.2795
hist(data5$FACEenmesh[data5$have_siblings=='YES'])

hist(data5$FACEenmesh[data5$have_siblings=='NO'])

wilcox.test(data5$FACEenmesh~data5$have_siblings)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  data5$FACEenmesh by data5$have_siblings
## W = 6810, p-value = 0.7654
## alternative hypothesis: true location shift is not equal to 0
#assumptions for Welch t-test

# data5$dev=with(data5, abs(FACEenmesh - ave(FACEenmesh, have_siblings, FUN = median)))
# 
# summary(aov(data5$dev ~data5$have_siblings))
# 
# t.test(data5$FACEenmesh~data5$have_siblings,var.equal = F)

Level 4: Visualization

Graph the relationship between the number of siblings someone has and their enmeshment score

data5 %>% 
  ggplot(aes(y=FACEenmesh,x=Siblings))+
  theme_bw()+
  geom_point()+
  labs(title='Sibling Rivalry? More Like Sibling Enmeshment',subtitle='A Totally Scientific Look')+
  theme(plot.title = element_text(hjust = .5),
        plot.subtitle = element_text(hjust = .5))+
  geom_smooth()

Test your skills: Visualize the difference in enmeshment between people who have siblings and those who do not

data5 %>% 
  ggplot(aes(x=have_siblings,y=FACEenmesh,fill=have_siblings))+
  geom_col()+
  theme_bw()+
  labs(title='"Only Child Sanctuary" vs. "Sibling Scrum"',subtitle= "The Enmeshment Edition",x='Have Siblings')+
  theme(plot.title = element_text(hjust = .5) , plot.subtitle = element_text(hjust = .5))+
  guides(fill ='none')

LS0tDQp0aXRsZTogIlBzaSBDaGkgUiAtIE1heSAyMDI1Ig0KI2RhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGFsd2F5c19hbGxvd19odG1sOiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGFuY2hvcl9zZWN0aW9uczogVFJVRQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpTdGFydCBEYXRlOiAzIE1heSAyMDI1DQoNClJlcG9ydCBEYXRlOiBgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgDQoNCltTb3VyY2U6IFBzaSBDaGkgUl0oaHR0cHM6Ly9vc2YuaW8vMnloajMvd2lraS9ob21lLykNCg0KSW4gTWF5IDIwMjQsIFBzaSBDaGkgUiBjb25kdWN0ZWQgYSB3b3Jrc2hvcCBhdCBBUFMgdG8gaGVscCBldmVyeW9uZSBsZWFybiBSISBUaGF0IHdvcmtzaG9wIHdhcyBhIHN1Y2Nlc3MsIGFuZCB3aGlsZSB3ZSB3aWxsIG5vdCBiZSBhdCBBUFMgdGhpcyB5ZWFyLCB3ZSB3YW50ZWQgdG8gcmUtc2hhcmUgdGhhdCB3b3Jrc2hvcCBhcyBhIHJlc291cmNlIGZvciB5b3UhIFRoaXMgbW9udGjigJlzIGNvbnRlc3QgaXMgYSByZXZhbXBlZCB2ZXJzaW9uIG9mIHdoYXQgd2UgY292ZXJlZCBpbiB0aGUgd29ya3Nob3AuIEkgaG9wZSB5b3UgZW5qb3khIEVuam95IHRoZSByZW1haW5kZXIgb2YgeW91ciBzZW1lc3RlcnMg4oCTIHN1bW1lciBpcyBvbiB0aGUgaG9yaXpvbiENCg0KYGBge3Igd2FybmluZz1GLG1lc3NhZ2U9Rn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVCxtZXNzYWdlID0gRix3YXJuaW5nID0gRikNCg0KI3NldHdkKCJDOi9Vc2Vycy9hbGFuaC9Eb2N1bWVudHMvUi9Qc2lfQ2hpX1IiKQ0KDQpybShsaXN0PWxzKCkpDQoNCnNldHdkKCJ+L1IvUHNpX0NoaV9SIikNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiN0b3RhbCBmb3IgYm90dG9tIHJvdw0Kc3VtX3Jvd3MgPSBmdW5jdGlvbih4KSB7DQogIHggPSBhcy5kYXRhLmZyYW1lKHgpDQogIHN1bXMgPSBzYXBwbHkoeCxmdW5jdGlvbihjb2wpIGlmIChpcy5udW1lcmljKGNvbCkpIHN1bShjb2wsIG5hLnJtID0gVCkgZWxzZSBOQSkNCiAgc3VtcyA9IGFzLmRhdGEuZnJhbWUodChzdW1zKSkNCiAgbmFtZXMoc3VtcykgPSBuYW1lcyh4KQ0KICByYmluZCh4LCBzdW1zKQ0KfQ0KDQojIyByaWdodCBjb2x1bW4gZm9yIHRvdGFsDQpzdW1fY29scyA9IGZ1bmN0aW9uKHgpIHsNCiAgeCRUb3RhbCA9IHJvd1N1bXMoeFtzYXBwbHkoeCwgaXMubnVtZXJpYyldLCBuYS5ybSA9IFQpDQogIHgNCn0NCg0KI2RvbGxhciBmb3JtYXQgZnVuY3Rpb24NCmRvbGxhcnMgPSBmdW5jdGlvbih4KSB7DQogIHBhc3RlMCgiJCIsZm9ybWF0KHgsYmlnLm1hcms9ICIsIixzY2llbnRpZmljPUYpKQ0KfQ0KDQpkZXNjX3N0YXRzID0gZnVuY3Rpb24oeCl7DQogIGMobWluID0gbWluKHgsbmEucm09VCksDQogICAgbWVkaWFuID0gbWVkaWFuKHgsbmEucm09VCksDQogICAgbWF4ID0gbWF4KHgsbmEucm09VCksDQogICAgbWVhbiA9IG1lYW4oeCxuYS5ybT1UKSwNCiAgICBzZCA9IHNkKHgsbmEucm09VCkpDQp9DQoNCiNudW1lcmljIG5vdGF0aW9ucw0Kb3B0aW9ucyhzY2lwZW49OTk5OSkNCmBgYA0KDQojIyBDbGVhbiBhbmQgRURBDQoNCmBgYHtyfQ0KZGF0YT1yZWFkX2NzdignZGF0YS5jc3YnKQ0KDQpuYW1lcyhkYXRhKSA9IG1ha2UubmFtZXMoY29sbmFtZXMoZGF0YSkpDQoNClNtYXJ0RURBOjpFeHBEYXRhKGRhdGEsdHlwZT0yKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhQZXJfb2ZfTWlzc2luZykpDQpgYGANCg0KIyMgTGV2ZWwgMTogUHJlcGFyaW5nIHRoZSBkYXRhDQoNCmBgYHtyfQ0KIyAJUmVtb3ZlIHBhcnRpY2lwYW50cyB3aG8gYXJlIG1pc3Npbmcg4oCYQWdl4oCZDQojIAlSZW1vdmUgcGFydGljaXBhbnRzIHdobyBhcmUgbWlzc2luZyDigJhHZW5kZXLigJkNCmRhdGExPSBkYXRhICU+JSANCiAgZmlsdGVyKCFpcy5uYShBZ2UpICYgIWlzLm5hKEdlbmRlcikpDQpgYGANCg0KIyMjIFRlc3QgeW91ciBza2lsbHM6IFJlbW92ZSBwYXJ0aWNpcGFudHMgbWlzc2luZyDigJhBZ2XigJkgYW5kIOKAmEdlbmRlcuKAmSBpbiBvbmUgc3RlcCwgaW5zdGVhZCBvZiB0d28uDQoNCmBgYHtyfQ0KIyAJQ3JlYXRlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUg4oCYRkFDRWVubWVzaOKAmSB3aGljaCBtZWFzdXJlcyB0aGUgZXh0ZW50IHRvIHdoaWNoIGEgZmFtaWx5IGlzIGVubWVzaGVkLCBieSBzdW1taW5nIHRoZSBmb2xsb3dpbmcgaXRlbXM6IEZBQ0VTNCwgRkFDRVMxMCwgRkFDRVMxNiwgIEZBQ0VTMjIsIEZBQ0VTMjgsIEZBQ0VTMzQsIEZBQ0VTNDANCg0KZGF0YTIgPSBkYXRhMSAlPiUgDQogIG11dGF0ZShGQUNFZW5tZXNoID0gRkFDRVM0KyBGQUNFUzEwKyBGQUNFUzE2KyAgRkFDRVMyMitGQUNFUzI4KyBGQUNFUzM0K0ZBQ0VTNDApICU+JSANCiAgc2VsZWN0KEZBQ0Vlbm1lc2gsZXZlcnl0aGluZygpKQ0KYGBgDQoNCg0KIyMgTGV2ZWwgMjogRGF0YSBpbnNwZWN0aW9uICsgRGVzY3JpcHRpdmVzDQoNCiMjIyBJZGVudGlmeSBwYXJ0aWNpcGFudHMgd2l0aCB2YWx1ZXMgY29uc2lkZXJlZCBvdXRsaWVycyBmb3Ig4oCYRkFDRWVubWVzaOKAmS4gDQoNCmBgYHtyfQ0KZGF0YTIuMSA9IGRhdGEyJT4lIA0KICBmaWx0ZXIoRkFDRWVubWVzaCA+IDI1KQ0KDQpwcmludChkYXRhMi4xKQ0KYGBgDQoNCiMjIyBUZXN0IHlvdXIgc2tpbGxzOiBWaXN1YWxpemUgb3V0bGllciB2YWx1ZXMgZm9yIOKAmEZBQ0Vlbm1lc2jigJkuDQoNCmBgYHtyfQ0KYm94cGxvdChkYXRhMiRGQUNFZW5tZXNoKQ0KdGl0bGUobWFpbj0iTG9va2luZyBmb3IgRkFDRWVubWVzaCBvdXRsaWVycyIpDQpgYGANCg0KIyMjIFJlbW92ZSBwYXJ0aWNpcGFudHMgd2l0aCB2YWx1ZXMgY29uc2lkZXJlZCBvdXRsaWVycyBvbiDigJhGQUNFZW5tZXNo4oCZOyBGaW5kIHRoZSBtZWFuIG9mIOKAmEZBQ0Vlbm1lc2jigJk7IEZpbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiDigJhGQUNFZW5tZXNo4oCZOyBGaW5kIHRoZSBtZWRpYW4gb2Yg4oCYRkFDRWVubWVzaOKAmTsgRmluZCB0aGUgcmFuZ2Ugb2Yg4oCYRkFDRWVubWVzaOKAmQ0KDQojIyMjIFRlc3QgeW91ciBza2lsbHM6IEZpbmQgdGhlIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiwgbWVkaWFuLCBhbmQgcmFuZ2Ugb2YgRkFDRWVubWVzaCBpbiBvbmUgc3RlcC4NCg0KYGBge3J9DQpkYXRhMyA9IGRhdGEyICU+JSANCiAgZmlsdGVyKEZBQ0Vlbm1lc2ggPD0gMjUpDQoNCiNyYW5nZSBpcyBmcm9tIDcgdG8gMjUNCmRlc2Nfc3RhdHMoZGF0YTMkRkFDRWVubWVzaCkgJT4lIA0KICBwcmludCgpDQpgYGANCg0KIyMgTGV2ZWwgMzogSW5mZXJlbnRpYWwgKyBPdGhlciBTdGF0aXN0aWNzDQoNCiMjIyBJcyB0aGVyZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHNpYmxpbmdzIHNvbWVvbmUgaGFzIGFuZCB0aGVpciBlbm1lc2htZW50IHNjb3JlPw0KDQpObywgdGhlcmUgaXNuJ3QuDQoNCmBgYHtyfQ0KI05vLCB0aGVyZSBpc24ndCBhIHNpZ25pZmljYW50IGNvcnJlbGF0aW9uLg0KZGF0YTQgPSBkYXRhMyAlPiUgDQogIGZpbHRlcighaXMubmEoRkFDRWVubWVzaCkgJiAhaXMubmEoU2libGluZ3MpKSAlPiUgDQogIHNlbGVjdChTaWJsaW5ncyxldmVyeXRoaW5nKCkpDQoNCmNvci50ZXN0KGRhdGE0JEZBQ0Vlbm1lc2gsZGF0YTQkU2libGluZ3MpDQoNCmRhdGE0ICU+JSANCiAgZ2dwbG90KGFlcyh5PUZBQ0Vlbm1lc2gseD1TaWJsaW5ncykpKw0KICBnZW9tX3BvaW50KCkrDQogIGdlb21fc21vb3RoKCkNCmBgYA0KDQoNCiMjIyBUZXN0IHlvdXIgc2tpbGxzOiBJcyB0aGVyZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBlbm1lc2htZW50IGJldHdlZW4gcGVvcGxlIHdobyBoYXZlIHNpYmxpbmdzIGFuZCB0aG9zZSB3aG8gZG8gbm90PyAqTm90ZSwgeW91IG1heSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0byB0ZXN0IHRoaXMNCg0KYGBge3J9DQpkYXRhNSA9IGRhdGE0ICU+JSANCiAgbXV0YXRlKGhhdmVfc2libGluZ3MgPSBjYXNlX3doZW4oU2libGluZ3MgPiAwIH4gIllFUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gJ05PJykpICU+JSANCiAgc2VsZWN0KGhhdmVfc2libGluZ3MsZXZlcnl0aGluZygpKQ0KDQpzaGFwaXJvLnRlc3QoZGF0YTUkRkFDRWVubWVzaFtkYXRhNSRoYXZlX3NpYmxpbmdzPT0nWUVTJ10pDQoNCnNoYXBpcm8udGVzdChkYXRhNSRGQUNFZW5tZXNoW2RhdGE1JGhhdmVfc2libGluZ3M9PSdOTyddKQ0KDQpoaXN0KGRhdGE1JEZBQ0Vlbm1lc2hbZGF0YTUkaGF2ZV9zaWJsaW5ncz09J1lFUyddKQ0KDQpoaXN0KGRhdGE1JEZBQ0Vlbm1lc2hbZGF0YTUkaGF2ZV9zaWJsaW5ncz09J05PJ10pDQoNCndpbGNveC50ZXN0KGRhdGE1JEZBQ0Vlbm1lc2h+ZGF0YTUkaGF2ZV9zaWJsaW5ncykNCmBgYA0KDQpgYGB7cn0NCiNhc3N1bXB0aW9ucyBmb3IgV2VsY2ggdC10ZXN0DQoNCiMgZGF0YTUkZGV2PXdpdGgoZGF0YTUsIGFicyhGQUNFZW5tZXNoIC0gYXZlKEZBQ0Vlbm1lc2gsIGhhdmVfc2libGluZ3MsIEZVTiA9IG1lZGlhbikpKQ0KIyANCiMgc3VtbWFyeShhb3YoZGF0YTUkZGV2IH5kYXRhNSRoYXZlX3NpYmxpbmdzKSkNCiMgDQojIHQudGVzdChkYXRhNSRGQUNFZW5tZXNofmRhdGE1JGhhdmVfc2libGluZ3MsdmFyLmVxdWFsID0gRikNCg0KYGBgDQoNCiMjIExldmVsIDQ6IFZpc3VhbGl6YXRpb24NCg0KIyMjIEdyYXBoIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHNpYmxpbmdzIHNvbWVvbmUgaGFzIGFuZCB0aGVpciBlbm1lc2htZW50IHNjb3JlDQoNCmBgYHtyfQ0KZGF0YTUgJT4lIA0KICBnZ3Bsb3QoYWVzKHk9RkFDRWVubWVzaCx4PVNpYmxpbmdzKSkrDQogIHRoZW1lX2J3KCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZT0nU2libGluZyBSaXZhbHJ5PyBNb3JlIExpa2UgU2libGluZyBFbm1lc2htZW50JyxzdWJ0aXRsZT0nQSBUb3RhbGx5IFNjaWVudGlmaWMgTG9vaycpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSsNCiAgZ2VvbV9zbW9vdGgoKQ0KYGBgDQoNCg0KIyMjIFRlc3QgeW91ciBza2lsbHM6IFZpc3VhbGl6ZSB0aGUgZGlmZmVyZW5jZSBpbiBlbm1lc2htZW50IGJldHdlZW4gcGVvcGxlIHdobyBoYXZlIHNpYmxpbmdzIGFuZCB0aG9zZSB3aG8gZG8gbm90DQoNCmBgYHtyfQ0KZGF0YTUgJT4lIA0KICBnZ3Bsb3QoYWVzKHg9aGF2ZV9zaWJsaW5ncyx5PUZBQ0Vlbm1lc2gsZmlsbD1oYXZlX3NpYmxpbmdzKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lX2J3KCkrDQogIGxhYnModGl0bGU9JyJPbmx5IENoaWxkIFNhbmN0dWFyeSIgdnMuICJTaWJsaW5nIFNjcnVtIicsc3VidGl0bGU9ICJUaGUgRW5tZXNobWVudCBFZGl0aW9uIix4PSdIYXZlIFNpYmxpbmdzJykrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkgLCBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSsNCiAgZ3VpZGVzKGZpbGwgPSdub25lJykNCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGU9Rn0NCiNiZWVwIHdoZW4gZG9uZQ0KaWYgKHJlcXVpcmUoImJlZXByIikpDQogIGJlZXByOjpiZWVwKDIpDQpgYGA=