### Load library, functions 
source("C:/local_work_ming/workspaces/r_workspace/R_customized_global_functions/my_functional_scripts/my_global_functions.R")
source("C:/local_work_ming/workspaces/r_workspace/R_customized_global_functions/my_functional_scripts/my_libraries.R")
source("C:/local_work_ming/workspaces/r_workspace/R_customized_global_functions/my_functional_scripts/R_intergroup_diff_test_functions.R")
# Load the survival package
library(survival)
library(rms)

# Datensatz laden
data.path <- "C:/local_work_ming/workspaces/r_workspace/florian_scurt_data/data"

——- Old Risk Score + Univariate ———————————————–

old.uni.data <- read.xlsx(paste(data.path, "1 Masterdatei_Vasculitis Modell Alt Univariat.xlsx", sep = "/"), sheetIndex = 1)
names(old.uni.data) <- c("ID", "TimeToDialysis", "DialysisStatus", "OldRiskGroup")
old.uni.data$OldRiskGroup <- factor(old.uni.data$OldRiskGroup, levels = seq(1, 3, 1))
table(old.uni.data$OldRiskGroup)

 1  2  3 
50 70 44 
# Fit a Cox proportional hazards model
# Here, we use age and sex as predictors for the survival time of lung cancer patients
old_uni_cox_model <- coxph(Surv(TimeToDialysis, DialysisStatus) ~ OldRiskGroup, data = old.uni.data, id=ID)
print("---- Cox proportional hazards model -----------")
[1] "---- Cox proportional hazards model -----------"
print(old_uni_cox_model)
Call:
coxph(formula = Surv(TimeToDialysis, DialysisStatus) ~ OldRiskGroup, 
    data = old.uni.data, id = ID)

                 coef exp(coef) se(coef)     z        p
OldRiskGroup2  1.9683    7.1584   0.4754 4.141 3.47e-05
OldRiskGroup3  2.7448   15.5615   0.4900 5.602 2.12e-08

Likelihood ratio test=51.36  on 2 df, p=7.044e-12
n= 164, number of events= 75 
# Calculate Harrell's C-index using the concordance index function (concordance)
# The concordance function is part of the survival package and directly calculates the C-index
old_uni_c_index <- concordance(old_uni_cox_model)$concordance

# Print the C-index
print(paste("Old Risk Score + Univariate Harrell's C-index:", old_uni_c_index))
[1] "Old Risk Score + Univariate Harrell's C-index: 0.738438017581858"

——- New Risk Score + Univariate ———————————————–

new.uni.data <- read.xlsx(paste(data.path, "2 Masterdatei_Vasculitis Modell Neu Univariat.xlsx", sep = "/"), sheetIndex = 1)
names(new.uni.data) <- c("ID", "TimeToDialysis", "DialysisStatus", "NewRiskGroup")
new.uni.data$NewRiskGroup <- factor(new.uni.data$NewRiskGroup, levels = seq(1, 4, 1))
table(new.uni.data$NewRiskGroup)

 1  2  3  4 
51 55 46 12 
#head(new.uni.data)

# Fit a Cox proportional hazards model
# Here, we use age and sex as predictors for the survival time of lung cancer patients
new_uni_cox_model <- coxph(Surv(TimeToDialysis, DialysisStatus) ~ NewRiskGroup, data = new.uni.data, id=ID)
print("---- Cox proportional hazards model -----------")
[1] "---- Cox proportional hazards model -----------"
print(new_uni_cox_model)
Call:
coxph(formula = Surv(TimeToDialysis, DialysisStatus) ~ NewRiskGroup, 
    data = new.uni.data, id = ID)

                 coef exp(coef) se(coef)     z        p
NewRiskGroup2  1.0245    2.7858   0.4112 2.492   0.0127
NewRiskGroup3  2.1035    8.1951   0.3963 5.308 1.11e-07
NewRiskGroup4  2.4922   12.0882   0.4778 5.216 1.82e-07

Likelihood ratio test=49.25  on 3 df, p=1.153e-10
n= 164, number of events= 75 
# Calculate Harrell's C-index using the concordance index function (concordance)
# The concordance function is part of the survival package and directly calculates the C-index
new_uni_c_index <- concordance(new_uni_cox_model)$concordance

