library(forcats)
library(stargazer, quietly = T)
## 
## Please cite as:
##  Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
library(survey, quietly = T)
## 
## Attaching package: 'survey'
## The following object is masked from 'package:graphics':
## 
##     dotchart
library(car, quietly = T)
library(questionr, quietly = T)
library(dplyr, quietly = T)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
## 
##     recode
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(forcats, quietly = T)
library(tidyverse, quietly = T)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v readr   2.1.2
## v tibble  3.1.6     v purrr   0.3.4
## v tidyr   1.2.0     v stringr 1.4.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x tidyr::expand() masks Matrix::expand()
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## x tidyr::pack()   masks Matrix::pack()
## x dplyr::recode() masks car::recode()
## x purrr::some()   masks car::some()
## x tidyr::unpack() masks Matrix::unpack()
library(srvyr, quietly = T)
## 
## Attaching package: 'srvyr'
## The following object is masked from 'package:stats':
## 
##     filter
library( gtsummary, quietly = T)
## #Uighur
library(caret, quietly = T)
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
## The following object is masked from 'package:survival':
## 
##     cluster
library(tableone,  quietly = T)
library(stargazer, quietly = T)
library(survey, quietly = T)
library(ggplot2, quietly = T)
library(pander, quietly = T)
## Warning: package 'pander' was built under R version 4.1.3
library(knitr, quietly = T)
library(dplyr, quietly = T)
library(factoextra, quietly = T)
## Warning: package 'factoextra' was built under R version 4.1.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(FactoMineR, quietly = T)
## Warning: package 'FactoMineR' was built under R version 4.1.3
library(ipumsr)
## Warning: package 'ipumsr' was built under R version 4.1.3
library(haven)
ddi <- read_ipums_ddi("C:/Users/spara/OneDrive/Desktop/project/nhis_00008.xml")
data <- read_ipums_micro(ddi)
## Use of data from IPUMS NHIS is subject to conditions including that users
## should cite the data appropriately. Use command `ipums_conditions()` for more
## details.
data<- haven::zap_labels(data)
names(data) <- tolower(gsub(pattern = "_",replacement =  "",x =  names(data)))

Recode variables

#depression level

data$depfeelevl<-car::Recode (data$depfeelevl,
                              recodes="1=1; 2=2; 3=0; else=NA")


# medication for depression

data$deprx<- car::Recode(data$deprx,
                       recodes="1=0; 2=1;else=NA")

data$deprx_cat <- as.factor(data$deprx)

data$deprx_cat<- car::Recode(data$deprx,
                       recodes="0='No'; 1='Yes';else=NA",
                       as.factor=T)


# ever had anxiety disorder


data$anxietydisorder<- car::Recode(data$anxietyev,
                       recodes="1=0; 2=1;else=NA")


# medication for worrying

data$worrymed<- car::Recode(data$worrx,
                       recodes="1=0; 2=1;else=NA")

# level of worry


data$worfeelevl<- car::Recode (data$worfeelevl,
                       recodes="1=1; 2=2; 3=0; else=NA")
                       
                       
# feel afraid past two weeks

data$gadfear<- car::Recode (data$gadfear,
                       recodes="1=1; 2=2; 3=0; else=NA")
                       
#currently Pregnant 

data$curpreg<-car::Recode(data$pregnantnow,
                          recodes="0='Yes';else=NA",
                          as.factor=T)
#education level

