This is an R Markdown Notebook. In this file, we will sort the burrowing depth data and make the plots by heatwave phases.

1. loading packages and function

library(tidyr)
library(gtools)
library(ggplot2)
library(RColorBrewer)
library(ggpubr)
library(lme4)
library(lmerTest)
library(car)

source('summ_function.R')

2. loading data

depth.hf = read.csv('hf_deltaD.csv', header = T, stringsAsFactors=FALSE)
depth.hf$newtime = depth.hf$time
depth.hf$newtime = as.character(depth.hf$newtime)
depth.hf$newtime[depth.hf$newtime == 'T1'] = '9:00'
depth.hf$newtime[depth.hf$newtime == 'T2'] = '11:00'
depth.hf$newtime[depth.hf$newtime == 'T3'] = '12:30'
depth.hf$newtime[depth.hf$newtime == 'T4'] = '14:00'
depth.hf$newtime[depth.hf$newtime == 'T5'] = '16:00'
depth.hf$datetime = paste0(depth.hf$date, " ", depth.hf$newtime)
depth.hf = subset(depth.hf, phases != 'lumino')

depth.lf = read.csv('lf_deltaD.csv', header = T, stringsAsFactors=FALSE)
depth.lf$newtime = depth.lf$time
depth.lf$newtime = as.character(depth.lf$newtime)
depth.lf$newtime[depth.lf$newtime == 'T1'] = '9:00'
depth.lf$newtime[depth.lf$newtime == 'T2'] = '11:00'
depth.lf$newtime[depth.lf$newtime == 'T3'] = '12:30'
depth.lf$newtime[depth.lf$newtime == 'T4'] = '14:00'
depth.lf$newtime[depth.lf$newtime == 'T5'] = '16:00'
depth.lf$datetime = paste0(depth.lf$date, " ", depth.lf$newtime)
depth.lf = subset(depth.lf, phases != 'lumino')

3. subset data by heatwave types and phases

hf.calm = depth.hf[depth.hf$phases == 'cooling1' | 
                     depth.hf$phases == 'cooling2' | 
                     depth.hf$phases == 'cooling3' | 
                     depth.hf$phases == 'cooling4', ]
hf.hws = depth.hf[depth.hf$phases == 'heating1' | 
                     depth.hf$phases == 'heating2' | 
                     depth.hf$phases == 'heating3' | 
                     depth.hf$phases == 'heating4' |
                     depth.hf$phases == 'heating5', ]

lf.calm = depth.lf[depth.lf$phases == 'cooling1' | 
                     depth.lf$phases == 'cooling2', ]
lf.hws = depth.lf[depth.lf$phases == 'heating1' | 
                     depth.lf$phases == 'heating2' | 
                     depth.lf$phases == 'heating3', ]

4. summarize data (check)

hf.calm.c = hf.calm[hf.calm$treatment == 'control',]
hf.calm.h = hf.calm[hf.calm$treatment == 'heating',]

hf.hws.c = hf.hws[hf.hws$treatment == 'control',]
hf.hws.h = hf.hws[hf.hws$treatment == 'heating',]

lf.calm.c = lf.calm[lf.calm$treatment == 'control',]
lf.calm.h = lf.calm[lf.calm$treatment == 'heating',]

lf.hws.c = lf.hws[lf.hws$treatment == 'control',]
lf.hws.h = lf.hws[lf.hws$treatment == 'heating',]

abt.c = rbind(hf.calm.c, hf.hws.c, lf.calm.c, lf.hws.c)
abt.c$group = rep('ambient', length(abt.c$deltaL))

hf.calm.h$group = rep('calm_hf', length(hf.calm.h$deltaL))
lf.calm.h$group = rep('calm_lf', length(lf.calm.h$deltaL))

hf.hws.h$group = rep('hws_hf', length(hf.hws.h$deltaL))
lf.hws.h$group = rep('hws_lf', length(lf.hws.h$deltaL))

df.calm = rbind(abt.c, hf.calm.h, lf.calm.h)
df.hws = rbind(abt.c, hf.hws.h, lf.hws.h)

###########################################################
df.calm.summ = summarySE(df.calm, measurevar='deltaL', groupvars=c('group','time'), na.rm=T)
df.hws.summ = summarySE(df.hws, measurevar='deltaL', groupvars=c('group','time'), na.rm=T)

df.calm.summ$group[df.calm.summ$group == 'calm_hf'] = 'heatwaves: 3-day cycle'
df.calm.summ$group[df.calm.summ$group == 'calm_lf'] = 'heatwaves: 6-day cycle'