# Print the C-index
print(paste("New Risk Score + Univariate Harrell's C-index:", new_uni_c_index))
[1] "New Risk Score + Univariate Harrell's C-index: 0.753471779844566"

——- Old Risk Score + Multi-Variable ———————————————–

old.multi.data <- read.xlsx(paste(data.path, "3 Masterdatei_Vasculitis Modell Alt Multivariat.xlsx", sep = "/"), sheetIndex = 1)
names(old.multi.data) <- c("ID", "TimeToDialysis", "DialysisStatus", "OldRiskGroup", "CVD", "Anemia", "NephroticSyndrome", "Immunology_C3", "Blood_CrP", "IT_Plasmapheresis")
old.multi.data$OldRiskGroup <- factor(old.multi.data$OldRiskGroup, levels = seq(1, 3, 1))
table(old.multi.data$OldRiskGroup)

 1  2  3 
50 70 44 
old.multi.data$CVD <- factor(old.multi.data$CVD)
table(old.multi.data$CVD)

  0   1 
110  47 
old.multi.data$Anemia <- factor(old.multi.data$Anemia)
table(old.multi.data$Anemia)

 0  1 
80 76 
old.multi.data$NephroticSyndrome <- factor(old.multi.data$NephroticSyndrome)
table(old.multi.data$NephroticSyndrome)

  0   1 
120  44 
old.multi.data$IT_Plasmapheresis <- factor(old.multi.data$IT_Plasmapheresis)
table(old.multi.data$IT_Plasmapheresis)

  0   1 
121  43 
# Fit a Cox proportional hazards model
# Here, we use age and sex as predictors for the survival time of lung cancer patients
old_multi_cox_model <- coxph(Surv(TimeToDialysis, DialysisStatus) ~ OldRiskGroup+CVD+Anemia+NephroticSyndrome+Immunology_C3+Blood_CrP+IT_Plasmapheresis, data = old.multi.data, id=ID)
print("---- Cox proportional hazards model -----------")
[1] "---- Cox proportional hazards model -----------"
print(old_multi_cox_model)
Call:
coxph(formula = Surv(TimeToDialysis, DialysisStatus) ~ OldRiskGroup + 
    CVD + Anemia + NephroticSyndrome + Immunology_C3 + Blood_CrP + 
    IT_Plasmapheresis, data = old.multi.data, id = ID)

                        coef exp(coef)  se(coef)      z        p
OldRiskGroup2       2.061751  7.859720  0.540262  3.816 0.000136
OldRiskGroup3       2.489304 12.052885  0.558080  4.460 8.18e-06
CVD1                0.354267  1.425136  0.280692  1.262 0.206905
Anemia1             0.288055  1.333830  0.279548  1.030 0.302808
NephroticSyndrome1  0.939968  2.559900  0.267119  3.519 0.000433
Immunology_C3      -1.382202  0.251025  0.469297 -2.945 0.003227
Blood_CrP           0.004115  1.004123  0.001652  2.490 0.012768
IT_Plasmapheresis1  0.797814  2.220682  0.259226  3.078 0.002086

Likelihood ratio test=94.33  on 8 df, p=< 2.2e-16
n= 155, number of events= 71 
   (9 Beobachtungen als fehlend gelöscht)
# Calculate Harrell's C-index using the concordance index function (concordance)
# The concordance function is part of the survival package and directly calculates the C-index
old_multi_c_index <- concordance(old_multi_cox_model)$concordance

# Print the C-index
print(paste("Old Risk Score + Multi-Variable Harrell's C-index:", old_multi_c_index))
[1] "Old Risk Score + Multi-Variable Harrell's C-index: 0.838056680161943"

——- New Risk Score + Multi-Variable ———————————————–

