
Email          : dsciencelabs@outlook.com
RPubs         : https://rpubs.com/vanessasupit/
Github        : https://github.com/vanessasupit/
Jurusan      : Statistika
Address     : ARA Center, Matana University Tower
             Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.
Kata pengantar
dalam part 1, kita menggunakan uji log-rank dan regresi Cox untuk menguji hubungan antara kovariat dari interest dan hasil dari survival. namun analisis ini bergantung pada kovariat yang diukur pada baseline, yaitu sebelum waktu tindak lanjut untuk acara dimulai. apa yang terjadi jika kita tertarik pada kovariat yang diukur setelah waktu tindak lanjut dimulai?
Contoh: Respon Tumor
contoh : kelangsungan hidup keseluruhan diukur dari awal pengobatan, dan minat dalam hubungan antara respon lengkap terhadap pengobatan dan kelangsungan hidup.
- Anderson et al (JCO, 1983) menjelaskan mengapa metode tradisional seperti tes log-rank atau regresi Cox adalah bias dalam mendukung responden dalam skenario ini dan mengusulkan pendekatan tengara.
- Hipotesis nol dalam pendekatan landmark adalah bahwa kelangsungan hidup dari landmark tidak bergantung pada status respons di landmark.
Referensi Anderson, J., Cain, K., & Gelber, R.(1983). Analysis of survival by tumor response. Journal of Clinical Oncology, 1(11), 710-9.
Contoh Lain
beberapa kemungkinan kovariat lain yang menarik dalam penelitian kanker yang mungkin tidak diukur di awal meliputi:
- kegagalan transplantasi
- penyakit cangkok versus inang
- reseksi kedua
- terapi tambahan
- kepatuhan
- kejadian buruk
Contoh : BMT Dataset
Data 137 pasien transplantasi sumsum tulang (dari package SemiCompRisks
). Variabel minat meliputi:
T1
waktu (dalam hari) sampai kematian atau tindak lanjut terakhir.
delta1
indikator kematian, 1=meninggal, 0=hidup.
TA
waktu (dalam hari) untuk penyakit graft-versus-host akut.
deltaA
indikator penyakit graft-versus-host akut, 1= Penyakit graft-versus-host akut berkembang, 0 = penyakit graft-versus-host akut tidak pernah berkembang.
berikut merupakan data akan digunakan dalam contoh:
## Loading required package: MASS
## Loading required package: survival
## Loading required package: Formula
library(DT)
data(BMT, package = "SemiCompRisks")
datatable(BMT,
caption = htmltools::tags$caption(
style ='caption-side:bottom;text-align:center;',
htmltools::em('Table1 1 : the BMT data.')),
extensions = 'FixedColumns',
options = list(scrollX=TRUE, fixedColumns=TRUE))
Metode Landmark
- Pilih waktu tetap setelah baseline sebagai landmark time anda. Catata: ini harus dilakukan berdasarkan informasi klinis, sebelum isnpeksu data
- Subset populasi untuk mereka yang diikuti setidaknya sampai landmark time. catatan: selalu laporkan nomor yang dikecualikan karena acara yang menarik atau sesnosr sebelum waktu landmark.
- Hitung tindak lanjut dari landmark time dan terapkan tes log-rank tradisional atau regresi Cox.
dalam interest data BMT ada hubungan antara penyakit cangkok, inang akut(aGVHD) dan kelangsungan hidup. tetapi aGVHD dinilai setelah transplantasi, yang merupakan waktu dasar kami, atau awal tindaklanjut.
Langkah 1 Pilih landmark time
biasanya aGHVD terjadi dalam 90 haripertama setelah transplantasi, jadi kami menggunakan landmark 90 hari.
yang menarik adalah hubungan antara penyakit cangkok, ingang akut(aGVHD) dan kelangsungan hidup. tetapi aGVHD dinilai setelah transplantasi, yang merupakan waktu dasar kami, atau awal tindak lanjut.
Langkah 2 subset populasi untuk mereka yang diikuti setidaknya sampai landmark time.
ini mengurangi ukuran sampel dari 137 menjadi 122
- semua 15 pasien yang dikecualikan meninggal sebelum landmark time 90 hari.
dalam interest data BMT ada hubungan antara penyakit cangkok, inang akut(aGVHD) dan kelangsungan hidup. tetapi aGVHD dinilai setelah transplantasi, yang merupakan waktu dasar kami, atau awal tindaklanjut.
Langkah 3 Hitung waktu tindak lanjut dari landmark dan terapkan metode tradisional.
lm_dat<-
lm_dat%>%
mutate(
lm_T1=T1-90
)
lm_fit <- survfit(Surv(lm_T1, delta1)~ deltaA, data=lm_dat)
## Loading required package: survminer
## Loading required package: ggpubr
##
## Attaching package: 'survminer'
## The following object is masked _by_ '.GlobalEnv':
##
## BMT
## The following object is masked from 'package:survival':
##
## myeloma
ggsurvplot(
fit=lm_fit,
data=lm_dat,
xlab="Days from 90-day landmark",
risk.table = T,
risk.table.y.text=T,
pval=TRUE
)