data$educ<-Recode(data$educ,
                        recodes="102 =1; 201=2; 301=3; 
                       400= 4; 501= 5;else=NA")


data$educ_cat<-Recode(data$educ,
                        recodes="1 ='NoSchool'; 2='HS Diploma'; 3='Some college'; 
                       4= 'Undergrad'; 5= 'Masters';else=NA", as.factor = T)

#employment status

data$empstat<- Recode(data$empstat,
                       recodes="100=1; 200=2; else=NA")

data$empstat_cat<-Recode(data$empstat,
                        recodes="1 ='Employed'; 2='Unemployed';else=NA", as.factor = T)                      

#last time employed


data$employedlasttime<- car::Recode(data$emplast,
                       recodes="1=1; 2=2; 3=3; 4=4;else=NA")
data$employedlasttime_cat<- car::Recode(data$emplast,
                       recodes="1='Within past 12months'; 2='1-5years ago'; 3='over 5years ago'; 4='never worked';else=NA",
                       as.factor=T)

# total combined family income 

data$familyincome <- data$incfam07on

data$familyincome<- car::Recode(data$incfam07on,
                       recodes="11=1;12=2;22=3;23=4;24=5;else=NA")
data$familyincome_cat<- car::Recode(data$incfam07on,
                       recodes="11='$0 - $34,999';12='$35,000 - $49,999';22='$50,000 - $74,999';23='$75,000 - $99,999';24='$100,000 and over';else=NA",
                       as.factor=T)


# health insurance coverage

data$healthinsuracecov<- car::Recode(data$hinotcove,
                       recodes="1=0; 2=1;else=NA")


#poverty

data$poverty<- car::Recode(data$poverty,
                     recodes="10:14=1; 20:25=2; 30:37=3;else=NA")

##race/ethnicity
data$race<- car::Recode(data$racea,
                       recodes="100 ='White'; 200 ='African American'; 
                       400:434= 'Asian'; 500:590 = 'Other'; else=NA", 
                       as.factor=T)

## marital status
data$mars<- car::Recode(data$marstat, 
                        recodes ="10:13='Married'; 20='Widowed'; 30='Divorced'; 
                        40='Separated'; 50='Never Married'; else=NA", 
                        as.factor=T)

data$mars<- car::Recode(data$marstat, 
                        recodes ="10:13=1; 20=2; 30=3; 
                        40=4; 50=5; else=NA")
data<-data%>%
 filter(is.na(curpreg)==F)

Use the technique of Principal Components Analysis (PCA) to perform a variable reduction of at least 5 variables.

data2 <- data%>%
filter(complete.cases(sampweight, strata, educ,deprx,depfeelevl,anxietyev,worrx,worfeelevl,gadfear, empstat,healthinsuracecov ,race, mars, poverty, incfam07on, familyincome_cat))%>%


  select(sampweight, strata, educ, deprx, depfeelevl,anxietyev,worrx,worfeelevl,gadfear,healthinsuracecov, employedlasttime, poverty, race, mars, deprx_cat, educ_cat, familyincome_cat, empstat) %>%
  
  
  mutate_at(vars(deprx, depfeelevl,anxietyev,worrx,worfeelevl,), scale) 
data.pc <- PCA(data2 [,4:8],
               scale.unit =  T,
               graph= F
               )

Report the results of the PCA, being sure to include the eigenvalues and corresponding vectors. Interpret your component(s) if possible

eigenvalues <- data.pc$eig
head(eigenvalues[, 1:2])
##        eigenvalue percentage of variance
## comp 1  1.9405196              38.810393
## comp 2  1.2092131              24.184261
## comp 3  0.7767927              15.535854
## comp 4  0.6425498              12.850996
## comp 5  0.4309248               8.618496

The first two components account for 63% of the variation in the input variable. In addition, the first two eigenvalues are greater than 1 (1.94 and 1.20 respectively)indicating that only these two values satisfied the condition.

fviz_screeplot(data.pc, ncp=10)

data.pc$var
## $coord
##                  Dim.1        Dim.2       Dim.3      Dim.4       Dim.5
## deprx       0.84130712 -0.048444839  0.08422886 -0.2045955 -0.49081726
## depfeelevl  0.21857790  0.754079373 -0.59059041 -0.1795183  0.05063735
## anxietyev   0.73179985  0.006441197 -0.11862182  0.6662048  0.08079282
## worrx       0.80396980 -0.105814519  0.22146826 -0.3360751  0.42478373
## worfeelevl -0.05520147  0.791828422  0.59814868  0.1081127 -0.02214401
## 
## $cor
##                  Dim.1        Dim.2       Dim.3      Dim.4       Dim.5
## deprx       0.84130712 -0.048444839  0.08422886 -0.2045955 -0.49081726
## depfeelevl  0.21857790  0.754079373 -0.59059041 -0.1795183  0.05063735
## anxietyev   0.73179985  0.006441197 -0.11862182  0.6662048  0.08079282
## worrx       0.80396980 -0.105814519  0.22146826 -0.3360751  0.42478373
## worfeelevl -0.05520147  0.791828422  0.59814868  0.1081127 -0.02214401
## 
## $cos2
##                  Dim.1        Dim.2       Dim.3      Dim.4        Dim.5
## deprx      0.707797677 2.346902e-03 0.007094501 0.04185934 0.2409015818
## depfeelevl 0.047776300 5.686357e-01 0.348797036 0.03222682 0.0025641410
## anxietyev  0.535531026 4.148902e-05 0.014071136 0.44382887 0.0065274802
## worrx      0.646367439 1.119671e-02 0.049048189 0.11294644 0.1804412210
## worfeelevl 0.003047202 6.269923e-01 0.357781844 0.01168835 0.0004903573
## 
## $contrib
##                 Dim.1        Dim.2      Dim.3     Dim.4      Dim.5
## deprx      36.4746463  0.194085104  0.9133068  6.514567 55.9033948
## depfeelevl  2.4620364 47.025269770 44.9022028  5.015459  0.5950321
## anxietyev  27.5972999  0.003431076  1.8114403 69.073068  1.5147609
## worrx      33.3089871  0.925950335  6.3141928 17.577850 41.8730203
## worfeelevl  0.1570302 51.851263715 46.0588573  1.819057  0.1137919

Interestingly, level of worry, nervous, or anxious feelings (worfeelevl) is not very correlated with the principal component variables (-0.05.

fviz_pca_var(data.pc,
             col.var= "contrib")+
  theme_minimal()

fviz_pca_ind(data.pc,
             label= "none",
             col.ind= "cos2") +
  scale_color_gradient2(low= "blue",
                        mid= "white",
                        high= "red",
                        midpoint = .5) +
  theme_minimal()

Report the summary statistics and correlation matrix for your data

desc<- dimdesc(data.pc)
desc$Dim.1
## $quanti
##            correlation       p.value
## deprx       0.84130712  0.000000e+00
## worrx       0.80396980 1.808576e-293
## anxietyev   0.73179985 4.666106e-217
## depfeelevl  0.21857790  1.937054e-15
## worfeelevl -0.05520147  4.728083e-02
## 
## attr(,"class")
## [1] "condes" "list"
desc$Dim.2
## $quanti
##            correlation       p.value
## worfeelevl   0.7918284 1.606004e-278
## depfeelevl   0.7540794 8.778035e-238
## worrx       -0.1058145  1.387085e-04
## 
## attr(,"class")
## [1] "condes" "list"
data2$pc1 <- data.pc$ind$coord[, 1]

options(survey.lonely.psu = "adjust")
des<- svydesign( ids= ~1,
                 strata = ~strata,
                 weights= ~sampweight,
                 data= data2)

Now, the analysis will look at variation in mental health index across education level, race, and family income.

ggplot(aes(x=educ_cat, y=pc1),
       data=data2) +
  geom_boxplot()

ggplot(aes(x=race, y=pc1),
       data=data2) +
  geom_boxplot()

ggplot(aes(x=familyincome_cat, y=pc1),
       data=data2) +
  geom_boxplot()

If deemed appropriate, conduct some testing of your index/components/latent variables.

fit.1 <- svyglm(pc1~educ_cat +familyincome_cat + (race),
              des,
              family= gaussian)
summary(fit.1)
## 
## Call:
## svyglm(formula = pc1 ~ educ_cat + familyincome_cat + (race), 
##     design = des, family = gaussian)
## 
## Survey design:
## svydesign(ids = ~1, strata = ~strata, weights = ~sampweight, 
##     data = data2)
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)   
## (Intercept)                       -0.09009    0.15076  -0.598  0.55022   
## educ_catMasters                   -0.07536    0.14906  -0.506  0.61327   
## educ_catNoSchool                   0.16885    0.67110   0.252  0.80139   
## educ_catSome college               0.15290    0.12403   1.233  0.21789   
## educ_catUndergrad                 -0.07237    0.11691  -0.619  0.53600   
## familyincome_cat$100,000 and over -0.40961    0.12980  -3.156  0.00164 **
## familyincome_cat$35,000 - $49,999 -0.22344    0.13756  -1.624  0.10456   
## familyincome_cat$50,000 - $74,999  0.03570    0.15171   0.235  0.81402   
## familyincome_cat$75,000 - $99,999 -0.48484    0.15787  -3.071  0.00218 **
## raceAsian                         -0.59131    0.21155  -2.795  0.00527 **
## raceOther                         -0.62833    0.29262  -2.147  0.03197 * 
## raceWhite                          0.27073    0.16347   1.656  0.09795 . 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 1.813777)
## 
## Number of Fisher Scoring iterations: 2

Compared to women with HS Diploma, mental health index is lower among undergraduate and Masters degree whereas it is higher among women with no school and some college degree. In regard to family income, the mental health index is lower among women who have higher family income but relatively higher with income starting from 35-74k. Finally, compared to Black women, mental health index is higher among White women whereas lower among Asian and Other women.

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgNywgUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcyINCmF1dGhvcjogIkp5b3RpIE5lcGFsIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2hlaWdodDogNw0KICAgIGZpZ193aWR0aDogNw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KIA0KYGBge3J9DQpsaWJyYXJ5KGZvcmNhdHMpDQpsaWJyYXJ5KHN0YXJnYXplciwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHN1cnZleSwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KGNhciwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHF1ZXN0aW9uciwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KGRwbHlyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoZm9yY2F0cywgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHNydnlyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoIGd0c3VtbWFyeSwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KGNhcmV0LCBxdWlldGx5ID0gVCkNCmxpYnJhcnkodGFibGVvbmUsICBxdWlldGx5ID0gVCkNCmxpYnJhcnkoc3RhcmdhemVyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoc3VydmV5LCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoZ2dwbG90MiwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KHBhbmRlciwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KGtuaXRyLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoZHBseXIsIHF1aWV0bHkgPSBUKQ0KbGlicmFyeShmYWN0b2V4dHJhLCBxdWlldGx5ID0gVCkNCmxpYnJhcnkoRmFjdG9NaW5lUiwgcXVpZXRseSA9IFQpDQpsaWJyYXJ5KGlwdW1zcikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoaGF2ZW4pDQpkZGkgPC0gcmVhZF9pcHVtc19kZGkoIkM6L1VzZXJzL3NwYXJhL09uZURyaXZlL0Rlc2t0b3AvcHJvamVjdC9uaGlzXzAwMDA4LnhtbCIpDQpkYXRhIDwtIHJlYWRfaXB1bXNfbWljcm8oZGRpKQ0KZGF0YTwtIGhhdmVuOjp6YXBfbGFiZWxzKGRhdGEpDQoNCmBgYA0KYGBge3J9DQpuYW1lcyhkYXRhKSA8LSB0b2xvd2VyKGdzdWIocGF0dGVybiA9ICJfIixyZXBsYWNlbWVudCA9ICAiIix4ID0gIG5hbWVzKGRhdGEpKSkNCmBgYA0KIA0KIA0KUmVjb2RlIHZhcmlhYmxlcw0KIA0KYGBge3J9DQojZGVwcmVzc2lvbiBsZXZlbA0KDQpkYXRhJGRlcGZlZWxldmw8LWNhcjo6UmVjb2RlIChkYXRhJGRlcGZlZWxldmwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxPTE7IDI9MjsgMz0wOyBlbHNlPU5BIikNCg0KDQojIG1lZGljYXRpb24gZm9yIGRlcHJlc3Npb24NCg0KZGF0YSRkZXByeDwtIGNhcjo6UmVjb2RlKGRhdGEkZGVwcngsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjE9MDsgMj0xO2Vsc2U9TkEiKQ0KDQpkYXRhJGRlcHJ4X2NhdCA8LSBhcy5mYWN0b3IoZGF0YSRkZXByeCkNCg0KZGF0YSRkZXByeF9jYXQ8LSBjYXI6OlJlY29kZShkYXRhJGRlcHJ4LA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIwPSdObyc7IDE9J1llcyc7ZWxzZT1OQSIsDQogICAgICAgICAgICAgICAgICAgICAgIGFzLmZhY3Rvcj1UKQ0KDQoNCiMgZXZlciBoYWQgYW54aWV0eSBkaXNvcmRlcg0KDQoNCmRhdGEkYW54aWV0eWRpc29yZGVyPC0gY2FyOjpSZWNvZGUoZGF0YSRhbnhpZXR5ZXYsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjE9MDsgMj0xO2Vsc2U9TkEiKQ0KDQoNCiMgbWVkaWNhdGlvbiBmb3Igd29ycnlpbmcNCg0KZGF0YSR3b3JyeW1lZDwtIGNhcjo6UmVjb2RlKGRhdGEkd29ycngsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjE9MDsgMj0xO2Vsc2U9TkEiKQ0KDQojIGxldmVsIG9mIHdvcnJ5DQoNCg0KZGF0YSR3b3JmZWVsZXZsPC0gY2FyOjpSZWNvZGUgKGRhdGEkd29yZmVlbGV2bCwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMT0xOyAyPTI7IDM9MDsgZWxzZT1OQSIpDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICANCiMgZmVlbCBhZnJhaWQgcGFzdCB0d28gd2Vla3MNCg0KZGF0YSRnYWRmZWFyPC0gY2FyOjpSZWNvZGUgKGRhdGEkZ2FkZmVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMT0xOyAyPTI7IDM9MDsgZWxzZT1OQSIpDQogICAgICAgICAgICAgICAgICAgICAgIA0KI2N1cnJlbnRseSBQcmVnbmFudCANCg0KZGF0YSRjdXJwcmVnPC1jYXI6OlJlY29kZShkYXRhJHByZWduYW50bm93LA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIwPSdZZXMnO2Vsc2U9TkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5mYWN0b3I9VCkNCiNlZHVjYXRpb24gbGV2ZWwNCg0KZGF0YSRlZHVjPC1SZWNvZGUoZGF0YSRlZHVjLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMTAyID0xOyAyMDE9MjsgMzAxPTM7IA0KICAgICAgICAgICAgICAgICAgICAgICA0MDA9IDQ7IDUwMT0gNTtlbHNlPU5BIikNCg0KDQpkYXRhJGVkdWNfY2F0PC1SZWNvZGUoZGF0YSRlZHVjLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMSA9J05vU2Nob29sJzsgMj0nSFMgRGlwbG9tYSc7IDM9J1NvbWUgY29sbGVnZSc7IA0KICAgICAgICAgICAgICAgICAgICAgICA0PSAnVW5kZXJncmFkJzsgNT0gJ01hc3RlcnMnO2Vsc2U9TkEiLCBhcy5mYWN0b3IgPSBUKQ0KDQojZW1wbG95bWVudCBzdGF0dXMNCg0KZGF0YSRlbXBzdGF0PC0gUmVjb2RlKGRhdGEkZW1wc3RhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMTAwPTE7IDIwMD0yOyBlbHNlPU5BIikNCg0KZGF0YSRlbXBzdGF0X2NhdDwtUmVjb2RlKGRhdGEkZW1wc3RhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjEgPSdFbXBsb3llZCc7IDI9J1VuZW1wbG95ZWQnO2Vsc2U9TkEiLCBhcy5mYWN0b3IgPSBUKSAgICAgICAgICAgICAgICAgICAgICANCg0KI2xhc3QgdGltZSBlbXBsb3llZA0KDQoNCmRhdGEkZW1wbG95ZWRsYXN0dGltZTwtIGNhcjo6UmVjb2RlKGRhdGEkZW1wbGFzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMT0xOyAyPTI7IDM9MzsgND00O2Vsc2U9TkEiKQ0KZGF0YSRlbXBsb3llZGxhc3R0aW1lX2NhdDwtIGNhcjo6UmVjb2RlKGRhdGEkZW1wbGFzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMT0nV2l0aGluIHBhc3QgMTJtb250aHMnOyAyPScxLTV5ZWFycyBhZ28nOyAzPSdvdmVyIDV5ZWFycyBhZ28nOyA0PSduZXZlciB3b3JrZWQnO2Vsc2U9TkEiLA0KICAgICAgICAgICAgICAgICAgICAgICBhcy5mYWN0b3I9VCkNCg0KIyB0b3RhbCBjb21iaW5lZCBmYW1pbHkgaW5jb21lIA0KDQpkYXRhJGZhbWlseWluY29tZSA8LSBkYXRhJGluY2ZhbTA3b24NCg0KZGF0YSRmYW1pbHlpbmNvbWU8LSBjYXI6OlJlY29kZShkYXRhJGluY2ZhbTA3b24sDQogICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjExPTE7MTI9MjsyMj0zOzIzPTQ7MjQ9NTtlbHNlPU5BIikNCmRhdGEkZmFtaWx5aW5jb21lX2NhdDwtIGNhcjo6UmVjb2RlKGRhdGEkaW5jZmFtMDdvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMTE9JyQwIC0gJDM0LDk5OSc7MTI9JyQzNSwwMDAgLSAkNDksOTk5JzsyMj0nJDUwLDAwMCAtICQ3NCw5OTknOzIzPSckNzUsMDAwIC0gJDk5LDk5OSc7MjQ9JyQxMDAsMDAwIGFuZCBvdmVyJztlbHNlPU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yPVQpDQoNCg0KIyBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlDQoNCmRhdGEkaGVhbHRoaW5zdXJhY2Vjb3Y8LSBjYXI6OlJlY29kZShkYXRhJGhpbm90Y292ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMT0wOyAyPTE7ZWxzZT1OQSIpDQoNCg0KI3BvdmVydHkNCg0KZGF0YSRwb3ZlcnR5PC0gY2FyOjpSZWNvZGUoZGF0YSRwb3ZlcnR5LA0KICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMTA6MTQ9MTsgMjA6MjU9MjsgMzA6Mzc9MztlbHNlPU5BIikNCg0KIyNyYWNlL2V0aG5pY2l0eQ0KZGF0YSRyYWNlPC0gY2FyOjpSZWNvZGUoZGF0YSRyYWNlYSwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMTAwID0nV2hpdGUnOyAyMDAgPSdBZnJpY2FuIEFtZXJpY2FuJzsgDQogICAgICAgICAgICAgICAgICAgICAgIDQwMDo0MzQ9ICdBc2lhbic7IDUwMDo1OTAgPSAnT3RoZXInOyBlbHNlPU5BIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGFzLmZhY3Rvcj1UKQ0KDQojIyBtYXJpdGFsIHN0YXR1cw0KZGF0YSRtYXJzPC0gY2FyOjpSZWNvZGUoZGF0YSRtYXJzdGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXMgPSIxMDoxMz0nTWFycmllZCc7IDIwPSdXaWRvd2VkJzsgMzA9J0Rpdm9yY2VkJzsgDQogICAgICAgICAgICAgICAgICAgICAgICA0MD0nU2VwYXJhdGVkJzsgNTA9J05ldmVyIE1hcnJpZWQnOyBlbHNlPU5BIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBhcy5mYWN0b3I9VCkNCg0KZGF0YSRtYXJzPC0gY2FyOjpSZWNvZGUoZGF0YSRtYXJzdGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXMgPSIxMDoxMz0xOyAyMD0yOyAzMD0zOyANCiAgICAgICAgICAgICAgICAgICAgICAgIDQwPTQ7IDUwPTU7IGVsc2U9TkEiKQ0KYGBgDQogDQogDQpgYGB7cn0NCmRhdGE8LWRhdGElPiUNCiBmaWx0ZXIoaXMubmEoY3VycHJlZyk9PUYpDQpgYGANCiANCiMgVXNlIHRoZSB0ZWNobmlxdWUgb2YgUHJpbmNpcGFsIENvbXBvbmVudHMgQW5hbHlzaXMgKFBDQSkgdG8gcGVyZm9ybSBhIHZhcmlhYmxlIHJlZHVjdGlvbiBvZiBhdCBsZWFzdCA1IHZhcmlhYmxlcy4NCiANCmBgYHtyfQ0KDQpkYXRhMiA8LSBkYXRhJT4lDQpmaWx0ZXIoY29tcGxldGUuY2FzZXMoc2FtcHdlaWdodCwgc3RyYXRhLCBlZHVjLGRlcHJ4LGRlcGZlZWxldmwsYW54aWV0eWV2LHdvcnJ4LHdvcmZlZWxldmwsZ2FkZmVhciwgZW1wc3RhdCxoZWFsdGhpbnN1cmFjZWNvdiAscmFjZSwgbWFycywgcG92ZXJ0eSwgaW5jZmFtMDdvbiwgZmFtaWx5aW5jb21lX2NhdCkpJT4lDQoNCg0KICBzZWxlY3Qoc2FtcHdlaWdodCwgc3RyYXRhLCBlZHVjLCBkZXByeCwgZGVwZmVlbGV2bCxhbnhpZXR5ZXYsd29ycngsd29yZmVlbGV2bCxnYWRmZWFyLGhlYWx0aGluc3VyYWNlY292LCBlbXBsb3llZGxhc3R0aW1lLCBwb3ZlcnR5LCByYWNlLCBtYXJzLCBkZXByeF9jYXQsIGVkdWNfY2F0LCBmYW1pbHlpbmNvbWVfY2F0LCBlbXBzdGF0KSAlPiUNCiAgDQogIA0KICBtdXRhdGVfYXQodmFycyhkZXByeCwgZGVwZmVlbGV2bCxhbnhpZXR5ZXYsd29ycngsd29yZmVlbGV2bCwpLCBzY2FsZSkgDQpgYGANCg0KYGBge3J9DQpkYXRhLnBjIDwtIFBDQShkYXRhMiBbLDQ6OF0sDQogICAgICAgICAgICAgICBzY2FsZS51bml0ID0gIFQsDQogICAgICAgICAgICAgICBncmFwaD0gRg0KICAgICAgICAgICAgICAgKQ0KYGBgDQoNCiANCiMgUmVwb3J0IHRoZSByZXN1bHRzIG9mIHRoZSBQQ0EsIGJlaW5nIHN1cmUgdG8gaW5jbHVkZSB0aGUgZWlnZW52YWx1ZXMgYW5kIGNvcnJlc3BvbmRpbmcgdmVjdG9ycy4gSW50ZXJwcmV0IHlvdXIgY29tcG9uZW50KHMpIGlmIHBvc3NpYmxlDQoNCmBgYHtyfQ0KZWlnZW52YWx1ZXMgPC0gZGF0YS5wYyRlaWcNCmhlYWQoZWlnZW52YWx1ZXNbLCAxOjJdKQ0KYGBgDQpUaGUgZmlyc3QgdHdvIGNvbXBvbmVudHMgYWNjb3VudCBmb3IgNjMlIG9mIHRoZSB2YXJpYXRpb24gaW4gdGhlIGlucHV0IHZhcmlhYmxlLiBJbiBhZGRpdGlvbiwgdGhlIGZpcnN0IHR3byBlaWdlbnZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIDEgKDEuOTQgYW5kIDEuMjAgcmVzcGVjdGl2ZWx5KWluZGljYXRpbmcgdGhhdCBvbmx5IHRoZXNlIHR3byB2YWx1ZXMgc2F0aXNmaWVkIHRoZSBjb25kaXRpb24uIA0KDQoNCmBgYHtyfQ0KZnZpel9zY3JlZXBsb3QoZGF0YS5wYywgbmNwPTEwKQ0KYGBgDQoNCg0KYGBge3J9DQpkYXRhLnBjJHZhcg0KYGBgDQoNCkludGVyZXN0aW5nbHksIGxldmVsIG9mIHdvcnJ5LCBuZXJ2b3VzLCBvciBhbnhpb3VzIGZlZWxpbmdzICh3b3JmZWVsZXZsKSBpcyBub3QgdmVyeSBjb3JyZWxhdGVkIHdpdGggdGhlIHByaW5jaXBhbCBjb21wb25lbnQgdmFyaWFibGVzICgtMC4wNS4gDQoNCmBgYHtyfQ0KZnZpel9wY2FfdmFyKGRhdGEucGMsDQogICAgICAgICAgICAgY29sLnZhcj0gImNvbnRyaWIiKSsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCiANCiANCmBgYHtyfQ0KZnZpel9wY2FfaW5kKGRhdGEucGMsDQogICAgICAgICAgICAgbGFiZWw9ICJub25lIiwNCiAgICAgICAgICAgICBjb2wuaW5kPSAiY29zMiIpICsNCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGxvdz0gImJsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWlkPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgaGlnaD0gInJlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICBtaWRwb2ludCA9IC41KSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMgUmVwb3J0IHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIGNvcnJlbGF0aW9uIG1hdHJpeCBmb3IgeW91ciBkYXRhDQpgYGB7cn0NCmRlc2M8LSBkaW1kZXNjKGRhdGEucGMpDQpkZXNjJERpbS4xDQpgYGAgIA0KICAgICAgICAgICAgICAgICAgICAgIA0KDQpgYGB7cn0NCmRlc2MkRGltLjINCmBgYA0KDQpgYGB7cn0NCmRhdGEyJHBjMSA8LSBkYXRhLnBjJGluZCRjb29yZFssIDFdDQoNCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3UgPSAiYWRqdXN0IikNCmRlczwtIHN2eWRlc2lnbiggaWRzPSB+MSwNCiAgICAgICAgICAgICAgICAgc3RyYXRhID0gfnN0cmF0YSwNCiAgICAgICAgICAgICAgICAgd2VpZ2h0cz0gfnNhbXB3ZWlnaHQsDQogICAgICAgICAgICAgICAgIGRhdGE9IGRhdGEyKQ0KYGBgDQogIA0KTm93LCB0aGUgYW5hbHlzaXMgd2lsbCBsb29rIGF0IHZhcmlhdGlvbiBpbiBtZW50YWwgaGVhbHRoIGluZGV4IGFjcm9zcyBlZHVjYXRpb24gbGV2ZWwsIHJhY2UsIGFuZCBmYW1pbHkgaW5jb21lLiANCg0KYGBge3J9DQpnZ3Bsb3QoYWVzKHg9ZWR1Y19jYXQsIHk9cGMxKSwNCiAgICAgICBkYXRhPWRhdGEyKSArDQogIGdlb21fYm94cGxvdCgpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoYWVzKHg9cmFjZSwgeT1wYzEpLA0KICAgICAgIGRhdGE9ZGF0YTIpICsNCiAgZ2VvbV9ib3hwbG90KCkNCmBgYA0KYGBge3J9DQpnZ3Bsb3QoYWVzKHg9ZmFtaWx5aW5jb21lX2NhdCwgeT1wYzEpLA0KICAgICAgIGRhdGE9ZGF0YTIpICsNCiAgZ2VvbV9ib3hwbG90KCkNCmBgYA0KDQojIElmIGRlZW1lZCBhcHByb3ByaWF0ZSwgY29uZHVjdCBzb21lIHRlc3Rpbmcgb2YgeW91ciBpbmRleC9jb21wb25lbnRzL2xhdGVudCB2YXJpYWJsZXMuDQoNCmBgYHtyfQ0KZml0LjEgPC0gc3Z5Z2xtKHBjMX5lZHVjX2NhdCArZmFtaWx5aW5jb21lX2NhdCArIChyYWNlKSwNCiAgICAgICAgICAgICAgZGVzLA0KICAgICAgICAgICAgICBmYW1pbHk9IGdhdXNzaWFuKQ0Kc3VtbWFyeShmaXQuMSkNCg0KYGBgDQogDQpDb21wYXJlZCB0byB3b21lbiB3aXRoIEhTIERpcGxvbWEsIG1lbnRhbCBoZWFsdGggaW5kZXggaXMgbG93ZXIgYW1vbmcgdW5kZXJncmFkdWF0ZSBhbmQgTWFzdGVycyBkZWdyZWUgd2hlcmVhcyBpdCBpcyBoaWdoZXIgYW1vbmcgd29tZW4gd2l0aCBubyBzY2hvb2wgYW5kIHNvbWUgY29sbGVnZSBkZWdyZWUuIEluIHJlZ2FyZCB0byBmYW1pbHkgaW5jb21lLCB0aGUgbWVudGFsIGhlYWx0aCBpbmRleCBpcyBsb3dlciBhbW9uZyB3b21lbiB3aG8gaGF2ZSBoaWdoZXIgZmFtaWx5IGluY29tZSBidXQgcmVsYXRpdmVseSBoaWdoZXIgd2l0aCBpbmNvbWUgc3RhcnRpbmcgZnJvbSAzNS03NGsuIEZpbmFsbHksIGNvbXBhcmVkIHRvIEJsYWNrIHdvbWVuLCBtZW50YWwgaGVhbHRoIGluZGV4IGlzIGhpZ2hlciBhbW9uZyBXaGl0ZSB3b21lbiB3aGVyZWFzIGxvd2VyIGFtb25nIEFzaWFuIGFuZCBPdGhlciB3b21lbi4gDQogDQogDQogDQog