new.multi.data <- read.xlsx(paste(data.path, "4 Masterdatei_Vasculitis Modell Neu Multivariat.xlsx", sep = "/"), sheetIndex = 1)
names(new.multi.data) <- c("ID", "TimeToDialysis", "DialysisStatus", "NewRiskGroup", "CVD", "Anemia", "NephroticSyndrome", "Immunology_C3", "Blood_CrP", "IT_Plasmapheresis")
new.multi.data$NewRiskGroup <- factor(new.multi.data$NewRiskGroup, levels = seq(1, 4, 1))
table(new.multi.data$NewRiskGroup)

 1  2  3  4 
51 55 46 12 
new.multi.data$CVD <- factor(new.multi.data$CVD)
table(new.multi.data$CVD)

  0   1 
110  47 
new.multi.data$Anemia <- factor(new.multi.data$Anemia)
table(new.multi.data$Anemia)

 0  1 
80 76 
new.multi.data$NephroticSyndrome <- factor(new.multi.data$NephroticSyndrome)
table(new.multi.data$NephroticSyndrome)

  0   1 
120  44 
new.multi.data$IT_Plasmapheresis <- factor(new.multi.data$IT_Plasmapheresis)
table(new.multi.data$IT_Plasmapheresis)

  0   1 
121  43 
#head(new.multi.data)

# Fit a Cox proportional hazards model
# Here, we use age and sex as predictors for the survival time of lung cancer patients
new_multi_cox_model <- coxph(Surv(TimeToDialysis, DialysisStatus) ~ NewRiskGroup+CVD+Anemia+NephroticSyndrome+Immunology_C3+Blood_CrP+IT_Plasmapheresis, data = new.multi.data, id=ID)
print("---- Cox proportional hazards model -----------")
[1] "---- Cox proportional hazards model -----------"
print(new_multi_cox_model)
Call:
coxph(formula = Surv(TimeToDialysis, DialysisStatus) ~ NewRiskGroup + 
    CVD + Anemia + NephroticSyndrome + Immunology_C3 + Blood_CrP + 
    IT_Plasmapheresis, data = new.multi.data, id = ID)

                        coef exp(coef)  se(coef)      z        p
NewRiskGroup2       0.674518  1.963087  0.418840  1.610 0.107301
NewRiskGroup3       1.530595  4.620924  0.417158  3.669 0.000243
NewRiskGroup4       2.150905  8.592629  0.528344  4.071 4.68e-05
CVD1                0.471371  1.602189  0.277868  1.696 0.089813
Anemia1             0.363665  1.438592  0.259338  1.402 0.160831
NephroticSyndrome1  0.888129  2.430578  0.269117  3.300 0.000966
Immunology_C3      -1.528116  0.216944  0.482032 -3.170 0.001524
Blood_CrP           0.002902  1.002906  0.001601  1.813 0.069888
IT_Plasmapheresis1  0.671105  1.956398  0.261650  2.565 0.010321

Likelihood ratio test=86.47  on 9 df, p=8.311e-15
n= 155, number of events= 71 
   (9 Beobachtungen als fehlend gelöscht)
# Calculate Harrell's C-index using the concordance index function (concordance)
# The concordance function is part of the survival package and directly calculates the C-index
new_multi_c_index <- concordance(new_multi_cox_model)$concordance

# Print the C-index
print(paste("New Risk Score + Multi-Variable Harrell's C-index:", new_multi_c_index))
[1] "New Risk Score + Multi-Variable Harrell's C-index: 0.833728884545581"

Comparison

