In this tutorial, we perform a hypothesis test on the “smelly armpit” dataset.

1 Smelly armpit dataset

Smelly armpits are not caused by sweat, itself. The smell is caused by specific micro-organisms belonging to the group of Corynebacterium spp. that metabolise sweat. Another group of abundant bacteria are the Staphylococcus spp., these bacteria do not metabolise sweat in smelly compounds.

The CMET-groep at Ghent University does research to on transplanting the armpit microbiome to save people with smelly armpits.

  • Proposed Therapy:
    1. Remove armpit-microbiome with antibiotics
    2. Influence armpit microbiome with microbial transplant (https://youtu.be/9RIFyqLXdVw)
  • Experiment:

    • 20 subjects with smelly armpits are attributed to one of two treatment groups
    • placebo (only antibiotics)
    • transplant (antibiotica followed by microbial transplant).
    • The microbiome is sampled 6 weeks upon the treatment
    • The relative abundance of Staphylococcus spp. on Corynebacterium spp. + Staphylococcus spp. in the microbiome is measured via DGGE (Denaturing Gradient Gel Electrophoresis).

2 Goal

The overarching goal of this research was to assess if the relative abundance Staphylococcus spp. in the microbiome of the armpit is affected by transplanting the microbiome. To this end the researchers randomized patients to two treatment: A treatment with antibiotics only and a treatment with antibiotics and a microbial transplant.

In the tutorial on hypotheses testing we will use a formal statistical test to generalize the results from the sample to that of the population.

3 Import the dataset

#Load the libraries
library(tidyverse)

Import the data

ap <- read_csv("https://raw.githubusercontent.com/GTPB/PSLS20/master/data/armpit.csv")
## Parsed with column specification:
## cols(
##   trt = col_character(),
##   rel = col_double()
## )
glimpse(ap)
## Observations: 20
## Variables: 2
## $ trt <chr> "placebo", "placebo", "placebo", "placebo", "placebo", "placebo",…
## $ rel <dbl> 54.99208, 31.84466, 41.09948, 59.52064, 63.57341, 41.48649, 30.44…

4 Data Exploration

A crucial first step in a data analysis is to visualize and to explore the raw data.

ap %>% ggplot(aes(x=trt,y=rel,fill=trt)) + 
  geom_boxplot(outlier.shape=NA) + 
  geom_point(position="jitter") +
  ylab("relative abundance (%)") +
  xlab("treatment group") + 
  stat_summary(fun.y=mean, geom="point", shape=5, size=3, color="black", fill="black")

We clearly see that, on average, the subjects who had a microbial transplant have a higher relative abundance of Staphylococcus spp. But is this difference statistically significant so that we can generalized what we observe in the sample to the population?

We can test this with an unpaired, two-sample t-test, which falsifies the null hypothesis that there is on average no difference in relative abundance of Staphylococcus in the armpit microbiome between the transplant and the placebo group against the alternative hypothesis that there is a difference in average abundance of Staphyloccocus in the armpit microbiome between the transplant and placebo treatment.

But, before we can start the analysis, we must check if all assumptions to perform a t-test are met.

4.1 Check the assumptions

  1. The observations are independent both within and between groups. This has to be garanteed by the design.
  2. The data (rel) are normally distributed in each of the groups
  3. The variability within both groups is similar.

To check the normality assumption, we will use QQ plots.

ap %>%
  ggplot(aes(sample=rel)) +
  geom_qq() +
  geom_qq_line() +
  facet_grid(cols = vars(trt))

We can see that the data is nicely scattered around the quantile-quantile line (black line). As such, we may conclude that the our data are approximately normally distributed.

For the third assumption, we must compare the within-group variability of both groups. We can do this visually based on the boxplots. The size of the box in the boxplot is the interquartile range, an nonparametric estimator of the variability of the data. In the plot we observe that the boxes are fairly equal in size indicating that the box size is approximately equal for groups.

For small sample sizes the variability estimation is not very precise and the differences in box sizes have to be more than 2 or 3 times larger in one of the groups before there is an indication for the deviation of equality of means. If the variability would not have been equal, we might have resorted the Welch modified T-test.

As all three assumptions are met we may continue with performing the unpaired two-sample t-test with equal variances.

5 Assess the research question with the two-sample t-test

6 Train yourself in checking the assumptions

In order for the learners to get more proficient in evaluating the assumptions we will simulate 9 dataset with sample sizes similar to our data for which the assumptions of normality and equal variance do hold. For the QQ-plots we will only plot the one from one of the groups.

6.1 Simulate data

We simulate 9 datasets with the same sample sizes, means and pooled variance as in the sample.

nSamp <- 9
## descriptive statistics
apRelSum<-ap%>%
  group_by(trt)%>%
  summarize_at("rel",
               list(mean=~mean(.,na.rm=TRUE),
                    sd=~sd(.,na.rm=TRUE),
                    n=function(x) x%>%is.na%>%`!`%>%sum)) %>%
  mutate(se=sd/sqrt(n))

sigma <- sqrt(sum(apRelSum$sd^2*(apRelSum$n-1))/(sum(apRelSum$n)-2)) 

normSim <- matrix(rnorm(sum(apRelSum$n)*nSamp,
              mean=c(rep(apRelSum$mean[1],apRelSum$n[1]),
                     rep(apRelSum$mean[2],apRelSum$n[2])),
                     sd=sigma),nrow=sum(apRelSum$n)) %>%
  as.data.frame %>% 
  mutate(trt=ap$trt)

6.2 Comparisons of variances

normSim %>% gather(samp,data,-trt) %>%
  ggplot(aes(x=trt,y=data)) +
  geom_boxplot() +
  facet_wrap(~samp)

6.3 Evaluation of normality

6.3.1 Placebo group

normSim %>% 
  gather(samp,data,-trt) %>%
  filter(trt=="placebo") %>%
  ggplot(aes(sample=data)) +
  geom_qq() +
  geom_qq_line() +
  facet_wrap(~samp)

6.3.2 Transplant group

normSim %>% 
  gather(samp,data,-trt) %>%
  filter(trt=="transplant") %>%
  ggplot(aes(sample=data)) +
  geom_qq() +
  geom_qq_line() +
  facet_wrap(~samp)

LS0tCnRpdGxlOiAnVHV0b3JpYWwgNS4yOiBoeXBvdGhlc2lzIHRlc3Rpbmcgb24gdGhlIGFybXBpdCBkYXRhc2V0JwpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKLS0tCgpJbiB0aGlzIHR1dG9yaWFsLCB3ZSBwZXJmb3JtIGEgaHlwb3RoZXNpcyB0ZXN0IG9uIHRoZQoic21lbGx5IGFybXBpdCIgZGF0YXNldC4gCgojIFNtZWxseSBhcm1waXQgZGF0YXNldAoKU21lbGx5IGFybXBpdHMgYXJlIG5vdCBjYXVzZWQgYnkgc3dlYXQsIGl0c2VsZi4gVGhlIHNtZWxsIGlzIGNhdXNlZCBieSBzcGVjaWZpYyBtaWNyby1vcmdhbmlzbXMgYmVsb25naW5nIHRvIHRoZSBncm91cCBvZiAqQ29yeW5lYmFjdGVyaXVtIHNwcC4qIHRoYXQgbWV0YWJvbGlzZSBzd2VhdC4KQW5vdGhlciBncm91cCBvZiBhYnVuZGFudCBiYWN0ZXJpYSBhcmUgdGhlICpTdGFwaHlsb2NvY2N1cyBzcHAuKiwgdGhlc2UgYmFjdGVyaWEgZG8gbm90IG1ldGFib2xpc2Ugc3dlYXQgaW4gc21lbGx5IGNvbXBvdW5kcy4KClRoZSBDTUVULWdyb2VwIGF0IEdoZW50IFVuaXZlcnNpdHkgZG9lcyByZXNlYXJjaCB0byBvbiB0cmFuc3BsYW50aW5nIHRoZSBhcm1waXQgbWljcm9iaW9tZSB0byBzYXZlIHBlb3BsZSB3aXRoIHNtZWxseSBhcm1waXRzLgoKLSBQcm9wb3NlZCBUaGVyYXB5OgogIAkxLiBSZW1vdmUgYXJtcGl0LW1pY3JvYmlvbWUgd2l0aCBhbnRpYmlvdGljcwogICAgMi4gSW5mbHVlbmNlIGFybXBpdCBtaWNyb2Jpb21lIHdpdGggbWljcm9iaWFsIHRyYW5zcGxhbnQgKGh0dHBzOi8veW91dHUuYmUvOVJJRnlxTFhkVncpCgotIEV4cGVyaW1lbnQ6CgogICAgLSAyMCBzdWJqZWN0cyB3aXRoIHNtZWxseSBhcm1waXRzIGFyZSBhdHRyaWJ1dGVkIHRvIG9uZSBvZiB0d28gdHJlYXRtZW50IGdyb3VwcwogICAgLSBwbGFjZWJvIChvbmx5IGFudGliaW90aWNzKQogICAgLSB0cmFuc3BsYW50IChhbnRpYmlvdGljYSBmb2xsb3dlZCBieSBtaWNyb2JpYWwgdHJhbnNwbGFudCkuCiAgICAtIFRoZSBtaWNyb2Jpb21lIGlzIHNhbXBsZWQgNiB3ZWVrcyB1cG9uIHRoZSB0cmVhdG1lbnQKICAgIC0gVGhlIHJlbGF0aXZlIGFidW5kYW5jZSBvZiAqU3RhcGh5bG9jb2NjdXMgc3BwLiogb24gKkNvcnluZWJhY3Rlcml1bSBzcHAuKiArCiAgICAgICpTdGFwaHlsb2NvY2N1cyBzcHAuKiBpbiB0aGUgbWljcm9iaW9tZSBpcyBtZWFzdXJlZCB2aWEgREdHRSAoKkRlbmF0dXJpbmcgR3JhZGllbnQKICAgICAgR2VsIEVsZWN0cm9waG9yZXNpcyopLgogICAgCiMgR29hbAoKVGhlIG92ZXJhcmNoaW5nIGdvYWwgb2YgdGhpcyByZXNlYXJjaCB3YXMgdG8gYXNzZXNzIGlmIHRoZSByZWxhdGl2ZSBhYnVuZGFuY2UgCipTdGFwaHlsb2NvY2N1cyBzcHAuKgppbiB0aGUgbWljcm9iaW9tZSBvZiB0aGUgYXJtcGl0IGlzIGFmZmVjdGVkIGJ5IHRyYW5zcGxhbnRpbmcgdGhlIG1pY3JvYmlvbWUuIApUbyB0aGlzIGVuZCB0aGUgcmVzZWFyY2hlcnMgcmFuZG9taXplZCBwYXRpZW50cyB0byB0d28gdHJlYXRtZW50OgpBIHRyZWF0bWVudCB3aXRoIGFudGliaW90aWNzIG9ubHkgYW5kIGEgdHJlYXRtZW50IHdpdGgKYW50aWJpb3RpY3MgYW5kIGEgbWljcm9iaWFsIHRyYW5zcGxhbnQuCgpJbiB0aGUgdHV0b3JpYWwgb24gaHlwb3RoZXNlcyB0ZXN0aW5nIHdlIHdpbGwgdXNlIGEgZm9ybWFsIHN0YXRpc3RpY2FsIHRlc3QgdG8gZ2VuZXJhbGl6ZSB0aGUgcmVzdWx0cyBmcm9tIHRoZSBzYW1wbGUgdG8gdGhhdCBvZiB0aGUgcG9wdWxhdGlvbi4KCgojIEltcG9ydCB0aGUgZGF0YXNldAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQojTG9hZCB0aGUgbGlicmFyaWVzCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCkltcG9ydCB0aGUgZGF0YQoKYGBge3J9CmFwIDwtIHJlYWRfY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vR1RQQi9QU0xTMjAvbWFzdGVyL2RhdGEvYXJtcGl0LmNzdiIpCmBgYAoKYGBge3J9CmdsaW1wc2UoYXApCmBgYAoKIyBEYXRhIEV4cGxvcmF0aW9uCgpBIGNydWNpYWwgZmlyc3Qgc3RlcCBpbiBhIGRhdGEgYW5hbHlzaXMgaXMgdG8gdmlzdWFsaXplIGFuZCB0byBleHBsb3JlIHRoZSByYXcgZGF0YS4KCgpgYGB7cn0KYXAgJT4lIGdncGxvdChhZXMoeD10cnQseT1yZWwsZmlsbD10cnQpKSArIAogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlPU5BKSArIAogIGdlb21fcG9pbnQocG9zaXRpb249ImppdHRlciIpICsKICB5bGFiKCJyZWxhdGl2ZSBhYnVuZGFuY2UgKCUpIikgKwogIHhsYWIoInRyZWF0bWVudCBncm91cCIpICsgCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGdlb209InBvaW50Iiwgc2hhcGU9NSwgc2l6ZT0zLCBjb2xvcj0iYmxhY2siLCBmaWxsPSJibGFjayIpCmBgYAoKV2UgY2xlYXJseSBzZWUgdGhhdCwgb24gYXZlcmFnZSwgdGhlIHN1YmplY3RzIHdobyBoYWQgYQptaWNyb2JpYWwgdHJhbnNwbGFudCBoYXZlIGEgaGlnaGVyIHJlbGF0aXZlIGFidW5kYW5jZSBvZgpTdGFwaHlsb2NvY2N1cyBzcHAuIEJ1dCBpcyB0aGlzIGRpZmZlcmVuY2Ugc3RhdGlzdGljYWxseSAgKnNpZ25pZmljYW50KiBzbyB0aGF0IHdlIGNhbiBnZW5lcmFsaXplZCB3aGF0IHdlIG9ic2VydmUgaW4gdGhlIHNhbXBsZSB0byB0aGUgcG9wdWxhdGlvbj8KCldlIGNhbiB0ZXN0IHRoaXMgd2l0aCBhbiB1bnBhaXJlZCwgdHdvLXNhbXBsZSB0LXRlc3QsIHdoaWNoIGZhbHNpZmllcyB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlcmUgaXMgb24gYXZlcmFnZSBubyBkaWZmZXJlbmNlIGluIHJlbGF0aXZlIGFidW5kYW5jZSBvZiAqU3RhcGh5bG9jb2NjdXMqIGluIHRoZSBhcm1waXQgbWljcm9iaW9tZSBiZXR3ZWVuIHRoZSB0cmFuc3BsYW50IGFuZCB0aGUgcGxhY2VibyBncm91cCBhZ2FpbnN0IHRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIHRoYXQgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIGF2ZXJhZ2UgYWJ1bmRhbmNlIG9mICpTdGFwaHlsb2Njb2N1cyogaW4gdGhlIGFybXBpdCBtaWNyb2Jpb21lIGJldHdlZW4gdGhlIHRyYW5zcGxhbnQgYW5kIHBsYWNlYm8gdHJlYXRtZW50LiAKCkJ1dCwgYmVmb3JlIHdlIGNhbiBzdGFydCB0aGUgYW5hbHlzaXMsIHdlIG11c3QgY2hlY2sgaWYKYWxsIGFzc3VtcHRpb25zIHRvIHBlcmZvcm0gYSB0LXRlc3QgYXJlIG1ldC4KCiMjIENoZWNrIHRoZSBhc3N1bXB0aW9ucwoKMS4gVGhlIG9ic2VydmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgYm90aCB3aXRoaW4gYW5kIGJldHdlZW4gZ3JvdXBzLiAgVGhpcyBoYXMgdG8gYmUgZ2FyYW50ZWVkIGJ5IHRoZSBkZXNpZ24uCjIuIFRoZSBkYXRhIChyZWwpIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCBpbiBlYWNoIG9mIHRoZSBncm91cHMKMy4gVGhlIHZhcmlhYmlsaXR5IHdpdGhpbiBib3RoIGdyb3VwcyBpcyBzaW1pbGFyLgoKVG8gY2hlY2sgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uLCB3ZSB3aWxsIHVzZSBRUSBwbG90cy4KCmBgYHtyfQphcCAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZT1yZWwpKSArCiAgZ2VvbV9xcSgpICsKICBnZW9tX3FxX2xpbmUoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh0cnQpKQpgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGUgZGF0YSBpcyBuaWNlbHkgc2NhdHRlcmVkIGFyb3VuZCB0aGUgcXVhbnRpbGUtcXVhbnRpbGUKbGluZSAoYmxhY2sgbGluZSkuIEFzIHN1Y2gsIHdlIG1heSBjb25jbHVkZSB0aGF0IHRoZSBvdXIgZGF0YSBhcmUgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZC4KCkZvciB0aGUgdGhpcmQgYXNzdW1wdGlvbiwgd2UgbXVzdCBjb21wYXJlIHRoZSB3aXRoaW4tZ3JvdXAKdmFyaWFiaWxpdHkgb2YgYm90aCBncm91cHMuIFdlIGNhbiBkbyB0aGlzIHZpc3VhbGx5IGJhc2VkIG9uIHRoZSBib3hwbG90cy4gVGhlIHNpemUgb2YgdGhlIGJveCBpbiB0aGUgYm94cGxvdCBpcyB0aGUgaW50ZXJxdWFydGlsZSByYW5nZSwgYW4gbm9ucGFyYW1ldHJpYyBlc3RpbWF0b3Igb2YgdGhlIHZhcmlhYmlsaXR5IG9mIHRoZSBkYXRhLiAKSW4gdGhlIHBsb3Qgd2Ugb2JzZXJ2ZSB0aGF0IHRoZSBib3hlcyBhcmUgZmFpcmx5IGVxdWFsIGluIHNpemUgaW5kaWNhdGluZyB0aGF0ICB0aGUgYm94IHNpemUgaXMKYXBwcm94aW1hdGVseSBlcXVhbCBmb3IgZ3JvdXBzLiAKCkZvciBzbWFsbCBzYW1wbGUgc2l6ZXMgdGhlIHZhcmlhYmlsaXR5IGVzdGltYXRpb24gaXMgbm90IHZlcnkgcHJlY2lzZSBhbmQgdGhlIGRpZmZlcmVuY2VzIGluIGJveCBzaXplcyBoYXZlIHRvIGJlIG1vcmUgdGhhbiAyIG9yIDMgdGltZXMgbGFyZ2VyIGluIG9uZSBvZiB0aGUgZ3JvdXBzIGJlZm9yZSB0aGVyZSBpcyBhbiBpbmRpY2F0aW9uIGZvciB0aGUgZGV2aWF0aW9uIG9mIGVxdWFsaXR5IG9mIG1lYW5zLiBJZiB0aGUgdmFyaWFiaWxpdHkgd291bGQgbm90IGhhdmUgYmVlbiBlcXVhbCwgd2UgbWlnaHQgaGF2ZSByZXNvcnRlZCB0aGUgV2VsY2ggbW9kaWZpZWQgVC10ZXN0LiAKCkFzIGFsbCB0aHJlZSBhc3N1bXB0aW9ucyBhcmUgbWV0IHdlIG1heSBjb250aW51ZSB3aXRoCnBlcmZvcm1pbmcgdGhlIHVucGFpcmVkIHR3by1zYW1wbGUgdC10ZXN0IHdpdGggZXF1YWwgdmFyaWFuY2VzLgoKIyBBc3Nlc3MgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uIHdpdGggdGhlICB0d28tc2FtcGxlIHQtdGVzdAoKIyBUcmFpbiB5b3Vyc2VsZiBpbiBjaGVja2luZyB0aGUgYXNzdW1wdGlvbnMKCkluIG9yZGVyIGZvciB0aGUgbGVhcm5lcnMgdG8gZ2V0IG1vcmUgcHJvZmljaWVudCBpbiBldmFsdWF0aW5nIHRoZSBhc3N1bXB0aW9ucyB3ZSB3aWxsIHNpbXVsYXRlIDkgZGF0YXNldCB3aXRoIHNhbXBsZSBzaXplcyBzaW1pbGFyIHRvIG91ciBkYXRhIGZvciB3aGljaCB0aGUgYXNzdW1wdGlvbnMgb2Ygbm9ybWFsaXR5IGFuZCBlcXVhbCB2YXJpYW5jZSBkbyBob2xkLiBGb3IgdGhlIFFRLXBsb3RzIHdlIHdpbGwgb25seSBwbG90IHRoZSBvbmUgZnJvbSBvbmUgb2YgdGhlIGdyb3Vwcy4gCgojIyBTaW11bGF0ZSBkYXRhIAoKV2Ugc2ltdWxhdGUgOSBkYXRhc2V0cyB3aXRoIHRoZSBzYW1lIHNhbXBsZSBzaXplcywgbWVhbnMgYW5kIHBvb2xlZCB2YXJpYW5jZSBhcyBpbiB0aGUgc2FtcGxlLiAKCmBgYHtyfQpuU2FtcCA8LSA5CiMjIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MKYXBSZWxTdW08LWFwJT4lCiAgZ3JvdXBfYnkodHJ0KSU+JQogIHN1bW1hcml6ZV9hdCgicmVsIiwKICAgICAgICAgICAgICAgbGlzdChtZWFuPX5tZWFuKC4sbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgc2Q9fnNkKC4sbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgbj1mdW5jdGlvbih4KSB4JT4laXMubmElPiVgIWAlPiVzdW0pKSAlPiUKICBtdXRhdGUoc2U9c2Qvc3FydChuKSkKCnNpZ21hIDwtIHNxcnQoc3VtKGFwUmVsU3VtJHNkXjIqKGFwUmVsU3VtJG4tMSkpLyhzdW0oYXBSZWxTdW0kbiktMikpIAoKbm9ybVNpbSA8LSBtYXRyaXgocm5vcm0oc3VtKGFwUmVsU3VtJG4pKm5TYW1wLAogICAgICAgICAgICAgIG1lYW49YyhyZXAoYXBSZWxTdW0kbWVhblsxXSxhcFJlbFN1bSRuWzFdKSwKICAgICAgICAgICAgICAgICAgICAgcmVwKGFwUmVsU3VtJG1lYW5bMl0sYXBSZWxTdW0kblsyXSkpLAogICAgICAgICAgICAgICAgICAgICBzZD1zaWdtYSksbnJvdz1zdW0oYXBSZWxTdW0kbikpICU+JQogIGFzLmRhdGEuZnJhbWUgJT4lIAogIG11dGF0ZSh0cnQ9YXAkdHJ0KQpgYGAKCiMjIENvbXBhcmlzb25zIG9mIHZhcmlhbmNlcwoKYGBge3J9Cm5vcm1TaW0gJT4lIGdhdGhlcihzYW1wLGRhdGEsLXRydCkgJT4lCiAgZ2dwbG90KGFlcyh4PXRydCx5PWRhdGEpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGZhY2V0X3dyYXAofnNhbXApCmBgYAoKIyMgRXZhbHVhdGlvbiBvZiBub3JtYWxpdHkKCiMjIyBQbGFjZWJvIGdyb3VwCgpgYGB7cn0Kbm9ybVNpbSAlPiUgCiAgZ2F0aGVyKHNhbXAsZGF0YSwtdHJ0KSAlPiUKICBmaWx0ZXIodHJ0PT0icGxhY2VibyIpICU+JQogIGdncGxvdChhZXMoc2FtcGxlPWRhdGEpKSArCiAgZ2VvbV9xcSgpICsKICBnZW9tX3FxX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh+c2FtcCkKYGBgCgojIyMgVHJhbnNwbGFudCBncm91cAoKYGBge3J9Cm5vcm1TaW0gJT4lIAogIGdhdGhlcihzYW1wLGRhdGEsLXRydCkgJT4lCiAgZmlsdGVyKHRydD09InRyYW5zcGxhbnQiKSAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZT1kYXRhKSkgKwogIGdlb21fcXEoKSArCiAgZ2VvbV9xcV9saW5lKCkgKwogIGZhY2V0X3dyYXAofnNhbXApCmBgYAo=