extract correlation and covariance matrices from mplus output

covrmatfunc = function(mplodel){
  
  moreout = MplusAutomation::readModels(target = mplodel)
  moreout = moreout$output[grep("ESTIMATES DERIVED FROM THE MODEL FOR BETWEEN", moreout$output) : length(moreout$output)]
  cormat = moreout[grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES", moreout) : length(moreout)]
  
  covmat = moreout[grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES", moreout) : grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES", moreout) -1]
  
  
  extract_covrmat <- function(txt) {
    # txt: character vector, one element per line of the printed output
    
    # helper to trim whitespace
    trim <- function(x) gsub("^\\s+|\\s+$", "", x)
    
    block_cols <- list()
    rows_list  <- list()
    
    i <- 1
    while(i <= length(txt)) {
      # look for a header line: non‐underscore names separated by 2+ spaces,
      # followed immediately by an "____" line
      if (grepl("^\\s*\\S+", txt[i]) && grepl("\\s{2,}", txt[i]) &&
          i + 1 <= length(txt) && grepl("^\\s*_{2,}", txt[i+1])) {
        
        # parse column names from the header
        this_cols <- strsplit(trim(txt[i]), "\\s{2,}")[[1]]
        block_cols[[length(block_cols) + 1]] <- this_cols
        
        # now read the numeric rows until a blank line or end
        j <- i + 2
        while(j <= length(txt) && nzchar(txt[j])) {
          line <- txt[j]
          parts <- strsplit(trim(line), "\\s+")[[1]]
          var   <- parts[1]
          vals  <- as.numeric(parts[-1])
          rows_list[[length(rows_list) + 1]] <-
            list(var = var, vals = vals, cols = this_cols)
          j <- j + 1
        }
        i <- j
      } else {
        i <- i + 1
      }
    }
    
    # flatten column order (preserve block order), drop cols and rows with "&"
    all_cols <- unique(unlist(block_cols))
    all_cols <- all_cols[-grep("&", all_cols)]
    
    # initialize empty matrix
    M <- matrix(NA_real_,
                nrow = length(all_cols),
                ncol = length(all_cols),
                dimnames = list(all_cols, all_cols))
    diag(M) <- 1
    
    # fill in off‐diagonals
    for (rec in rows_list) {
      var  <- rec$var
      if (grepl("&", var)) next
      vals <- rec$vals
      cols <- rec$cols
      # skip all‐zero rows
      if (all(vals == 0)) next
      
      for (k in seq_along(cols)) {
        colk <- cols[k]
        if (grepl("&", colk)) next
        M[var, colk] <- vals[k]
        M[colk, var] <- vals[k]
      }
    }
    
    # return as data.frame
    as.data.frame(M, row.names = all_cols)[-1,-1]
  }

  
 list(cormat = extract_covrmat(cormat), covmat = extract_covrmat(covmat))
  
}

calculate (squared semipartial) correlations and put in table

sitnames = c("conflict","boredeom","overwhelm","relax","achievem","positive_social")

pfmods = c("Model1YncnfS1PCO.out","Model1YnempS1PCO.out","Model1YnovlS1PCO.out","Model1YprelS1PCO.out","Model1YpsucS1PCO.out","Model1YpwoS1PCO.out")

#create list with correlation and covariance matrices from PF S1 models
pfcovrs = list()
for (i in 1 : length(pfmods)){
  pfcovrs[[i]] = covrmatfunc(pfmods[i])
}
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in apply(out, 2, as.numeric) : NAs introduced by coerciong
G3;Error extracting SAMPSTAT in output file: Model1YncnfS1PCO.out
g
<simpleError in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent>
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in apply(out, 2, as.numeric) : NAs introduced by coerciong
G3;Error extracting SAMPSTAT in output file: Model1YpsucS1PCO.out
g
<simpleError in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent>
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in apply(out, 2, as.numeric) : NAs introduced by coerciong
G3;Error extracting SAMPSTAT in output file: Model1YpwoS1PCO.out
g
<simpleError in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent>
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
names(pfcovrs) = sitnames

depmods = c("Model1YncnfS1PCODep.out","Model1YnempS1PCODep.out","Model1YnovlS1PCODep.out","Model1YprelS1PCODep.out","Model1YpsucS1PCODep.out","Model1YpwoS1PCODep.out")

# depmods = c("Model1YncnfS1PCODep.out","Model1YnempS1PCODep.out","Model1YnovlS1PCODep.out","Model1YprelS1PCODep.out","Model1YpwoS1PCODep.out","Model1YpwoS1PCODep.out")