print(paste("Old Risk Score + Univariate Harrell's C-index:", old_uni_c_index))
[1] "Old Risk Score + Univariate Harrell's C-index: 0.738438017581858"
print(paste("New Risk Score + Univariate Harrell's C-index:", new_uni_c_index))
[1] "New Risk Score + Univariate Harrell's C-index: 0.753471779844566"
print(paste("Old Risk Score + Multi-Variable Harrell's C-index:", old_multi_c_index))
[1] "Old Risk Score + Multi-Variable Harrell's C-index: 0.838056680161943"
print(paste("New Risk Score + Multi-Variable Harrell's C-index:", new_multi_c_index))
[1] "New Risk Score + Multi-Variable Harrell's C-index: 0.833728884545581"
LS0tDQp0aXRsZTogIkhhcnJlbGwncyBDLWluZGV4Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCg0KYGBge3J9DQojIyMgTG9hZCBsaWJyYXJ5LCBmdW5jdGlvbnMgDQpzb3VyY2UoIkM6L2xvY2FsX3dvcmtfbWluZy93b3Jrc3BhY2VzL3Jfd29ya3NwYWNlL1JfY3VzdG9taXplZF9nbG9iYWxfZnVuY3Rpb25zL215X2Z1bmN0aW9uYWxfc2NyaXB0cy9teV9nbG9iYWxfZnVuY3Rpb25zLlIiKQ0Kc291cmNlKCJDOi9sb2NhbF93b3JrX21pbmcvd29ya3NwYWNlcy9yX3dvcmtzcGFjZS9SX2N1c3RvbWl6ZWRfZ2xvYmFsX2Z1bmN0aW9ucy9teV9mdW5jdGlvbmFsX3NjcmlwdHMvbXlfbGlicmFyaWVzLlIiKQ0Kc291cmNlKCJDOi9sb2NhbF93b3JrX21pbmcvd29ya3NwYWNlcy9yX3dvcmtzcGFjZS9SX2N1c3RvbWl6ZWRfZ2xvYmFsX2Z1bmN0aW9ucy9teV9mdW5jdGlvbmFsX3NjcmlwdHMvUl9pbnRlcmdyb3VwX2RpZmZfdGVzdF9mdW5jdGlvbnMuUiIpDQojIExvYWQgdGhlIHN1cnZpdmFsIHBhY2thZ2UNCmxpYnJhcnkoc3Vydml2YWwpDQpsaWJyYXJ5KHJtcykNCg0KIyBEYXRlbnNhdHogbGFkZW4NCmRhdGEucGF0aCA8LSAiQzovbG9jYWxfd29ya19taW5nL3dvcmtzcGFjZXMvcl93b3Jrc3BhY2UvZmxvcmlhbl9zY3VydF9kYXRhL2RhdGEiDQoNCmBgYA0KDQojIyMjIC0tLS0tLS0gT2xkIFJpc2sgU2NvcmUgKyBVbml2YXJpYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmBgYHtyfQ0Kb2xkLnVuaS5kYXRhIDwtIHJlYWQueGxzeChwYXN0ZShkYXRhLnBhdGgsICIxIE1hc3RlcmRhdGVpX1Zhc2N1bGl0aXMgTW9kZWxsIEFsdCBVbml2YXJpYXQueGxzeCIsIHNlcCA9ICIvIiksIHNoZWV0SW5kZXggPSAxKQ0KbmFtZXMob2xkLnVuaS5kYXRhKSA8LSBjKCJJRCIsICJUaW1lVG9EaWFseXNpcyIsICJEaWFseXNpc1N0YXR1cyIsICJPbGRSaXNrR3JvdXAiKQ0Kb2xkLnVuaS5kYXRhJE9sZFJpc2tHcm91cCA8LSBmYWN0b3Iob2xkLnVuaS5kYXRhJE9sZFJpc2tHcm91cCwgbGV2ZWxzID0gc2VxKDEsIDMsIDEpKQ0KdGFibGUob2xkLnVuaS5kYXRhJE9sZFJpc2tHcm91cCkNCg0KIyBGaXQgYSBDb3ggcHJvcG9ydGlvbmFsIGhhemFyZHMgbW9kZWwNCiMgSGVyZSwgd2UgdXNlIGFnZSBhbmQgc2V4IGFzIHByZWRpY3RvcnMgZm9yIHRoZSBzdXJ2aXZhbCB0aW1lIG9mIGx1bmcgY2FuY2VyIHBhdGllbnRzDQpvbGRfdW5pX2NveF9tb2RlbCA8LSBjb3hwaChTdXJ2KFRpbWVUb0RpYWx5c2lzLCBEaWFseXNpc1N0YXR1cykgfiBPbGRSaXNrR3JvdXAsIGRhdGEgPSBvbGQudW5pLmRhdGEsIGlkPUlEKQ0KcHJpbnQoIi0tLS0gQ294IHByb3BvcnRpb25hbCBoYXphcmRzIG1vZGVsIC0tLS0tLS0tLS0tIikNCnByaW50KG9sZF91bmlfY294X21vZGVsKQ0KDQojIENhbGN1bGF0ZSBIYXJyZWxsJ3MgQy1pbmRleCB1c2luZyB0aGUgY29uY29yZGFuY2UgaW5kZXggZnVuY3Rpb24gKGNvbmNvcmRhbmNlKQ0KIyBUaGUgY29uY29yZGFuY2UgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgc3Vydml2YWwgcGFja2FnZSBhbmQgZGlyZWN0bHkgY2FsY3VsYXRlcyB0aGUgQy1pbmRleA0Kb2xkX3VuaV9jX2luZGV4IDwtIGNvbmNvcmRhbmNlKG9sZF91bmlfY294X21vZGVsKSRjb25jb3JkYW5jZQ0KDQojIFByaW50IHRoZSBDLWluZGV4DQpwcmludChwYXN0ZSgiT2xkIFJpc2sgU2NvcmUgKyBVbml2YXJpYXRlIEhhcnJlbGwncyBDLWluZGV4OiIsIG9sZF91bmlfY19pbmRleCkpDQpgYGANCiMjIyMgLS0tLS0tLSBOZXcgUmlzayBTY29yZSArIFVuaXZhcmlhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KYGBge3J9DQpuZXcudW5pLmRhdGEgPC0gcmVhZC54bHN4KHBhc3RlKGRhdGEucGF0aCwgIjIgTWFzdGVyZGF0ZWlfVmFzY3VsaXRpcyBNb2RlbGwgTmV1IFVuaXZhcmlhdC54bHN4Iiwgc2VwID0gIi8iKSwgc2hlZXRJbmRleCA9IDEpDQpuYW1lcyhuZXcudW5pLmRhdGEpIDwtIGMoIklEIiwgIlRpbWVUb0RpYWx5c2lzIiwgIkRpYWx5c2lzU3RhdHVzIiwgIk5ld1Jpc2tHcm91cCIpDQpuZXcudW5pLmRhdGEkTmV3Umlza0dyb3VwIDwtIGZhY3RvcihuZXcudW5pLmRhdGEkTmV3Umlza0dyb3VwLCBsZXZlbHMgPSBzZXEoMSwgNCwgMSkpDQp0YWJsZShuZXcudW5pLmRhdGEkTmV3Umlza0dyb3VwKQ0KI2hlYWQobmV3LnVuaS5kYXRhKQ0KDQojIEZpdCBhIENveCBwcm9wb3J0aW9uYWwgaGF6YXJkcyBtb2RlbA0KIyBIZXJlLCB3ZSB1c2UgYWdlIGFuZCBzZXggYXMgcHJlZGljdG9ycyBmb3IgdGhlIHN1cnZpdmFsIHRpbWUgb2YgbHVuZyBjYW5jZXIgcGF0aWVudHMNCm5ld191bmlfY294X21vZGVsIDwtIGNveHBoKFN1cnYoVGltZVRvRGlhbHlzaXMsIERpYWx5c2lzU3RhdHVzKSB+IE5ld1Jpc2tHcm91cCwgZGF0YSA9IG5ldy51bmkuZGF0YSwgaWQ9SUQpDQpwcmludCgiLS0tLSBDb3ggcHJvcG9ydGlvbmFsIGhhemFyZHMgbW9kZWwgLS0tLS0tLS0tLS0iKQ0KcHJpbnQobmV3X3VuaV9jb3hfbW9kZWwpDQoNCiMgQ2FsY3VsYXRlIEhhcnJlbGwncyBDLWluZGV4IHVzaW5nIHRoZSBjb25jb3JkYW5jZSBpbmRleCBmdW5jdGlvbiAoY29uY29yZGFuY2UpDQojIFRoZSBjb25jb3JkYW5jZSBmdW5jdGlvbiBpcyBwYXJ0IG9mIHRoZSBzdXJ2aXZhbCBwYWNrYWdlIGFuZCBkaXJlY3RseSBjYWxjdWxhdGVzIHRoZSBDLWluZGV4DQpuZXdfdW5pX2NfaW5kZXggPC0gY29uY29yZGFuY2UobmV3X3VuaV9jb3hfbW9kZWwpJGNvbmNvcmRhbmNlDQoNCiMgUHJpbnQgdGhlIEMtaW5kZXgNCnByaW50KHBhc3RlKCJOZXcgUmlzayBTY29yZSArIFVuaXZhcmlhdGUgSGFycmVsbCdzIEMtaW5kZXg6IiwgbmV3X3VuaV9jX2luZGV4KSkNCg0KYGBgDQojIyMjIC0tLS0tLS0gT2xkIFJpc2sgU2NvcmUgKyBNdWx0aS1WYXJpYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpgYGB7cn0NCm9sZC5tdWx0aS5kYXRhIDwtIHJlYWQueGxzeChwYXN0ZShkYXRhLnBhdGgsICIzIE1hc3RlcmRhdGVpX1Zhc2N1bGl0aXMgTW9kZWxsIEFsdCBNdWx0aXZhcmlhdC54bHN4Iiwgc2VwID0gIi8iKSwgc2hlZXRJbmRleCA9IDEpDQpuYW1lcyhvbGQubXVsdGkuZGF0YSkgPC0gYygiSUQiLCAiVGltZVRvRGlhbHlzaXMiLCAiRGlhbHlzaXNTdGF0dXMiLCAiT2xkUmlza0dyb3VwIiwgIkNWRCIsICJBbmVtaWEiLCAiTmVwaHJvdGljU3luZHJvbWUiLCAiSW1tdW5vbG9neV9DMyIsICJCbG9vZF9DclAiLCAiSVRfUGxhc21hcGhlcmVzaXMiKQ0Kb2xkLm11bHRpLmRhdGEkT2xkUmlza0dyb3VwIDwtIGZhY3RvcihvbGQubXVsdGkuZGF0YSRPbGRSaXNrR3JvdXAsIGxldmVscyA9IHNlcSgxLCAzLCAxKSkNCnRhYmxlKG9sZC5tdWx0aS5kYXRhJE9sZFJpc2tHcm91cCkNCg0Kb2xkLm11bHRpLmRhdGEkQ1ZEIDwtIGZhY3RvcihvbGQubXVsdGkuZGF0YSRDVkQpDQp0YWJsZShvbGQubXVsdGkuZGF0YSRDVkQpDQoNCm9sZC5tdWx0aS5kYXRhJEFuZW1pYSA8LSBmYWN0b3Iob2xkLm11bHRpLmRhdGEkQW5lbWlhKQ0KdGFibGUob2xkLm11bHRpLmRhdGEkQW5lbWlhKQ0KDQpvbGQubXVsdGkuZGF0YSROZXBocm90aWNTeW5kcm9tZSA8LSBmYWN0b3Iob2xkLm11bHRpLmRhdGEkTmVwaHJvdGljU3luZHJvbWUpDQp0YWJsZShvbGQubXVsdGkuZGF0YSROZXBocm90aWNTeW5kcm9tZSkNCg0Kb2xkLm11bHRpLmRhdGEkSVRfUGxhc21hcGhlcmVzaXMgPC0gZmFjdG9yKG9sZC5tdWx0aS5kYXRhJElUX1BsYXNtYXBoZXJlc2lzKQ0KdGFibGUob2xkLm11bHRpLmRhdGEkSVRfUGxhc21hcGhlcmVzaXMpDQoNCiMgRml0IGEgQ294IHByb3BvcnRpb25hbCBoYXphcmRzIG1vZGVsDQojIEhlcmUsIHdlIHVzZSBhZ2UgYW5kIHNleCBhcyBwcmVkaWN0b3JzIGZvciB0aGUgc3Vydml2YWwgdGltZSBvZiBsdW5nIGNhbmNlciBwYXRpZW50cw0Kb2xkX211bHRpX2NveF9tb2RlbCA8LSBjb3hwaChTdXJ2KFRpbWVUb0RpYWx5c2lzLCBEaWFseXNpc1N0YXR1cykgfiBPbGRSaXNrR3JvdXArQ1ZEK0FuZW1pYStOZXBocm90aWNTeW5kcm9tZStJbW11bm9sb2d5X0MzK0Jsb29kX0NyUCtJVF9QbGFzbWFwaGVyZXNpcywgZGF0YSA9IG9sZC5tdWx0aS5kYXRhLCBpZD1JRCkNCnByaW50KCItLS0tIENveCBwcm9wb3J0aW9uYWwgaGF6YXJkcyBtb2RlbCAtLS0tLS0tLS0tLSIpDQpwcmludChvbGRfbXVsdGlfY294X21vZGVsKQ0KDQojIENhbGN1bGF0ZSBIYXJyZWxsJ3MgQy1pbmRleCB1c2luZyB0aGUgY29uY29yZGFuY2UgaW5kZXggZnVuY3Rpb24gKGNvbmNvcmRhbmNlKQ0KIyBUaGUgY29uY29yZGFuY2UgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgc3Vydml2YWwgcGFja2FnZSBhbmQgZGlyZWN0bHkgY2FsY3VsYXRlcyB0aGUgQy1pbmRleA0Kb2xkX211bHRpX2NfaW5kZXggPC0gY29uY29yZGFuY2Uob2xkX211bHRpX2NveF9tb2RlbCkkY29uY29yZGFuY2UNCg0KIyBQcmludCB0aGUgQy1pbmRleA0KcHJpbnQocGFzdGUoIk9sZCBSaXNrIFNjb3JlICsgTXVsdGktVmFyaWFibGUgSGFycmVsbCdzIEMtaW5kZXg6Iiwgb2xkX211bHRpX2NfaW5kZXgpKQ0KDQoNCmBgYA0KIyMjIyAtLS0tLS0tIE5ldyBSaXNrIFNjb3JlICsgTXVsdGktVmFyaWFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KYGBge3J9DQpuZXcubXVsdGkuZGF0YSA8LSByZWFkLnhsc3gocGFzdGUoZGF0YS5wYXRoLCAiNCBNYXN0ZXJkYXRlaV9WYXNjdWxpdGlzIE1vZGVsbCBOZXUgTXVsdGl2YXJpYXQueGxzeCIsIHNlcCA9ICIvIiksIHNoZWV0SW5kZXggPSAxKQ0KbmFtZXMobmV3Lm11bHRpLmRhdGEpIDwtIGMoIklEIiwgIlRpbWVUb0RpYWx5c2lzIiwgIkRpYWx5c2lzU3RhdHVzIiwgIk5ld1Jpc2tHcm91cCIsICJDVkQiLCAiQW5lbWlhIiwgIk5lcGhyb3RpY1N5bmRyb21lIiwgIkltbXVub2xvZ3lfQzMiLCAiQmxvb2RfQ3JQIiwgIklUX1BsYXNtYXBoZXJlc2lzIikNCm5ldy5tdWx0aS5kYXRhJE5ld1Jpc2tHcm91cCA8LSBmYWN0b3IobmV3Lm11bHRpLmRhdGEkTmV3Umlza0dyb3VwLCBsZXZlbHMgPSBzZXEoMSwgNCwgMSkpDQp0YWJsZShuZXcubXVsdGkuZGF0YSROZXdSaXNrR3JvdXApDQoNCm5ldy5tdWx0aS5kYXRhJENWRCA8LSBmYWN0b3IobmV3Lm11bHRpLmRhdGEkQ1ZEKQ0KdGFibGUobmV3Lm11bHRpLmRhdGEkQ1ZEKQ0KDQpuZXcubXVsdGkuZGF0YSRBbmVtaWEgPC0gZmFjdG9yKG5ldy5tdWx0aS5kYXRhJEFuZW1pYSkNCnRhYmxlKG5ldy5tdWx0aS5kYXRhJEFuZW1pYSkNCg0KbmV3Lm11bHRpLmRhdGEkTmVwaHJvdGljU3luZHJvbWUgPC0gZmFjdG9yKG5ldy5tdWx0aS5kYXRhJE5lcGhyb3RpY1N5bmRyb21lKQ0KdGFibGUobmV3Lm11bHRpLmRhdGEkTmVwaHJvdGljU3luZHJvbWUpDQoNCm5ldy5tdWx0aS5kYXRhJElUX1BsYXNtYXBoZXJlc2lzIDwtIGZhY3RvcihuZXcubXVsdGkuZGF0YSRJVF9QbGFzbWFwaGVyZXNpcykNCnRhYmxlKG5ldy5tdWx0aS5kYXRhJElUX1BsYXNtYXBoZXJlc2lzKQ0KDQojaGVhZChuZXcubXVsdGkuZGF0YSkNCg0KIyBGaXQgYSBDb3ggcHJvcG9ydGlvbmFsIGhhemFyZHMgbW9kZWwNCiMgSGVyZSwgd2UgdXNlIGFnZSBhbmQgc2V4IGFzIHByZWRpY3RvcnMgZm9yIHRoZSBzdXJ2aXZhbCB0aW1lIG9mIGx1bmcgY2FuY2VyIHBhdGllbnRzDQpuZXdfbXVsdGlfY294X21vZGVsIDwtIGNveHBoKFN1cnYoVGltZVRvRGlhbHlzaXMsIERpYWx5c2lzU3RhdHVzKSB+IE5ld1Jpc2tHcm91cCtDVkQrQW5lbWlhK05lcGhyb3RpY1N5bmRyb21lK0ltbXVub2xvZ3lfQzMrQmxvb2RfQ3JQK0lUX1BsYXNtYXBoZXJlc2lzLCBkYXRhID0gbmV3Lm11bHRpLmRhdGEsIGlkPUlEKQ0KcHJpbnQoIi0tLS0gQ294IHByb3BvcnRpb25hbCBoYXphcmRzIG1vZGVsIC0tLS0tLS0tLS0tIikNCnByaW50KG5ld19tdWx0aV9jb3hfbW9kZWwpDQoNCiMgQ2FsY3VsYXRlIEhhcnJlbGwncyBDLWluZGV4IHVzaW5nIHRoZSBjb25jb3JkYW5jZSBpbmRleCBmdW5jdGlvbiAoY29uY29yZGFuY2UpDQojIFRoZSBjb25jb3JkYW5jZSBmdW5jdGlvbiBpcyBwYXJ0IG9mIHRoZSBzdXJ2aXZhbCBwYWNrYWdlIGFuZCBkaXJlY3RseSBjYWxjdWxhdGVzIHRoZSBDLWluZGV4DQpuZXdfbXVsdGlfY19pbmRleCA8LSBjb25jb3JkYW5jZShuZXdfbXVsdGlfY294X21vZGVsKSRjb25jb3JkYW5jZQ0KDQojIFByaW50IHRoZSBDLWluZGV4DQpwcmludChwYXN0ZSgiTmV3IFJpc2sgU2NvcmUgKyBNdWx0aS1WYXJpYWJsZSBIYXJyZWxsJ3MgQy1pbmRleDoiLCBuZXdfbXVsdGlfY19pbmRleCkpDQoNCmBgYA0KDQojIyMgQ29tcGFyaXNvbg0KDQpgYGB7cn0NCnByaW50KHBhc3RlKCJPbGQgUmlzayBTY29yZSArIFVuaXZhcmlhdGUgSGFycmVsbCdzIEMtaW5kZXg6Iiwgb2xkX3VuaV9jX2luZGV4KSkNCnByaW50KHBhc3RlKCJOZXcgUmlzayBTY29yZSArIFVuaXZhcmlhdGUgSGFycmVsbCdzIEMtaW5kZXg6IiwgbmV3X3VuaV9jX2luZGV4KSkNCnByaW50KHBhc3RlKCJPbGQgUmlzayBTY29yZSArIE11bHRpLVZhcmlhYmxlIEhhcnJlbGwncyBDLWluZGV4OiIsIG9sZF9tdWx0aV9jX2luZGV4KSkNCnByaW50KHBhc3RlKCJOZXcgUmlzayBTY29yZSArIE11bHRpLVZhcmlhYmxlIEhhcnJlbGwncyBDLWluZGV4OiIsIG5ld19tdWx0aV9jX2luZGV4KSkNCg0KYGBgDQoNCg0KDQoNCg==