Library

 # install.packages("pacman")
# writeLines(pacman::p_lib(), "~/Desktop/list_of_R_packages.csv") # to quickly back up packages
# remotes::install_github("ThinkR-open/remedy")



pacman::p_load(tidyverse,ggplot2, janitor, data.table, here, rio, kableExtra, ggstatsplot, 
               knitr,
               rmarkdown,
               webshot,
               namer
                              )
# 
# install.packages("easystats", repos = "https://easystats.r-universe.dev")
# 
# easystats::install_suggested()

#Knit to pdf

# knit2pdf(input = "cages.Rmd", here::here("output", "cages.Rmd"))
# 
# render("cages.Rmd", output_format = "pdf_document")

Pea Data

pea_data <- rio::import(here("data", "cage_data.xlsx"), which = 1) %>% 
  janitor::clean_names() %>% 
  dplyr::mutate(edge_d = as.factor(edge_d)) %>% 
  dplyr::mutate(mesh = as.factor(fence))

head(pea_data)
##   cage fence edge_d hole_d height n_plants pods pod_mass mesh
## 1 HR56   big      0    1.8     63       60  260       52  big
## 2 HR53   big      0    2.6     50       41  325       70  big
## 3 HR50   big      0    5.6     90       97  566      140  big
## 4 HR47   big      0   10.8     90      104  591      146  big
## 5 HR44   big      0    0.4     50       28   54       14  big
## 6 HR32   big      0    4.2     50       57  400       82  big

Mesh size

Summary

# Function to summarise

baseline_table <- function(data, variables, grouping_var) {

        data %>% 
                group_by(!!!syms(grouping_var)) %>% 
                summarise(
                        across(
                                all_of(variables),
                                ~ paste0(mean(.) %>% round(2), "(±", sd(.) %>% round(2), ")")
                        )
                ) %>% unite(
                        "grouping",
                        all_of(grouping_var)
                ) %>% pivot_longer(
                        cols = -"grouping",
                        names_to = "variables"
                ) %>% pivot_wider(
                        names_from = "grouping"
                )
}


baseline_table(
        pea_data,
        variables = c("height", "n_plants", "pods", "pod_mass"),
        grouping_var = "mesh"
) %>% 
  kbl(caption = "Means and SD for each mesh size") %>%
    kable_styling(bootstrap_options = c("striped", "hover"))
Means and SD for each mesh size
variables big middle small
height 69.22(±16.75) 73.75(±10.61) 80.56(±10.74)
n_plants 71.78(±27.12) 76.5(±20.02) 94.89(±10.07)
pods 382.22(±163.04) 366.25(±106.57) 474.67(±101.75)
pod_mass 90.22(±44.47) 87.75(±30.84) 118.44(±34.81)

Plant height

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

The ANOVA was significant but there were no significant pairwise contrasts (!). The Games-Howell post-hoc test involves a correction for multiple comparisons and makes the test more conservative.