#create list with correlation and covariance matrices from DEP S1 models
depcovrs = list()
for (i in 1 : length(depmods)){
  depcovrs[[i]] = covrmatfunc(depmods[i])
}
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in apply(out, 2, as.numeric) : NAs introduced by coerciong
G3;Error extracting SAMPSTAT in output file: Model1YncnfS1PCODep.out
g
<simpleError in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent>
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in apply(out, 2, as.numeric) : NAs introduced by coerciong
G3;Error extracting SAMPSTAT in output file: Model1YprelS1PCODep.out
g
<simpleError in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent>
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in apply(out, 2, as.numeric) : NAs introduced by coerciong
G3;Error extracting SAMPSTAT in output file: Model1YpsucS1PCODep.out
g
<simpleError in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent>
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in (function (..., deparse.level = 1)  :
  number of columns of result is not a multiple of vector length (arg 1)g
G2;H2;Warningh in apply(out, 2, as.numeric) : NAs introduced by coerciong
G3;Error extracting SAMPSTAT in output file: Model1YpwoS1PCODep.out
g
<simpleError in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent>
G2;H2;Warningh in grep("ESTIMATED CORRELATION MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
G2;H2;Warningh in grep("ESTIMATED COVARIANCE MATRIX FOR THE LATENT VARIABLES",  :
  numerical expression has 4 elements: only the first usedg
names(depcovrs) = sitnames



# create list with squared semipartial correlations


## FUNC as ref
pfsqspcors = list()
for (i in 1 : length(pfcovrs)){
  # vars for prediction
predvarnames = names(pfcovrs[[i]][[1]])[c(-3,-4)]
  
##correlations OFUNC
cor_mat.OFUNC = pfcovrs[[i]]$cormat[c("OFUNC",predvarnames),
                         c("OFUNC",predvarnames)]
##correlations ODEP
cor_mat.ODEP = pfcovrs[[i]]$cormat[c("ODEP",predvarnames),
                             c("ODEP",predvarnames)]


### calculate squared semipartial correlations in predicting ODEP and OFUNC
# using covariances
## OFUNC
cov_mat.OFUNC = pfcovrs[[i]]$covmat[c("OFUNC",predvarnames),
                              c("OFUNC",predvarnames)]



sqsemipcor.OFUNC <- round(data.frame(correlation::cor_to_spcor(cor = as.matrix(cor_mat.OFUNC),cov = as.matrix(cov_mat.OFUNC)))^2,digits = 4)


## ODEP
cov_mat.ODEP = pfcovrs[[i]]$covmat[c("ODEP",predvarnames),
                             c("ODEP",predvarnames)]

sqsemipcor.ODEP <- round(data.frame(correlation::cor_to_spcor(cor = as.matrix(cor_mat.ODEP),cov = as.matrix(cov_mat.ODEP)))^2,digits = 4)

pfsqspcors[[i]]  = list(OFUNC = sqsemipcor.OFUNC, ODEP = sqsemipcor.ODEP)
}

names(pfsqspcors) = sitnames




## DEP as ref
depsqspcors = list()
for (i in 1 : length(depcovrs)){
  # vars for prediction
predvarnames = names(depcovrs[[i]][[1]])[c(-3,-4)]
  
##correlations OFUNC
cor_mat.OFUNC = depcovrs[[i]]$cormat[c("OFUNC",predvarnames),
                         c("OFUNC",predvarnames)]
##correlations ODEP
cor_mat.ODEP = depcovrs[[i]]$cormat[c("ODEP",predvarnames),
                             c("ODEP",predvarnames)]


### calculate squared semipartial correlations in predicting ODEP and OFUNC
# using covariances
## OFUNC
cov_mat.OFUNC = depcovrs[[i]]$covmat[c("OFUNC",predvarnames),
                              c("OFUNC",predvarnames)]



sqsemipcor.OFUNC <- round(data.frame(correlation::cor_to_spcor(cor = as.matrix(cor_mat.OFUNC),cov = as.matrix(cov_mat.OFUNC)))^2,digits = 4)


## ODEP
cov_mat.ODEP = depcovrs[[i]]$covmat[c("ODEP",predvarnames),
                             c("ODEP",predvarnames)]

sqsemipcor.ODEP <- round(data.frame(correlation::cor_to_spcor(cor = as.matrix(cor_mat.ODEP),cov = as.matrix(cov_mat.ODEP)))^2,digits = 4)

depsqspcors[[i]]  = list(OFUNC = sqsemipcor.OFUNC, ODEP = sqsemipcor.ODEP)
}

names(depsqspcors) = sitnames

create table with cors and squared semipartial cors, for PF and Dep with both s1 mods

# table data frame
rownamess = c(
  "mm~>PF", "mm~>DEP",
  "ss~>PF", "ss~>DEP",
  "me1~>PF", "me1~>DEP",
  "em1~>PF", "em1~>DEP",
  "miv~>PF", "miv~>DEP",
  "eiv~>PF", "eiv~>DEP",
  "mxe~>PF", "mxe~>DEP",
  "&empty;mood~>PF", "&empty;mood~>DEP",
  "&empty;event~>PF", "&empty;event~>DEP",
  "PF~>OPF", "DEP~>OPF",
  "PF~>ODEP", "DEP~>ODEP"
)

colnames = c("conflict <br> N=930","emptiness or boredom <br> N = 1103","overwhelming <br> task N = 1155","relaxation <br> N = 992","achievement <br> N = 963 ","good time with someone <br> N = 1197")

Ns = c(930,1103,1155,992,963,1197)

table4 = data.frame(matrix(,nrow = length(rownamess), ncol = length(colnames)),row.names = rownamess)
names(table4) = colnames

rmzero <- function(x, digits = NULL) {
  s <- if (is.null(digits)) {
    as.character(x)
  } else {
    format(x, nsmall = digits)
  }
  sub("^(-?)0\\.", "\\1.", s)
}
table4r = table4
table4sqsp = table4

# for(x in 1: nrow(table4)){
  for(y in 1: ncol(table4)){
    # dynamics and OFUNC 
    table4[grep("~>PF", rownamess),y] = 
      paste0(
          "<span style=\"",
          #bold if significant correlation
          ifelse(psych::r.test(Ns[y],pfcovrs[[y]]$cormat[5:13,3])$p < .005, yes = "font-weight: bold;", no = ";"),
          "\" >",
          rmzero(round(pfcovrs[[y]]$cormat[5:13,3], digits = 2)),
          "[",
          # also put squared semipartial correlations
          rmzero(round(pfsqspcors[[y]]$OFUNC[1,4:12], digits = 3)),
          "]</span>"
        )
    table4r[grep("~>PF", rownamess),y] = pfcovrs[[y]]$cormat[5:13,3]
    table4sqsp[grep("~>PF", rownamess),y] = t(pfsqspcors[[y]]$OFUNC[1,4:12])
    
    #dynamics and ODEP
    table4[grep("~>DEP", rownamess),y] = 
      paste0(
          "<span style=\"",
          #bold if significant correlation
          ifelse(psych::r.test(Ns[y],pfcovrs[[y]]$cormat[5:13,4])$p < .005, yes = "font-weight: bold;", no = ";"),
          "\" >",
          rmzero(round(pfcovrs[[y]]$cormat[5:13,4], digits = 2)),
          "[",
          # also put squared semipartial correlations
          rmzero(round(pfsqspcors[[y]]$ODEP[1,4:12], digits = 3)),
          "]</span>"
        )
    table4r[grep("~>DEP", rownamess),y] = pfcovrs[[y]]$cormat[5:13,4]
    table4sqsp[grep("~>DEP", rownamess),y] = t(pfsqspcors[[y]]$ODEP[1,4:12])

    
    # PF OPF DEP ODEP
    table4[grep("~>OPF", rownamess),y] = 
      paste0(
          '<span style=";" >',
          #average from two S1 mods
          # ifelse(psych::r.test(Ns[y],rowMeans(cbind(pfcovrs[[y]]$cormat[1:2,3],depcovrs[[y]]$cormat[1:2,3])))$p < .005, yes = "<b>", no = ""),
          # rmzero(round(rowMeans(cbind(pfcovrs[[y]]$cormat[1:2,3],depcovrs[[y]]$cormat[1:2,3])), digits = 2)),
          # "[",
          # # also put squared semipartial correlations
          # rmzero(round(colMeans(rbind(pfsqspcors[[y]]$OFUNC[1,2:3],depsqspcors[[y]]$OFUNC[1,2:3])), digits = 3)),
          # "]</b> <br>",
          #bold if significant correlation
          ifelse(psych::r.test(Ns[y],pfcovrs[[y]]$cormat[1:2,3])$p < .005, yes = "<b>", no = ""),
          rmzero(round(pfcovrs[[y]]$cormat[1:2,3], digits = 2)),
          "[",
          # also put squared semipartial correlations
          rmzero(round(pfsqspcors[[y]]$OFUNC[1,2:3], digits = 3)),
          "] </b>",
          #bold if significant correlation
          ifelse(psych::r.test(Ns[y],depcovrs[[y]]$cormat[1:2,3])$p < .005, yes = "<b>", no = ""),
          rmzero(round(depcovrs[[y]]$cormat[1:2,3], digits = 2)),
          "[",
          # also put squared semipartial correlations
          rmzero(round(depsqspcors[[y]]$OFUNC[1,2:3], digits = 3)),
          "]</b>",
          "</span>"
        )
    table4r[grep("~>OPF", rownamess),y] = rowMeans(cbind(pfcovrs[[y]]$cormat[1:2,3],depcovrs[[y]]$cormat[1:2,3]))
    table4sqsp[grep("~>OPF", rownamess),y] = colMeans(rbind(pfsqspcors[[y]]$OFUNC[1,2:3],depsqspcors[[y]]$OFUNC[1,2:3]))

    
     # PF OPF DEP ODEP
    table4[grep("~>ODEP", rownamess),y] = 
      paste0(
          '<span style=";" >',
          # #average from two S1 mods
          # ifelse(psych::r.test(Ns[y],rowMeans(cbind(pfcovrs[[y]]$cormat[1:2,4],depcovrs[[y]]$cormat[1:2,4])))$p < .005, yes = "<b>", no = ""),
          # rmzero(round(rowMeans(cbind(pfcovrs[[y]]$cormat[1:2,4],depcovrs[[y]]$cormat[1:2,4])), digits = 2)),
          # "[",
          # # also put squared semipartial correlations
          # rmzero(round(colMeans(rbind(pfsqspcors[[y]]$ODEP[1,2:3],depsqspcors[[y]]$ODEP[1,2:3])), digits = 3)),
          # "]</b> <br>",
          #bold if significant correlation
          ifelse(psych::r.test(Ns[y],pfcovrs[[y]]$cormat[1:2,4])$p < .005, yes = "<b>", no = ""),
          rmzero(round(pfcovrs[[y]]$cormat[1:2,4], digits = 2)),
          "[",
          # also put squared semipartial correlations
          rmzero(round(pfsqspcors[[y]]$ODEP[1,2:3], digits = 3)),
          "] </b>",
          #bold if significant correlation
          ifelse(psych::r.test(Ns[y],depcovrs[[y]]$cormat[1:2,4])$p < .005, yes = "<b>", no = ""),
          rmzero(round(depcovrs[[y]]$cormat[1:2,4], digits = 2)),
          "[",
          # also put squared semipartial correlations
          rmzero(round(depsqspcors[[y]]$ODEP[1,2:3], digits = 3)),
          "]</b>",
          "</span>"
        )
    table4r[grep("~>ODEP", rownamess),y] = rowMeans(cbind(pfcovrs[[y]]$cormat[1:2,4],depcovrs[[y]]$cormat[1:2,4]))
    table4sqsp[grep("~>ODEP", rownamess),y] = colMeans(rbind(pfsqspcors[[y]]$ODEP[1,2:3],depsqspcors[[y]]$ODEP[1,2:3]))

    
  }

Create table with cors and squared semipartial cors, for PF and Dep with both s1 mods

library(tidyverse)
library(kableExtra)

table4%>% kable(escape = FALSE, align = "c",format = "html") %>%
kable_paper() %>%
column_spec(2,#bold = table2[[4]][,2],
background = spec_color(table4r[,1], scale_from = c(-.95,.95), palette =colorRampPalette(c("#fde725","white","#21918c"))(256)))%>%
column_spec(3,#bold = table2[[4]][,3],
background = spec_color(table4r[,2], scale_from = c(-.95,.95), palette =colorRampPalette(c("#fde725","white","#21918c"))(256)))%>%
column_spec(4,#bold = table2[[4]][,4],
background = spec_color(table4r[,3], scale_from = c(-.95,.95), palette =colorRampPalette(c("#fde725","white","#21918c"))(256)))%>%
column_spec(5,#bold = table2[[4]][,5],
background = spec_color(table4r[,4], scale_from = c(-.95,.95), palette =colorRampPalette(c("#fde725","white","#21918c"))(256)))%>%
column_spec(6,#bold = table2[[4]][,6],
background = spec_color(table4r[,5], scale_from = c(-.95,.95), palette =colorRampPalette(c("#fde725","white","#21918c"))(256)))%>%
column_spec(7,#bold = table2[[4]][,7],
background = spec_color(table4r[,6], scale_from = c(-.95,.95), palette =colorRampPalette(c("#fde725","white","#21918c"))(256)))%>%
add_header_above(c(" ", "Correlations and squared semipartial correlations [in brackets] of between-person differences in PF and depression (averaged over one year) using within-person affect-sitation dynamics" = 6))
Correlations and squared semipartial correlations [in brackets] of between-person differences in PF and depression (averaged over one year) using within-person affect-sitation dynamics
conflict
N=930
emptiness or boredom
N = 1103
overwhelming
task N = 1155
relaxation
N = 992
achievement
N = 963
good time with someone
N = 1197
mm~>PF .03[.002] .05[.002] .03[.003] .03[.003] .03[.005] .01[.011]
mm~>DEP .04[.004] .07[.003] .04[.006] .04[.005] .03[.005] .02[.008]
ss~>PF .16[0] .07[0] .05[.001] .05[.001] -.13[.002] .03[.007]
ss~>DEP .1[.001] .05[0] .06[0] -.05[0] -.14[0] -.02[.002]
me1~>PF .05[.059] .09[.001] -.03[0] .13[.002] .12[.002] .1[.006]
me1~>DEP .07[.002] .2[.001] .05[.002] .06[.001] -.03[.005] .03[.017]
em1~>PF -.1[.002] .02[.011] -.06[.004] -.16[.008] -.03[.006] 0[0]
em1~>DEP -.06[.001] .09[.001] .06[0] -.32[0] -.15[.001] -.19[.016]
miv~>PF .06[0] .08[0] .06[0] .07[.001] .06[0] .07[.003]
miv~>DEP -.05[.001] -.04[.001] -.04[.001] -.03[.001] -.01[0] -.05[0]
eiv~>PF .28[0] .15[0] .16[.001] -.28[.012] -.29[.031] -.26[.013]
eiv~>DEP .26[.002] .08[0] .13[0] -.46[.004] -.41[.011] -.41[0]
mxe~>PF .09[.007] -.02[.005] -.02[.003] -.13[.035] -.18[.036] -.09[.027]
mxe~>DEP .01[0] -.13[0] -.1[0] -.32[.007] -.31[.007] -.24[.013]
∅mood~>PF -.52[.006] -.51[.007] -.51[.008] -.52[.005] -.53[0] -.53[.006]
∅mood~>DEP -.69[.012] -.69[.006] -.69[.007] -.69[.003] -.69[.014] -.69[.007]
∅event~>PF .25[.003] .42[.004] .26[0] -.26[.009] -.23[.014] -.22[.016]
∅event~>DEP .25[.001] .54[.002] .38[.001] -.42[.007] -.39[.004] -.35[.011]
PF~>OPF .83[.34] .53[.321] .83[.247] .53[.261] .84[.305] .54[.268] .81[.172] .38[.151] .78[.14] .24[.096] .81[.185] .36[.096]
DEP~>OPF .04[.007] .63[.114] .03[.008] .64[.07] .04[.003] .63[.095] 0[.056] .72[.022] .02[.074] .75[.03] -.03[.046] .72[.038]
PF~>ODEP .6[.123] .02[.001] .61[.12] .01[0] .6[.141] .02[0] .68[.184] -.08[.025] .74[.198] -.06[.025] .71[.187] -.06[.058]
DEP~>ODEP .53[.087] .8[.167] .53[.068] .81[.128] .54[.088] .81[.162] .44[.067] .81[.184] .32[.037] .8[.18] .38[.078] .81[.23]
NA
NA

Rest







covr1y = covrmatfunc("Model1YncnfS1PCO.out")

vars = names(covr1y[[1]])

# without outcome
predvarnames = vars[c(-3,-4)]

##correlations OFUNC
cor_mat.OFUNC = covr1y$cormat[c("OFUNC",predvarnames),
                         c("OFUNC",predvarnames)]

##correlations ODEP
cor_mat.ODEP = covr1y$cormat[c("ODEP",predvarnames),
                             c("ODEP",predvarnames)]



#### Regression model based on correlatoin matrix
library(metafor)
# # with cov
# regpsfs1 = matreg("psf_av_fu", x=predvarnames, cov_mat.psf.s1, cov = T, n=27173)

#with cor
regOPF = matreg("OFUNC", x=predvarnames, cor_mat.OFUNC, n=930, digits = 2)
regODEP = matreg("ODEP", x=predvarnames, cor_mat.ODEP, n=930, digits = 2)



### calculate squared semipartial correlations in predicting ODEP and OFUNC
# using covariances
## OFUNC
cov_mat.OFUNC = covr1y$covmat[c("OFUNC",predvarnames),
                              c("OFUNC",predvarnames)]



sqsemipcor.OFUNC <- round(data.frame(correlation::cor_to_spcor(cor = as.matrix(cor_mat.OFUNC),cov = as.matrix(cov_mat.OFUNC)))^2,digits = 4)


## ODEP
cov_mat.ODEP = covr1y$covmat[c("ODEP",predvarnames),
                             c("ODEP",predvarnames)]

sqsemipcor.ODEP <- round(data.frame(correlation::cor_to_spcor(cor = as.matrix(cor_mat.ODEP),cov = as.matrix(cov_mat.ODEP)))^2,digits = 4)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBleHRyYWN0IGNvcnJlbGF0aW9uIGFuZCBjb3ZhcmlhbmNlIG1hdHJpY2VzIGZyb20gbXBsdXMgb3V0cHV0CmBgYHtyfQpjb3ZybWF0ZnVuYyA9IGZ1bmN0aW9uKG1wbG9kZWwpewogIAogIG1vcmVvdXQgPSBNcGx1c0F1dG9tYXRpb246OnJlYWRNb2RlbHModGFyZ2V0ID0gbXBsb2RlbCkKICBtb3Jlb3V0ID0gbW9yZW91dCRvdXRwdXRbZ3JlcCgiRVNUSU1BVEVTIERFUklWRUQgRlJPTSBUSEUgTU9ERUwgRk9SIEJFVFdFRU4iLCBtb3Jlb3V0JG91dHB1dCkgOiBsZW5ndGgobW9yZW91dCRvdXRwdXQpXQogIGNvcm1hdCA9IG1vcmVvdXRbZ3JlcCgiRVNUSU1BVEVEIENPUlJFTEFUSU9OIE1BVFJJWCBGT1IgVEhFIExBVEVOVCBWQVJJQUJMRVMiLCBtb3Jlb3V0KSA6IGxlbmd0aChtb3Jlb3V0KV0KICAKICBjb3ZtYXQgPSBtb3Jlb3V0W2dyZXAoIkVTVElNQVRFRCBDT1ZBUklBTkNFIE1BVFJJWCBGT1IgVEhFIExBVEVOVCBWQVJJQUJMRVMiLCBtb3Jlb3V0KSA6IGdyZXAoIkVTVElNQVRFRCBDT1JSRUxBVElPTiBNQVRSSVggRk9SIFRIRSBMQVRFTlQgVkFSSUFCTEVTIiwgbW9yZW91dCkgLTFdCiAgCiAgCiAgZXh0cmFjdF9jb3ZybWF0IDwtIGZ1bmN0aW9uKHR4dCkgewogICAgIyB0eHQ6IGNoYXJhY3RlciB2ZWN0b3IsIG9uZSBlbGVtZW50IHBlciBsaW5lIG9mIHRoZSBwcmludGVkIG91dHB1dAogICAgCiAgICAjIGhlbHBlciB0byB0cmltIHdoaXRlc3BhY2UKICAgIHRyaW0gPC0gZnVuY3Rpb24oeCkgZ3N1YigiXlxccyt8XFxzKyQiLCAiIiwgeCkKICAgIAogICAgYmxvY2tfY29scyA8LSBsaXN0KCkKICAgIHJvd3NfbGlzdCAgPC0gbGlzdCgpCiAgICAKICAgIGkgPC0gMQogICAgd2hpbGUoaSA8PSBsZW5ndGgodHh0KSkgewogICAgICAjIGxvb2sgZm9yIGEgaGVhZGVyIGxpbmU6IG5vbuKAkHVuZGVyc2NvcmUgbmFtZXMgc2VwYXJhdGVkIGJ5IDIrIHNwYWNlcywKICAgICAgIyBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSBhbiAiX19fXyIgbGluZQogICAgICBpZiAoZ3JlcGwoIl5cXHMqXFxTKyIsIHR4dFtpXSkgJiYgZ3JlcGwoIlxcc3syLH0iLCB0eHRbaV0pICYmCiAgICAgICAgICBpICsgMSA8PSBsZW5ndGgodHh0KSAmJiBncmVwbCgiXlxccypfezIsfSIsIHR4dFtpKzFdKSkgewogICAgICAgIAogICAgICAgICMgcGFyc2UgY29sdW1uIG5hbWVzIGZyb20gdGhlIGhlYWRlcgogICAgICAgIHRoaXNfY29scyA8LSBzdHJzcGxpdCh0cmltKHR4dFtpXSksICJcXHN7Mix9IilbWzFdXQogICAgICAgIGJsb2NrX2NvbHNbW2xlbmd0aChibG9ja19jb2xzKSArIDFdXSA8LSB0aGlzX2NvbHMKICAgICAgICAKICAgICAgICAjIG5vdyByZWFkIHRoZSBudW1lcmljIHJvd3MgdW50aWwgYSBibGFuayBsaW5lIG9yIGVuZAogICAgICAgIGogPC0gaSArIDIKICAgICAgICB3aGlsZShqIDw9IGxlbmd0aCh0eHQpICYmIG56Y2hhcih0eHRbal0pKSB7CiAgICAgICAgICBsaW5lIDwtIHR4dFtqXQogICAgICAgICAgcGFydHMgPC0gc3Ryc3BsaXQodHJpbShsaW5lKSwgIlxccysiKVtbMV1dCiAgICAgICAgICB2YXIgICA8LSBwYXJ0c1sxXQogICAgICAgICAgdmFscyAgPC0gYXMubnVtZXJpYyhwYXJ0c1stMV0pCiAgICAgICAgICByb3dzX2xpc3RbW2xlbmd0aChyb3dzX2xpc3QpICsgMV1dIDwtCiAgICAgICAgICAgIGxpc3QodmFyID0gdmFyLCB2YWxzID0gdmFscywgY29scyA9IHRoaXNfY29scykKICAgICAgICAgIGogPC0gaiArIDEKICAgICAgICB9CiAgICAgICAgaSA8LSBqCiAgICAgIH0gZWxzZSB7CiAgICAgICAgaSA8LSBpICsgMQogICAgICB9CiAgICB9CiAgICAKICAgICMgZmxhdHRlbiBjb2x1bW4gb3JkZXIgKHByZXNlcnZlIGJsb2NrIG9yZGVyKSwgZHJvcCBjb2xzIGFuZCByb3dzIHdpdGggIiYiCiAgICBhbGxfY29scyA8LSB1bmlxdWUodW5saXN0KGJsb2NrX2NvbHMpKQogICAgYWxsX2NvbHMgPC0gYWxsX2NvbHNbLWdyZXAoIiYiLCBhbGxfY29scyldCiAgICAKICAgICMgaW5pdGlhbGl6ZSBlbXB0eSBtYXRyaXgKICAgIE0gPC0gbWF0cml4KE5BX3JlYWxfLAogICAgICAgICAgICAgICAgbnJvdyA9IGxlbmd0aChhbGxfY29scyksCiAgICAgICAgICAgICAgICBuY29sID0gbGVuZ3RoKGFsbF9jb2xzKSwKICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChhbGxfY29scywgYWxsX2NvbHMpKQogICAgZGlhZyhNKSA8LSAxCiAgICAKICAgICMgZmlsbCBpbiBvZmbigJBkaWFnb25hbHMKICAgIGZvciAocmVjIGluIHJvd3NfbGlzdCkgewogICAgICB2YXIgIDwtIHJlYyR2YXIKICAgICAgaWYgKGdyZXBsKCImIiwgdmFyKSkgbmV4dAogICAgICB2YWxzIDwtIHJlYyR2YWxzCiAgICAgIGNvbHMgPC0gcmVjJGNvbHMKICAgICAgIyBza2lwIGFsbOKAkHplcm8gcm93cwogICAgICBpZiAoYWxsKHZhbHMgPT0gMCkpIG5leHQKICAgICAgCiAgICAgIGZvciAoayBpbiBzZXFfYWxvbmcoY29scykpIHsKICAgICAgICBjb2xrIDwtIGNvbHNba10KICAgICAgICBpZiAoZ3JlcGwoIiYiLCBjb2xrKSkgbmV4dAogICAgICAgIE1bdmFyLCBjb2xrXSA8LSB2YWxzW2tdCiAgICAgICAgTVtjb2xrLCB2YXJdIDwtIHZhbHNba10KICAgICAgfQogICAgfQogICAgCiAgICAjIHJldHVybiBhcyBkYXRhLmZyYW1lCiAgICBhcy5kYXRhLmZyYW1lKE0sIHJvdy5uYW1lcyA9IGFsbF9jb2xzKVstMSwtMV0KICB9CgogIAogbGlzdChjb3JtYXQgPSBleHRyYWN0X2NvdnJtYXQoY29ybWF0KSwgY292bWF0ID0gZXh0cmFjdF9jb3ZybWF0KGNvdm1hdCkpCiAgCn0KYGBgCgoKIyBjYWxjdWxhdGUgKHNxdWFyZWQgc2VtaXBhcnRpYWwpIGNvcnJlbGF0aW9ucyBhbmQgcHV0IGluIHRhYmxlCmBgYHtyfQpzaXRuYW1lcyA9IGMoImNvbmZsaWN0IiwiYm9yZWRlb20iLCJvdmVyd2hlbG0iLCJyZWxheCIsImFjaGlldmVtIiwicG9zaXRpdmVfc29jaWFsIikKCnBmbW9kcyA9IGMoIk1vZGVsMVluY25mUzFQQ08ub3V0IiwiTW9kZWwxWW5lbXBTMVBDTy5vdXQiLCJNb2RlbDFZbm92bFMxUENPLm91dCIsIk1vZGVsMVlwcmVsUzFQQ08ub3V0IiwiTW9kZWwxWXBzdWNTMVBDTy5vdXQiLCJNb2RlbDFZcHdvUzFQQ08ub3V0IikKCiNjcmVhdGUgbGlzdCB3aXRoIGNvcnJlbGF0aW9uIGFuZCBjb3ZhcmlhbmNlIG1hdHJpY2VzIGZyb20gUEYgUzEgbW9kZWxzCnBmY292cnMgPSBsaXN0KCkKZm9yIChpIGluIDEgOiBsZW5ndGgocGZtb2RzKSl7CiAgcGZjb3Zyc1tbaV1dID0gY292cm1hdGZ1bmMocGZtb2RzW2ldKQp9CgpuYW1lcyhwZmNvdnJzKSA9IHNpdG5hbWVzCgpkZXBtb2RzID0gYygiTW9kZWwxWW5jbmZTMVBDT0RlcC5vdXQiLCJNb2RlbDFZbmVtcFMxUENPRGVwLm91dCIsIk1vZGVsMVlub3ZsUzFQQ09EZXAub3V0IiwiTW9kZWwxWXByZWxTMVBDT0RlcC5vdXQiLCJNb2RlbDFZcHN1Y1MxUENPRGVwLm91dCIsIk1vZGVsMVlwd29TMVBDT0RlcC5vdXQiKQoKIyBkZXBtb2RzID0gYygiTW9kZWwxWW5jbmZTMVBDT0RlcC5vdXQiLCJNb2RlbDFZbmVtcFMxUENPRGVwLm91dCIsIk1vZGVsMVlub3ZsUzFQQ09EZXAub3V0IiwiTW9kZWwxWXByZWxTMVBDT0RlcC5vdXQiLCJNb2RlbDFZcHdvUzFQQ09EZXAub3V0IiwiTW9kZWwxWXB3b1MxUENPRGVwLm91dCIpCgoKI2NyZWF0ZSBsaXN0IHdpdGggY29ycmVsYXRpb24gYW5kIGNvdmFyaWFuY2UgbWF0cmljZXMgZnJvbSBERVAgUzEgbW9kZWxzCmRlcGNvdnJzID0gbGlzdCgpCmZvciAoaSBpbiAxIDogbGVuZ3RoKGRlcG1vZHMpKXsKICBkZXBjb3Zyc1tbaV1dID0gY292cm1hdGZ1bmMoZGVwbW9kc1tpXSkKfQoKbmFtZXMoZGVwY292cnMpID0gc2l0bmFtZXMKCgoKIyBjcmVhdGUgbGlzdCB3aXRoIHNxdWFyZWQgc2VtaXBhcnRpYWwgY29ycmVsYXRpb25zCgoKIyMgRlVOQyBhcyByZWYKcGZzcXNwY29ycyA9IGxpc3QoKQpmb3IgKGkgaW4gMSA6IGxlbmd0aChwZmNvdnJzKSl7CiAgIyB2YXJzIGZvciBwcmVkaWN0aW9uCnByZWR2YXJuYW1lcyA9IG5hbWVzKHBmY292cnNbW2ldXVtbMV1dKVtjKC0zLC00KV0KICAKIyNjb3JyZWxhdGlvbnMgT0ZVTkMKY29yX21hdC5PRlVOQyA9IHBmY292cnNbW2ldXSRjb3JtYXRbYygiT0ZVTkMiLHByZWR2YXJuYW1lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICBjKCJPRlVOQyIscHJlZHZhcm5hbWVzKV0KIyNjb3JyZWxhdGlvbnMgT0RFUApjb3JfbWF0Lk9ERVAgPSBwZmNvdnJzW1tpXV0kY29ybWF0W2MoIk9ERVAiLHByZWR2YXJuYW1lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiT0RFUCIscHJlZHZhcm5hbWVzKV0KCgojIyMgY2FsY3VsYXRlIHNxdWFyZWQgc2VtaXBhcnRpYWwgY29ycmVsYXRpb25zIGluIHByZWRpY3RpbmcgT0RFUCBhbmQgT0ZVTkMKIyB1c2luZyBjb3ZhcmlhbmNlcwojIyBPRlVOQwpjb3ZfbWF0Lk9GVU5DID0gcGZjb3Zyc1tbaV1dJGNvdm1hdFtjKCJPRlVOQyIscHJlZHZhcm5hbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiT0ZVTkMiLHByZWR2YXJuYW1lcyldCgoKCnNxc2VtaXBjb3IuT0ZVTkMgPC0gcm91bmQoZGF0YS5mcmFtZShjb3JyZWxhdGlvbjo6Y29yX3RvX3NwY29yKGNvciA9IGFzLm1hdHJpeChjb3JfbWF0Lk9GVU5DKSxjb3YgPSBhcy5tYXRyaXgoY292X21hdC5PRlVOQykpKV4yLGRpZ2l0cyA9IDQpCgoKIyMgT0RFUApjb3ZfbWF0Lk9ERVAgPSBwZmNvdnJzW1tpXV0kY292bWF0W2MoIk9ERVAiLHByZWR2YXJuYW1lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiT0RFUCIscHJlZHZhcm5hbWVzKV0KCnNxc2VtaXBjb3IuT0RFUCA8LSByb3VuZChkYXRhLmZyYW1lKGNvcnJlbGF0aW9uOjpjb3JfdG9fc3Bjb3IoY29yID0gYXMubWF0cml4KGNvcl9tYXQuT0RFUCksY292ID0gYXMubWF0cml4KGNvdl9tYXQuT0RFUCkpKV4yLGRpZ2l0cyA9IDQpCgpwZnNxc3Bjb3JzW1tpXV0gID0gbGlzdChPRlVOQyA9IHNxc2VtaXBjb3IuT0ZVTkMsIE9ERVAgPSBzcXNlbWlwY29yLk9ERVApCn0KCm5hbWVzKHBmc3FzcGNvcnMpID0gc2l0bmFtZXMKCgoKCiMjIERFUCBhcyByZWYKZGVwc3FzcGNvcnMgPSBsaXN0KCkKZm9yIChpIGluIDEgOiBsZW5ndGgoZGVwY292cnMpKXsKICAjIHZhcnMgZm9yIHByZWRpY3Rpb24KcHJlZHZhcm5hbWVzID0gbmFtZXMoZGVwY292cnNbW2ldXVtbMV1dKVtjKC0zLC00KV0KICAKIyNjb3JyZWxhdGlvbnMgT0ZVTkMKY29yX21hdC5PRlVOQyA9IGRlcGNvdnJzW1tpXV0kY29ybWF0W2MoIk9GVU5DIixwcmVkdmFybmFtZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgYygiT0ZVTkMiLHByZWR2YXJuYW1lcyldCiMjY29ycmVsYXRpb25zIE9ERVAKY29yX21hdC5PREVQID0gZGVwY292cnNbW2ldXSRjb3JtYXRbYygiT0RFUCIscHJlZHZhcm5hbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJPREVQIixwcmVkdmFybmFtZXMpXQoKCiMjIyBjYWxjdWxhdGUgc3F1YXJlZCBzZW1pcGFydGlhbCBjb3JyZWxhdGlvbnMgaW4gcHJlZGljdGluZyBPREVQIGFuZCBPRlVOQwojIHVzaW5nIGNvdmFyaWFuY2VzCiMjIE9GVU5DCmNvdl9tYXQuT0ZVTkMgPSBkZXBjb3Zyc1tbaV1dJGNvdm1hdFtjKCJPRlVOQyIscHJlZHZhcm5hbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiT0ZVTkMiLHByZWR2YXJuYW1lcyldCgoKCnNxc2VtaXBjb3IuT0ZVTkMgPC0gcm91bmQoZGF0YS5mcmFtZShjb3JyZWxhdGlvbjo6Y29yX3RvX3NwY29yKGNvciA9IGFzLm1hdHJpeChjb3JfbWF0Lk9GVU5DKSxjb3YgPSBhcy5tYXRyaXgoY292X21hdC5PRlVOQykpKV4yLGRpZ2l0cyA9IDQpCgoKIyMgT0RFUApjb3ZfbWF0Lk9ERVAgPSBkZXBjb3Zyc1tbaV1dJGNvdm1hdFtjKCJPREVQIixwcmVkdmFybmFtZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk9ERVAiLHByZWR2YXJuYW1lcyldCgpzcXNlbWlwY29yLk9ERVAgPC0gcm91bmQoZGF0YS5mcmFtZShjb3JyZWxhdGlvbjo6Y29yX3RvX3NwY29yKGNvciA9IGFzLm1hdHJpeChjb3JfbWF0Lk9ERVApLGNvdiA9IGFzLm1hdHJpeChjb3ZfbWF0Lk9ERVApKSleMixkaWdpdHMgPSA0KQoKZGVwc3FzcGNvcnNbW2ldXSAgPSBsaXN0KE9GVU5DID0gc3FzZW1pcGNvci5PRlVOQywgT0RFUCA9IHNxc2VtaXBjb3IuT0RFUCkKfQoKbmFtZXMoZGVwc3FzcGNvcnMpID0gc2l0bmFtZXMKCgoKYGBgCgoKIyMgY3JlYXRlIHRhYmxlIHdpdGggY29ycyBhbmQgc3F1YXJlZCBzZW1pcGFydGlhbCBjb3JzLCBmb3IgUEYgYW5kIERlcCB3aXRoIGJvdGggczEgbW9kcwpgYGB7cn0KIyB0YWJsZSBkYXRhIGZyYW1lCnJvd25hbWVzcyA9IGMoCiAgIm1tfj5QRiIsICJtbX4+REVQIiwKICAic3N+PlBGIiwgInNzfj5ERVAiLAogICJtZTF+PlBGIiwgIm1lMX4+REVQIiwKICAiZW0xfj5QRiIsICJlbTF+PkRFUCIsCiAgIm1pdn4+UEYiLCAibWl2fj5ERVAiLAogICJlaXZ+PlBGIiwgImVpdn4+REVQIiwKICAibXhlfj5QRiIsICJteGV+PkRFUCIsCiAgIiZlbXB0eTttb29kfj5QRiIsICImZW1wdHk7bW9vZH4+REVQIiwKICAiJmVtcHR5O2V2ZW50fj5QRiIsICImZW1wdHk7ZXZlbnR+PkRFUCIsCiAgIlBGfj5PUEYiLCAiREVQfj5PUEYiLAogICJQRn4+T0RFUCIsICJERVB+Pk9ERVAiCikKCmNvbG5hbWVzID0gYygiY29uZmxpY3QgPGJyPiBOPTkzMCIsImVtcHRpbmVzcyBvciBib3JlZG9tIDxicj4gTiA9IDExMDMiLCJvdmVyd2hlbG1pbmcgdGFzayA8YnI+IE4gPSAxMTU1IiwicmVsYXhhdGlvbiA8YnI+IE4gPSA5OTIiLCJhY2hpZXZlbWVudCA8YnI+IE4gPSA5NjMgIiwiZ29vZCB0aW1lIHdpdGggc29tZW9uZSA8YnI+IE4gPSAxMTk3IikKCk5zID0gYyg5MzAsMTEwMywxMTU1LDk5Miw5NjMsMTE5NykKCnRhYmxlNCA9IGRhdGEuZnJhbWUobWF0cml4KCxucm93ID0gbGVuZ3RoKHJvd25hbWVzcyksIG5jb2wgPSBsZW5ndGgoY29sbmFtZXMpKSxyb3cubmFtZXMgPSByb3duYW1lc3MpCm5hbWVzKHRhYmxlNCkgPSBjb2xuYW1lcwoKcm16ZXJvIDwtIGZ1bmN0aW9uKHgsIGRpZ2l0cyA9IE5VTEwpIHsKICBzIDwtIGlmIChpcy5udWxsKGRpZ2l0cykpIHsKICAgIGFzLmNoYXJhY3Rlcih4KQogIH0gZWxzZSB7CiAgICBmb3JtYXQoeCwgbnNtYWxsID0gZGlnaXRzKQogIH0KICBzdWIoIl4oLT8pMFxcLiIsICJcXDEuIiwgcykKfQp0YWJsZTRyID0gdGFibGU0CnRhYmxlNHNxc3AgPSB0YWJsZTQKCiMgZm9yKHggaW4gMTogbnJvdyh0YWJsZTQpKXsKICBmb3IoeSBpbiAxOiBuY29sKHRhYmxlNCkpewogICAgIyBkeW5hbWljcyBhbmQgT0ZVTkMgCiAgICB0YWJsZTRbZ3JlcCgifj5QRiIsIHJvd25hbWVzcykseV0gPSAKICAgICAgcGFzdGUwKAogICAgICAgICAgIjxzcGFuIHN0eWxlPVwiIiwKICAgICAgICAgICNib2xkIGlmIHNpZ25pZmljYW50IGNvcnJlbGF0aW9uCiAgICAgICAgICBpZmVsc2UocHN5Y2g6OnIudGVzdChOc1t5XSxwZmNvdnJzW1t5XV0kY29ybWF0WzU6MTMsM10pJHAgPCAuMDA1LCB5ZXMgPSAiZm9udC13ZWlnaHQ6IGJvbGQ7Iiwgbm8gPSAiOyIpLAogICAgICAgICAgIlwiID4iLAogICAgICAgICAgcm16ZXJvKHJvdW5kKHBmY292cnNbW3ldXSRjb3JtYXRbNToxMywzXSwgZGlnaXRzID0gMikpLAogICAgICAgICAgIlsiLAogICAgICAgICAgIyBhbHNvIHB1dCBzcXVhcmVkIHNlbWlwYXJ0aWFsIGNvcnJlbGF0aW9ucwogICAgICAgICAgcm16ZXJvKHJvdW5kKHBmc3FzcGNvcnNbW3ldXSRPRlVOQ1sxLDQ6MTJdLCBkaWdpdHMgPSAzKSksCiAgICAgICAgICAiXTwvc3Bhbj4iCiAgICAgICAgKQogICAgdGFibGU0cltncmVwKCJ+PlBGIiwgcm93bmFtZXNzKSx5XSA9IHBmY292cnNbW3ldXSRjb3JtYXRbNToxMywzXQogICAgdGFibGU0c3FzcFtncmVwKCJ+PlBGIiwgcm93bmFtZXNzKSx5XSA9IHQocGZzcXNwY29yc1tbeV1dJE9GVU5DWzEsNDoxMl0pCiAgICAKICAgICNkeW5hbWljcyBhbmQgT0RFUAogICAgdGFibGU0W2dyZXAoIn4+REVQIiwgcm93bmFtZXNzKSx5XSA9IAogICAgICBwYXN0ZTAoCiAgICAgICAgICAiPHNwYW4gc3R5bGU9XCIiLAogICAgICAgICAgI2JvbGQgaWYgc2lnbmlmaWNhbnQgY29ycmVsYXRpb24KICAgICAgICAgIGlmZWxzZShwc3ljaDo6ci50ZXN0KE5zW3ldLHBmY292cnNbW3ldXSRjb3JtYXRbNToxMyw0XSkkcCA8IC4wMDUsIHllcyA9ICJmb250LXdlaWdodDogYm9sZDsiLCBubyA9ICI7IiksCiAgICAgICAgICAiXCIgPiIsCiAgICAgICAgICBybXplcm8ocm91bmQocGZjb3Zyc1tbeV1dJGNvcm1hdFs1OjEzLDRdLCBkaWdpdHMgPSAyKSksCiAgICAgICAgICAiWyIsCiAgICAgICAgICAjIGFsc28gcHV0IHNxdWFyZWQgc2VtaXBhcnRpYWwgY29ycmVsYXRpb25zCiAgICAgICAgICBybXplcm8ocm91bmQocGZzcXNwY29yc1tbeV1dJE9ERVBbMSw0OjEyXSwgZGlnaXRzID0gMykpLAogICAgICAgICAgIl08L3NwYW4+IgogICAgICAgICkKICAgIHRhYmxlNHJbZ3JlcCgifj5ERVAiLCByb3duYW1lc3MpLHldID0gcGZjb3Zyc1tbeV1dJGNvcm1hdFs1OjEzLDRdCiAgICB0YWJsZTRzcXNwW2dyZXAoIn4+REVQIiwgcm93bmFtZXNzKSx5XSA9IHQocGZzcXNwY29yc1tbeV1dJE9ERVBbMSw0OjEyXSkKCiAgICAKICAgICMgUEYgT1BGIERFUCBPREVQCiAgICB0YWJsZTRbZ3JlcCgifj5PUEYiLCByb3duYW1lc3MpLHldID0gCiAgICAgIHBhc3RlMCgKICAgICAgICAgICc8c3BhbiBzdHlsZT0iOyIgPicsCiAgICAgICAgICAjYXZlcmFnZSBmcm9tIHR3byBTMSBtb2RzCiAgICAgICAgICAjIGlmZWxzZShwc3ljaDo6ci50ZXN0KE5zW3ldLHJvd01lYW5zKGNiaW5kKHBmY292cnNbW3ldXSRjb3JtYXRbMToyLDNdLGRlcGNvdnJzW1t5XV0kY29ybWF0WzE6MiwzXSkpKSRwIDwgLjAwNSwgeWVzID0gIjxiPiIsIG5vID0gIiIpLAogICAgICAgICAgIyBybXplcm8ocm91bmQocm93TWVhbnMoY2JpbmQocGZjb3Zyc1tbeV1dJGNvcm1hdFsxOjIsM10sZGVwY292cnNbW3ldXSRjb3JtYXRbMToyLDNdKSksIGRpZ2l0cyA9IDIpKSwKICAgICAgICAgICMgIlsiLAogICAgICAgICAgIyAjIGFsc28gcHV0IHNxdWFyZWQgc2VtaXBhcnRpYWwgY29ycmVsYXRpb25zCiAgICAgICAgICAjIHJtemVybyhyb3VuZChjb2xNZWFucyhyYmluZChwZnNxc3Bjb3JzW1t5XV0kT0ZVTkNbMSwyOjNdLGRlcHNxc3Bjb3JzW1t5XV0kT0ZVTkNbMSwyOjNdKSksIGRpZ2l0cyA9IDMpKSwKICAgICAgICAgICMgIl08L2I+IDxicj4iLAogICAgICAgICAgI2JvbGQgaWYgc2lnbmlmaWNhbnQgY29ycmVsYXRpb24KICAgICAgICAgIGlmZWxzZShwc3ljaDo6ci50ZXN0KE5zW3ldLHBmY292cnNbW3ldXSRjb3JtYXRbMToyLDNdKSRwIDwgLjAwNSwgeWVzID0gIjxiPiIsIG5vID0gIiIpLAogICAgICAgICAgcm16ZXJvKHJvdW5kKHBmY292cnNbW3ldXSRjb3JtYXRbMToyLDNdLCBkaWdpdHMgPSAyKSksCiAgICAgICAgICAiWyIsCiAgICAgICAgICAjIGFsc28gcHV0IHNxdWFyZWQgc2VtaXBhcnRpYWwgY29ycmVsYXRpb25zCiAgICAgICAgICBybXplcm8ocm91bmQocGZzcXNwY29yc1tbeV1dJE9GVU5DWzEsMjozXSwgZGlnaXRzID0gMykpLAogICAgICAgICAgIl0gPC9iPiIsCiAgICAgICAgICAjYm9sZCBpZiBzaWduaWZpY2FudCBjb3JyZWxhdGlvbgogICAgICAgICAgaWZlbHNlKHBzeWNoOjpyLnRlc3QoTnNbeV0sZGVwY292cnNbW3ldXSRjb3JtYXRbMToyLDNdKSRwIDwgLjAwNSwgeWVzID0gIjxiPiIsIG5vID0gIiIpLAogICAgICAgICAgcm16ZXJvKHJvdW5kKGRlcGNvdnJzW1t5XV0kY29ybWF0WzE6MiwzXSwgZGlnaXRzID0gMikpLAogICAgICAgICAgIlsiLAogICAgICAgICAgIyBhbHNvIHB1dCBzcXVhcmVkIHNlbWlwYXJ0aWFsIGNvcnJlbGF0aW9ucwogICAgICAgICAgcm16ZXJvKHJvdW5kKGRlcHNxc3Bjb3JzW1t5XV0kT0ZVTkNbMSwyOjNdLCBkaWdpdHMgPSAzKSksCiAgICAgICAgICAiXTwvYj4iLAogICAgICAgICAgIjwvc3Bhbj4iCiAgICAgICAgKQogICAgdGFibGU0cltncmVwKCJ+Pk9QRiIsIHJvd25hbWVzcykseV0gPSByb3dNZWFucyhjYmluZChwZmNvdnJzW1t5XV0kY29ybWF0WzE6MiwzXSxkZXBjb3Zyc1tbeV1dJGNvcm1hdFsxOjIsM10pKQogICAgdGFibGU0c3FzcFtncmVwKCJ+Pk9QRiIsIHJvd25hbWVzcykseV0gPSBjb2xNZWFucyhyYmluZChwZnNxc3Bjb3JzW1t5XV0kT0ZVTkNbMSwyOjNdLGRlcHNxc3Bjb3JzW1t5XV0kT0ZVTkNbMSwyOjNdKSkKCiAgICAKICAgICAjIFBGIE9QRiBERVAgT0RFUAogICAgdGFibGU0W2dyZXAoIn4+T0RFUCIsIHJvd25hbWVzcykseV0gPSAKICAgICAgcGFzdGUwKAogICAgICAgICAgJzxzcGFuIHN0eWxlPSI7IiA+JywKICAgICAgICAgICMgI2F2ZXJhZ2UgZnJvbSB0d28gUzEgbW9kcwogICAgICAgICAgIyBpZmVsc2UocHN5Y2g6OnIudGVzdChOc1t5XSxyb3dNZWFucyhjYmluZChwZmNvdnJzW1t5XV0kY29ybWF0WzE6Miw0XSxkZXBjb3Zyc1tbeV1dJGNvcm1hdFsxOjIsNF0pKSkkcCA8IC4wMDUsIHllcyA9ICI8Yj4iLCBubyA9ICIiKSwKICAgICAgICAgICMgcm16ZXJvKHJvdW5kKHJvd01lYW5zKGNiaW5kKHBmY292cnNbW3ldXSRjb3JtYXRbMToyLDRdLGRlcGNvdnJzW1t5XV0kY29ybWF0WzE6Miw0XSkpLCBkaWdpdHMgPSAyKSksCiAgICAgICAgICAjICJbIiwKICAgICAgICAgICMgIyBhbHNvIHB1dCBzcXVhcmVkIHNlbWlwYXJ0aWFsIGNvcnJlbGF0aW9ucwogICAgICAgICAgIyBybXplcm8ocm91bmQoY29sTWVhbnMocmJpbmQocGZzcXNwY29yc1tbeV1dJE9ERVBbMSwyOjNdLGRlcHNxc3Bjb3JzW1t5XV0kT0RFUFsxLDI6M10pKSwgZGlnaXRzID0gMykpLAogICAgICAgICAgIyAiXTwvYj4gPGJyPiIsCiAgICAgICAgICAjYm9sZCBpZiBzaWduaWZpY2FudCBjb3JyZWxhdGlvbgogICAgICAgICAgaWZlbHNlKHBzeWNoOjpyLnRlc3QoTnNbeV0scGZjb3Zyc1tbeV1dJGNvcm1hdFsxOjIsNF0pJHAgPCAuMDA1LCB5ZXMgPSAiPGI+Iiwgbm8gPSAiIiksCiAgICAgICAgICBybXplcm8ocm91bmQocGZjb3Zyc1tbeV1dJGNvcm1hdFsxOjIsNF0sIGRpZ2l0cyA9IDIpKSwKICAgICAgICAgICJbIiwKICAgICAgICAgICMgYWxzbyBwdXQgc3F1YXJlZCBzZW1pcGFydGlhbCBjb3JyZWxhdGlvbnMKICAgICAgICAgIHJtemVybyhyb3VuZChwZnNxc3Bjb3JzW1t5XV0kT0RFUFsxLDI6M10sIGRpZ2l0cyA9IDMpKSwKICAgICAgICAgICJdIDwvYj4iLAogICAgICAgICAgI2JvbGQgaWYgc2lnbmlmaWNhbnQgY29ycmVsYXRpb24KICAgICAgICAgIGlmZWxzZShwc3ljaDo6ci50ZXN0KE5zW3ldLGRlcGNvdnJzW1t5XV0kY29ybWF0WzE6Miw0XSkkcCA8IC4wMDUsIHllcyA9ICI8Yj4iLCBubyA9ICIiKSwKICAgICAgICAgIHJtemVybyhyb3VuZChkZXBjb3Zyc1tbeV1dJGNvcm1hdFsxOjIsNF0sIGRpZ2l0cyA9IDIpKSwKICAgICAgICAgICJbIiwKICAgICAgICAgICMgYWxzbyBwdXQgc3F1YXJlZCBzZW1pcGFydGlhbCBjb3JyZWxhdGlvbnMKICAgICAgICAgIHJtemVybyhyb3VuZChkZXBzcXNwY29yc1tbeV1dJE9ERVBbMSwyOjNdLCBkaWdpdHMgPSAzKSksCiAgICAgICAgICAiXTwvYj4iLAogICAgICAgICAgIjwvc3Bhbj4iCiAgICAgICAgKQogICAgdGFibGU0cltncmVwKCJ+Pk9ERVAiLCByb3duYW1lc3MpLHldID0gcm93TWVhbnMoY2JpbmQocGZjb3Zyc1tbeV1dJGNvcm1hdFsxOjIsNF0sZGVwY292cnNbW3ldXSRjb3JtYXRbMToyLDRdKSkKICAgIHRhYmxlNHNxc3BbZ3JlcCgifj5PREVQIiwgcm93bmFtZXNzKSx5XSA9IGNvbE1lYW5zKHJiaW5kKHBmc3FzcGNvcnNbW3ldXSRPREVQWzEsMjozXSxkZXBzcXNwY29yc1tbeV1dJE9ERVBbMSwyOjNdKSkKCiAgICAKICB9CgoKCmBgYAoKCiMjICBDcmVhdGUgdGFibGUgd2l0aCBjb3JzIGFuZCBzcXVhcmVkIHNlbWlwYXJ0aWFsIGNvcnMsIGZvciBQRiBhbmQgRGVwIHdpdGggYm90aCBzMSBtb2RzCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrYWJsZUV4dHJhKQoKdGFibGU0JT4lIGthYmxlKGVzY2FwZSA9IEZBTFNFLCBhbGlnbiA9ICJjIixmb3JtYXQgPSAiaHRtbCIpICU+JQprYWJsZV9wYXBlcigpICU+JQpjb2x1bW5fc3BlYygyLCNib2xkID0gdGFibGUyW1s0XV1bLDJdLApiYWNrZ3JvdW5kID0gc3BlY19jb2xvcih0YWJsZTRyWywxXSwgc2NhbGVfZnJvbSA9IGMoLS45NSwuOTUpLCBwYWxldHRlID1jb2xvclJhbXBQYWxldHRlKGMoIiNmZGU3MjUiLCJ3aGl0ZSIsIiMyMTkxOGMiKSkoMjU2KSkpJT4lCmNvbHVtbl9zcGVjKDMsI2JvbGQgPSB0YWJsZTJbWzRdXVssM10sCmJhY2tncm91bmQgPSBzcGVjX2NvbG9yKHRhYmxlNHJbLDJdLCBzY2FsZV9mcm9tID0gYygtLjk1LC45NSksIHBhbGV0dGUgPWNvbG9yUmFtcFBhbGV0dGUoYygiI2ZkZTcyNSIsIndoaXRlIiwiIzIxOTE4YyIpKSgyNTYpKSklPiUKY29sdW1uX3NwZWMoNCwjYm9sZCA9IHRhYmxlMltbNF1dWyw0XSwKYmFja2dyb3VuZCA9IHNwZWNfY29sb3IodGFibGU0clssM10sIHNjYWxlX2Zyb20gPSBjKC0uOTUsLjk1KSwgcGFsZXR0ZSA9Y29sb3JSYW1wUGFsZXR0ZShjKCIjZmRlNzI1Iiwid2hpdGUiLCIjMjE5MThjIikpKDI1NikpKSU+JQpjb2x1bW5fc3BlYyg1LCNib2xkID0gdGFibGUyW1s0XV1bLDVdLApiYWNrZ3JvdW5kID0gc3BlY19jb2xvcih0YWJsZTRyWyw0XSwgc2NhbGVfZnJvbSA9IGMoLS45NSwuOTUpLCBwYWxldHRlID1jb2xvclJhbXBQYWxldHRlKGMoIiNmZGU3MjUiLCJ3aGl0ZSIsIiMyMTkxOGMiKSkoMjU2KSkpJT4lCmNvbHVtbl9zcGVjKDYsI2JvbGQgPSB0YWJsZTJbWzRdXVssNl0sCmJhY2tncm91bmQgPSBzcGVjX2NvbG9yKHRhYmxlNHJbLDVdLCBzY2FsZV9mcm9tID0gYygtLjk1LC45NSksIHBhbGV0dGUgPWNvbG9yUmFtcFBhbGV0dGUoYygiI2ZkZTcyNSIsIndoaXRlIiwiIzIxOTE4YyIpKSgyNTYpKSklPiUKY29sdW1uX3NwZWMoNywjYm9sZCA9IHRhYmxlMltbNF1dWyw3XSwKYmFja2dyb3VuZCA9IHNwZWNfY29sb3IodGFibGU0clssNl0sIHNjYWxlX2Zyb20gPSBjKC0uOTUsLjk1KSwgcGFsZXR0ZSA9Y29sb3JSYW1wUGFsZXR0ZShjKCIjZmRlNzI1Iiwid2hpdGUiLCIjMjE5MThjIikpKDI1NikpKSU+JQphZGRfaGVhZGVyX2Fib3ZlKGMoIiAiLCAiQ29ycmVsYXRpb25zIGFuZCBzcXVhcmVkIHNlbWlwYXJ0aWFsIGNvcnJlbGF0aW9ucyBbaW4gYnJhY2tldHNdIG9mIGJldHdlZW4tcGVyc29uIGRpZmZlcmVuY2VzIGluIFBGIGFuZCBkZXByZXNzaW9uIChhdmVyYWdlZCBvdmVyIG9uZSB5ZWFyKSB1c2luZyB3aXRoaW4tcGVyc29uIGFmZmVjdC1zaXRhdGlvbiBkeW5hbWljcyIgPSA2KSkKCgpgYGAKCgoKCiMgUmVzdApgYGB7cn0KCgoKCgoKY292cjF5ID0gY292cm1hdGZ1bmMoIk1vZGVsMVluY25mUzFQQ08ub3V0IikKCnZhcnMgPSBuYW1lcyhjb3ZyMXlbWzFdXSkKCiMgd2l0aG91dCBvdXRjb21lCnByZWR2YXJuYW1lcyA9IHZhcnNbYygtMywtNCldCgojI2NvcnJlbGF0aW9ucyBPRlVOQwpjb3JfbWF0Lk9GVU5DID0gY292cjF5JGNvcm1hdFtjKCJPRlVOQyIscHJlZHZhcm5hbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGMoIk9GVU5DIixwcmVkdmFybmFtZXMpXQoKIyNjb3JyZWxhdGlvbnMgT0RFUApjb3JfbWF0Lk9ERVAgPSBjb3ZyMXkkY29ybWF0W2MoIk9ERVAiLHByZWR2YXJuYW1lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiT0RFUCIscHJlZHZhcm5hbWVzKV0KCgoKIyMjIyBSZWdyZXNzaW9uIG1vZGVsIGJhc2VkIG9uIGNvcnJlbGF0b2luIG1hdHJpeApsaWJyYXJ5KG1ldGFmb3IpCiMgIyB3aXRoIGNvdgojIHJlZ3BzZnMxID0gbWF0cmVnKCJwc2ZfYXZfZnUiLCB4PXByZWR2YXJuYW1lcywgY292X21hdC5wc2YuczEsIGNvdiA9IFQsIG49MjcxNzMpCgojd2l0aCBjb3IKcmVnT1BGID0gbWF0cmVnKCJPRlVOQyIsIHg9cHJlZHZhcm5hbWVzLCBjb3JfbWF0Lk9GVU5DLCBuPTkzMCwgZGlnaXRzID0gMikKcmVnT0RFUCA9IG1hdHJlZygiT0RFUCIsIHg9cHJlZHZhcm5hbWVzLCBjb3JfbWF0Lk9ERVAsIG49OTMwLCBkaWdpdHMgPSAyKQoKCgojIyMgY2FsY3VsYXRlIHNxdWFyZWQgc2VtaXBhcnRpYWwgY29ycmVsYXRpb25zIGluIHByZWRpY3RpbmcgT0RFUCBhbmQgT0ZVTkMKIyB1c2luZyBjb3ZhcmlhbmNlcwojIyBPRlVOQwpjb3ZfbWF0Lk9GVU5DID0gY292cjF5JGNvdm1hdFtjKCJPRlVOQyIscHJlZHZhcm5hbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiT0ZVTkMiLHByZWR2YXJuYW1lcyldCgoKCnNxc2VtaXBjb3IuT0ZVTkMgPC0gcm91bmQoZGF0YS5mcmFtZShjb3JyZWxhdGlvbjo6Y29yX3RvX3NwY29yKGNvciA9IGFzLm1hdHJpeChjb3JfbWF0Lk9GVU5DKSxjb3YgPSBhcy5tYXRyaXgoY292X21hdC5PRlVOQykpKV4yLGRpZ2l0cyA9IDQpCgoKIyMgT0RFUApjb3ZfbWF0Lk9ERVAgPSBjb3ZyMXkkY292bWF0W2MoIk9ERVAiLHByZWR2YXJuYW1lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiT0RFUCIscHJlZHZhcm5hbWVzKV0KCnNxc2VtaXBjb3IuT0RFUCA8LSByb3VuZChkYXRhLmZyYW1lKGNvcnJlbGF0aW9uOjpjb3JfdG9fc3Bjb3IoY29yID0gYXMubWF0cml4KGNvcl9tYXQuT0RFUCksY292ID0gYXMubWF0cml4KGNvdl9tYXQuT0RFUCkpKV4yLGRpZ2l0cyA9IDQpCgpgYGAKCgo=