Kaitlin Kavlie PSYC-541

Survey Project: Activity Levels in the Summer versus the Winter

The survey I created consists of questions regarding participants’ activity and energy level in the summer, as well as in the winter. Before importing the data I ran the packages shown below.

library(tidyverse)
library(readxl)

Then I uploaded the Google spread sheet of the data from the responses to my survey and named the data file sw_survey.

sw_survey <- read_csv("https://docs.google.com/spreadsheets/d/1Aec21e0zJASMMHmRY3M0B2OGcjHz8hfGpO9j15pDRoE/export?format=csv")
Rows: 34 Columns: 19
-- Column specification ----------------------------------------------
Delimiter: ","
chr (19): Timestamp, On average, how often do you go outside to en...
Warning in theme$parsed :
  closing unused connection 4 (https://docs.google.com/forms/d/19aeoWh1AqQyxvH1q2OIEzWl5VRBQlKbhYFcwIed1BD4/export?format=csv)
Warning in theme$parsed :
  closing unused connection 3 (https://docs.google.com/forms/d/19aeoWh1AqQyxvH1q2OIEzWl5VRBQlKbhYFcwIed1BD4/export?format=csv)

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.

I ran the code below to examine the raw data and variables.

glimpse(sw_survey) 
Rows: 34
Columns: 19
$ Timestamp                                                                                      <chr> ~
$ `On average, how often do you go outside to enjoy nature in the summer?`                       <chr> ~
$ `On average, how often do you go outside to enjoy nature in the winter?`                       <chr> ~
$ `On average, how often do you enjoy the weather in the summer?`                                <chr> ~
$ `On average, how often do you enjoy the weather in the winter?`                                <chr> ~
$ `On average, how productive do you feel in the summer?`                                        <chr> ~
$ `On average, how productive do you feel in the winter?`                                        <chr> ~
$ `How frequently do you feel like you are "in a good mood" in the summer?`                      <chr> ~
$ `How frequently do you feel like you are "in a good mood" in the winter?`                      <chr> ~
$ `On average, how sufficient would you rate your energy levels in the summer?`                  <chr> ~
$ `On average, how sufficient would you rate your energy levels in the winter?`                  <chr> ~
$ `How often do you enjoy outdoor hobbies in the summer?`                                        <chr> ~
$ `How often do you enjoy outdoor hobbies in the winter?`                                        <chr> ~
$ `How often do you enjoy indoor hobbies in the summer?`                                         <chr> ~
$ `How often do you enjoy indoor hobbies in the winter?`                                         <chr> ~
$ `How often do you feel like you are "just trying to get by" in the summer?`                    <chr> ~
$ `How often do you feel like you are "just trying to get by" in the winter?`                    <chr> ~
$ `In the summer, how often do you experience a loss of interest in things you typically enjoy?` <chr> ~
$ `In the winter, how often do you experience a loss of interest in things you typically enjoy?` <chr> ~

Then I ran the code chunk below to change the names of the survey questions or variables to simpler terms.

sw_survey <- sw_survey %>%
  rename(nature_s = `On average, how often do you go outside to enjoy nature in the summer?`) %>%
  rename(nature_w = `On average, how often do you go outside to enjoy nature in the winter?`) %>%
  rename(weather_s = `On average, how often do you enjoy the weather in the summer?`) %>%
  rename(weather_w = `On average, how often do you enjoy the weather in the winter?`) %>%
  rename(productive_s = `On average, how productive do you feel in the summer?`) %>%
  rename(productive_w = `On average, how productive do you feel in the winter?`) %>%
  rename(mood_s = `How frequently do you feel like you are "in a good mood" in the summer?`) %>%
  rename(mood_w = `How frequently do you feel like you are "in a good mood" in the winter?`) %>%
  rename(energy_s = `On average, how sufficient would you rate your energy levels in the summer?`) %>%
  rename(energy_w = `On average, how sufficient would you rate your energy levels in the winter?`) %>%
  rename(outhob_s = `How often do you enjoy outdoor hobbies in the summer?`) %>%
  rename(outhob_w = `How often do you enjoy outdoor hobbies in the winter?`) %>%
  rename(inhob_s = `How often do you enjoy indoor hobbies in the summer?`) %>%
  rename(inhob_w = `How often do you enjoy indoor hobbies in the winter?`) %>%
  rename(getby_s = `How often do you feel like you are "just trying to get by" in the summer?`) %>%
  rename(getby_w = `How often do you feel like you are "just trying to get by" in the winter?`) %>%
  rename(loss_s = `In the summer, how often do you experience a loss of interest in things you typically enjoy?`) %>%
  rename(loss_w = `In the winter, how often do you experience a loss of interest in things you typically enjoy?`) 

Then I re-coded values for the question response options using the code below. Higher numbers coordinate with higher mood, activity, and energy levels. Lower numbers coordinate with lower mood, activity, and energy levels.

sw_survey <- sw_survey %>%
  mutate(nature_s = recode(nature_s,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(nature_w = recode(nature_w,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(weather_s = recode(weather_s,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(weather_w = recode(weather_w,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(productive_s = recode(productive_s,
                           "Not productive at all" = 1,
                           "Somewhat productive" = 2,
                           "Moderately productive" = 3,
                           "Very productive" = 4)) %>%
  mutate(productive_w = recode(productive_w,
                           "Not productive at all" = 1,
                           "Somewhat productive" = 2,
                           "Moderately productive" = 3,
                           "Very productive" = 4)) %>%
  mutate(mood_s = recode(mood_s,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(mood_w = recode(mood_w,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(energy_s = recode(energy_s,
                           "Not sufficient at all" = 1,
                           "Somewhat sufficient" = 2,
                           "Moderately sufficient" = 3,
                           "Very sufficient" = 4)) %>%
  mutate(energy_w = recode(energy_w,
                           "Not sufficient at all" = 1,
                           "Somewhat sufficient" = 2,
                           "Moderately sufficient" = 3,
                           "Very sufficient" = 4)) %>%
  mutate(outhob_s = recode(outhob_s,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(outhob_w = recode(outhob_w,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(inhob_s = recode(inhob_s,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(inhob_w = recode(inhob_w,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(getby_s = recode(getby_s,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(getby_w = recode(getby_w,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(loss_s = recode(loss_s,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) %>%
  mutate(loss_w = recode(loss_w,
                           "Rarely or never" = 1,
                           "Once a week" = 2,
                           "A few days a week" = 3,
                           "Nearly everyday" = 4)) 

I ran the code below to obtain some basic descriptive statistics of the data.

summary(sw_survey)
  Timestamp            nature_s        nature_w   weather_s       weather_w      productive_s    productive_w       mood_s          mood_w         energy_s    
 Length:34          Min.   :1.000   Min.   :1   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :3.000   Min.   :1.000   Min.   :2.000  
 Class :character   1st Qu.:3.000   1st Qu.:1   1st Qu.:3.000   1st Qu.:1.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:3.000  
 Mode  :character   Median :3.500   Median :2   Median :4.000   Median :2.500   Median :3.500   Median :2.000   Median :4.000   Median :3.000   Median :3.000  
                    Mean   :3.382   Mean   :2   Mean   :3.441   Mean   :2.324   Mean   :3.324   Mean   :2.294   Mean   :3.676   Mean   :2.647   Mean   :3.382  
                    3rd Qu.:4.000   3rd Qu.:3   3rd Qu.:4.000   3rd Qu.:3.000   3rd Qu.:4.000   3rd Qu.:3.000   3rd Qu.:4.000   3rd Qu.:3.000   3rd Qu.:4.000  
                    Max.   :4.000   Max.   :4   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000  
    energy_w        outhob_s        outhob_w        inhob_s         inhob_w         getby_s         getby_w          loss_s          loss_w     
 Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 1st Qu.:2.000   1st Qu.:3.000   1st Qu.:1.000   1st Qu.:2.000   1st Qu.:3.000   1st Qu.:1.000   1st Qu.:2.000   1st Qu.:1.000   1st Qu.:2.000  
 Median :2.000   Median :3.000   Median :1.500   Median :3.000   Median :3.000   Median :1.500   Median :3.000   Median :1.000   Median :3.000  
 Mean   :2.176   Mean   :3.265   Mean   :1.853   Mean   :2.676   Mean   :3.118   Mean   :1.706   Mean   :2.618   Mean   :1.294   Mean   :2.559  
 3rd Qu.:3.000   3rd Qu.:4.000   3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:4.000   3rd Qu.:2.000   3rd Qu.:3.000   3rd Qu.:1.000   3rd Qu.:3.000  
 Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :3.000   Max.   :4.000  

Then I ran correlation tests for each of the question pairs. The null hypothesis is that there is no statistically significant difference between the responses to questions (activity level, mood, loss of interest) for the summer versus the winter. The alternative hypothesis is that there is a statistically significant difference in responses for summer and winter.

The code below is a correlation test for how often people enjoy nature in the summer vs the winter. The results show a degrees of freedom of 32, a t value of 1.6, and a p-value of 0.12. These results indicate that I fail to reject the null hypothesis, meaning that there is no statistically significant difference between summer and winter for this question. The correlation of 0.27 indicates a weak correlation between the two variables.

cor.test(sw_survey$nature_s, sw_survey$nature_w)

    Pearson's product-moment correlation

data:  sw_survey$nature_s and sw_survey$nature_w
t = 1.6165, df = 32, p-value = 0.1158
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.06989875  0.56081883
sample estimates:
      cor 
0.2747616 

The code below is a correlation test for how often people enjoy the weather in the summer vs the winter. The results show a degrees of freedom of 32, a t value of -0.9, and a p-value of 0.33. These results indicate that I fail to reject the null hypothesis, meaning that there is no statistically significant difference between summer and winter for this question. The correlation of -0.17 indicates a weak negative correlation between the two variables.

cor.test(sw_survey$weather_s, sw_survey$weather_w)

    Pearson's product-moment correlation

data:  sw_survey$weather_s and sw_survey$weather_w
t = -0.98612, df = 32, p-value = 0.3315
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.4819120  0.1766941
sample estimates:
      cor 
-0.171733 

The code below is a correlation test for how productive people feel they are in the summer vs the winter. The results show a degrees of freedom of 32, a t value of -3.5, and a p-value of 0.0014. According to the p-value, these results indicate that I am forced to reject the null hypothesis, meaning that there is a statistically significant difference between summer and winter for this question. The correlation of -0.5 indicates a moderate negative correlation between the two variables.

cor.test(sw_survey$productive_s, sw_survey$productive_w)

    Pearson's product-moment correlation

data:  sw_survey$productive_s and sw_survey$productive_w
t = -3.4942, df = 32, p-value = 0.001415
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.7333586 -0.2278456
sample estimates:
       cor 
-0.5255202 

The code below is a correlation test for how often people are ‘in a good mood’ in the summer vs the winter. The results show a degrees of freedom of 32, a t value of 0.04, and a p-value of 0.96. According to the p-value, these results indicate that I fail to reject the null hypothesis, meaning that there is no statistically significant difference between summer and winter for this question. The correlation of 0.007 indicates a very weak correlation between the two variables.

cor.test(sw_survey$mood_s, sw_survey$mood_w)

    Pearson's product-moment correlation

data:  sw_survey$mood_s and sw_survey$mood_w
t = 0.043289, df = 32, p-value = 0.9657
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.3313710  0.3449254
sample estimates:
        cor 
0.007652227 

The code below is a correlation test for how people rate their energy levels in the summer vs the winter. The results show a degrees of freedom of 32, a t value of -1.6, and a p-value of 0.12. These results indicate that I fail to reject the null hypothesis, meaning that there is no statistically significant difference between summer and winter for this question. The correlation of -0.27 indicates a weak negative correlation between the two variables.

cor.test(sw_survey$energy_s, sw_survey$energy_w)

    Pearson's product-moment correlation

data:  sw_survey$energy_s and sw_survey$energy_w
t = -1.5898, df = 32, p-value = 0.1217
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.55769374  0.07442243
sample estimates:
       cor 
-0.2705523 

The code below is a correlation test for how often people enjoy outdoor hobbies in the summer vs the winter. The results show a degrees of freedom of 32, a t value of 0.5, and a p-value of 0.6. These results indicate that I fail to reject the null hypothesis, meaning that there is no statistically significant difference between summer and winter for this question. The correlation of 0.09 indicates a weak correlation between the two variables.

cor.test(sw_survey$outhob_s, sw_survey$outhob_w)

    Pearson's product-moment correlation

data:  sw_survey$outhob_s and sw_survey$outhob_w
t = 0.53871, df = 32, p-value = 0.5938
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2514231  0.4195192
sample estimates:
       cor 
0.09480297 

The code below is a correlation test for how often people enjoy indoor hobbies in the summer vs the winter. The results show a degrees of freedom of 32, a t value of 3.02, and a p-value of 0.005. These results indicate that I am forced to reject the null hypothesis, meaning that there is a statistically significant difference between summer and winter for this question. The correlation of 0.47 indicates a moderate correlation between the two variables.

cor.test(sw_survey$inhob_s, sw_survey$inhob_w)

    Pearson's product-moment correlation

data:  sw_survey$inhob_s and sw_survey$inhob_w
t = 3.0205, df = 32, p-value = 0.00493
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1580125 0.6979989
sample estimates:
    cor 
0.47101 

The code below is a correlation test for how often people feel that they are ‘just trying to get by’ in the summer vs the winter. The results show a degrees of freedom of 32, a t value of -0.76, and a p-value of 0.45. These results indicate that I fail to reject the null hypothesis, meaning that there is no statistically significant difference between summer and winter for this question. The correlation of -0.13 indicates a weak negative correlation between the two variables.

cor.test(sw_survey$getby_s, sw_survey$getby_w)

    Pearson's product-moment correlation

data:  sw_survey$getby_s and sw_survey$getby_w
t = -0.75709, df = 32, p-value = 0.4545
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.4506052  0.2151646
sample estimates:
       cor 
-0.1326531 

The code below is a correlation test for how often people experience a loss of interest in the summer vs the winter. The results show a degrees of freedom of 32, a t value of 1.9, and a p-value of 0.06. These results indicate that I fail to reject the null hypothesis, meaning that there is no statistically significant difference between summer and winter for this question. The correlation of 0.3 indicates a weak correlation between the two variables.

cor.test(sw_survey$loss_s, sw_survey$loss_w)

    Pearson's product-moment correlation

data:  sw_survey$loss_s and sw_survey$loss_w
t = 1.9696, df = 32, p-value = 0.05759
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.01051738  0.60023988
sample estimates:
      cor 
0.3288178 

Then I created a boxplot with a linear regression for each pair of questions.

The first code below created a box plot with a linear regression for how often people enjoy nature in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = nature_s, y = nature_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How often people enjoy nature in summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

The code below created a box plot with a linear regression for how often people enjoy the weather in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = weather_s, y = weather_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How often people enjoy the weather in summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

The code below created a box plot with a linear regression for how productive people feel they are in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = productive_s, y = productive_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How productive are people in summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

`

The code below created a box plot with a linear regression for how often people feel that they are ‘in a good mood’ in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = mood_s, y = mood_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How often people feel like they are in a 'good mood' in summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

The code below created a box plot with a linear regression for how people rate their energy levels in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = energy_s, y = energy_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How people rate their energy levels in summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

The code below created a box plot with a linear regression for how often people enjoy outdoor hobbies in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = outhob_s, y = outhob_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How often do people enjoy outdoor hobbies during summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

The code below created a box plot with a linear regression for how often people enjoy indoor hobbies in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = inhob_s, y = inhob_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How often do people enjoy indoor hobbies during summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

The code below created a box plot with a linear regression for how often people feel they are ‘just trying to get by’ in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = getby_s, y = getby_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How often people feel they are 'just trying to get by' in summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

The code below created a box plot with a linear regression for how often people experience a loss of interest in the summer vs the winter.

sw_survey %>% 
  ggplot(aes(x = loss_s, y = loss_w)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  geom_smooth(formula = y~x, method = lm, se = FALSE) +
  labs(title = "How often people experience a loss of interest in summer vs winter", x = "summer", y = "winter")
Warning: Continuous x aesthetic -- did you forget aes(group=...)?

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpLYWl0bGluIEthdmxpZSBQU1lDLTU0MSANCg0KU3VydmV5IFByb2plY3Q6IEFjdGl2aXR5IExldmVscyBpbiB0aGUgU3VtbWVyIHZlcnN1cyB0aGUgV2ludGVyDQoNCg0KDQpUaGUgc3VydmV5IEkgY3JlYXRlZCBjb25zaXN0cyBvZiBxdWVzdGlvbnMgcmVnYXJkaW5nIHBhcnRpY2lwYW50cycgYWN0aXZpdHkgYW5kIGVuZXJneSBsZXZlbCBpbiB0aGUgc3VtbWVyLCBhcyB3ZWxsIGFzIGluIHRoZSB3aW50ZXIuIEJlZm9yZSBpbXBvcnRpbmcgdGhlIGRhdGEgSSByYW4gdGhlIHBhY2thZ2VzIHNob3duIGJlbG93Lg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpgYGANCg0KDQpUaGVuIEkgdXBsb2FkZWQgdGhlIEdvb2dsZSBzcHJlYWQgc2hlZXQgb2YgdGhlIGRhdGEgZnJvbSB0aGUgcmVzcG9uc2VzIHRvIG15IHN1cnZleSBhbmQgbmFtZWQgdGhlIGRhdGEgZmlsZSBzd19zdXJ2ZXkuDQoNCmBgYHtyfQ0Kc3dfc3VydmV5IDwtIHJlYWRfY3N2KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xQWVjMjFlMHpKQVNNTUhtUlkzTTBCMk9HY2pIejhoZkdwTzlqMTVwRFJvRS9leHBvcnQ/Zm9ybWF0PWNzdiIpDQpgYGANCg0KSSByYW4gdGhlIGNvZGUgYmVsb3cgdG8gZXhhbWluZSB0aGUgcmF3IGRhdGEgYW5kIHZhcmlhYmxlcy4NCmBgYHtyfQ0KZ2xpbXBzZShzd19zdXJ2ZXkpIA0KYGBgDQoNCg0KVGhlbiBJIHJhbiB0aGUgY29kZSBjaHVuayBiZWxvdyB0byBjaGFuZ2UgdGhlIG5hbWVzIG9mIHRoZSBzdXJ2ZXkgcXVlc3Rpb25zIG9yIHZhcmlhYmxlcyB0byBzaW1wbGVyIHRlcm1zLg0KDQpgYGB7cn0NCnN3X3N1cnZleSA8LSBzd19zdXJ2ZXkgJT4lDQogIHJlbmFtZShuYXR1cmVfcyA9IGBPbiBhdmVyYWdlLCBob3cgb2Z0ZW4gZG8geW91IGdvIG91dHNpZGUgdG8gZW5qb3kgbmF0dXJlIGluIHRoZSBzdW1tZXI/YCkgJT4lDQogIHJlbmFtZShuYXR1cmVfdyA9IGBPbiBhdmVyYWdlLCBob3cgb2Z0ZW4gZG8geW91IGdvIG91dHNpZGUgdG8gZW5qb3kgbmF0dXJlIGluIHRoZSB3aW50ZXI/YCkgJT4lDQogIHJlbmFtZSh3ZWF0aGVyX3MgPSBgT24gYXZlcmFnZSwgaG93IG9mdGVuIGRvIHlvdSBlbmpveSB0aGUgd2VhdGhlciBpbiB0aGUgc3VtbWVyP2ApICU+JQ0KICByZW5hbWUod2VhdGhlcl93ID0gYE9uIGF2ZXJhZ2UsIGhvdyBvZnRlbiBkbyB5b3UgZW5qb3kgdGhlIHdlYXRoZXIgaW4gdGhlIHdpbnRlcj9gKSAlPiUNCiAgcmVuYW1lKHByb2R1Y3RpdmVfcyA9IGBPbiBhdmVyYWdlLCBob3cgcHJvZHVjdGl2ZSBkbyB5b3UgZmVlbCBpbiB0aGUgc3VtbWVyP2ApICU+JQ0KICByZW5hbWUocHJvZHVjdGl2ZV93ID0gYE9uIGF2ZXJhZ2UsIGhvdyBwcm9kdWN0aXZlIGRvIHlvdSBmZWVsIGluIHRoZSB3aW50ZXI/YCkgJT4lDQogIHJlbmFtZShtb29kX3MgPSBgSG93IGZyZXF1ZW50bHkgZG8geW91IGZlZWwgbGlrZSB5b3UgYXJlICJpbiBhIGdvb2QgbW9vZCIgaW4gdGhlIHN1bW1lcj9gKSAlPiUNCiAgcmVuYW1lKG1vb2RfdyA9IGBIb3cgZnJlcXVlbnRseSBkbyB5b3UgZmVlbCBsaWtlIHlvdSBhcmUgImluIGEgZ29vZCBtb29kIiBpbiB0aGUgd2ludGVyP2ApICU+JQ0KICByZW5hbWUoZW5lcmd5X3MgPSBgT24gYXZlcmFnZSwgaG93IHN1ZmZpY2llbnQgd291bGQgeW91IHJhdGUgeW91ciBlbmVyZ3kgbGV2ZWxzIGluIHRoZSBzdW1tZXI/YCkgJT4lDQogIHJlbmFtZShlbmVyZ3lfdyA9IGBPbiBhdmVyYWdlLCBob3cgc3VmZmljaWVudCB3b3VsZCB5b3UgcmF0ZSB5b3VyIGVuZXJneSBsZXZlbHMgaW4gdGhlIHdpbnRlcj9gKSAlPiUNCiAgcmVuYW1lKG91dGhvYl9zID0gYEhvdyBvZnRlbiBkbyB5b3UgZW5qb3kgb3V0ZG9vciBob2JiaWVzIGluIHRoZSBzdW1tZXI/YCkgJT4lDQogIHJlbmFtZShvdXRob2JfdyA9IGBIb3cgb2Z0ZW4gZG8geW91IGVuam95IG91dGRvb3IgaG9iYmllcyBpbiB0aGUgd2ludGVyP2ApICU+JQ0KICByZW5hbWUoaW5ob2JfcyA9IGBIb3cgb2Z0ZW4gZG8geW91IGVuam95IGluZG9vciBob2JiaWVzIGluIHRoZSBzdW1tZXI/YCkgJT4lDQogIHJlbmFtZShpbmhvYl93ID0gYEhvdyBvZnRlbiBkbyB5b3UgZW5qb3kgaW5kb29yIGhvYmJpZXMgaW4gdGhlIHdpbnRlcj9gKSAlPiUNCiAgcmVuYW1lKGdldGJ5X3MgPSBgSG93IG9mdGVuIGRvIHlvdSBmZWVsIGxpa2UgeW91IGFyZSAianVzdCB0cnlpbmcgdG8gZ2V0IGJ5IiBpbiB0aGUgc3VtbWVyP2ApICU+JQ0KICByZW5hbWUoZ2V0YnlfdyA9IGBIb3cgb2Z0ZW4gZG8geW91IGZlZWwgbGlrZSB5b3UgYXJlICJqdXN0IHRyeWluZyB0byBnZXQgYnkiIGluIHRoZSB3aW50ZXI/YCkgJT4lDQogIHJlbmFtZShsb3NzX3MgPSBgSW4gdGhlIHN1bW1lciwgaG93IG9mdGVuIGRvIHlvdSBleHBlcmllbmNlIGEgbG9zcyBvZiBpbnRlcmVzdCBpbiB0aGluZ3MgeW91IHR5cGljYWxseSBlbmpveT9gKSAlPiUNCiAgcmVuYW1lKGxvc3NfdyA9IGBJbiB0aGUgd2ludGVyLCBob3cgb2Z0ZW4gZG8geW91IGV4cGVyaWVuY2UgYSBsb3NzIG9mIGludGVyZXN0IGluIHRoaW5ncyB5b3UgdHlwaWNhbGx5IGVuam95P2ApIA0KYGBgDQoNCg0KVGhlbiBJIHJlLWNvZGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXN0aW9uIHJlc3BvbnNlIG9wdGlvbnMgdXNpbmcgdGhlIGNvZGUgYmVsb3cuIEhpZ2hlciBudW1iZXJzIGNvb3JkaW5hdGUgd2l0aCBoaWdoZXIgbW9vZCwgYWN0aXZpdHksIGFuZCBlbmVyZ3kgbGV2ZWxzLiBMb3dlciBudW1iZXJzIGNvb3JkaW5hdGUgd2l0aCBsb3dlciBtb29kLCBhY3Rpdml0eSwgYW5kIGVuZXJneSBsZXZlbHMuDQoNCmBgYHtyfQ0Kc3dfc3VydmV5IDwtIHN3X3N1cnZleSAlPiUNCiAgbXV0YXRlKG5hdHVyZV9zID0gcmVjb2RlKG5hdHVyZV9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhcmVseSBvciBuZXZlciIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uY2UgYSB3ZWVrIiA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBmZXcgZGF5cyBhIHdlZWsiID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWFybHkgZXZlcnlkYXkiID0gNCkpICU+JQ0KICBtdXRhdGUobmF0dXJlX3cgPSByZWNvZGUobmF0dXJlX3csDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFyZWx5IG9yIG5ldmVyIiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiT25jZSBhIHdlZWsiID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIGZldyBkYXlzIGEgd2VlayIgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lYXJseSBldmVyeWRheSIgPSA0KSkgJT4lDQogIG11dGF0ZSh3ZWF0aGVyX3MgPSByZWNvZGUod2VhdGhlcl9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhcmVseSBvciBuZXZlciIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uY2UgYSB3ZWVrIiA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBmZXcgZGF5cyBhIHdlZWsiID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWFybHkgZXZlcnlkYXkiID0gNCkpICU+JQ0KICBtdXRhdGUod2VhdGhlcl93ID0gcmVjb2RlKHdlYXRoZXJfdywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXJlbHkgb3IgbmV2ZXIiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmNlIGEgd2VlayIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IGRheXMgYSB3ZWVrIiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVhcmx5IGV2ZXJ5ZGF5IiA9IDQpKSAlPiUNCiAgbXV0YXRlKHByb2R1Y3RpdmVfcyA9IHJlY29kZShwcm9kdWN0aXZlX3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IHByb2R1Y3RpdmUgYXQgYWxsIiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiU29tZXdoYXQgcHJvZHVjdGl2ZSIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vZGVyYXRlbHkgcHJvZHVjdGl2ZSIgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnkgcHJvZHVjdGl2ZSIgPSA0KSkgJT4lDQogIG11dGF0ZShwcm9kdWN0aXZlX3cgPSByZWNvZGUocHJvZHVjdGl2ZV93LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBwcm9kdWN0aXZlIGF0IGFsbCIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWV3aGF0IHByb2R1Y3RpdmUiID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2RlcmF0ZWx5IHByb2R1Y3RpdmUiID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJWZXJ5IHByb2R1Y3RpdmUiID0gNCkpICU+JQ0KICBtdXRhdGUobW9vZF9zID0gcmVjb2RlKG1vb2RfcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXJlbHkgb3IgbmV2ZXIiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmNlIGEgd2VlayIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IGRheXMgYSB3ZWVrIiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVhcmx5IGV2ZXJ5ZGF5IiA9IDQpKSAlPiUNCiAgbXV0YXRlKG1vb2RfdyA9IHJlY29kZShtb29kX3csDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFyZWx5IG9yIG5ldmVyIiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiT25jZSBhIHdlZWsiID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIGZldyBkYXlzIGEgd2VlayIgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lYXJseSBldmVyeWRheSIgPSA0KSkgJT4lDQogIG11dGF0ZShlbmVyZ3lfcyA9IHJlY29kZShlbmVyZ3lfcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3Qgc3VmZmljaWVudCBhdCBhbGwiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21ld2hhdCBzdWZmaWNpZW50IiA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9kZXJhdGVseSBzdWZmaWNpZW50IiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyeSBzdWZmaWNpZW50IiA9IDQpKSAlPiUNCiAgbXV0YXRlKGVuZXJneV93ID0gcmVjb2RlKGVuZXJneV93LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBzdWZmaWNpZW50IGF0IGFsbCIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWV3aGF0IHN1ZmZpY2llbnQiID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2RlcmF0ZWx5IHN1ZmZpY2llbnQiID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJWZXJ5IHN1ZmZpY2llbnQiID0gNCkpICU+JQ0KICBtdXRhdGUob3V0aG9iX3MgPSByZWNvZGUob3V0aG9iX3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFyZWx5IG9yIG5ldmVyIiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiT25jZSBhIHdlZWsiID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIGZldyBkYXlzIGEgd2VlayIgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lYXJseSBldmVyeWRheSIgPSA0KSkgJT4lDQogIG11dGF0ZShvdXRob2JfdyA9IHJlY29kZShvdXRob2JfdywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXJlbHkgb3IgbmV2ZXIiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmNlIGEgd2VlayIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IGRheXMgYSB3ZWVrIiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVhcmx5IGV2ZXJ5ZGF5IiA9IDQpKSAlPiUNCiAgbXV0YXRlKGluaG9iX3MgPSByZWNvZGUoaW5ob2JfcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXJlbHkgb3IgbmV2ZXIiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmNlIGEgd2VlayIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IGRheXMgYSB3ZWVrIiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVhcmx5IGV2ZXJ5ZGF5IiA9IDQpKSAlPiUNCiAgbXV0YXRlKGluaG9iX3cgPSByZWNvZGUoaW5ob2JfdywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXJlbHkgb3IgbmV2ZXIiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmNlIGEgd2VlayIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IGRheXMgYSB3ZWVrIiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVhcmx5IGV2ZXJ5ZGF5IiA9IDQpKSAlPiUNCiAgbXV0YXRlKGdldGJ5X3MgPSByZWNvZGUoZ2V0YnlfcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXJlbHkgb3IgbmV2ZXIiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmNlIGEgd2VlayIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IGRheXMgYSB3ZWVrIiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVhcmx5IGV2ZXJ5ZGF5IiA9IDQpKSAlPiUNCiAgbXV0YXRlKGdldGJ5X3cgPSByZWNvZGUoZ2V0YnlfdywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXJlbHkgb3IgbmV2ZXIiID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmNlIGEgd2VlayIgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IGRheXMgYSB3ZWVrIiA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVhcmx5IGV2ZXJ5ZGF5IiA9IDQpKSAlPiUNCiAgbXV0YXRlKGxvc3NfcyA9IHJlY29kZShsb3NzX3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFyZWx5IG9yIG5ldmVyIiA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiT25jZSBhIHdlZWsiID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIGZldyBkYXlzIGEgd2VlayIgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lYXJseSBldmVyeWRheSIgPSA0KSkgJT4lDQogIG11dGF0ZShsb3NzX3cgPSByZWNvZGUobG9zc193LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhcmVseSBvciBuZXZlciIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uY2UgYSB3ZWVrIiA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBmZXcgZGF5cyBhIHdlZWsiID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWFybHkgZXZlcnlkYXkiID0gNCkpIA0KYGBgDQoNCg0KDQoNCkkgcmFuIHRoZSBjb2RlIGJlbG93IHRvIG9idGFpbiBzb21lIGJhc2ljIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIGRhdGEuDQoNCmBgYHtyfQ0Kc3VtbWFyeShzd19zdXJ2ZXkpDQpgYGANCg0KDQoNClRoZW4gSSByYW4gY29ycmVsYXRpb24gdGVzdHMgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9uIHBhaXJzLiBUaGUgbnVsbCBoeXBvdGhlc2lzIGlzIHRoYXQgdGhlcmUgaXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlc3BvbnNlcyB0byBxdWVzdGlvbnMgKGFjdGl2aXR5IGxldmVsLCBtb29kLCBsb3NzIG9mIGludGVyZXN0KSBmb3IgdGhlIHN1bW1lciB2ZXJzdXMgdGhlIHdpbnRlci4gVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgaXMgdGhhdCB0aGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiByZXNwb25zZXMgZm9yIHN1bW1lciBhbmQgd2ludGVyLg0KDQoNCg0KVGhlIGNvZGUgYmVsb3cgaXMgYSBjb3JyZWxhdGlvbiB0ZXN0IGZvciBob3cgb2Z0ZW4gcGVvcGxlIGVuam95IG5hdHVyZSBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuIFRoZSByZXN1bHRzIHNob3cgYSBkZWdyZWVzIG9mIGZyZWVkb20gb2YgMzIsIGEgdCB2YWx1ZSBvZiAxLjYsIGFuZCBhIHAtdmFsdWUgb2YgMC4xMi4gVGhlc2UgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IEkgZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgbWVhbmluZyB0aGF0IHRoZXJlIGlzIG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHN1bW1lciBhbmQgd2ludGVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgY29ycmVsYXRpb24gb2YgMC4yNyBpbmRpY2F0ZXMgYSB3ZWFrIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHR3byB2YXJpYWJsZXMuDQoNCmBgYHtyfQ0KY29yLnRlc3Qoc3dfc3VydmV5JG5hdHVyZV9zLCBzd19zdXJ2ZXkkbmF0dXJlX3cpDQoNCmBgYA0KDQoNCg0KVGhlIGNvZGUgYmVsb3cgaXMgYSBjb3JyZWxhdGlvbiB0ZXN0IGZvciBob3cgb2Z0ZW4gcGVvcGxlIGVuam95IHRoZSB3ZWF0aGVyIGluIHRoZSBzdW1tZXIgdnMgdGhlIHdpbnRlci4gVGhlIHJlc3VsdHMgc2hvdyBhIGRlZ3JlZXMgb2YgZnJlZWRvbSBvZiAzMiwgYSB0IHZhbHVlIG9mIC0wLjksIGFuZCBhIHAtdmFsdWUgb2YgMC4zMy4gVGhlc2UgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IEkgZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgbWVhbmluZyB0aGF0IHRoZXJlIGlzIG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHN1bW1lciBhbmQgd2ludGVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgY29ycmVsYXRpb24gb2YgLTAuMTcgaW5kaWNhdGVzIGEgd2VhayBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLiANCg0KDQpgYGB7cn0NCmNvci50ZXN0KHN3X3N1cnZleSR3ZWF0aGVyX3MsIHN3X3N1cnZleSR3ZWF0aGVyX3cpDQoNCmBgYA0KDQoNCg0KVGhlIGNvZGUgYmVsb3cgaXMgYSBjb3JyZWxhdGlvbiB0ZXN0IGZvciBob3cgcHJvZHVjdGl2ZSBwZW9wbGUgZmVlbCB0aGV5IGFyZSBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuIFRoZSByZXN1bHRzIHNob3cgYSBkZWdyZWVzIG9mIGZyZWVkb20gb2YgMzIsIGEgdCB2YWx1ZSBvZiAtMy41LCBhbmQgYSBwLXZhbHVlIG9mIDAuMDAxNC4gQWNjb3JkaW5nIHRvIHRoZSBwLXZhbHVlLCB0aGVzZSByZXN1bHRzIGluZGljYXRlIHRoYXQgSSBhbSBmb3JjZWQgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHN1bW1lciBhbmQgd2ludGVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgY29ycmVsYXRpb24gb2YgLTAuNSBpbmRpY2F0ZXMgYSBtb2RlcmF0ZSBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLiANCg0KDQpgYGB7cn0NCmNvci50ZXN0KHN3X3N1cnZleSRwcm9kdWN0aXZlX3MsIHN3X3N1cnZleSRwcm9kdWN0aXZlX3cpDQoNCmBgYA0KDQoNCg0KDQpUaGUgY29kZSBiZWxvdyBpcyBhIGNvcnJlbGF0aW9uIHRlc3QgZm9yIGhvdyBvZnRlbiBwZW9wbGUgYXJlICdpbiBhIGdvb2QgbW9vZCcgaW4gdGhlIHN1bW1lciB2cyB0aGUgd2ludGVyLiBUaGUgcmVzdWx0cyBzaG93IGEgZGVncmVlcyBvZiBmcmVlZG9tIG9mIDMyLCBhIHQgdmFsdWUgb2YgMC4wNCwgYW5kIGEgcC12YWx1ZSBvZiAwLjk2LiBBY2NvcmRpbmcgdG8gdGhlIHAtdmFsdWUsIHRoZXNlIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCBJIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBubyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBzdW1tZXIgYW5kIHdpbnRlciBmb3IgdGhpcyBxdWVzdGlvbi4gVGhlIGNvcnJlbGF0aW9uIG9mIDAuMDA3IGluZGljYXRlcyBhIHZlcnkgd2VhayBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLiANCg0KDQpgYGB7cn0NCmNvci50ZXN0KHN3X3N1cnZleSRtb29kX3MsIHN3X3N1cnZleSRtb29kX3cpDQoNCmBgYA0KDQoNCg0KVGhlIGNvZGUgYmVsb3cgaXMgYSBjb3JyZWxhdGlvbiB0ZXN0IGZvciBob3cgcGVvcGxlIHJhdGUgdGhlaXIgZW5lcmd5IGxldmVscyBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuIFRoZSByZXN1bHRzIHNob3cgYSBkZWdyZWVzIG9mIGZyZWVkb20gb2YgMzIsIGEgdCB2YWx1ZSBvZiAtMS42LCBhbmQgYSBwLXZhbHVlIG9mIDAuMTIuIFRoZXNlIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCBJIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBubyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBzdW1tZXIgYW5kIHdpbnRlciBmb3IgdGhpcyBxdWVzdGlvbi4gVGhlIGNvcnJlbGF0aW9uIG9mIC0wLjI3IGluZGljYXRlcyBhIHdlYWsgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gDQoNCmBgYHtyfQ0KY29yLnRlc3Qoc3dfc3VydmV5JGVuZXJneV9zLCBzd19zdXJ2ZXkkZW5lcmd5X3cpDQoNCmBgYA0KDQoNCg0KDQpUaGUgY29kZSBiZWxvdyBpcyBhIGNvcnJlbGF0aW9uIHRlc3QgZm9yIGhvdyBvZnRlbiBwZW9wbGUgZW5qb3kgb3V0ZG9vciBob2JiaWVzIGluIHRoZSBzdW1tZXIgdnMgdGhlIHdpbnRlci4gVGhlIHJlc3VsdHMgc2hvdyBhIGRlZ3JlZXMgb2YgZnJlZWRvbSBvZiAzMiwgYSB0IHZhbHVlIG9mIDAuNSwgYW5kIGEgcC12YWx1ZSBvZiAwLjYuIFRoZXNlIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCBJIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBubyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBzdW1tZXIgYW5kIHdpbnRlciBmb3IgdGhpcyBxdWVzdGlvbi4gVGhlIGNvcnJlbGF0aW9uIG9mIDAuMDkgaW5kaWNhdGVzIGEgd2VhayBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLiANCg0KYGBge3J9DQpjb3IudGVzdChzd19zdXJ2ZXkkb3V0aG9iX3MsIHN3X3N1cnZleSRvdXRob2JfdykNCg0KYGBgDQoNCg0KDQoNClRoZSBjb2RlIGJlbG93IGlzIGEgY29ycmVsYXRpb24gdGVzdCBmb3IgaG93IG9mdGVuIHBlb3BsZSBlbmpveSBpbmRvb3IgaG9iYmllcyBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuIFRoZSByZXN1bHRzIHNob3cgYSBkZWdyZWVzIG9mIGZyZWVkb20gb2YgMzIsIGEgdCB2YWx1ZSBvZiAzLjAyLCBhbmQgYSBwLXZhbHVlIG9mIDAuMDA1LiBUaGVzZSByZXN1bHRzIGluZGljYXRlIHRoYXQgSSBhbSBmb3JjZWQgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHN1bW1lciBhbmQgd2ludGVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgY29ycmVsYXRpb24gb2YgMC40NyBpbmRpY2F0ZXMgYSBtb2RlcmF0ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLiANCg0KYGBge3J9DQpjb3IudGVzdChzd19zdXJ2ZXkkaW5ob2Jfcywgc3dfc3VydmV5JGluaG9iX3cpDQoNCmBgYA0KDQoNCg0KDQpUaGUgY29kZSBiZWxvdyBpcyBhIGNvcnJlbGF0aW9uIHRlc3QgZm9yIGhvdyBvZnRlbiBwZW9wbGUgZmVlbCB0aGF0IHRoZXkgYXJlICdqdXN0IHRyeWluZyB0byBnZXQgYnknIGluIHRoZSBzdW1tZXIgdnMgdGhlIHdpbnRlci4gVGhlIHJlc3VsdHMgc2hvdyBhIGRlZ3JlZXMgb2YgZnJlZWRvbSBvZiAzMiwgYSB0IHZhbHVlIG9mIC0wLjc2LCBhbmQgYSBwLXZhbHVlIG9mIDAuNDUuIFRoZXNlIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCBJIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBubyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBzdW1tZXIgYW5kIHdpbnRlciBmb3IgdGhpcyBxdWVzdGlvbi4gVGhlIGNvcnJlbGF0aW9uIG9mIC0wLjEzIGluZGljYXRlcyBhIHdlYWsgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gDQoNCmBgYHtyfQ0KY29yLnRlc3Qoc3dfc3VydmV5JGdldGJ5X3MsIHN3X3N1cnZleSRnZXRieV93KQ0KDQpgYGANCg0KDQoNClRoZSBjb2RlIGJlbG93IGlzIGEgY29ycmVsYXRpb24gdGVzdCBmb3IgaG93IG9mdGVuIHBlb3BsZSBleHBlcmllbmNlIGEgbG9zcyBvZiBpbnRlcmVzdCBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuIFRoZSByZXN1bHRzIHNob3cgYSBkZWdyZWVzIG9mIGZyZWVkb20gb2YgMzIsIGEgdCB2YWx1ZSBvZiAxLjksIGFuZCBhIHAtdmFsdWUgb2YgMC4wNi4gVGhlc2UgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IEkgZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgbWVhbmluZyB0aGF0IHRoZXJlIGlzIG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHN1bW1lciBhbmQgd2ludGVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgY29ycmVsYXRpb24gb2YgMC4zIGluZGljYXRlcyBhIHdlYWsgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gDQoNCg0KYGBge3J9DQpjb3IudGVzdChzd19zdXJ2ZXkkbG9zc19zLCBzd19zdXJ2ZXkkbG9zc193KQ0KDQpgYGANCg0KDQoNCg0KVGhlbiBJIGNyZWF0ZWQgYSBib3hwbG90IHdpdGggYSBsaW5lYXIgcmVncmVzc2lvbiBmb3IgZWFjaCBwYWlyIG9mIHF1ZXN0aW9ucy4NCg0KDQpUaGUgZmlyc3QgY29kZSBiZWxvdyBjcmVhdGVkIGEgYm94IHBsb3Qgd2l0aCBhIGxpbmVhciByZWdyZXNzaW9uIGZvciBob3cgb2Z0ZW4gcGVvcGxlIGVuam95IG5hdHVyZSBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuDQoNCmBgYHtyfQ0Kc3dfc3VydmV5ICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbmF0dXJlX3MsIHkgPSBuYXR1cmVfdykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdlb21fc21vb3RoKGZvcm11bGEgPSB5fngsIG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKSArDQogIGxhYnModGl0bGUgPSAiSG93IG9mdGVuIHBlb3BsZSBlbmpveSBuYXR1cmUgaW4gc3VtbWVyIHZzIHdpbnRlciIsIHggPSAic3VtbWVyIiwgeSA9ICJ3aW50ZXIiKQ0KYGBgDQoNCg0KVGhlIGNvZGUgYmVsb3cgY3JlYXRlZCBhIGJveCBwbG90IHdpdGggYSBsaW5lYXIgcmVncmVzc2lvbiBmb3IgaG93IG9mdGVuIHBlb3BsZSBlbmpveSB0aGUgd2VhdGhlciBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuDQoNCmBgYHtyfQ0Kc3dfc3VydmV5ICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gd2VhdGhlcl9zLCB5ID0gd2VhdGhlcl93KSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gLjEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9IHl+eCwgbWV0aG9kID0gbG0sIHNlID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJIb3cgb2Z0ZW4gcGVvcGxlIGVuam95IHRoZSB3ZWF0aGVyIGluIHN1bW1lciB2cyB3aW50ZXIiLCB4ID0gInN1bW1lciIsIHkgPSAid2ludGVyIikNCmBgYA0KDQoNCg0KVGhlIGNvZGUgYmVsb3cgY3JlYXRlZCBhIGJveCBwbG90IHdpdGggYSBsaW5lYXIgcmVncmVzc2lvbiBmb3IgaG93IHByb2R1Y3RpdmUgcGVvcGxlIGZlZWwgdGhleSBhcmUgaW4gdGhlIHN1bW1lciB2cyB0aGUgd2ludGVyLg0KDQpgYGB7cn0NCnN3X3N1cnZleSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHByb2R1Y3RpdmVfcywgeSA9IHByb2R1Y3RpdmVfdykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdlb21fc21vb3RoKGZvcm11bGEgPSB5fngsIG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKSArDQogIGxhYnModGl0bGUgPSAiSG93IHByb2R1Y3RpdmUgYXJlIHBlb3BsZSBpbiBzdW1tZXIgdnMgd2ludGVyIiwgeCA9ICJzdW1tZXIiLCB5ID0gIndpbnRlciIpDQpgYGANCmANCg0KDQpUaGUgY29kZSBiZWxvdyBjcmVhdGVkIGEgYm94IHBsb3Qgd2l0aCBhIGxpbmVhciByZWdyZXNzaW9uIGZvciBob3cgb2Z0ZW4gcGVvcGxlIGZlZWwgdGhhdCB0aGV5IGFyZSAnaW4gYSBnb29kIG1vb2QnIGluIHRoZSBzdW1tZXIgdnMgdGhlIHdpbnRlci4NCg0KYGBge3J9DQpzd19zdXJ2ZXkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtb29kX3MsIHkgPSBtb29kX3cpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBnZW9tX3Ntb290aChmb3JtdWxhID0geX54LCBtZXRob2QgPSBsbSwgc2UgPSBGQUxTRSkgKw0KICBsYWJzKHRpdGxlID0gIkhvdyBvZnRlbiBwZW9wbGUgZmVlbCBsaWtlIHRoZXkgYXJlIGluIGEgJ2dvb2QgbW9vZCcgaW4gc3VtbWVyIHZzIHdpbnRlciIsIHggPSAic3VtbWVyIiwgeSA9ICJ3aW50ZXIiKQ0KYGBgDQoNCg0KVGhlIGNvZGUgYmVsb3cgY3JlYXRlZCBhIGJveCBwbG90IHdpdGggYSBsaW5lYXIgcmVncmVzc2lvbiBmb3IgaG93IHBlb3BsZSByYXRlIHRoZWlyIGVuZXJneSBsZXZlbHMgaW4gdGhlIHN1bW1lciB2cyB0aGUgd2ludGVyLg0KDQpgYGB7cn0NCnN3X3N1cnZleSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGVuZXJneV9zLCB5ID0gZW5lcmd5X3cpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBnZW9tX3Ntb290aChmb3JtdWxhID0geX54LCBtZXRob2QgPSBsbSwgc2UgPSBGQUxTRSkgKw0KICBsYWJzKHRpdGxlID0gIkhvdyBwZW9wbGUgcmF0ZSB0aGVpciBlbmVyZ3kgbGV2ZWxzIGluIHN1bW1lciB2cyB3aW50ZXIiLCB4ID0gInN1bW1lciIsIHkgPSAid2ludGVyIikNCmBgYA0KDQoNClRoZSBjb2RlIGJlbG93IGNyZWF0ZWQgYSBib3ggcGxvdCB3aXRoIGEgbGluZWFyIHJlZ3Jlc3Npb24gZm9yIGhvdyBvZnRlbiBwZW9wbGUgZW5qb3kgb3V0ZG9vciBob2JiaWVzIGluIHRoZSBzdW1tZXIgdnMgdGhlIHdpbnRlci4NCg0KYGBge3J9DQpzd19zdXJ2ZXkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBvdXRob2JfcywgeSA9IG91dGhvYl93KSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gLjEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9IHl+eCwgbWV0aG9kID0gbG0sIHNlID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJIb3cgb2Z0ZW4gZG8gcGVvcGxlIGVuam95IG91dGRvb3IgaG9iYmllcyBkdXJpbmcgc3VtbWVyIHZzIHdpbnRlciIsIHggPSAic3VtbWVyIiwgeSA9ICJ3aW50ZXIiKQ0KYGBgDQoNClRoZSBjb2RlIGJlbG93IGNyZWF0ZWQgYSBib3ggcGxvdCB3aXRoIGEgbGluZWFyIHJlZ3Jlc3Npb24gZm9yIGhvdyBvZnRlbiBwZW9wbGUgZW5qb3kgaW5kb29yIGhvYmJpZXMgaW4gdGhlIHN1bW1lciB2cyB0aGUgd2ludGVyLg0KDQpgYGB7cn0NCnN3X3N1cnZleSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGluaG9iX3MsIHkgPSBpbmhvYl93KSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gLjEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9IHl+eCwgbWV0aG9kID0gbG0sIHNlID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJIb3cgb2Z0ZW4gZG8gcGVvcGxlIGVuam95IGluZG9vciBob2JiaWVzIGR1cmluZyBzdW1tZXIgdnMgd2ludGVyIiwgeCA9ICJzdW1tZXIiLCB5ID0gIndpbnRlciIpDQpgYGANCg0KDQpUaGUgY29kZSBiZWxvdyBjcmVhdGVkIGEgYm94IHBsb3Qgd2l0aCBhIGxpbmVhciByZWdyZXNzaW9uIGZvciBob3cgb2Z0ZW4gcGVvcGxlIGZlZWwgdGhleSBhcmUgJ2p1c3QgdHJ5aW5nIHRvIGdldCBieScgaW4gdGhlIHN1bW1lciB2cyB0aGUgd2ludGVyLg0KDQpgYGB7cn0NCnN3X3N1cnZleSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGdldGJ5X3MsIHkgPSBnZXRieV93KSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gLjEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9IHl+eCwgbWV0aG9kID0gbG0sIHNlID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJIb3cgb2Z0ZW4gcGVvcGxlIGZlZWwgdGhleSBhcmUgJ2p1c3QgdHJ5aW5nIHRvIGdldCBieScgaW4gc3VtbWVyIHZzIHdpbnRlciIsIHggPSAic3VtbWVyIiwgeSA9ICJ3aW50ZXIiKQ0KYGBgDQoNCg0KVGhlIGNvZGUgYmVsb3cgY3JlYXRlZCBhIGJveCBwbG90IHdpdGggYSBsaW5lYXIgcmVncmVzc2lvbiBmb3IgaG93IG9mdGVuIHBlb3BsZSBleHBlcmllbmNlIGEgbG9zcyBvZiBpbnRlcmVzdCBpbiB0aGUgc3VtbWVyIHZzIHRoZSB3aW50ZXIuDQoNCmBgYHtyfQ0Kc3dfc3VydmV5ICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbG9zc19zLCB5ID0gbG9zc193KSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gLjEpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9IHl+eCwgbWV0aG9kID0gbG0sIHNlID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJIb3cgb2Z0ZW4gcGVvcGxlIGV4cGVyaWVuY2UgYSBsb3NzIG9mIGludGVyZXN0IGluIHN1bW1lciB2cyB3aW50ZXIiLCB4ID0gInN1bW1lciIsIHkgPSAid2ludGVyIikNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K