Lab Assignment #1

Agata Braja, Yu Wang

September 27, 2024

Load the Current Population Survey CSV file:

CPS <- read.csv("CPSData.csv", stringsAsFactors = TRUE)

Summary of the dataset:

summary(CPS)
 PeopleInHousehold       Region               State            Age                 Married     
 Min.   : 1.000    Midwest  :26337   California  :11362   Min.   : 0.00   Divorced     :11350  
 1st Qu.: 2.000    Northeast:21438   Texas       : 7562   1st Qu.:19.00   Married      :55839  
 Median : 3.000    South    :48488   Florida     : 5772   Median :39.00   Never Married:31723  
 Mean   : 3.288    West     :36436   New York    : 5278   Mean   :39.27   Separated    : 2018  
 3rd Qu.: 4.000                      Illinois    : 3870   3rd Qu.:58.00   Widowed      : 6616  
 Max.   :15.000                      Pennsylvania: 3646   Max.   :85.00   NA's         :25153  
                                     (Other)     :95209                                        
     Sex                          Education                   Race           Hispanic     
 Female:68051   High school            :30885   American Indian :  2003   Min.   :0.0000  
 Male  :64648   Bachelor's degree      :20283   Asian           :  6963   1st Qu.:0.0000  
                Some college, no degree:18861   Black           : 14564   Median :0.0000  
                No high school diploma :15878   Multiracial     :  2915   Mean   :0.1458  
                Associate degree       : 9983   Pacific Islander:   760   3rd Qu.:0.0000  
                (Other)                :11656   White           :105494   Max.   :1.0000  
                NA's                   :25153                                             
               Citizenship               EmploymentStatus                               Industry    
 Citizen, Native     :117628   Disabled          : 6150   Educational and health services   :15053  
 Citizen, Naturalized:  7138   Employed          :62518   Trade                             : 8769  
 Non-Citizen         :  7933   Not in Labor Force:15518   Professional and business services: 7749  
                               Retired           :19928   Manufacturing                     : 6523  
                               Unemployed        : 2989   Leisure and hospitality           : 6301  
                               NA's              :25596   (Other)                           :21663  
                                                          NA's                              :66641  

Part 1

Number of interviewees in the data set:

num_interviewees <- nrow(CPS)
cat("Number of interviewees:", num_interviewees, "\n")
Number of interviewees: 132699 

Number of numeric or integer variables in this dataset:

# Get numeric and integer columns
numeric_columns <- sapply(CPS, is.numeric)
# Count the number of numeric or integer variables
num_numeric_vars <- sum(numeric_columns)
cat("Number of numeric or integer variables:", num_numeric_vars, "\n")
Number of numeric or integer variables: 3 

Factor variable with largest number of unique values:

factor_columns <- sapply(CPS, is.factor)
# Get number of unique levels for each factor column
unique_values <- sapply(CPS[, factor_columns], function(x) length(unique(x)))
# Find the factor variable with the largest number of unique values
max_unique <- which.max(unique_values)
cat("Factor variable with the largest number of unique values:", names(unique_values)[max_unique], "\n")
Factor variable with the largest number of unique values: State 
# Create a data frame to display factor variable names and their unique value counts
factor_unique_values <- data.frame(Variable = names(unique_values), Unique_Values = unique_values)
cat("Unique values for each factor variable:\n")
Unique values for each factor variable:
print(factor_unique_values)

Part 2

Maximum, Median, and Mean values of the Age variable:

max_age <- max(CPS$Age, na.rm = TRUE)
median_age <- median(CPS$Age, na.rm = TRUE)
mean_age <- mean(CPS$Age, na.rm = TRUE)

cat("Maximum Age:", max_age, "\n")
Maximum Age: 85 
cat("Median Age:", median_age, "\n")
Median Age: 39 
cat("Mean Age:", mean_age, "\n")
Mean Age: 39.26807 

Most common industry among interviewees:

industry_data <- na.omit(CPS$Industry)
industry_counts <- table(industry_data)
most_common_industry <- names(industry_counts)[which.max(industry_counts)]
most_common_count <- max(industry_counts)
cat("Most common industry:", most_common_industry, "\n")
Most common industry: Educational and health services 
cat("Number of interviewees in this industry:", most_common_count, "\n")
Number of interviewees in this industry: 15053 

Proportion of interviewees who are citizens of the US:

