### 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==