This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

Population effect for right BST

effect: contrast of shock response between uncontrol and control paricipants

library(brms) # for the analysis
library(haven) # to load the SPSS .sav file
library(tidyverse) # needed for data manipulation.
library(RColorBrewer) # needed for some extra colours in one of the graphs
library(ggmcmc)
library(ggthemes)
library(ggridges)

Model

\[Y \sim N(\mu, \sigma_{\epsilon}^{2})\] \[\mu = A + \alpha*TM + \beta*TD + \gamma*SM + \delta * SD + \epsilon\] Where TM, TD, SM, and SD are covariates.

TM: Trait mean
TD: Triat difference (uncon - con)
SM: State mean
SD: State difference (uncon - con)

Priors

\[ A \sim N(0,100)\] \[\alpha \sim N(0,100)\] \[\beta \sim N(0,100)\] \[\gamma \sim N(0,100)\] \[\delta \sim N(0,100)\] \[\sigma_{\epsilon} \sim Cauchy(0,100)\]

setwd("C:/Users/Chirag/Box/Box/UMD/Project_UMD/eCON/RBA/uncon_v_con_rBNST_with_covariates")

df <- read.table('uncon_v_con_rBNST_with_covariates.txt',header=TRUE)
prior1 <- c(prior(normal(0,100),class=Intercept),
            prior(normal(0,100),class=b, coef="TRAITmean"),
            prior(normal(0,100),class=b, coef="TRAITdiff"),
            prior(normal(0,100),class=b, coef="STATEmean"),
            prior(normal(0,100),class=b, coef="STATEdiff"),
            prior(cauchy(0,100),class=sigma)
           )

bmod1 <- brm(Y ~ TRAITmean + TRAITdiff + STATEmean + STATEdiff, 
             data = df, 
             family = gaussian(),
             prior = prior1, 
             warmup = 2000, iter = 5000,
             chains = 4,
             cores  = 2)
Compiling the C++ model
recompiling to avoid crashing R session
Start sampling

Model Summary

summary(bmod1)
 Family: gaussian 
  Links: mu = identity; sigma = identity 
Formula: Y ~ TRAITmean + TRAITdiff + STATEmean + STATEdiff 
   Data: df (Number of observations: 61) 
Samples: 4 chains, each with iter = 5000; warmup = 2000; thin = 1;
         total post-warmup samples = 12000

Population-Level Effects: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept     0.11      0.06    -0.01     0.23 1.00    15556     8385
TRAITmean    -0.05      0.08    -0.21     0.11 1.00    11028     9079
TRAITdiff     0.07      0.06    -0.06     0.19 1.00    12712     8581
STATEmean     0.21      0.08     0.05     0.36 1.00    10850     9512
STATEdiff     0.05      0.06    -0.07     0.18 1.00    13098     8541

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     0.48      0.05     0.40     0.58 1.00    13886     9365

Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

Posteriors

data <- fixef(bmod1,summary = FALSE)
write.csv(data,file = 'posteriors.csv')
# IMPORT LIBRARIES:
library(data.table)
library(ggplot2)
library(ggridges)
library(dplyr)
library(tidyr)
library(scales)
library(viridis)
rois <- colnames(data)
data$X <- NULL
nobj=dim(data)[1]

# rename columns with ROI list


data_stats = data.frame(1:length(rois))

# create ROI column instead of numerics to match threat table above

data_stats$ROI <- rois
data_stats$mean <- colMeans(data)
data_stats$P <- colSums(data > 0)/nobj
data_stats$Pn <- data_stats$P


for (i in 1:length(rois)) {
  if (data_stats$P[i]<.5){data_stats$Pn[i]=1-data_stats$P[i]}
}


# this will order the distributions correctly
data_stats <- data_stats[order(data_stats$mean),]



data_trans <- as.data.frame(t(as.matrix(data)))
data_trans <- tibble::rownames_to_column(data_trans, "ROI")
data_trans$X <- 1:nrow(data_trans)




# merge values & stats into one table by ROI

data_merge <- merge(data_stats, data_trans, by = "ROI")
data_merge <- data_merge[order(data_merge$X),]

# Transform data into long form


# Melt dataframe by ROI
library(data.table)

data_long <- melt(data_trans, id=c("ROI","X"))
The melt generic in data.table has been passed a data.frame and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(data_trans). In the next version, this warning will become an error.
#threat_long <- melt(threat_trans, id=c("ROI","X.x"))