total_interviewees <- nrow(CPS)
us_citizens <- sum(CPS$Citizenship %in% c("Citizen, Native", "Citizen, Naturalized"), na.rm = TRUE)
proportion_us_citizens <- us_citizens / total_interviewees

cat("Total number of interviewees:", total_interviewees, "\n")
Total number of interviewees: 132699 
cat("Number of US citizens:", us_citizens, "\n")
Number of US citizens: 124766 
cat("Proportion of interviewees who are US citizens:", round(proportion_us_citizens, 4), "\n")
Proportion of interviewees who are US citizens: 0.9402 

State with the fewest interviewees:

# Create a table of counts of interviewees by state
state_counts <- table(CPS$State)

# Sort the state counts in ascending order
sorted_state_counts <- sort(state_counts)

# Extract the state with the fewest interviewees and the corresponding count
state_with_fewest <- names(sorted_state_counts)[1]
count_with_fewest <- sorted_state_counts[1]

cat("State with the fewest interviewees:", state_with_fewest, "\n")
State with the fewest interviewees: Maine 
cat("Number of interviewees in this state:", count_with_fewest, "\n")
Number of interviewees in this state: 1190 

Races with at least 250 interviewees of Hispanic ethnicity:

hispanic_data <- CPS[CPS$Hispanic == "1", ]
race_counts <- table(hispanic_data$Race)
races_with_at_least_250 <- race_counts[race_counts >= 250]
cat("Races with at least 250 interviewees of Hispanic ethnicity:\n")
Races with at least 250 interviewees of Hispanic ethnicity:
print(races_with_at_least_250)

American Indian           Black     Multiracial           White 
            375             659             439           17617 

Part 3

Histogram of the number of people in the interviewee’s household:

hist(CPS$PeopleInHousehold,
     main = "Histogram of Household Size",
     xlab = "Number of People in Household",
     ylab = "Frequency",
     col = "lightblue")


cat("The most popular household size is 1. As the household size drops, the frequency of occurrence drops.\n")
The most popular household size is 1. As the household size drops, the frequency of occurrence drops.

Boxplot of the age by marital status:

boxplot(Age ~ Married,
        data = CPS,
        main = "Boxplot of Age by Marital Status",
        xlab = "Marital Status",
        ylab = "Age",
        col = "lightblue",
        border = "black",
        las = 2)


cat("The youngest group has never been married, and the eldest consists of widowers. It intuitively makes sense.\n")
The youngest group has never been married, and the eldest consists of widowers. It intuitively makes sense.

Boxplot of the age by employment status:

boxplot(Age ~ EmploymentStatus,
        data = CPS,
        main = "Boxplot of Age by Employment Status",
        xlab = "Employment Status",
        ylab = "Age",
        col = "lightblue",
        border = "black",
        las = 2)


cat("The youngest group is labor force and unemployed. The eldest consists of retirees. It intuitively makes sense.\n")
The youngest group is labor force and unemployed. The eldest consists of retirees. It intuitively makes sense.

Part 4

#Create a subset for interviewees from California
california_interviewees <- subset(CPS, State == "California")
education_employment_table <- table(california_interviewees$Education, california_interviewees$EmploymentStatus)

Probability that an individual is unemployed given their education level is Associate’s degree:

# Count the total number of interviewees with an Associate's degree
total_associates_degree <- sum(california_interviewees$Education == "Associate degree", na.rm = TRUE)
cat("Total interviewees with an Associate's degree:", total_associates_degree, "\n")
Total interviewees with an Associate's degree: 714 
associate_unemployed <- education_employment_table["Associate degree", "Unemployed"]  # Number of people with Associate's degree and unemployed
probability_associate_unemployed <- associate_unemployed / total_associates_degree
cat("Probability that someone with an Associate's degree is unemployed:", round(probability_associate_unemployed, 4), "\n")
Probability that someone with an Associate's degree is unemployed: 0.0322 

Probability that an individual is unemployed given their education level is Master’s degree:

# Count the total number of interviewees with a Master's degree
total_masters_degree <- sum(california_interviewees$Education == "Master's degree", na.rm = TRUE)
cat("Total interviewees with a Master's degree:", total_masters_degree, "\n")
Total interviewees with a Master's degree: 716 
masters_unemployed <- education_employment_table["Master's degree", "Unemployed"]  # Number of people with Master's degree and unemployed
probability_masters_unemployed <- masters_unemployed / total_masters_degree
cat("Probability that someone with a Master's degree is unemployed:", round(probability_masters_unemployed, 4), "\n")
Probability that someone with a Master's degree is unemployed: 0.0196 