df.hws.summ$group[df.hws.summ$group == 'hws_hf'] = 'heatwaves: 3-day cycle'
df.hws.summ$group[df.hws.summ$group == 'hws_lf'] = 'heatwaves: 6-day cycle'

4. summarize data (optionnal)

# hf.calm.sum = summarySE(hf.calm, measurevar='deltaL', groupvars=c('treatment','time'), na.rm=T)
# hf.calm.sum$treatment[hf.calm.sum$treatment == 'control'] = 'control: 3-day cycle'
# hf.calm.sum$treatment[hf.calm.sum$treatment == 'heating'] = 'heatwaves: 3-day cycle'
# 
# hf.hws.sum = summarySE(hf.hws, measurevar='deltaL', groupvars=c('treatment','time'), na.rm=T)
# hf.hws.sum$treatment[hf.hws.sum$treatment == 'control'] = 'control: 3-day cycle'
# hf.hws.sum$treatment[hf.hws.sum$treatment == 'heating'] = 'heatwaves: 3-day cycle'
# 
# lf.calm.sum = summarySE(lf.calm, measurevar="deltaL", groupvars=c("treatment",'time'),na.rm=T)
# lf.calm.sum$treatment[lf.calm.sum$treatment == 'control'] = 'control: 6-day cycle'
# lf.calm.sum$treatment[lf.calm.sum$treatment == 'heating'] = 'heatwaves: 6-day cycle'
# 
# lf.hws.sum = summarySE(lf.hws, measurevar="deltaL", groupvars=c("treatment",'time'),na.rm=T)
# lf.hws.sum$treatment[lf.hws.sum$treatment == 'control'] = 'control: 6-day cycle'
# lf.hws.sum$treatment[lf.hws.sum$treatment == 'heating'] = 'heatwaves: 6-day cycle'
# 
# calm.sum = rbind(lf.calm.sum, hf.calm.sum)
# hws.sum = rbind(lf.hws.sum, hf.hws.sum)

5. change time format

df.calm.summ$time[df.calm.summ$time == 'T1'] = '9:00'
df.calm.summ$time[df.calm.summ$time == 'T2'] = '11:00'
df.calm.summ$time[df.calm.summ$time == 'T3'] = '12:30'
df.calm.summ$time[df.calm.summ$time == 'T4'] = '14:00'
df.calm.summ$time[df.calm.summ$time == 'T5'] = '16:00'

df.hws.summ$time[df.hws.summ$time == 'T1'] = '9:00'
df.hws.summ$time[df.hws.summ$time == 'T2'] = '11:00'
df.hws.summ$time[df.hws.summ$time == 'T3'] = '12:30'
df.hws.summ$time[df.hws.summ$time == 'T4'] = '14:00'
df.hws.summ$time[df.hws.summ$time == 'T5'] = '16:00'

6. save data

write.csv(df.calm.summ, 'df_calm_summ.csv', row.names = F)
write.csv(df.hws.summ, 'df_hws_summ.csv', row.names = F)

7. loading data

calm.profile = read.csv('df_calm_summ.csv', header = T)
calm.profile$time = factor(calm.profile$time, levels = c('9:00', '11:00', '12:30', '14:00', '16:00'))

hws.profile = read.csv('df_hws_summ.csv', header = T)
hws.profile$time = factor(hws.profile$time, levels = c('9:00', '11:00', '12:30', '14:00', '16:00'))

8. statistics

summary(glht(m2, linfct = mcp(group = "Tukey")), test = adjusted("holm"))

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: lmer(formula = deltaL ~ group + day + (1 | individual), data = df.calm)

Linear Hypotheses:
                        Estimate Std. Error z value Pr(>|z|)