data_long <- data_long[order(data_long$X),]


# This is incredibly clunky, but for the sake of time adding stats by ensuring orders are all the same and repeating each value 2000 times... Tried a few different methods with no success for some reason. 

data_long$mean <- rep(data_merge$mean, each = nobj)
data_long$P <- rep(data_merge$P, each =nobj)
data_long$Pn <- rep(data_merge$Pn, each =nobj)

# set your labels here so you don't have to change within the plot below: 
format(round(1, 2), nsmall = 2)
[1] "1.00"
y.axis.labs <- format(round(data_stats$P,2), nsmall = 2)                        # y axis labels
sec.y.axis.labs <- data_stats$ROI                             # second y axis labels (probabilities)


 # X AXIS LABELS NEED TO CHANGE TO CORRESPOND TO DATA SET! UNCOMMENT WHICHEVER MATCHES

# Uncomment for THREAT
x.axis.labs <- c( "Control > Uncontrol", "0", "Uncontrol > Control")                 # x axis labels  THREAT
x.labs.pos <- c(-0.2, 0, 0.2)                                             # x axis position THREAT


# Uncomment for VALENCE
#x.axis.labs <- c("Neutral > Positive", "0", "Positive > Neutral")         # x axis labels  VALENCE
#x.labs.pos  <- c(-0.1,0,0.2)                                              # x axis position VALENCE

# Uncomment for INTERACTION
#x.axis.labs <- NULL                                                       # x axis labels  INTERACTION, not sure what to put.
#x.labs.pos <- NULL                                                        # a axis position INTERACTION, change when labels decided

#graph.title <- data.name                                   # graph title 
legend.title <- "Probability"                              # legend title
y.axis.title <- NULL                                       # for now ...
x.axis.title <- NULL                                       # for now...

# GRAPH DATA 
dataset <- data_long
x.values <- data_long$value                               # x values
y.values <- data_long$ROI                                 # y values
y.values.RO <- data_long$value                            # values to reorder Y by
distrib.fill <- data_long$Pn                              # fill graph with probabilities
group <- data_long$ROI

# Other aspects
gradient.colors <- c("yellow","#C9182B","#41245C")        # change gradient colors here (currently, yellow - purple)
label.size <- 12                                         # adjust ROI and probability y-axis font size
title.size <- 28                                          # adjust graph title size 
x.axis.size <- 12                                        # adjust x-axis label sizes

# here is where you can change information about the graph and add other characteristics using ggplot and ggridges


ggplot(dataset, aes(x = x.values, y = as.numeric(reorder(y.values, y.values.RO)), 
                    fill = distrib.fill, group = group)) +                        # scale = spacing, alpha = transparency
  coord_cartesian(xlim = c(-0.5, 0.5)) +
  stat_density_ridges(quantile_lines = TRUE, 
                      quantiles = 2, 
                      alpha = .95, 
                      scale = 2.55,
                      color = "black",
                      size = .35
                     ) +            # divide into two quantiles (show mean)
  geom_vline(xintercept = 0, linetype="solid",color = "black",alpha = .95, size = .45) +    #create line at X = 0
  scale_fill_gradientn(colors = viridis_pal(direction = 1, option = "inferno")(20),                         # set gradient
                       limits = c(.85,1),                                # which probabilites matter?
                       na.value = "#909497",                                # if not in limits, gray out
                       name = legend.title) +                            # name legend
  scale_y_continuous(breaks = 1:length(rois),                            # A VERY HACK-Y WAY TO HAVE TWO Y AXES W DISCRETE DATA
                     expand = c(0,0),
                     labels = y.axis.labs,                               # Trick ggplot into thinking data is continuous...
                     sec.axis = sec_axis(~.,                             # Second axis to show probabilities
                                         breaks = 1:length(rois),
                                         labels = sec.y.axis.labs)) +
  #theme_ridges(font_size = label.size, grid = TRUE, center_axis_labels = TRUE) +  # theme info
  #ggtitle(graph.title)+ 
  #theme_bw() +# graph title
 #theme_ridges(grid = FALSE) + 
  theme(   
    panel.background = element_blank(),
    legend.position = "none",
    #panel.grid.major.y = element_line(color = "grey"), 
    plot.title = element_text(hjust = 0.5, size = title.size),            # plot title size and position
    axis.text.y = element_text(size=label.size),                               # y-axis text size
    axis.line.x = element_line(color = "gray"),
    axis.text.y.right = element_text(size = label.size),                  # y-axis info for right axis
    axis.text.x = element_text(size = x.axis.size),
    #plot.margin = unit(c(0,0,0,0), "cm"),
    axis.ticks.x = element_blank(),
    axis.ticks.y = element_blank(),
    legend.title.align = 5)+
  guides(shape = guide_legend(label.position = "bottom",
                              title.positon = "bottom",
                              title.vjust = 0.4)) +          
  labs(
    x = NULL,                                                         # Add or not add X and Y labels
    y = NULL) +
  scale_x_continuous(breaks = x.labs.pos, labels = c(x.axis.labs))