Average age of California residents who work in the financial industry:

financial_industry_california <- subset(CPS, State == "California" & Industry == "Financial")
average_age_financial_industry <- mean(financial_industry_california$Age, na.rm = TRUE)
cat("Average age of California residents in the financial industry:", round(average_age_financial_industry, 2), "\n")
Average age of California residents in the financial industry: 45.91 

Average age of California residents who work in the leisure and hospitality industry:

leisure_hospitality_california <- subset(CPS, State == "California" & Industry == "Leisure and hospitality")
average_age_leisure_hospitality <- mean(leisure_hospitality_california$Age, na.rm = TRUE)
cat("Average age of California residents in the leisure and hospitality industry:", round(average_age_leisure_hospitality, 2), "\n")
Average age of California residents in the leisure and hospitality industry: 35.53 

Marital status and number of people in household:

# Calculate the mean number of people in household for each marital status
mean_people_in_household_by_marriage <- aggregate(PeopleInHousehold ~ Married, data = california_interviewees, FUN = mean, na.rm = TRUE)

# View the results
cat("Mean number of people in household by marital status:\n")
Mean number of people in household by marital status:
print(mean_people_in_household_by_marriage)

# Find the marital status with the largest and smallest mean value
largest_mean <- mean_people_in_household_by_marriage[which.max(mean_people_in_household_by_marriage$PeopleInHousehold), ]
smallest_mean <- mean_people_in_household_by_marriage[which.min(mean_people_in_household_by_marriage$PeopleInHousehold), ]

# Print the results
cat("Marital status with the largest mean household size:\n")
Marital status with the largest mean household size:
print(largest_mean)