calm_hf - ambient == 0  0.100469   0.110215   0.912    0.918
calm_lf - ambient == 0  0.094993   0.092813   1.023    0.918
calm_lf - calm_hf == 0 -0.005476   0.134321  -0.041    0.967
(Adjusted p values reported -- holm method)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayBmb3IgRmlnLjQgaW4gc2Vjb25kIG1hbnVzY3JpcHQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBJbiB0aGlzIGZpbGUsIHdlIHdpbGwgc29ydCB0aGUgYnVycm93aW5nIGRlcHRoIGRhdGEgYW5kIG1ha2UgdGhlIHBsb3RzIGJ5IGhlYXR3YXZlIHBoYXNlcy4KCiMjIDEuIGxvYWRpbmcgcGFja2FnZXMgYW5kIGZ1bmN0aW9uCmBgYHtyfQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGd0b29scykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShjYXIpCgpzb3VyY2UoJ3N1bW1fZnVuY3Rpb24uUicpCgpgYGAKCiMjIDIuIGxvYWRpbmcgZGF0YQpgYGB7cn0KZGVwdGguaGYgPSByZWFkLmNzdignaGZfZGVsdGFELmNzdicsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpCmRlcHRoLmhmJG5ld3RpbWUgPSBkZXB0aC5oZiR0aW1lCmRlcHRoLmhmJG5ld3RpbWUgPSBhcy5jaGFyYWN0ZXIoZGVwdGguaGYkbmV3dGltZSkKZGVwdGguaGYkbmV3dGltZVtkZXB0aC5oZiRuZXd0aW1lID09ICdUMSddID0gJzk6MDAnCmRlcHRoLmhmJG5ld3RpbWVbZGVwdGguaGYkbmV3dGltZSA9PSAnVDInXSA9ICcxMTowMCcKZGVwdGguaGYkbmV3dGltZVtkZXB0aC5oZiRuZXd0aW1lID09ICdUMyddID0gJzEyOjMwJwpkZXB0aC5oZiRuZXd0aW1lW2RlcHRoLmhmJG5ld3RpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRlcHRoLmhmJG5ld3RpbWVbZGVwdGguaGYkbmV3dGltZSA9PSAnVDUnXSA9ICcxNjowMCcKZGVwdGguaGYkZGF0ZXRpbWUgPSBwYXN0ZTAoZGVwdGguaGYkZGF0ZSwgIiAiLCBkZXB0aC5oZiRuZXd0aW1lKQpkZXB0aC5oZiA9IHN1YnNldChkZXB0aC5oZiwgcGhhc2VzICE9ICdsdW1pbm8nKQoKZGVwdGgubGYgPSByZWFkLmNzdignbGZfZGVsdGFELmNzdicsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpCmRlcHRoLmxmJG5ld3RpbWUgPSBkZXB0aC5sZiR0aW1lCmRlcHRoLmxmJG5ld3RpbWUgPSBhcy5jaGFyYWN0ZXIoZGVwdGgubGYkbmV3dGltZSkKZGVwdGgubGYkbmV3dGltZVtkZXB0aC5sZiRuZXd0aW1lID09ICdUMSddID0gJzk6MDAnCmRlcHRoLmxmJG5ld3RpbWVbZGVwdGgubGYkbmV3dGltZSA9PSAnVDInXSA9ICcxMTowMCcKZGVwdGgubGYkbmV3dGltZVtkZXB0aC5sZiRuZXd0aW1lID09ICdUMyddID0gJzEyOjMwJwpkZXB0aC5sZiRuZXd0aW1lW2RlcHRoLmxmJG5ld3RpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRlcHRoLmxmJG5ld3RpbWVbZGVwdGgubGYkbmV3dGltZSA9PSAnVDUnXSA9ICcxNjowMCcKZGVwdGgubGYkZGF0ZXRpbWUgPSBwYXN0ZTAoZGVwdGgubGYkZGF0ZSwgIiAiLCBkZXB0aC5sZiRuZXd0aW1lKQpkZXB0aC5sZiA9IHN1YnNldChkZXB0aC5sZiwgcGhhc2VzICE9ICdsdW1pbm8nKQoKYGBgCgojIyAzLiBzdWJzZXQgZGF0YSBieSBoZWF0d2F2ZSB0eXBlcyBhbmQgcGhhc2VzCmBgYHtyfQpoZi5jYWxtID0gZGVwdGguaGZbZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nMScgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nMicgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nMycgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdjb29saW5nNCcsIF0KaGYuaHdzID0gZGVwdGguaGZbZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nMScgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nMicgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nMycgfCAKICAgICAgICAgICAgICAgICAgICAgZGVwdGguaGYkcGhhc2VzID09ICdoZWF0aW5nNCcgfAogICAgICAgICAgICAgICAgICAgICBkZXB0aC5oZiRwaGFzZXMgPT0gJ2hlYXRpbmc1JywgXQoKbGYuY2FsbSA9IGRlcHRoLmxmW2RlcHRoLmxmJHBoYXNlcyA9PSAnY29vbGluZzEnIHwgCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoLmxmJHBoYXNlcyA9PSAnY29vbGluZzInLCBdCmxmLmh3cyA9IGRlcHRoLmxmW2RlcHRoLmxmJHBoYXNlcyA9PSAnaGVhdGluZzEnIHwgCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoLmxmJHBoYXNlcyA9PSAnaGVhdGluZzInIHwgCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoLmxmJHBoYXNlcyA9PSAnaGVhdGluZzMnLCBdCgpgYGAKCiMjIDQuIHN1bW1hcml6ZSBkYXRhIChjaGVjaykKYGBge3J9CmhmLmNhbG0uYyA9IGhmLmNhbG1baGYuY2FsbSR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnLF0KaGYuY2FsbS5oID0gaGYuY2FsbVtoZi5jYWxtJHRyZWF0bWVudCA9PSAnaGVhdGluZycsXQoKaGYuaHdzLmMgPSBoZi5od3NbaGYuaHdzJHRyZWF0bWVudCA9PSAnY29udHJvbCcsXQpoZi5od3MuaCA9IGhmLmh3c1toZi5od3MkdHJlYXRtZW50ID09ICdoZWF0aW5nJyxdCgpsZi5jYWxtLmMgPSBsZi5jYWxtW2xmLmNhbG0kdHJlYXRtZW50ID09ICdjb250cm9sJyxdCmxmLmNhbG0uaCA9IGxmLmNhbG1bbGYuY2FsbSR0cmVhdG1lbnQgPT0gJ2hlYXRpbmcnLF0KCmxmLmh3cy5jID0gbGYuaHdzW2xmLmh3cyR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnLF0KbGYuaHdzLmggPSBsZi5od3NbbGYuaHdzJHRyZWF0bWVudCA9PSAnaGVhdGluZycsXQoKYWJ0LmMgPSByYmluZChoZi5jYWxtLmMsIGhmLmh3cy5jLCBsZi5jYWxtLmMsIGxmLmh3cy5jKQphYnQuYyRncm91cCA9IHJlcCgnYW1iaWVudCcsIGxlbmd0aChhYnQuYyRkZWx0YUwpKQoKaGYuY2FsbS5oJGdyb3VwID0gcmVwKCdjYWxtX2hmJywgbGVuZ3RoKGhmLmNhbG0uaCRkZWx0YUwpKQpsZi5jYWxtLmgkZ3JvdXAgPSByZXAoJ2NhbG1fbGYnLCBsZW5ndGgobGYuY2FsbS5oJGRlbHRhTCkpCgpoZi5od3MuaCRncm91cCA9IHJlcCgnaHdzX2hmJywgbGVuZ3RoKGhmLmh3cy5oJGRlbHRhTCkpCmxmLmh3cy5oJGdyb3VwID0gcmVwKCdod3NfbGYnLCBsZW5ndGgobGYuaHdzLmgkZGVsdGFMKSkKCmRmLmNhbG0gPSByYmluZChhYnQuYywgaGYuY2FsbS5oLCBsZi5jYWxtLmgpCmRmLmh3cyA9IHJiaW5kKGFidC5jLCBoZi5od3MuaCwgbGYuaHdzLmgpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkZi5jYWxtLnN1bW0gPSBzdW1tYXJ5U0UoZGYuY2FsbSwgbWVhc3VyZXZhcj0nZGVsdGFMJywgZ3JvdXB2YXJzPWMoJ2dyb3VwJywndGltZScpLCBuYS5ybT1UKQpkZi5od3Muc3VtbSA9IHN1bW1hcnlTRShkZi5od3MsIG1lYXN1cmV2YXI9J2RlbHRhTCcsIGdyb3VwdmFycz1jKCdncm91cCcsJ3RpbWUnKSwgbmEucm09VCkKCmRmLmNhbG0uc3VtbSRncm91cFtkZi5jYWxtLnN1bW0kZ3JvdXAgPT0gJ2NhbG1faGYnXSA9ICdoZWF0d2F2ZXM6IDMtZGF5IGN5Y2xlJwpkZi5jYWxtLnN1bW0kZ3JvdXBbZGYuY2FsbS5zdW1tJGdyb3VwID09ICdjYWxtX2xmJ10gPSAnaGVhdHdhdmVzOiA2LWRheSBjeWNsZScKCmRmLmh3cy5zdW1tJGdyb3VwW2RmLmh3cy5zdW1tJGdyb3VwID09ICdod3NfaGYnXSA9ICdoZWF0d2F2ZXM6IDMtZGF5IGN5Y2xlJwpkZi5od3Muc3VtbSRncm91cFtkZi5od3Muc3VtbSRncm91cCA9PSAnaHdzX2xmJ10gPSAnaGVhdHdhdmVzOiA2LWRheSBjeWNsZScKCmBgYAoKIyMgNC4gc3VtbWFyaXplIGRhdGEgKG9wdGlvbm5hbCkKYGBge3J9CiMgaGYuY2FsbS5zdW0gPSBzdW1tYXJ5U0UoaGYuY2FsbSwgbWVhc3VyZXZhcj0nZGVsdGFMJywgZ3JvdXB2YXJzPWMoJ3RyZWF0bWVudCcsJ3RpbWUnKSwgbmEucm09VCkKIyBoZi5jYWxtLnN1bSR0cmVhdG1lbnRbaGYuY2FsbS5zdW0kdHJlYXRtZW50ID09ICdjb250cm9sJ10gPSAnY29udHJvbDogMy1kYXkgY3ljbGUnCiMgaGYuY2FsbS5zdW0kdHJlYXRtZW50W2hmLmNhbG0uc3VtJHRyZWF0bWVudCA9PSAnaGVhdGluZyddID0gJ2hlYXR3YXZlczogMy1kYXkgY3ljbGUnCiMgCiMgaGYuaHdzLnN1bSA9IHN1bW1hcnlTRShoZi5od3MsIG1lYXN1cmV2YXI9J2RlbHRhTCcsIGdyb3VwdmFycz1jKCd0cmVhdG1lbnQnLCd0aW1lJyksIG5hLnJtPVQpCiMgaGYuaHdzLnN1bSR0cmVhdG1lbnRbaGYuaHdzLnN1bSR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnXSA9ICdjb250cm9sOiAzLWRheSBjeWNsZScKIyBoZi5od3Muc3VtJHRyZWF0bWVudFtoZi5od3Muc3VtJHRyZWF0bWVudCA9PSAnaGVhdGluZyddID0gJ2hlYXR3YXZlczogMy1kYXkgY3ljbGUnCiMgCiMgbGYuY2FsbS5zdW0gPSBzdW1tYXJ5U0UobGYuY2FsbSwgbWVhc3VyZXZhcj0iZGVsdGFMIiwgZ3JvdXB2YXJzPWMoInRyZWF0bWVudCIsJ3RpbWUnKSxuYS5ybT1UKQojIGxmLmNhbG0uc3VtJHRyZWF0bWVudFtsZi5jYWxtLnN1bSR0cmVhdG1lbnQgPT0gJ2NvbnRyb2wnXSA9ICdjb250cm9sOiA2LWRheSBjeWNsZScKIyBsZi5jYWxtLnN1bSR0cmVhdG1lbnRbbGYuY2FsbS5zdW0kdHJlYXRtZW50ID09ICdoZWF0aW5nJ10gPSAnaGVhdHdhdmVzOiA2LWRheSBjeWNsZScKIyAKIyBsZi5od3Muc3VtID0gc3VtbWFyeVNFKGxmLmh3cywgbWVhc3VyZXZhcj0iZGVsdGFMIiwgZ3JvdXB2YXJzPWMoInRyZWF0bWVudCIsJ3RpbWUnKSxuYS5ybT1UKQojIGxmLmh3cy5zdW0kdHJlYXRtZW50W2xmLmh3cy5zdW0kdHJlYXRtZW50ID09ICdjb250cm9sJ10gPSAnY29udHJvbDogNi1kYXkgY3ljbGUnCiMgbGYuaHdzLnN1bSR0cmVhdG1lbnRbbGYuaHdzLnN1bSR0cmVhdG1lbnQgPT0gJ2hlYXRpbmcnXSA9ICdoZWF0d2F2ZXM6IDYtZGF5IGN5Y2xlJwojIAojIGNhbG0uc3VtID0gcmJpbmQobGYuY2FsbS5zdW0sIGhmLmNhbG0uc3VtKQojIGh3cy5zdW0gPSByYmluZChsZi5od3Muc3VtLCBoZi5od3Muc3VtKQoKYGBgCgojIyA1LiBjaGFuZ2UgdGltZSBmb3JtYXQKYGBge3J9CmRmLmNhbG0uc3VtbSR0aW1lW2RmLmNhbG0uc3VtbSR0aW1lID09ICdUMSddID0gJzk6MDAnCmRmLmNhbG0uc3VtbSR0aW1lW2RmLmNhbG0uc3VtbSR0aW1lID09ICdUMiddID0gJzExOjAwJwpkZi5jYWxtLnN1bW0kdGltZVtkZi5jYWxtLnN1bW0kdGltZSA9PSAnVDMnXSA9ICcxMjozMCcKZGYuY2FsbS5zdW1tJHRpbWVbZGYuY2FsbS5zdW1tJHRpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRmLmNhbG0uc3VtbSR0aW1lW2RmLmNhbG0uc3VtbSR0aW1lID09ICdUNSddID0gJzE2OjAwJwoKZGYuaHdzLnN1bW0kdGltZVtkZi5od3Muc3VtbSR0aW1lID09ICdUMSddID0gJzk6MDAnCmRmLmh3cy5zdW1tJHRpbWVbZGYuaHdzLnN1bW0kdGltZSA9PSAnVDInXSA9ICcxMTowMCcKZGYuaHdzLnN1bW0kdGltZVtkZi5od3Muc3VtbSR0aW1lID09ICdUMyddID0gJzEyOjMwJwpkZi5od3Muc3VtbSR0aW1lW2RmLmh3cy5zdW1tJHRpbWUgPT0gJ1Q0J10gPSAnMTQ6MDAnCmRmLmh3cy5zdW1tJHRpbWVbZGYuaHdzLnN1bW0kdGltZSA9PSAnVDUnXSA9ICcxNjowMCcKCmBgYAoKIyMgNi4gc2F2ZSBkYXRhCmBgYHtyfQp3cml0ZS5jc3YoZGYuY2FsbS5zdW1tLCAnZGZfY2FsbV9zdW1tLmNzdicsIHJvdy5uYW1lcyA9IEYpCndyaXRlLmNzdihkZi5od3Muc3VtbSwgJ2RmX2h3c19zdW1tLmNzdicsIHJvdy5uYW1lcyA9IEYpCgpgYGAKCiMjIDcuIGxvYWRpbmcgZGF0YQpgYGB7cn0KY2FsbS5wcm9maWxlID0gcmVhZC5jc3YoJ2RmX2NhbG1fc3VtbS5jc3YnLCBoZWFkZXIgPSBUKQpjYWxtLnByb2ZpbGUkdGltZSA9IGZhY3RvcihjYWxtLnByb2ZpbGUkdGltZSwgbGV2ZWxzID0gYygnOTowMCcsICcxMTowMCcsICcxMjozMCcsICcxNDowMCcsICcxNjowMCcpKQoKaHdzLnByb2ZpbGUgPSByZWFkLmNzdignZGZfaHdzX3N1bW0uY3N2JywgaGVhZGVyID0gVCkKaHdzLnByb2ZpbGUkdGltZSA9IGZhY3Rvcihod3MucHJvZmlsZSR0aW1lLCBsZXZlbHMgPSBjKCc5OjAwJywgJzExOjAwJywgJzEyOjMwJywgJzE0OjAwJywgJzE2OjAwJykpCgpgYGAKCiMjIDguIHN0YXRpc3RpY3MKYGBge3J9Cm0yIDwtIGxtZXIoZGVsdGFMIH4gZ3JvdXAgKyBkYXkgKyAoMXxpbmRpdmlkdWFsKSwgZGYuY2FsbSkKc3VtbWFyeShtMikKYW5vdmEobTIpCgptMyA8LSBsbWVyKGRlbHRhTCB+IGdyb3VwICsgZGF5ICsgKDF8aW5kaXZpZHVhbCksIGRmLmh3cykKc3VtbWFyeShtMykKYW5vdmEobTMpCgpsaWJyYXJ5KG11bHRjb21wKQpzdW1tYXJ5KGdsaHQobTMsIGxpbmZjdCA9IG1jcChncm91cCA9ICJUdWtleSIpKSwgdGVzdCA9IGFkanVzdGVkKCJob2xtIikpCnN1bW1hcnkoZ2xodChtMiwgbGluZmN0ID0gbWNwKGdyb3VwID0gIlR1a2V5IikpLCB0ZXN0ID0gYWRqdXN0ZWQoImhvbG0iKSkKCiNjaGVjayBkYXRhCmxldmVuZVRlc3QoZGVsdGFMIH4gZ3JvdXAsIGRhdGEgPSBkZi5jYWxtKSAKcGxvdChtMikKYW92X3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gbTIpCnNoYXBpcm8udGVzdCh4ID0gYW92X3Jlc2lkdWFscykKa3MudGVzdChkZi5jYWxtJGRlbHRhTCwgInBub3JtIikKCgpgYGAK