library(readxl)
library(ggplot2)
library(CGPfunctions)
library(ggplot2)
library(plotly)
library(lmtest)
#Definir directorio
setwd("G:/TRABAJO/CONSULTORIAS/TRABAJOS VARIOS/JORGE CHAVARRIA/analisis2")
data1 = read_excel("Bicuspid.xlsx")
head(data1,5)

ANALISIS RELATIVE STENT EXPANSION

# Función para agregar coeficientes de correlación
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...) {
    usr <- par("usr")
    on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    Cor <- abs(cor(x, y)) # Elimina la función abs si lo prefieres
    txt <- paste0(prefix, format(c(Cor, 0.123456789), digits = digits)[1])
    if(missing(cex.cor)) {
        cex.cor <- 0.4 / strwidth(txt)
    }
    text(0.5, 0.5, txt,
         cex = 1 + cex.cor * Cor) # Escala el texto al nivel de correlación
}
#Matriz de Correlación Respecto a  Relative Stent Expansion
pairs(~ RelativeStentExpansion + MaxSinAnnDcalc + MinSinusAnnDcalc + CCV, 
        upper.panel = panel.cor,
        lower.panel = panel.smooth,data = data1)
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter

#Relacion entre Maximum Sinus Diameter Indexed vs Relative Stent Expansion %
g1=ggplot(data=data1,mapping=
            aes(x=MaxSinAnnDcalc,y=RelativeStentExpansion,))+geom_point()+theme_bw()+
            geom_smooth(method = "lm") 

g1 +  labs(title = "Relative Stent Expansion % vs Maximum Sinus Diameter Indexed",
           x = "Maximum Sinus Diameter Indexed",
           y= "Relative Stent Expansion %") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre Minimun Sinus Diameter Indexed vs Relative Stent Expansion %
g2=ggplot(data=data1,mapping=
            aes(x=MinSinusAnnDcalc,y=RelativeStentExpansion,))+geom_point()+theme_bw()+
            geom_smooth(method = "lm") 

g2 +  labs(title = "Relative Stent Expansion % vs Minimun Sinus Diameter Indexed",
           x = "Minimun Sinus Diameter Indexed",
           y= "Relative Stent Expansion %") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre CONTRAST CALCIUM VOLUME vs Relative Stent Expansion %
g3=ggplot(data=data1,mapping=
            aes(x=CCV,y=RelativeStentExpansion,))+geom_point()+theme_bw()+
            geom_smooth(method = "lm") 

g3 +  labs(title = "Relative Stent Expansion % vs Contrast Calcium Volume",
           x = "Contrast Calcium Volume",
           y= "Relative Stent Expansion %") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre Postdilatation vs Relative Stent Expansion %
boxplot(data1$RelativeStentExpansion~data1$Postdilation,
        xlab = 'Postdilation',
        ylab = 'Relative Stent Expansion %',
        title=('Postdilatation vs Relative Stent Expansion %'),
          col= 'bisque')

ggplot(data = data1) + geom_density(aes(x=RelativeStentExpansion,fill=factor(Postdilation)),
                                    bins=10, position = "identity",alpha = 0.5)
Warning: Ignoring unknown parameters: bins

#Relacion entre Raphe Calcification vs Relative Stent Expansion %
boxplot(data1$RelativeStentExpansion~data1$Raphaecalcification,
        xlab = 'Raphae Calcification',
        ylab = 'Relative Stent Expansion %',
        title=('Raphae Calcification vs Relative Stent Expansion %'),
          col= 'ivory')

ggplot(data = data1) + geom_density(aes(x=RelativeStentExpansion,fill=factor(Raphaecalcification)),
                                    bins=10, position = "identity",alpha = 0.5)
Warning: Ignoring unknown parameters: bins

#Relacion entre AVAi vs Relative Stent Expansion %
g4=ggplot(data=data1,mapping=
            aes(x=AVAi,y=RelativeStentExpansion,))+geom_point()+theme_bw()+
            geom_smooth(method = "lm") 

g4 +  labs(title = "Relative Stent Expansion % vs AVAi",
           x = "AVAi",
           y= "Relative Stent Expansion %") 
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 26 rows containing non-finite values (stat_smooth).
Warning: Removed 26 rows containing missing values (geom_point).

#Relacion entre Mean Gradient (mmHg) vs Relative Stent Expansion %
g5=ggplot(data=data1,mapping=
            aes(x=MeanGradientmmHg,y=RelativeStentExpansion,))+geom_point()+theme_bw()+
            geom_smooth(method = "lm") 

g5 +  labs(title = "Relative Stent Expansion % vs Mean Gradient (mmHg)",
           x = "Mean Gradient (mmHg)",
           y= "Relative Stent Expansion %") 
`geom_smooth()` using formula 'y ~ x'

#Regresion inicial
mod1=lm(RelativeStentExpansion ~ MaxSinAnnDcalc + MinSinusAnnDcalc + Postdilation +CCV + Raphaecalcification,
        data = data1)
summary(mod1)

Call:
lm(formula = RelativeStentExpansion ~ MaxSinAnnDcalc + MinSinusAnnDcalc + 
    Postdilation + CCV + Raphaecalcification, data = data1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.096436 -0.011235  0.003484  0.019744  0.066353 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)          8.499e-01  4.013e-02  21.178  < 2e-16 ***