cat("Marital status with the smallest mean household size:\n")
Marital status with the smallest mean household size:
print(smallest_mean)
LS0tCnRpdGxlOiAiRGF0YSAmIERlY2lzaW9ucyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMgKipMYWIgQXNzaWdubWVudCAjMSoqCiMjIyAqKkFnYXRhIEJyYWphLCBZdSBXYW5nKioKKipTZXB0ZW1iZXIgMjcsIDIwMjQqKgoKCkxvYWQgdGhlIEN1cnJlbnQgUG9wdWxhdGlvbiBTdXJ2ZXkgQ1NWIGZpbGU6CmBgYHtyfQpDUFMgPC0gcmVhZC5jc3YoIkNQU0RhdGEuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IFRSVUUpCmBgYAoKClN1bW1hcnkgb2YgdGhlIGRhdGFzZXQ6CmBgYHtyfQpzdW1tYXJ5KENQUykKYGBgCgoKIyMjICoqUGFydCAxKioKCk51bWJlciBvZiBpbnRlcnZpZXdlZXMgaW4gdGhlIGRhdGEgc2V0OgpgYGB7cn0KbnVtX2ludGVydmlld2VlcyA8LSBucm93KENQUykKY2F0KCJOdW1iZXIgb2YgaW50ZXJ2aWV3ZWVzOiIsIG51bV9pbnRlcnZpZXdlZXMsICJcbiIpCmBgYAoKTnVtYmVyIG9mIG51bWVyaWMgb3IgaW50ZWdlciB2YXJpYWJsZXMgaW4gdGhpcyBkYXRhc2V0OgpgYGB7cn0KIyBHZXQgbnVtZXJpYyBhbmQgaW50ZWdlciBjb2x1bW5zCm51bWVyaWNfY29sdW1ucyA8LSBzYXBwbHkoQ1BTLCBpcy5udW1lcmljKQojIENvdW50IHRoZSBudW1iZXIgb2YgbnVtZXJpYyBvciBpbnRlZ2VyIHZhcmlhYmxlcwpudW1fbnVtZXJpY192YXJzIDwtIHN1bShudW1lcmljX2NvbHVtbnMpCmNhdCgiTnVtYmVyIG9mIG51bWVyaWMgb3IgaW50ZWdlciB2YXJpYWJsZXM6IiwgbnVtX251bWVyaWNfdmFycywgIlxuIikKYGBgCgpGYWN0b3IgdmFyaWFibGUgd2l0aCBsYXJnZXN0IG51bWJlciBvZiB1bmlxdWUgdmFsdWVzOgpgYGB7cn0KZmFjdG9yX2NvbHVtbnMgPC0gc2FwcGx5KENQUywgaXMuZmFjdG9yKQojIEdldCBudW1iZXIgb2YgdW5pcXVlIGxldmVscyBmb3IgZWFjaCBmYWN0b3IgY29sdW1uCnVuaXF1ZV92YWx1ZXMgPC0gc2FwcGx5KENQU1ssIGZhY3Rvcl9jb2x1bW5zXSwgZnVuY3Rpb24oeCkgbGVuZ3RoKHVuaXF1ZSh4KSkpCiMgRmluZCB0aGUgZmFjdG9yIHZhcmlhYmxlIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVuaXF1ZSB2YWx1ZXMKbWF4X3VuaXF1ZSA8LSB3aGljaC5tYXgodW5pcXVlX3ZhbHVlcykKY2F0KCJGYWN0b3IgdmFyaWFibGUgd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pcXVlIHZhbHVlczoiLCBuYW1lcyh1bmlxdWVfdmFsdWVzKVttYXhfdW5pcXVlXSwgIlxuIikKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB0byBkaXNwbGF5IGZhY3RvciB2YXJpYWJsZSBuYW1lcyBhbmQgdGhlaXIgdW5pcXVlIHZhbHVlIGNvdW50cwpmYWN0b3JfdW5pcXVlX3ZhbHVlcyA8LSBkYXRhLmZyYW1lKFZhcmlhYmxlID0gbmFtZXModW5pcXVlX3ZhbHVlcyksIFVuaXF1ZV9WYWx1ZXMgPSB1bmlxdWVfdmFsdWVzKQpjYXQoIlVuaXF1ZSB2YWx1ZXMgZm9yIGVhY2ggZmFjdG9yIHZhcmlhYmxlOlxuIikKcHJpbnQoZmFjdG9yX3VuaXF1ZV92YWx1ZXMpCmBgYAoKIyMjICoqUGFydCAyKioKCk1heGltdW0sIE1lZGlhbiwgYW5kIE1lYW4gdmFsdWVzIG9mIHRoZSBBZ2UgdmFyaWFibGU6CmBgYHtyfQptYXhfYWdlIDwtIG1heChDUFMkQWdlLCBuYS5ybSA9IFRSVUUpCm1lZGlhbl9hZ2UgPC0gbWVkaWFuKENQUyRBZ2UsIG5hLnJtID0gVFJVRSkKbWVhbl9hZ2UgPC0gbWVhbihDUFMkQWdlLCBuYS5ybSA9IFRSVUUpCgpjYXQoIk1heGltdW0gQWdlOiIsIG1heF9hZ2UsICJcbiIpCmNhdCgiTWVkaWFuIEFnZToiLCBtZWRpYW5fYWdlLCAiXG4iKQpjYXQoIk1lYW4gQWdlOiIsIG1lYW5fYWdlLCAiXG4iKQpgYGAKCk1vc3QgY29tbW9uIGluZHVzdHJ5IGFtb25nIGludGVydmlld2VlczoKYGBge3J9CmluZHVzdHJ5X2RhdGEgPC0gbmEub21pdChDUFMkSW5kdXN0cnkpCmluZHVzdHJ5X2NvdW50cyA8LSB0YWJsZShpbmR1c3RyeV9kYXRhKQptb3N0X2NvbW1vbl9pbmR1c3RyeSA8LSBuYW1lcyhpbmR1c3RyeV9jb3VudHMpW3doaWNoLm1heChpbmR1c3RyeV9jb3VudHMpXQptb3N0X2NvbW1vbl9jb3VudCA8LSBtYXgoaW5kdXN0cnlfY291bnRzKQpjYXQoIk1vc3QgY29tbW9uIGluZHVzdHJ5OiIsIG1vc3RfY29tbW9uX2luZHVzdHJ5LCAiXG4iKQpjYXQoIk51bWJlciBvZiBpbnRlcnZpZXdlZXMgaW4gdGhpcyBpbmR1c3RyeToiLCBtb3N0X2NvbW1vbl9jb3VudCwgIlxuIikKYGBgCgpQcm9wb3J0aW9uIG9mIGludGVydmlld2VlcyB3aG8gYXJlIGNpdGl6ZW5zIG9mIHRoZSBVUzoKYGBge3J9CnRvdGFsX2ludGVydmlld2VlcyA8LSBucm93KENQUykKdXNfY2l0aXplbnMgPC0gc3VtKENQUyRDaXRpemVuc2hpcCAlaW4lIGMoIkNpdGl6ZW4sIE5hdGl2ZSIsICJDaXRpemVuLCBOYXR1cmFsaXplZCIpLCBuYS5ybSA9IFRSVUUpCnByb3BvcnRpb25fdXNfY2l0aXplbnMgPC0gdXNfY2l0aXplbnMgLyB0b3RhbF9pbnRlcnZpZXdlZXMKCmNhdCgiVG90YWwgbnVtYmVyIG9mIGludGVydmlld2VlczoiLCB0b3RhbF9pbnRlcnZpZXdlZXMsICJcbiIpCmNhdCgiTnVtYmVyIG9mIFVTIGNpdGl6ZW5zOiIsIHVzX2NpdGl6ZW5zLCAiXG4iKQpjYXQoIlByb3BvcnRpb24gb2YgaW50ZXJ2aWV3ZWVzIHdobyBhcmUgVVMgY2l0aXplbnM6Iiwgcm91bmQocHJvcG9ydGlvbl91c19jaXRpemVucywgNCksICJcbiIpCmBgYAoKU3RhdGUgd2l0aCB0aGUgZmV3ZXN0IGludGVydmlld2VlczoKYGBge3J9CiMgQ3JlYXRlIGEgdGFibGUgb2YgY291bnRzIG9mIGludGVydmlld2VlcyBieSBzdGF0ZQpzdGF0ZV9jb3VudHMgPC0gdGFibGUoQ1BTJFN0YXRlKQoKIyBTb3J0IHRoZSBzdGF0ZSBjb3VudHMgaW4gYXNjZW5kaW5nIG9yZGVyCnNvcnRlZF9zdGF0ZV9jb3VudHMgPC0gc29ydChzdGF0ZV9jb3VudHMpCgojIEV4dHJhY3QgdGhlIHN0YXRlIHdpdGggdGhlIGZld2VzdCBpbnRlcnZpZXdlZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvdW50CnN0YXRlX3dpdGhfZmV3ZXN0IDwtIG5hbWVzKHNvcnRlZF9zdGF0ZV9jb3VudHMpWzFdCmNvdW50X3dpdGhfZmV3ZXN0IDwtIHNvcnRlZF9zdGF0ZV9jb3VudHNbMV0KCmNhdCgiU3RhdGUgd2l0aCB0aGUgZmV3ZXN0IGludGVydmlld2VlczoiLCBzdGF0ZV93aXRoX2Zld2VzdCwgIlxuIikKY2F0KCJOdW1iZXIgb2YgaW50ZXJ2aWV3ZWVzIGluIHRoaXMgc3RhdGU6IiwgY291bnRfd2l0aF9mZXdlc3QsICJcbiIpCmBgYAoKClJhY2VzIHdpdGggYXQgbGVhc3QgMjUwIGludGVydmlld2VlcyBvZiBIaXNwYW5pYyBldGhuaWNpdHk6CmBgYHtyfQpoaXNwYW5pY19kYXRhIDwtIENQU1tDUFMkSGlzcGFuaWMgPT0gIjEiLCBdCnJhY2VfY291bnRzIDwtIHRhYmxlKGhpc3BhbmljX2RhdGEkUmFjZSkKcmFjZXNfd2l0aF9hdF9sZWFzdF8yNTAgPC0gcmFjZV9jb3VudHNbcmFjZV9jb3VudHMgPj0gMjUwXQpjYXQoIlJhY2VzIHdpdGggYXQgbGVhc3QgMjUwIGludGVydmlld2VlcyBvZiBIaXNwYW5pYyBldGhuaWNpdHk6XG4iKQpwcmludChyYWNlc193aXRoX2F0X2xlYXN0XzI1MCkKYGBgCgojIyMgKipQYXJ0IDMqKgoKSGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2YgcGVvcGxlIGluIHRoZSBpbnRlcnZpZXdlZSdzIGhvdXNlaG9sZDoKYGBge3J9Cmhpc3QoQ1BTJFBlb3BsZUluSG91c2Vob2xkLAogICAgIG1haW4gPSAiSGlzdG9ncmFtIG9mIEhvdXNlaG9sZCBTaXplIiwKICAgICB4bGFiID0gIk51bWJlciBvZiBQZW9wbGUgaW4gSG91c2Vob2xkIiwKICAgICB5bGFiID0gIkZyZXF1ZW5jeSIsCiAgICAgY29sID0gImxpZ2h0Ymx1ZSIpCgpjYXQoIlRoZSBtb3N0IHBvcHVsYXIgaG91c2Vob2xkIHNpemUgaXMgMS4gQXMgdGhlIGhvdXNlaG9sZCBzaXplIGRyb3BzLCB0aGUgZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UgZHJvcHMuXG4iKQpgYGAKCkJveHBsb3Qgb2YgdGhlIGFnZSBieSBtYXJpdGFsIHN0YXR1czogCmBgYHtyfQpib3hwbG90KEFnZSB+IE1hcnJpZWQsCiAgICAgICAgZGF0YSA9IENQUywKICAgICAgICBtYWluID0gIkJveHBsb3Qgb2YgQWdlIGJ5IE1hcml0YWwgU3RhdHVzIiwKICAgICAgICB4bGFiID0gIk1hcml0YWwgU3RhdHVzIiwKICAgICAgICB5bGFiID0gIkFnZSIsCiAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgYm9yZGVyID0gImJsYWNrIiwKICAgICAgICBsYXMgPSAyKQoKY2F0KCJUaGUgeW91bmdlc3QgZ3JvdXAgaGFzIG5ldmVyIGJlZW4gbWFycmllZCwgYW5kIHRoZSBlbGRlc3QgY29uc2lzdHMgb2Ygd2lkb3dlcnMuIEl0IGludHVpdGl2ZWx5IG1ha2VzIHNlbnNlLlxuIikKYGBgCgpCb3hwbG90IG9mIHRoZSBhZ2UgYnkgZW1wbG95bWVudCBzdGF0dXM6CmBgYHtyfQpib3hwbG90KEFnZSB+IEVtcGxveW1lbnRTdGF0dXMsCiAgICAgICAgZGF0YSA9IENQUywKICAgICAgICBtYWluID0gIkJveHBsb3Qgb2YgQWdlIGJ5IEVtcGxveW1lbnQgU3RhdHVzIiwKICAgICAgICB4bGFiID0gIkVtcGxveW1lbnQgU3RhdHVzIiwKICAgICAgICB5bGFiID0gIkFnZSIsCiAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgYm9yZGVyID0gImJsYWNrIiwKICAgICAgICBsYXMgPSAyKQoKY2F0KCJUaGUgeW91bmdlc3QgZ3JvdXAgaXMgbGFib3IgZm9yY2UgYW5kIHVuZW1wbG95ZWQuIFRoZSBlbGRlc3QgY29uc2lzdHMgb2YgcmV0aXJlZXMuIEl0IGludHVpdGl2ZWx5IG1ha2VzIHNlbnNlLlxuIikKYGBgCgojIyMgKipQYXJ0IDQqKgoKYGBge3J9CiNDcmVhdGUgYSBzdWJzZXQgZm9yIGludGVydmlld2VlcyBmcm9tIENhbGlmb3JuaWEKY2FsaWZvcm5pYV9pbnRlcnZpZXdlZXMgPC0gc3Vic2V0KENQUywgU3RhdGUgPT0gIkNhbGlmb3JuaWEiKQplZHVjYXRpb25fZW1wbG95bWVudF90YWJsZSA8LSB0YWJsZShjYWxpZm9ybmlhX2ludGVydmlld2VlcyRFZHVjYXRpb24sIGNhbGlmb3JuaWFfaW50ZXJ2aWV3ZWVzJEVtcGxveW1lbnRTdGF0dXMpCmBgYAoKUHJvYmFiaWxpdHkgdGhhdCBhbiBpbmRpdmlkdWFsIGlzIHVuZW1wbG95ZWQgZ2l2ZW4gdGhlaXIgZWR1Y2F0aW9uIGxldmVsIGlzIEFzc29jaWF0ZSdzIGRlZ3JlZToKYGBge3J9CiMgQ291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBpbnRlcnZpZXdlZXMgd2l0aCBhbiBBc3NvY2lhdGUncyBkZWdyZWUKdG90YWxfYXNzb2NpYXRlc19kZWdyZWUgPC0gc3VtKGNhbGlmb3JuaWFfaW50ZXJ2aWV3ZWVzJEVkdWNhdGlvbiA9PSAiQXNzb2NpYXRlIGRlZ3JlZSIsIG5hLnJtID0gVFJVRSkKY2F0KCJUb3RhbCBpbnRlcnZpZXdlZXMgd2l0aCBhbiBBc3NvY2lhdGUncyBkZWdyZWU6IiwgdG90YWxfYXNzb2NpYXRlc19kZWdyZWUsICJcbiIpCgphc3NvY2lhdGVfdW5lbXBsb3llZCA8LSBlZHVjYXRpb25fZW1wbG95bWVudF90YWJsZVsiQXNzb2NpYXRlIGRlZ3JlZSIsICJVbmVtcGxveWVkIl0gICMgTnVtYmVyIG9mIHBlb3BsZSB3aXRoIEFzc29jaWF0ZSdzIGRlZ3JlZSBhbmQgdW5lbXBsb3llZApwcm9iYWJpbGl0eV9hc3NvY2lhdGVfdW5lbXBsb3llZCA8LSBhc3NvY2lhdGVfdW5lbXBsb3llZCAvIHRvdGFsX2Fzc29jaWF0ZXNfZGVncmVlCmNhdCgiUHJvYmFiaWxpdHkgdGhhdCBzb21lb25lIHdpdGggYW4gQXNzb2NpYXRlJ3MgZGVncmVlIGlzIHVuZW1wbG95ZWQ6Iiwgcm91bmQocHJvYmFiaWxpdHlfYXNzb2NpYXRlX3VuZW1wbG95ZWQsIDQpLCAiXG4iKQpgYGAKClByb2JhYmlsaXR5IHRoYXQgYW4gaW5kaXZpZHVhbCBpcyB1bmVtcGxveWVkIGdpdmVuIHRoZWlyIGVkdWNhdGlvbiBsZXZlbCBpcyBNYXN0ZXIncyBkZWdyZWU6CmBgYHtyfQojIENvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgaW50ZXJ2aWV3ZWVzIHdpdGggYSBNYXN0ZXIncyBkZWdyZWUKdG90YWxfbWFzdGVyc19kZWdyZWUgPC0gc3VtKGNhbGlmb3JuaWFfaW50ZXJ2aWV3ZWVzJEVkdWNhdGlvbiA9PSAiTWFzdGVyJ3MgZGVncmVlIiwgbmEucm0gPSBUUlVFKQpjYXQoIlRvdGFsIGludGVydmlld2VlcyB3aXRoIGEgTWFzdGVyJ3MgZGVncmVlOiIsIHRvdGFsX21hc3RlcnNfZGVncmVlLCAiXG4iKQoKbWFzdGVyc191bmVtcGxveWVkIDwtIGVkdWNhdGlvbl9lbXBsb3ltZW50X3RhYmxlWyJNYXN0ZXIncyBkZWdyZWUiLCAiVW5lbXBsb3llZCJdICAjIE51bWJlciBvZiBwZW9wbGUgd2l0aCBNYXN0ZXIncyBkZWdyZWUgYW5kIHVuZW1wbG95ZWQKcHJvYmFiaWxpdHlfbWFzdGVyc191bmVtcGxveWVkIDwtIG1hc3RlcnNfdW5lbXBsb3llZCAvIHRvdGFsX21hc3RlcnNfZGVncmVlCmNhdCgiUHJvYmFiaWxpdHkgdGhhdCBzb21lb25lIHdpdGggYSBNYXN0ZXIncyBkZWdyZWUgaXMgdW5lbXBsb3llZDoiLCByb3VuZChwcm9iYWJpbGl0eV9tYXN0ZXJzX3VuZW1wbG95ZWQsIDQpLCAiXG4iKQpgYGAKCkF2ZXJhZ2UgYWdlIG9mIENhbGlmb3JuaWEgcmVzaWRlbnRzIHdobyB3b3JrIGluIHRoZSBmaW5hbmNpYWwgaW5kdXN0cnk6CmBgYHtyfQpmaW5hbmNpYWxfaW5kdXN0cnlfY2FsaWZvcm5pYSA8LSBzdWJzZXQoQ1BTLCBTdGF0ZSA9PSAiQ2FsaWZvcm5pYSIgJiBJbmR1c3RyeSA9PSAiRmluYW5jaWFsIikKYXZlcmFnZV9hZ2VfZmluYW5jaWFsX2luZHVzdHJ5IDwtIG1lYW4oZmluYW5jaWFsX2luZHVzdHJ5X2NhbGlmb3JuaWEkQWdlLCBuYS5ybSA9IFRSVUUpCmNhdCgiQXZlcmFnZSBhZ2Ugb2YgQ2FsaWZvcm5pYSByZXNpZGVudHMgaW4gdGhlIGZpbmFuY2lhbCBpbmR1c3RyeToiLCByb3VuZChhdmVyYWdlX2FnZV9maW5hbmNpYWxfaW5kdXN0cnksIDIpLCAiXG4iKQpgYGAKCkF2ZXJhZ2UgYWdlIG9mIENhbGlmb3JuaWEgcmVzaWRlbnRzIHdobyB3b3JrIGluIHRoZSBsZWlzdXJlIGFuZCBob3NwaXRhbGl0eSBpbmR1c3RyeToKYGBge3J9CmxlaXN1cmVfaG9zcGl0YWxpdHlfY2FsaWZvcm5pYSA8LSBzdWJzZXQoQ1BTLCBTdGF0ZSA9PSAiQ2FsaWZvcm5pYSIgJiBJbmR1c3RyeSA9PSAiTGVpc3VyZSBhbmQgaG9zcGl0YWxpdHkiKQphdmVyYWdlX2FnZV9sZWlzdXJlX2hvc3BpdGFsaXR5IDwtIG1lYW4obGVpc3VyZV9ob3NwaXRhbGl0eV9jYWxpZm9ybmlhJEFnZSwgbmEucm0gPSBUUlVFKQpjYXQoIkF2ZXJhZ2UgYWdlIG9mIENhbGlmb3JuaWEgcmVzaWRlbnRzIGluIHRoZSBsZWlzdXJlIGFuZCBob3NwaXRhbGl0eSBpbmR1c3RyeToiLCByb3VuZChhdmVyYWdlX2FnZV9sZWlzdXJlX2hvc3BpdGFsaXR5LCAyKSwgIlxuIikKYGBgCgpNYXJpdGFsIHN0YXR1cyBhbmQgbnVtYmVyIG9mIHBlb3BsZSBpbiBob3VzZWhvbGQ6CmBgYHtyfQojIENhbGN1bGF0ZSB0aGUgbWVhbiBudW1iZXIgb2YgcGVvcGxlIGluIGhvdXNlaG9sZCBmb3IgZWFjaCBtYXJpdGFsIHN0YXR1cwptZWFuX3Blb3BsZV9pbl9ob3VzZWhvbGRfYnlfbWFycmlhZ2UgPC0gYWdncmVnYXRlKFBlb3BsZUluSG91c2Vob2xkIH4gTWFycmllZCwgZGF0YSA9IGNhbGlmb3JuaWFfaW50ZXJ2aWV3ZWVzLCBGVU4gPSBtZWFuLCBuYS5ybSA9IFRSVUUpCgojIFZpZXcgdGhlIHJlc3VsdHMKY2F0KCJNZWFuIG51bWJlciBvZiBwZW9wbGUgaW4gaG91c2Vob2xkIGJ5IG1hcml0YWwgc3RhdHVzOlxuIikKcHJpbnQobWVhbl9wZW9wbGVfaW5faG91c2Vob2xkX2J5X21hcnJpYWdlKQoKIyBGaW5kIHRoZSBtYXJpdGFsIHN0YXR1cyB3aXRoIHRoZSBsYXJnZXN0IGFuZCBzbWFsbGVzdCBtZWFuIHZhbHVlCmxhcmdlc3RfbWVhbiA8LSBtZWFuX3Blb3BsZV9pbl9ob3VzZWhvbGRfYnlfbWFycmlhZ2Vbd2hpY2gubWF4KG1lYW5fcGVvcGxlX2luX2hvdXNlaG9sZF9ieV9tYXJyaWFnZSRQZW9wbGVJbkhvdXNlaG9sZCksIF0Kc21hbGxlc3RfbWVhbiA8LSBtZWFuX3Blb3BsZV9pbl9ob3VzZWhvbGRfYnlfbWFycmlhZ2Vbd2hpY2gubWluKG1lYW5fcGVvcGxlX2luX2hvdXNlaG9sZF9ieV9tYXJyaWFnZSRQZW9wbGVJbkhvdXNlaG9sZCksIF0KCiMgUHJpbnQgdGhlIHJlc3VsdHMKY2F0KCJNYXJpdGFsIHN0YXR1cyB3aXRoIHRoZSBsYXJnZXN0IG1lYW4gaG91c2Vob2xkIHNpemU6XG4iKQpwcmludChsYXJnZXN0X21lYW4pCgpjYXQoIk1hcml0YWwgc3RhdHVzIHdpdGggdGhlIHNtYWxsZXN0IG1lYW4gaG91c2Vob2xkIHNpemU6XG4iKQpwcmludChzbWFsbGVzdF9tZWFuKQpgYGA=