ggplot(data = pea_data, aes(x = mesh, y = height, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

# since the confidence intervals for the effect sizes are computed using
## bootstrapping, important to set a seed for reproducibility

set.seed(123)


ggbetweenstats(data = pea_data,
               x= mesh, 
               y = height, 
                pairwise.display = "all",
                title = "Distribution of plant height across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea_data,
               x= mesh,
               y = height) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      1.65     2    15.0   0.225 One-w… Omega2   0.0676    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.507 Bayes…  -0.679 Bayesi…       0
## 2 mesh-big    0.902 cauchy        0   0.707 0.507 Bayes…  -0.679 Bayesi…       0
## 3 mesh-middle 0.573 cauchy        0   0.707 0.507 Bayes…  -0.679 Bayesi…       0
## 4 mesh-small  0.929 cauchy        0   0.707 0.507 Bayes…  -0.679 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.507 Bayes…  -0.679 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.507 Bayes…  -0.679 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     0.952   0.820 two.sided   q         Holm    Game… <language>
## 2 big    small      2.42    0.712 two.sided   q         Holm    Game… <language>
## 3 middle small      1.86    0.820 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Number of plants

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = pea_data, aes(x = mesh, y = n_plants, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  pea_data, 
                x= mesh, 
                y = n_plants, 
                pairwise.display = "all",
                title = "Distribution of number of plants across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea_data,
               x= mesh,
               y = n_plants) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      4.65     2    12.7  0.0304 One-w… Omega2    0.317    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707  1.36 Bayes…   0.311 Bayesi…  0.0502
## 2 mesh-big    0.930 cauchy        0   0.707  1.36 Bayes…   0.311 Bayesi…  0.0502
## 3 mesh-middle 0.762 cauchy        0   0.707  1.36 Bayes…   0.311 Bayesi…  0.0502
## 4 mesh-small  0.984 cauchy        0   0.707  1.36 Bayes…   0.311 Bayesi…  0.0502
## 5 sig2        1     cauchy        0   0.707  1.36 Bayes…   0.311 Bayesi…  0.0502
## 6 g_mesh      1     cauchy        0   0.707  1.36 Bayes…   0.311 Bayesi…  0.0502
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     0.582   0.912 two.sided   q         Holm    Game… <language>
## 2 big    small      3.39    0.260 two.sided   q         Holm    Game… <language>
## 3 middle small      3.32    0.260 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Number of pods

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = pea_data, aes(x = mesh, y = pods, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  pea_data, 
                x= mesh, 
                y = pods, 
                pairwise.display = "s",
                title = "Distribution of number of pods across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea_data,
               x= mesh,
               y = pods) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      2.45     2    14.9   0.121 One-w… Omega2    0.139    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.551 Bayes…  -0.596 Bayesi…       0
## 2 mesh-big    0.745 cauchy        0   0.707 0.551 Bayes…  -0.596 Bayesi…       0
## 3 mesh-middle 0.840 cauchy        0   0.707 0.551 Bayes…  -0.596 Bayesi…       0
## 4 mesh-small  0.949 cauchy        0   0.707 0.551 Bayes…  -0.596 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.551 Bayes…  -0.596 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.551 Bayes…  -0.596 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle    -0.342   0.968 two.sided   q         Holm    Game… <language>
## 2 big    small      2.04    0.696 two.sided   q         Holm    Game… <language>
## 3 middle small      3.02    0.349 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Pod mass

ggplot(data = pea_data, aes(x = mesh, y = pod_mass, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  pea_data, x= mesh, y = pod_mass, title = "Distribution of pod mass across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea_data,
               x= mesh,
               y = pod_mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      2.02     2    15.2   0.167 One-w… Omega2    0.101    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.548 Bayes…  -0.602 Bayesi…       0
## 2 mesh-big    0.776 cauchy        0   0.707 0.548 Bayes…  -0.602 Bayesi…       0
## 3 mesh-middle 0.818 cauchy        0   0.707 0.548 Bayes…  -0.602 Bayesi…       0
## 4 mesh-small  0.949 cauchy        0   0.707 0.548 Bayes…  -0.602 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.548 Bayes…  -0.602 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.548 Bayes…  -0.602 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle    -0.190   0.990 two.sided   q         Holm    Game… <language>
## 2 big    small      2.12    0.638 two.sided   q         Holm    Game… <language>
## 3 middle small      2.73    0.496 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Covariate: Distance to nearest hole

Plant height

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea_data, 
                        x= hole_d, 
                        y = height, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Plant height",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Plant height relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## Registered S3 method overwritten by 'ggside':
##   method from   
##   +.gg   ggplot2
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(height ~ hole_d + mesh, data = pea_data)
summary(mod)
## 
## Call:
## lm(formula = height ~ hole_d + mesh, data = pea_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -21.8838  -8.0613   0.9158   8.0544  20.6226 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  59.6010     5.4761  10.884 2.53e-10 ***
## hole_d        1.7458     0.6912   2.526   0.0192 *  
## meshmiddle    3.8270     5.7417   0.667   0.5120    
## meshsmall    11.8571     5.5676   2.130   0.0446 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.8 on 22 degrees of freedom
## Multiple R-squared:  0.3248, Adjusted R-squared:  0.2327 
## F-statistic: 3.527 on 3 and 22 DF,  p-value: 0.03171
coef(mod)
## (Intercept)      hole_d  meshmiddle   meshsmall 
##   59.601010    1.745784    3.827039   11.857069

Pearson’s correlation test revealed that, across the 9 cages with big mesh size, the distance to the nearest hole (m) was positively correlated with plant height, and this effect was statistically significant. The effect size (r=0.81) was large, as per Cohen’s (1988) conventions. The Bayes Factor for the same analysis revealed that the data were 7.14 times more probable under the alternative hypothesis as compared to the null hypothesis. This can be considered as moderate evidence (Jeffreys, 1961) in favor of the alternative hypothesis (of a correlation between these two variables).

Number of plants

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea_data, 
                        x= hole_d, 
                        y = n_plants, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of plants",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of plants relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Number of pods

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea_data, 
                        x= hole_d, 
                        y = pods, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of pods",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of pods relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Pod mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea_data, 
                        x= hole_d, 
                        y = pod_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Pod mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Pod mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

PEA MERGED

Covariate: Distance to nearest hole

Mesh big and middle merged to have accessible not accessible

bi_pea <-pea_data %>% 
    dplyr::mutate(mesh = recode(mesh, big = "accessible", middle = "accessible", small =  "not accessible"))

Plant height

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_pea, 
                        x= hole_d, 
                        y = height, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Plant height",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Plant height relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(height ~ hole_d + mesh, data = bi_pea)

summary(mod)
## 
## Call:
## lm(formula = height ~ hole_d + mesh, data = bi_pea)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -22.0282  -6.0630   0.7847   9.3401  18.8239 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          61.275      4.807  12.747 6.56e-12 ***
## hole_d                1.768      0.682   2.593   0.0163 *  
## meshnot accessible   10.067      4.818   2.090   0.0479 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.66 on 23 degrees of freedom
## Multiple R-squared:  0.3111, Adjusted R-squared:  0.2512 
## F-statistic: 5.194 on 2 and 23 DF,  p-value: 0.01376
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##          61.275087           1.768045          10.066992

Number of plants

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_pea, 
                        x= hole_d, 
                        y = n_plants, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of plants",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of plants relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(n_plants ~ hole_d + mesh, data = bi_pea)

summary(mod)
## 
## Call:
## lm(formula = n_plants ~ hole_d + mesh, data = bi_pea)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -29.1588 -12.2967  -0.7523  13.2795  25.8317 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         55.8877     7.0074   7.976 4.52e-08 ***
## hole_d               3.1776     0.9942   3.196  0.00401 ** 
## meshnot accessible  22.4424     7.0231   3.196  0.00402 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17 on 23 degrees of freedom
## Multiple R-squared:  0.4538, Adjusted R-squared:  0.4063 
## F-statistic: 9.553 on 2 and 23 DF,  p-value: 0.000955
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##          55.887729           3.177591          22.442378
# Distance effect only for accessible cages

acc_pea <- bi_pea %>% 
  dplyr::filter(mesh == "accessible")

mod1 <- lm(n_plants ~ hole_d, data = acc_pea)
summary(mod1)
## 
## Call:
## lm(formula = n_plants ~ hole_d, data = acc_pea)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -18.997 -14.737  -1.673   9.545  28.933 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   44.586      8.269   5.392 7.48e-05 ***
## hole_d         5.160      1.266   4.078  0.00099 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.67 on 15 degrees of freedom
## Multiple R-squared:  0.5257, Adjusted R-squared:  0.4941 
## F-statistic: 16.63 on 1 and 15 DF,  p-value: 0.0009902
coef(mod1)
## (Intercept)      hole_d 
##   44.586265    5.160304

Number of pods

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_pea, 
                        x= hole_d, 
                        y = pods, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of pods",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of pods relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(pods ~ hole_d + mesh, data = bi_pea)

summary(mod)
## 
## Call:
## lm(formula = pods ~ hole_d + mesh, data = bi_pea)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -270.367  -91.308    6.219   93.261  192.244 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         320.568     50.839   6.306 1.96e-06 ***
## hole_d                9.498      7.213   1.317   0.2009    
## meshnot accessible  104.604     50.953   2.053   0.0516 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 123.3 on 23 degrees of freedom
## Multiple R-squared:  0.1958, Adjusted R-squared:  0.1259 
## F-statistic: 2.801 on 2 and 23 DF,  p-value: 0.08155
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##         320.567996           9.497875         104.604190
# Distance effect only for accessible cages

acc_pea <- bi_pea %>% 
  dplyr::filter(mesh == "accessible")

mod1 <- lm(pods ~ hole_d, data = acc_pea)
summary(mod1)
## 
## Call:
## lm(formula = pods ~ hole_d, data = acc_pea)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -176.935  -38.798   -8.912   56.525  194.007 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  220.084     52.137   4.221  0.00074 ***
## hole_d        27.127      7.979   3.400  0.00396 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 105.1 on 15 degrees of freedom
## Multiple R-squared:  0.4352, Adjusted R-squared:  0.3975 
## F-statistic: 11.56 on 1 and 15 DF,  p-value: 0.003961
coef(mod1)
## (Intercept)      hole_d 
##   220.08410    27.12663

Pod mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_pea, 
                        x= hole_d, 
                        y = pod_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Pod mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Pod mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(pod_mass ~ hole_d + mesh, data = bi_pea)

summary(mod)
## 
## Call:
## lm(formula = pod_mass ~ hole_d + mesh, data = bi_pea)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -63.367 -27.277  -4.439  25.866  51.171 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          75.950     15.052   5.046 4.16e-05 ***
## hole_d                2.300      2.135   1.077   0.2927    
## meshnot accessible   30.510     15.085   2.022   0.0549 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 36.51 on 23 degrees of freedom
## Multiple R-squared:  0.1778, Adjusted R-squared:  0.1063 
## F-statistic: 2.486 on 2 and 23 DF,  p-value: 0.1053
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##          75.950050           2.299785          30.509960

JUST 0 EDGE

Repeating the analyses just for cages located closest to the edge, given that susliks don’t venture deeper than that in the field.

pea0 <- pea_data %>% 
  dplyr::filter(edge_d == "0")

Plant height

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = pea0, aes(x = mesh, y = height, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

# since the confidence intervals for the effect sizes are computed using
## bootstrapping, important to set a seed for reproducibility

set.seed(123)


ggbetweenstats(data = pea0,
               x= mesh, 
               y = height, 
                pairwise.display = "all",
                title = "Distribution of plant height across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea0,
               x= mesh,
               y = height) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      2.85     2    8.75   0.111 One-w… Omega2    0.239    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.813 Bayes…  -0.207 Bayesi…       0
## 2 mesh-big    0.936 cauchy        0   0.707 0.813 Bayes…  -0.207 Bayesi…       0
## 3 mesh-middle 0.504 cauchy        0   0.707 0.813 Bayes…  -0.207 Bayesi…       0
## 4 mesh-small  0.925 cauchy        0   0.707 0.813 Bayes…  -0.207 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.813 Bayes…  -0.207 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.813 Bayes…  -0.207 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle      1.37   0.699 two.sided   q         Holm    Game… <language>
## 2 big    small       3.18   0.364 two.sided   q         Holm    Game… <language>
## 3 middle small       2.12   0.699 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Number of plants

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = pea0, aes(x = mesh, y = n_plants, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  pea0, 
                x= mesh, 
                y = n_plants, 
                pairwise.display = "all",
                title = "Distribution of number of plants across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea0,
               x= mesh,
               y = n_plants) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      7.06     2    8.47  0.0157 One-w… Omega2    0.514    0.95 0.00659       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707  1.80 Bayes…   0.587 Bayesi…   0.111
## 2 mesh-big    0.924 cauchy        0   0.707  1.80 Bayes…   0.587 Bayesi…   0.111
## 3 mesh-middle 0.819 cauchy        0   0.707  1.80 Bayes…   0.587 Bayesi…   0.111
## 4 mesh-small  0.981 cauchy        0   0.707  1.80 Bayes…   0.587 Bayesi…   0.111
## 5 sig2        1     cauchy        0   0.707  1.80 Bayes…   0.587 Bayesi…   0.111
## 6 g_mesh      1     cauchy        0   0.707  1.80 Bayes…   0.587 Bayesi…   0.111
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     0.338   0.969 two.sided   q         Holm    Game… <language>
## 2 big    small      4.03    0.132 two.sided   q         Holm    Game… <language>
## 3 middle small      4.46    0.132 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Number of pods

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = pea0, aes(x = mesh, y = pods, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  pea0, 
                x= mesh, 
                y = pods, 
                pairwise.display = "s",
                title = "Distribution of number of pods across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea0,
               x= mesh,
               y = pods) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      5.25     2    8.21  0.0339 One-w… Omega2    0.431    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.964 Bayes… -0.0366 Bayesi…       0
## 2 mesh-big    0.873 cauchy        0   0.707 0.964 Bayes… -0.0366 Bayesi…       0
## 3 mesh-middle 0.788 cauchy        0   0.707 0.964 Bayes… -0.0366 Bayesi…       0
## 4 mesh-small  0.962 cauchy        0   0.707 0.964 Bayes… -0.0366 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.964 Bayes… -0.0366 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.964 Bayes… -0.0366 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     0.176   0.992 two.sided   q         Holm    Game… <language>
## 2 big    small      3.30    0.227 two.sided   q         Holm    Game… <language>
## 3 middle small      3.90    0.227 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Pod mass

ggplot(data = pea0, aes(x = mesh, y = pod_mass, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  pea0, x= mesh, y = pod_mass, title = "Distribution of pod mass across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = pea0,
               x= mesh,
               y = pod_mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      5.45     2    8.76  0.0291 One-w… Omega2    0.431    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707  1.38 Bayes…   0.321 Bayesi…  0.0581
## 2 mesh-big    0.922 cauchy        0   0.707  1.38 Bayes…   0.321 Bayesi…  0.0581
## 3 mesh-middle 0.772 cauchy        0   0.707  1.38 Bayes…   0.321 Bayesi…  0.0581
## 4 mesh-small  0.974 cauchy        0   0.707  1.38 Bayes…   0.321 Bayesi…  0.0581
## 5 sig2        1     cauchy        0   0.707  1.38 Bayes…   0.321 Bayesi…  0.0581
## 6 g_mesh      1     cauchy        0   0.707  1.38 Bayes…   0.321 Bayesi…  0.0581
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     0.487   0.937 two.sided   q         Holm    Game… <language>
## 2 big    small      3.74    0.197 two.sided   q         Holm    Game… <language>
## 3 middle small      3.84    0.197 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Covariate: Distance to nearest hole

Plant height

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea0, 
                        x= hole_d, 
                        y = height, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Plant height",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Plant height relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Number of plants

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea0, 
                        x= hole_d, 
                        y = n_plants, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of plants",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of plants relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Number of pods

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea0, 
                        x= hole_d, 
                        y = pods, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of pods",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of pods relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Pod mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  pea0, 
                        x= hole_d, 
                        y = pod_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Pod mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Pod mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Alfalfa data

alf_data <- rio::import(here("data", "cage_data.xlsx"), which = 2) %>% 
  janitor::clean_names() %>% 
  dplyr::mutate(mesh = fct_relevel(fence, "no")) %>% 
  dplyr::filter(!cage %in% c("V01b")) %>% 
  dplyr::mutate(pos = factor(dense_rank(pos)),
         pos2 = as.numeric(pos2)) %>% 
  dplyr::rename("slope" = "pos2")


summary(alf_data)
##      cage              fence               hole_d      pos        slope     
##  Length:40          Length:40          Min.   :0.000   1:13   Min.   : 1.0  
##  Class :character   Class :character   1st Qu.:0.075   2:13   1st Qu.: 3.0  
##  Mode  :character   Mode  :character   Median :0.700   3:14   Median : 5.5  
##                                        Mean   :1.100          Mean   : 5.5  
##                                        3rd Qu.:1.300          3rd Qu.: 8.0  
##                                        Max.   :6.500          Max.   :10.0  
##      kernel          height        other_plants         mass       
##  Min.   : 9457   Min.   :  0.00   Min.   :  0.00   Min.   :  0.00  
##  1st Qu.:13275   1st Qu.: 30.00   1st Qu.:  0.00   1st Qu.: 61.50  
##  Median :22732   Median : 75.00   Median :  7.50   Median :116.00  
##  Mean   :22221   Mean   : 64.25   Mean   : 28.62   Mean   : 98.92  
##  3rd Qu.:27919   3rd Qu.:100.00   3rd Qu.: 62.50   3rd Qu.:144.50  
##  Max.   :45650   Max.   :100.00   Max.   :100.00   Max.   :182.00  
##     dry_mass        mesh   
##  Min.   : 0.0   no    :10  
##  1st Qu.:25.5   big   :10  
##  Median :46.0   middle:10  
##  Mean   :44.6   small :10  
##  3rd Qu.:66.5              
##  Max.   :98.0

Mesh size

Summary

# Function to summarise

baseline_table <- function(data, variables, grouping_var) {

        data %>% 
                group_by(!!!syms(grouping_var)) %>% 
                summarise(
                        across(
                                all_of(variables),
                                ~ paste0(mean(.) %>% round(2), "(±", sd(.) %>% round(2), ")")
                        )
                ) %>% unite(
                        "grouping",
                        all_of(grouping_var)
                ) %>% pivot_longer(
                        cols = -"grouping",
                        names_to = "variables"
                ) %>% pivot_wider(
                        names_from = "grouping"
                )
}


baseline_table(
        alf_data,
        variables = c("height", "other_plants", "mass", "dry_mass"),
        grouping_var = "mesh"
) %>% 
  kbl(caption = "Means and SD for each mesh size") %>%
    kable_styling(bootstrap_options = c("striped", "hover")) 
Means and SD for each mesh size
variables no big middle small
height 46(±40.88) 55(±34.08) 70(±31.62) 86(±21.19)
other_plants 48.5(±48.42) 28(±34.25) 26(±34.71) 12(±23)
mass 69(±59.65) 88.5(±47.29) 103.2(±54.77) 135(±39.71)
dry_mass 29(±26.08) 39.2(±23.38) 47(±24.23) 63.2(±20.25)

Plant height

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

The ANOVA was significant but there were no significant pairwise contrasts (!). The Games-Howell post-hoc test involves a correction for multiple comparisons and makes the test more conservative.

## for reproducibility
set.seed(123)


ggplot(data = alf_data, aes(x = mesh, y = height, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

ggbetweenstats(data = alf_data,
               x= mesh, 
               y = height, 
                pairwise.display = "s",
                title = "Distribution of plant height across mesh mesh size")

ggbetweenstats(data = alf_data,
               x= mesh,
               y = height) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      3.41     3    19.4  0.0381 One-w… Omega2    0.236    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 7 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707  1.27 Bayes…   0.236 Bayesi…  0.0520
## 2 mesh-no     0.956 cauchy        0   0.707  1.27 Bayes…   0.236 Bayesi…  0.0520
## 3 mesh-big    0.814 cauchy        0   0.707  1.27 Bayes…   0.236 Bayesi…  0.0520
## 4 mesh-middle 0.708 cauchy        0   0.707  1.27 Bayes…   0.236 Bayesi…  0.0520
## 5 mesh-small  0.976 cauchy        0   0.707  1.27 Bayes…   0.236 Bayesi…  0.0520
## 6 sig2        1     cauchy        0   0.707  1.27 Bayes…   0.236 Bayesi…  0.0520
## 7 g_mesh      1     cauchy        0   0.707  1.27 Bayes…   0.236 Bayesi…  0.0520
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 6 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     1.44    1     two.sided   q         Holm    Game… <language>
## 2 big    small      3.46    0.555 two.sided   q         Holm    Game… <language>
## 3 middle small      1.88    1     two.sided   q         Holm    Game… <language>
## 4 no     big        0.756   1     two.sided   q         Holm    Game… <language>
## 5 no     middle     2.08    1     two.sided   q         Holm    Game… <language>
## 6 no     small      3.89    0.409 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Paired test: Small vs Control

pair_alf <- alf_data %>% 
  dplyr::filter(mesh %in% c("no", "small")) %>% 
  dplyr::filter(!cage == "V01")
  

ggplot(data = pair_alf, aes(x = mesh, y = height, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)



ggwithinstats(data = pair_alf,
               x= mesh, 
               y = height, 
               title = "Effect of small mesh size on plant height")

ggwithinstats(data = pair_alf,
               x= mesh,
               y = height) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 16
##   term   group statistic df.error p.value method alter…¹ effec…² estim…³ conf.…⁴
##   <chr>  <chr>     <dbl>    <dbl>   <dbl> <chr>  <chr>   <chr>     <dbl>   <dbl>
## 1 height mesh      -4.41        9 0.00169 Paire… two.si… Hedges…   -1.27    0.95
## # … with 6 more variables: conf.low <dbl>, conf.high <dbl>, conf.method <chr>,
## #   conf.distribution <chr>, n.obs <int>, expression <list>, and abbreviated
## #   variable names ¹​alternative, ²​effectsize, ³​estimate, ⁴​conf.level
## 
## $caption_data
## # A tibble: 1 × 16
##   term     effec…¹ estim…² conf.…³ conf.…⁴ conf.…⁵    pd prior…⁶ prior…⁷ prior…⁸
##   <chr>    <chr>     <dbl>   <dbl>   <dbl>   <dbl> <dbl> <chr>     <dbl>   <dbl>
## 1 Differe… Bayesi…   -36.1    0.95   -57.2   -14.0 0.998 cauchy        0   0.707
## # … with 6 more variables: bf10 <dbl>, method <chr>, conf.method <chr>,
## #   log_e_bf10 <dbl>, n.obs <int>, expression <list>, and abbreviated variable
## #   names ¹​effectsize, ²​estimate, ³​conf.level, ⁴​conf.low, ⁵​conf.high,
## #   ⁶​prior.distribution, ⁷​prior.location, ⁸​prior.scale
## 
## $pairwise_comparisons_data
## NULL
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

A paired t-test revealed that, across 10 cages, there was a statistically significant difference in plant height between cages protected with a small mesh and those unprotected . The effect size (Hedges’ g p = -1.27) was very large, as per Sawilowsky (2009) conventions. The Bayes Factor for the same analysis revealed that the data were 26 times more probable under the alternative hypothesis as compared to the null hypothesis. This can be considered as strong evidence (Jeffreys, 1961) in favor of the alternative hypothesis.

Other plants

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = alf_data, aes(x = mesh, y = other_plants, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  alf_data, 
                x= mesh, 
                y = other_plants, 
                pairwise.display = "s",
                title = " other plants across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = alf_data,
               x= mesh,
               y = other_plants) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      1.66     3    19.4   0.209 One-w… Omega2   0.0781    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 7 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.411 Bayes…  -0.889 Bayesi…       0
## 2 mesh-no     0.955 cauchy        0   0.707 0.411 Bayes…  -0.889 Bayesi…       0
## 3 mesh-big    0.526 cauchy        0   0.707 0.411 Bayes…  -0.889 Bayesi…       0
## 4 mesh-middle 0.596 cauchy        0   0.707 0.411 Bayes…  -0.889 Bayesi…       0
## 5 mesh-small  0.915 cauchy        0   0.707 0.411 Bayes…  -0.889 Bayesi…       0
## 6 sig2        1     cauchy        0   0.707 0.411 Bayes…  -0.889 Bayesi…       0
## 7 g_mesh      1     cauchy        0   0.707 0.411 Bayes…  -0.889 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 6 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle    -0.183       1 two.sided   q         Holm    Game… <language>
## 2 big    small     -1.73        1 two.sided   q         Holm    Game… <language>
## 3 middle small     -1.50        1 two.sided   q         Holm    Game… <language>
## 4 no     big       -1.55        1 two.sided   q         Holm    Game… <language>
## 5 no     middle    -1.69        1 two.sided   q         Holm    Game… <language>
## 6 no     small     -3.05        1 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Paired test: Small vs Control

ggplot(data = pair_alf, aes(x = mesh, y = other_plants, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggwithinstats(data = pair_alf,
               x= mesh, 
               y = other_plants, 
               title = "Effect of small mesh size on presence of other plants")

## for reproducibility
set.seed(123)

ggwithinstats(data = pair_alf,
               x= mesh,
               y = other_plants) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 16
##   term      group stati…¹ df.er…² p.value method alter…³ effec…⁴ estim…⁵ conf.…⁶
##   <chr>     <chr>   <dbl>   <dbl>   <dbl> <chr>  <chr>   <chr>     <dbl>   <dbl>
## 1 other_pl… mesh     2.86       9  0.0189 Paire… two.si… Hedges…   0.825    0.95
## # … with 6 more variables: conf.low <dbl>, conf.high <dbl>, conf.method <chr>,
## #   conf.distribution <chr>, n.obs <int>, expression <list>, and abbreviated
## #   variable names ¹​statistic, ²​df.error, ³​alternative, ⁴​effectsize, ⁵​estimate,
## #   ⁶​conf.level
## 
## $caption_data
## # A tibble: 1 × 16
##   term     effec…¹ estim…² conf.…³ conf.…⁴ conf.…⁵    pd prior…⁶ prior…⁷ prior…⁸
##   <chr>    <chr>     <dbl>   <dbl>   <dbl>   <dbl> <dbl> <chr>     <dbl>   <dbl>
## 1 Differe… Bayesi…    30.9    0.95    4.08    57.4 0.985 cauchy        0   0.707
## # … with 6 more variables: bf10 <dbl>, method <chr>, conf.method <chr>,
## #   log_e_bf10 <dbl>, n.obs <int>, expression <list>, and abbreviated variable
## #   names ¹​effectsize, ²​estimate, ³​conf.level, ⁴​conf.low, ⁵​conf.high,
## #   ⁶​prior.distribution, ⁷​prior.location, ⁸​prior.scale
## 
## $pairwise_comparisons_data
## NULL
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Mass

Outliers?

The relationship between mass and dry mass looks suspicious for two cages: v21 and v60b

mass_outliers <- alf_data %>% 
  dplyr::mutate(change_mass = mass - dry_mass)


ggplot(mass_outliers, mapping = aes(x = mesh, y = change_mass)) + 
  geom_boxplot(outlier.colour = "red", outlier.shape = 5, outlier.size = 4)

… but the boxplot doesn’t detect them as outliers, so we include them in the analysis.

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = alf_data, aes(x = mesh, y = mass, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  alf_data, 
                x= mesh, 
                y = mass, 
                pairwise.display = "s",
                title = "Mass across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = alf_data,
               x= mesh,
               y = mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      3.30     3    19.8  0.0417 One-w… Omega2    0.225    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 7 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707  1.40 Bayes…   0.337 Bayesi…  0.0619
## 2 mesh-no     0.963 cauchy        0   0.707  1.40 Bayes…   0.337 Bayesi…  0.0619
## 3 mesh-big    0.746 cauchy        0   0.707  1.40 Bayes…   0.337 Bayesi…  0.0619
## 4 mesh-middle 0.602 cauchy        0   0.707  1.40 Bayes…   0.337 Bayesi…  0.0619
## 5 mesh-small  0.983 cauchy        0   0.707  1.40 Bayes…   0.337 Bayesi…  0.0619
## 6 sig2        1     cauchy        0   0.707  1.40 Bayes…   0.337 Bayesi…  0.0619
## 7 g_mesh      1     cauchy        0   0.707  1.40 Bayes…   0.337 Bayesi…  0.0619
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 6 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     0.908   1     two.sided   q         Holm    Game… <language>
## 2 big    small      3.37    0.589 two.sided   q         Holm    Game… <language>
## 3 middle small      2.10    1     two.sided   q         Holm    Game… <language>
## 4 no     big        1.15    1     two.sided   q         Holm    Game… <language>
## 5 no     middle     1.89    1     two.sided   q         Holm    Game… <language>
## 6 no     small      4.12    0.275 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Paired test: Small vs Control

ggplot(data = pair_alf, aes(x = mesh, y = mass, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggwithinstats(data = pair_alf,
               x= mesh, 
               y = mass, 
               title = "Effect of small mesh size on mass")

## for reproducibility
set.seed(123)

ggwithinstats(data = pair_alf,
               x= mesh,
               y = mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 16
##   term  group statistic df.error  p.value method alter…¹ effec…² estim…³ conf.…⁴
##   <chr> <chr>     <dbl>    <dbl>    <dbl> <chr>  <chr>   <chr>     <dbl>   <dbl>
## 1 mass  mesh      -5.42        9 0.000421 Paire… two.si… Hedges…   -1.57    0.95
## # … with 6 more variables: conf.low <dbl>, conf.high <dbl>, conf.method <chr>,
## #   conf.distribution <chr>, n.obs <int>, expression <list>, and abbreviated
## #   variable names ¹​alternative, ²​effectsize, ³​estimate, ⁴​conf.level
## 
## $caption_data
## # A tibble: 1 × 16
##   term     effec…¹ estim…² conf.…³ conf.…⁴ conf.…⁵    pd prior…⁶ prior…⁷ prior…⁸
##   <chr>    <chr>     <dbl>   <dbl>   <dbl>   <dbl> <dbl> <chr>     <dbl>   <dbl>
## 1 Differe… Bayesi…   -61.9    0.95   -89.3   -31.1  1.00 cauchy        0   0.707
## # … with 6 more variables: bf10 <dbl>, method <chr>, conf.method <chr>,
## #   log_e_bf10 <dbl>, n.obs <int>, expression <list>, and abbreviated variable
## #   names ¹​effectsize, ²​estimate, ³​conf.level, ⁴​conf.low, ⁵​conf.high,
## #   ⁶​prior.distribution, ⁷​prior.location, ⁸​prior.scale
## 
## $pairwise_comparisons_data
## NULL
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Dry mass

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = alf_data, aes(x = mesh, y = dry_mass, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  alf_data, x= mesh, y = dry_mass, title = "Dry mass across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = alf_data,
               x= mesh,
               y = dry_mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      3.84     3    19.9  0.0256 One-w… Omega2    0.262    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 7 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707  2.82 Bayes…    1.04 Bayesi…   0.135
## 2 mesh-no     0.977 cauchy        0   0.707  2.82 Bayes…    1.04 Bayesi…   0.135
## 3 mesh-big    0.774 cauchy        0   0.707  2.82 Bayes…    1.04 Bayesi…   0.135
## 4 mesh-middle 0.626 cauchy        0   0.707  2.82 Bayes…    1.04 Bayesi…   0.135
## 5 mesh-small  0.991 cauchy        0   0.707  2.82 Bayes…    1.04 Bayesi…   0.135
## 6 sig2        1     cauchy        0   0.707  2.82 Bayes…    1.04 Bayesi…   0.135
## 7 g_mesh      1     cauchy        0   0.707  2.82 Bayes…    1.04 Bayesi…   0.135
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 6 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle      1.04   1     two.sided   q         Holm    Game… <language>
## 2 big    small       3.47   0.515 two.sided   q         Holm    Game… <language>
## 3 middle small       2.29   1     two.sided   q         Holm    Game… <language>
## 4 no     big         1.30   1     two.sided   q         Holm    Game… <language>
## 5 no     middle      2.26   1     two.sided   q         Holm    Game… <language>
## 6 no     small       4.63   0.126 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Paired test: Small vs Control

ggplot(data = pair_alf, aes(x = mesh, y = dry_mass, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggwithinstats(data = pair_alf,
               x= mesh, 
               y = dry_mass, 
               title = "Effect of small mesh size on dry mass")

## for reproducibility
set.seed(123)

ggwithinstats(data = pair_alf,
               x= mesh,
               y = dry_mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 16
##   term     group statis…¹ df.er…² p.value method alter…³ effec…⁴ estim…⁵ conf.…⁶
##   <chr>    <chr>    <dbl>   <dbl>   <dbl> <chr>  <chr>   <chr>     <dbl>   <dbl>
## 1 dry_mass mesh     -4.90       9 8.50e-4 Paire… two.si… Hedges…   -1.42    0.95
## # … with 6 more variables: conf.low <dbl>, conf.high <dbl>, conf.method <chr>,
## #   conf.distribution <chr>, n.obs <int>, expression <list>, and abbreviated
## #   variable names ¹​statistic, ²​df.error, ³​alternative, ⁴​effectsize, ⁵​estimate,
## #   ⁶​conf.level
## 
## $caption_data
## # A tibble: 1 × 16
##   term     effec…¹ estim…² conf.…³ conf.…⁴ conf.…⁵    pd prior…⁶ prior…⁷ prior…⁸
##   <chr>    <chr>     <dbl>   <dbl>   <dbl>   <dbl> <dbl> <chr>     <dbl>   <dbl>
## 1 Differe… Bayesi…   -31.7    0.95   -47.3   -14.3 0.998 cauchy        0   0.707
## # … with 6 more variables: bf10 <dbl>, method <chr>, conf.method <chr>,
## #   log_e_bf10 <dbl>, n.obs <int>, expression <list>, and abbreviated variable
## #   names ¹​effectsize, ²​estimate, ³​conf.level, ⁴​conf.low, ⁵​conf.high,
## #   ⁶​prior.distribution, ⁷​prior.location, ⁸​prior.scale
## 
## $pairwise_comparisons_data
## NULL
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Linear models

How to interpret diagnostic plots: https://data.library.virginia.edu/diagnostic-plots/

# Test for normality and homoscedasticity of residuals
par(mfrow=c(2,2))
plot(lm(height ~ pos + slope + kernel + mesh, data = alf_data))

plot(lm(mass ~ pos + slope + kernel + mesh, data = alf_data))

plot(lm(dry_mass ~ pos + slope + kernel + mesh, data = alf_data))

# Perform multiple linear regression
lm_height <- lm(height ~ pos + slope + kernel + mesh, data = alf_data)
summary(lm_height)
## 
## Call:
## lm(formula = height ~ pos + slope + kernel + mesh, data = alf_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -30.455 -10.413  -2.802   6.971  43.790 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 28.288173  18.182708   1.556  0.12960    
## pos2        26.820013   8.151914   3.290  0.00244 ** 
## pos3        38.480236  13.794926   2.789  0.00882 ** 
## slope        5.263648   1.804398   2.917  0.00641 ** 
## kernel      -0.001564   0.000815  -1.920  0.06386 .  
## meshbig     14.558413   8.172024   1.781  0.08433 .  
## meshmiddle  23.799964   8.305001   2.866  0.00729 ** 
## meshsmall   40.000000   8.136258   4.916 2.53e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.19 on 32 degrees of freedom
## Multiple R-squared:  0.7783, Adjusted R-squared:  0.7298 
## F-statistic: 16.05 on 7 and 32 DF,  p-value: 7.563e-09
lm_mass <- lm(mass ~ pos + slope + kernel + mesh, data = alf_data)
summary(lm_mass)
## 
## Call:
## lm(formula = mass ~ pos + slope + kernel + mesh, data = alf_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.013 -19.784  -0.941  16.087  68.172 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 54.169420  30.598953   1.770  0.08620 .  
## pos2        36.519013  13.718530   2.662  0.01205 *  
## pos3        15.372829  23.214929   0.662  0.51259    
## slope       14.997493   3.036549   4.939 2.37e-05 ***
## kernel      -0.003824   0.001371  -2.788  0.00885 ** 
## meshbig     25.218042  13.752372   1.834  0.07601 .  
## meshmiddle  28.746281  13.976154   2.057  0.04793 *  
## meshsmall   66.000000  13.692184   4.820 3.35e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 30.62 on 32 degrees of freedom
## Multiple R-squared:  0.7427, Adjusted R-squared:  0.6864 
## F-statistic:  13.2 on 7 and 32 DF,  p-value: 7.355e-08
lm_dry <- lm(dry_mass ~ pos + slope + kernel + mesh, data = alf_data)
summary(lm_dry)
## 
## Call:
## lm(formula = dry_mass ~ pos + slope + kernel + mesh, data = alf_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -31.356  -9.749  -1.292   7.752  41.007 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 19.4498265 15.0488135   1.292   0.2055    
## pos2        13.9623425  6.7468843   2.069   0.0467 *  
## pos3         3.9539527 11.4172910   0.346   0.7314    
## slope        7.3039186  1.4933993   4.891 2.73e-05 ***
## kernel      -0.0016418  0.0006745  -2.434   0.0207 *  
## meshbig     12.3903922  6.7635283   1.832   0.0763 .  
## meshmiddle  15.5655277  6.8735859   2.265   0.0305 *  
## meshsmall   34.2000000  6.7339272   5.079 1.58e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.06 on 32 degrees of freedom
## Multiple R-squared:  0.7237, Adjusted R-squared:  0.6632 
## F-statistic: 11.97 on 7 and 32 DF,  p-value: 2.17e-07

Only small mesh

To avoid suslik effect

small<- alf_data %>% 
  dplyr::filter(mesh=="small") 


# Test for normality and homoscedasticity of residuals
par(mfrow=c(2,2))

# non-linear relationship not explained by the data. Bad model
plot(lm(height ~ pos + slope, data = small))

# 2 is an outlier and it will affect the lm
plot(lm(mass ~ pos + slope, data = small))

# 2 is an outlier(within cooks distance) and it will affect the lm
plot(lm(dry_mass ~ pos + slope, data = small))

# Perform multiple linear regression
lm_height <- lm(height ~ pos + slope, data = small)
summary(lm_height)
## 
## Call:
## lm(formula = height ~ pos + slope, data = small)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -23.333  -9.722   3.056   9.861  20.000 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   57.778     16.586   3.483   0.0131 *
## pos2           9.259     15.497   0.597   0.5720  
## pos3          27.963     14.402   1.942   0.1002  
## slope          2.593      2.090   1.241   0.2610  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.81 on 6 degrees of freedom
## Multiple R-squared:  0.4747, Adjusted R-squared:  0.212 
## F-statistic: 1.807 on 3 and 6 DF,  p-value: 0.246
lm_mass <- lm(mass ~ pos + slope, data = small)
summary(lm_mass)
## 
## Call:
## lm(formula = mass ~ pos + slope, data = small)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -34.00 -17.25  -4.00  21.83  37.33 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   72.667     26.632   2.729   0.0343 *
## pos2           3.444     24.883   0.138   0.8944  
## pos3          14.222     23.125   0.615   0.5611  
## slope         10.111      3.355   3.013   0.0236 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 30.2 on 6 degrees of freedom
## Multiple R-squared:  0.6145, Adjusted R-squared:  0.4218 
## F-statistic: 3.188 on 3 and 6 DF,  p-value: 0.1055
lm_dry <- lm(dry_mass ~ pos + slope, data = small)
summary(lm_dry)
## 
## Call:
## lm(formula = dry_mass ~ pos + slope, data = small)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -22.000 -10.500  -1.333  13.583  17.667 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  39.3333    15.9261   2.470   0.0485 *
## pos2         -0.1111    14.8806  -0.007   0.9943  
## pos3         -2.8889    13.8289  -0.209   0.8414  
## slope         4.5556     2.0065   2.270   0.0636 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.06 on 6 degrees of freedom
## Multiple R-squared:  0.4697, Adjusted R-squared:  0.2045 
## F-statistic: 1.771 on 3 and 6 DF,  p-value: 0.2523
# Test for normality and homoscedasticity of residuals
par(mfrow=c(2,2))

# Not equal variance (homoscedasticity)
plot(lm(height ~  slope, data = small))

#okayish
plot(lm(mass ~ slope, data = small))

#okayish
plot(lm(dry_mass ~ slope, data = small))

# Perform multiple linear regression
lm_height <- lm(height ~slope, data = small)
summary(lm_height)
## 
## Call:
## lm(formula = height ~ slope, data = small)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -37.212  -7.970   4.303  14.000  24.909 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   72.667     14.401   5.046 0.000994 ***
## slope          2.424      2.321   1.045 0.326775    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.08 on 8 degrees of freedom
## Multiple R-squared:   0.12,  Adjusted R-squared:  0.01001 
## F-statistic: 1.091 on 1 and 8 DF,  p-value: 0.3268
lm_mass <- lm(mass ~ slope, data = small)
summary(lm_mass)
## 
## Call:
## lm(formula = mass ~ slope, data = small)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -29.83 -21.55  -6.83  25.90  34.07 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   79.733     18.495   4.311  0.00258 **
## slope         10.048      2.981   3.371  0.00977 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 27.07 on 8 degrees of freedom
## Multiple R-squared:  0.5869, Adjusted R-squared:  0.5352 
## F-statistic: 11.36 on 1 and 8 DF,  p-value: 0.009768
lm_dry <- lm(dry_mass ~slope, data = small)
summary(lm_dry)
## 
## Call:
## lm(formula = dry_mass ~ slope, data = small)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -23.71 -10.11  -0.20  11.88  18.85 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   38.133     10.736   3.552  0.00749 **
## slope          4.558      1.730   2.634  0.02999 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.72 on 8 degrees of freedom
## Multiple R-squared:  0.4645, Adjusted R-squared:  0.3975 
## F-statistic: 6.938 on 1 and 8 DF,  p-value: 0.02999

Covariate: Distance to nearest hole

Plant height

## for reproducibility
set.seed(123)


grouped_ggscatterstats( data =  alf_data, 
                        x= hole_d, 
                        y = height, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Plant height",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Plant height relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Number of plants

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  alf_data, 
                        x= hole_d, 
                        y = other_plants, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Other plants",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Other plants relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  alf_data, 
                        x= hole_d, 
                        y = mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Mass",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Dry mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  alf_data, 
                        x= hole_d, 
                        y = dry_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Dry mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Dry mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ALFALFA MERGED

Covariate: Distance to nearest hole

No mesh, big and middle merged, to have accessible not accessible

bi_al <-alf_data %>% 
    dplyr::mutate(mesh = recode(mesh, big = "accessible", middle = "accessible", no = "accessible", small =  "not accessible"))

Plant height

## for reproducibility
set.seed(123)


grouped_ggscatterstats( data =  bi_al, 
                        x= hole_d, 
                        y = height, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Plant height",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Plant height relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(height ~ hole_d + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = height ~ hole_d + mesh, data = bi_al)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -46.167 -20.903   0.486  23.800  53.833 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          46.167      6.163   7.491 6.35e-09 ***
## hole_d               11.130      3.212   3.465  0.00136 ** 
## meshnot accessible   23.361     10.746   2.174  0.03619 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 29.09 on 37 degrees of freedom
## Multiple R-squared:  0.3447, Adjusted R-squared:  0.3092 
## F-statistic: 9.729 on 2 and 37 DF,  p-value: 0.0004024
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##           46.16708           11.12972           23.36094

Number of plants

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_al, 
                        x= hole_d, 
                        y = other_plants, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Other plants",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Other plants relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(other_plants ~ hole_d + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = other_plants ~ hole_d + mesh, data = bi_al)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -43.652 -30.061  -8.958  28.991  56.348 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          43.652      7.187   6.074 4.98e-07 ***
## hole_d               -9.745      3.746  -2.602   0.0133 *  
## meshnot accessible  -17.229     12.531  -1.375   0.1774    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 33.92 on 37 degrees of freedom
## Multiple R-squared:  0.2123, Adjusted R-squared:  0.1697 
## F-statistic: 4.986 on 2 and 37 DF,  p-value: 0.0121
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##          43.652200          -9.745411         -17.228992

Mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_al, 
                        x= hole_d, 
                        y = mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Mass",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(mass ~ hole_d + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = mass ~ hole_d + mesh, data = bi_al)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -70.741 -38.194  -9.731  44.298  73.259 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          70.741      9.641   7.337 1.01e-08 ***
## hole_d               16.602      5.025   3.304  0.00212 ** 
## meshnot accessible   39.688     16.811   2.361  0.02362 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 45.51 on 37 degrees of freedom
## Multiple R-squared:  0.3427, Adjusted R-squared:  0.3072 
## F-statistic: 9.647 on 2 and 37 DF,  p-value: 0.0004249
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##           70.74057           16.60215           39.68824

Dry mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_al, 
                        x= hole_d, 
                        y = dry_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Dry mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Dry mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(dry_mass ~ hole_d + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = dry_mass ~ hole_d + mesh, data = bi_al)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -32.497 -19.862  -4.923  18.555  40.137 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          32.497      4.754   6.836 4.69e-08 ***
## hole_d                6.064      2.478   2.448   0.0192 *  
## meshnot accessible   21.727      8.289   2.621   0.0126 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22.44 on 37 degrees of freedom
## Multiple R-squared:  0.2905, Adjusted R-squared:  0.2522 
## F-statistic: 7.576 on 2 and 37 DF,  p-value: 0.001746
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##          32.497433           6.064281          21.727431

Covariate KERNEL

Plant height

## for reproducibility
set.seed(123)


grouped_ggscatterstats( data =  bi_al, 
                        x= kernel, 
                        y = height, 
                        grouping.var = mesh,
                        xlab = "Density (kernel)",
                        ylab= "Plant height",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Plant height relative to density (kernel), grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(height ~ kernel + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = height ~ kernel + mesh, data = bi_al)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -56.570 -22.328   3.435  24.628  53.636 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        95.4261560 12.8602707   7.420 7.87e-09 ***
## kernel             -0.0017279  0.0005253  -3.289  0.00221 ** 
## meshnot accessible 28.8732310 10.7532270   2.685  0.01079 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 29.45 on 37 degrees of freedom
## Multiple R-squared:  0.3284, Adjusted R-squared:  0.2921 
## F-statistic: 9.046 on 2 and 37 DF,  p-value: 0.0006332
coef(mod)
##        (Intercept)             kernel meshnot accessible 
##       95.426155984       -0.001727883       28.873230996

Number of plants

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_al, 
                        x= kernel, 
                        y = other_plants, 
                        grouping.var = mesh,
                        xlab = "Density (kernel)",
                        ylab= "Other plants",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Other plants relative to density (kernel), grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(other_plants ~ kernel + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = other_plants ~ kernel + mesh, data = bi_al)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -46.25 -25.93 -14.25  33.12  65.58 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)  
## (Intercept)         1.166e+01  1.559e+01   0.748   0.4592  
## kernel              1.012e-03  6.368e-04   1.589   0.1205  
## meshnot accessible -2.209e+01  1.303e+01  -1.695   0.0985 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 35.7 on 37 degrees of freedom
## Multiple R-squared:  0.1277, Adjusted R-squared:  0.08059 
## F-statistic: 2.709 on 2 and 37 DF,  p-value: 0.0798
coef(mod)
##        (Intercept)             kernel meshnot accessible 
##       11.659782225        0.001012052      -22.092415802

Mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_al, 
                        x= kernel, 
                        y = mass, 
                        grouping.var = mesh,
                        xlab = "Density (kernel)",
                        ylab= "Mass",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Mass relative to Density (kernel), grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(mass ~ kernel + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = mass ~ kernel + mesh, data = bi_al)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -86.602 -36.676   9.515  44.097  67.980 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         1.135e+02  2.210e+01   5.135 9.29e-06 ***
## kernel             -1.195e-03  9.027e-04  -1.324   0.1937    
## meshnot accessible  4.801e+01  1.848e+01   2.598   0.0134 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 50.6 on 37 degrees of freedom
## Multiple R-squared:  0.1873, Adjusted R-squared:  0.1434 
## F-statistic: 4.264 on 2 and 37 DF,  p-value: 0.02155
coef(mod)
##        (Intercept)             kernel meshnot accessible 
##       113.47210991        -0.00119485        48.01233784

Dry mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_al, 
                        x= kernel, 
                        y = dry_mass, 
                        grouping.var = mesh,
                        xlab = "Density (kernel)",
                        ylab= "Dry mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Dry mass relative to Density (kernel), grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 4, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(dry_mass ~ kernel + mesh, data = bi_al)

summary(mod)
## 
## Call:
## lm(formula = dry_mass ~ kernel + mesh, data = bi_al)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -38.333 -18.535  -0.436  23.098  39.033 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        44.3437562 10.5074059   4.220 0.000152 ***
## kernel             -0.0002673  0.0004292  -0.623 0.537297    
## meshnot accessible 24.7803914  8.7858586   2.820 0.007663 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 24.06 on 37 degrees of freedom
## Multiple R-squared:  0.1842, Adjusted R-squared:  0.1401 
## F-statistic: 4.178 on 2 and 37 DF,  p-value: 0.02312
coef(mod)
##        (Intercept)             kernel meshnot accessible 
##      44.3437561760      -0.0002672688      24.7803913758

Position

There are two variables related to the position of the cages in the field: Pos: Relates to the area covered by susliks. Pos2: Slope of the field. 10 is lower, hence more humidity and beneficial for the alfalfa

To see the effect of Pos and Pos2 on the alfalfa success, we group data from all cages except those with small mesh, selecting only the plants without protection again susliks.

alf_unprotected <- alf_data %>% 
  dplyr::filter(!mesh == "small") %>% 
  dplyr::select(!mesh) # %>% 
  #dplyr::mutate(slope = as.numeric(slope))



## for reproducibility
set.seed(123)

 ggbetweenstats( data =  alf_unprotected, x= pos, y = height, title = "Plant height vs suslik density")

## for reproducibility
set.seed(123)

 ggbetweenstats( data =  alf_unprotected, x= pos, y = other_plants, title = "Other plants vs suslik density")

 ## for reproducibility
set.seed(123)

 ggbetweenstats( data =  alf_unprotected, x= pos, y = mass, title = "Mass vs suslik density")

 ## for reproducibility
set.seed(123)

ggbetweenstats( data =  alf_unprotected,
 x= pos, y = dry_mass,
 pairwise.display = "s",
  output = "dataframe",
 title = "Dry mass vs suslik density")

Position 2: Slope

## for reproducibility
set.seed(123)

 ggscatterstats( data =  alf_unprotected, x= slope, y = height, title = "Plant height vs slope")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## for reproducibility
set.seed(123)

 ggscatterstats( data =  alf_unprotected, x= slope, y = other_plants, title = "Other plants vs slope")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

 ## for reproducibility
set.seed(123)

 ggscatterstats( data =  alf_unprotected, x= slope, y = mass, title = "Mass vs slope")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

 ## for reproducibility
set.seed(123)

ggscatterstats( data =  alf_unprotected, x= slope, y = dry_mass, title = "Dry mass vs slope")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Kernel and position

Pos is basically an alternative to kernel, so we don’t use it in the same model. Pos2 (slope of the field) is different, but they are still a bit correlated (less susliks up the hill?). So probably it makes sense to test the interaction.

Height with interaction

The additive model is better, the interaction is not significant, so kernel and pos2 are independent (I tested also the other variables and the interaction is never significant)

# Fit the linear regression model
model <- lm(height ~ kernel * slope, data = alf_unprotected)
summary(model)
## 
## Call:
## lm(formula = height ~ kernel * slope, data = alf_unprotected)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -35.78 -15.98  -1.73  13.34  42.99 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   1.187e+02  2.153e+01   5.511 8.78e-06 ***
## kernel       -5.498e-03  1.159e-03  -4.742 6.64e-05 ***
## slope         5.326e+00  3.524e+00   1.511    0.143    
## kernel:slope  2.260e-04  1.507e-04   1.500    0.146    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.05 on 26 degrees of freedom
## Multiple R-squared:  0.6922, Adjusted R-squared:  0.6566 
## F-statistic: 19.49 on 3 and 26 DF,  p-value: 7.881e-07
# Fit the linear regression model
model <- lm(height ~ kernel + slope, data = alf_unprotected)
summary(model)
## 
## Call:
## lm(formula = height ~ kernel + slope, data = alf_unprotected)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -40.25 -15.83  -2.86  10.98  50.02 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 90.3524940 10.5865931   8.535 3.79e-09 ***
## kernel      -0.0039601  0.0005533  -7.158 1.07e-07 ***
## slope        9.9482874  1.7483852   5.690 4.81e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.53 on 27 degrees of freedom
## Multiple R-squared:  0.6655, Adjusted R-squared:  0.6408 
## F-statistic: 26.86 on 2 and 27 DF,  p-value: 3.79e-07

Other plants

# Fit the linear regression model
model <- lm(other_plants ~ kernel + slope, data = alf_unprotected)
summary(model)
## 
## Call:
## lm(formula = other_plants ~ kernel + slope, data = alf_unprotected)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -50.303 -22.928   3.801  19.372  51.731 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  15.870994  13.987281   1.135    0.266    
## kernel        0.003590   0.000731   4.912 3.86e-05 ***
## slope       -11.191063   2.310012  -4.845 4.62e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 28.45 on 27 degrees of freedom
## Multiple R-squared:  0.5208, Adjusted R-squared:  0.4853 
## F-statistic: 14.67 on 2 and 27 DF,  p-value: 4.864e-05

Mass

# Fit the linear regression model
model <- lm(mass ~ kernel + slope, data = alf_unprotected)
summary(model)
## 
## Call:
## lm(formula = mass ~ kernel + slope, data = alf_unprotected)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -67.543 -22.672  -5.548  19.529  84.808 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.067e+02  1.751e+01   6.092 1.66e-06 ***
## kernel      -5.068e-03  9.152e-04  -5.537 7.22e-06 ***
## slope        1.689e+01  2.892e+00   5.840 3.22e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 35.62 on 27 degrees of freedom
## Multiple R-squared:  0.5971, Adjusted R-squared:  0.5673 
## F-statistic: 20.01 on 2 and 27 DF,  p-value: 4.672e-06

Dry mass

# Fit the linear regression model
model <- lm(dry_mass ~ kernel + slope, data = alf_unprotected)
summary(model)
## 
## Call:
## lm(formula = dry_mass ~ kernel + slope, data = alf_unprotected)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -30.410  -8.685  -3.997   8.298  42.334 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 41.5055672  7.5605246   5.490 8.19e-06 ***
## kernel      -0.0022248  0.0003951  -5.631 5.63e-06 ***
## slope        8.4311295  1.2486273   6.752 2.99e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.38 on 27 degrees of freedom
## Multiple R-squared:  0.6444, Adjusted R-squared:  0.6181 
## F-statistic: 24.46 on 2 and 27 DF,  p-value: 8.671e-07

WHEAT 2022

Copied and pasted the values from the formulas from the original file (cage_experiments_results2)

wheat_data <- rio::import(here("data", "wheat2022.xlsx")) %>% 
  janitor::clean_names() %>% 
  dplyr::mutate(mesh = as.factor(mesh)) %>% 
  dplyr::mutate(line = as.factor(line))

head(wheat_data)
##   cage mesh hole_d line n_cobs total_mass grain_mass  cob_mass
## 1  A03  big    7.1    A    425        520  1.2666667 1.2235294
## 2  A06  big    6.6    A    505        720  1.2000000 1.4257426
## 3  A09  big    2.1    A      0          0  0.0000000 0.0000000
## 4  B03  big    4.2    B    371        403  0.5333333 1.0862534
## 5  B06  big    3.8    B    113        109  0.8333333 0.9646018
## 6  B09  big    4.6    B    516        718  1.1000000 1.3914729
##                       comment
## 1                        <NA>
## 2                        <NA>
## 3 eaten all; 0 is not mistake
## 4                        <NA>
## 5                        <NA>
## 6                        <NA>

Summary

# Function to summarise

baseline_table <- function(data, variables, grouping_var) {

        data %>% 
                group_by(!!!syms(grouping_var)) %>% 
                summarise(
                        across(
                                all_of(variables),
                                ~ paste0(mean(.) %>% round(2), "(±", sd(.) %>% round(2), ")")
                        )
                ) %>% unite(
                        "grouping",
                        all_of(grouping_var)
                ) %>% pivot_longer(
                        cols = -"grouping",
                        names_to = "variables"
                ) %>% pivot_wider(
                        names_from = "grouping"
                )
}


table_w <-  baseline_table(
        wheat_data,
        variables = c("n_cobs", "total_mass", "grain_mass", "cob_mass"),
        grouping_var = "mesh"
)  


table_w <- as.data.frame(table_w) 

rownames(table_w)= c("Number of cobs", "Total mass", "Grain mass", "Cob mass")

  
table_w
##                 variables             big         middle           small
## Number of cobs     n_cobs 380.44(±207.54) 283.4(±213.53)      486(±78.8)
## Total mass     total_mass 572.44(±429.95) 418.3(±401.81) 741.44(±287.59)
## Grain mass     grain_mass      0.98(±0.5)     0.98(±0.5)     1.27(±0.33)
## Cob mass         cob_mass     1.23(±0.62)    1.15(±0.58)     1.51(±0.45)
 summary_wheat <- table_w %>% 
     dplyr::select(-variables) %>% 
  kbl(caption = "Means and SD for each mesh size", col.names = c("Large", "Middle", "Small")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"))


save_kable(summary_wheat, here::here("output", "summary_wheat.png"))

summary_wheat
Means and SD for each mesh size
Large Middle Small
Number of cobs 380.44(±207.54) 283.4(±213.53) 486(±78.8)
Total mass 572.44(±429.95) 418.3(±401.81) 741.44(±287.59)
Grain mass 0.98(±0.5) 0.98(±0.5) 1.27(±0.33)
Cob mass 1.23(±0.62) 1.15(±0.58) 1.51(±0.45)

Total mass

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

The ANOVA was significant but there were no significant pairwise contrasts (!). The Games-Howell post-hoc test involves a correction for multiple comparisons and makes the test more conservative.

ggplot(data = wheat_data, aes(x = mesh, y = total_mass, color=mesh)) +
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

# since the confidence intervals for the effect sizes are computed using
## bootstrapping, important to set a seed for reproducibility

set.seed(123)


ggbetweenstats(data = wheat_data,
               x= mesh, 
               y = total_mass, 
                pairwise.display = "all",
                title = "Distribution of total mass across mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = wheat_data,
               x= mesh,
               y = total_mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      2.03     2    16.2   0.164 One-w… Omega2   0.0968    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.494 Bayes…  -0.706 Bayesi…       0
## 2 mesh-big    0.514 cauchy        0   0.707 0.494 Bayes…  -0.706 Bayesi…       0
## 3 mesh-middle 0.913 cauchy        0   0.707 0.494 Bayes…  -0.706 Bayesi…       0
## 4 mesh-small  0.920 cauchy        0   0.707 0.494 Bayes…  -0.706 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.494 Bayes…  -0.706 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.494 Bayes…  -0.706 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     -1.14   1     two.sided   q         Holm    Game… <language>
## 2 big    small       1.39   1     two.sided   q         Holm    Game… <language>
## 3 middle small       2.87   0.410 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Number of cobs

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = wheat_data, aes(x = mesh, y = n_cobs, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  wheat_data, 
                x= mesh, 
                y = n_cobs, 
                pairwise.display = "all",
                title = "Distribution of number of cobs across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = wheat_data,
               x= mesh,
               y = n_cobs) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      4.28     2    13.9  0.0356 One-w… Omega2    0.280    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707  1.18 Bayes…   0.163 Bayesi…  0.0262
## 2 mesh-big    0.516 cauchy        0   0.707  1.18 Bayes…   0.163 Bayesi…  0.0262
## 3 mesh-middle 0.966 cauchy        0   0.707  1.18 Bayes…   0.163 Bayesi…  0.0262
## 4 mesh-small  0.971 cauchy        0   0.707  1.18 Bayes…   0.163 Bayesi…  0.0262
## 5 sig2        1     cauchy        0   0.707  1.18 Bayes…   0.163 Bayesi…  0.0262
## 6 g_mesh      1     cauchy        0   0.707  1.18 Bayes…   0.163 Bayesi…  0.0262
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle     -1.42   0.728 two.sided   q         Holm    Game… <language>
## 2 big    small       2.02   0.728 two.sided   q         Holm    Game… <language>
## 3 middle small       3.95   0.122 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Grain mass

Welch’s ANOVA with the Games-Howell post hoc test. https://statisticsbyjim.com/anova/welchs-anova-compared-to-classic-one-way-anova/

ggplot(data = wheat_data, aes(x = mesh, y = grain_mass, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  wheat_data, 
                x= mesh, 
                y = grain_mass, 
                pairwise.display = "s",
                title = "Distribution of grain_mass across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = wheat_data,
               x= mesh,
               y = grain_mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      1.58     2    16.1   0.236 One-w… Omega2   0.0574    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.350 Bayes…   -1.05 Bayesi…       0
## 2 mesh-big    0.75  cauchy        0   0.707 0.350 Bayes…   -1.05 Bayesi…       0
## 3 mesh-middle 0.766 cauchy        0   0.707 0.350 Bayes…   -1.05 Bayesi…       0
## 4 mesh-small  0.916 cauchy        0   0.707 0.350 Bayes…   -1.05 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.350 Bayes…   -1.05 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.350 Bayes…   -1.05 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle   -0.0205   1.00  two.sided   q         Holm    Game… <language>
## 2 big    small     2.03     0.951 two.sided   q         Holm    Game… <language>
## 3 middle small     2.12     0.951 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Cob mass

ggplot(data = wheat_data, aes(x = mesh, y = cob_mass, color=mesh))+
  geom_boxplot()+
  scale_color_brewer(palette="Dark2") +
  geom_jitter(shape=16, position=position_jitter(0.2))

## for reproducibility
set.seed(123)

ggbetweenstats( data =  wheat_data, x= mesh, y = cob_mass, title = "Distribution of cob mass across mesh mesh size")

## for reproducibility
set.seed(123)

ggbetweenstats(data = wheat_data,
               x= mesh,
               y = cob_mass) %>%
  extract_stats() 
## $subtitle_data
## # A tibble: 1 × 14
##   statistic    df df.er…¹ p.value method effec…² estim…³ conf.…⁴ conf.…⁵ conf.…⁶
##       <dbl> <dbl>   <dbl>   <dbl> <chr>  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
## 1      1.26     2    16.4   0.309 One-w… Omega2   0.0265    0.95       0       1
## # … with 4 more variables: conf.method <chr>, conf.distribution <chr>,
## #   n.obs <int>, expression <list>, and abbreviated variable names ¹​df.error,
## #   ²​effectsize, ³​estimate, ⁴​conf.level, ⁵​conf.low, ⁶​conf.high
## 
## $caption_data
## # A tibble: 6 × 17
##   term           pd prior…¹ prior…² prior…³  bf10 method log_e…⁴ effec…⁵ estim…⁶
##   <chr>       <dbl> <chr>     <dbl>   <dbl> <dbl> <chr>    <dbl> <chr>     <dbl>
## 1 mu          1     cauchy        0   0.707 0.312 Bayes…   -1.16 Bayesi…       0
## 2 mesh-big    0.652 cauchy        0   0.707 0.312 Bayes…   -1.16 Bayesi…       0
## 3 mesh-middle 0.810 cauchy        0   0.707 0.312 Bayes…   -1.16 Bayesi…       0
## 4 mesh-small  0.895 cauchy        0   0.707 0.312 Bayes…   -1.16 Bayesi…       0
## 5 sig2        1     cauchy        0   0.707 0.312 Bayes…   -1.16 Bayesi…       0
## 6 g_mesh      1     cauchy        0   0.707 0.312 Bayes…   -1.16 Bayesi…       0
## # … with 7 more variables: std.dev <dbl>, conf.level <dbl>, conf.low <dbl>,
## #   conf.high <dbl>, conf.method <chr>, n.obs <int>, expression <list>, and
## #   abbreviated variable names ¹​prior.distribution, ²​prior.location,
## #   ³​prior.scale, ⁴​log_e_bf10, ⁵​effectsize, ⁶​estimate
## 
## $pairwise_comparisons_data
## # A tibble: 3 × 9
##   group1 group2 statistic p.value alternative distrib…¹ p.adj…² test  expression
##   <chr>  <chr>      <dbl>   <dbl> <chr>       <chr>     <chr>   <chr> <list>    
## 1 big    middle    -0.409   1     two.sided   q         Holm    Game… <language>
## 2 big    small      1.55    1     two.sided   q         Holm    Game… <language>
## 3 middle small      2.15    0.925 two.sided   q         Holm    Game… <language>
## # … with abbreviated variable names ¹​distribution, ²​p.adjust.method
## 
## $descriptive_data
## NULL
## 
## $one_sample_data
## NULL
## 
## $tidy_data
## NULL
## 
## $glance_data
## NULL

Covariate: Distance to nearest hole

Number of cobs

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  wheat_data, 
                        x= hole_d, 
                        y = n_cobs, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of cobs",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of cobs relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(n_cobs ~ hole_d + mesh, data = wheat_data)
summary(mod)
## 
## Call:
## lm(formula = n_cobs ~ hole_d + mesh, data = wheat_data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -301.55 -100.00   21.39  119.90  258.72 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   241.18      86.59   2.785   0.0103 *
## hole_d         28.75      13.62   2.110   0.0455 *
## meshmiddle    -89.44      77.35  -1.156   0.2589  
## meshsmall      95.97      79.40   1.209   0.2386  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 168.2 on 24 degrees of freedom
## Multiple R-squared:  0.3207, Adjusted R-squared:  0.2357 
## F-statistic: 3.776 on 3 and 24 DF,  p-value: 0.02373
coef(mod)
## (Intercept)      hole_d  meshmiddle   meshsmall 
##   241.18396    28.74643   -89.44261    95.97341

Pearson’s correlation test revealed that, across the 9 cages with big mesh size, the distance to the nearest hole (m) was positively correlated with plant height, and this effect was statistically significant. The effect size (r=0.81) was large, as per Cohen’s (1988) conventions. The Bayes Factor for the same analysis revealed that the data were 7.14 times more probable under the alternative hypothesis as compared to the null hypothesis. This can be considered as moderate evidence (Jeffreys, 1961) in favor of the alternative hypothesis (of a correlation between these two variables).

Total mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  wheat_data, 
                        x= hole_d, 
                        y = total_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Total mass",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Total mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Grain mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  wheat_data, 
                        x= hole_d, 
                        y = grain_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Grain mass",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Grain mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Cob mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  wheat_data, 
                        x= hole_d, 
                        y = cob_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Cob mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Cob mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

WHEAT MERGED

Covariate: Distance to nearest hole

No mesh, big and middle merged, to have accessible not accessible

bi_whe <-wheat_data %>% 
    dplyr::mutate(mesh = recode(mesh, big = "accessible", middle = "accessible", no = "accessible", small =  "not accessible"))

Number of cobs

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_whe, 
                        x= hole_d, 
                        y = n_cobs, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Number of cobs",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Number of cobs relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(n_cobs ~ hole_d + mesh, data = bi_whe)
summary(mod)
## 
## Call:
## lm(formula = n_cobs ~ hole_d + mesh, data = bi_whe)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -321.11 -101.86   32.11  111.38  275.10 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)  
## (Intercept)          190.66      75.26   2.533   0.0179 *
## hole_d                29.48      13.70   2.152   0.0413 *
## meshnot accessible   142.70      68.81   2.074   0.0485 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 169.3 on 25 degrees of freedom
## Multiple R-squared:  0.2828, Adjusted R-squared:  0.2254 
## F-statistic: 4.929 on 2 and 25 DF,  p-value: 0.01568
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##          190.65668           29.48012          142.70179
# Distance effect only for accessible cages

acc_wheat <- bi_whe %>% 
  dplyr::filter(mesh == "accessible")

mod1 <- lm(n_cobs ~ hole_d, data = acc_wheat)
summary(mod1)
## 
## Call:
## lm(formula = n_cobs ~ hole_d, data = acc_wheat)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -338.88 -138.98   34.81  122.12  261.06 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)    79.58     100.17   0.794    0.438  
## hole_d         53.09      19.38   2.739    0.014 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 180.6 on 17 degrees of freedom
## Multiple R-squared:  0.3062, Adjusted R-squared:  0.2654 
## F-statistic: 7.502 on 1 and 17 DF,  p-value: 0.01399
coef(mod1)
## (Intercept)      hole_d 
##    79.58426    53.08612

Total mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_whe, 
                        x= hole_d, 
                        y = total_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Total mass",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Total mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(total_mass ~ hole_d + mesh, data = bi_whe)
summary(mod)
## 
## Call:
## lm(formula = total_mass ~ hole_d + mesh, data = bi_whe)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -502.52 -286.78  -42.55  201.45  741.76 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)  
## (Intercept)          235.75     160.42    1.47   0.1541  
## hole_d                54.31      29.20    1.86   0.0747 .
## meshnot accessible   224.46     146.68    1.53   0.1385  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 360.9 on 25 degrees of freedom
## Multiple R-squared:  0.2037, Adjusted R-squared:  0.1399 
## F-statistic: 3.197 on 2 and 25 DF,  p-value: 0.05805
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##          235.75301           54.31424          224.46438

Grain mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_whe, 
                        x= hole_d, 
                        y = grain_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Grain mass",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Grain mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(grain_mass ~ hole_d + mesh, data = bi_whe)
summary(mod)
## 
## Call:
## lm(formula = grain_mass ~ hole_d + mesh, data = bi_whe)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.81333 -0.26952  0.07037  0.22484  0.68600 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)   
## (Intercept)         0.67920    0.18762   3.620   0.0013 **
## hole_d              0.06387    0.03415   1.870   0.0732 . 
## meshnot accessible  0.25675    0.17154   1.497   0.1470   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.422 on 25 degrees of freedom
## Multiple R-squared:  0.2018, Adjusted R-squared:  0.1379 
## F-statistic:  3.16 on 2 and 25 DF,  p-value: 0.05977
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##         0.67920385         0.06387193         0.25674814

Cob mass

## for reproducibility
set.seed(123)

grouped_ggscatterstats( data =  bi_whe, 
                        x= hole_d, 
                        y = cob_mass, 
                        grouping.var = mesh,
                        xlab = "Distance to nearest hole (m)",
                        ylab= "Cob mass (g)",
                        # arguments relevant for ggstatsplot::combine_plots
                        annotation.args = list(
                          title = "Cob mass relative to distance to nearest hole, grouped by mesh size"
                        ),
                        plotgrid.args = list(nrow = 3, ncol = 1))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mod <- lm(cob_mass ~ hole_d + mesh, data = bi_whe)
summary(mod)
## 
## Call:
## lm(formula = cob_mass ~ hole_d + mesh, data = bi_whe)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.98665 -0.33358 -0.02138  0.38533  0.85006 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)   
## (Intercept)         0.82378    0.23178   3.554  0.00154 **
## hole_d              0.07756    0.04219   1.838  0.07796 . 
## meshnot accessible  0.28486    0.21192   1.344  0.19098   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5214 on 25 degrees of freedom
## Multiple R-squared:  0.1857, Adjusted R-squared:  0.1205 
## F-statistic:  2.85 on 2 and 25 DF,  p-value: 0.07672
coef(mod)
##        (Intercept)             hole_d meshnot accessible 
##         0.82377832         0.07755616         0.28485542
LS0tDQphdXRob3I6ICJGZXJuYW5kbyBNYXRlb3MtR29uesOhbGV6Ig0KZGF0ZTogTGFzdCB1cGRhdGUgImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICAgIHNtb290aF9zY3JvbGw6IG5vDQogICAgICBkZl9wcmludDogcGFnZWQNCiAgbWRfZG9jdW1lbnQ6DQogICAgdmFyaWFudDogbWFya2Rvd25fZ2l0aHViDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KdGl0bGU6ICJFZmZlY3Qgb2YgcHJvdGVjdGlvbiBvbiBwbGFudCBwcmVkYXRpb24gYnkgc3VzbGlrcyINCg0KDQojIHRpdGxlOiAiRWZmZWN0IG9mIHByb3RlY3Rpb24gb24gcGxhbnQgcHJlZGF0aW9uIGJ5IHN1c2xpa3MiDQojIGF1dGhvcjogIkZlcm5hbmRvIE1hdGVvcy1Hb256w6FsZXoiDQojIGRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCiMgb3V0cHV0Og0KIyAgIHdvcmRfZG9jdW1lbnQ6DQojICAgICB0b2M6IG5vDQojICAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KIyAgICAgcmVmZXJlbmNlX2RvY3g6IHN0eWxld29yZC5kb2N4DQojIA0KIyAgIA0KDQprbml0OiAoZnVuY3Rpb24oaW5wdXRGaWxlLCBlbmNvZGluZykgew0KICBybWFya2Rvd246OnJlbmRlcihpbnB1dEZpbGUsIGVuY29kaW5nID0gZW5jb2RpbmcsIG91dHB1dF9kaXIgPSAib3V0cHV0IikgfSkNCiAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQobGFiZWwgPSAibGFiZWwiKQ0KYGBgDQoNCiMgTGlicmFyeQ0KDQpgYGB7ciBsaWJyYXJ5LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQogIyBpbnN0YWxsLnBhY2thZ2VzKCJwYWNtYW4iKQ0KIyB3cml0ZUxpbmVzKHBhY21hbjo6cF9saWIoKSwgIn4vRGVza3RvcC9saXN0X29mX1JfcGFja2FnZXMuY3N2IikgIyB0byBxdWlja2x5IGJhY2sgdXAgcGFja2FnZXMNCiMgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIlRoaW5rUi1vcGVuL3JlbWVkeSIpDQoNCg0KDQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsZ2dwbG90MiwgamFuaXRvciwgZGF0YS50YWJsZSwgaGVyZSwgcmlvLCBrYWJsZUV4dHJhLCBnZ3N0YXRzcGxvdCwgDQogICAgICAgICAgICAgICBrbml0ciwNCiAgICAgICAgICAgICAgIHJtYXJrZG93biwNCiAgICAgICAgICAgICAgIHdlYnNob3QsDQogICAgICAgICAgICAgICBuYW1lcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KIyANCiMgaW5zdGFsbC5wYWNrYWdlcygiZWFzeXN0YXRzIiwgcmVwb3MgPSAiaHR0cHM6Ly9lYXN5c3RhdHMuci11bml2ZXJzZS5kZXYiKQ0KIyANCiMgZWFzeXN0YXRzOjppbnN0YWxsX3N1Z2dlc3RlZCgpDQoNCg0KIA0KDQpgYGANCg0KI0tuaXQgdG8gcGRmDQoNCmBgYHtyIHJlbWVkeTAxfQ0KDQojIGtuaXQycGRmKGlucHV0ID0gImNhZ2VzLlJtZCIsIGhlcmU6OmhlcmUoIm91dHB1dCIsICJjYWdlcy5SbWQiKSkNCiMgDQojIHJlbmRlcigiY2FnZXMuUm1kIiwgb3V0cHV0X2Zvcm1hdCA9ICJwZGZfZG9jdW1lbnQiKQ0KDQoNCmBgYA0KDQoNCg0KDQojIFBlYSBEYXRhDQoNCg0KYGBge3IgZGF0YX0NCg0KcGVhX2RhdGEgPC0gcmlvOjppbXBvcnQoaGVyZSgiZGF0YSIsICJjYWdlX2RhdGEueGxzeCIpLCB3aGljaCA9IDEpICU+JSANCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgDQogIGRwbHlyOjptdXRhdGUoZWRnZV9kID0gYXMuZmFjdG9yKGVkZ2VfZCkpICU+JSANCiAgZHBseXI6Om11dGF0ZShtZXNoID0gYXMuZmFjdG9yKGZlbmNlKSkNCg0KaGVhZChwZWFfZGF0YSkNCg0KDQpgYGANCg0KDQoNCiMjIE1lc2ggc2l6ZQ0KDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIHN1bW1hcnl9DQoNCiMgRnVuY3Rpb24gdG8gc3VtbWFyaXNlDQoNCmJhc2VsaW5lX3RhYmxlIDwtIGZ1bmN0aW9uKGRhdGEsIHZhcmlhYmxlcywgZ3JvdXBpbmdfdmFyKSB7DQoNCiAgICAgICAgZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoISEhc3ltcyhncm91cGluZ192YXIpKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgICAgICAgICAgICAgYWNyb3NzKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfb2YodmFyaWFibGVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiBwYXN0ZTAobWVhbiguKSAlPiUgcm91bmQoMiksICIowrEiLCBzZCguKSAlPiUgcm91bmQoMiksICIpIikNCiAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICApICU+JSB1bml0ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICJncm91cGluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBhbGxfb2YoZ3JvdXBpbmdfdmFyKQ0KICAgICAgICAgICAgICAgICkgJT4lIHBpdm90X2xvbmdlcigNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMgPSAtImdyb3VwaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInZhcmlhYmxlcyINCiAgICAgICAgICAgICAgICApICU+JSBwaXZvdF93aWRlcigNCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSAiZ3JvdXBpbmciDQogICAgICAgICAgICAgICAgKQ0KfQ0KDQoNCmJhc2VsaW5lX3RhYmxlKA0KICAgICAgICBwZWFfZGF0YSwNCiAgICAgICAgdmFyaWFibGVzID0gYygiaGVpZ2h0IiwgIm5fcGxhbnRzIiwgInBvZHMiLCAicG9kX21hc3MiKSwNCiAgICAgICAgZ3JvdXBpbmdfdmFyID0gIm1lc2giDQopICU+JSANCiAga2JsKGNhcHRpb24gPSAiTWVhbnMgYW5kIFNEIGZvciBlYWNoIG1lc2ggc2l6ZSIpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpDQoNCg0KDQoNCmBgYA0KDQojIyMgUGxhbnQgaGVpZ2h0DQoNCldlbGNo4oCZcyBBTk9WQSB3aXRoIHRoZSBHYW1lcy1Ib3dlbGwgcG9zdCBob2MgdGVzdC4NCmh0dHBzOi8vc3RhdGlzdGljc2J5amltLmNvbS9hbm92YS93ZWxjaHMtYW5vdmEtY29tcGFyZWQtdG8tY2xhc3NpYy1vbmUtd2F5LWFub3ZhLw0KDQpUaGUgQU5PVkEgd2FzIHNpZ25pZmljYW50IGJ1dCB0aGVyZSB3ZXJlIG5vIHNpZ25pZmljYW50IHBhaXJ3aXNlIGNvbnRyYXN0cyAoISkuIFRoZSBHYW1lcy1Ib3dlbGwgcG9zdC1ob2MgdGVzdCBpbnZvbHZlcyBhIGNvcnJlY3Rpb24gZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zIGFuZCBtYWtlcyB0aGUgdGVzdCBtb3JlIGNvbnNlcnZhdGl2ZS4NCg0KYGBge3IgbWVzaF9oZWlnaHR9DQoNCg0KDQpnZ3Bsb3QoZGF0YSA9IHBlYV9kYXRhLCBhZXMoeCA9IG1lc2gsIHkgPSBoZWlnaHQsIGNvbG9yPW1lc2gpKSArDQogIGdlb21fYm94cGxvdCgpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArDQogIGdlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSkNCg0KIyBzaW5jZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHRoZSBlZmZlY3Qgc2l6ZXMgYXJlIGNvbXB1dGVkIHVzaW5nDQojIyBib290c3RyYXBwaW5nLCBpbXBvcnRhbnQgdG8gc2V0IGEgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5DQoNCnNldC5zZWVkKDEyMykNCg0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gcGVhX2RhdGEsDQogICAgICAgICAgICAgICB4PSBtZXNoLCANCiAgICAgICAgICAgICAgIHkgPSBoZWlnaHQsIA0KICAgICAgICAgICAgICAgIHBhaXJ3aXNlLmRpc3BsYXkgPSAiYWxsIiwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgcGxhbnQgaGVpZ2h0IGFjcm9zcyBtZXNoIG1lc2ggc2l6ZSIpDQoNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gcGVhX2RhdGEsDQogICAgICAgICAgICAgICB4PSBtZXNoLA0KICAgICAgICAgICAgICAgeSA9IGhlaWdodCkgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KDQoNCg0KDQpgYGANCg0KDQojIyMgTnVtYmVyIG9mIHBsYW50cw0KDQpXZWxjaOKAmXMgQU5PVkEgd2l0aCB0aGUgR2FtZXMtSG93ZWxsIHBvc3QgaG9jIHRlc3QuDQpodHRwczovL3N0YXRpc3RpY3NieWppbS5jb20vYW5vdmEvd2VsY2hzLWFub3ZhLWNvbXBhcmVkLXRvLWNsYXNzaWMtb25lLXdheS1hbm92YS8NCg0KYGBge3IgbnBsYW50c30NCg0KZ2dwbG90KGRhdGEgPSBwZWFfZGF0YSwgYWVzKHggPSBtZXNoLCB5ID0gbl9wbGFudHMsIGNvbG9yPW1lc2gpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKCBkYXRhID0gIHBlYV9kYXRhLCANCiAgICAgICAgICAgICAgICB4PSBtZXNoLCANCiAgICAgICAgICAgICAgICB5ID0gbl9wbGFudHMsIA0KICAgICAgICAgICAgICAgIHBhaXJ3aXNlLmRpc3BsYXkgPSAiYWxsIiwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgbnVtYmVyIG9mIHBsYW50cyBhY3Jvc3MgbWVzaCBtZXNoIHNpemUiKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKGRhdGEgPSBwZWFfZGF0YSwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gbl9wbGFudHMpICU+JQ0KICBleHRyYWN0X3N0YXRzKCkgDQoNCmBgYA0KDQojIyMgTnVtYmVyIG9mIHBvZHMNCg0KV2VsY2jigJlzIEFOT1ZBIHdpdGggdGhlIEdhbWVzLUhvd2VsbCBwb3N0IGhvYyB0ZXN0Lg0KaHR0cHM6Ly9zdGF0aXN0aWNzYnlqaW0uY29tL2Fub3ZhL3dlbGNocy1hbm92YS1jb21wYXJlZC10by1jbGFzc2ljLW9uZS13YXktYW5vdmEvDQoNCmBgYHtyIG5wb2RzfQ0KDQoNCmdncGxvdChkYXRhID0gcGVhX2RhdGEsIGFlcyh4ID0gbWVzaCwgeSA9IHBvZHMsIGNvbG9yPW1lc2gpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoIGRhdGEgPSAgcGVhX2RhdGEsIA0KICAgICAgICAgICAgICAgIHg9IG1lc2gsIA0KICAgICAgICAgICAgICAgIHkgPSBwb2RzLCANCiAgICAgICAgICAgICAgICBwYWlyd2lzZS5kaXNwbGF5ID0gInMiLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBudW1iZXIgb2YgcG9kcyBhY3Jvc3MgbWVzaCBtZXNoIHNpemUiKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKGRhdGEgPSBwZWFfZGF0YSwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gcG9kcykgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KYGBgDQojIyMgUG9kIG1hc3MNCg0KYGBge3IgcG9kbWFzc30NCg0KDQpnZ3Bsb3QoZGF0YSA9IHBlYV9kYXRhLCBhZXMoeCA9IG1lc2gsIHkgPSBwb2RfbWFzcywgY29sb3I9bWVzaCkpKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoIGRhdGEgPSAgcGVhX2RhdGEsIHg9IG1lc2gsIHkgPSBwb2RfbWFzcywgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHBvZCBtYXNzIGFjcm9zcyBtZXNoIG1lc2ggc2l6ZSIpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoZGF0YSA9IHBlYV9kYXRhLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwNCiAgICAgICAgICAgICAgIHkgPSBwb2RfbWFzcykgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KDQpgYGANCg0KDQoNCg0KDQojIyBDb3ZhcmlhdGU6IERpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSANCg0KDQojIyMgUGxhbnQgaGVpZ2h0DQoNCmBgYHtyIGhvbGVoZWlnaHQsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD04fQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgcGVhX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBoZWlnaHQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiUGxhbnQgaGVpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHJlbGV2YW50IGZvciBnZ3N0YXRzcGxvdDo6Y29tYmluZV9wbG90cw0KICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5hcmdzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUGxhbnQgaGVpZ2h0IHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQoNCg0KbW9kIDwtIGxtKGhlaWdodCB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBwZWFfZGF0YSkNCnN1bW1hcnkobW9kKQ0KDQpjb2VmKG1vZCkNCg0KDQoNCg0KDQoNCmBgYA0KUGVhcnNvbuKAmXMgY29ycmVsYXRpb24gdGVzdCByZXZlYWxlZCB0aGF0LCBhY3Jvc3MgdGhlIDkgY2FnZXMgd2l0aCBiaWcgbWVzaCBzaXplLCB0aGUgZGlzdGFuY2UgdG8gdGhlIG5lYXJlc3QgaG9sZSAobSkgd2FzIHBvc2l0aXZlbHkgY29ycmVsYXRlZCB3aXRoIHBsYW50IGhlaWdodCwgYW5kIHRoaXMgZWZmZWN0IHdhcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBUaGUgZWZmZWN0IHNpemUgKHI9MC44MSkgd2FzIGxhcmdlLCBhcyBwZXIgQ29oZW7igJlzICgxOTg4KSBjb252ZW50aW9ucy4gVGhlIEJheWVzIEZhY3RvciBmb3IgdGhlIHNhbWUgYW5hbHlzaXMgcmV2ZWFsZWQgdGhhdCB0aGUgZGF0YSB3ZXJlIDcuMTQgdGltZXMgbW9yZSBwcm9iYWJsZSB1bmRlciB0aGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBhcyBjb21wYXJlZCB0byB0aGUgbnVsbCBoeXBvdGhlc2lzLiBUaGlzIGNhbiBiZSBjb25zaWRlcmVkIGFzIG1vZGVyYXRlIGV2aWRlbmNlIChKZWZmcmV5cywgMTk2MSkgaW4gZmF2b3Igb2YgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgKG9mIGEgY29ycmVsYXRpb24gYmV0d2VlbiB0aGVzZSB0d28gdmFyaWFibGVzKS4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQojIyMgTnVtYmVyIG9mIHBsYW50cw0KDQpgYGB7ciBob2xlcGxhbnRzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBwZWFfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBob2xlX2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG5fcGxhbnRzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIk51bWJlciBvZiBwbGFudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgcGxhbnRzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgcG9kcw0KDQoNCmBgYHtyIGhvbGVwb2RzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBwZWFfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBob2xlX2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHBvZHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiTnVtYmVyIG9mIHBvZHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgcG9kcyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSAzLCBuY29sID0gMSkpDQoNCg0KYGBgDQoNCiMjIyBQb2QgbWFzcw0KDQoNCmBgYHtyIGhvbGVtYXNzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBwZWFfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBob2xlX2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHBvZF9tYXNzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIlBvZCBtYXNzIChnKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlBvZCBtYXNzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQpgYGANCg0KIyBQRUEgTUVSR0VEDQojIyBDb3ZhcmlhdGU6IERpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSANCg0KTWVzaCBiaWcgYW5kIG1pZGRsZSBtZXJnZWQgdG8gaGF2ZSBhY2Nlc3NpYmxlIG5vdCBhY2Nlc3NpYmxlDQoNCmBgYHtyIHJlbWVkeTAyfQ0KYmlfcGVhIDwtcGVhX2RhdGEgJT4lIA0KICAgIGRwbHlyOjptdXRhdGUobWVzaCA9IHJlY29kZShtZXNoLCBiaWcgPSAiYWNjZXNzaWJsZSIsIG1pZGRsZSA9ICJhY2Nlc3NpYmxlIiwgc21hbGwgPSAgIm5vdCBhY2Nlc3NpYmxlIikpDQoNCg0KDQoNCg0KYGBgDQoNCg0KIyMjIFBsYW50IGhlaWdodA0KDQpgYGB7ciBtaG9sZWhlaWdodCwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV9wZWEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBoZWlnaHQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiUGxhbnQgaGVpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHJlbGV2YW50IGZvciBnZ3N0YXRzcGxvdDo6Y29tYmluZV9wbG90cw0KICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5hcmdzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUGxhbnQgaGVpZ2h0IHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQoNCg0KbW9kIDwtIGxtKGhlaWdodCB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV9wZWEpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCg0KDQoNCg0KDQpgYGANCg0KDQoNCiMjIyBOdW1iZXIgb2YgcGxhbnRzDQoNCmBgYHtyIG1ob2xlcGxhbnRzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV9wZWEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBuX3BsYW50cywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJOdW1iZXIgb2YgcGxhbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHJlbGV2YW50IGZvciBnZ3N0YXRzcGxvdDo6Y29tYmluZV9wbG90cw0KICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5hcmdzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIHBsYW50cyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSAzLCBuY29sID0gMSkpDQoNCg0KbW9kIDwtIGxtKG5fcGxhbnRzIH4gaG9sZV9kICsgbWVzaCwgZGF0YSA9IGJpX3BlYSkNCg0Kc3VtbWFyeShtb2QpDQpjb2VmKG1vZCkNCg0KDQojIERpc3RhbmNlIGVmZmVjdCBvbmx5IGZvciBhY2Nlc3NpYmxlIGNhZ2VzDQoNCmFjY19wZWEgPC0gYmlfcGVhICU+JSANCiAgZHBseXI6OmZpbHRlcihtZXNoID09ICJhY2Nlc3NpYmxlIikNCg0KbW9kMSA8LSBsbShuX3BsYW50cyB+IGhvbGVfZCwgZGF0YSA9IGFjY19wZWEpDQpzdW1tYXJ5KG1vZDEpDQoNCmNvZWYobW9kMSkNCg0KDQoNCg0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgcG9kcw0KDQoNCmBgYHtyIG1ob2xlcG9kcywgIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD04fQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYmlfcGVhLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGhvbGVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gcG9kcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJOdW1iZXIgb2YgcG9kcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBwb2RzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQptb2QgPC0gbG0ocG9kcyB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV9wZWEpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCg0KIyBEaXN0YW5jZSBlZmZlY3Qgb25seSBmb3IgYWNjZXNzaWJsZSBjYWdlcw0KDQphY2NfcGVhIDwtIGJpX3BlYSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIobWVzaCA9PSAiYWNjZXNzaWJsZSIpDQoNCm1vZDEgPC0gbG0ocG9kcyB+IGhvbGVfZCwgZGF0YSA9IGFjY19wZWEpDQpzdW1tYXJ5KG1vZDEpDQoNCmNvZWYobW9kMSkNCg0KDQpgYGANCg0KIyMjIFBvZCBtYXNzDQoNCg0KYGBge3IgbWhvbGVtYXNzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV9wZWEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBwb2RfbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJQb2QgbWFzcyAoZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJQb2QgbWFzcyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSAzLCBuY29sID0gMSkpDQoNCm1vZCA8LSBsbShwb2RfbWFzcyB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV9wZWEpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCmBgYA0KDQojIEpVU1QgMCBFREdFDQoNClJlcGVhdGluZyB0aGUgYW5hbHlzZXMganVzdCBmb3IgY2FnZXMgbG9jYXRlZCBjbG9zZXN0IHRvIHRoZSBlZGdlLCBnaXZlbiB0aGF0IHN1c2xpa3MgZG9uJ3QgdmVudHVyZSBkZWVwZXIgdGhhbiB0aGF0IGluIHRoZSBmaWVsZC4NCg0KYGBge3IgZWRnZWhlaWdodDN9DQoNCnBlYTAgPC0gcGVhX2RhdGEgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKGVkZ2VfZCA9PSAiMCIpDQoNCmBgYA0KDQoNCiMjIyMgUGxhbnQgaGVpZ2h0DQoNCldlbGNo4oCZcyBBTk9WQSB3aXRoIHRoZSBHYW1lcy1Ib3dlbGwgcG9zdCBob2MgdGVzdC4NCmh0dHBzOi8vc3RhdGlzdGljc2J5amltLmNvbS9hbm92YS93ZWxjaHMtYW5vdmEtY29tcGFyZWQtdG8tY2xhc3NpYy1vbmUtd2F5LWFub3ZhLw0KDQoNCmBgYHtyIG1lc2hfaGVpZ2h0Mn0NCg0KZ2dwbG90KGRhdGEgPSBwZWEwLCBhZXMoeCA9IG1lc2gsIHkgPSBoZWlnaHQsIGNvbG9yPW1lc2gpKSArDQogIGdlb21fYm94cGxvdCgpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArDQogIGdlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSkNCg0KIyBzaW5jZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHRoZSBlZmZlY3Qgc2l6ZXMgYXJlIGNvbXB1dGVkIHVzaW5nDQojIyBib290c3RyYXBwaW5nLCBpbXBvcnRhbnQgdG8gc2V0IGEgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5DQoNCnNldC5zZWVkKDEyMykNCg0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gcGVhMCwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsIA0KICAgICAgICAgICAgICAgeSA9IGhlaWdodCwgDQogICAgICAgICAgICAgICAgcGFpcndpc2UuZGlzcGxheSA9ICJhbGwiLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBwbGFudCBoZWlnaHQgYWNyb3NzIG1lc2ggbWVzaCBzaXplIikNCg0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKGRhdGEgPSBwZWEwLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwNCiAgICAgICAgICAgICAgIHkgPSBoZWlnaHQpICU+JQ0KICBleHRyYWN0X3N0YXRzKCkgDQoNCg0KDQoNCg0KYGBgDQoNCg0KIyMjIE51bWJlciBvZiBwbGFudHMNCg0KV2VsY2jigJlzIEFOT1ZBIHdpdGggdGhlIEdhbWVzLUhvd2VsbCBwb3N0IGhvYyB0ZXN0Lg0KaHR0cHM6Ly9zdGF0aXN0aWNzYnlqaW0uY29tL2Fub3ZhL3dlbGNocy1hbm92YS1jb21wYXJlZC10by1jbGFzc2ljLW9uZS13YXktYW5vdmEvDQoNCmBgYHtyIG5wbGFudHMyfQ0KDQpnZ3Bsb3QoZGF0YSA9IHBlYTAsIGFlcyh4ID0gbWVzaCwgeSA9IG5fcGxhbnRzLCBjb2xvcj1tZXNoKSkrDQogIGdlb21fYm94cGxvdCgpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArDQogIGdlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSkNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyggZGF0YSA9ICBwZWEwLCANCiAgICAgICAgICAgICAgICB4PSBtZXNoLCANCiAgICAgICAgICAgICAgICB5ID0gbl9wbGFudHMsIA0KICAgICAgICAgICAgICAgIHBhaXJ3aXNlLmRpc3BsYXkgPSAiYWxsIiwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgbnVtYmVyIG9mIHBsYW50cyBhY3Jvc3MgbWVzaCBtZXNoIHNpemUiKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKGRhdGEgPSBwZWEwLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwNCiAgICAgICAgICAgICAgIHkgPSBuX3BsYW50cykgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgcG9kcw0KDQpXZWxjaOKAmXMgQU5PVkEgd2l0aCB0aGUgR2FtZXMtSG93ZWxsIHBvc3QgaG9jIHRlc3QuDQpodHRwczovL3N0YXRpc3RpY3NieWppbS5jb20vYW5vdmEvd2VsY2hzLWFub3ZhLWNvbXBhcmVkLXRvLWNsYXNzaWMtb25lLXdheS1hbm92YS8NCg0KYGBge3IgbnBvZHMyfQ0KDQoNCmdncGxvdChkYXRhID0gcGVhMCwgYWVzKHggPSBtZXNoLCB5ID0gcG9kcywgY29sb3I9bWVzaCkpKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpDQoNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyggZGF0YSA9ICBwZWEwLCANCiAgICAgICAgICAgICAgICB4PSBtZXNoLCANCiAgICAgICAgICAgICAgICB5ID0gcG9kcywgDQogICAgICAgICAgICAgICAgcGFpcndpc2UuZGlzcGxheSA9ICJzIiwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgbnVtYmVyIG9mIHBvZHMgYWNyb3NzIG1lc2ggbWVzaCBzaXplIikNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gcGVhMCwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gcG9kcykgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KYGBgDQojIyMgUG9kIG1hc3MNCg0KYGBge3IgcG9kbWFzczJ9DQoNCg0KZ2dwbG90KGRhdGEgPSBwZWEwLCBhZXMoeCA9IG1lc2gsIHkgPSBwb2RfbWFzcywgY29sb3I9bWVzaCkpKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoIGRhdGEgPSAgcGVhMCwgeD0gbWVzaCwgeSA9IHBvZF9tYXNzLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgcG9kIG1hc3MgYWNyb3NzIG1lc2ggbWVzaCBzaXplIikNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gcGVhMCwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gcG9kX21hc3MpICU+JQ0KICBleHRyYWN0X3N0YXRzKCkgDQoNCg0KYGBgDQoNCg0KDQoNCg0KIyMjIENvdmFyaWF0ZTogRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIA0KDQoNCiMjIyMgUGxhbnQgaGVpZ2h0DQoNCmBgYHtyIGhvbGVoZWlnaHQzLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OH0NCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpncm91cGVkX2dnc2NhdHRlcnN0YXRzKCBkYXRhID0gIHBlYTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBoZWlnaHQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiUGxhbnQgaGVpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHJlbGV2YW50IGZvciBnZ3N0YXRzcGxvdDo6Y29tYmluZV9wbG90cw0KICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5hcmdzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUGxhbnQgaGVpZ2h0IHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQoNCg0KDQoNCg0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgcGxhbnRzDQoNCmBgYHtyIGhvbGVwbGFudHMzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBwZWEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGhvbGVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gbl9wbGFudHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiTnVtYmVyIG9mIHBsYW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBwbGFudHMgcmVsYXRpdmUgdG8gZGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlLCBncm91cGVkIGJ5IG1lc2ggc2l6ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICBwbG90Z3JpZC5hcmdzID0gbGlzdChucm93ID0gMywgbmNvbCA9IDEpKQ0KDQpgYGANCg0KIyMjIE51bWJlciBvZiBwb2RzDQoNCg0KYGBge3IgaG9sZXBvZHMyLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBwZWEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGhvbGVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gcG9kcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJOdW1iZXIgb2YgcG9kcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBwb2RzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQpgYGANCg0KIyMjIFBvZCBtYXNzDQoNCg0KYGBge3IgaG9sZW1hc3MzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBwZWEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGhvbGVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gcG9kX21hc3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiUG9kIG1hc3MgKGcpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHJlbGV2YW50IGZvciBnZ3N0YXRzcGxvdDo6Y29tYmluZV9wbG90cw0KICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5hcmdzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUG9kIG1hc3MgcmVsYXRpdmUgdG8gZGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlLCBncm91cGVkIGJ5IG1lc2ggc2l6ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICBwbG90Z3JpZC5hcmdzID0gbGlzdChucm93ID0gMywgbmNvbCA9IDEpKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KIyBBbGZhbGZhIGRhdGENCg0KYGBge3IgYWxmYWxmYX0NCg0KYWxmX2RhdGEgPC0gcmlvOjppbXBvcnQoaGVyZSgiZGF0YSIsICJjYWdlX2RhdGEueGxzeCIpLCB3aGljaCA9IDIpICU+JSANCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgDQogIGRwbHlyOjptdXRhdGUobWVzaCA9IGZjdF9yZWxldmVsKGZlbmNlLCAibm8iKSkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKCFjYWdlICVpbiUgYygiVjAxYiIpKSAlPiUgDQogIGRwbHlyOjptdXRhdGUocG9zID0gZmFjdG9yKGRlbnNlX3JhbmsocG9zKSksDQogICAgICAgICBwb3MyID0gYXMubnVtZXJpYyhwb3MyKSkgJT4lIA0KICBkcGx5cjo6cmVuYW1lKCJzbG9wZSIgPSAicG9zMiIpDQoNCg0Kc3VtbWFyeShhbGZfZGF0YSkNCg0KDQpgYGANCg0KDQoNCg0KIyMgTWVzaCBzaXplDQoNCg0KIyMjIFN1bW1hcnkNCg0KYGBge3Igc3VtbWFyeTJ9DQoNCiMgRnVuY3Rpb24gdG8gc3VtbWFyaXNlDQoNCmJhc2VsaW5lX3RhYmxlIDwtIGZ1bmN0aW9uKGRhdGEsIHZhcmlhYmxlcywgZ3JvdXBpbmdfdmFyKSB7DQoNCiAgICAgICAgZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoISEhc3ltcyhncm91cGluZ192YXIpKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgICAgICAgICAgICAgYWNyb3NzKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfb2YodmFyaWFibGVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiBwYXN0ZTAobWVhbiguKSAlPiUgcm91bmQoMiksICIowrEiLCBzZCguKSAlPiUgcm91bmQoMiksICIpIikNCiAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICApICU+JSB1bml0ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICJncm91cGluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBhbGxfb2YoZ3JvdXBpbmdfdmFyKQ0KICAgICAgICAgICAgICAgICkgJT4lIHBpdm90X2xvbmdlcigNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMgPSAtImdyb3VwaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInZhcmlhYmxlcyINCiAgICAgICAgICAgICAgICApICU+JSBwaXZvdF93aWRlcigNCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSAiZ3JvdXBpbmciDQogICAgICAgICAgICAgICAgKQ0KfQ0KDQoNCmJhc2VsaW5lX3RhYmxlKA0KICAgICAgICBhbGZfZGF0YSwNCiAgICAgICAgdmFyaWFibGVzID0gYygiaGVpZ2h0IiwgIm90aGVyX3BsYW50cyIsICJtYXNzIiwgImRyeV9tYXNzIiksDQogICAgICAgIGdyb3VwaW5nX3ZhciA9ICJtZXNoIg0KKSAlPiUgDQogIGtibChjYXB0aW9uID0gIk1lYW5zIGFuZCBTRCBmb3IgZWFjaCBtZXNoIHNpemUiKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKSANCg0KDQoNCg0KYGBgDQoNCiMjIyBQbGFudCBoZWlnaHQNCg0KV2VsY2jigJlzIEFOT1ZBIHdpdGggdGhlIEdhbWVzLUhvd2VsbCBwb3N0IGhvYyB0ZXN0Lg0KaHR0cHM6Ly9zdGF0aXN0aWNzYnlqaW0uY29tL2Fub3ZhL3dlbGNocy1hbm92YS1jb21wYXJlZC10by1jbGFzc2ljLW9uZS13YXktYW5vdmEvDQoNClRoZSBBTk9WQSB3YXMgc2lnbmlmaWNhbnQgYnV0IHRoZXJlIHdlcmUgbm8gc2lnbmlmaWNhbnQgcGFpcndpc2UgY29udHJhc3RzICghKS4gVGhlIEdhbWVzLUhvd2VsbCBwb3N0LWhvYyB0ZXN0IGludm9sdmVzIGEgY29ycmVjdGlvbiBmb3IgbXVsdGlwbGUgY29tcGFyaXNvbnMgYW5kIG1ha2VzIHRoZSB0ZXN0IG1vcmUgY29uc2VydmF0aXZlLg0KDQpgYGB7ciBtZXNoX2hlaWdodDN9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KDQpnZ3Bsb3QoZGF0YSA9IGFsZl9kYXRhLCBhZXMoeCA9IG1lc2gsIHkgPSBoZWlnaHQsIGNvbG9yPW1lc2gpKSArDQogIGdlb21fYm94cGxvdCgpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArDQogIGdlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSkNCg0KZ2diZXR3ZWVuc3RhdHMoZGF0YSA9IGFsZl9kYXRhLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwgDQogICAgICAgICAgICAgICB5ID0gaGVpZ2h0LCANCiAgICAgICAgICAgICAgICBwYWlyd2lzZS5kaXNwbGF5ID0gInMiLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBwbGFudCBoZWlnaHQgYWNyb3NzIG1lc2ggbWVzaCBzaXplIikNCg0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gYWxmX2RhdGEsDQogICAgICAgICAgICAgICB4PSBtZXNoLA0KICAgICAgICAgICAgICAgeSA9IGhlaWdodCkgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KDQoNCg0KDQpgYGANCg0KDQojIyMjIFBhaXJlZCB0ZXN0OiBTbWFsbCB2cyBDb250cm9sDQoNCg0KDQpgYGB7ciBwYWlyZWRfaGVpZ2h0fQ0KDQoNCnBhaXJfYWxmIDwtIGFsZl9kYXRhICU+JSANCiAgZHBseXI6OmZpbHRlcihtZXNoICVpbiUgYygibm8iLCAic21hbGwiKSkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKCFjYWdlID09ICJWMDEiKQ0KICANCg0KZ2dwbG90KGRhdGEgPSBwYWlyX2FsZiwgYWVzKHggPSBtZXNoLCB5ID0gaGVpZ2h0LCBjb2xvcj1tZXNoKSkgKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KDQoNCmdnd2l0aGluc3RhdHMoZGF0YSA9IHBhaXJfYWxmLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwgDQogICAgICAgICAgICAgICB5ID0gaGVpZ2h0LCANCiAgICAgICAgICAgICAgIHRpdGxlID0gIkVmZmVjdCBvZiBzbWFsbCBtZXNoIHNpemUgb24gcGxhbnQgaGVpZ2h0IikNCg0KDQpnZ3dpdGhpbnN0YXRzKGRhdGEgPSBwYWlyX2FsZiwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gaGVpZ2h0KSAlPiUNCiAgZXh0cmFjdF9zdGF0cygpIA0KDQoNCg0KDQpgYGANCg0KDQpBIHBhaXJlZCB0LXRlc3QgcmV2ZWFsZWQgdGhhdCwgYWNyb3NzIDEwIGNhZ2VzLCB0aGVyZSB3YXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gcGxhbnQgaGVpZ2h0IGJldHdlZW4gY2FnZXMgcHJvdGVjdGVkIHdpdGggYSBzbWFsbCBtZXNoIGFuZCB0aG9zZSB1bnByb3RlY3RlZCAuIFRoZSBlZmZlY3Qgc2l6ZSAoSGVkZ2Vz4oCZIGcgcCA9IC0xLjI3KSB3YXMgdmVyeSBsYXJnZSwgYXMgcGVyIFNhd2lsb3dza3kgKDIwMDkpIGNvbnZlbnRpb25zLiBUaGUgQmF5ZXMgRmFjdG9yIGZvciB0aGUgc2FtZSBhbmFseXNpcyByZXZlYWxlZCB0aGF0IHRoZSBkYXRhIHdlcmUgMjYgdGltZXMgbW9yZSBwcm9iYWJsZSB1bmRlciB0aGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBhcyBjb21wYXJlZCB0byB0aGUgbnVsbCBoeXBvdGhlc2lzLiBUaGlzIGNhbiBiZSBjb25zaWRlcmVkIGFzIHN0cm9uZyBldmlkZW5jZSAoSmVmZnJleXMsIDE5NjEpIGluIGZhdm9yIG9mIHRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzLg0KDQoNCg0KDQojIyMgT3RoZXIgcGxhbnRzDQoNCldlbGNo4oCZcyBBTk9WQSB3aXRoIHRoZSBHYW1lcy1Ib3dlbGwgcG9zdCBob2MgdGVzdC4NCmh0dHBzOi8vc3RhdGlzdGljc2J5amltLmNvbS9hbm92YS93ZWxjaHMtYW5vdmEtY29tcGFyZWQtdG8tY2xhc3NpYy1vbmUtd2F5LWFub3ZhLw0KDQpgYGB7ciBvdGhyZXBsYW50c30NCg0KZ2dwbG90KGRhdGEgPSBhbGZfZGF0YSwgYWVzKHggPSBtZXNoLCB5ID0gb3RoZXJfcGxhbnRzLCBjb2xvcj1tZXNoKSkrDQogIGdlb21fYm94cGxvdCgpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArDQogIGdlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSkNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyggZGF0YSA9ICBhbGZfZGF0YSwgDQogICAgICAgICAgICAgICAgeD0gbWVzaCwgDQogICAgICAgICAgICAgICAgeSA9IG90aGVyX3BsYW50cywgDQogICAgICAgICAgICAgICAgcGFpcndpc2UuZGlzcGxheSA9ICJzIiwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICIgb3RoZXIgcGxhbnRzIGFjcm9zcyBtZXNoIG1lc2ggc2l6ZSIpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoZGF0YSA9IGFsZl9kYXRhLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwNCiAgICAgICAgICAgICAgIHkgPSBvdGhlcl9wbGFudHMpICU+JQ0KICBleHRyYWN0X3N0YXRzKCkgDQoNCmBgYA0KDQojIyMjIFBhaXJlZCB0ZXN0OiBTbWFsbCB2cyBDb250cm9sDQoNCg0KDQpgYGB7ciBwYWlyZWRfb3RoZXJ9DQoNCg0KDQpnZ3Bsb3QoZGF0YSA9IHBhaXJfYWxmLCBhZXMoeCA9IG1lc2gsIHkgPSBvdGhlcl9wbGFudHMsIGNvbG9yPW1lc2gpKSArDQogIGdlb21fYm94cGxvdCgpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArDQogIGdlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSkNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ3dpdGhpbnN0YXRzKGRhdGEgPSBwYWlyX2FsZiwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsIA0KICAgICAgICAgICAgICAgeSA9IG90aGVyX3BsYW50cywgDQogICAgICAgICAgICAgICB0aXRsZSA9ICJFZmZlY3Qgb2Ygc21hbGwgbWVzaCBzaXplIG9uIHByZXNlbmNlIG9mIG90aGVyIHBsYW50cyIpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2d3aXRoaW5zdGF0cyhkYXRhID0gcGFpcl9hbGYsDQogICAgICAgICAgICAgICB4PSBtZXNoLA0KICAgICAgICAgICAgICAgeSA9IG90aGVyX3BsYW50cykgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KDQoNCg0KYGBgDQoNCiMjIyBNYXNzDQoNCg0KIyMjIyBPdXRsaWVycz8NCg0KVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1hc3MgYW5kIGRyeSBtYXNzIGxvb2tzIHN1c3BpY2lvdXMgZm9yIHR3byBjYWdlczogdjIxIGFuZCB2NjBiDQoNCmBgYHtyIG1hc3NvdXRsaWVyc30NCg0KbWFzc19vdXRsaWVycyA8LSBhbGZfZGF0YSAlPiUgDQogIGRwbHlyOjptdXRhdGUoY2hhbmdlX21hc3MgPSBtYXNzIC0gZHJ5X21hc3MpDQoNCg0KZ2dwbG90KG1hc3Nfb3V0bGllcnMsIG1hcHBpbmcgPSBhZXMoeCA9IG1lc2gsIHkgPSBjaGFuZ2VfbWFzcykpICsgDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG91ciA9ICJyZWQiLCBvdXRsaWVyLnNoYXBlID0gNSwgb3V0bGllci5zaXplID0gNCkNCg0KDQoNCmBgYA0KDQouLi4gYnV0IHRoZSBib3hwbG90IGRvZXNuJ3QgZGV0ZWN0IHRoZW0gYXMgb3V0bGllcnMsIHNvIHdlIGluY2x1ZGUgdGhlbSBpbiB0aGUgYW5hbHlzaXMuDQoNCldlbGNo4oCZcyBBTk9WQSB3aXRoIHRoZSBHYW1lcy1Ib3dlbGwgcG9zdCBob2MgdGVzdC4NCmh0dHBzOi8vc3RhdGlzdGljc2J5amltLmNvbS9hbm92YS93ZWxjaHMtYW5vdmEtY29tcGFyZWQtdG8tY2xhc3NpYy1vbmUtd2F5LWFub3ZhLw0KDQpgYGB7ciBtYXNzMn0NCg0KDQoNCmdncGxvdChkYXRhID0gYWxmX2RhdGEsIGFlcyh4ID0gbWVzaCwgeSA9IG1hc3MsIGNvbG9yPW1lc2gpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKCBkYXRhID0gIGFsZl9kYXRhLCANCiAgICAgICAgICAgICAgICB4PSBtZXNoLCANCiAgICAgICAgICAgICAgICB5ID0gbWFzcywgDQogICAgICAgICAgICAgICAgcGFpcndpc2UuZGlzcGxheSA9ICJzIiwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJNYXNzIGFjcm9zcyBtZXNoIG1lc2ggc2l6ZSIpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoZGF0YSA9IGFsZl9kYXRhLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwNCiAgICAgICAgICAgICAgIHkgPSBtYXNzKSAlPiUNCiAgZXh0cmFjdF9zdGF0cygpIA0KDQpgYGANCg0KIyMjIyBQYWlyZWQgdGVzdDogU21hbGwgdnMgQ29udHJvbA0KDQoNCg0KYGBge3IgcGFpcmVkX21hc3N9DQoNCg0KZ2dwbG90KGRhdGEgPSBwYWlyX2FsZiwgYWVzKHggPSBtZXNoLCB5ID0gbWFzcywgY29sb3I9bWVzaCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnd2l0aGluc3RhdHMoZGF0YSA9IHBhaXJfYWxmLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwgDQogICAgICAgICAgICAgICB5ID0gbWFzcywgDQogICAgICAgICAgICAgICB0aXRsZSA9ICJFZmZlY3Qgb2Ygc21hbGwgbWVzaCBzaXplIG9uIG1hc3MiKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnd2l0aGluc3RhdHMoZGF0YSA9IHBhaXJfYWxmLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwNCiAgICAgICAgICAgICAgIHkgPSBtYXNzKSAlPiUNCiAgZXh0cmFjdF9zdGF0cygpIA0KDQoNCg0KDQpgYGANCiMjIyBEcnkgbWFzcw0KDQoNCldlbGNo4oCZcyBBTk9WQSB3aXRoIHRoZSBHYW1lcy1Ib3dlbGwgcG9zdCBob2MgdGVzdC4NCmh0dHBzOi8vc3RhdGlzdGljc2J5amltLmNvbS9hbm92YS93ZWxjaHMtYW5vdmEtY29tcGFyZWQtdG8tY2xhc3NpYy1vbmUtd2F5LWFub3ZhLw0KDQpgYGB7ciBkcnltYXNzfQ0KDQoNCg0KZ2dwbG90KGRhdGEgPSBhbGZfZGF0YSwgYWVzKHggPSBtZXNoLCB5ID0gZHJ5X21hc3MsIGNvbG9yPW1lc2gpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKCBkYXRhID0gIGFsZl9kYXRhLCB4PSBtZXNoLCB5ID0gZHJ5X21hc3MsIHRpdGxlID0gIkRyeSBtYXNzIGFjcm9zcyBtZXNoIG1lc2ggc2l6ZSIpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoZGF0YSA9IGFsZl9kYXRhLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwNCiAgICAgICAgICAgICAgIHkgPSBkcnlfbWFzcykgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KDQpgYGANCg0KDQoNCiMjIyMgUGFpcmVkIHRlc3Q6IFNtYWxsIHZzIENvbnRyb2wNCg0KDQpgYGB7ciBwYWlyZWRfZHJ5bWFzc30NCg0KDQoNCmdncGxvdChkYXRhID0gcGFpcl9hbGYsIGFlcyh4ID0gbWVzaCwgeSA9IGRyeV9tYXNzLCBjb2xvcj1tZXNoKSkgKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2d3aXRoaW5zdGF0cyhkYXRhID0gcGFpcl9hbGYsDQogICAgICAgICAgICAgICB4PSBtZXNoLCANCiAgICAgICAgICAgICAgIHkgPSBkcnlfbWFzcywgDQogICAgICAgICAgICAgICB0aXRsZSA9ICJFZmZlY3Qgb2Ygc21hbGwgbWVzaCBzaXplIG9uIGRyeSBtYXNzIikNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ3dpdGhpbnN0YXRzKGRhdGEgPSBwYWlyX2FsZiwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gZHJ5X21hc3MpICU+JQ0KICBleHRyYWN0X3N0YXRzKCkgDQoNCg0KDQoNCmBgYA0KDQoNCiMjIExpbmVhciBtb2RlbHMNCg0KSG93IHRvIGludGVycHJldCBkaWFnbm9zdGljIHBsb3RzOiBodHRwczovL2RhdGEubGlicmFyeS52aXJnaW5pYS5lZHUvZGlhZ25vc3RpYy1wbG90cy8NCg0KDQpgYGB7cn0NCg0KIyBUZXN0IGZvciBub3JtYWxpdHkgYW5kIGhvbW9zY2VkYXN0aWNpdHkgb2YgcmVzaWR1YWxzDQpwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChsbShoZWlnaHQgfiBwb3MgKyBzbG9wZSArIGtlcm5lbCArIG1lc2gsIGRhdGEgPSBhbGZfZGF0YSkpDQpwbG90KGxtKG1hc3MgfiBwb3MgKyBzbG9wZSArIGtlcm5lbCArIG1lc2gsIGRhdGEgPSBhbGZfZGF0YSkpDQpwbG90KGxtKGRyeV9tYXNzIH4gcG9zICsgc2xvcGUgKyBrZXJuZWwgKyBtZXNoLCBkYXRhID0gYWxmX2RhdGEpKQ0KDQoNCiMgUGVyZm9ybSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbg0KbG1faGVpZ2h0IDwtIGxtKGhlaWdodCB+IHBvcyArIHNsb3BlICsga2VybmVsICsgbWVzaCwgZGF0YSA9IGFsZl9kYXRhKQ0Kc3VtbWFyeShsbV9oZWlnaHQpDQoNCmxtX21hc3MgPC0gbG0obWFzcyB+IHBvcyArIHNsb3BlICsga2VybmVsICsgbWVzaCwgZGF0YSA9IGFsZl9kYXRhKQ0Kc3VtbWFyeShsbV9tYXNzKQ0KDQpsbV9kcnkgPC0gbG0oZHJ5X21hc3MgfiBwb3MgKyBzbG9wZSArIGtlcm5lbCArIG1lc2gsIGRhdGEgPSBhbGZfZGF0YSkNCnN1bW1hcnkobG1fZHJ5KQ0KDQoNCg0KDQoNCg0KDQpgYGANCg0KIyMgT25seSBzbWFsbCBtZXNoDQpUbyBhdm9pZCBzdXNsaWsgZWZmZWN0DQoNCmBgYHtyfQ0Kc21hbGw8LSBhbGZfZGF0YSAlPiUgDQogIGRwbHlyOjpmaWx0ZXIobWVzaD09InNtYWxsIikgDQoNCg0KIyBUZXN0IGZvciBub3JtYWxpdHkgYW5kIGhvbW9zY2VkYXN0aWNpdHkgb2YgcmVzaWR1YWxzDQpwYXIobWZyb3c9YygyLDIpKQ0KDQojIG5vbi1saW5lYXIgcmVsYXRpb25zaGlwIG5vdCBleHBsYWluZWQgYnkgdGhlIGRhdGEuIEJhZCBtb2RlbA0KcGxvdChsbShoZWlnaHQgfiBwb3MgKyBzbG9wZSwgZGF0YSA9IHNtYWxsKSkNCg0KIyAyIGlzIGFuIG91dGxpZXIgYW5kIGl0IHdpbGwgYWZmZWN0IHRoZSBsbQ0KcGxvdChsbShtYXNzIH4gcG9zICsgc2xvcGUsIGRhdGEgPSBzbWFsbCkpDQoNCiMgMiBpcyBhbiBvdXRsaWVyKHdpdGhpbiBjb29rcyBkaXN0YW5jZSkgYW5kIGl0IHdpbGwgYWZmZWN0IHRoZSBsbQ0KcGxvdChsbShkcnlfbWFzcyB+IHBvcyArIHNsb3BlLCBkYXRhID0gc21hbGwpKQ0KDQojIFBlcmZvcm0gbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24NCmxtX2hlaWdodCA8LSBsbShoZWlnaHQgfiBwb3MgKyBzbG9wZSwgZGF0YSA9IHNtYWxsKQ0Kc3VtbWFyeShsbV9oZWlnaHQpDQoNCmxtX21hc3MgPC0gbG0obWFzcyB+IHBvcyArIHNsb3BlLCBkYXRhID0gc21hbGwpDQpzdW1tYXJ5KGxtX21hc3MpDQoNCmxtX2RyeSA8LSBsbShkcnlfbWFzcyB+IHBvcyArIHNsb3BlLCBkYXRhID0gc21hbGwpDQpzdW1tYXJ5KGxtX2RyeSkNCg0KDQojIFRlc3QgZm9yIG5vcm1hbGl0eSBhbmQgaG9tb3NjZWRhc3RpY2l0eSBvZiByZXNpZHVhbHMNCnBhcihtZnJvdz1jKDIsMikpDQoNCiMgTm90IGVxdWFsIHZhcmlhbmNlIChob21vc2NlZGFzdGljaXR5KQ0KcGxvdChsbShoZWlnaHQgfiAgc2xvcGUsIGRhdGEgPSBzbWFsbCkpDQoNCiNva2F5aXNoDQpwbG90KGxtKG1hc3MgfiBzbG9wZSwgZGF0YSA9IHNtYWxsKSkNCg0KI29rYXlpc2gNCnBsb3QobG0oZHJ5X21hc3MgfiBzbG9wZSwgZGF0YSA9IHNtYWxsKSkNCg0KIyBQZXJmb3JtIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uDQpsbV9oZWlnaHQgPC0gbG0oaGVpZ2h0IH5zbG9wZSwgZGF0YSA9IHNtYWxsKQ0Kc3VtbWFyeShsbV9oZWlnaHQpDQoNCmxtX21hc3MgPC0gbG0obWFzcyB+IHNsb3BlLCBkYXRhID0gc21hbGwpDQpzdW1tYXJ5KGxtX21hc3MpDQoNCmxtX2RyeSA8LSBsbShkcnlfbWFzcyB+c2xvcGUsIGRhdGEgPSBzbWFsbCkNCnN1bW1hcnkobG1fZHJ5KQ0KDQoNCg0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KIyMgQ292YXJpYXRlOiBEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgDQoNCg0KIyMjIFBsYW50IGhlaWdodA0KDQpgYGB7ciBob2xlaGVpZ2h0MiwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KDQpncm91cGVkX2dnc2NhdHRlcnN0YXRzKCBkYXRhID0gIGFsZl9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGhvbGVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gaGVpZ2h0LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIlBsYW50IGhlaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlBsYW50IGhlaWdodCByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSA0LCBuY29sID0gMSkpDQoNCg0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgcGxhbnRzDQoNCmBgYHtyIGhvbGVwbGFudHMyLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBhbGZfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBob2xlX2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG90aGVyX3BsYW50cywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJPdGhlciBwbGFudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJPdGhlciBwbGFudHMgcmVsYXRpdmUgdG8gZGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlLCBncm91cGVkIGJ5IG1lc2ggc2l6ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICBwbG90Z3JpZC5hcmdzID0gbGlzdChucm93ID0gNCwgbmNvbCA9IDEpKQ0KDQpgYGANCg0KIyMjIE1hc3MNCg0KDQpgYGB7ciBob2xlbWFzczIsICBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OH0NCg0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYWxmX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBtYXNzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIk1hc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJNYXNzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDQsIG5jb2wgPSAxKSkNCg0KDQpgYGANCg0KIyMjIERyeSBtYXNzDQoNCmBgYHtyIGhvbGVkcnltYXNzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCg0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYWxmX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkcnlfbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJEcnkgbWFzcyAoZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJEcnkgbWFzcyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSA0LCBuY29sID0gMSkpDQoNCg0KYGBgDQoNCg0KDQoNCiMgQUxGQUxGQSBNRVJHRUQNCiANCiMjIENvdmFyaWF0ZTogRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIA0KDQpObyBtZXNoLCBiaWcgYW5kIG1pZGRsZSBtZXJnZWQsIHRvIGhhdmUgYWNjZXNzaWJsZSBub3QgYWNjZXNzaWJsZQ0KDQpgYGB7ciByZW1lZHkwM30NCmJpX2FsIDwtYWxmX2RhdGEgJT4lIA0KICAgIGRwbHlyOjptdXRhdGUobWVzaCA9IHJlY29kZShtZXNoLCBiaWcgPSAiYWNjZXNzaWJsZSIsIG1pZGRsZSA9ICJhY2Nlc3NpYmxlIiwgbm8gPSAiYWNjZXNzaWJsZSIsIHNtYWxsID0gICJub3QgYWNjZXNzaWJsZSIpKQ0KDQoNCmBgYA0KDQoNCg0KDQojIyMgUGxhbnQgaGVpZ2h0DQoNCmBgYHtyIG1ob2xlaGVpZ2h0MiwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KDQpncm91cGVkX2dnc2NhdHRlcnN0YXRzKCBkYXRhID0gIGJpX2FsLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGhvbGVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gaGVpZ2h0LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIlBsYW50IGhlaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlBsYW50IGhlaWdodCByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSA0LCBuY29sID0gMSkpDQoNCg0KbW9kIDwtIGxtKGhlaWdodCB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV9hbCkNCg0Kc3VtbWFyeShtb2QpDQpjb2VmKG1vZCkNCg0KDQpgYGANCg0KIyMjIE51bWJlciBvZiBwbGFudHMNCg0KYGBge3IgbWhvbGVwbGFudHMyLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV9hbCwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBob2xlX2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG90aGVyX3BsYW50cywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJPdGhlciBwbGFudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJPdGhlciBwbGFudHMgcmVsYXRpdmUgdG8gZGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlLCBncm91cGVkIGJ5IG1lc2ggc2l6ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICBwbG90Z3JpZC5hcmdzID0gbGlzdChucm93ID0gNCwgbmNvbCA9IDEpKQ0KDQoNCm1vZCA8LSBsbShvdGhlcl9wbGFudHMgfiBob2xlX2QgKyBtZXNoLCBkYXRhID0gYmlfYWwpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCmBgYA0KDQojIyMgTWFzcw0KDQoNCmBgYHtyIG1ob2xlbWFzczIsICBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OH0NCg0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYmlfYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBtYXNzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIk1hc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJNYXNzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDQsIG5jb2wgPSAxKSkNCg0KbW9kIDwtIGxtKG1hc3MgfiBob2xlX2QgKyBtZXNoLCBkYXRhID0gYmlfYWwpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCmBgYA0KDQojIyMgRHJ5IG1hc3MNCg0KYGBge3IgbWhvbGVkcnltYXNzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCg0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYmlfYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkcnlfbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJEcnkgbWFzcyAoZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJEcnkgbWFzcyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSA0LCBuY29sID0gMSkpDQoNCm1vZCA8LSBsbShkcnlfbWFzcyB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV9hbCkNCg0Kc3VtbWFyeShtb2QpDQpjb2VmKG1vZCkNCg0KYGBgDQoNCg0KDQoNCg0KIyMgQ292YXJpYXRlIEtFUk5FTA0KDQojIyMgUGxhbnQgaGVpZ2h0DQoNCmBgYHtyIGtob2xlaGVpZ2h0MiwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KDQpncm91cGVkX2dnc2NhdHRlcnN0YXRzKCBkYXRhID0gIGJpX2FsLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGtlcm5lbCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gaGVpZ2h0LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRlbnNpdHkgKGtlcm5lbCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIlBsYW50IGhlaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlBsYW50IGhlaWdodCByZWxhdGl2ZSB0byBkZW5zaXR5IChrZXJuZWwpLCBncm91cGVkIGJ5IG1lc2ggc2l6ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICBwbG90Z3JpZC5hcmdzID0gbGlzdChucm93ID0gNCwgbmNvbCA9IDEpKQ0KDQoNCm1vZCA8LSBsbShoZWlnaHQgfiBrZXJuZWwgKyBtZXNoLCBkYXRhID0gYmlfYWwpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCg0KYGBgDQoNCiMjIyBOdW1iZXIgb2YgcGxhbnRzDQoNCmBgYHtyIGtob2xlcGxhbnRzMiwgIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD04fQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYmlfYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0ga2VybmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBvdGhlcl9wbGFudHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGVuc2l0eSAoa2VybmVsKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiT3RoZXIgcGxhbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHJlbGV2YW50IGZvciBnZ3N0YXRzcGxvdDo6Y29tYmluZV9wbG90cw0KICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5hcmdzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiT3RoZXIgcGxhbnRzIHJlbGF0aXZlIHRvIGRlbnNpdHkgKGtlcm5lbCksIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSA0LCBuY29sID0gMSkpDQoNCg0KbW9kIDwtIGxtKG90aGVyX3BsYW50cyB+IGtlcm5lbCArIG1lc2gsIGRhdGEgPSBiaV9hbCkNCg0Kc3VtbWFyeShtb2QpDQpjb2VmKG1vZCkNCg0KYGBgDQoNCiMjIyBNYXNzDQoNCg0KYGBge3Iga2hvbGVtYXNzMiwgIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD04fQ0KDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV9hbCwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBrZXJuZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG1hc3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGVuc2l0eSAoa2VybmVsKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiTWFzcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1hc3MgcmVsYXRpdmUgdG8gRGVuc2l0eSAoa2VybmVsKSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDQsIG5jb2wgPSAxKSkNCg0KbW9kIDwtIGxtKG1hc3MgfiBrZXJuZWwgKyBtZXNoLCBkYXRhID0gYmlfYWwpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCmBgYA0KDQojIyMgRHJ5IG1hc3MNCg0KYGBge3Iga2hvbGVkcnltYXNzLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCg0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYmlfYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0ga2VybmVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkcnlfbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEZW5zaXR5IChrZXJuZWwpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJEcnkgbWFzcyAoZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJEcnkgbWFzcyByZWxhdGl2ZSB0byBEZW5zaXR5IChrZXJuZWwpLCBncm91cGVkIGJ5IG1lc2ggc2l6ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICBwbG90Z3JpZC5hcmdzID0gbGlzdChucm93ID0gNCwgbmNvbCA9IDEpKQ0KDQptb2QgPC0gbG0oZHJ5X21hc3MgfiBrZXJuZWwgKyBtZXNoLCBkYXRhID0gYmlfYWwpDQoNCnN1bW1hcnkobW9kKQ0KY29lZihtb2QpDQoNCmBgYA0KIA0KIyMgUG9zaXRpb24NCg0KVGhlcmUgYXJlIHR3byB2YXJpYWJsZXMgcmVsYXRlZCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGNhZ2VzIGluIHRoZSBmaWVsZDogDQpQb3M6IFJlbGF0ZXMgdG8gdGhlIGFyZWEgY292ZXJlZCBieSBzdXNsaWtzLg0KUG9zMjogU2xvcGUgb2YgdGhlIGZpZWxkLiAxMCBpcyBsb3dlciwgaGVuY2UgbW9yZSBodW1pZGl0eSBhbmQgYmVuZWZpY2lhbCBmb3IgdGhlIGFsZmFsZmENCg0KVG8gc2VlIHRoZSBlZmZlY3Qgb2YgUG9zIGFuZCBQb3MyIG9uIHRoZSBhbGZhbGZhIHN1Y2Nlc3MsIHdlIGdyb3VwIGRhdGEgZnJvbSBhbGwgY2FnZXMgZXhjZXB0IHRob3NlIHdpdGggc21hbGwgbWVzaCwgc2VsZWN0aW5nIG9ubHkgdGhlIHBsYW50cyB3aXRob3V0IHByb3RlY3Rpb24gYWdhaW4gc3VzbGlrcy4NCg0KYGBge3IgZWRnZWhlaWdodDJ9DQoNCg0KYWxmX3VucHJvdGVjdGVkIDwtIGFsZl9kYXRhICU+JSANCiAgZHBseXI6OmZpbHRlcighbWVzaCA9PSAic21hbGwiKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoIW1lc2gpICMgJT4lIA0KICAjZHBseXI6Om11dGF0ZShzbG9wZSA9IGFzLm51bWVyaWMoc2xvcGUpKQ0KDQoNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQogZ2diZXR3ZWVuc3RhdHMoIGRhdGEgPSAgYWxmX3VucHJvdGVjdGVkLCB4PSBwb3MsIHkgPSBoZWlnaHQsIHRpdGxlID0gIlBsYW50IGhlaWdodCB2cyBzdXNsaWsgZGVuc2l0eSIpDQogDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCiBnZ2JldHdlZW5zdGF0cyggZGF0YSA9ICBhbGZfdW5wcm90ZWN0ZWQsIHg9IHBvcywgeSA9IG90aGVyX3BsYW50cywgdGl0bGUgPSAiT3RoZXIgcGxhbnRzIHZzIHN1c2xpayBkZW5zaXR5IikNCiANCg0KICMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KIGdnYmV0d2VlbnN0YXRzKCBkYXRhID0gIGFsZl91bnByb3RlY3RlZCwgeD0gcG9zLCB5ID0gbWFzcywgdGl0bGUgPSAiTWFzcyB2cyBzdXNsaWsgZGVuc2l0eSIpDQoNCiAjIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKCBkYXRhID0gIGFsZl91bnByb3RlY3RlZCwNCiB4PSBwb3MsIHkgPSBkcnlfbWFzcywNCiBwYWlyd2lzZS5kaXNwbGF5ID0gInMiLA0KICBvdXRwdXQgPSAiZGF0YWZyYW1lIiwNCiB0aXRsZSA9ICJEcnkgbWFzcyB2cyBzdXNsaWsgZGVuc2l0eSIpDQoNCmBgYA0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUG9zaXRpb24gMjogU2xvcGUNCg0KYGBge3IgcmVtZWR5MDAxfQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCiBnZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBhbGZfdW5wcm90ZWN0ZWQsIHg9IHNsb3BlLCB5ID0gaGVpZ2h0LCB0aXRsZSA9ICJQbGFudCBoZWlnaHQgdnMgc2xvcGUiKQ0KIA0KYGBgIA0KDQpgYGB7ciByZW1lZHkwMDJ9DQogDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCiBnZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBhbGZfdW5wcm90ZWN0ZWQsIHg9IHNsb3BlLCB5ID0gb3RoZXJfcGxhbnRzLCB0aXRsZSA9ICJPdGhlciBwbGFudHMgdnMgc2xvcGUiKQ0KIA0KDQpgYGANCg0KDQpgYGB7ciByZW1lZHkwMDN9DQoNCg0KICMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KIGdnc2NhdHRlcnN0YXRzKCBkYXRhID0gIGFsZl91bnByb3RlY3RlZCwgeD0gc2xvcGUsIHkgPSBtYXNzLCB0aXRsZSA9ICJNYXNzIHZzIHNsb3BlIikNCg0KYGBgDQoNCmBgYHtyIHJlbWVkeTAwNH0NCg0KICMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgYWxmX3VucHJvdGVjdGVkLCB4PSBzbG9wZSwgeSA9IGRyeV9tYXNzLCB0aXRsZSA9ICJEcnkgbWFzcyB2cyBzbG9wZSIpDQoNCmBgYA0KDQojIyBLZXJuZWwgYW5kIHBvc2l0aW9uDQoNClBvcyBpcyBiYXNpY2FsbHkgYW4gYWx0ZXJuYXRpdmUgdG8ga2VybmVsLCBzbyB3ZSBkb24ndCB1c2UgaXQgaW4gdGhlIHNhbWUgbW9kZWwuIFBvczIgKHNsb3BlIG9mIHRoZSBmaWVsZCkgaXMgZGlmZmVyZW50LCBidXQgdGhleSBhcmUgc3RpbGwgYSBiaXQgY29ycmVsYXRlZCAobGVzcyBzdXNsaWtzIHVwIHRoZSBoaWxsPykuIFNvIHByb2JhYmx5IGl0IG1ha2VzIHNlbnNlIHRvIHRlc3QgdGhlIGludGVyYWN0aW9uLg0KDQojIyMgSGVpZ2h0IHdpdGggaW50ZXJhY3Rpb24NClRoZSBhZGRpdGl2ZSBtb2RlbCBpcyBiZXR0ZXIsIHRoZSBpbnRlcmFjdGlvbiBpcyBub3Qgc2lnbmlmaWNhbnQsIHNvIGtlcm5lbCBhbmQgcG9zMiBhcmUgaW5kZXBlbmRlbnQgKEkgdGVzdGVkIGFsc28gdGhlIG90aGVyIHZhcmlhYmxlcyBhbmQgdGhlIGludGVyYWN0aW9uIGlzIG5ldmVyIHNpZ25pZmljYW50KQ0KYGBge3IgcmVtZWR5MDR9DQojIEZpdCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwNCm1vZGVsIDwtIGxtKGhlaWdodCB+IGtlcm5lbCAqIHNsb3BlLCBkYXRhID0gYWxmX3VucHJvdGVjdGVkKQ0Kc3VtbWFyeShtb2RlbCkNCg0KDQojIEZpdCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwNCm1vZGVsIDwtIGxtKGhlaWdodCB+IGtlcm5lbCArIHNsb3BlLCBkYXRhID0gYWxmX3VucHJvdGVjdGVkKQ0Kc3VtbWFyeShtb2RlbCkNCg0KYGBgDQoNCiMjIyBPdGhlciBwbGFudHMNCmBgYHtyIHJlbWVkeTA1fQ0KIyBGaXQgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsDQptb2RlbCA8LSBsbShvdGhlcl9wbGFudHMgfiBrZXJuZWwgKyBzbG9wZSwgZGF0YSA9IGFsZl91bnByb3RlY3RlZCkNCnN1bW1hcnkobW9kZWwpDQoNCg0KYGBgDQojIyMgTWFzcw0KYGBge3IgcmVtZWR5MDZ9DQojIEZpdCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwNCm1vZGVsIDwtIGxtKG1hc3MgfiBrZXJuZWwgKyBzbG9wZSwgZGF0YSA9IGFsZl91bnByb3RlY3RlZCkNCnN1bW1hcnkobW9kZWwpDQoNCg0KYGBgDQoNCiMjIyBEcnkgbWFzcw0KYGBge3IgcmVtZWR5MDd9DQojIEZpdCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwNCm1vZGVsIDwtIGxtKGRyeV9tYXNzIH4ga2VybmVsICsgc2xvcGUsIGRhdGEgPSBhbGZfdW5wcm90ZWN0ZWQpDQpzdW1tYXJ5KG1vZGVsKQ0KDQoNCmBgYA0KDQoNCiMgV0hFQVQgMjAyMg0KDQpDb3BpZWQgYW5kIHBhc3RlZCB0aGUgdmFsdWVzIGZyb20gdGhlIGZvcm11bGFzIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgKGNhZ2VfZXhwZXJpbWVudHNfcmVzdWx0czIpDQoNCg0KYGBge3Igd2hlYXR9DQoNCndoZWF0X2RhdGEgPC0gcmlvOjppbXBvcnQoaGVyZSgiZGF0YSIsICJ3aGVhdDIwMjIueGxzeCIpKSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBkcGx5cjo6bXV0YXRlKG1lc2ggPSBhcy5mYWN0b3IobWVzaCkpICU+JSANCiAgZHBseXI6Om11dGF0ZShsaW5lID0gYXMuZmFjdG9yKGxpbmUpKQ0KDQpoZWFkKHdoZWF0X2RhdGEpDQpgYGANCg0KIyMgU3VtbWFyeQ0KDQpgYGB7ciBzdW13fQ0KDQojIEZ1bmN0aW9uIHRvIHN1bW1hcmlzZQ0KDQpiYXNlbGluZV90YWJsZSA8LSBmdW5jdGlvbihkYXRhLCB2YXJpYWJsZXMsIGdyb3VwaW5nX3Zhcikgew0KDQogICAgICAgIGRhdGEgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KCEhIXN5bXMoZ3JvdXBpbmdfdmFyKSkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZSgNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjcm9zcygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX29mKHZhcmlhYmxlcyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gcGFzdGUwKG1lYW4oLikgJT4lIHJvdW5kKDIpLCAiKMKxIiwgc2QoLikgJT4lIHJvdW5kKDIpLCAiKSIpDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgKSAlPiUgdW5pdGUoDQogICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXBpbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWxsX29mKGdyb3VwaW5nX3ZhcikNCiAgICAgICAgICAgICAgICApICU+JSBwaXZvdF9sb25nZXIoDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xzID0gLSJncm91cGluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJ2YXJpYWJsZXMiDQogICAgICAgICAgICAgICAgKSAlPiUgcGl2b3Rfd2lkZXIoDQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gImdyb3VwaW5nIg0KICAgICAgICAgICAgICAgICkNCn0NCg0KDQp0YWJsZV93IDwtICBiYXNlbGluZV90YWJsZSgNCiAgICAgICAgd2hlYXRfZGF0YSwNCiAgICAgICAgdmFyaWFibGVzID0gYygibl9jb2JzIiwgInRvdGFsX21hc3MiLCAiZ3JhaW5fbWFzcyIsICJjb2JfbWFzcyIpLA0KICAgICAgICBncm91cGluZ192YXIgPSAibWVzaCINCikgIA0KDQoNCnRhYmxlX3cgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV93KSANCg0Kcm93bmFtZXModGFibGVfdyk9IGMoIk51bWJlciBvZiBjb2JzIiwgIlRvdGFsIG1hc3MiLCAiR3JhaW4gbWFzcyIsICJDb2IgbWFzcyIpDQoNCiAgDQp0YWJsZV93DQoNCg0KIHN1bW1hcnlfd2hlYXQgPC0gdGFibGVfdyAlPiUgDQogICAgIGRwbHlyOjpzZWxlY3QoLXZhcmlhYmxlcykgJT4lIA0KICBrYmwoY2FwdGlvbiA9ICJNZWFucyBhbmQgU0QgZm9yIGVhY2ggbWVzaCBzaXplIiwgY29sLm5hbWVzID0gYygiTGFyZ2UiLCAiTWlkZGxlIiwgIlNtYWxsIikpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KDQoNCnNhdmVfa2FibGUoc3VtbWFyeV93aGVhdCwgaGVyZTo6aGVyZSgib3V0cHV0IiwgInN1bW1hcnlfd2hlYXQucG5nIikpDQoNCnN1bW1hcnlfd2hlYXQNCg0KYGBgDQoNCg0KIyMjICBUb3RhbCBtYXNzDQoNCldlbGNo4oCZcyBBTk9WQSB3aXRoIHRoZSBHYW1lcy1Ib3dlbGwgcG9zdCBob2MgdGVzdC4NCmh0dHBzOi8vc3RhdGlzdGljc2J5amltLmNvbS9hbm92YS93ZWxjaHMtYW5vdmEtY29tcGFyZWQtdG8tY2xhc3NpYy1vbmUtd2F5LWFub3ZhLw0KDQpUaGUgQU5PVkEgd2FzIHNpZ25pZmljYW50IGJ1dCB0aGVyZSB3ZXJlIG5vIHNpZ25pZmljYW50IHBhaXJ3aXNlIGNvbnRyYXN0cyAoISkuIFRoZSBHYW1lcy1Ib3dlbGwgcG9zdC1ob2MgdGVzdCBpbnZvbHZlcyBhIGNvcnJlY3Rpb24gZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zIGFuZCBtYWtlcyB0aGUgdGVzdCBtb3JlIGNvbnNlcnZhdGl2ZS4NCg0KYGBge3IgdG90bWFzd30NCg0KDQoNCmdncGxvdChkYXRhID0gd2hlYXRfZGF0YSwgYWVzKHggPSBtZXNoLCB5ID0gdG90YWxfbWFzcywgY29sb3I9bWVzaCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQojIHNpbmNlIHRoZSBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIGVmZmVjdCBzaXplcyBhcmUgY29tcHV0ZWQgdXNpbmcNCiMjIGJvb3RzdHJhcHBpbmcsIGltcG9ydGFudCB0byBzZXQgYSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkNCg0Kc2V0LnNlZWQoMTIzKQ0KDQoNCmdnYmV0d2VlbnN0YXRzKGRhdGEgPSB3aGVhdF9kYXRhLA0KICAgICAgICAgICAgICAgeD0gbWVzaCwgDQogICAgICAgICAgICAgICB5ID0gdG90YWxfbWFzcywgDQogICAgICAgICAgICAgICAgcGFpcndpc2UuZGlzcGxheSA9ICJhbGwiLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiB0b3RhbCBtYXNzIGFjcm9zcyBtZXNoIHNpemUiKQ0KDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoZGF0YSA9IHdoZWF0X2RhdGEsDQogICAgICAgICAgICAgICB4PSBtZXNoLA0KICAgICAgICAgICAgICAgeSA9IHRvdGFsX21hc3MpICU+JQ0KICBleHRyYWN0X3N0YXRzKCkgDQoNCg0KDQoNCg0KYGBgDQoNCg0KIyMjIE51bWJlciBvZiBjb2JzDQoNCldlbGNo4oCZcyBBTk9WQSB3aXRoIHRoZSBHYW1lcy1Ib3dlbGwgcG9zdCBob2MgdGVzdC4NCmh0dHBzOi8vc3RhdGlzdGljc2J5amltLmNvbS9hbm92YS93ZWxjaHMtYW5vdmEtY29tcGFyZWQtdG8tY2xhc3NpYy1vbmUtd2F5LWFub3ZhLw0KDQpgYGB7ciB3Y29ic30NCg0KZ2dwbG90KGRhdGEgPSB3aGVhdF9kYXRhLCBhZXMoeCA9IG1lc2gsIHkgPSBuX2NvYnMsIGNvbG9yPW1lc2gpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdnYmV0d2VlbnN0YXRzKCBkYXRhID0gIHdoZWF0X2RhdGEsIA0KICAgICAgICAgICAgICAgIHg9IG1lc2gsIA0KICAgICAgICAgICAgICAgIHkgPSBuX2NvYnMsIA0KICAgICAgICAgICAgICAgIHBhaXJ3aXNlLmRpc3BsYXkgPSAiYWxsIiwNCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgbnVtYmVyIG9mIGNvYnMgYWNyb3NzIG1lc2ggbWVzaCBzaXplIikNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gd2hlYXRfZGF0YSwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gbl9jb2JzKSAlPiUNCiAgZXh0cmFjdF9zdGF0cygpIA0KDQpgYGANCg0KIyMjIEdyYWluIG1hc3MNCg0KV2VsY2jigJlzIEFOT1ZBIHdpdGggdGhlIEdhbWVzLUhvd2VsbCBwb3N0IGhvYyB0ZXN0Lg0KaHR0cHM6Ly9zdGF0aXN0aWNzYnlqaW0uY29tL2Fub3ZhL3dlbGNocy1hbm92YS1jb21wYXJlZC10by1jbGFzc2ljLW9uZS13YXktYW5vdmEvDQoNCmBgYHtyIHdncmFpbn0NCg0KDQpnZ3Bsb3QoZGF0YSA9IHdoZWF0X2RhdGEsIGFlcyh4ID0gbWVzaCwgeSA9IGdyYWluX21hc3MsIGNvbG9yPW1lc2gpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsNCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKQ0KDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoIGRhdGEgPSAgd2hlYXRfZGF0YSwgDQogICAgICAgICAgICAgICAgeD0gbWVzaCwgDQogICAgICAgICAgICAgICAgeSA9IGdyYWluX21hc3MsIA0KICAgICAgICAgICAgICAgIHBhaXJ3aXNlLmRpc3BsYXkgPSAicyIsDQogICAgICAgICAgICAgICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGdyYWluX21hc3MgYWNyb3NzIG1lc2ggbWVzaCBzaXplIikNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gd2hlYXRfZGF0YSwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gZ3JhaW5fbWFzcykgJT4lDQogIGV4dHJhY3Rfc3RhdHMoKSANCg0KYGBgDQojIyMgQ29iIG1hc3MNCg0KYGBge3Igd2NvYm1hc3N9DQoNCg0KZ2dwbG90KGRhdGEgPSB3aGVhdF9kYXRhLCBhZXMoeCA9IG1lc2gsIHkgPSBjb2JfbWFzcywgY29sb3I9bWVzaCkpKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKw0KICBnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMikpDQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ2diZXR3ZWVuc3RhdHMoIGRhdGEgPSAgd2hlYXRfZGF0YSwgeD0gbWVzaCwgeSA9IGNvYl9tYXNzLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgY29iIG1hc3MgYWNyb3NzIG1lc2ggbWVzaCBzaXplIikNCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpnZ2JldHdlZW5zdGF0cyhkYXRhID0gd2hlYXRfZGF0YSwNCiAgICAgICAgICAgICAgIHg9IG1lc2gsDQogICAgICAgICAgICAgICB5ID0gY29iX21hc3MpICU+JQ0KICBleHRyYWN0X3N0YXRzKCkgDQoNCg0KYGBgDQoNCg0KDQoNCg0KIyMgQ292YXJpYXRlOiBEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgDQoNCg0KIyMjIE51bWJlciBvZiBjb2JzDQoNCmBgYHtyIGNvdndjb2JzLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OH0NCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpncm91cGVkX2dnc2NhdHRlcnN0YXRzKCBkYXRhID0gIHdoZWF0X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBuX2NvYnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiTnVtYmVyIG9mIGNvYnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgY29icyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSAzLCBuY29sID0gMSkpDQoNCg0KDQoNCm1vZCA8LSBsbShuX2NvYnMgfiBob2xlX2QgKyBtZXNoLCBkYXRhID0gd2hlYXRfZGF0YSkNCnN1bW1hcnkobW9kKQ0KDQpjb2VmKG1vZCkNCg0KDQoNCg0KDQpgYGANClBlYXJzb27igJlzIGNvcnJlbGF0aW9uIHRlc3QgcmV2ZWFsZWQgdGhhdCwgYWNyb3NzIHRoZSA5IGNhZ2VzIHdpdGggYmlnIG1lc2ggc2l6ZSwgdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0IGhvbGUgKG0pIHdhcyBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aCBwbGFudCBoZWlnaHQsIGFuZCB0aGlzIGVmZmVjdCB3YXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhlIGVmZmVjdCBzaXplIChyPTAuODEpIHdhcyBsYXJnZSwgYXMgcGVyIENvaGVu4oCZcyAoMTk4OCkgY29udmVudGlvbnMuIFRoZSBCYXllcyBGYWN0b3IgZm9yIHRoZSBzYW1lIGFuYWx5c2lzIHJldmVhbGVkIHRoYXQgdGhlIGRhdGEgd2VyZSA3LjE0IHRpbWVzIG1vcmUgcHJvYmFibGUgdW5kZXIgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgYXMgY29tcGFyZWQgdG8gdGhlIG51bGwgaHlwb3RoZXNpcy4gVGhpcyBjYW4gYmUgY29uc2lkZXJlZCBhcyBtb2RlcmF0ZSBldmlkZW5jZSAoSmVmZnJleXMsIDE5NjEpIGluIGZhdm9yIG9mIHRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIChvZiBhIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlc2UgdHdvIHZhcmlhYmxlcykuDQoNCg0KDQoNCg0KDQoNCg0KDQojIyMgVG90YWwgbWFzcw0KDQpgYGB7ciBjb3Z0b3RtYXN3LCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICB3aGVhdF9kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHg9IGhvbGVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gdG90YWxfbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJUb3RhbCBtYXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHJlbGV2YW50IGZvciBnZ3N0YXRzcGxvdDo6Y29tYmluZV9wbG90cw0KICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5hcmdzID0gbGlzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiVG90YWwgbWFzcyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSAzLCBuY29sID0gMSkpDQoNCmBgYA0KDQojIyMgR3JhaW4gbWFzcw0KDQoNCmBgYHtyIGNvdndnciwgIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD04fQ0KDQojIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpzZXQuc2VlZCgxMjMpDQoNCmdyb3VwZWRfZ2dzY2F0dGVyc3RhdHMoIGRhdGEgPSAgd2hlYXRfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBob2xlX2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGdyYWluX21hc3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcudmFyID0gbWVzaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlIChtKSIsDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiPSAiR3JhaW4gbWFzcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkdyYWluIG1hc3MgcmVsYXRpdmUgdG8gZGlzdGFuY2UgdG8gbmVhcmVzdCBob2xlLCBncm91cGVkIGJ5IG1lc2ggc2l6ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICBwbG90Z3JpZC5hcmdzID0gbGlzdChucm93ID0gMywgbmNvbCA9IDEpKQ0KDQoNCmBgYA0KDQojIyMgQ29iIG1hc3MNCg0KDQpgYGB7ciBjdmNvYncsICBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OH0NCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpncm91cGVkX2dnc2NhdHRlcnN0YXRzKCBkYXRhID0gIHdoZWF0X2RhdGEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjb2JfbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJDb2IgbWFzcyAoZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJDb2IgbWFzcyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSAzLCBuY29sID0gMSkpDQoNCg0KYGBgDQoNCiMgV0hFQVQgTUVSR0VEDQogDQojIyBDb3ZhcmlhdGU6IERpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSANCg0KTm8gbWVzaCwgYmlnIGFuZCBtaWRkbGUgbWVyZ2VkLCB0byBoYXZlIGFjY2Vzc2libGUgbm90IGFjY2Vzc2libGUNCg0KYGBge3IgcmVtZWR5MDh9DQpiaV93aGUgPC13aGVhdF9kYXRhICU+JSANCiAgICBkcGx5cjo6bXV0YXRlKG1lc2ggPSByZWNvZGUobWVzaCwgYmlnID0gImFjY2Vzc2libGUiLCBtaWRkbGUgPSAiYWNjZXNzaWJsZSIsIG5vID0gImFjY2Vzc2libGUiLCBzbWFsbCA9ICAibm90IGFjY2Vzc2libGUiKSkNCg0KDQpgYGANCg0KDQojIyMgTnVtYmVyIG9mIGNvYnMNCg0KYGBge3IgTWNvdndjb2JzLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OH0NCg0KIyMgZm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2V0LnNlZWQoMTIzKQ0KDQpncm91cGVkX2dnc2NhdHRlcnN0YXRzKCBkYXRhID0gIGJpX3doZSwgDQogICAgICAgICAgICAgICAgICAgICAgICB4PSBob2xlX2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG5fY29icywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJOdW1iZXIgb2YgY29icyIsDQogICAgICAgICAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyByZWxldmFudCBmb3IgZ2dzdGF0c3Bsb3Q6OmNvbWJpbmVfcGxvdHMNCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYXJncyA9IGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBjb2JzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQoNCg0KbW9kIDwtIGxtKG5fY29icyB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV93aGUpDQpzdW1tYXJ5KG1vZCkNCg0KY29lZihtb2QpDQoNCg0KIyBEaXN0YW5jZSBlZmZlY3Qgb25seSBmb3IgYWNjZXNzaWJsZSBjYWdlcw0KDQphY2Nfd2hlYXQgPC0gYmlfd2hlICU+JSANCiAgZHBseXI6OmZpbHRlcihtZXNoID09ICJhY2Nlc3NpYmxlIikNCg0KbW9kMSA8LSBsbShuX2NvYnMgfiBob2xlX2QsIGRhdGEgPSBhY2Nfd2hlYXQpDQpzdW1tYXJ5KG1vZDEpDQoNCmNvZWYobW9kMSkNCg0KDQpgYGANCg0KDQoNCiMjIyBUb3RhbCBtYXNzDQoNCmBgYHtyIG1jb3Z0b3RtYXN3LCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV93aGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0b3RhbF9tYXNzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIlRvdGFsIG1hc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJUb3RhbCBtYXNzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KDQptb2QgPC0gbG0odG90YWxfbWFzcyB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV93aGUpDQpzdW1tYXJ5KG1vZCkNCg0KY29lZihtb2QpDQoNCmBgYA0KDQoNCg0KIyMjIEdyYWluIG1hc3MNCg0KDQpgYGB7ciBtY292d2dyLCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV93aGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBncmFpbl9tYXNzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nLnZhciA9IG1lc2gsDQogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIkRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSAobSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0gIkdyYWluIG1hc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJHcmFpbiBtYXNzIHJlbGF0aXZlIHRvIGRpc3RhbmNlIHRvIG5lYXJlc3QgaG9sZSwgZ3JvdXBlZCBieSBtZXNoIHNpemUiDQogICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGdyaWQuYXJncyA9IGxpc3QobnJvdyA9IDMsIG5jb2wgPSAxKSkNCg0KbW9kIDwtIGxtKGdyYWluX21hc3MgfiBob2xlX2QgKyBtZXNoLCBkYXRhID0gYmlfd2hlKQ0Kc3VtbWFyeShtb2QpDQoNCmNvZWYobW9kKQ0KDQpgYGANCg0KDQojIyMgQ29iIG1hc3MNCg0KDQpgYGB7ciBtY3Zjb2J3LCAgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9DQoNCiMjIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KZ3JvdXBlZF9nZ3NjYXR0ZXJzdGF0cyggZGF0YSA9ICBiaV93aGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgeD0gaG9sZV9kLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjb2JfbWFzcywgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZy52YXIgPSBtZXNoLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUgKG0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ICJDb2IgbWFzcyAoZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgcmVsZXZhbnQgZm9yIGdnc3RhdHNwbG90Ojpjb21iaW5lX3Bsb3RzDQogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmFyZ3MgPSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJDb2IgbWFzcyByZWxhdGl2ZSB0byBkaXN0YW5jZSB0byBuZWFyZXN0IGhvbGUsIGdyb3VwZWQgYnkgbWVzaCBzaXplIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RncmlkLmFyZ3MgPSBsaXN0KG5yb3cgPSAzLCBuY29sID0gMSkpDQoNCm1vZCA8LSBsbShjb2JfbWFzcyB+IGhvbGVfZCArIG1lc2gsIGRhdGEgPSBiaV93aGUpDQpzdW1tYXJ5KG1vZCkNCg0KY29lZihtb2QpDQpgYGANCg0KDQoNCg0KDQoNCg0K