MaxSinAnnDcalc      -5.700e-03  3.044e-02  -0.187 0.851864    
MinSinusAnnDcalc     4.679e-02  3.740e-02   1.251 0.213979    
Postdilation         2.651e-02  7.364e-03   3.600 0.000508 ***
CCV                  3.406e-06  5.278e-06   0.645 0.520271    
Raphaecalcification -4.582e-03  6.782e-03  -0.676 0.500935    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.03043 on 95 degrees of freedom
Multiple R-squared:  0.1468,    Adjusted R-squared:  0.1019 
F-statistic:  3.27 on 5 and 95 DF,  p-value: 0.009087
#Modelo binario
mod2 <- glm(RSEcalc ~ MaxSinAnnDcalc + MinSinusAnnDcalc + 
    Postdilation + CCV + Raphaecalcification,
                data = data1, family = "binomial")
summary(mod2)

Call:
glm(formula = RSEcalc ~ MaxSinAnnDcalc + MinSinusAnnDcalc + Postdilation + 
    CCV + Raphaecalcification, family = "binomial", data = data1)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9256  -1.2399   0.5795   1.0343   1.2307  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)  
(Intercept)         -2.5695037  3.0095653  -0.854    0.393  
MaxSinAnnDcalc       0.6706370  2.1665003   0.310    0.757  
MinSinusAnnDcalc     1.5877584  2.6703586   0.595    0.552  
Postdilation         1.5656236  0.6674808   2.346    0.019 *
CCV                 -0.0001900  0.0003786  -0.502    0.616  
Raphaecalcification  0.2157918  0.4809451   0.449    0.654  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 132.71  on 100  degrees of freedom
Residual deviance: 123.99  on  95  degrees of freedom
AIC: 135.99

Number of Fisher Scoring iterations: 4

ANALISIS Ellipticity

#Matriz de Correlación Respecto a  Relative Stent Expansion
pairs(~ Ellipticity + MaxSinAnnDcalc + MinSinusAnnDcalc + CCV, 
        upper.panel = panel.cor,
        lower.panel = panel.smooth,data = data1)
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter
Warning in par(usr) : argument 1 does not name a graphical parameter

#Relacion entre Maximum Sinus Diameter Indexed vs Ellipticity
g6=ggplot(data=data1,mapping=
            aes(x=MaxSinAnnDcalc,y=Ellipticity,))+geom_point()+theme_bw()+
            geom_smooth(method="lm") 

g6 +  labs(title = "Ellipticity vs Maximum Sinus Diameter Indexed",
           x = "Maximum Sinus Diameter Indexed",
           y= "Ellipticity") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre Minimun Sinus Diameter Indexed vs Ellipticity
g7=ggplot(data=data1,mapping=
            aes(x=MinSinusAnnDcalc,y=Ellipticity,))+geom_point()+theme_bw()+
            geom_smooth(method="lm") 

g7 +  labs(title = "Ellipticity vs Minimun Sinus Diameter Indexed",
           x = "Minimun Sinus Diameter Indexed",
           y= "Ellipticity") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre CONTRAST CALCIUM VOLUME vs Ellipticity
g8=ggplot(data=data1,mapping=
            aes(x=CCV,y=Ellipticity,))+geom_point()+theme_bw()+
            geom_smooth(method="lm") 

g8 +  labs(title = "Ellipticity vs Contrast Calcium Volume",
           x = "",
           y= "Ellipticity") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre AVAi vs Ellipticity
g9=ggplot(data=data1,mapping=
            aes(x=AVAi,y=Ellipticity,))+geom_point()+theme_bw()+
            geom_smooth(method="lm") 

g9 +  labs(title = "Ellipticity vs AVAi",
           x = "AVAi",
           y= "Ellipticity") 
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 26 rows containing non-finite values (stat_smooth).
Warning: Removed 26 rows containing missing values (geom_point).

#Relacion entre Mean Gradient (mmHg) vs Ellipticity
g10=ggplot(data=data1,mapping=
            aes(x=MeanGradientmmHg,y=Ellipticity,))+geom_point()+theme_bw()+
            geom_smooth(method="lm") 

g10 +  labs(title = "Ellipticity vs Mean Gradient (mmHg)",
           x = "Mean Gradient (mmHg)",
           y= "Ellipticity") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre Postdilatation vs Ellipticity
boxplot(data1$Ellipticity~data1$Postdilation,
        xlab = 'Postdilation',
        ylab = 'Ellipticity',
        title=('Postdilatation vs Ellipticity'),
          col= 'bisque')

ggplot(data = data1) + geom_density(aes(x=Ellipticity,fill=factor(Postdilation)),
                                    bins=10, position = "identity",alpha = 0.5)
Warning: Ignoring unknown parameters: bins

#Relacion entre Raphe Calcification vs Ellipticity
boxplot(data1$Ellipticity~data1$Raphaecalcification,
        xlab = 'Raphae Calcification',
        ylab = 'Ellipticity',
        title=('Raphae Calcification vs Ellipticity'),
          col= 'ivory')