#ggsave(file = paste0(strsplit(type,'.RData'),".jpg", sep=""), width=4.5, height=3, units = "in", dpi = 900)

# preview will look smooshed, be sure to look at the saved .jpg before making any changes to text size, etc!
#graph
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gDQoNClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDdHJsK1NoaWZ0K0VudGVyKi4gDQoNCiMgKipQb3B1bGF0aW9uIGVmZmVjdCBmb3IgcmlnaHQgQlNUKioNCg0KIyMjIGVmZmVjdDogY29udHJhc3Qgb2Ygc2hvY2sgcmVzcG9uc2UgYmV0d2VlbiB1bmNvbnRyb2wgYW5kIGNvbnRyb2wgcGFyaWNpcGFudHMNCg0KYGBge3J9DQpsaWJyYXJ5KGJybXMpICMgZm9yIHRoZSBhbmFseXNpcw0KbGlicmFyeShoYXZlbikgIyB0byBsb2FkIHRoZSBTUFNTIC5zYXYgZmlsZQ0KbGlicmFyeSh0aWR5dmVyc2UpICMgbmVlZGVkIGZvciBkYXRhIG1hbmlwdWxhdGlvbi4NCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjIG5lZWRlZCBmb3Igc29tZSBleHRyYSBjb2xvdXJzIGluIG9uZSBvZiB0aGUgZ3JhcGhzDQpsaWJyYXJ5KGdnbWNtYykNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KYGBgDQojIyAqKk1vZGVsKioNCiQkWSBcc2ltIE4oXG11LCBcc2lnbWFfe1xlcHNpbG9ufV57Mn0pJCQNCiQkXG11ID0gQSArIFxhbHBoYSpUTSArIFxiZXRhKlREICsgXGdhbW1hKlNNICsgXGRlbHRhICogU0QgKyBcZXBzaWxvbiQkDQpXaGVyZSBUTSwgVEQsIFNNLCBhbmQgU0QgYXJlIGNvdmFyaWF0ZXMuDQoNClRNOiBUcmFpdCBtZWFuICANClREOiBUcmlhdCBkaWZmZXJlbmNlICh1bmNvbiAtIGNvbikgIA0KU006IFN0YXRlIG1lYW4gIA0KU0Q6IFN0YXRlIGRpZmZlcmVuY2UgKHVuY29uIC0gY29uKSAgDQoNCiMjICoqUHJpb3JzKioNCg0KJCQgQSBcc2ltIE4oMCwxMDApJCQNCiQkXGFscGhhIFxzaW0gTigwLDEwMCkkJA0KJCRcYmV0YSBcc2ltIE4oMCwxMDApJCQNCiQkXGdhbW1hIFxzaW0gTigwLDEwMCkkJA0KJCRcZGVsdGEgXHNpbSBOKDAsMTAwKSQkDQokJFxzaWdtYV97XGVwc2lsb259IFxzaW0gQ2F1Y2h5KDAsMTAwKSQkDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L1VzZXJzL0NoaXJhZy9Cb3gvQm94L1VNRC9Qcm9qZWN0X1VNRC9lQ09OL1JCQS91bmNvbl92X2Nvbl9yQk5TVF93aXRoX2NvdmFyaWF0ZXMiKQ0KDQpkZiA8LSByZWFkLnRhYmxlKCd1bmNvbl92X2Nvbl9yQk5TVF93aXRoX2NvdmFyaWF0ZXMudHh0JyxoZWFkZXI9VFJVRSkNCnByaW9yMSA8LSBjKHByaW9yKG5vcm1hbCgwLDEwMCksY2xhc3M9SW50ZXJjZXB0KSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLDEwMCksY2xhc3M9YiwgY29lZj0iVFJBSVRtZWFuIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwxMDApLGNsYXNzPWIsIGNvZWY9IlRSQUlUZGlmZiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsMTAwKSxjbGFzcz1iLCBjb2VmPSJTVEFURW1lYW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLDEwMCksY2xhc3M9YiwgY29lZj0iU1RBVEVkaWZmIiksDQogICAgICAgICAgICBwcmlvcihjYXVjaHkoMCwxMDApLGNsYXNzPXNpZ21hKQ0KICAgICAgICAgICApDQoNCmJtb2QxIDwtIGJybShZIH4gVFJBSVRtZWFuICsgVFJBSVRkaWZmICsgU1RBVEVtZWFuICsgU1RBVEVkaWZmLCANCiAgICAgICAgICAgICBkYXRhID0gZGYsIA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCksDQogICAgICAgICAgICAgcHJpb3IgPSBwcmlvcjEsIA0KICAgICAgICAgICAgIHdhcm11cCA9IDIwMDAsIGl0ZXIgPSA1MDAwLA0KICAgICAgICAgICAgIGNoYWlucyA9IDQsDQogICAgICAgICAgICAgY29yZXMgID0gMikNCg0KYGBgDQojIyAqKk1vZGVsIFN1bW1hcnkqKg0KYGBge3J9DQpzdW1tYXJ5KGJtb2QxKQ0KYGBgDQojIyBQb3N0ZXJpb3JzDQpgYGB7cn0NCmRhdGEgPC0gZml4ZWYoYm1vZDEsc3VtbWFyeSA9IEZBTFNFKQ0Kd3JpdGUuY3N2KGRhdGEsZmlsZSA9ICdwb3N0ZXJpb3JzLmNzdicpDQpgYGANCg0KDQpgYGB7cn0NCiMgSU1QT1JUIExJQlJBUklFUzoNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dyaWRnZXMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KYGBgDQoNCg0KYGBge3J9DQpyb2lzIDwtIGNvbG5hbWVzKGRhdGEpDQpkYXRhJFggPC0gTlVMTA0KYGBgDQoNCg0KYGBge3J9DQpub2JqPWRpbShkYXRhKVsxXQ0KDQojIHJlbmFtZSBjb2x1bW5zIHdpdGggUk9JIGxpc3QNCg0KDQpkYXRhX3N0YXRzID0gZGF0YS5mcmFtZSgxOmxlbmd0aChyb2lzKSkNCg0KIyBjcmVhdGUgUk9JIGNvbHVtbiBpbnN0ZWFkIG9mIG51bWVyaWNzIHRvIG1hdGNoIHRocmVhdCB0YWJsZSBhYm92ZQ0KDQpkYXRhX3N0YXRzJFJPSSA8LSByb2lzDQpkYXRhX3N0YXRzJG1lYW4gPC0gY29sTWVhbnMoZGF0YSkNCmRhdGFfc3RhdHMkUCA8LSBjb2xTdW1zKGRhdGEgPiAwKS9ub2JqDQpkYXRhX3N0YXRzJFBuIDwtIGRhdGFfc3RhdHMkUA0KDQoNCmZvciAoaSBpbiAxOmxlbmd0aChyb2lzKSkgew0KICBpZiAoZGF0YV9zdGF0cyRQW2ldPC41KXtkYXRhX3N0YXRzJFBuW2ldPTEtZGF0YV9zdGF0cyRQW2ldfQ0KfQ0KDQoNCiMgdGhpcyB3aWxsIG9yZGVyIHRoZSBkaXN0cmlidXRpb25zIGNvcnJlY3RseQ0KZGF0YV9zdGF0cyA8LSBkYXRhX3N0YXRzW29yZGVyKGRhdGFfc3RhdHMkbWVhbiksXQ0KDQoNCg0KZGF0YV90cmFucyA8LSBhcy5kYXRhLmZyYW1lKHQoYXMubWF0cml4KGRhdGEpKSkNCmRhdGFfdHJhbnMgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oZGF0YV90cmFucywgIlJPSSIpDQpkYXRhX3RyYW5zJFggPC0gMTpucm93KGRhdGFfdHJhbnMpDQoNCg0KDQoNCiMgbWVyZ2UgdmFsdWVzICYgc3RhdHMgaW50byBvbmUgdGFibGUgYnkgUk9JDQoNCmRhdGFfbWVyZ2UgPC0gbWVyZ2UoZGF0YV9zdGF0cywgZGF0YV90cmFucywgYnkgPSAiUk9JIikNCmRhdGFfbWVyZ2UgPC0gZGF0YV9tZXJnZVtvcmRlcihkYXRhX21lcmdlJFgpLF0NCg0KIyBUcmFuc2Zvcm0gZGF0YSBpbnRvIGxvbmcgZm9ybQ0KDQoNCiMgTWVsdCBkYXRhZnJhbWUgYnkgUk9JDQpsaWJyYXJ5KGRhdGEudGFibGUpDQoNCmRhdGFfbG9uZyA8LSBtZWx0KGRhdGFfdHJhbnMsIGlkPWMoIlJPSSIsIlgiKSkNCiN0aHJlYXRfbG9uZyA8LSBtZWx0KHRocmVhdF90cmFucywgaWQ9YygiUk9JIiwiWC54IikpDQoNCg0KZGF0YV9sb25nIDwtIGRhdGFfbG9uZ1tvcmRlcihkYXRhX2xvbmckWCksXQ0KDQoNCiMgVGhpcyBpcyBpbmNyZWRpYmx5IGNsdW5reSwgYnV0IGZvciB0aGUgc2FrZSBvZiB0aW1lIGFkZGluZyBzdGF0cyBieSBlbnN1cmluZyBvcmRlcnMgYXJlIGFsbCB0aGUgc2FtZSBhbmQgcmVwZWF0aW5nIGVhY2ggdmFsdWUgMjAwMCB0aW1lcy4uLiBUcmllZCBhIGZldyBkaWZmZXJlbnQgbWV0aG9kcyB3aXRoIG5vIHN1Y2Nlc3MgZm9yIHNvbWUgcmVhc29uLiANCg0KZGF0YV9sb25nJG1lYW4gPC0gcmVwKGRhdGFfbWVyZ2UkbWVhbiwgZWFjaCA9IG5vYmopDQpkYXRhX2xvbmckUCA8LSByZXAoZGF0YV9tZXJnZSRQLCBlYWNoID1ub2JqKQ0KZGF0YV9sb25nJFBuIDwtIHJlcChkYXRhX21lcmdlJFBuLCBlYWNoID1ub2JqKQ0KDQpgYGANCg0KYGBge3J9DQoNCiMgc2V0IHlvdXIgbGFiZWxzIGhlcmUgc28geW91IGRvbid0IGhhdmUgdG8gY2hhbmdlIHdpdGhpbiB0aGUgcGxvdCBiZWxvdzogDQpmb3JtYXQocm91bmQoMSwgMiksIG5zbWFsbCA9IDIpDQp5LmF4aXMubGFicyA8LSBmb3JtYXQocm91bmQoZGF0YV9zdGF0cyRQLDIpLCBuc21hbGwgPSAyKSAgICAgICAgICAgICAgICAgICAgICAgICMgeSBheGlzIGxhYmVscw0Kc2VjLnkuYXhpcy5sYWJzIDwtIGRhdGFfc3RhdHMkUk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlY29uZCB5IGF4aXMgbGFiZWxzIChwcm9iYWJpbGl0aWVzKQ0KDQoNCiAjIFggQVhJUyBMQUJFTFMgTkVFRCBUTyBDSEFOR0UgVE8gQ09SUkVTUE9ORCBUTyBEQVRBIFNFVCEgVU5DT01NRU5UIFdISUNIRVZFUiBNQVRDSEVTDQoNCiMgVW5jb21tZW50IGZvciBUSFJFQVQNCnguYXhpcy5sYWJzIDwtIGMoICJDb250cm9sID4gVW5jb250cm9sIiwgIjAiLCAiVW5jb250cm9sID4gQ29udHJvbCIpICAgICAgICAgICAgICAgICAjIHggYXhpcyBsYWJlbHMgIFRIUkVBVA0KeC5sYWJzLnBvcyA8LSBjKC0wLjIsIDAsIDAuMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHggYXhpcyBwb3NpdGlvbiBUSFJFQVQNCg0KDQojIFVuY29tbWVudCBmb3IgVkFMRU5DRQ0KI3guYXhpcy5sYWJzIDwtIGMoIk5ldXRyYWwgPiBQb3NpdGl2ZSIsICIwIiwgIlBvc2l0aXZlID4gTmV1dHJhbCIpICAgICAgICAgIyB4IGF4aXMgbGFiZWxzICBWQUxFTkNFDQojeC5sYWJzLnBvcyAgPC0gYygtMC4xLDAsMC4yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHggYXhpcyBwb3NpdGlvbiBWQUxFTkNFDQoNCiMgVW5jb21tZW50IGZvciBJTlRFUkFDVElPTg0KI3guYXhpcy5sYWJzIDwtIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB4IGF4aXMgbGFiZWxzICBJTlRFUkFDVElPTiwgbm90IHN1cmUgd2hhdCB0byBwdXQuDQojeC5sYWJzLnBvcyA8LSBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgYXhpcyBwb3NpdGlvbiBJTlRFUkFDVElPTiwgY2hhbmdlIHdoZW4gbGFiZWxzIGRlY2lkZWQNCg0KI2dyYXBoLnRpdGxlIDwtIGRhdGEubmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBncmFwaCB0aXRsZSANCmxlZ2VuZC50aXRsZSA8LSAiUHJvYmFiaWxpdHkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWdlbmQgdGl0bGUNCnkuYXhpcy50aXRsZSA8LSBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3Igbm93IC4uLg0KeC5heGlzLnRpdGxlIDwtIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBub3cuLi4NCg0KIyBHUkFQSCBEQVRBIA0KZGF0YXNldCA8LSBkYXRhX2xvbmcNCngudmFsdWVzIDwtIGRhdGFfbG9uZyR2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHggdmFsdWVzDQp5LnZhbHVlcyA8LSBkYXRhX2xvbmckUk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5IHZhbHVlcw0KeS52YWx1ZXMuUk8gPC0gZGF0YV9sb25nJHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmFsdWVzIHRvIHJlb3JkZXIgWSBieQ0KZGlzdHJpYi5maWxsIDwtIGRhdGFfbG9uZyRQbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsbCBncmFwaCB3aXRoIHByb2JhYmlsaXRpZXMNCmdyb3VwIDwtIGRhdGFfbG9uZyRST0kNCg0KIyBPdGhlciBhc3BlY3RzDQpncmFkaWVudC5jb2xvcnMgPC0gYygieWVsbG93IiwiI0M5MTgyQiIsIiM0MTI0NUMiKSAgICAgICAgIyBjaGFuZ2UgZ3JhZGllbnQgY29sb3JzIGhlcmUgKGN1cnJlbnRseSwgeWVsbG93IC0gcHVycGxlKQ0KbGFiZWwuc2l6ZSA8LSAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGp1c3QgUk9JIGFuZCBwcm9iYWJpbGl0eSB5LWF4aXMgZm9udCBzaXplDQp0aXRsZS5zaXplIDwtIDI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGp1c3QgZ3JhcGggdGl0bGUgc2l6ZSANCnguYXhpcy5zaXplIDwtIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRqdXN0IHgtYXhpcyBsYWJlbCBzaXplcw0KDQojIGhlcmUgaXMgd2hlcmUgeW91IGNhbiBjaGFuZ2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdyYXBoIGFuZCBhZGQgb3RoZXIgY2hhcmFjdGVyaXN0aWNzIHVzaW5nIGdncGxvdCBhbmQgZ2dyaWRnZXMNCg0KDQpnZ3Bsb3QoZGF0YXNldCwgYWVzKHggPSB4LnZhbHVlcywgeSA9IGFzLm51bWVyaWMocmVvcmRlcih5LnZhbHVlcywgeS52YWx1ZXMuUk8pKSwgDQogICAgICAgICAgICAgICAgICAgIGZpbGwgPSBkaXN0cmliLmZpbGwsIGdyb3VwID0gZ3JvdXApKSArICAgICAgICAgICAgICAgICAgICAgICAgIyBzY2FsZSA9IHNwYWNpbmcsIGFscGhhID0gdHJhbnNwYXJlbmN5DQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMC41LCAwLjUpKSArDQogIHN0YXRfZGVuc2l0eV9yaWRnZXMocXVhbnRpbGVfbGluZXMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICBxdWFudGlsZXMgPSAyLCANCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IC45NSwgDQogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAyLjU1LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICBzaXplID0gLjM1DQogICAgICAgICAgICAgICAgICAgICApICsgICAgICAgICAgICAjIGRpdmlkZSBpbnRvIHR3byBxdWFudGlsZXMgKHNob3cgbWVhbikNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGU9InNvbGlkIixjb2xvciA9ICJibGFjayIsYWxwaGEgPSAuOTUsIHNpemUgPSAuNDUpICsgICAgI2NyZWF0ZSBsaW5lIGF0IFggPSAwDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IHZpcmlkaXNfcGFsKGRpcmVjdGlvbiA9IDEsIG9wdGlvbiA9ICJpbmZlcm5vIikoMjApLCAgICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBncmFkaWVudA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC44NSwxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggcHJvYmFiaWxpdGVzIG1hdHRlcj8NCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiIzkwOTQ5NyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBpbiBsaW1pdHMsIGdyYXkgb3V0DQogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBsZWdlbmQudGl0bGUpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuYW1lIGxlZ2VuZA0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gMTpsZW5ndGgocm9pcyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQSBWRVJZIEhBQ0stWSBXQVkgVE8gSEFWRSBUV08gWSBBWEVTIFcgRElTQ1JFVEUgREFUQQ0KICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLDApLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0geS5heGlzLmxhYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHJpY2sgZ2dwbG90IGludG8gdGhpbmtpbmcgZGF0YSBpcyBjb250aW51b3VzLi4uDQogICAgICAgICAgICAgICAgICAgICBzZWMuYXhpcyA9IHNlY19heGlzKH4uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTZWNvbmQgYXhpcyB0byBzaG93IHByb2JhYmlsaXRpZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gMTpsZW5ndGgocm9pcyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlYy55LmF4aXMubGFicykpICsNCiAgI3RoZW1lX3JpZGdlcyhmb250X3NpemUgPSBsYWJlbC5zaXplLCBncmlkID0gVFJVRSwgY2VudGVyX2F4aXNfbGFiZWxzID0gVFJVRSkgKyAgIyB0aGVtZSBpbmZvDQogICNnZ3RpdGxlKGdyYXBoLnRpdGxlKSsgDQogICN0aGVtZV9idygpICsjIGdyYXBoIHRpdGxlDQogI3RoZW1lX3JpZGdlcyhncmlkID0gRkFMU0UpICsgDQogIHRoZW1lKCAgIA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICNwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleSIpLCANCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gdGl0bGUuc2l6ZSksICAgICAgICAgICAgIyBwbG90IHRpdGxlIHNpemUgYW5kIHBvc2l0aW9uDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT1sYWJlbC5zaXplKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5LWF4aXMgdGV4dCBzaXplDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheSIpLA0KICAgIGF4aXMudGV4dC55LnJpZ2h0ID0gZWxlbWVudF90ZXh0KHNpemUgPSBsYWJlbC5zaXplKSwgICAgICAgICAgICAgICAgICAjIHktYXhpcyBpbmZvIGZvciByaWdodCBheGlzDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHguYXhpcy5zaXplKSwNCiAgICAjcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDAsMCksICJjbSIpLA0KICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLnRpdGxlLmFsaWduID0gNSkrDQogIGd1aWRlcyhzaGFwZSA9IGd1aWRlX2xlZ2VuZChsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUucG9zaXRvbiA9ICJib3R0b20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUudmp1c3QgPSAwLjQpKSArICAgICAgICAgIA0KICBsYWJzKA0KICAgIHggPSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIG9yIG5vdCBhZGQgWCBhbmQgWSBsYWJlbHMNCiAgICB5ID0gTlVMTCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0geC5sYWJzLnBvcywgbGFiZWxzID0gYyh4LmF4aXMubGFicykpDQoNCiNnZ3NhdmUoZmlsZSA9IHBhc3RlMChzdHJzcGxpdCh0eXBlLCcuUkRhdGEnKSwiLmpwZyIsIHNlcD0iIiksIHdpZHRoPTQuNSwgaGVpZ2h0PTMsIHVuaXRzID0gImluIiwgZHBpID0gOTAwKQ0KDQojIHByZXZpZXcgd2lsbCBsb29rIHNtb29zaGVkLCBiZSBzdXJlIHRvIGxvb2sgYXQgdGhlIHNhdmVkIC5qcGcgYmVmb3JlIG1ha2luZyBhbnkgY2hhbmdlcyB0byB0ZXh0IHNpemUsIGV0YyENCiNncmFwaA0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg==