suppressPackageStartupMessages(library(tidyverse))
Warning message:
In if (charToRaw(x) < 20) paste("\\u", toupper(format(as.hexmode(as.integer(charToRaw(x))),  :
  the condition has length > 1 and only the first element will be used
suppressPackageStartupMessages(library(cowplot))
suppressPackageStartupMessages(library(GEOquery))
suppressPackageStartupMessages(library(SummarizedExperiment))

Background

Jinye has discovered that the sole catalase gene CTA1 is induced under phosphate starvation in C. glabrata, and is possibly regulated by the general stress response TF CgMsn4. We want to determine if the same are true in S. cerevisiae, i.e. if either ScCTA1 or ScCTT1 is induced under phosphate starvation and whether ScMsn4 is responsible for its induction (although Jinye has also shown that ScMsn4 DOES NOT localize into the nucleus upon phosphate starvation, or at least not in sufficient amount for it to be detectable by fluorescent imaging).

To answer the first question, the idea is to reanalyze two transcriptome-profiling dataset, one from Zhou and O’Shea 2011 (PMID: 21700227) and the other from Gurvich et al. 2017 (PMID: 29236696).

Zhou and O’Shea 2011

Data

GEO# Description Reference
GSE23580 Microarray expression analyses of S. cerevisiae wt, pho4∆, pho2∆ in rich or no Pi media Zhou & O’Shea 2011
Zhou X, O’Shea EK. 2011. Integrated approaches reveal determinants of genome-wide binding and function of the transcription factor Pho4. Mol Cell 42:826–836.

Analysis

  • GEOquery workshop offered by Jason Ratcliff at the Iowa Institute of Human Genetics

getGEO() will return an ExpressionSet object, which is then converted into a “SummarizedExperiment” object, which is a more modern data structure that is easier to deal with.

Sys.setenv("VROOM_CONNECTION_SIZE" = 131072*10) # increase the local cache size
gse <- getGEO(GEO = "GSE23580", destdir = "data/Zhou2011")
Found 1 file(s)
GSE23580_series_matrix.txt.gz
Using locally cached version: data/Zhou2011/GSE23580_series_matrix.txt.gz
Rows: 6314 Columns: 67
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr  (1): ID_REF
dbl (66): GSM578408, GSM578409, GSM578410, GSM578411, GSM578412, GSM578413, GSM578414, GSM578415, GSM578416, GSM578417, GSM578418, GSM57841...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Using locally cached version of GPL10786 found here:
data/Zhou2011/GPL10786.soft 
gse23580 <- as(gse$GSE23580_series_matrix.txt.gz, "SummarizedExperiment")

The experimental information is stored in the colData fields. The ones we are interested in are:

colData(gse23580) %>% 
  as_tibble() %>%
  filter(grepl("Wild type no vs high Pi conditions", title) | grepl("Comparison 1$", title)) %>% 
  select(title, geo_accession, organism = organism_ch1, strain = characteristics_ch1, 
         condition_ch1 = characteristics_ch1.2, label_ch1, condition_ch2 = characteristics_ch2.2, label_ch2)

The first three are part of the mutant cycle while the latter four are not. The latter four are said to have incorporated a dye swap, although I can’t tell how the swap was done from the table above.

Separately extract the two subsets and examine them separately.

gse1 <- gse23580[, grepl("Comparison 1$", gse23580$title)]
gse2 <- gse23580[, grepl("Wild type no vs high Pi conditions", gse23580$title)]

The probe annotation is stored as row metadata:

#gse23580 %>%  rowData() %>% as_tibble() %>% DT::datatable()

Check to see if the assay data is indeed normalized and log2 transformed, by plotting the values as boxplots:

cbind(assay(gse1, 1), assay(gse2, 1)) %>% boxplot()

Looks like they are.

Now we are ready to check CTA1 expression. First we need to find out the probe ID for CTA1, and then we can extract and plot the log2 transformed ratio. For comparison, we will include two other genes, one PHO target and one housekeeping.

Mutant Cycle

genes <- c("CTA1", "CTT1", "HSP12", "ALG9", "PHO8", "SPL2")
probes <- rowData(gse1) %>% 
  as_tibble() %>% 
  filter(Name %in% genes) %>% 
  select(ID, Name)

res1 <- assay(gse1)[probes$ID,] %>% as_tibble(rownames = "ID") %>% 
  left_join(probes, by = "ID") %>% 
  pivot_longer(cols = starts_with("GSM"), names_to = "Acc", values_to = "log2") %>% 
  left_join(colData(gse1) %>% as_tibble() %>% select(Sample = title, Acc = geo_accession), by = "Acc") %>% 
  mutate(Sample = gsub(" Comparison 1||Mutant Cycle ", "", Sample)) %>% 
  select(ID, Gene = Name, Acc, Sample, log2)

ggplot(res1, aes(x = Sample, y = log2, fill = Gene)) + 
  geom_col(position = position_dodge()) +
  ylab("log2 No Pi vs High Pi") + theme_cowplot()

ggsave("output/20210920-Zhou2011-mutant-cycle-data-plot.png")

Saving 7.29 x 4.51 in image

Dye swap

res2 <- assay(gse2)[probes$ID,] %>% as_tibble(rownames = "ID") %>% 
  left_join(probes, by = "ID") %>% 
  pivot_longer(cols = starts_with("GSM"), names_to = "Acc", values_to = "log2") %>% 
  left_join(colData(gse2) %>% as_tibble() %>% select(Sample = title, Acc = geo_accession), by = "Acc") %>% 
  mutate(Sample = gsub("Wild type no vs high Pi conditions ", "", Sample)) %>% 
  select(ID, Gene = Name, Acc, Sample, log2)

ggplot(res2, aes(x = Sample, y = log2, fill = Gene)) + geom_col(position = position_dodge()) +
  ylab("log2 No Pi vs High Pi") + theme_cowplot()

ggsave("output/20210920-Zhou2011-dye-swap-data-plot.png")

Saving 7.29 x 4.51 in image

Gurvich 2017

Data

Gurvich Y, Leshkowitz D, Barkai N. 2017. Dual role of starvation signaling in promoting growth and recovery. PLOS Biology 15:e2002039.

The data is extracted from the supplementary table 2, which records the data behind all the figures in the paper. The raw sequencing data were deposited in SRA, but not submitted to GEO. I decided to use their processed data, which is in log2 ratios (compared with the 0 min time point in most cases).

The extracted data is stored in an excel file with two sheets, corresponding to the 0 mM Pi and 0.06 mM Pi timecourse.

gurvich.file <- "data/Gurvich2017/20210921-extracted-supp-data-Fig1C.xlsx"
excel_sheets(gurvich.file)
[1] "Fig1c-0Pi"    "Fig3C-0.06Pi" "Fig1C-0.06Pi"
gd00 <- read_excel(gurvich.file, sheet = 1, na = "NaN") %>% 
  pivot_longer(!Group:Gene, names_to = "Time", values_to = "Log2.ratio") %>% 
  mutate(Time = as.numeric(Time))
gd06 <- read_excel(gurvich.file, sheet = 3, na = "NaN") %>% 
  pivot_longer(!Group:Gene, names_to = "Time", values_to = "Log2.ratio") %>% 
  mutate(Time = as.numeric(Time))

Analysis

I selected four genes in the “stress” category based on Hasan et al. 2002 Mol. Microbiol. “The control of the yeast H2O2 response by the Msn2/4 transcription factors”.

We first look at the 0 mM Pi data

genes <- c("CTT1", "TSL1", "HSP12", "HSP42", "PHO84", "SPL2", "PHO5")
p <- gd00 %>% 
  filter(Gene %in% genes, Time < 20) %>% 
  mutate(Fold = 2^Log2.ratio) %>% 
  ggplot(aes(x = Time, y = Fold, color = Gene)) + geom_point() + geom_line(size = 0.5) +
  xlab("Time (hours after -> 0 mM Pi)") + ylab("Fold induction relative to 0 min") +
  facet_wrap(~ Group)
p + theme_cowplot()

Notice how the stress genes show an early peak at the 2 hour time point, after which it drops to a lower level before reaching a second higher peak after quite some time (>8 hrs). What could be the explanation for this? The 2 hour time point induction shouldn’t be a result of switching media, which requires centrifugation or filtering, both of which could induce Msn2/4 translocation (?). If that’s not a likely reason, then we have to assume that these putative Msn2/4 targets are induced because the TFs responded to Pi starvation, likely at around 1 hour time point.

Next let’s look at the 0.06 mM Pi data. Note that because

p <- gd06 %>% 
  filter(Gene %in% genes, Time < 20) %>% 
  mutate(Fold = 2^Log2.ratio) %>% 
  ggplot(aes(x = Time, y = Fold, color = Gene)) + geom_point() + geom_line(size = 0.5, linetype = 2) +
  geom_hline(yintercept = 2, linetype = 3) +
  xlab("Time (hours after -> 0.06 mM Pi)") + ylab("Fold induction relative to 0 min") +
  facet_wrap(~ Group, nrow = 2)
p + theme_cowplot()
Warning: Removed 3 rows containing missing values (geom_point).
Warning: Removed 1 row(s) containing missing values (geom_path).

The dotted horizontal line indicates 2 fold induction.

What’s different in this plot from the previous one is that at the intermediate level of Pi, the cells exhibit a strongly biphasic induction of the PHO genes, with ~6.5 hours as the separation point. Before 6.5 hours, PHO5 and PHO84 are mildly induced and after that time point, both are more strongly induced. SPL2 is an early gene that gets induced to a higher level even in the early time point (it is also less dependent on Pho2). For the stress genes, they really aren’t induced until after 6.5 hrs when Pi starts to become growth limiting. This suggests that the signaling to Msn2/4 is probably via the sensing of nutrient levels (PKA? TOR)

LS0tCnRpdGxlOiAiQ1RBMSBpbmR1Y3Rpb24gdW5kZXIgcGhvc3BoYXRlIHN0YXJ2YXRpb24gaW4gX1MuIGNlcmV2aXNpYWVfIgphdXRob3I6ICJCaW4gSGUiCmRhdGU6ICI2LzkvMjAyMSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIGNvZGVfZm9sZGluZzogaGlkZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpgYGAKCmBgYHtyIGxvYWRfbGlicmFyaWVzfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeSh0aWR5dmVyc2UpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShyZWFkeGwpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShjb3dwbG90KSkKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoR0VPcXVlcnkpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShTdW1tYXJpemVkRXhwZXJpbWVudCkpCmBgYAoKIyMgQmFja2dyb3VuZAoKSmlueWUgaGFzIGRpc2NvdmVyZWQgdGhhdCB0aGUgc29sZSBjYXRhbGFzZSBnZW5lIF9DVEExXyBpcyBpbmR1Y2VkIHVuZGVyIHBob3NwaGF0ZSBzdGFydmF0aW9uIGluIF9DLiBnbGFicmF0YV8sIGFuZCBpcyBwb3NzaWJseSByZWd1bGF0ZWQgYnkgdGhlIGdlbmVyYWwgc3RyZXNzIHJlc3BvbnNlIFRGIENnTXNuNC4gV2Ugd2FudCB0byBkZXRlcm1pbmUgaWYgdGhlIHNhbWUgYXJlIHRydWUgaW4gX1MuIGNlcmV2aXNpYWVfLCBpLmUuIGlmIGVpdGhlciBfU2NDVEExXyBvciBfU2NDVFQxXyBpcyBpbmR1Y2VkIHVuZGVyIHBob3NwaGF0ZSBzdGFydmF0aW9uIGFuZCB3aGV0aGVyIFNjTXNuNCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIGluZHVjdGlvbiAoYWx0aG91Z2ggSmlueWUgaGFzIGFsc28gc2hvd24gdGhhdCBTY01zbjQgRE9FUyBOT1QgbG9jYWxpemUgaW50byB0aGUgbnVjbGV1cyB1cG9uIHBob3NwaGF0ZSBzdGFydmF0aW9uLCBvciBhdCBsZWFzdCBub3QgaW4gc3VmZmljaWVudCBhbW91bnQgZm9yIGl0IHRvIGJlIGRldGVjdGFibGUgYnkgZmx1b3Jlc2NlbnQgaW1hZ2luZykuCgpUbyBhbnN3ZXIgdGhlIGZpcnN0IHF1ZXN0aW9uLCB0aGUgaWRlYSBpcyB0byByZWFuYWx5emUgdHdvIHRyYW5zY3JpcHRvbWUtcHJvZmlsaW5nIGRhdGFzZXQsIG9uZSBmcm9tIFpob3UgYW5kIE8nU2hlYSAyMDExIChQTUlEOiAyMTcwMDIyNykgYW5kIHRoZSBvdGhlciBmcm9tIEd1cnZpY2ggX2V0IGFsLl8gMjAxNyAoUE1JRDogMjkyMzY2OTYpLgoKIyMgWmhvdSBhbmQgTydTaGVhIDIwMTEKCiMjIyBEYXRhCgp8IEdFTyMgfCBEZXNjcmlwdGlvbiB8IFJlZmVyZW5jZSB8CnwgLS0tLSB8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHwKfCBHU0UyMzU4MCB8IE1pY3JvYXJyYXkgZXhwcmVzc2lvbiBhbmFseXNlcyBvZiBfUy4gY2VyZXZpc2lhZV8gd3QsIF9waG804oiGXywgX3BobzLiiIZfIGluIHJpY2ggb3Igbm8gUGkgbWVkaWEgfCBaaG91ICYgTydTaGVhIDIwMTEgfAoKICAgIFpob3UgWCwgT+KAmVNoZWEgRUsuIDIwMTEuIEludGVncmF0ZWQgYXBwcm9hY2hlcyByZXZlYWwgZGV0ZXJtaW5hbnRzIG9mIGdlbm9tZS13aWRlIGJpbmRpbmcgYW5kIGZ1bmN0aW9uIG9mIHRoZSB0cmFuc2NyaXB0aW9uIGZhY3RvciBQaG80LiBNb2wgQ2VsbCA0Mjo4MjbigJM4MzYuCiAKIyMjIEFuYWx5c2lzCgotIEdFT3F1ZXJ5IHdvcmtzaG9wIG9mZmVyZWQgYnkgSmFzb24gUmF0Y2xpZmYgYXQgdGhlIElvd2EgSW5zdGl0dXRlIG9mIEh1bWFuIEdlbmV0aWNzCgpgZ2V0R0VPKClgIHdpbGwgcmV0dXJuIGFuIEV4cHJlc3Npb25TZXQgb2JqZWN0LCB3aGljaCBpcyB0aGVuIGNvbnZlcnRlZCBpbnRvIGEgIlN1bW1hcml6ZWRFeHBlcmltZW50IiBvYmplY3QsIHdoaWNoIGlzIGEgbW9yZSBtb2Rlcm4gZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcyBlYXNpZXIgdG8gZGVhbCB3aXRoLgpgYGB7cn0KU3lzLnNldGVudigiVlJPT01fQ09OTkVDVElPTl9TSVpFIiA9IDEzMTA3MioxMCkgIyBpbmNyZWFzZSB0aGUgbG9jYWwgY2FjaGUgc2l6ZQpnc2UgPC0gZ2V0R0VPKEdFTyA9ICJHU0UyMzU4MCIsIGRlc3RkaXIgPSAiZGF0YS9aaG91MjAxMSIpCmdzZTIzNTgwIDwtIGFzKGdzZSRHU0UyMzU4MF9zZXJpZXNfbWF0cml4LnR4dC5neiwgIlN1bW1hcml6ZWRFeHBlcmltZW50IikKYGBgCgpUaGUgZXhwZXJpbWVudGFsIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgYGNvbERhdGFgIGZpZWxkcy4gVGhlIG9uZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4gYXJlOgpgYGB7cn0KY29sRGF0YShnc2UyMzU4MCkgJT4lIAogIGFzX3RpYmJsZSgpICU+JQogIGZpbHRlcihncmVwbCgiV2lsZCB0eXBlIG5vIHZzIGhpZ2ggUGkgY29uZGl0aW9ucyIsIHRpdGxlKSB8IGdyZXBsKCJDb21wYXJpc29uIDEkIiwgdGl0bGUpKSAlPiUgCiAgc2VsZWN0KHRpdGxlLCBnZW9fYWNjZXNzaW9uLCBvcmdhbmlzbSA9IG9yZ2FuaXNtX2NoMSwgc3RyYWluID0gY2hhcmFjdGVyaXN0aWNzX2NoMSwgCiAgICAgICAgIGNvbmRpdGlvbl9jaDEgPSBjaGFyYWN0ZXJpc3RpY3NfY2gxLjIsIGxhYmVsX2NoMSwgY29uZGl0aW9uX2NoMiA9IGNoYXJhY3RlcmlzdGljc19jaDIuMiwgbGFiZWxfY2gyKQpgYGAKClRoZSBmaXJzdCB0aHJlZSBhcmUgcGFydCBvZiB0aGUgbXV0YW50IGN5Y2xlIHdoaWxlIHRoZSBsYXR0ZXIgZm91ciBhcmUgbm90LiBUaGUgbGF0dGVyIGZvdXIgYXJlIHNhaWQgdG8gaGF2ZSBpbmNvcnBvcmF0ZWQgYSBkeWUgc3dhcCwgYWx0aG91Z2ggSSBjYW4ndCB0ZWxsIGhvdyB0aGUgc3dhcCB3YXMgZG9uZSBmcm9tIHRoZSB0YWJsZSBhYm92ZS4KClNlcGFyYXRlbHkgZXh0cmFjdCB0aGUgdHdvIHN1YnNldHMgYW5kIGV4YW1pbmUgdGhlbSBzZXBhcmF0ZWx5LgpgYGB7cn0KZ3NlMSA8LSBnc2UyMzU4MFssIGdyZXBsKCJDb21wYXJpc29uIDEkIiwgZ3NlMjM1ODAkdGl0bGUpXQpnc2UyIDwtIGdzZTIzNTgwWywgZ3JlcGwoIldpbGQgdHlwZSBubyB2cyBoaWdoIFBpIGNvbmRpdGlvbnMiLCBnc2UyMzU4MCR0aXRsZSldCmBgYAoKVGhlIHByb2JlIGFubm90YXRpb24gaXMgc3RvcmVkIGFzIHJvdyBtZXRhZGF0YToKYGBge3J9CiNnc2UyMzU4MCAlPiUgIHJvd0RhdGEoKSAlPiUgYXNfdGliYmxlKCkgJT4lIERUOjpkYXRhdGFibGUoKQpgYGAKCkNoZWNrIHRvIHNlZSBpZiB0aGUgYXNzYXkgZGF0YSBpcyBpbmRlZWQgbm9ybWFsaXplZCBhbmQgbG9nMiB0cmFuc2Zvcm1lZCwgYnkgcGxvdHRpbmcgdGhlIHZhbHVlcyBhcyBib3hwbG90czoKYGBge3J9CmNiaW5kKGFzc2F5KGdzZTEsIDEpLCBhc3NheShnc2UyLCAxKSkgJT4lIGJveHBsb3QoKQpgYGAKTG9va3MgbGlrZSB0aGV5IGFyZS4KCk5vdyB3ZSBhcmUgcmVhZHkgdG8gY2hlY2sgQ1RBMSBleHByZXNzaW9uLiBGaXJzdCB3ZSBuZWVkIHRvIGZpbmQgb3V0IHRoZSBwcm9iZSBJRCBmb3IgQ1RBMSwgYW5kIHRoZW4gd2UgY2FuIGV4dHJhY3QgYW5kIHBsb3QgdGhlIGxvZzIgdHJhbnNmb3JtZWQgcmF0aW8uIEZvciBjb21wYXJpc29uLCB3ZSB3aWxsIGluY2x1ZGUgdHdvIG90aGVyIGdlbmVzLCBvbmUgUEhPIHRhcmdldCBhbmQgb25lIGhvdXNla2VlcGluZy4KCioqTXV0YW50IEN5Y2xlKioKYGBge3IsIHJlc3VsdHM9J2FzaXMnfQpnZW5lcyA8LSBjKCJDVEExIiwgIkNUVDEiLCAiSFNQMTIiLCAiQUxHOSIsICJQSE84IiwgIlNQTDIiKQpwcm9iZXMgPC0gcm93RGF0YShnc2UxKSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogIGZpbHRlcihOYW1lICVpbiUgZ2VuZXMpICU+JSAKICBzZWxlY3QoSUQsIE5hbWUpCgpyZXMxIDwtIGFzc2F5KGdzZTEpW3Byb2JlcyRJRCxdICU+JSBhc190aWJibGUocm93bmFtZXMgPSAiSUQiKSAlPiUgCiAgbGVmdF9qb2luKHByb2JlcywgYnkgPSAiSUQiKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiR1NNIiksIG5hbWVzX3RvID0gIkFjYyIsIHZhbHVlc190byA9ICJsb2cyIikgJT4lIAogIGxlZnRfam9pbihjb2xEYXRhKGdzZTEpICU+JSBhc190aWJibGUoKSAlPiUgc2VsZWN0KFNhbXBsZSA9IHRpdGxlLCBBY2MgPSBnZW9fYWNjZXNzaW9uKSwgYnkgPSAiQWNjIikgJT4lIAogIG11dGF0ZShTYW1wbGUgPSBnc3ViKCIgQ29tcGFyaXNvbiAxfHxNdXRhbnQgQ3ljbGUgIiwgIiIsIFNhbXBsZSkpICU+JSAKICBzZWxlY3QoSUQsIEdlbmUgPSBOYW1lLCBBY2MsIFNhbXBsZSwgbG9nMikKCmdncGxvdChyZXMxLCBhZXMoeCA9IFNhbXBsZSwgeSA9IGxvZzIsIGZpbGwgPSBHZW5lKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICB5bGFiKCJsb2cyIE5vIFBpIHZzIEhpZ2ggUGkiKSArIHRoZW1lX2Nvd3Bsb3QoKQoKZ2dzYXZlKCJvdXRwdXQvMjAyMTA5MjAtWmhvdTIwMTEtbXV0YW50LWN5Y2xlLWRhdGEtcGxvdC5wbmciKQpgYGAKCioqRHllIHN3YXAqKgpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9CnJlczIgPC0gYXNzYXkoZ3NlMilbcHJvYmVzJElELF0gJT4lIGFzX3RpYmJsZShyb3duYW1lcyA9ICJJRCIpICU+JSAKICBsZWZ0X2pvaW4ocHJvYmVzLCBieSA9ICJJRCIpICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKCJHU00iKSwgbmFtZXNfdG8gPSAiQWNjIiwgdmFsdWVzX3RvID0gImxvZzIiKSAlPiUgCiAgbGVmdF9qb2luKGNvbERhdGEoZ3NlMikgJT4lIGFzX3RpYmJsZSgpICU+JSBzZWxlY3QoU2FtcGxlID0gdGl0bGUsIEFjYyA9IGdlb19hY2Nlc3Npb24pLCBieSA9ICJBY2MiKSAlPiUgCiAgbXV0YXRlKFNhbXBsZSA9IGdzdWIoIldpbGQgdHlwZSBubyB2cyBoaWdoIFBpIGNvbmRpdGlvbnMgIiwgIiIsIFNhbXBsZSkpICU+JSAKICBzZWxlY3QoSUQsIEdlbmUgPSBOYW1lLCBBY2MsIFNhbXBsZSwgbG9nMikKCmdncGxvdChyZXMyLCBhZXMoeCA9IFNhbXBsZSwgeSA9IGxvZzIsIGZpbGwgPSBHZW5lKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICB5bGFiKCJsb2cyIE5vIFBpIHZzIEhpZ2ggUGkiKSArIHRoZW1lX2Nvd3Bsb3QoKQoKZ2dzYXZlKCJvdXRwdXQvMjAyMTA5MjAtWmhvdTIwMTEtZHllLXN3YXAtZGF0YS1wbG90LnBuZyIpCmBgYAoKIyMgR3VydmljaCAyMDE3CiMjIyBEYXRhCgogICAgR3VydmljaCBZLCBMZXNoa293aXR6IEQsIEJhcmthaSBOLiAyMDE3LiBEdWFsIHJvbGUgb2Ygc3RhcnZhdGlvbiBzaWduYWxpbmcgaW4gcHJvbW90aW5nIGdyb3d0aCBhbmQgcmVjb3ZlcnkuIFBMT1MgQmlvbG9neSAxNTplMjAwMjAzOS4KClRoZSBkYXRhIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBzdXBwbGVtZW50YXJ5IHRhYmxlIDIsIHdoaWNoIHJlY29yZHMgdGhlIGRhdGEgYmVoaW5kIGFsbCB0aGUgZmlndXJlcyBpbiB0aGUgcGFwZXIuIFRoZSByYXcgc2VxdWVuY2luZyBkYXRhIHdlcmUgZGVwb3NpdGVkIGluIFNSQSwgYnV0IG5vdCBzdWJtaXR0ZWQgdG8gR0VPLiBJIGRlY2lkZWQgdG8gdXNlIHRoZWlyIHByb2Nlc3NlZCBkYXRhLCB3aGljaCBpcyBpbiBsb2cyIHJhdGlvcyAoY29tcGFyZWQgd2l0aCB0aGUgMCBtaW4gdGltZSBwb2ludCBpbiBtb3N0IGNhc2VzKS4KClRoZSBleHRyYWN0ZWQgZGF0YSBpcyBzdG9yZWQgaW4gYW4gZXhjZWwgZmlsZSB3aXRoIHR3byBzaGVldHMsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDAgbU0gUGkgYW5kIDAuMDYgbU0gUGkgdGltZWNvdXJzZS4KYGBge3J9Cmd1cnZpY2guZmlsZSA8LSAiZGF0YS9HdXJ2aWNoMjAxNy8yMDIxMDkyMS1leHRyYWN0ZWQtc3VwcC1kYXRhLUZpZzFDLnhsc3giCmV4Y2VsX3NoZWV0cyhndXJ2aWNoLmZpbGUpCmBgYAoKYGBge3J9CmdkMDAgPC0gcmVhZF9leGNlbChndXJ2aWNoLmZpbGUsIHNoZWV0ID0gMSwgbmEgPSAiTmFOIikgJT4lIAogIHBpdm90X2xvbmdlcighR3JvdXA6R2VuZSwgbmFtZXNfdG8gPSAiVGltZSIsIHZhbHVlc190byA9ICJMb2cyLnJhdGlvIikgJT4lIAogIG11dGF0ZShUaW1lID0gYXMubnVtZXJpYyhUaW1lKSkKZ2QwNiA8LSByZWFkX2V4Y2VsKGd1cnZpY2guZmlsZSwgc2hlZXQgPSAzLCBuYSA9ICJOYU4iKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKCFHcm91cDpHZW5lLCBuYW1lc190byA9ICJUaW1lIiwgdmFsdWVzX3RvID0gIkxvZzIucmF0aW8iKSAlPiUgCiAgbXV0YXRlKFRpbWUgPSBhcy5udW1lcmljKFRpbWUpKQpgYGAKCiMjIyBBbmFseXNpcwpJIHNlbGVjdGVkIGZvdXIgZ2VuZXMgaW4gdGhlICJzdHJlc3MiIGNhdGVnb3J5IGJhc2VkIG9uIEhhc2FuIF9ldCBhbC5fIDIwMDIgTW9sLiBNaWNyb2Jpb2wuICJUaGUgY29udHJvbCBvZiB0aGUgeWVhc3QgSDJPMiByZXNwb25zZSBieSB0aGUgTXNuMi80IHRyYW5zY3JpcHRpb24gZmFjdG9ycyIuCgpXZSBmaXJzdCBsb29rIGF0IHRoZSAwIG1NIFBpIGRhdGEKYGBge3J9CmdlbmVzIDwtIGMoIkNUVDEiLCAiVFNMMSIsICJIU1AxMiIsICJIU1A0MiIsICJQSE84NCIsICJTUEwyIiwgIlBITzUiKQpwIDwtIGdkMDAgJT4lIAogIGZpbHRlcihHZW5lICVpbiUgZ2VuZXMsIFRpbWUgPCAyMCkgJT4lIAogIG11dGF0ZShGb2xkID0gMl5Mb2cyLnJhdGlvKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gVGltZSwgeSA9IEZvbGQsIGNvbG9yID0gR2VuZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICB4bGFiKCJUaW1lIChob3VycyBhZnRlciAtPiAwIG1NIFBpKSIpICsgeWxhYigiRm9sZCBpbmR1Y3Rpb24gcmVsYXRpdmUgdG8gMCBtaW4iKSArCiAgZmFjZXRfd3JhcCh+IEdyb3VwKQpwICsgdGhlbWVfY293cGxvdCgpCmBgYApOb3RpY2UgaG93IHRoZSBzdHJlc3MgZ2VuZXMgc2hvdyBhbiBlYXJseSBwZWFrIGF0IHRoZSAyIGhvdXIgdGltZSBwb2ludCwgYWZ0ZXIgd2hpY2ggaXQgZHJvcHMgdG8gYSBsb3dlciBsZXZlbCBiZWZvcmUgcmVhY2hpbmcgYSBzZWNvbmQgaGlnaGVyIHBlYWsgYWZ0ZXIgcXVpdGUgc29tZSB0aW1lICg+OCBocnMpLiBXaGF0IGNvdWxkIGJlIHRoZSBleHBsYW5hdGlvbiBmb3IgdGhpcz8gVGhlIDIgaG91ciB0aW1lIHBvaW50IGluZHVjdGlvbiBzaG91bGRuJ3QgYmUgYSByZXN1bHQgb2Ygc3dpdGNoaW5nIG1lZGlhLCB3aGljaCByZXF1aXJlcyBjZW50cmlmdWdhdGlvbiBvciBmaWx0ZXJpbmcsIGJvdGggb2Ygd2hpY2ggY291bGQgaW5kdWNlIE1zbjIvNCB0cmFuc2xvY2F0aW9uICg/KS4gSWYgdGhhdCdzIG5vdCBhIGxpa2VseSByZWFzb24sIHRoZW4gd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGVzZSBwdXRhdGl2ZSBNc24yLzQgdGFyZ2V0cyBhcmUgaW5kdWNlZCBiZWNhdXNlIHRoZSBURnMgcmVzcG9uZGVkIHRvIFBpIHN0YXJ2YXRpb24sIGxpa2VseSBhdCBhcm91bmQgMSBob3VyIHRpbWUgcG9pbnQuCgpOZXh0IGxldCdzIGxvb2sgYXQgdGhlIDAuMDYgbU0gUGkgZGF0YS4gTm90ZSB0aGF0IGJlY2F1c2UKYGBge3J9CnAgPC0gZ2QwNiAlPiUgCiAgZmlsdGVyKEdlbmUgJWluJSBnZW5lcywgVGltZSA8IDIwKSAlPiUgCiAgbXV0YXRlKEZvbGQgPSAyXkxvZzIucmF0aW8pICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBUaW1lLCB5ID0gRm9sZCwgY29sb3IgPSBHZW5lKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAyKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMiwgbGluZXR5cGUgPSAzKSArCiAgeGxhYigiVGltZSAoaG91cnMgYWZ0ZXIgLT4gMC4wNiBtTSBQaSkiKSArIHlsYWIoIkZvbGQgaW5kdWN0aW9uIHJlbGF0aXZlIHRvIDAgbWluIikgKwogIGZhY2V0X3dyYXAofiBHcm91cCwgbnJvdyA9IDIpCnAgKyB0aGVtZV9jb3dwbG90KCkKYGBgClRoZSBkb3R0ZWQgaG9yaXpvbnRhbCBsaW5lIGluZGljYXRlcyAyIGZvbGQgaW5kdWN0aW9uLgoKV2hhdCdzIGRpZmZlcmVudCBpbiB0aGlzIHBsb3QgZnJvbSB0aGUgcHJldmlvdXMgb25lIGlzIHRoYXQgYXQgdGhlIGludGVybWVkaWF0ZSBsZXZlbCBvZiBQaSwgdGhlIGNlbGxzIGV4aGliaXQgYSBzdHJvbmdseSBiaXBoYXNpYyBpbmR1Y3Rpb24gb2YgdGhlIFBITyBnZW5lcywgd2l0aCB+Ni41IGhvdXJzIGFzIHRoZSBzZXBhcmF0aW9uIHBvaW50LiBCZWZvcmUgNi41IGhvdXJzLCBfUEhPNV8gYW5kIF9QSE84NF8gYXJlIG1pbGRseSBpbmR1Y2VkIGFuZCBhZnRlciB0aGF0IHRpbWUgcG9pbnQsIGJvdGggYXJlIG1vcmUgc3Ryb25nbHkgaW5kdWNlZC4gX1NQTDJfIGlzIGFuIGVhcmx5IGdlbmUgdGhhdCBnZXRzIGluZHVjZWQgdG8gYSBoaWdoZXIgbGV2ZWwgZXZlbiBpbiB0aGUgZWFybHkgdGltZSBwb2ludCAoaXQgaXMgYWxzbyBsZXNzIGRlcGVuZGVudCBvbiBQaG8yKS4gRm9yIHRoZSBzdHJlc3MgZ2VuZXMsIHRoZXkgcmVhbGx5IGFyZW4ndCBpbmR1Y2VkIHVudGlsIGFmdGVyIDYuNSBocnMgd2hlbiBQaSBzdGFydHMgdG8gYmVjb21lIGdyb3d0aCBsaW1pdGluZy4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBzaWduYWxpbmcgdG8gTXNuMi80IGlzIHByb2JhYmx5IHZpYSB0aGUgc2Vuc2luZyBvZiBudXRyaWVudCBsZXZlbHMgKFBLQT8gVE9SKQ==