ggplot(data = data1) + geom_density(aes(x=Ellipticity,fill=factor(Raphaecalcification)),
                                    bins=10, position = "identity",alpha = 0.5)
Warning: Ignoring unknown parameters: bins

#Regresion inicial
mod3=lm(Ellipticity ~ MaxSinAnnDcalc + MinSinusAnnDcalc + Postdilation +CCV + Raphaecalcification,
        data = data1)
summary(mod3)

Call:
lm(formula = Ellipticity ~ MaxSinAnnDcalc + MinSinusAnnDcalc + 
    Postdilation + CCV + Raphaecalcification, data = data1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.074869 -0.032489 -0.001692  0.022949  0.107501 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)          1.069e+00  5.200e-02  20.563   <2e-16 ***
MaxSinAnnDcalc      -1.618e-02  3.944e-02  -0.410   0.6827    
MinSinusAnnDcalc     3.080e-02  4.846e-02   0.636   0.5266    
Postdilation        -1.026e-02  9.541e-03  -1.075   0.2851    
CCV                  3.804e-06  6.839e-06   0.556   0.5793    
Raphaecalcification  1.522e-02  8.788e-03   1.732   0.0865 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.03943 on 95 degrees of freedom
Multiple R-squared:  0.06378,   Adjusted R-squared:  0.01451 
F-statistic: 1.294 on 5 and 95 DF,  p-value: 0.2729
#Modelo binario
mod4 <- glm(Ellipticitycalc ~ MaxSinAnnDcalc + MinSinusAnnDcalc + 
    Postdilation + CCV + Raphaecalcification,
                data = data1, family = "binomial")
summary(mod4)

Call:
glm(formula = Ellipticitycalc ~ MaxSinAnnDcalc + MinSinusAnnDcalc + 
    Postdilation + CCV + Raphaecalcification, family = "binomial", 
    data = data1)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.4406  -1.0762  -0.8559   1.1592   1.5535  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)
(Intercept)          2.795e+00  2.739e+00   1.021    0.307
MaxSinAnnDcalc      -4.545e-01  2.061e+00  -0.221    0.825
MinSinusAnnDcalc    -2.122e+00  2.534e+00  -0.838    0.402
Postdilation        -4.690e-01  5.048e-01  -0.929    0.353
CCV                  6.213e-05  3.594e-04   0.173    0.863
Raphaecalcification  5.670e-01  4.601e-01   1.232    0.218

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 139.53  on 100  degrees of freedom
Residual deviance: 134.98  on  95  degrees of freedom
AIC: 146.98

Number of Fisher Scoring iterations: 4

Mean gradient analysis

#Relacion entre Mean gradient analysis vs RSE calc
boxplot(data1$MeanGradientmmHg~data1$RSEcalc,
        xlab = 'Relative Stent Expansion >90%',
        ylab = 'Mean Gradient (mmHg)',
        title=('Mean Gradient (mmHg) vs Relative Stent Expansion >90%'),
          col= '#87CEFA')

ggplot(data = data1) + geom_density(aes(x=MeanGradientmmHg,fill=factor(RSEcalc)),
                                    bins=10, position = "identity",alpha = 0.5)
Warning: Ignoring unknown parameters: bins

#Relacion entre Mean Gradient (mmHg) vs Relative Stent Expansion %
g11=ggplot(data=data1,mapping=
            aes(x=MeanGradientmmHg,y=RelativeStentExpansion,))+
            geom_point(aes(colour = factor(Postdilation))) +theme_bw()+ 
            geom_smooth(method = "lm", color="#838B8B", linetype="dashed", fill="#EEEEE0") +
            scale_color_manual(values=c('#0000FF','#FF3030'))

g11 +  labs(title = "Relative Stent Expansion % vs Mean Gradient (mmHg)",
           x = "Mean Gradient (mmHg)",
           y= "Relative Stent Expansion %") 
`geom_smooth()` using formula 'y ~ x'

#Relacion entre Mean gradient analysis vs Ellipticity calc
boxplot(data1$MeanGradientmmHg~data1$Ellipticitycalc,
        xlab = 'Ellipticity >1.1',
        ylab = 'Mean Gradient (mmHg)',
        title=('Mean Gradient (mmHg) vs Ellipticity >1.1'),
          col= '#836FFF')

ggplot(data = data1) + geom_density(aes(x=MeanGradientmmHg,fill=factor(Ellipticitycalc)),
                                    bins=10, position = "identity",alpha = 0.5)
Warning: Ignoring unknown parameters: bins

#Relacion entre Mean Gradient (mmHg) vs Ellipticity
g12=ggplot(data=data1,mapping=
            aes(x=MeanGradientmmHg,y=Ellipticity,))+
            geom_point(aes(colour = factor(Postdilation))) +theme_bw()+ 
            geom_smooth(method = "lm", color="#838B8B", linetype="dashed", fill="#EEEEE0") +
            scale_color_manual(values=c('#0000FF','#FF3030'))

g12 +  labs(title = "Ellipticity vs Mean Gradient (mmHg)",
           x = "Mean Gradient (mmHg)",
           y= "Ellipticity") 
`geom_smooth()` using formula 'y ~ x'

LS0tDQp0aXRsZTogIkJpY3VzcGlkIg0KYXV0aG9yOiAiSnVhbiBQYWJsbyBHb21leiBCcmF2byINCmRhdGU6ICIxMi8xMi8yMDIyIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoQ0dQZnVuY3Rpb25zKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGxtdGVzdCkNCmBgYA0KDQpgYGB7cn0NCiNEZWZpbmlyIGRpcmVjdG9yaW8NCnNldHdkKCJHOi9UUkFCQUpPL0NPTlNVTFRPUklBUy9UUkFCQUpPUyBWQVJJT1MvSk9SR0UgQ0hBVkFSUklBL2FuYWxpc2lzMiIpDQpgYGANCg0KYGBge3J9DQpkYXRhMSA9IHJlYWRfZXhjZWwoIkJpY3VzcGlkLnhsc3giKQ0KaGVhZChkYXRhMSw1KQ0KYGBgDQoqKipBTkFMSVNJUyBSRUxBVElWRSBTVEVOVCBFWFBBTlNJT04qKioNCg0KDQpgYGB7cn0NCiMgRnVuY2nDs24gcGFyYSBhZ3JlZ2FyIGNvZWZpY2llbnRlcyBkZSBjb3JyZWxhY2nDs24NCnBhbmVsLmNvciA8LSBmdW5jdGlvbih4LCB5LCBkaWdpdHMgPSAyLCBwcmVmaXggPSAiIiwgY2V4LmNvciwgLi4uKSB7DQogICAgdXNyIDwtIHBhcigidXNyIikNCiAgICBvbi5leGl0KHBhcih1c3IpKQ0KICAgIHBhcih1c3IgPSBjKDAsIDEsIDAsIDEpKQ0KICAgIENvciA8LSBhYnMoY29yKHgsIHkpKSAjIEVsaW1pbmEgbGEgZnVuY2nDs24gYWJzIHNpIGxvIHByZWZpZXJlcw0KICAgIHR4dCA8LSBwYXN0ZTAocHJlZml4LCBmb3JtYXQoYyhDb3IsIDAuMTIzNDU2Nzg5KSwgZGlnaXRzID0gZGlnaXRzKVsxXSkNCiAgICBpZihtaXNzaW5nKGNleC5jb3IpKSB7DQogICAgICAgIGNleC5jb3IgPC0gMC40IC8gc3Ryd2lkdGgodHh0KQ0KICAgIH0NCiAgICB0ZXh0KDAuNSwgMC41LCB0eHQsDQogICAgICAgICBjZXggPSAxICsgY2V4LmNvciAqIENvcikgIyBFc2NhbGEgZWwgdGV4dG8gYWwgbml2ZWwgZGUgY29ycmVsYWNpw7NuDQp9DQpgYGANCg0KDQpgYGB7cn0NCiNNYXRyaXogZGUgQ29ycmVsYWNpw7NuIFJlc3BlY3RvIGEgIFJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbg0KcGFpcnMofiBSZWxhdGl2ZVN0ZW50RXhwYW5zaW9uICsgTWF4U2luQW5uRGNhbGMgKyBNaW5TaW51c0FubkRjYWxjICsgQ0NWLCANCiAgICAgICAgdXBwZXIucGFuZWwgPSBwYW5lbC5jb3IsDQogICAgICAgIGxvd2VyLnBhbmVsID0gcGFuZWwuc21vb3RoLGRhdGEgPSBkYXRhMSkNCmBgYA0KDQoNCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIE1heGltdW0gU2ludXMgRGlhbWV0ZXIgSW5kZXhlZCB2cyBSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJQ0KZzE9Z2dwbG90KGRhdGE9ZGF0YTEsbWFwcGluZz0NCiAgICAgICAgICAgIGFlcyh4PU1heFNpbkFubkRjYWxjLHk9UmVsYXRpdmVTdGVudEV4cGFuc2lvbiwpKStnZW9tX3BvaW50KCkrdGhlbWVfYncoKSsNCiAgICAgICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpIA0KDQpnMSArICBsYWJzKHRpdGxlID0gIlJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlIHZzIE1heGltdW0gU2ludXMgRGlhbWV0ZXIgSW5kZXhlZCIsDQogICAgICAgICAgIHggPSAiTWF4aW11bSBTaW51cyBEaWFtZXRlciBJbmRleGVkIiwNCiAgICAgICAgICAgeT0gIlJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlIikgDQpgYGANCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIE1pbmltdW4gU2ludXMgRGlhbWV0ZXIgSW5kZXhlZCB2cyBSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJQ0KZzI9Z2dwbG90KGRhdGE9ZGF0YTEsbWFwcGluZz0NCiAgICAgICAgICAgIGFlcyh4PU1pblNpbnVzQW5uRGNhbGMseT1SZWxhdGl2ZVN0ZW50RXhwYW5zaW9uLCkpK2dlb21fcG9pbnQoKSt0aGVtZV9idygpKw0KICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgDQoNCmcyICsgIGxhYnModGl0bGUgPSAiUmVsYXRpdmUgU3RlbnQgRXhwYW5zaW9uICUgdnMgTWluaW11biBTaW51cyBEaWFtZXRlciBJbmRleGVkIiwNCiAgICAgICAgICAgeCA9ICJNaW5pbXVuIFNpbnVzIERpYW1ldGVyIEluZGV4ZWQiLA0KICAgICAgICAgICB5PSAiUmVsYXRpdmUgU3RlbnQgRXhwYW5zaW9uICUiKSANCg0KYGBgDQpgYGB7cn0NCiNSZWxhY2lvbiBlbnRyZSBDT05UUkFTVCBDQUxDSVVNIFZPTFVNRSB2cyBSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJQ0KZzM9Z2dwbG90KGRhdGE9ZGF0YTEsbWFwcGluZz0NCiAgICAgICAgICAgIGFlcyh4PUNDVix5PVJlbGF0aXZlU3RlbnRFeHBhbnNpb24sKSkrZ2VvbV9wb2ludCgpK3RoZW1lX2J3KCkrDQogICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSANCg0KZzMgKyAgbGFicyh0aXRsZSA9ICJSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJSB2cyBDb250cmFzdCBDYWxjaXVtIFZvbHVtZSIsDQogICAgICAgICAgIHggPSAiQ29udHJhc3QgQ2FsY2l1bSBWb2x1bWUiLA0KICAgICAgICAgICB5PSAiUmVsYXRpdmUgU3RlbnQgRXhwYW5zaW9uICUiKSANCmBgYA0KDQpgYGB7cn0NCiNSZWxhY2lvbiBlbnRyZSBQb3N0ZGlsYXRhdGlvbiB2cyBSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJQ0KYm94cGxvdChkYXRhMSRSZWxhdGl2ZVN0ZW50RXhwYW5zaW9ufmRhdGExJFBvc3RkaWxhdGlvbiwNCiAgICAgICAgeGxhYiA9ICdQb3N0ZGlsYXRpb24nLA0KICAgICAgICB5bGFiID0gJ1JlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlJywNCiAgICAgICAgdGl0bGU9KCdQb3N0ZGlsYXRhdGlvbiB2cyBSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJScpLA0KICAgICAgICAgIGNvbD0gJ2Jpc3F1ZScpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGRhdGExKSArIGdlb21fZGVuc2l0eShhZXMoeD1SZWxhdGl2ZVN0ZW50RXhwYW5zaW9uLGZpbGw9ZmFjdG9yKFBvc3RkaWxhdGlvbikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucz0xMCwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLGFscGhhID0gMC41KQ0KYGBgDQoNCg0KYGBge3J9DQojUmVsYWNpb24gZW50cmUgUmFwaGUgQ2FsY2lmaWNhdGlvbiB2cyBSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJQ0KYm94cGxvdChkYXRhMSRSZWxhdGl2ZVN0ZW50RXhwYW5zaW9ufmRhdGExJFJhcGhhZWNhbGNpZmljYXRpb24sDQogICAgICAgIHhsYWIgPSAnUmFwaGFlIENhbGNpZmljYXRpb24nLA0KICAgICAgICB5bGFiID0gJ1JlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlJywNCiAgICAgICAgdGl0bGU9KCdSYXBoYWUgQ2FsY2lmaWNhdGlvbiB2cyBSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJScpLA0KICAgICAgICAgIGNvbD0gJ2l2b3J5JykNCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGRhdGExKSArIGdlb21fZGVuc2l0eShhZXMoeD1SZWxhdGl2ZVN0ZW50RXhwYW5zaW9uLGZpbGw9ZmFjdG9yKFJhcGhhZWNhbGNpZmljYXRpb24pKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnM9MTAsIHBvc2l0aW9uID0gImlkZW50aXR5IixhbHBoYSA9IDAuNSkNCmBgYA0KDQpgYGB7cn0NCiNSZWxhY2lvbiBlbnRyZSBBVkFpIHZzIFJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlDQpnND1nZ3Bsb3QoZGF0YT1kYXRhMSxtYXBwaW5nPQ0KICAgICAgICAgICAgYWVzKHg9QVZBaSx5PVJlbGF0aXZlU3RlbnRFeHBhbnNpb24sKSkrZ2VvbV9wb2ludCgpK3RoZW1lX2J3KCkrDQogICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSANCg0KZzQgKyAgbGFicyh0aXRsZSA9ICJSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJSB2cyBBVkFpIiwNCiAgICAgICAgICAgeCA9ICJBVkFpIiwNCiAgICAgICAgICAgeT0gIlJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlIikgDQpgYGANCg0KDQoNCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIE1lYW4gR3JhZGllbnQgKG1tSGcpIHZzIFJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlDQpnNT1nZ3Bsb3QoZGF0YT1kYXRhMSxtYXBwaW5nPQ0KICAgICAgICAgICAgYWVzKHg9TWVhbkdyYWRpZW50bW1IZyx5PVJlbGF0aXZlU3RlbnRFeHBhbnNpb24sKSkrZ2VvbV9wb2ludCgpK3RoZW1lX2J3KCkrDQogICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSANCg0KZzUgKyAgbGFicyh0aXRsZSA9ICJSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJSB2cyBNZWFuIEdyYWRpZW50IChtbUhnKSIsDQogICAgICAgICAgIHggPSAiTWVhbiBHcmFkaWVudCAobW1IZykiLA0KICAgICAgICAgICB5PSAiUmVsYXRpdmUgU3RlbnQgRXhwYW5zaW9uICUiKSANCmBgYA0KDQoNCmBgYHtyfQ0KI1JlZ3Jlc2lvbiBpbmljaWFsDQptb2QxPWxtKFJlbGF0aXZlU3RlbnRFeHBhbnNpb24gfiBNYXhTaW5Bbm5EY2FsYyArIE1pblNpbnVzQW5uRGNhbGMgKyBQb3N0ZGlsYXRpb24gK0NDViArIFJhcGhhZWNhbGNpZmljYXRpb24sDQogICAgICAgIGRhdGEgPSBkYXRhMSkNCnN1bW1hcnkobW9kMSkNCmBgYA0KYGBge3J9DQojTW9kZWxvIGJpbmFyaW8NCm1vZDIgPC0gZ2xtKFJTRWNhbGMgfiBNYXhTaW5Bbm5EY2FsYyArIE1pblNpbnVzQW5uRGNhbGMgKyANCiAgICBQb3N0ZGlsYXRpb24gKyBDQ1YgKyBSYXBoYWVjYWxjaWZpY2F0aW9uLA0KICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhMSwgZmFtaWx5ID0gImJpbm9taWFsIikNCnN1bW1hcnkobW9kMikNCmBgYA0KDQoqKipBTkFMSVNJUyBFbGxpcHRpY2l0eSoqKg0KDQpgYGB7cn0NCiNNYXRyaXogZGUgQ29ycmVsYWNpw7NuIFJlc3BlY3RvIGEgIFJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbg0KcGFpcnMofiBFbGxpcHRpY2l0eSArIE1heFNpbkFubkRjYWxjICsgTWluU2ludXNBbm5EY2FsYyArIENDViwgDQogICAgICAgIHVwcGVyLnBhbmVsID0gcGFuZWwuY29yLA0KICAgICAgICBsb3dlci5wYW5lbCA9IHBhbmVsLnNtb290aCxkYXRhID0gZGF0YTEpDQpgYGANCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIE1heGltdW0gU2ludXMgRGlhbWV0ZXIgSW5kZXhlZCB2cyBFbGxpcHRpY2l0eQ0KZzY9Z2dwbG90KGRhdGE9ZGF0YTEsbWFwcGluZz0NCiAgICAgICAgICAgIGFlcyh4PU1heFNpbkFubkRjYWxjLHk9RWxsaXB0aWNpdHksKSkrZ2VvbV9wb2ludCgpK3RoZW1lX2J3KCkrDQogICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgDQoNCmc2ICsgIGxhYnModGl0bGUgPSAiRWxsaXB0aWNpdHkgdnMgTWF4aW11bSBTaW51cyBEaWFtZXRlciBJbmRleGVkIiwNCiAgICAgICAgICAgeCA9ICJNYXhpbXVtIFNpbnVzIERpYW1ldGVyIEluZGV4ZWQiLA0KICAgICAgICAgICB5PSAiRWxsaXB0aWNpdHkiKSANCmBgYA0KDQpgYGB7cn0NCiNSZWxhY2lvbiBlbnRyZSBNaW5pbXVuIFNpbnVzIERpYW1ldGVyIEluZGV4ZWQgdnMgRWxsaXB0aWNpdHkNCmc3PWdncGxvdChkYXRhPWRhdGExLG1hcHBpbmc9DQogICAgICAgICAgICBhZXMoeD1NaW5TaW51c0FubkRjYWxjLHk9RWxsaXB0aWNpdHksKSkrZ2VvbV9wb2ludCgpK3RoZW1lX2J3KCkrDQogICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgDQoNCmc3ICsgIGxhYnModGl0bGUgPSAiRWxsaXB0aWNpdHkgdnMgTWluaW11biBTaW51cyBEaWFtZXRlciBJbmRleGVkIiwNCiAgICAgICAgICAgeCA9ICJNaW5pbXVuIFNpbnVzIERpYW1ldGVyIEluZGV4ZWQiLA0KICAgICAgICAgICB5PSAiRWxsaXB0aWNpdHkiKSANCmBgYA0KDQpgYGB7cn0NCiNSZWxhY2lvbiBlbnRyZSBDT05UUkFTVCBDQUxDSVVNIFZPTFVNRSB2cyBFbGxpcHRpY2l0eQ0KZzg9Z2dwbG90KGRhdGE9ZGF0YTEsbWFwcGluZz0NCiAgICAgICAgICAgIGFlcyh4PUNDVix5PUVsbGlwdGljaXR5LCkpK2dlb21fcG9pbnQoKSt0aGVtZV9idygpKw0KICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpIA0KDQpnOCArICBsYWJzKHRpdGxlID0gIkVsbGlwdGljaXR5IHZzIENvbnRyYXN0IENhbGNpdW0gVm9sdW1lIiwNCiAgICAgICAgICAgeCA9ICIiLA0KICAgICAgICAgICB5PSAiRWxsaXB0aWNpdHkiKSANCmBgYA0KDQpgYGB7cn0NCiNSZWxhY2lvbiBlbnRyZSBBVkFpIHZzIEVsbGlwdGljaXR5DQpnOT1nZ3Bsb3QoZGF0YT1kYXRhMSxtYXBwaW5nPQ0KICAgICAgICAgICAgYWVzKHg9QVZBaSx5PUVsbGlwdGljaXR5LCkpK2dlb21fcG9pbnQoKSt0aGVtZV9idygpKw0KICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpIA0KDQpnOSArICBsYWJzKHRpdGxlID0gIkVsbGlwdGljaXR5IHZzIEFWQWkiLA0KICAgICAgICAgICB4ID0gIkFWQWkiLA0KICAgICAgICAgICB5PSAiRWxsaXB0aWNpdHkiKSANCmBgYA0KDQpgYGB7cn0NCiNSZWxhY2lvbiBlbnRyZSBNZWFuIEdyYWRpZW50IChtbUhnKSB2cyBFbGxpcHRpY2l0eQ0KZzEwPWdncGxvdChkYXRhPWRhdGExLG1hcHBpbmc9DQogICAgICAgICAgICBhZXMoeD1NZWFuR3JhZGllbnRtbUhnLHk9RWxsaXB0aWNpdHksKSkrZ2VvbV9wb2ludCgpK3RoZW1lX2J3KCkrDQogICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgDQoNCmcxMCArICBsYWJzKHRpdGxlID0gIkVsbGlwdGljaXR5IHZzIE1lYW4gR3JhZGllbnQgKG1tSGcpIiwNCiAgICAgICAgICAgeCA9ICJNZWFuIEdyYWRpZW50IChtbUhnKSIsDQogICAgICAgICAgIHk9ICJFbGxpcHRpY2l0eSIpIA0KYGBgDQoNCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIFBvc3RkaWxhdGF0aW9uIHZzIEVsbGlwdGljaXR5DQpib3hwbG90KGRhdGExJEVsbGlwdGljaXR5fmRhdGExJFBvc3RkaWxhdGlvbiwNCiAgICAgICAgeGxhYiA9ICdQb3N0ZGlsYXRpb24nLA0KICAgICAgICB5bGFiID0gJ0VsbGlwdGljaXR5JywNCiAgICAgICAgdGl0bGU9KCdQb3N0ZGlsYXRhdGlvbiB2cyBFbGxpcHRpY2l0eScpLA0KICAgICAgICAgIGNvbD0gJ2Jpc3F1ZScpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBkYXRhMSkgKyBnZW9tX2RlbnNpdHkoYWVzKHg9RWxsaXB0aWNpdHksZmlsbD1mYWN0b3IoUG9zdGRpbGF0aW9uKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zPTEwLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsYWxwaGEgPSAwLjUpDQpgYGANCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIFJhcGhlIENhbGNpZmljYXRpb24gdnMgRWxsaXB0aWNpdHkNCmJveHBsb3QoZGF0YTEkRWxsaXB0aWNpdHl+ZGF0YTEkUmFwaGFlY2FsY2lmaWNhdGlvbiwNCiAgICAgICAgeGxhYiA9ICdSYXBoYWUgQ2FsY2lmaWNhdGlvbicsDQogICAgICAgIHlsYWIgPSAnRWxsaXB0aWNpdHknLA0KICAgICAgICB0aXRsZT0oJ1JhcGhhZSBDYWxjaWZpY2F0aW9uIHZzIEVsbGlwdGljaXR5JyksDQogICAgICAgICAgY29sPSAnaXZvcnknKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChkYXRhID0gZGF0YTEpICsgZ2VvbV9kZW5zaXR5KGFlcyh4PUVsbGlwdGljaXR5LGZpbGw9ZmFjdG9yKFJhcGhhZWNhbGNpZmljYXRpb24pKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnM9MTAsIHBvc2l0aW9uID0gImlkZW50aXR5IixhbHBoYSA9IDAuNSkNCmBgYA0KYGBge3J9DQojUmVncmVzaW9uIGluaWNpYWwNCm1vZDM9bG0oRWxsaXB0aWNpdHkgfiBNYXhTaW5Bbm5EY2FsYyArIE1pblNpbnVzQW5uRGNhbGMgKyBQb3N0ZGlsYXRpb24gK0NDViArIFJhcGhhZWNhbGNpZmljYXRpb24sDQogICAgICAgIGRhdGEgPSBkYXRhMSkNCnN1bW1hcnkobW9kMykNCmBgYA0KYGBge3J9DQojTW9kZWxvIGJpbmFyaW8NCm1vZDQgPC0gZ2xtKEVsbGlwdGljaXR5Y2FsYyB+IE1heFNpbkFubkRjYWxjICsgTWluU2ludXNBbm5EY2FsYyArIA0KICAgIFBvc3RkaWxhdGlvbiArIENDViArIFJhcGhhZWNhbGNpZmljYXRpb24sDQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGExLCBmYW1pbHkgPSAiYmlub21pYWwiKQ0Kc3VtbWFyeShtb2Q0KQ0KYGBgDQoqKipNZWFuIGdyYWRpZW50IGFuYWx5c2lzKioqDQoNCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIE1lYW4gZ3JhZGllbnQgYW5hbHlzaXMgdnMgUlNFIGNhbGMNCmJveHBsb3QoZGF0YTEkTWVhbkdyYWRpZW50bW1IZ35kYXRhMSRSU0VjYWxjLA0KICAgICAgICB4bGFiID0gJ1JlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiA+OTAlJywNCiAgICAgICAgeWxhYiA9ICdNZWFuIEdyYWRpZW50IChtbUhnKScsDQogICAgICAgIHRpdGxlPSgnTWVhbiBHcmFkaWVudCAobW1IZykgdnMgUmVsYXRpdmUgU3RlbnQgRXhwYW5zaW9uID45MCUnKSwNCiAgICAgICAgICBjb2w9ICcjODdDRUZBJykNCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGRhdGExKSArIGdlb21fZGVuc2l0eShhZXMoeD1NZWFuR3JhZGllbnRtbUhnLGZpbGw9ZmFjdG9yKFJTRWNhbGMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnM9MTAsIHBvc2l0aW9uID0gImlkZW50aXR5IixhbHBoYSA9IDAuNSkNCmBgYA0KYGBge3J9DQojUmVsYWNpb24gZW50cmUgTWVhbiBHcmFkaWVudCAobW1IZykgdnMgUmVsYXRpdmUgU3RlbnQgRXhwYW5zaW9uICUNCmcxMT1nZ3Bsb3QoZGF0YT1kYXRhMSxtYXBwaW5nPQ0KICAgICAgICAgICAgYWVzKHg9TWVhbkdyYWRpZW50bW1IZyx5PVJlbGF0aXZlU3RlbnRFeHBhbnNpb24sKSkrDQogICAgICAgICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBmYWN0b3IoUG9zdGRpbGF0aW9uKSkpICt0aGVtZV9idygpKyANCiAgICAgICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yPSIjODM4QjhCIiwgbGluZXR5cGU9ImRhc2hlZCIsIGZpbGw9IiNFRUVFRTAiKSArDQogICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMwMDAwRkYnLCcjRkYzMDMwJykpDQoNCmcxMSArICBsYWJzKHRpdGxlID0gIlJlbGF0aXZlIFN0ZW50IEV4cGFuc2lvbiAlIHZzIE1lYW4gR3JhZGllbnQgKG1tSGcpIiwNCiAgICAgICAgICAgeCA9ICJNZWFuIEdyYWRpZW50IChtbUhnKSIsDQogICAgICAgICAgIHk9ICJSZWxhdGl2ZSBTdGVudCBFeHBhbnNpb24gJSIpIA0KYGBgDQoNCmBgYHtyfQ0KI1JlbGFjaW9uIGVudHJlIE1lYW4gZ3JhZGllbnQgYW5hbHlzaXMgdnMgRWxsaXB0aWNpdHkgY2FsYw0KYm94cGxvdChkYXRhMSRNZWFuR3JhZGllbnRtbUhnfmRhdGExJEVsbGlwdGljaXR5Y2FsYywNCiAgICAgICAgeGxhYiA9ICdFbGxpcHRpY2l0eSA+MS4xJywNCiAgICAgICAgeWxhYiA9ICdNZWFuIEdyYWRpZW50IChtbUhnKScsDQogICAgICAgIHRpdGxlPSgnTWVhbiBHcmFkaWVudCAobW1IZykgdnMgRWxsaXB0aWNpdHkgPjEuMScpLA0KICAgICAgICAgIGNvbD0gJyM4MzZGRkYnKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBkYXRhMSkgKyBnZW9tX2RlbnNpdHkoYWVzKHg9TWVhbkdyYWRpZW50bW1IZyxmaWxsPWZhY3RvcihFbGxpcHRpY2l0eWNhbGMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnM9MTAsIHBvc2l0aW9uID0gImlkZW50aXR5IixhbHBoYSA9IDAuNSkNCmBgYA0KYGBge3J9DQojUmVsYWNpb24gZW50cmUgTWVhbiBHcmFkaWVudCAobW1IZykgdnMgRWxsaXB0aWNpdHkNCmcxMj1nZ3Bsb3QoZGF0YT1kYXRhMSxtYXBwaW5nPQ0KICAgICAgICAgICAgYWVzKHg9TWVhbkdyYWRpZW50bW1IZyx5PUVsbGlwdGljaXR5LCkpKw0KICAgICAgICAgICAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gZmFjdG9yKFBvc3RkaWxhdGlvbikpKSArdGhlbWVfYncoKSsgDQogICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvcj0iIzgzOEI4QiIsIGxpbmV0eXBlPSJkYXNoZWQiLCBmaWxsPSIjRUVFRUUwIikgKw0KICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCcjMDAwMEZGJywnI0ZGMzAzMCcpKQ0KDQpnMTIgKyAgbGFicyh0aXRsZSA9ICJFbGxpcHRpY2l0eSB2cyBNZWFuIEdyYWRpZW50IChtbUhnKSIsDQogICAgICAgICAgIHggPSAiTWVhbiBHcmFkaWVudCAobW1IZykiLA0KICAgICAgICAgICB5PSAiRWxsaXB0aWNpdHkiKSANCmBgYA==