Regresi Cox
dalam rangka menggunakan regresi COx pada data BMT, kita dapat menggunakna opsi subset
pada coxph
untuk mengecualikan pasien yang tidak mengikuti ladnmark time.
coxph(
Surv(T1, delta1)~ deltaA,
subset = T1 >= 90,
data=BMT
) %>%
gtsummary::tbl_regression(exp=TRUE)
Characteristic |
HR |
95% CI |
p-value |
deltaA |
1.08 |
0.57, 2.07 |
0.8 |
Time-Dependent Cov
ada cara lain selain analisis dengan tolak ukur waktu tertentu, yaitu metode analisis survival dengan menggunakan time-dependent covariate. metode ini dapat digunakan ketika:
- Nilai kovariat berubah setiap waktu
- tidak terdapat landmark time yang jelas
- Penggunaan landmark yang membawa terlalu banyak pengecualian
Setup Time-Dependent Cov
Analisis time-dependent cov dengan menggunakna pemrograman R membutuhkan dataset khusus. untuk lebih jelasnya dapat dilihat di Using Time dependent COvariates and Time Dependent Coefficients in the COx Model
Karena tidak terdapat ID pada data BMT
, maka perlu dibuat dataset spesial. oleh karena itu, pada data MBT akan ditambahkan kolom my_id
bmt <- rowid_to_column(BMT, "my_id")
menggunakan fungsi t-merge
dengan menggunakan fungsi event
dan tdc
untuk membuat dataset khusus
tmerge
membuat dataset panjang dengan multiple time intervals untuk perbedaan nilai covariate pada setiap pasien.
event
membuat indikator event baru untuk mengikuti time intervals yang baru terbentuk
tdc
membuat indikator time-dependent covariate untuk mengikuti time intervals yang baru terbentuk
library(dplyr)
library(survival)
td_dat<-
tmerge(
data1 = bmt %>% select(my_id,T1,delta1),
data2 = bmt %>% select(my_id,T1,delta1,TA,deltaA),
id = my_id,
death = event(T1,delta1),
agvhd = tdc(TA))
Contoh Pasien tunggal
untuk mengetahui prosesnya, dapat kita lihat melalui data dari 5 pasien berikut.
- Variabel interest dari data asli
bmt %>%
select(my_id,T1,delta1,TA,deltaA)%>%
filter(my_id %in% seq(1,5))
## my_id T1 delta1 TA deltaA
## 1 1 2081 0 67 1
## 2 2 1602 0 1602 0
## 3 3 1496 0 1496 0
## 4 4 1462 0 70 1
## 5 5 1433 0 1433 0
- Data yang baru
td_dat %>%
filter(my_id %in% seq(1,5))
## my_id T1 delta1 tstart tstop death agvhd
## 1 1 2081 0 0 67 0 0
## 2 1 2081 0 67 2081 0 1
## 3 2 1602 0 0 1602 0 0
## 4 3 1496 0 0 1496 0 0
## 5 4 1462 0 0 70 0 0
## 6 4 1462 0 70 1462 0 1
## 7 5 1433 0 0 1433 0 0
Time-Dependent & Cox Regression
dengan itu, kita dapat menganalisis time-dependent covariate seperti biasa menggunakan Cox regression dengan coxph
dan perubahan penggunaan surv
kami untuk memasukkan argumen ke time
dan time2
.
coxph(
Surv(time=tstart, time2=tstop, event=death)~agvhd,
data=td_dat
) %>%
gtsummary::tbl_regression(exp=TRUE)
Characteristic |
HR |
95% CI |
p-value |
agvhd |
1.40 |
0.81, 2.43 |
0.2 |
Kesimpulan
acute graft vs hot disease tidak berhubungan secara signifikan berhubungan dengan kematian dengan menggunakan landmark analysis atau time-dependent covariate
seringkali orang akan menggunakan landmark analysis untuk visualisasi kovariat tunggal, dengan regresi Cox dengan time-dependent covariate tergantung waktu untuk pemodelan univariabel dan multivariabel.
LS0tDQp0aXRsZTogIlR1Z2FzIFN1cnZpdmFsIE1vZGVsICINCnN1YnRpdGxlOiAiV2VlayAyIg0KYXV0aG9yOiAiVmFuZXNzYSBTdXBpdCAoMjAxOTQ5MjAwMTQpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9nby5wbmciKQ0KYGBgDQoNCkVtYWlsICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzogIGRzY2llbmNlbGFic0BvdXRsb29rLmNvbSA8YnI+DQpSUHVicyAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBodHRwczovL3JwdWJzLmNvbS92YW5lc3Nhc3VwaXQvIDxicj4NCkdpdGh1YiAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBodHRwczovL2dpdGh1Yi5jb20vdmFuZXNzYXN1cGl0LyA8YnI+DQpKdXJ1c2FuICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IFtTdGF0aXN0aWthXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEFSQSBDZW50ZXIsIE1hdGFuYSBVbml2ZXJzaXR5IFRvd2VyIDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IEpsLiBDQkQgQmFyYXQgS2F2LCBSVC4xLCBDdXJ1ZyBTYW5nZXJlbmcsIEtlbGFwYSBEdWEsIFRhbmdlcmFuZywgQmFudGVuIDE1ODEwLg0KDQoqKioqDQoNCiMgS2F0YSBwZW5nYW50YXINCg0KZGFsYW0gcGFydCAxLCBraXRhIG1lbmdndW5ha2FuIHVqaSBsb2ctcmFuayBkYW4gcmVncmVzaSBDb3ggdW50dWsgbWVuZ3VqaSBodWJ1bmdhbiBhbnRhcmEga292YXJpYXQgZGFyaSBpbnRlcmVzdCBkYW4gaGFzaWwgZGFyaSBzdXJ2aXZhbC4gbmFtdW4gYW5hbGlzaXMgaW5pIGJlcmdhbnR1bmcgcGFkYSBrb3ZhcmlhdCB5YW5nIGRpdWt1ciBwYWRhICpiYXNlbGluZSosIHlhaXR1IHNlYmVsdW0gd2FrdHUgdGluZGFrIGxhbmp1dCB1bnR1ayBhY2FyYSBkaW11bGFpLiBhcGEgeWFuZyB0ZXJqYWRpIGppa2Ega2l0YSB0ZXJ0YXJpayBwYWRhIGtvdmFyaWF0IHlhbmcgZGl1a3VyICpzZXRlbGFoKiB3YWt0dSB0aW5kYWsgbGFuanV0IGRpbXVsYWk/DQoNCiMgQ29udG9oOiBSZXNwb24gVHVtb3INCg0KY29udG9oIDoga2VsYW5nc3VuZ2FuIGhpZHVwIGtlc2VsdXJ1aGFuIGRpdWt1ciBkYXJpIGF3YWwgcGVuZ29iYXRhbiwgZGFuIG1pbmF0IGRhbGFtIGh1YnVuZ2FuIGFudGFyYSAgcmVzcG9uIGxlbmdrYXAgdGVyaGFkYXAgcGVuZ29iYXRhbiBkYW4ga2VsYW5nc3VuZ2FuIGhpZHVwLg0KDQoqIEFuZGVyc29uIGV0IGFsIChKQ08sIDE5ODMpIG1lbmplbGFza2FuIG1lbmdhcGEgbWV0b2RlIHRyYWRpc2lvbmFsIHNlcGVydGkgdGVzIGxvZy1yYW5rIGF0YXUgcmVncmVzaSBDb3ggYWRhbGFoIGJpYXMgZGFsYW0gbWVuZHVrdW5nIHJlc3BvbmRlbiBkYWxhbSBza2VuYXJpbyBpbmkgZGFuIG1lbmd1c3Vsa2FuIHBlbmRla2F0YW4gdGVuZ2FyYS4NCiogKkhpcG90ZXNpcyBub2wqIGRhbGFtIHBlbmRla2F0YW4gbGFuZG1hcmsgYWRhbGFoIGJhaHdhIGtlbGFuZ3N1bmdhbiBoaWR1cCBkYXJpIGxhbmRtYXJrIHRpZGFrIGJlcmdhbnR1bmcgcGFkYSBzdGF0dXMgcmVzcG9ucyBkaSBsYW5kbWFyay4NCg0KUmVmZXJlbnNpIEFuZGVyc29uLCBKLiwgQ2FpbiwgSy4sICYgR2VsYmVyLCBSLigxOTgzKS4gQW5hbHlzaXMgb2Ygc3Vydml2YWwgYnkgdHVtb3IgcmVzcG9uc2UuIEpvdXJuYWwgb2YgQ2xpbmljYWwgT25jb2xvZ3ksIDEoMTEpLCA3MTAtOS4NCg0KIyBDb250b2ggTGFpbg0KDQpiZWJlcmFwYSBrZW11bmdraW5hbiBrb3ZhcmlhdCBsYWluIHlhbmcgbWVuYXJpayBkYWxhbSBwZW5lbGl0aWFuIGthbmtlciB5YW5nIG11bmdraW4gdGlkYWsgZGl1a3VyIGRpICphd2FsKiBtZWxpcHV0aToNCg0KKiBrZWdhZ2FsYW4gdHJhbnNwbGFudGFzaQ0KKiBwZW55YWtpdCBjYW5na29rIHZlcnN1cyBpbmFuZw0KKiByZXNla3NpIGtlZHVhDQoqIHRlcmFwaSB0YW1iYWhhbg0KKiBrZXBhdHVoYW4NCioga2VqYWRpYW4gYnVydWsNCg0KIyBDb250b2ggOiBCTVQgRGF0YXNldA0KDQpEYXRhIDEzNyBwYXNpZW4gdHJhbnNwbGFudGFzaSBzdW1zdW0gdHVsYW5nIChkYXJpIHBhY2thZ2UgYFNlbWlDb21wUmlza3NgKS4gVmFyaWFiZWwgbWluYXQgbWVsaXB1dGk6DQoNCiogYFQxYCB3YWt0dSAoZGFsYW0gaGFyaSkgc2FtcGFpIGtlbWF0aWFuIGF0YXUgdGluZGFrIGxhbmp1dCB0ZXJha2hpci4NCiogYGRlbHRhMWAgaW5kaWthdG9yIGtlbWF0aWFuLCAxPW1lbmluZ2dhbCwgMD1oaWR1cC4NCiogYFRBYCB3YWt0dSAoZGFsYW0gaGFyaSkgdW50dWsgcGVueWFraXQgZ3JhZnQtdmVyc3VzLWhvc3QgYWt1dC4NCiogYGRlbHRhQWAgaW5kaWthdG9yIHBlbnlha2l0IGdyYWZ0LXZlcnN1cy1ob3N0IGFrdXQsIDE9IFBlbnlha2l0IGdyYWZ0LXZlcnN1cy1ob3N0IGFrdXQgYmVya2VtYmFuZywgMCA9IHBlbnlha2l0IGdyYWZ0LXZlcnN1cy1ob3N0IGFrdXQgdGlkYWsgcGVybmFoIGJlcmtlbWJhbmcuDQoNCmJlcmlrdXQgbWVydXBha2FuIGRhdGEgYWthbiBkaWd1bmFrYW4gZGFsYW0gY29udG9oOg0KDQpgYGB7cn0NCmxpYnJhcnkoU2VtaUNvbXBSaXNrcykNCmxpYnJhcnkoRFQpDQpkYXRhKEJNVCwgcGFja2FnZSA9ICJTZW1pQ29tcFJpc2tzIikNCmRhdGF0YWJsZShCTVQsDQogICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKA0KICAgICAgICAgICAgc3R5bGUgPSdjYXB0aW9uLXNpZGU6Ym90dG9tO3RleHQtYWxpZ246Y2VudGVyOycsDQogICAgICAgICAgICBodG1sdG9vbHM6OmVtKCdUYWJsZTEgMSA6IHRoZSBCTVQgZGF0YS4nKSksDQogICAgICAgICAgZXh0ZW5zaW9ucyA9ICdGaXhlZENvbHVtbnMnLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNjcm9sbFg9VFJVRSwgZml4ZWRDb2x1bW5zPVRSVUUpKQ0KYGBgDQoNCiMgTWV0b2RlIExhbmRtYXJrDQoNCjEuIFBpbGloIHdha3R1IHRldGFwIHNldGVsYWggYmFzZWxpbmUgc2ViYWdhaSBsYW5kbWFyayB0aW1lIGFuZGEuIENhdGF0YTogaW5pIGhhcnVzIGRpbGFrdWthbiBiZXJkYXNhcmthbiBpbmZvcm1hc2kga2xpbmlzLCBzZWJlbHVtIGlzbnBla3N1IGRhdGENCjIuIFN1YnNldCBwb3B1bGFzaSB1bnR1ayBtZXJla2EgeWFuZyBkaWlrdXRpIHNldGlkYWtueWEgc2FtcGFpIGxhbmRtYXJrIHRpbWUuIGNhdGF0YW46IHNlbGFsdSBsYXBvcmthbiBub21vciB5YW5nIGRpa2VjdWFsaWthbiBrYXJlbmEgYWNhcmEgeWFuZyBtZW5hcmlrIGF0YXUgc2Vzbm9zciBzZWJlbHVtIHdha3R1IGxhbmRtYXJrLg0KMy4gSGl0dW5nIHRpbmRhayBsYW5qdXQgZGFyaSBsYW5kbWFyayB0aW1lIGRhbiB0ZXJhcGthbiB0ZXMgbG9nLXJhbmsgdHJhZGlzaW9uYWwgYXRhdSByZWdyZXNpIENveC4NCjxicj4NCg0KZGFsYW0gaW50ZXJlc3QgZGF0YSBCTVQgYWRhIGh1YnVuZ2FuIGFudGFyYSBwZW55YWtpdCBjYW5na29rLCBpbmFuZyBha3V0KGFHVkhEKSBkYW4ga2VsYW5nc3VuZ2FuIGhpZHVwLiB0ZXRhcGkgYUdWSEQgZGluaWxhaSBzZXRlbGFoIHRyYW5zcGxhbnRhc2ksIHlhbmcgbWVydXBha2FuIHdha3R1IGRhc2FyIGthbWksIGF0YXUgYXdhbCB0aW5kYWtsYW5qdXQuDQo8YnI+DQoNCipMYW5na2FoIDEqIFBpbGloIGxhbmRtYXJrIHRpbWUNCjxicj4NCg0KYmlhc2FueWEgYUdIVkQgdGVyamFkaSBkYWxhbSA5MCBoYXJpcGVydGFtYSBzZXRlbGFoIHRyYW5zcGxhbnRhc2ksIGphZGkga2FtaSBtZW5nZ3VuYWthbiBsYW5kbWFyayA5MCBoYXJpLg0KPGJyPg0KeWFuZyBtZW5hcmlrIGFkYWxhaCBodWJ1bmdhbiBhbnRhcmEgcGVueWFraXQgY2FuZ2tvaywgaW5nYW5nIGFrdXQoYUdWSEQpIGRhbiBrZWxhbmdzdW5nYW4gaGlkdXAuIHRldGFwaSBhR1ZIRCBkaW5pbGFpIHNldGVsYWggdHJhbnNwbGFudGFzaSwgeWFuZyBtZXJ1cGFrYW4gd2FrdHUgZGFzYXIga2FtaSwgYXRhdSBhd2FsIHRpbmRhayBsYW5qdXQuDQo8YnI+DQoNCipMYW5na2FoIDIqIHN1YnNldCBwb3B1bGFzaSB1bnR1ayBtZXJla2EgeWFuZyBkaWlrdXRpIHNldGlkYWtueWEgc2FtcGFpIGxhbmRtYXJrIHRpbWUuDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpsbV9kYXQgPC0gDQogIEJNVCU+JQ0KICBmaWx0ZXIoVDEgPj0gOTApDQpgYGANCg0KaW5pIG1lbmd1cmFuZ2kgdWt1cmFuIHNhbXBlbCBkYXJpIDEzNyBtZW5qYWRpIDEyMg0KDQoqIHNlbXVhIDE1IHBhc2llbiB5YW5nIGRpa2VjdWFsaWthbiBtZW5pbmdnYWwgc2ViZWx1bSBsYW5kbWFyayB0aW1lIDkwIGhhcmkuDQoNCmRhbGFtIGludGVyZXN0IGRhdGEgQk1UIGFkYSBodWJ1bmdhbiBhbnRhcmEgcGVueWFraXQgY2FuZ2tvaywgaW5hbmcgYWt1dChhR1ZIRCkgZGFuIGtlbGFuZ3N1bmdhbiBoaWR1cC4gdGV0YXBpIGFHVkhEIGRpbmlsYWkgc2V0ZWxhaCB0cmFuc3BsYW50YXNpLCB5YW5nIG1lcnVwYWthbiB3YWt0dSBkYXNhciBrYW1pLCBhdGF1IGF3YWwgdGluZGFrbGFuanV0Lg0KPGJyPg0KDQpMYW5na2FoIDMgSGl0dW5nIHdha3R1IHRpbmRhayBsYW5qdXQgZGFyaSBsYW5kbWFyayBkYW4gdGVyYXBrYW4gbWV0b2RlIHRyYWRpc2lvbmFsLg0KDQpgYGB7cn0NCmxtX2RhdDwtDQogIGxtX2RhdCU+JQ0KICBtdXRhdGUoDQogICAgbG1fVDE9VDEtOTANCiAgKQ0KDQpsbV9maXQgPC0gc3VydmZpdChTdXJ2KGxtX1QxLCBkZWx0YTEpfiBkZWx0YUEsIGRhdGE9bG1fZGF0KQ0KYGBgDQoNCmBgYHtyfQ0KcmVxdWlyZShzdXJ2bWluZXIpDQpnZ3N1cnZwbG90KA0KICBmaXQ9bG1fZml0LA0KICBkYXRhPWxtX2RhdCwNCiAgeGxhYj0iRGF5cyBmcm9tIDkwLWRheSBsYW5kbWFyayIsDQogIHJpc2sudGFibGUgPSBULA0KICByaXNrLnRhYmxlLnkudGV4dD1ULA0KICBwdmFsPVRSVUUNCikNCmBgYA0KDQoNCiMgUmVncmVzaSBDb3gNCg0KZGFsYW0gcmFuZ2thIG1lbmdndW5ha2FuIHJlZ3Jlc2kgQ094IHBhZGEgZGF0YSBCTVQsIGtpdGEgZGFwYXQgbWVuZ2d1bmFrbmEgb3BzaSBgc3Vic2V0YCBwYWRhIGBjb3hwaGAgdW50dWsgbWVuZ2VjdWFsaWthbiBwYXNpZW4geWFuZyB0aWRhayBtZW5naWt1dGkgbGFkbm1hcmsgdGltZS4NCg0KYGBge3J9DQpjb3hwaCgNCiAgU3VydihUMSwgZGVsdGExKX4gZGVsdGFBLA0KICBzdWJzZXQgPSBUMSA+PSA5MCwNCiAgZGF0YT1CTVQNCikgJT4lIA0KICBndHN1bW1hcnk6OnRibF9yZWdyZXNzaW9uKGV4cD1UUlVFKQ0KYGBgDQojIFRpbWUtRGVwZW5kZW50IENvdg0KDQphZGEgY2FyYSBsYWluIHNlbGFpbiBhbmFsaXNpcyBkZW5nYW4gdG9sYWsgdWt1ciB3YWt0dSB0ZXJ0ZW50dSwgeWFpdHUgbWV0b2RlIGFuYWxpc2lzIHN1cnZpdmFsIGRlbmdhbiBtZW5nZ3VuYWthbiB0aW1lLWRlcGVuZGVudCBjb3ZhcmlhdGUuIG1ldG9kZSBpbmkgZGFwYXQgZGlndW5ha2FuIGtldGlrYToNCg0KKiBOaWxhaSBrb3ZhcmlhdCBiZXJ1YmFoIHNldGlhcCB3YWt0dQ0KKiB0aWRhayB0ZXJkYXBhdCBsYW5kbWFyayB0aW1lIHlhbmcgamVsYXMNCiogUGVuZ2d1bmFhbiBsYW5kbWFyayB5YW5nIG1lbWJhd2EgdGVybGFsdSBiYW55YWsgcGVuZ2VjdWFsaWFuDQoNCiMgU2V0dXAgVGltZS1EZXBlbmRlbnQgQ292DQoNCkFuYWxpc2lzIHRpbWUtZGVwZW5kZW50IGNvdiBkZW5nYW4gbWVuZ2d1bmFrbmEgcGVtcm9ncmFtYW4gUiBtZW1idXR1aGthbiBkYXRhc2V0IGtodXN1cy4gdW50dWsgbGViaWggamVsYXNueWEgZGFwYXQgZGlsaWhhdCBkaSBVc2luZyBUaW1lIGRlcGVuZGVudCBDT3ZhcmlhdGVzIGFuZCBUaW1lIERlcGVuZGVudCBDb2VmZmljaWVudHMgaW4gdGhlIENPeCBNb2RlbA0KPGJyPg0KDQpLYXJlbmEgdGlkYWsgdGVyZGFwYXQgSUQgcGFkYSBkYXRhIGBCTVRgLCBtYWthIHBlcmx1IGRpYnVhdCBkYXRhc2V0IHNwZXNpYWwuIG9sZWgga2FyZW5hIGl0dSwgcGFkYSBkYXRhIE1CVCBha2FuIGRpdGFtYmFoa2FuIGtvbG9tIGBteV9pZGANCg0KYGBge3J9DQpibXQgPC0gcm93aWRfdG9fY29sdW1uKEJNVCwgIm15X2lkIikNCmBgYA0KDQoNCm1lbmdndW5ha2FuIGZ1bmdzaSBgdC1tZXJnZWAgZGVuZ2FuIG1lbmdndW5ha2FuIGZ1bmdzaSBgZXZlbnRgIGRhbiBgdGRjYCB1bnR1ayBtZW1idWF0IGRhdGFzZXQga2h1c3VzDQoNCiogYHRtZXJnZWAgbWVtYnVhdCBkYXRhc2V0IHBhbmphbmcgZGVuZ2FuIG11bHRpcGxlIHRpbWUgaW50ZXJ2YWxzIHVudHVrIHBlcmJlZGFhbiBuaWxhaSBjb3ZhcmlhdGUgcGFkYSBzZXRpYXAgcGFzaWVuLg0KKiBgZXZlbnRgIG1lbWJ1YXQgaW5kaWthdG9yIGV2ZW50IGJhcnUgdW50dWsgbWVuZ2lrdXRpIHRpbWUgaW50ZXJ2YWxzIHlhbmcgYmFydSB0ZXJiZW50dWsNCiogYHRkY2AgbWVtYnVhdCBpbmRpa2F0b3IgdGltZS1kZXBlbmRlbnQgY292YXJpYXRlIHVudHVrIG1lbmdpa3V0aSB0aW1lIGludGVydmFscyB5YW5nIGJhcnUgdGVyYmVudHVrDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3Vydml2YWwpDQp0ZF9kYXQ8LQ0KICB0bWVyZ2UoDQogICAgICAgZGF0YTEgPSBibXQgJT4lIHNlbGVjdChteV9pZCxUMSxkZWx0YTEpLA0KICAgICAgIGRhdGEyID0gYm10ICU+JSBzZWxlY3QobXlfaWQsVDEsZGVsdGExLFRBLGRlbHRhQSksDQogICAgICAgaWQgPSBteV9pZCwNCiAgICAgICBkZWF0aCA9IGV2ZW50KFQxLGRlbHRhMSksDQogICAgICAgYWd2aGQgPSB0ZGMoVEEpKQ0KYGBgDQoNCiMgQ29udG9oIFBhc2llbiB0dW5nZ2FsDQoNCnVudHVrIG1lbmdldGFodWkgcHJvc2VzbnlhLCBkYXBhdCBraXRhIGxpaGF0IG1lbGFsdWkgZGF0YSBkYXJpIDUgcGFzaWVuIGJlcmlrdXQuDQoNCjEuIFZhcmlhYmVsIGludGVyZXN0IGRhcmkgZGF0YSBhc2xpDQoNCmBgYHtyfQ0KYm10ICU+JSANCiAgc2VsZWN0KG15X2lkLFQxLGRlbHRhMSxUQSxkZWx0YUEpJT4lDQogIGZpbHRlcihteV9pZCAlaW4lIHNlcSgxLDUpKQ0KYGBgDQoNCjIuIERhdGEgeWFuZyBiYXJ1DQoNCmBgYHtyfQ0KdGRfZGF0ICU+JQ0KICBmaWx0ZXIobXlfaWQgJWluJSBzZXEoMSw1KSkNCmBgYA0KDQojIFRpbWUtRGVwZW5kZW50ICYgQ294IFJlZ3Jlc3Npb24NCg0KZGVuZ2FuIGl0dSwga2l0YSBkYXBhdCBtZW5nYW5hbGlzaXMgdGltZS1kZXBlbmRlbnQgY292YXJpYXRlIHNlcGVydGkgYmlhc2EgbWVuZ2d1bmFrYW4NCiBDb3ggcmVncmVzc2lvbiBkZW5nYW4gYGNveHBoYCBkYW4gcGVydWJhaGFuIHBlbmdndW5hYW4gYHN1cnZgIGthbWkgdW50dWsgbWVtYXN1a2thbiBhcmd1bWVuIGtlIGB0aW1lYCBkYW4gYHRpbWUyYC4NCg0KYGBge3J9DQpjb3hwaCgNCiAgU3Vydih0aW1lPXRzdGFydCwgdGltZTI9dHN0b3AsIGV2ZW50PWRlYXRoKX5hZ3ZoZCwNCiAgZGF0YT10ZF9kYXQNCikgJT4lIA0KICBndHN1bW1hcnk6OnRibF9yZWdyZXNzaW9uKGV4cD1UUlVFKQ0KYGBgDQoNCiMgS2VzaW1wdWxhbg0KDQphY3V0ZSBncmFmdCB2cyBob3QgZGlzZWFzZSB0aWRhayBiZXJodWJ1bmdhbiBzZWNhcmEgc2lnbmlmaWthbiBiZXJodWJ1bmdhbiBkZW5nYW4ga2VtYXRpYW4gZGVuZ2FuIG1lbmdndW5ha2FuIGxhbmRtYXJrIGFuYWx5c2lzIGF0YXUgdGltZS1kZXBlbmRlbnQgY292YXJpYXRlDQoNCnNlcmluZ2thbGkgb3JhbmcgYWthbiBtZW5nZ3VuYWthbiBsYW5kbWFyayBhbmFseXNpcyB1bnR1ayB2aXN1YWxpc2FzaSBrb3ZhcmlhdCB0dW5nZ2FsLCBkZW5nYW4gcmVncmVzaSBDb3ggZGVuZ2FuIHRpbWUtZGVwZW5kZW50IGNvdmFyaWF0ZSB0ZXJnYW50dW5nIHdha3R1IHVudHVrIHBlbW9kZWxhbiB1bml2YXJpYWJlbCBkYW4gbXVsdGl2YXJpYWJlbC4=