1 Abstrak

Pneumonia merupakan salah satu penyebab utama kematian pada balita. Penelitian ini memetakan sebaran risiko dan menganalisis dinamika spasio-temporal insidens pneumonia balita di 30 kecamatan Kota Bandung selama 2017–2021. Data kasus, jumlah balita, dan enam indikator cakupan program kesehatan bersumber dari Profil Kesehatan Kota Bandung. Risiko diukur dengan incidence rate (IR) dan standardized incidence ratio (SIR) yang dihaluskan dengan Empirical Bayes, autokorelasi diuji dengan Moran’s I spasial dan spasio-temporal, dan dinamika risiko dimodelkan secara bertingkat dari Negative Binomial GLM hingga Negative Binomial Mixed Model dengan efek acak kecamatan. Jumlah kasus tercatat menurun tajam, dari 10.735 (2017) menjadi 2.003 (2021), dengan penurunan terbesar pada masa pandemi yang kemungkinan mencerminkan gangguan pelaporan. Hasil uji Moran’s I spasial per tahun tidak signifikan, sedangkan Moran’s I spasio-temporal signifikan (0,186; p = 0,001), menunjukkan dominasi dimensi temporal. NB Mixed Model terpilih sebagai model terbaik (AIC 1788,4 vs 1843,6) dengan simpangan baku efek acak kecamatan 0,514 dan residual yang acak secara spasial. Tidak ada covariate program kesehatan yang signifikan (alpha 5%) pada model final. Kecamatan Cinambo dan Bandung Kidul teridentifikasi sebagai wilayah prioritas. Pengendalian pneumonia balita disarankan berbasis wilayah dengan penguatan pencatatan kasus.

Kata kunci: disease mapping, Empirical Bayes, Negative Binomial Mixed Model, pneumonia balita, spasio-temporal

2 Pendahuluan

Pneumonia adalah infeksi saluran pernapasan akut yang menyerang alveoli, kantung-kantung udara di paru. Ketika terinfeksi, alveoli terisi cairan atau nanah sehingga penderita sulit bernapas dan asupan oksigennya berkurang. Penyakit ini menjadi penyebab kematian menular terbesar pada anak di dunia: pada 2019, pneumonia merenggut 740.180 anak di bawah lima tahun, atau 14% dari seluruh kematian balita global, dengan beban tertinggi di Asia Selatan dan Afrika Sub-Sahara (WHO, 2022).

Di Indonesia, pneumonia menjadi salah satu penyebab utama kematian balita. Menurut Kementerian Kesehatan, penyakit ini merenggut lebih banyak nyawa balita daripada gabungan AIDS, malaria, dan campak, sehingga pemerintah menyusun Rencana Aksi Nasional Penanggulangan Pneumonia dan Diare 2023-2030 untuk menekan angka kematian (Kemenkes RI, 2023). Di Kota Bandung, pneumonia balita dipantau secara rutin melalui cakupan penemuan dan penanganan kasus per kecamatan (Dinas Kesehatan Kota Bandung, 2021). Sebagai kota besar dengan arus urbanisasi tinggi, kepadatan penduduk yang bervariasi antarwilayah, dan strata sosial ekonomi yang heterogen (Dinas Kesehatan Kota Bandung, 2016), risiko pneumonia balita dapat berbeda-beda antarkecamatan.

Jumlah kasus pneumonia balita yang tercatat di Kota Bandung menurun selama 2017-2021 (Gambar 1), dari 10.735 kasus pada 2017 menjadi 10.525 (2018), 9.716 (2019), 4.075 (2020), dan 2.003 kasus pada 2021 (Dinas Kesehatan Kota Bandung, 2021). Angka agregat tahunan seperti ini menyembunyikan dua hal: bagaimana risiko tersebar antarkecamatan, dan bagaimana pola tersebut berubah dari tahun ke tahun. Penurunan tajam pada 2020-2021 juga perlu ditelaah karena bertepatan dengan pandemi COVID-19 yang dapat memengaruhi penemuan dan pelaporan kasus. Analisis spasio-temporal menjawab keduanya sekaligus: memetakan risiko per kecamatan dan menelusuri perubahannya antarwaktu, sehingga wilayah dan periode berisiko tinggi dapat diidentifikasi lebih tepat.

Tujuan analisis: (1) mendeskripsikan sebaran dan tren kasus pneumonia balita antarkecamatan di Kota Bandung; (2) menghitung ukuran risiko epidemiologi (IR dan SIR); (3) memetakan variasi risiko dan menerapkan penghalusan spasial; serta (4) memodelkan dinamika risiko menurut wilayah dan waktu.

3 Data dan Metode

Sumber data. Jumlah kasus pneumonia balita dan jumlah balita per kecamatan bersumber dari Profil Kesehatan Kota Bandung (Dinas Kesehatan Kota Bandung). Batas wilayah kecamatan bersumber dari data GeoJSON administrasi Kota Bandung. Unit analisis: 30 kecamatan; periode: 2017-2021 (lima tahun, 30 kecamatan, total 150 observasi kecamatan-tahun).

Variabel penelitian. Data memuat variabel respons (jumlah kasus pneumonia balita), populasi berisiko (jumlah balita), serta enam covariate cakupan program kesehatan (dalam persen):

Tabel 1. Deskripsi variabel dalam data.
Variabel Keterangan Peran
Pneumonia Jumlah kasus pneumonia balita (variabel respons/outcome) Respons
Jumlah_Balita Jumlah balita (populasi berisiko, dipakai sebagai offset) Offset
IDL Cakupan Imunisasi Dasar Lengkap (%) Prediktor
VIT Cakupan pemberian Vitamin A pada balita (%) Prediktor
BGK Persentase balita dengan berat kurang / gizi kurang (%) Prediktor
BBLR Persentase Bayi Berat Lahir Rendah (%) Prediktor
PHBS Cakupan Perilaku Hidup Bersih dan Sehat (%) Prediktor
RS Persentase Rumah Sehat / memenuhi syarat (%) Prediktor

Ukuran Epidemiologi. \[ IR=\frac{O_i}{P_i}\times 100{.}000, \quad E_i=P_i\times\frac{\sum O}{\sum P}, \quad SIR_i=\frac{O_i}{E_i} \] dengan \(O_i\) kasus teramati, \(P_i\) populasi balita berisiko. SIR > 1 mengindikasikan risiko di atas rata-rata kota (Clayton & Kaldor, 1987).

Disease mapping. Peta risiko kasar (crude SIR) dan penghalusan Empirical Bayes menggunakan estimator global berdasarkan metode Marshall (1991) untuk menstabilkan estimasi pada wilayah berpopulasi kecil. Autokorelasi spasial diuji dengan Moran’s I (Moran, 1950; Cliff & Ord, 1981)

Spasio-temporal. Pemodelan dilakukan bertahap: (1) NB-GLM dengan efek tetap (covariate + efek tahun, offset jumlah balita); (2) uji Moran’s I pada residual; (3) NB Mixed Model dengan efek acak kecamatan bila terdapat heterogenitas antarwilayah; dan (4) model Spatio-Temporal NB eksplisit hanya bila residual masih menunjukkan pola spasio-temporal. Model Negative Binomial dipilih karena data cacahan penyakit umumnya overdispersi (Hilbe, 2012).

Model NB dinyatakan sebagai \(\log(\mu_{it}) = \log(P_{it}) + \beta_0 + \sum_k \beta_k X_{k,it} + \sum_t \gamma_t \text{Tahun}_t\), dengan eksponen koefisien ditafsirkan sebagai incidence rate ratio (IRR); pada model campuran ditambahkan efek acak kecamatan \(u_i \sim N(0,\sigma^2)\).

4 Hasil dan Pembahasan

4.1 Analisis Deskriptif

Berdasarkan data yang disajikan pada Tabel 2, jumlah kasus pneumonia balita di Kota Bandung menurun dari 10.735 kasus pada 2017 menjadi 2.003 kasus pada 2021. Tren penurunan ini tercermin pula pada incidence rate (IR) per 100.000 balita, yang menurun dari tahun ke tahun. Berbeda dengan tren total kasus yang menurun, populasi balita menunjukkan pergerakan yang fluktuatif. Populasi tertinggi tercatat pada tahun 2019 (254,780 balita) dan mengalami penurunan signifikan pada tahun 2020 (152,928 balita) sebelum kembali meningkat pada tahun 2021 (175,614 balita).

Tabel 2. Ringkasan kasus & populasi balita per tahun.
Tahun Total_Kasus Total_Balita IR_kota
2017 10735 202758 5294.5
2018 10525 199679 5271.0
2019 9716 254780 3813.5
2020 4075 152928 2664.7
2021 2003 175614 1140.6

Jumlah kasus pneumonia balita di Kota Bandung menurun dari 10.735 kasus pada 2017 menjadi 2.003 kasus pada 2021, dengan penurunan tajam pada tahun 2020-2021 seiring dengan menurunnya jumlah kunjungan masyarakat ke fasilitas kesehatan akibat pandemi COVID-19 (Dinas Kesehatan Kota Bandung, 2016). Tren total kasus pneumonia balita dari tahun 2017 hingga 2021 dapat dilihat pada Gambar 1.

Gambar 1. Tren total kasus pneumonia balita.

Gambar 1. Tren total kasus pneumonia balita.

4.2 Ukuran Epidemiologi (IR & SIR)

4.2.1 SIR per Kecamatan Seluruh Tahun

Untuk melihat sebaran risiko relatif pneumonia pada balita secara lebih spesifik di tingkat kewilayahan, dilakukan analisis terhadap nilai Standardized Incidence Ratio (SIR) di 30 kecamatan dari tahun 2017 sampai dengan 2021 (Gambar 2). Nilai SIR digunakan untuk mengukur apakah suatu wilayah memiliki jumlah kasus yang lebih tinggi (\(\text{SIR} > 1\)) atau lebih rendah (\(\text{SIR} < 1\)) dibandingkan dengan rata-rata wilayah secara keseluruhan dalam hal ini rata-rata kasus Pneumonia Balita kota Bandung.

Gambar 2. Heatmap SIR pneumonia balita per kecamatan, 2017-2021. Merah = risiko di atas rata-rata kota (SIR>1), biru = di bawah rata-rata; kecamatan diurutkan menurun berdasarkan SIR 2021.

Gambar 2. Heatmap SIR pneumonia balita per kecamatan, 2017-2021. Merah = risiko di atas rata-rata kota (SIR>1), biru = di bawah rata-rata; kecamatan diurutkan menurun berdasarkan SIR 2021.

Dari Gambar 2 terlihat bahwa Cinambo dan Bandung Kidul secara konsisten memiliki SIR tinggi (di atas 1) sepanjang tahun, menandakan risiko pneumonia balita di kedua kecamatan ini lebih tinggi dibandingkan rata-rata Kota Bandung. Sebaliknya, sejumlah kecamatan yang berwarna biru dari 2017-2021 menunjukkan SIR rendah (di bawah 1). Terdapat pula anomali pada Kecamatan Cicendo yang memiliki SIR sangat tinggi pada 2017 (5,31) namun turun drastis pada 2021 (0,07), pola yang perlu ditelusuri lebih lanjut dan konsisten dengan dugaan gangguan pelaporan selama pandemi.

4.2.2 10 Kecamatan SIR Tertinggi per Tahun

Sepuluh kecamatan dengan SIR tertinggi untuk tiap tahun (klik tab tahun). SIR > 1 menandakan risiko di atas rata-rata kota.

2017

Sepuluh kecamatan SIR tertinggi, 2017.
Kecamatan Kasus Balita IR Expected SIR
Cicendo 1583 7928 19967.2 298.0 5.31
Bandung Kidul 860 4813 17868.3 180.9 4.75
Andir 913 8624 10586.7 324.2 2.82
Cinambo 201 2019 9955.4 75.9 2.65
Sukasari 499 6128 8143.0 230.3 2.17
Panyileukan 244 3163 7714.2 118.9 2.05
Astanaanyar 445 6228 7145.2 234.1 1.90
Gedebage 200 3172 6305.2 119.2 1.68
Babakan Ciparay 666 11036 6034.8 414.8 1.61
Cidadap 265 4406 6014.5 165.6 1.60

2018

Sepuluh kecamatan SIR tertinggi, 2018.
Kecamatan Kasus Balita IR Expected SIR
Andir 1155 8494 13597.8 319.3 3.62
Bandung Kidul 578 4740 12194.1 178.2 3.24
Cicendo 871 7808 11155.2 293.5 2.97
Sumur Bandung 277 2960 9358.1 111.3 2.49
Sukasari 563 6035 9328.9 226.9 2.48
Bojongloa Kidul 544 6938 7840.9 260.8 2.09
Cibeunying Kidul 709 9082 7806.7 341.4 2.08
Bandung Kulon 832 10875 7650.6 408.8 2.04
Cinambo 152 1988 7645.9 74.7 2.03
Panyileukan 190 3115 6099.5 117.1 1.62

2019

Sepuluh kecamatan SIR tertinggi, 2019.
Kecamatan Kasus Balita IR Expected SIR
Bandung Kulon 1107 13635 8118.8 512.5 2.16
Cinambo 158 2493 6337.7 93.7 1.69
Cicendo 560 9790 5720.1 368.0 1.52
Panyileukan 284 5349 5309.4 201.1 1.41
Bojongloa Kidul 455 8698 5231.1 327.0 1.39
Sukasari 383 7567 5061.5 284.4 1.35
Cibeunying Kidul 575 11389 5048.7 428.1 1.34
Andir 530 10650 4976.5 400.3 1.32
Astanaanyar 354 7691 4602.8 289.1 1.22
Sumur Bandung 170 3711 4581.0 139.5 1.22

2020

Sepuluh kecamatan SIR tertinggi, 2020.
Kecamatan Kasus Balita IR Expected SIR
Cinambo 171 1714 9976.7 64.4 2.65
Bandung Kidul 226 3709 6093.3 139.4 1.62
Bandung Kulon 472 8556 5516.6 321.6 1.47
Astanaanyar 184 4094 4494.4 153.9 1.20
Cicendo 241 5524 4362.8 207.6 1.16
Bojongloa Kidul 213 5538 3846.2 208.2 1.02
Andir 219 5745 3812.0 216.0 1.01
Sumur Bandung 75 1982 3784.1 74.5 1.01
Cibeunying Kidul 244 6785 3596.2 255.0 0.96
Panyileukan 80 2475 3232.3 93.0 0.86

2021

Sepuluh kecamatan SIR tertinggi, 2021.
Kecamatan Kasus Balita IR Expected SIR
Cinambo 126 1948 6468.2 73.2 1.72
Bandung Kidul 191 4296 4446.0 161.5 1.18
Arcamanik 174 5696 3054.8 214.1 0.81
Babakan Ciparay 212 10661 1988.6 400.7 0.53
Astanaanyar 85 4594 1850.2 172.7 0.49
Lengkong 65 4245 1531.2 159.6 0.41
Sumur Bandung 34 2259 1505.1 84.9 0.40
Bojongloa Kidul 89 6245 1425.1 234.7 0.38
Andir 88 6630 1327.3 249.2 0.35
Bojongloa Kaler 118 8924 1322.3 335.4 0.35

4.3 Disease Mapping: Crude SIR & Empirical Bayes

Peta crude SIR dan hasil penghalusan Empirical Bayes ditampilkan untuk seluruh tahun. EB menstabilkan estimasi pada kecamatan berpopulasi kecil sehingga pola risiko lebih andal. Setiap kecamatan diberi nomor pada peta; keterangan nomor tercantum pada kotak di bawah.

Keterangan nomor wilayah pada peta.
No Kecamatan No Kecamatan
1 Andir 16 Cicendo
2 Antapani 17 Cidadap
3 Arcamanik 18 Cinambo
4 Astanaanyar 19 Coblong
5 Babakan Ciparay 20 Gedebage
6 Bandung Kidul 21 Kiaracondong
7 Bandung Kulon 22 Lengkong
8 Bandung Wetan 23 Mandalajati
9 Batununggal 24 Panyileukan
10 Bojongloa Kaler 25 Rancasari
11 Bojongloa Kidul 26 Regol
12 Buahbatu 27 Sukajadi
13 Cibeunying Kaler 28 Sukasari
14 Cibeunying Kidul 29 Sumur Bandung
15 Cibiru 30 Ujungberung

2017

2018

2019

2020

2021

4.3.1 Perbandingan Crude SIR vs EB-smoothed SIR

Secara visual, peta crude dan EB tampak serupa karena penyesuaian Empirical Bayes umumnya kecil. Untuk melihat besarnya penyesuaian, tabel berikut menyajikan lima kecamatan dengan selisih |crude − EB| terbesar tiap tahun. Penyesuaian terbesar konsisten terjadi pada kecamatan berpopulasi kecil (mis. Cinambo), sesuai prinsip EB yang menarik estimasi wilayah kecil lebih kuat ke arah rata-rata kota.

Tabel 4. Lima kecamatan dengan penyesuaian Empirical Bayes terbesar per tahun.
Tahun Kecamatan Balita Crude_SIR EB_SIR Selisih
2017 Bandung Kidul 4813 4.75 4.73 0.02
Cinambo 2019 2.65 2.63 0.02
Andir 8624 2.82 2.81 0.01
Antapani 6259 0.40 0.41 0.01
Babakan Ciparay 11036 1.61 1.60 0.01
2018 Andir 8494 3.62 3.60 0.02
Bandung Wetan 2578 0.77 0.79 0.02
Sumur Bandung 2960 2.49 2.47 0.02
Bandung Kidul 4740 3.24 3.23 0.01
Bandung Kulon 10875 2.04 2.03 0.01
2019 Cinambo 2493 1.69 1.64 0.05
Bandung Wetan 3234 0.69 0.71 0.02
Antapani 7729 0.74 0.75 0.01
Bandung Kulon 13635 2.16 2.15 0.01
Batununggal 12188 0.58 0.59 0.01
2020 Cinambo 1714 2.65 2.54 0.11
Bandung Wetan 1496 0.25 0.28 0.03
Astanaanyar 4094 1.20 1.18 0.02
Bandung Kidul 3709 1.62 1.60 0.02
Sumur Bandung 1982 1.01 0.99 0.02
2021 Cinambo 1948 1.72 1.64 0.08
Bandung Kidul 4296 1.18 1.16 0.02
Bandung Wetan 1653 0.06 0.08 0.02
Arcamanik 5696 0.81 0.80 0.01
Buahbatu 7303 0.12 0.13 0.01

Interpretasi. Selisih crude vs EB kecil di sebagian besar kecamatan, dengan penyesuaian terbesar pada wilayah berpopulasi kecil seperti Cinambo. Kemiripan crude dan EB menunjukkan estimasi risiko di sebagian besar kecamatan sudah stabil, sehingga pola yang teramati mencerminkan variasi risiko yang nyata dan bukan ketidakstabilan akibat populasi kecil.

4.3.2 Uji Moran’s I per Tahun

Tabel 5. Moran’s I SIR pneumonia balita per tahun
Tahun Moran_I p_value
2017 -0.012 0.393
2018 0.005 0.317
2019 -0.015 0.413
2020 0.007 0.347
2021 -0.026 0.430

Interpretasi. Uji Moran’s I pada SIR menunjukkan tidak ada autokorelasi spasial yang signifikan pada seluruh tahun yang digunakan pada makalah ini (p > 0,05, dengan nilai Moran’s I mendekati nol). Hal ini menandakan bahwa dalam satu tahun tertentu, risiko pneumonia balita tidak mengelompok secara geografis, dengan kata lain kecamatan berisiko tinggi tersebar tanpa pola spasial yang jelas. Temuan ini konsisten dengan sebaran kecamatan berisiko tinggi (seperti Cicendo, Cinambo dan Bandung Kidul) yang secara geografis tidak berdekatan.

4.3.3 Uji Moran’s I Spasio-Temporal

Selain Moran’s I per tahun (murni spasial), diuji pula autokorelasi spasio-temporal melalui perluasan indeks Moran dengan bobot gabungan ruang dan waktu (Lee & Li, 2017). Dua unit kecamatan-tahun dianggap bertetangga spasio-temporal bila berada di kecamatan yang bersebelahan dan pada tahun yang sama atau berdekatan (selisih satu tahun). Uji ini menilai apakah SIR tinggi mengelompok tidak hanya secara geografis, tetapi juga terbawa dari tahun ke tahun.

## Moran's I spasio-temporal: 0.186 | p-value (permutasi): 0.001

Interpretasi. Uji Moran’s I spasial per tahun menunjukkan tidak adanya autokorelasi spasial yang signifikan (p > 0,05 pada seluruh tahun, dengan nilai mendekati nol). Sebaliknya, Moran’s I spasio-temporal bernilai 0,186 dan signifikan (p = 0,001). Kontras ini menandakan bahwa autokorelasi pada data pneumonia balita didominasi oleh dimensi temporal, bukan spasial. Risiko suatu kecamatan lebih persisten antarwaktu daripada mengelompok secara geografis dalam satu tahun.

4.4 Pemodelan Bertingkat

Pemodelan dilakukan secara bertingkat mengikuti prinsip parsimoni: dimulai dari model paling sederhana, lalu ditingkatkan hanya bila diagnostik residual menunjukkan kebutuhan. Tahapannya: (1) NB-GLM dengan efek tetap; (2) uji Moran residual untuk memeriksa pola spasial tersisa; (3) NB Mixed Model dengan efek acak kecamatan bila diperlukan; dan (4) model Spatio-Temporal NB hanya bila residual masih menunjukkan pola spasio-temporal.

## Jumlah observasi (kecamatan-tahun): 150
## Rasio dispersi (Poisson): 93.47  -> overdispersi bila > 1, mendukung Negative Binomial

4.4.1 Tahap 1 — NB-GLM (Efek Tetap)

Model Negative Binomial dengan efek tetap: enam covariate cakupan program kesehatan dan efek tahun, dengan offset(log(Balita)).

Tabel 6. IRR covariate — NB-GLM (Tahap 1).
Variabel IRR CI_2.5 CI_97.5 p_value
IDL 1.0026 0.9928 1.0124 0.606
VIT 1.0103 1.0023 1.0184 0.012
BGK 1.0709 1.0236 1.1204 0.003
BBLR 1.0180 1.0013 1.0350 0.035
PHBS 1.0016 0.9945 1.0088 0.654
RS 0.9943 0.9847 1.0039 0.242
Tabel 7. IRR efek tahun — NB-GLM (ref = 2017).
IRR CI_2.5% CI_97.5%
Tahun 2018 0.808 0.536 1.217
Tahun 2019 0.562 0.384 0.824
Tahun 2020 0.360 0.235 0.553
Tahun 2021 0.154 0.097 0.246

Interpretasi. Pada NB-GLM, gizi kurang (IRR=1,071, p=0,003), vitamin A (IRR=1,010, p=0,012), dan BBLR (IRR=1,018, p=0,035) tampak signifikan. Namun arah IRR vitamin A yang positif tidak sesuai ekspektasi teoretis (kemungkinan bias ekologis). Efek tahun menurun progresif (IRR 2021 = 0,154), signifikan sejak 2019; penurunan tajam 2020–2021 kemungkinan akibat pelaporan masa pandemi.

4.4.2 Tahap 2 — Uji Moran Residual (NB-GLM)

Diperiksa apakah residual NB-GLM masih memuat autokorelasi spasial per tahun. Bila signifikan (p < 0,05), model perlu ditingkatkan (Tahap 3).

Tabel 8. Moran’s I residual NB-GLM per tahun.
Tahun Moran_I p_value Kesimpulan
2017 0.100 0.127 Residual acak (memadai)
2018 -0.034 0.464 Residual acak (memadai)
2019 -0.151 0.851 Residual acak (memadai)
2020 0.035 0.271 Residual acak (memadai)
2021 -0.014 0.381 Residual acak (memadai)

Keputusan. Uji Moran’s I pada residual NB-GLM menunjukkan residual yang acak secara spasial pada seluruh tahun (p > 0,05, nilai Moran’s I mendekati nol). Model efek tetap tidak menyisakan autokorelasi spasial, sehingga model spasial eksplisit (CAR/BYM) tidak diperlukan. Pemodelan tetap dilanjutkan ke NB Mixed Model untuk mengakomodir kemungkinan heterogenitas risiko antarkecamatan.

4.4.3 Tahap 3 — NB Mixed Model (Random Effect Kecamatan)

Sebagai peningkatan, ditambahkan efek acak kecamatan (random intercept) untuk mengakomodir heterogenitas antarwilayah dan “meminjam kekuatan” antarunit. Model NB campuran diestimasi dengan glmmTMB.

## Simpangan baku efek acak kecamatan: 0.514  (0 = tak ada variasi antarwilayah tersisa)
Tabel 9. IRR covariate — NB Mixed Model (Tahap 3).
Variabel IRR p_value
IDL 0.9953 0.231
VIT 1.0031 0.397
BGK 1.0110 0.587
BBLR 1.0117 0.066
PHBS 1.0056 0.101
RS 1.0047 0.437
## 
## Perbandingan AIC:  NB-GLM = 1843.6  | NB Mixed = 1788.4 
## (model dengan AIC lebih rendah lebih didukung)
Tabel 10. Moran’s I residual NB Mixed Model per tahun.
Tahun Moran_I p_value Kesimpulan
2017 0.028 0.288 Residual acak (memadai)
2018 -0.148 0.842 Residual acak (memadai)
2019 -0.044 0.521 Residual acak (memadai)
2020 0.036 0.242 Residual acak (memadai)
2021 -0.039 0.492 Residual acak (memadai)

Keputusan. NB Mixed Model memberikan kecocokan jauh lebih baik daripada NB-GLM (AIC 1788,4 vs 1843,6; selisih 55,2 poin), dengan simpangan baku efek acak kecamatan 0,514 yang menunjukkan heterogenitas risiko antarwilayah substansial. Setelah efek acak dimasukkan, tidak ada covariate yang signifikan pada alpha 5% (Namun BBLR signifikan pada alpha 10%). Residual Mixed Model acak secara spasial di seluruh tahun (p > 0,05), sehingga model NB-Mixed Model dinilai memadai dan dipilih sebagai model final.

4.4.4 Peta Risiko Wilayah (dari NB Mixed Model)

Gambar 3. Peta efek acak kecamatan (NB Mixed Model), keseluruhan periode 2017-2021.

Gambar 3. Peta efek acak kecamatan (NB Mixed Model), keseluruhan periode 2017-2021.

Interpretasi & wilayah prioritas. Peta efek acak kecamatan (Gambar 3) menggambarkan risiko relatif pneumonia balita antarwilayah selama periode 2017-2021, setelah mengontrol efek tahun. Kecamatan Cinambo dan Bandung Kidul menunjukkan risiko relatif tertinggi (berwarna merah), sedangkan sebagian besar kecamatan lainnya berada di sekitar atau di bawah rata-rata kota. Kecamatan berisiko tinggi tersebar secara geografis dan tidak membentuk klaster konsisten dengan hasil uji Moran’s I spasial yang tidak signifikan. Pola ini menegaskan bahwa variasi risiko pneumonia balita di Kota Bandung bersifat antarwilayah (heterogenitas lokal) alih-alih mengelompok secara spasial, sehingga Cinambo dan Bandung Kidul menjadi kandidat prioritas intervensi berbasis wilayah.

4.5 Implikasi

Temuan analisis ini memiliki beberapa implikasi. Peta risiko relatif kecamatan mengidentifikasi Cinambo dan Bandung Kidul sebagai wilayah dengan risiko pneumonia balita yang tinggi dan konsisten sepanjang periode, sehingga keduanya menjadi kandidat prioritas untuk penguatan surveilans, penemuan kasus dini, dan intervensi kesehatan. Karena determinan program kesehatan tidak menunjukkan asosiasi yang signifikan pada tingkat agregat kecamatan sementara variasi risiko antarwilayah justru substansial, pengendalian pneumonia balita sebaiknya diarahkan secara berbasis wilayah, memfokuskan sumber daya pada kecamatan berisiko tinggi ketimbang hanya menaikkan cakupan program secara merata di seluruh kota. Analisis ini memiliki sejumlah keterbatasan. Pertama, jumlah balita yang digunakan sebagai penyebut merupakan angka sasaran/estimasi yang dapat berbeda dari populasi riil. Kedua, data kasus bersumber dari pelaporan fasilitas pelayanan kesehatan yang rentan terhadap perbedaan cakupan pencatatan, hal ini sangat menonjol pada 2020–2021, ketika penurunan kasus kemungkinan besar mencerminkan gangguan penemuan dan pelaporan selama pandemi COVID-19 sebagaimana dinyatakan dalam Profil Kesehatan Kota Bandung, bukan penurunan beban penyakit yang sesungguhnya. Ketiga, model menggunakan efek acak kecamatan yang bersifat independen, adanya indikasi bahwa risiko dasar antarwilayah cenderung mengelompok secara spasial menunjukkan bahwa pemodelan dengan struktur spasial eksplisit (seperti CAR atau BYM) dapat menjadi pengembangan yang lebih tepat pada studi lanjutan dan keempat, dalam makalah hanya menggunakan 5 tahun sebaiknya ditambahkan informasi tahun terupdate.

5 Kesimpulan

Insidens pneumonia balita yang tercatat di Kota Bandung menurun tajam sepanjang 2017–2021, dari 10.735 kasus (IR 5.294 per 100.000 balita) menjadi 2.003 kasus (IR 1.141), dengan penurunan terbesar pada masa pandemi yang kemungkinan dipengaruhi gangguan pelaporan. Analisis SIR dan penghalusan Empirical Bayes membantu mengidentifikasi kecamatan berisiko tinggi secara lebih andal, dengan Cinambo dan Bandung Kidul konsisten menunjukkan risiko di atas rata-rata kota. Uji autokorelasi menunjukkan pola yang khas: Moran’s I spasial per tahun lemah dan tidak signifikan, sementara Moran’s I spasio-temporal signifikan (0,186; p = 0,001), menandakan bahwa dinamika risiko lebih digerakkan oleh dimensi temporal daripada pengelompokan geografis dalam satu tahun. Melalui pemodelan bertingkat, NB Mixed Model dengan efek acak kecamatan terpilih sebagai model terbaik (AIC 1788,4 vs 1843,6), dengan simpangan baku efek acak 0,514 yang menegaskan heterogenitas risiko antarwilayah. Hanya satu covariate cakupan program kesehatan yang berasosiasi signifikan pada model final (menggunakan alpha 10%), yang mengindikasikan determinan program tidak menunjukkan asosiasi kuat di tingkat agregat kecamatan. Pengendalian pneumonia balita di Kota Bandung sebaiknya diarahkan berbasis wilayah dengan memprioritaskan kecamatan berisiko tinggi seperti Cinambo dan Bandung Kidul, disertai penguatan sistem pencatatan dan pelaporan kasus agar data lebih mencerminkan beban penyakit yang sesungguhnya.

6 Daftar Pustaka

  1. Brooks, M. E., et al. (2017). glmmTMB balances speed and flexibility among packages for zero-inflated generalized linear mixed models. The R Journal
  2. Clayton, D., & Kaldor, J. (1987). Empirical Bayes estimates of age-standardized relative risks for use in disease mapping. Biometrics
  3. Cliff, A. D., & Ord, J. K. (1981). Spatial processes: Models and applications. London: Pion.
  4. Dinas Kesehatan Kota Bandung. (2016). Profil Kesehatan Kota Bandung Tahun 2016. Bandung: Dinas Kesehatan Kota Bandung.
  5. Dinas Kesehatan Kota Bandung. (2021). Profil Kesehatan Kota Bandung Tahun 2021. Bandung: Dinas Kesehatan Kota Bandung.
  6. Hilbe, J. M. (2012). Negative Binomial Regression (2nd ed.). Cambridge: Cambridge University Press.
  7. Kementerian Kesehatan Republik Indonesia. (2023). Pemerintah berkomitmen turunkan kasus kematian akibat pneumonia. Jakarta: Kemenkes RI. Diakses dari https://www.kemkes.go.id/id/%20pemerintah-berkomitmen-turunkan-kasus-kematian-akibat-pneumonia
  8. Lee, J., & Li, S. (2017). Extending Moran’s index for measuring spatiotemporal clustering of geographic events. Geographical Analysis
  9. Marshall, R. J. (1991). Mapping disease and mortality rates using empirical Bayes estimators. Journal of the Royal Statistical Society: Series C (Applied Statistics)
  10. Moran, P. A. P. (1950). Notes on continuous stochastic phenomena. Biometrika
  11. World Health Organization. (2022). Pneumonia in children. Geneva: WHO. Diakses dari https://www.who.int/news-room/fact-sheets/detail/pneumonia

Informasi sesi R
## R version 4.5.2 (2025-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Dutch_Belgium.utf8  LC_CTYPE=Dutch_Belgium.utf8   
## [3] LC_MONETARY=Dutch_Belgium.utf8 LC_NUMERIC=C                  
## [5] LC_TIME=Dutch_Belgium.utf8    
## 
## time zone: Europe/Brussels
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] glmmTMB_1.1.14   patchwork_1.3.2  scales_1.4.0     MASS_7.3-65     
##  [5] kableExtra_1.4.0 knitr_1.51       spdep_1.4-2      spData_2.3.5    
##  [9] sf_1.1-1         readxl_1.5.0     lubridate_1.9.5  forcats_1.0.1   
## [13] stringr_1.6.0    dplyr_1.2.1      purrr_1.2.2      readr_2.2.0     
## [17] tidyr_1.3.2      tibble_3.3.1     ggplot2_4.0.3    tidyverse_2.0.0 
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1    viridisLite_0.4.3   farver_2.1.2       
##  [4] S7_0.2.2            fastmap_1.2.0       digest_0.6.39      
##  [7] timechange_0.4.0    lifecycle_1.0.5     magrittr_2.0.5     
## [10] compiler_4.5.2      rlang_1.2.0         sass_0.4.10        
## [13] tools_4.5.2         igraph_2.3.2        yaml_2.3.12        
## [16] labeling_0.4.3      sp_2.2-1            classInt_0.4-11    
## [19] xml2_1.5.2          RColorBrewer_1.1-3  KernSmooth_2.23-26 
## [22] numDeriv_2016.8-1.1 withr_3.0.2         grid_4.5.2         
## [25] e1071_1.7-17        cli_3.6.6           rmarkdown_2.31     
## [28] reformulas_0.4.4    generics_0.1.4      otel_0.2.0         
## [31] rstudioapi_0.19.0   tzdb_0.5.0          minqa_1.2.8        
## [34] DBI_1.3.0           cachem_1.1.0        proxy_0.4-29       
## [37] splines_4.5.2       s2_1.1.11           cellranger_1.1.0   
## [40] vctrs_0.7.3         sandwich_3.1-1      boot_1.3-32        
## [43] Matrix_1.7-4        jsonlite_2.0.0      hms_1.1.4          
## [46] systemfonts_1.3.2   jquerylib_0.1.4     units_1.0-1        
## [49] glue_1.8.1          nloptr_2.2.1        stringi_1.8.7      
## [52] gtable_0.3.6        deldir_2.0-4        lme4_2.0-1         
## [55] pillar_1.11.1       htmltools_0.5.9     R6_2.6.1           
## [58] TMB_1.9.21          wk_0.9.5            textshaping_1.0.5  
## [61] Rdpack_2.6.6        evaluate_1.0.5      lattice_0.22-7     
## [64] rbibutils_2.4.1     bslib_0.11.0        class_7.3-23       
## [67] Rcpp_1.1.1-1.1      svglite_2.2.2       nlme_3.1-168       
## [70] mgcv_1.9-3          xfun_0.58           zoo_1.8-15         
## [73] pkgconfig_2.0.3
LS0tDQp0aXRsZTogIkFuYWxpc2lzIERpc2Vhc2UgTWFwcGluZyBkYW4gU3Bhc2lvLVRlbXBvcmFsIFBuZXVtb25pYSBCYWxpdGEgZGkgS290YSBCYW5kdW5nIg0KYXV0aG9yOiAiV2luYWxpYSBBZ3dpbCAoMjUwMjMwMjUwMDA3KSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOg0KICAgICAgdmVyc2lvbjogNQ0KICAgICAgYm9vdHN3YXRjaDogY29zbW8NCiAgICAgIHByaW1hcnk6ICIjMWE2OTg1Ig0KICAgICAgYmFzZV9mb250OiB7IGdvb2dsZTogIkludGVyIiB9DQogICAgICBoZWFkaW5nX2ZvbnQ6IHsgZ29vZ2xlOiAiUG9wcGlucyIgfQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogeyBjb2xsYXBzZWQ6IGZhbHNlIH0NCiAgICB0b2NfZGVwdGg6IDMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgZGZfcHJpbnQ6IGRlZmF1bHQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwNCiAgZmlnLmFsaWduPSJjZW50ZXIiLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01LCBkcGk9MTUwLCBvdXQud2lkdGg9IjEwMCUiKQ0Kb3B0aW9ucyhzY2lwZW49OTk5KQ0Kc2V0LnNlZWQoMTIzKQ0KYGBgDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQpib2R5eyBsaW5lLWhlaWdodDoxLjc7IH0gcHsgdGV4dC1hbGlnbjpqdXN0aWZ5OyB9DQpoMSxoMixoM3sgdGV4dC1hbGlnbjpsZWZ0OyB9DQouaW5mb2JveHsgYmFja2dyb3VuZDojZjRmOGZhOyBib3JkZXItbGVmdDo1cHggc29saWQgIzFhNjk4NTsgcGFkZGluZzoxNHB4IDE4cHg7IGJvcmRlci1yYWRpdXM6OHB4OyBtYXJnaW46MTZweCAwOyB9DQpjYXB0aW9ueyBjYXB0aW9uLXNpZGU6dG9wICFpbXBvcnRhbnQ7IHRleHQtYWxpZ246bGVmdDsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojMzMzOyBwYWRkaW5nLWJvdHRvbTo2cHg7IH0NCmBgYA0KDQpgYGB7ciBsaWJyYXJ5fQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHNwZGVwKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGdsbW1UTUIpDQpgYGANCg0KIyBBYnN0cmFrIHsjYWJzdHJha30NCg0KUG5ldW1vbmlhIG1lcnVwYWthbiBzYWxhaCBzYXR1IHBlbnllYmFiIHV0YW1hIGtlbWF0aWFuIHBhZGEgYmFsaXRhLiBQZW5lbGl0aWFuIGluaSBtZW1ldGFrYW4gc2ViYXJhbiByaXNpa28gZGFuIG1lbmdhbmFsaXNpcyBkaW5hbWlrYSBzcGFzaW8tdGVtcG9yYWwgaW5zaWRlbnMgcG5ldW1vbmlhIGJhbGl0YSBkaSAzMCBrZWNhbWF0YW4gS290YSBCYW5kdW5nIHNlbGFtYSAyMDE34oCTMjAyMS4gRGF0YSBrYXN1cywganVtbGFoIGJhbGl0YSwgZGFuIGVuYW0gaW5kaWthdG9yIGNha3VwYW4gcHJvZ3JhbSBrZXNlaGF0YW4gYmVyc3VtYmVyIGRhcmkgUHJvZmlsIEtlc2VoYXRhbiBLb3RhIEJhbmR1bmcuIFJpc2lrbyBkaXVrdXIgZGVuZ2FuIGluY2lkZW5jZSByYXRlIChJUikgZGFuIHN0YW5kYXJkaXplZCBpbmNpZGVuY2UgcmF0aW8gKFNJUikgeWFuZyBkaWhhbHVza2FuIGRlbmdhbiBFbXBpcmljYWwgQmF5ZXMsIGF1dG9rb3JlbGFzaSBkaXVqaSBkZW5nYW4gTW9yYW4ncyBJIHNwYXNpYWwgZGFuIHNwYXNpby10ZW1wb3JhbCwgZGFuIGRpbmFtaWthIHJpc2lrbyBkaW1vZGVsa2FuIHNlY2FyYSBiZXJ0aW5na2F0IGRhcmkgTmVnYXRpdmUgQmlub21pYWwgR0xNIGhpbmdnYSBOZWdhdGl2ZSBCaW5vbWlhbCBNaXhlZCBNb2RlbCBkZW5nYW4gZWZlayBhY2FrIGtlY2FtYXRhbi4gSnVtbGFoIGthc3VzIHRlcmNhdGF0IG1lbnVydW4gdGFqYW0sIGRhcmkgMTAuNzM1ICgyMDE3KSBtZW5qYWRpIDIuMDAzICgyMDIxKSwgZGVuZ2FuIHBlbnVydW5hbiB0ZXJiZXNhciBwYWRhIG1hc2EgcGFuZGVtaSB5YW5nIGtlbXVuZ2tpbmFuIG1lbmNlcm1pbmthbiBnYW5nZ3VhbiBwZWxhcG9yYW4uIEhhc2lsIHVqaSBNb3JhbidzIEkgc3Bhc2lhbCBwZXIgdGFodW4gdGlkYWsgc2lnbmlmaWthbiwgc2VkYW5na2FuIE1vcmFuJ3MgSSBzcGFzaW8tdGVtcG9yYWwgc2lnbmlmaWthbiAoMCwxODY7IHAgPSAwLDAwMSksIG1lbnVuanVra2FuIGRvbWluYXNpIGRpbWVuc2kgdGVtcG9yYWwuIE5CIE1peGVkIE1vZGVsIHRlcnBpbGloIHNlYmFnYWkgbW9kZWwgdGVyYmFpayAoQUlDIDE3ODgsNCB2cyAxODQzLDYpIGRlbmdhbiBzaW1wYW5nYW4gYmFrdSBlZmVrIGFjYWsga2VjYW1hdGFuIDAsNTE0IGRhbiByZXNpZHVhbCB5YW5nIGFjYWsgc2VjYXJhIHNwYXNpYWwuIFRpZGFrIGFkYSBjb3ZhcmlhdGUgcHJvZ3JhbSBrZXNlaGF0YW4geWFuZyBzaWduaWZpa2FuIChhbHBoYSA1JSkgcGFkYSBtb2RlbCBmaW5hbC4gS2VjYW1hdGFuIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgdGVyaWRlbnRpZmlrYXNpIHNlYmFnYWkgd2lsYXlhaCBwcmlvcml0YXMuIFBlbmdlbmRhbGlhbiBwbmV1bW9uaWEgYmFsaXRhIGRpc2FyYW5rYW4gYmVyYmFzaXMgd2lsYXlhaCBkZW5nYW4gcGVuZ3VhdGFuIHBlbmNhdGF0YW4ga2FzdXMuDQoNCkthdGEga3VuY2k6IGRpc2Vhc2UgbWFwcGluZywgRW1waXJpY2FsIEJheWVzLCBOZWdhdGl2ZSBCaW5vbWlhbCBNaXhlZCBNb2RlbCwgcG5ldW1vbmlhIGJhbGl0YSwgIHNwYXNpby10ZW1wb3JhbA0KDQojIFBlbmRhaHVsdWFuIHsjcGVuZGFodWx1YW59DQoNClBuZXVtb25pYSBhZGFsYWggaW5mZWtzaSBzYWx1cmFuIHBlcm5hcGFzYW4gYWt1dCB5YW5nIG1lbnllcmFuZyBhbHZlb2xpLCBrYW50dW5nLWthbnR1bmcgdWRhcmEgZGkgcGFydS4gS2V0aWthIHRlcmluZmVrc2ksIGFsdmVvbGkgdGVyaXNpIGNhaXJhbiBhdGF1IG5hbmFoIHNlaGluZ2dhIHBlbmRlcml0YSBzdWxpdCBiZXJuYXBhcyBkYW4gYXN1cGFuIG9rc2lnZW5ueWEgYmVya3VyYW5nLiBQZW55YWtpdCBpbmkgbWVuamFkaSBwZW55ZWJhYiBrZW1hdGlhbiBtZW51bGFyIHRlcmJlc2FyIHBhZGEgYW5hayBkaSBkdW5pYTogcGFkYSAyMDE5LCBwbmV1bW9uaWEgbWVyZW5nZ3V0IDc0MC4xODAgYW5hayBkaSBiYXdhaCBsaW1hIHRhaHVuLCBhdGF1IDE0JSBkYXJpIHNlbHVydWgga2VtYXRpYW4gYmFsaXRhIGdsb2JhbCwgZGVuZ2FuIGJlYmFuIHRlcnRpbmdnaSBkaSBBc2lhIFNlbGF0YW4gZGFuIEFmcmlrYSBTdWItU2FoYXJhIChXSE8sIDIwMjIpLg0KDQpEaSBJbmRvbmVzaWEsIHBuZXVtb25pYSBtZW5qYWRpIHNhbGFoIHNhdHUgcGVueWViYWIgdXRhbWEga2VtYXRpYW4gYmFsaXRhLiBNZW51cnV0IEtlbWVudGVyaWFuIEtlc2VoYXRhbiwgcGVueWFraXQgaW5pIG1lcmVuZ2d1dCBsZWJpaCBiYW55YWsgbnlhd2EgYmFsaXRhIGRhcmlwYWRhIGdhYnVuZ2FuIEFJRFMsIG1hbGFyaWEsIGRhbiBjYW1wYWssIHNlaGluZ2dhIHBlbWVyaW50YWggbWVueXVzdW4gUmVuY2FuYSBBa3NpIE5hc2lvbmFsIFBlbmFuZ2d1bGFuZ2FuIFBuZXVtb25pYSBkYW4gRGlhcmUgMjAyMy0yMDMwIHVudHVrIG1lbmVrYW4gYW5na2Ega2VtYXRpYW4gKEtlbWVua2VzIFJJLCAyMDIzKS4gRGkgS290YSBCYW5kdW5nLCBwbmV1bW9uaWEgYmFsaXRhIGRpcGFudGF1IHNlY2FyYSBydXRpbiBtZWxhbHVpIGNha3VwYW4gcGVuZW11YW4gZGFuIHBlbmFuZ2FuYW4ga2FzdXMgcGVyIGtlY2FtYXRhbiAoRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZywgMjAyMSkuIFNlYmFnYWkga290YSBiZXNhciBkZW5nYW4gYXJ1cyB1cmJhbmlzYXNpIHRpbmdnaSwga2VwYWRhdGFuIHBlbmR1ZHVrIHlhbmcgYmVydmFyaWFzaSBhbnRhcndpbGF5YWgsIGRhbiBzdHJhdGEgc29zaWFsIGVrb25vbWkgeWFuZyBoZXRlcm9nZW4gKERpbmFzIEtlc2VoYXRhbiBLb3RhIEJhbmR1bmcsIDIwMTYpLCByaXNpa28gcG5ldW1vbmlhIGJhbGl0YSBkYXBhdCBiZXJiZWRhLWJlZGEgYW50YXJrZWNhbWF0YW4uDQoNCkp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIHlhbmcgdGVyY2F0YXQgZGkgS290YSBCYW5kdW5nIG1lbnVydW4gc2VsYW1hIDIwMTctMjAyMSAoR2FtYmFyIDEpLCBkYXJpIDEwLjczNSBrYXN1cyBwYWRhIDIwMTcgbWVuamFkaSAxMC41MjUgKDIwMTgpLCA5LjcxNiAoMjAxOSksIDQuMDc1ICgyMDIwKSwgZGFuIDIuMDAzIGthc3VzIHBhZGEgMjAyMSAoRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZywgMjAyMSkuIEFuZ2thIGFncmVnYXQgdGFodW5hbiBzZXBlcnRpIGluaSBtZW55ZW1idW55aWthbiBkdWEgaGFsOiBiYWdhaW1hbmEgcmlzaWtvIHRlcnNlYmFyIGFudGFya2VjYW1hdGFuLCBkYW4gYmFnYWltYW5hIHBvbGEgdGVyc2VidXQgYmVydWJhaCBkYXJpIHRhaHVuIGtlIHRhaHVuLiBQZW51cnVuYW4gdGFqYW0gcGFkYSAyMDIwLTIwMjEganVnYSBwZXJsdSBkaXRlbGFhaCBrYXJlbmEgYmVydGVwYXRhbiBkZW5nYW4gcGFuZGVtaSBDT1ZJRC0xOSB5YW5nIGRhcGF0IG1lbWVuZ2FydWhpIHBlbmVtdWFuIGRhbiBwZWxhcG9yYW4ga2FzdXMuIEFuYWxpc2lzIHNwYXNpby10ZW1wb3JhbCBtZW5qYXdhYiBrZWR1YW55YSBzZWthbGlndXM6IG1lbWV0YWthbiByaXNpa28gcGVyIGtlY2FtYXRhbiBkYW4gbWVuZWx1c3VyaSBwZXJ1YmFoYW5ueWEgYW50YXJ3YWt0dSwgc2VoaW5nZ2Egd2lsYXlhaCBkYW4gcGVyaW9kZSBiZXJpc2lrbyB0aW5nZ2kgZGFwYXQgZGlpZGVudGlmaWthc2kgbGViaWggdGVwYXQuDQoNCioqVHVqdWFuIGFuYWxpc2lzKio6ICgxKSBtZW5kZXNrcmlwc2lrYW4gc2ViYXJhbiBkYW4gdHJlbiBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIGFudGFya2VjYW1hdGFuDQpkaSBLb3RhIEJhbmR1bmc7ICgyKSBtZW5naGl0dW5nIHVrdXJhbiByaXNpa28gZXBpZGVtaW9sb2dpIChJUiBkYW4gU0lSKTsgKDMpIG1lbWV0YWthbg0KdmFyaWFzaSByaXNpa28gZGFuIG1lbmVyYXBrYW4gcGVuZ2hhbHVzYW4gc3Bhc2lhbDsgc2VydGEgKDQpIG1lbW9kZWxrYW4gZGluYW1pa2EgcmlzaWtvDQptZW51cnV0IHdpbGF5YWggZGFuIHdha3R1Lg0KDQojIERhdGEgZGFuIE1ldG9kZSB7I2RhdGEtbWV0b2RlfQ0KDQoqKlN1bWJlciBkYXRhLioqIEp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIGRhbiBqdW1sYWggYmFsaXRhIHBlciBrZWNhbWF0YW4gYmVyc3VtYmVyIGRhcmkNClByb2ZpbCBLZXNlaGF0YW4gS290YSBCYW5kdW5nIChEaW5hcyBLZXNlaGF0YW4gS290YSBCYW5kdW5nKS4gQmF0YXMgd2lsYXlhaCBrZWNhbWF0YW4NCmJlcnN1bWJlciBkYXJpIGRhdGEgR2VvSlNPTiBhZG1pbmlzdHJhc2kgS290YSBCYW5kdW5nLiBVbml0IGFuYWxpc2lzOiAzMCBrZWNhbWF0YW47IHBlcmlvZGU6DQoyMDE3LTIwMjEgKGxpbWEgdGFodW4sIDMwIGtlY2FtYXRhbiwgdG90YWwgMTUwIG9ic2VydmFzaSBrZWNhbWF0YW4tdGFodW4pLg0KDQoqKlZhcmlhYmVsIHBlbmVsaXRpYW4uKiogRGF0YSBtZW11YXQgdmFyaWFiZWwgcmVzcG9ucyAoanVtbGFoIGthc3VzIHBuZXVtb25pYSBiYWxpdGEpLCBwb3B1bGFzaQ0KYmVyaXNpa28gKGp1bWxhaCBiYWxpdGEpLCBzZXJ0YSBlbmFtIGNvdmFyaWF0ZSBjYWt1cGFuIHByb2dyYW0ga2VzZWhhdGFuIChkYWxhbSBwZXJzZW4pOg0KDQpgYGB7ciB0YWJlbC12YXJpYWJlbCwgZWNobz1GQUxTRX0NCmRhdGEuZnJhbWUoDQogIFZhcmlhYmVsID0gYygiUG5ldW1vbmlhIiwiSnVtbGFoX0JhbGl0YSIsIklETCIsIlZJVCIsIkJHSyIsIkJCTFIiLCJQSEJTIiwiUlMiKSwNCiAgS2V0ZXJhbmdhbiA9IGMoDQogICAgIkp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhICh2YXJpYWJlbCByZXNwb25zL291dGNvbWUpIiwNCiAgICAiSnVtbGFoIGJhbGl0YSAocG9wdWxhc2kgYmVyaXNpa28sIGRpcGFrYWkgc2ViYWdhaSBvZmZzZXQpIiwNCiAgICAiQ2FrdXBhbiBJbXVuaXNhc2kgRGFzYXIgTGVuZ2thcCAoJSkiLA0KICAgICJDYWt1cGFuIHBlbWJlcmlhbiBWaXRhbWluIEEgcGFkYSBiYWxpdGEgKCUpIiwNCiAgICAiUGVyc2VudGFzZSBiYWxpdGEgZGVuZ2FuIGJlcmF0IGt1cmFuZyAvIGdpemkga3VyYW5nICglKSIsDQogICAgIlBlcnNlbnRhc2UgQmF5aSBCZXJhdCBMYWhpciBSZW5kYWggKCUpIiwNCiAgICAiQ2FrdXBhbiBQZXJpbGFrdSBIaWR1cCBCZXJzaWggZGFuIFNlaGF0ICglKSIsDQogICAgIlBlcnNlbnRhc2UgUnVtYWggU2VoYXQgLyBtZW1lbnVoaSBzeWFyYXQgKCUpIiksDQogIFBlcmFuID0gYygiUmVzcG9ucyIsIk9mZnNldCIsIlByZWRpa3RvciIsIlByZWRpa3RvciIsIlByZWRpa3RvciIsDQogICAgICAgICAgICAiUHJlZGlrdG9yIiwiUHJlZGlrdG9yIiwiUHJlZGlrdG9yIikNCikgJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDEuIERlc2tyaXBzaSB2YXJpYWJlbCBkYWxhbSBkYXRhLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCioqVWt1cmFuIEVwaWRlbWlvbG9naS4qKg0KJCQgSVI9XGZyYWN7T19pfXtQX2l9XHRpbWVzIDEwMHsufTAwMCwgXHF1YWQgRV9pPVBfaVx0aW1lc1xmcmFje1xzdW0gT317XHN1bSBQfSwgXHF1YWQgU0lSX2k9XGZyYWN7T19pfXtFX2l9ICQkDQpkZW5nYW4gJE9faSQga2FzdXMgdGVyYW1hdGksICRQX2kkIHBvcHVsYXNpIGJhbGl0YSBiZXJpc2lrby4gU0lSID4gMSBtZW5naW5kaWthc2lrYW4gcmlzaWtvIGRpIGF0YXMNCnJhdGEtcmF0YSBrb3RhIChDbGF5dG9uICYgS2FsZG9yLCAxOTg3KS4NCg0KKipEaXNlYXNlIG1hcHBpbmcuKiogUGV0YSByaXNpa28ga2FzYXIgKGNydWRlIFNJUikgZGFuIHBlbmdoYWx1c2FuIEVtcGlyaWNhbCBCYXllcyBtZW5nZ3VuYWthbiBlc3RpbWF0b3IgZ2xvYmFsIGJlcmRhc2Fya2FuIG1ldG9kZSBNYXJzaGFsbCAoMTk5MSkgdW50dWsgbWVuc3RhYmlsa2FuIGVzdGltYXNpIHBhZGEgd2lsYXlhaCBiZXJwb3B1bGFzaSBrZWNpbC4gQXV0b2tvcmVsYXNpIHNwYXNpYWwgZGl1amkgZGVuZ2FuIE1vcmFuJ3MgSSAoTW9yYW4sIDE5NTA7IENsaWZmICYgT3JkLCAxOTgxKQ0KDQoqKlNwYXNpby10ZW1wb3JhbC4qKiBQZW1vZGVsYW4gZGlsYWt1a2FuIGJlcnRhaGFwOiAoMSkgTkItR0xNIGRlbmdhbiBlZmVrIHRldGFwDQooY292YXJpYXRlICsgZWZlayB0YWh1biwgb2Zmc2V0IGp1bWxhaCBiYWxpdGEpOyAoMikgdWppIE1vcmFuJ3MgSSBwYWRhIHJlc2lkdWFsOyAoMykgTkIgTWl4ZWQNCk1vZGVsIGRlbmdhbiBlZmVrIGFjYWsga2VjYW1hdGFuIGJpbGEgdGVyZGFwYXQgaGV0ZXJvZ2VuaXRhcyBhbnRhcndpbGF5YWg7IGRhbiAoNCkgbW9kZWwNClNwYXRpby1UZW1wb3JhbCBOQiBla3NwbGlzaXQgaGFueWEgYmlsYSByZXNpZHVhbCBtYXNpaCBtZW51bmp1a2thbiBwb2xhIHNwYXNpby10ZW1wb3JhbC4gTW9kZWwgTmVnYXRpdmUgQmlub21pYWwgZGlwaWxpaCBrYXJlbmEgZGF0YSBjYWNhaGFuIHBlbnlha2l0IHVtdW1ueWEgb3ZlcmRpc3BlcnNpIChIaWxiZSwgMjAxMikuDQoNCk1vZGVsDQpOQiBkaW55YXRha2FuIHNlYmFnYWkgJFxsb2coXG11X3tpdH0pID0gXGxvZyhQX3tpdH0pICsgXGJldGFfMCArIFxzdW1fayBcYmV0YV9rIFhfe2ssaXR9ICsgXHN1bV90IFxnYW1tYV90IFx0ZXh0e1RhaHVufV90JCwNCmRlbmdhbiBla3Nwb25lbiBrb2VmaXNpZW4gZGl0YWZzaXJrYW4gc2ViYWdhaSAqaW5jaWRlbmNlIHJhdGUgcmF0aW8qIChJUlIpOyBwYWRhIG1vZGVsDQpjYW1wdXJhbiBkaXRhbWJhaGthbiBlZmVrIGFjYWsga2VjYW1hdGFuICR1X2kgXHNpbSBOKDAsXHNpZ21hXjIpJC4NCg0KYGBge3IgYmFjYS1kYXRhfQ0KdXNlciA8LSAiV2luYWxpYWFnd2lsIjsgcmVwbyA8LSAiUG5ldW1vbmlhX0JhbmR1bmciOyBicmFuY2ggPC0gIm1haW4iDQpiYXNlIDwtIHNwcmludGYoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8lcy8lcy8lcy8iLCB1c2VyLCByZXBvLCBicmFuY2gpDQoNCmRvd25sb2FkLmZpbGUocGFzdGUwKGJhc2UsImRhdGFfcG5ldW1vbmlhX2JhbmR1bmdfdmVyMS54bHN4IiksICJkYXRhLnhsc3giLCBtb2RlPSJ3YiIsIHF1aWV0PVRSVUUpDQpkb3dubG9hZC5maWxlKHBhc3RlMChiYXNlLCJiYW5kdW5nX2tlY2FtYXRhbi56aXAiKSwgInNocC56aXAiLCBtb2RlPSJ3YiIsIHF1aWV0PVRSVUUpDQp1bnppcCgic2hwLnppcCIsIGV4ZGlyPSJzaHAiKQ0KDQpkYXQgPC0gcmVhZF9leGNlbCgiZGF0YS54bHN4IikgJT4lDQogIG11dGF0ZShLZWNhbWF0YW4gPSBzdHJfc3F1aXNoKHRvdXBwZXIoS2VjYW1hdGFuKSksDQogICAgICAgICBUYWh1biA9IGFzLmludGVnZXIoVGFodW4pLA0KICAgICAgICAgUG5ldW1vbmlhID0gYXMubnVtZXJpYyhQbmV1bW9uaWEpLA0KICAgICAgICAgQmFsaXRhID0gYXMubnVtZXJpYyhKdW1sYWhfQmFsaXRhKSkgJT4lDQogIGZpbHRlcighaXMubmEoQmFsaXRhKSkNCg0KcGV0YSA8LSBzdF9yZWFkKGxpc3QuZmlsZXMoInNocCIsIHBhdHRlcm49IlxcLnNocCQiLCBmdWxsLm5hbWVzPVRSVUUpWzFdLCBxdWlldD1UUlVFKQ0KcGV0YSRLZWNhbWF0YW4gPC0gc3RyX3NxdWlzaCh0b3VwcGVyKHBldGEkS2VjYW1hdGFuKSkNCnNmOjpzZl91c2VfczIoRkFMU0UpOyBwZXRhIDwtIHNmOjpzdF9tYWtlX3ZhbGlkKHBldGEpDQoNCg0KcGV0YSA8LSBwZXRhICU+JSBhcnJhbmdlKEtlY2FtYXRhbikgJT4lIG11dGF0ZShObyA9IHJvd19udW1iZXIoKSkNCg0KcGV0YV9sYmwgPC0gc3VwcHJlc3NXYXJuaW5ncygNCiAgY2JpbmQoc2Y6OnN0X2Ryb3BfZ2VvbWV0cnkocGV0YVssYygiTm8iLCJLZWNhbWF0YW4iKV0pLA0KICAgICAgICBzZjo6c3RfY29vcmRpbmF0ZXMoc2Y6OnN0X3BvaW50X29uX3N1cmZhY2UocGV0YSkpKQ0KKQ0KDQprZXRfd2lsYXlhaCA8LSBwZXRhICU+JSBzZjo6c3RfZHJvcF9nZW9tZXRyeSgpICU+JQ0KICB0cmFuc211dGUoTm8sIEtlY2FtYXRhbiA9IHN0cl90b190aXRsZShLZWNhbWF0YW4pKSAlPiUgYXJyYW5nZShObykNCg0KdGFodW5fdGVyc2VkaWEgPC0gc29ydCh1bmlxdWUoZGF0JFRhaHVuKSkNCmBgYA0KDQojIEhhc2lsIGRhbiBQZW1iYWhhc2FuIHsjaGFzaWx9DQoNCiMjIEFuYWxpc2lzIERlc2tyaXB0aWYNCg0KQmVyZGFzYXJrYW4gZGF0YSB5YW5nIGRpc2FqaWthbiBwYWRhIFRhYmVsIDIsIGp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIGRpIEtvdGEgQmFuZHVuZyBtZW51cnVuIGRhcmkgMTAuNzM1IGthc3VzIHBhZGEgMjAxNyBtZW5qYWRpIDIuMDAzIGthc3VzIHBhZGEgMjAyMS4gVHJlbiBwZW51cnVuYW4gaW5pIHRlcmNlcm1pbiBwdWxhIHBhZGEgKmluY2lkZW5jZSByYXRlKiAoSVIpIHBlciAxMDAuMDAwIGJhbGl0YSwgeWFuZyBtZW51cnVuIGRhcmkgdGFodW4ga2UgdGFodW4uIEJlcmJlZGEgZGVuZ2FuIHRyZW4gdG90YWwga2FzdXMgeWFuZyBtZW51cnVuLCBwb3B1bGFzaSBiYWxpdGEgbWVudW5qdWtrYW4gcGVyZ2VyYWthbiB5YW5nIGZsdWt0dWF0aWYuIFBvcHVsYXNpIHRlcnRpbmdnaSB0ZXJjYXRhdCBwYWRhIHRhaHVuIDIwMTkgKDI1NCw3ODAgYmFsaXRhKSBkYW4gbWVuZ2FsYW1pIHBlbnVydW5hbiBzaWduaWZpa2FuIHBhZGEgdGFodW4gMjAyMCAoMTUyLDkyOCBiYWxpdGEpIHNlYmVsdW0ga2VtYmFsaSBtZW5pbmdrYXQgcGFkYSB0YWh1biAyMDIxICgxNzUsNjE0IGJhbGl0YSkuDQoNCmBgYHtyIGRlc2tyaXB0aWZ9DQpkYXQgJT4lIGdyb3VwX2J5KFRhaHVuKSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsX0thc3VzPXN1bShQbmV1bW9uaWEpLCBUb3RhbF9CYWxpdGE9c3VtKEJhbGl0YSksDQogICAgICAgICAgICBJUl9rb3RhPXJvdW5kKHN1bShQbmV1bW9uaWEpL3N1bShCYWxpdGEpKjFlNSwxKSkgJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDIuIFJpbmdrYXNhbiBrYXN1cyAmIHBvcHVsYXNpIGJhbGl0YSBwZXIgdGFodW4uIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aD1GQUxTRSwgYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImhvdmVyIikpDQpgYGANCg0KSnVtbGFoIGthc3VzIHBuZXVtb25pYSBiYWxpdGEgZGkgS290YSBCYW5kdW5nIG1lbnVydW4gZGFyaSAxMC43MzUga2FzdXMgcGFkYSAyMDE3IG1lbmphZGkgMi4wMDMga2FzdXMgcGFkYSAyMDIxLCBkZW5nYW4gcGVudXJ1bmFuIHRhamFtIHBhZGEgdGFodW4gMjAyMC0yMDIxIHNlaXJpbmcgZGVuZ2FuIG1lbnVydW5ueWEganVtbGFoIGt1bmp1bmdhbiBtYXN5YXJha2F0IGtlIGZhc2lsaXRhcyBrZXNlaGF0YW4gYWtpYmF0IHBhbmRlbWkgQ09WSUQtMTkgKERpbmFzIEtlc2VoYXRhbiBLb3RhIEJhbmR1bmcsIDIwMTYpLiBUcmVuIHRvdGFsIGthc3VzIHBuZXVtb25pYSBiYWxpdGEgZGFyaSB0YWh1biAyMDE3IGhpbmdnYSAyMDIxIGRhcGF0IGRpbGloYXQgcGFkYSBHYW1iYXIgMS4NCg0KYGBge3IgdHJlbiwgZmlnLmNhcD0iR2FtYmFyIDEuIFRyZW4gdG90YWwga2FzdXMgcG5ldW1vbmlhIGJhbGl0YS4ifQ0KZGF0ICU+JSBncm91cF9ieShUYWh1bikgJT4lIHN1bW1hcmlzZShUb3RhbD1zdW0oUG5ldW1vbmlhKSkgJT4lDQogIGdncGxvdChhZXMoZmFjdG9yKFRhaHVuKSwgVG90YWwsIGdyb3VwPTEpKSArDQogIGdlb21fbGluZShjb2xvcj0iIzFhNjk4NSIsIGxpbmV3aWR0aD0xKSArIGdlb21fcG9pbnQoc2l6ZT0zLCBjb2xvcj0iIzFhNjk4NSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1jb21tYShUb3RhbCkpLCB2anVzdD0tMSwgc2l6ZT0zLjUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1jb21tYSwgZXhwYW5kPWV4cGFuc2lvbihtdWx0PWMoMC4wNSwwLjE1KSkpICsNCiAgbGFicyh4PSJUYWh1biIsIHk9IlRvdGFsIGthc3VzIHBuZXVtb25pYSBiYWxpdGEiKSArIHRoZW1lX21pbmltYWwoYmFzZV9zaXplPTEyKQ0KYGBgDQoNCiMjIFVrdXJhbiBFcGlkZW1pb2xvZ2kgKElSICYgU0lSKQ0KDQpgYGB7ciBpci1zaXJ9DQpyYXRlX2tvdGEgPC0gc3VtKGRhdCRQbmV1bW9uaWEpL3N1bShkYXQkQmFsaXRhKQ0KZGF0IDwtIGRhdCAlPiUgbXV0YXRlKElSPVBuZXVtb25pYS9CYWxpdGEqMWU1LA0KICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkPUJhbGl0YSpyYXRlX2tvdGEsDQogICAgICAgICAgICAgICAgICAgICAgU0lSPVBuZXVtb25pYS9FeHBlY3RlZCkNCmBgYA0KDQojIyMgU0lSIHBlciBLZWNhbWF0YW4gU2VsdXJ1aCBUYWh1bg0KDQpVbnR1ayBtZWxpaGF0IHNlYmFyYW4gcmlzaWtvIHJlbGF0aWYgcG5ldW1vbmlhIHBhZGEgYmFsaXRhIHNlY2FyYSBsZWJpaCBzcGVzaWZpayBkaSB0aW5na2F0IGtld2lsYXlhaGFuLCBkaWxha3VrYW4gYW5hbGlzaXMgdGVyaGFkYXAgbmlsYWkgU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbyAoU0lSKSBkaSAzMCBrZWNhbWF0YW4gZGFyaSB0YWh1biAyMDE3IHNhbXBhaSBkZW5nYW4gMjAyMSAoR2FtYmFyIDIpLiBOaWxhaSBTSVIgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGFwYWthaCBzdWF0dSB3aWxheWFoIG1lbWlsaWtpIGp1bWxhaCBrYXN1cyB5YW5nIGxlYmloIHRpbmdnaSAoJFx0ZXh0e1NJUn0gPiAxJCkgYXRhdSBsZWJpaCByZW5kYWggKCRcdGV4dHtTSVJ9IDwgMSQpIGRpYmFuZGluZ2thbiBkZW5nYW4gcmF0YS1yYXRhIHdpbGF5YWggc2VjYXJhIGtlc2VsdXJ1aGFuIGRhbGFtIGhhbCBpbmkgcmF0YS1yYXRhIGthc3VzIFBuZXVtb25pYSBCYWxpdGEga290YSBCYW5kdW5nLg0KDQpgYGB7ciBzaXItaGVhdG1hcCwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9OC41LCBmaWcuY2FwPSJHYW1iYXIgMi4gSGVhdG1hcCBTSVIgcG5ldW1vbmlhIGJhbGl0YSBwZXIga2VjYW1hdGFuLCAyMDE3LTIwMjEuIE1lcmFoID0gcmlzaWtvIGRpIGF0YXMgcmF0YS1yYXRhIGtvdGEgKFNJUj4xKSwgYmlydSA9IGRpIGJhd2FoIHJhdGEtcmF0YTsga2VjYW1hdGFuIGRpdXJ1dGthbiBtZW51cnVuIGJlcmRhc2Fya2FuIFNJUiAyMDIxLiJ9DQoNCnVydXRfa2VjIDwtIGRhdCAlPiUgZmlsdGVyKFRhaHVuPT1tYXgodGFodW5fdGVyc2VkaWEpKSAlPiUNCiAgYXJyYW5nZShTSVIpICU+JSBtdXRhdGUoS2VjYW1hdGFuPXN0cl90b190aXRsZShLZWNhbWF0YW4pKSAlPiUgcHVsbChLZWNhbWF0YW4pDQoNCmhtIDwtIGRhdCAlPiUgbXV0YXRlKEtlY2FtYXRhbj1mYWN0b3Ioc3RyX3RvX3RpdGxlKEtlY2FtYXRhbiksIGxldmVscz11cnV0X2tlYykpDQoNCmdncGxvdChobSwgYWVzKHg9ZmFjdG9yKFRhaHVuKSwgeT1LZWNhbWF0YW4sIGZpbGw9U0lSKSkgKw0KICBnZW9tX3RpbGUoY29sb3I9IndoaXRlIiwgbGluZXdpZHRoPTAuNikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPWZvcm1hdEMoU0lSLCBmb3JtYXQ9ImYiLCBkaWdpdHM9MiksDQogICAgICAgICAgICAgICAgY29sb3I9U0lSPjIgfCBTSVI8MC40KSwgc2l6ZT0yLjcsIHNob3cubGVnZW5kPUZBTFNFKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzIxNjZhYyIsIG1pZD0iI2Y3ZjdmNyIsIGhpZ2g9IiNiMjE4MmIiLA0KICAgICAgICAgICAgICAgICAgICAgICBtaWRwb2ludD0xLCBuYW1lPSJTSVIiLCBsaW1pdHM9YygwLDUuNCksDQogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKDAsMSwyLDMsNCw1KSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoYEZBTFNFYD0iZ3JleTE1IiwgYFRSVUVgPSJ3aGl0ZSIpKSArDQogIGxhYnMoeD0iVGFodW4iLCB5PU5VTEwpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTEpICsNCiAgdGhlbWUocGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTgpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KDEuMiwiY20iKSkNCmBgYA0KDQpEYXJpIEdhbWJhciAyIHRlcmxpaGF0IGJhaHdhIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgc2VjYXJhIGtvbnNpc3RlbiBtZW1pbGlraSBTSVIgdGluZ2dpIChkaSBhdGFzIDEpIHNlcGFuamFuZyB0YWh1biwgbWVuYW5kYWthbiByaXNpa28gcG5ldW1vbmlhIGJhbGl0YSBkaSBrZWR1YSBrZWNhbWF0YW4gaW5pIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gcmF0YS1yYXRhIEtvdGEgQmFuZHVuZy4gU2ViYWxpa255YSwgc2VqdW1sYWgga2VjYW1hdGFuIHlhbmcgYmVyd2FybmEgYmlydSBkYXJpIDIwMTctMjAyMSBtZW51bmp1a2thbiBTSVIgcmVuZGFoIChkaSBiYXdhaCAxKS4gVGVyZGFwYXQgcHVsYSBhbm9tYWxpIHBhZGEgS2VjYW1hdGFuIENpY2VuZG8geWFuZyBtZW1pbGlraSBTSVIgc2FuZ2F0IHRpbmdnaSBwYWRhIDIwMTcgKDUsMzEpIG5hbXVuIHR1cnVuIGRyYXN0aXMgcGFkYSAyMDIxICgwLDA3KSwgcG9sYSB5YW5nIHBlcmx1IGRpdGVsdXN1cmkgbGViaWggbGFuanV0IGRhbiBrb25zaXN0ZW4gZGVuZ2FuIGR1Z2FhbiBnYW5nZ3VhbiBwZWxhcG9yYW4gc2VsYW1hIHBhbmRlbWkuDQoNCiMjIyAxMCBLZWNhbWF0YW4gU0lSIFRlcnRpbmdnaSBwZXIgVGFodW4gey50YWJzZXR9DQoNClNlcHVsdWgga2VjYW1hdGFuIGRlbmdhbiBTSVIgdGVydGluZ2dpIHVudHVrIHRpYXAgdGFodW4gKGtsaWsgdGFiIHRhaHVuKS4gU0lSID4gMSBtZW5hbmRha2FuDQpyaXNpa28gZGkgYXRhcyByYXRhLXJhdGEga290YS4NCg0KYGBge3IgdG9wMTAtc2lyLCByZXN1bHRzPSdhc2lzJ30NCmZvciAoeSBpbiB0YWh1bl90ZXJzZWRpYSl7DQogIGNhdCgiXG5cbiMjIyMgIiwgeSwgIiB7LX1cblxuIikNCiAgdGFiZWxfeSA8LSBkYXQgJT4lIGZpbHRlcihUYWh1bj09eSkgJT4lDQogICAgYXJyYW5nZShkZXNjKFNJUikpICU+JSBoZWFkKDEwKSAlPiUNCiAgICB0cmFuc211dGUoS2VjYW1hdGFuPXN0cl90b190aXRsZShLZWNhbWF0YW4pLA0KICAgICAgICAgICAgICBLYXN1cz1QbmV1bW9uaWEsDQogICAgICAgICAgICAgIEJhbGl0YT1yb3VuZChCYWxpdGEpLA0KICAgICAgICAgICAgICBJUj1yb3VuZChJUiwxKSwNCiAgICAgICAgICAgICAgRXhwZWN0ZWQ9cm91bmQoRXhwZWN0ZWQsMSksDQogICAgICAgICAgICAgIFNJUj1yb3VuZChTSVIsMikpDQogIHByaW50KA0KICAgIGthYmxlKHRhYmVsX3ksIHJvdy5uYW1lcz1GQUxTRSwNCiAgICAgICAgICBjYXB0aW9uPXBhc3RlMCgiU2VwdWx1aCBrZWNhbWF0YW4gU0lSIHRlcnRpbmdnaSwgIix5LCIuIikpICU+JQ0KICAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiLCJjb25kZW5zZWQiKSwNCiAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplPTEyKQ0KICApDQp9DQpgYGANCg0KIyMjIHstfQ0KDQoNCiMjIERpc2Vhc2UgTWFwcGluZzogQ3J1ZGUgU0lSICYgRW1waXJpY2FsIEJheWVzIHsudGFic2V0fQ0KDQpQZXRhIGNydWRlIFNJUiBkYW4gaGFzaWwgcGVuZ2hhbHVzYW4gRW1waXJpY2FsIEJheWVzIGRpdGFtcGlsa2FuIHVudHVrIHNlbHVydWggdGFodW4uIEVCDQptZW5zdGFiaWxrYW4gZXN0aW1hc2kgcGFkYSBrZWNhbWF0YW4gYmVycG9wdWxhc2kga2VjaWwgc2VoaW5nZ2EgcG9sYSByaXNpa28gbGViaWggYW5kYWwuIFNldGlhcA0Ka2VjYW1hdGFuIGRpYmVyaSBub21vciBwYWRhIHBldGE7IGtldGVyYW5nYW4gbm9tb3IgdGVyY2FudHVtIHBhZGEga290YWsgZGkgYmF3YWguDQoNCmBgYHtyIGtldC13aWxheWFoLCBlY2hvPUZBTFNFfQ0KDQpuIDwtIG5yb3coa2V0X3dpbGF5YWgpOyBoIDwtIGNlaWxpbmcobi8yKQ0Ka2lyaSAgPC0ga2V0X3dpbGF5YWhbMTpoLF0NCmthbmFuIDwtIGtldF93aWxheWFoWyhoKzEpOm4sXQ0KaWYgKG5yb3coa2FuYW4pIDwgbnJvdyhraXJpKSkga2FuYW4gPC0gcmJpbmQoa2FuYW4sIGRhdGEuZnJhbWUoTm89TkEsIEtlY2FtYXRhbj0iIikpDQp0YWJfa2V0IDwtIGRhdGEuZnJhbWUoDQogIE5vMT1raXJpJE5vLCBLZWNhbWF0YW4xPWtpcmkkS2VjYW1hdGFuLA0KICBObzI9a2FuYW4kTm8sIEtlY2FtYXRhbjI9a2FuYW4kS2VjYW1hdGFuDQopDQp0YWJfa2V0ICU+JQ0KICBrYWJsZShjb2wubmFtZXM9YygiTm8iLCJLZWNhbWF0YW4iLCJObyIsIktlY2FtYXRhbiIpLA0KICAgICAgICBjYXB0aW9uPSJLZXRlcmFuZ2FuIG5vbW9yIHdpbGF5YWggcGFkYSBwZXRhLiIsIGFsaWduPSJjbGNsIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aD1GQUxTRSwgYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImNvbmRlbnNlZCIpLA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZT0xMikgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQ9VFJVRSkgJT4lIGNvbHVtbl9zcGVjKDMsIGJvbGQ9VFJVRSkNCmBgYA0KDQpgYGB7ciBmdW5nc2ktcGV0YX0NCg0KcGV0YV9zaXIgPC0gZnVuY3Rpb24odGFodW4pew0KICBkIDwtIGRhdCAlPiUgZmlsdGVyKFRhaHVuPT10YWh1bikNCiAgZWIgPC0gRUJlc3Qobj1kJFBuZXVtb25pYSwgeD1kJEJhbGl0YSkNCiAgZCRFQl9TSVIgPC0gZWIkZXN0bW0gLyByYXRlX2tvdGENCiAgcG0gPC0gcGV0YSAlPiUgbGVmdF9qb2luKGQsIGJ5PSJLZWNhbWF0YW4iKQ0KICBnMSA8LSBnZ3Bsb3QocG0pICsgZ2VvbV9zZihhZXMoZmlsbD1TSVIpLCBjb2xvcj0id2hpdGUiLCBsaW5ld2lkdGg9MC4yKSArDQogICAgZ2VvbV90ZXh0KGRhdGE9cGV0YV9sYmwsIGFlcyhYLCBZLCBsYWJlbD1ObyksIHNpemU9Mi41LCBjb2xvcj0iZ3JleTIwIikgKw0KICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzIxNjZhYyIsIG1pZD0id2hpdGUiLCBoaWdoPSIjYjIxODJiIiwgbWlkcG9pbnQ9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJDcnVkZSBTSVIiLCBuYS52YWx1ZT0iZ3JleTg1IikgKw0KICAgIGxhYnModGl0bGU9cGFzdGUwKCJDcnVkZSBTSVIsICIsdGFodW4pKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCkpDQogIGcyIDwtIGdncGxvdChwbSkgKyBnZW9tX3NmKGFlcyhmaWxsPUVCX1NJUiksIGNvbG9yPSJ3aGl0ZSIsIGxpbmV3aWR0aD0wLjIpICsNCiAgICBnZW9tX3RleHQoZGF0YT1wZXRhX2xibCwgYWVzKFgsIFksIGxhYmVsPU5vKSwgc2l6ZT0yLjUsIGNvbG9yPSJncmV5MjAiKSArDQogICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSIjMjE2NmFjIiwgbWlkPSJ3aGl0ZSIsIGhpZ2g9IiNiMjE4MmIiLCBtaWRwb2ludD0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkVCIFNJUiIsIG5hLnZhbHVlPSJncmV5ODUiKSArDQogICAgbGFicyh0aXRsZT1wYXN0ZTAoIkVCLXNtb290aGVkIFNJUiwgIix0YWh1bikpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkPWVsZW1lbnRfYmxhbmsoKSkNCiAgbGlzdChjcnVkZT1nMSwgZWI9ZzIpDQp9DQpgYGANCg0KYGBge3IgcGV0YS10YWh1biwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD01fQ0KZm9yICh5IGluIHRhaHVuX3RlcnNlZGlhKXsNCiAgY2F0KCJcblxuIyMjICIsIHksICIgey19XG5cbiIpDQogIGdnIDwtIHBldGFfc2lyKHkpDQogIHByaW50KGdnJGNydWRlICsgZ2ckZWIpDQp9DQpgYGANCg0KIyMgey19DQoNCiMjIyBQZXJiYW5kaW5nYW4gQ3J1ZGUgU0lSIHZzIEVCLXNtb290aGVkIFNJUg0KDQpTZWNhcmEgdmlzdWFsLCBwZXRhIGNydWRlIGRhbiBFQiB0YW1wYWsgc2VydXBhIGthcmVuYSBwZW55ZXN1YWlhbiBFbXBpcmljYWwgQmF5ZXMgdW11bW55YQ0Ka2VjaWwuIFVudHVrIG1lbGloYXQgYmVzYXJueWEgcGVueWVzdWFpYW4sIHRhYmVsIGJlcmlrdXQgbWVueWFqaWthbiBsaW1hIGtlY2FtYXRhbiBkZW5nYW4NCnNlbGlzaWggfGNydWRlIOKIkiBFQnwgdGVyYmVzYXIgdGlhcCB0YWh1bi4gUGVueWVzdWFpYW4gdGVyYmVzYXIga29uc2lzdGVuIHRlcmphZGkgcGFkYSBrZWNhbWF0YW4NCmJlcnBvcHVsYXNpIGtlY2lsIChtaXMuIENpbmFtYm8pLCBzZXN1YWkgcHJpbnNpcCBFQiB5YW5nIG1lbmFyaWsgZXN0aW1hc2kgd2lsYXlhaCBrZWNpbCBsZWJpaA0Ka3VhdCBrZSBhcmFoIHJhdGEtcmF0YSBrb3RhLg0KDQpgYGB7ciBjcnVkZS12cy1lYn0NCmJhbmRpbmdfZWIgPC0gZnVuY3Rpb24odGFodW4pew0KICBkIDwtIGRhdCAlPiUgZmlsdGVyKFRhaHVuPT10YWh1bikNCiAgZWIgPC0gRUJlc3Qobj1kJFBuZXVtb25pYSwgeD1kJEJhbGl0YSkNCiAgdGliYmxlKFRhaHVuPXRhaHVuLA0KICAgICAgICAgS2VjYW1hdGFuPXN0cl90b190aXRsZShkJEtlY2FtYXRhbiksDQogICAgICAgICBCYWxpdGE9cm91bmQoZCRCYWxpdGEpLA0KICAgICAgICAgQ3J1ZGVfU0lSPXJvdW5kKGQkU0lSLDIpLA0KICAgICAgICAgRUJfU0lSPXJvdW5kKGViJGVzdG1tL3JhdGVfa290YSwyKSkgJT4lDQogICAgbXV0YXRlKFNlbGlzaWg9cm91bmQoYWJzKENydWRlX1NJUi1FQl9TSVIpLDMpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MoU2VsaXNpaCkpICU+JSBzbGljZSgxOjUpDQp9DQpkby5jYWxsKHJiaW5kLCBsYXBwbHkodGFodW5fdGVyc2VkaWEsIGJhbmRpbmdfZWIpKSAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNC4gTGltYSBrZWNhbWF0YW4gZGVuZ2FuIHBlbnllc3VhaWFuIEVtcGlyaWNhbCBCYXllcyB0ZXJiZXNhciBwZXIgdGFodW4uIiwNCiAgICAgICAgcm93Lm5hbWVzPUZBTFNFKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLCBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiLCJjb25kZW5zZWQiKSwNCiAgICAgICAgICAgICAgICBmb250X3NpemU9MTIpICU+JQ0KICBjb2xsYXBzZV9yb3dzKGNvbHVtbnM9MSwgdmFsaWduPSJ0b3AiKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBTZWxpc2loIGNydWRlIHZzIEVCIGtlY2lsIGRpIHNlYmFnaWFuIGJlc2FyIGtlY2FtYXRhbiwgZGVuZ2FuIHBlbnllc3VhaWFuDQp0ZXJiZXNhciBwYWRhIHdpbGF5YWggYmVycG9wdWxhc2kga2VjaWwgc2VwZXJ0aSBDaW5hbWJvLiBLZW1pcmlwYW4gY3J1ZGUgZGFuIEVCIG1lbnVuanVra2FuDQplc3RpbWFzaSByaXNpa28gZGkgc2ViYWdpYW4gYmVzYXIga2VjYW1hdGFuIHN1ZGFoIHN0YWJpbCwgc2VoaW5nZ2EgcG9sYSB5YW5nIHRlcmFtYXRpDQptZW5jZXJtaW5rYW4gdmFyaWFzaSByaXNpa28geWFuZyBueWF0YSBkYW4gYnVrYW4ga2V0aWRha3N0YWJpbGFuIGFraWJhdCBwb3B1bGFzaSBrZWNpbC4NCjo6Og0KDQojIyMgVWppIE1vcmFuJ3MgSSBwZXIgVGFodW4NCg0KYGBge3IgYm9ib3R9DQoNCm5iIDwtIHBvbHkybmIocGV0YSwgcXVlZW49VFJVRSkNCmx3IDwtIG5iMmxpc3R3KG5iLCBzdHlsZT0iVyIsIHplcm8ucG9saWN5PVRSVUUpDQpgYGANCg0KYGBge3IgbW9yYW59DQoNCm1vcmFuX3RhaHVuIDwtIGZ1bmN0aW9uKHRhaHVuKXsNCiAgZCA8LSBkYXQgJT4lIGZpbHRlcihUYWh1bj09dGFodW4pDQogIHBtIDwtIHBldGEgJT4lIGxlZnRfam9pbihkLCBieT0iS2VjYW1hdGFuIikNCiAgbWMgPC0gbW9yYW4ubWMocG0kU0lSLCBsdywgbnNpbT05OTksIHplcm8ucG9saWN5PVRSVUUsIG5hLmFjdGlvbj1uYS5vbWl0KQ0KICBkYXRhLmZyYW1lKFRhaHVuPXRhaHVuLCBNb3Jhbl9JPXJvdW5kKHVubmFtZShtYyRzdGF0aXN0aWMpLDMpLA0KICAgICAgICAgICAgIHBfdmFsdWU9cm91bmQobWMkcC52YWx1ZSwzKSkNCn0NCm1vcmFuX3RhYiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkodGFodW5fdGVyc2VkaWEsIG1vcmFuX3RhaHVuKSkNCm1vcmFuX3RhYiAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNS4gTW9yYW4ncyBJIFNJUiBwbmV1bW9uaWEgYmFsaXRhIHBlciB0YWh1biIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBVamkgTW9yYW4ncyBJIHBhZGEgU0lSIG1lbnVuanVra2FuIHRpZGFrIGFkYSBhdXRva29yZWxhc2kgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gcGFkYSBzZWx1cnVoIHRhaHVuIHlhbmcgZGlndW5ha2FuIHBhZGEgbWFrYWxhaCBpbmkgKHAgPiAwLDA1LCBkZW5nYW4gbmlsYWkgTW9yYW4ncyBJIG1lbmRla2F0aSBub2wpLiBIYWwgaW5pIG1lbmFuZGFrYW4gYmFod2EgZGFsYW0gc2F0dSB0YWh1biB0ZXJ0ZW50dSwgcmlzaWtvIHBuZXVtb25pYSBiYWxpdGEgdGlkYWsgbWVuZ2Vsb21wb2sgc2VjYXJhIGdlb2dyYWZpcywgZGVuZ2FuIGthdGEgbGFpbiBrZWNhbWF0YW4gYmVyaXNpa28gdGluZ2dpIHRlcnNlYmFyIHRhbnBhIHBvbGEgc3Bhc2lhbCB5YW5nIGplbGFzLiBUZW11YW4gaW5pIGtvbnNpc3RlbiBkZW5nYW4gc2ViYXJhbiBrZWNhbWF0YW4gYmVyaXNpa28gdGluZ2dpIChzZXBlcnRpIENpY2VuZG8sIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwpIHlhbmcgc2VjYXJhIGdlb2dyYWZpcyB0aWRhayBiZXJkZWthdGFuLg0KOjo6DQoNCiMjIyBVamkgTW9yYW4ncyBJIFNwYXNpby1UZW1wb3JhbA0KDQpTZWxhaW4gTW9yYW4ncyBJIHBlciB0YWh1biAobXVybmkgc3Bhc2lhbCksIGRpdWppIHB1bGEgYXV0b2tvcmVsYXNpIHNwYXNpby10ZW1wb3JhbCBtZWxhbHVpIHBlcmx1YXNhbiBpbmRla3MgTW9yYW4gZGVuZ2FuIGJvYm90IGdhYnVuZ2FuIHJ1YW5nIGRhbiB3YWt0dSAoTGVlICYgTGksIDIwMTcpLiBEdWEgdW5pdCBrZWNhbWF0YW4tdGFodW4gZGlhbmdnYXANCmJlcnRldGFuZ2dhIHNwYXNpby10ZW1wb3JhbCBiaWxhIGJlcmFkYSBkaSBrZWNhbWF0YW4geWFuZyBiZXJzZWJlbGFoYW4gZGFuIHBhZGEgdGFodW4geWFuZw0Kc2FtYSBhdGF1IGJlcmRla2F0YW4gKHNlbGlzaWggc2F0dSB0YWh1bikuIFVqaSBpbmkgbWVuaWxhaSBhcGFrYWggU0lSIHRpbmdnaSBtZW5nZWxvbXBvayB0aWRhaw0KaGFueWEgc2VjYXJhIGdlb2dyYWZpcywgdGV0YXBpIGp1Z2EgdGVyYmF3YSBkYXJpIHRhaHVuIGtlIHRhaHVuLg0KDQpgYGB7ciBtb3Jhbi1zcGF0aW90ZW1wb3JhbH0NCg0Ka2VjX3VydXQgPC0gbGV2ZWxzKGZhY3RvcihwZXRhJEtlY2FtYXRhbikpDQp0aF91cnV0ICA8LSBzb3J0KHVuaXF1ZShkYXQkVGFodW4pKQ0KbksgPC0gbGVuZ3RoKGtlY191cnV0KTsgblQgPC0gbGVuZ3RoKHRoX3VydXQpDQoNCg0KV3MgPC0gbmIybWF0KG5iLCBzdHlsZT0iQiIsIHplcm8ucG9saWN5PVRSVUUpICAgICANCg0KDQpXdCA8LSBtYXRyaXgoMCwgblQsIG5UKQ0KZm9yIChhIGluIDE6blQpIGZvciAoYiBpbiAxOm5UKSBpZiAoYWJzKHRoX3VydXRbYV0tdGhfdXJ1dFtiXSk8PTEpIFd0W2EsYl0gPC0gMQ0KDQoNCldzdCA8LSBrcm9uZWNrZXIoV3QsIFdzKSAgICAgDQpkaWFnKFdzdCkgPC0gMA0KDQoNCmt1bmNpIDwtIHBhc3RlKHJlcCh0aF91cnV0LCBlYWNoPW5LKSwgcmVwKGtlY191cnV0LCB0aW1lcz1uVCkpDQpzaXJfdmVjIDwtIGRhdCRTSVJbbWF0Y2goa3VuY2ksIHBhc3RlKGRhdCRUYWh1biwgZGF0JEtlY2FtYXRhbikpXQ0KDQoNCm1vcmFuX3N0IDwtIGZ1bmN0aW9uKHgsIFcpew0KICBvayA8LSAhaXMubmEoeCk7IHggPC0geFtva107IFcgPC0gV1tvayxva10NCiAgbiA8LSBsZW5ndGgoeCk7IHogPC0geCAtIG1lYW4oeCk7IFMwIDwtIHN1bShXKQ0KICAobi9TMCkgKiAoYXMubnVtZXJpYyh0KHopICUqJSBXICUqJSB6KSAvIHN1bSh6XjIpKQ0KfQ0KSV9vYnMgPC0gbW9yYW5fc3Qoc2lyX3ZlYywgV3N0KQ0KDQoNCnNldC5zZWVkKDEyMykNCnBlcm0gPC0gcmVwbGljYXRlKDk5OSwgew0KICB4cCA8LSBzYW1wbGUoc2lyX3ZlYykNCiAgbW9yYW5fc3QoeHAsIFdzdCkNCn0pDQpwX3ZhbCA8LSAoc3VtKHBlcm0gPj0gSV9vYnMpICsgMSkgLyAoOTk5ICsgMSkNCmNhdCgiTW9yYW4ncyBJIHNwYXNpby10ZW1wb3JhbDoiLCByb3VuZChJX29icywzKSwNCiAgICAifCBwLXZhbHVlIChwZXJtdXRhc2kpOiIsIHJvdW5kKHBfdmFsLDMpLCAiXG4iKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBVamkgTW9yYW4ncyBJIHNwYXNpYWwgcGVyIHRhaHVuIG1lbnVuanVra2FuIHRpZGFrIGFkYW55YSBhdXRva29yZWxhc2kgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gKHAgPiAwLDA1IHBhZGEgc2VsdXJ1aCB0YWh1biwgZGVuZ2FuIG5pbGFpIG1lbmRla2F0aSBub2wpLiBTZWJhbGlrbnlhLCBNb3JhbidzIEkgc3Bhc2lvLXRlbXBvcmFsIGJlcm5pbGFpIDAsMTg2IGRhbiBzaWduaWZpa2FuIChwID0gMCwwMDEpLiBLb250cmFzIGluaSBtZW5hbmRha2FuIGJhaHdhIGF1dG9rb3JlbGFzaSBwYWRhIGRhdGEgcG5ldW1vbmlhIGJhbGl0YSBkaWRvbWluYXNpIG9sZWggZGltZW5zaSB0ZW1wb3JhbCwgYnVrYW4gc3Bhc2lhbC4gUmlzaWtvIHN1YXR1IGtlY2FtYXRhbiBsZWJpaCBwZXJzaXN0ZW4gYW50YXJ3YWt0dSBkYXJpcGFkYSBtZW5nZWxvbXBvayBzZWNhcmEgZ2VvZ3JhZmlzIGRhbGFtIHNhdHUgdGFodW4uDQo6OjoNCg0KIyMgUGVtb2RlbGFuIEJlcnRpbmdrYXQNCg0KUGVtb2RlbGFuIGRpbGFrdWthbiBzZWNhcmEgYmVydGluZ2thdCBtZW5naWt1dGkgcHJpbnNpcCBwYXJzaW1vbmk6IGRpbXVsYWkgZGFyaSBtb2RlbA0KcGFsaW5nIHNlZGVyaGFuYSwgbGFsdSBkaXRpbmdrYXRrYW4gaGFueWEgYmlsYSBkaWFnbm9zdGlrIHJlc2lkdWFsIG1lbnVuanVra2FuIGtlYnV0dWhhbi4NClRhaGFwYW5ueWE6ICgxKSAqKk5CLUdMTSoqIGRlbmdhbiBlZmVrIHRldGFwOyAoMikgKip1amkgTW9yYW4gcmVzaWR1YWwqKiB1bnR1ayBtZW1lcmlrc2EgcG9sYQ0Kc3Bhc2lhbCB0ZXJzaXNhOyAoMykgKipOQiBNaXhlZCBNb2RlbCoqIGRlbmdhbiBlZmVrIGFjYWsga2VjYW1hdGFuIGJpbGEgZGlwZXJsdWthbjsgZGFuICg0KQ0KKiptb2RlbCBTcGF0aW8tVGVtcG9yYWwgTkIqKiBoYW55YSBiaWxhIHJlc2lkdWFsIG1hc2loIG1lbnVuanVra2FuIHBvbGEgc3Bhc2lvLXRlbXBvcmFsLg0KDQpgYGB7ciBtb2RlbC1zZXR1cH0NCmRhdF9tIDwtIGRhdCAlPiUNCiAgbXV0YXRlKEtlY2FtYXRhbj1mYWN0b3IoS2VjYW1hdGFuKSwNCiAgICAgICAgIFRhaHVuX2Y9ZmFjdG9yKFRhaHVuKSkNCmNhdCgiSnVtbGFoIG9ic2VydmFzaSAoa2VjYW1hdGFuLXRhaHVuKToiLCBucm93KGRhdF9tKSwgIlxuIikNCg0KbV9wb2lzIDwtIGdsbShQbmV1bW9uaWEgfiBJREwrVklUK0JHSytCQkxSK1BIQlMrUlMrVGFodW5fZiArIG9mZnNldChsb2coQmFsaXRhKSksDQogICAgICAgICAgICAgIGZhbWlseT1wb2lzc29uLCBkYXRhPWRhdF9tKQ0KZGlzcCA8LSBzdW0ocmVzaWR1YWxzKG1fcG9pcywgdHlwZT0icGVhcnNvbiIpXjIpL21fcG9pcyRkZi5yZXNpZHVhbA0KY2F0KCJSYXNpbyBkaXNwZXJzaSAoUG9pc3Nvbik6Iiwgcm91bmQoZGlzcCwyKSwNCiAgICAiIC0+IG92ZXJkaXNwZXJzaSBiaWxhID4gMSwgbWVuZHVrdW5nIE5lZ2F0aXZlIEJpbm9taWFsXG4iKQ0KYGBgDQoNCiMjIyBUYWhhcCAxIOKAlCBOQi1HTE0gKEVmZWsgVGV0YXApDQoNCk1vZGVsIE5lZ2F0aXZlIEJpbm9taWFsIGRlbmdhbiBlZmVrIHRldGFwOiBlbmFtIGNvdmFyaWF0ZSBjYWt1cGFuIHByb2dyYW0ga2VzZWhhdGFuIGRhbiBlZmVrDQp0YWh1biwgZGVuZ2FuIGBvZmZzZXQobG9nKEJhbGl0YSkpYC4NCg0KYGBge3IgbmItZ2xtfQ0KbV9nbG0gPC0gZ2xtLm5iKFBuZXVtb25pYSB+IElETCtWSVQrQkdLK0JCTFIrUEhCUytSUyArIFRhaHVuX2YgKyBvZmZzZXQobG9nKEJhbGl0YSkpLA0KICAgICAgICAgICAgICAgIGRhdGE9ZGF0X20pDQoNCmtmIDwtIHN1bW1hcnkobV9nbG0pJGNvZWZmaWNpZW50cw0KY292cyA8LSBjKCJJREwiLCJWSVQiLCJCR0siLCJCQkxSIiwiUEhCUyIsIlJTIikNCmlycl9jb3YgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFiZWwgPSBjb3ZzLA0KICBJUlIgPSByb3VuZChleHAoY29lZihtX2dsbSlbY292c10pLDQpLA0KICBDSV8yLjUgPSByb3VuZChleHAoY29uZmludC5kZWZhdWx0KG1fZ2xtKVtjb3ZzLDFdKSw0KSwNCiAgQ0lfOTcuNSA9IHJvdW5kKGV4cChjb25maW50LmRlZmF1bHQobV9nbG0pW2NvdnMsMl0pLDQpLA0KICBwX3ZhbHVlID0gcm91bmQoa2ZbY292cywiUHIoPnx6fCkiXSwzKQ0KKQ0KaXJyX2NvdiAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNi4gSVJSIGNvdmFyaWF0ZSDigJQgTkItR0xNIChUYWhhcCAxKS4iLCByb3cubmFtZXM9RkFMU0UpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGlyci10YWh1bi1nbG19DQppZHhfdGggPC0gZ3JlcCgiXlRhaHVuX2YiLCByb3duYW1lcyhrZikpDQppcnJfdGggPC0gZXhwKGNiaW5kKElSUj1jb2VmKG1fZ2xtKVtpZHhfdGhdLCBjb25maW50LmRlZmF1bHQobV9nbG0pW2lkeF90aCwsZHJvcD1GQUxTRV0pKQ0Kcm93bmFtZXMoaXJyX3RoKSA8LSBnc3ViKCJUYWh1bl9mIiwiVGFodW4gIixyb3duYW1lcyhpcnJfdGgpKQ0Kcm91bmQoaXJyX3RoLDMpICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHNldE5hbWVzKGMoIklSUiIsIkNJXzIuNSUiLCJDSV85Ny41JSIpKSAlPiUNCiAga2FibGUoY2FwdGlvbj1wYXN0ZTAoIlRhYmVsIDcuIElSUiBlZmVrIHRhaHVuIOKAlCBOQi1HTE0gKHJlZiA9ICIsbWluKHRhaHVuX3RlcnNlZGlhKSwiKS4iKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aD1GQUxTRSwgYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImhvdmVyIikpDQpgYGANCg0KOjo6IHsuaW5mb2JveH0NCioqSW50ZXJwcmV0YXNpLioqIFBhZGEgTkItR0xNLCBnaXppIGt1cmFuZyAoSVJSPTEsMDcxLCBwPTAsMDAzKSwgdml0YW1pbiBBIChJUlI9MSwwMTAsIHA9MCwwMTIpLCBkYW4gQkJMUiAoSVJSPTEsMDE4LCBwPTAsMDM1KSB0YW1wYWsgc2lnbmlmaWthbi4gTmFtdW4gYXJhaCBJUlIgdml0YW1pbiBBIHlhbmcgcG9zaXRpZiB0aWRhayBzZXN1YWkgZWtzcGVrdGFzaSB0ZW9yZXRpcyAoa2VtdW5na2luYW4gYmlhcyBla29sb2dpcykuIEVmZWsgdGFodW4gbWVudXJ1biBwcm9ncmVzaWYgKElSUiAyMDIxID0gMCwxNTQpLCBzaWduaWZpa2FuIHNlamFrIDIwMTk7IHBlbnVydW5hbiB0YWphbSAyMDIw4oCTMjAyMSBrZW11bmdraW5hbiBha2liYXQgcGVsYXBvcmFuIG1hc2EgcGFuZGVtaS4NCjo6Og0KDQojIyMgVGFoYXAgMiDigJQgVWppIE1vcmFuIFJlc2lkdWFsIChOQi1HTE0pDQoNCkRpcGVyaWtzYSBhcGFrYWggcmVzaWR1YWwgTkItR0xNIG1hc2loIG1lbXVhdCBhdXRva29yZWxhc2kgc3Bhc2lhbCBwZXIgdGFodW4uIEJpbGEgc2lnbmlmaWthbg0KKHAgPCAwLDA1KSwgbW9kZWwgcGVybHUgZGl0aW5na2F0a2FuIChUYWhhcCAzKS4NCg0KYGBge3IgbW9yYW4tcmVzaWR1YWwtZ2xtfQ0KZGF0X20kcmVzaWRfZ2xtIDwtIHJlc2lkdWFscyhtX2dsbSwgdHlwZT0icGVhcnNvbiIpDQptb3Jhbl9yZXNpZCA8LSBmdW5jdGlvbih0YWh1biwga29sb20pew0KICBkICA8LSBkYXRfbSAlPiUgZmlsdGVyKFRhaHVuPT10YWh1bikNCiAgcG0gPC0gcGV0YSAlPiUgbGVmdF9qb2luKGQsIGJ5PSJLZWNhbWF0YW4iKQ0KICBtYyA8LSBtb3Jhbi5tYyhwbVtba29sb21dXSwgbHcsIG5zaW09OTk5LCB6ZXJvLnBvbGljeT1UUlVFLCBuYS5hY3Rpb249bmEub21pdCkNCiAgZGF0YS5mcmFtZShUYWh1bj10YWh1biwgTW9yYW5fST1yb3VuZCh1bm5hbWUobWMkc3RhdGlzdGljKSwzKSwNCiAgICAgICAgICAgICBwX3ZhbHVlPXJvdW5kKG1jJHAudmFsdWUsMyksDQogICAgICAgICAgICAgS2VzaW1wdWxhbj1pZmVsc2UobWMkcC52YWx1ZTwwLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZGEgcG9sYSBzcGFzaWFsICh0aW5na2F0a2FuIG1vZGVsKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2lkdWFsIGFjYWsgKG1lbWFkYWkpIikpDQp9DQpyZXNpZF9nbG1fdGFiIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseSh0YWh1bl90ZXJzZWRpYSwgbW9yYW5fcmVzaWQsIGtvbG9tPSJyZXNpZF9nbG0iKSkNCnJlc2lkX2dsbV90YWIgJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDguIE1vcmFuJ3MgSSByZXNpZHVhbCBOQi1HTE0gcGVyIHRhaHVuLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKktlcHV0dXNhbi4qKiBVamkgTW9yYW4ncyBJIHBhZGEgcmVzaWR1YWwgTkItR0xNIG1lbnVuanVra2FuIHJlc2lkdWFsIHlhbmcgYWNhayBzZWNhcmEgc3Bhc2lhbCBwYWRhIHNlbHVydWggdGFodW4gKHAgPiAwLDA1LCBuaWxhaSBNb3JhbidzIEkgbWVuZGVrYXRpIG5vbCkuIE1vZGVsIGVmZWsgdGV0YXAgdGlkYWsgbWVueWlzYWthbiBhdXRva29yZWxhc2kgc3Bhc2lhbCwgc2VoaW5nZ2EgbW9kZWwgc3Bhc2lhbCBla3NwbGlzaXQgKENBUi9CWU0pIHRpZGFrIGRpcGVybHVrYW4uIFBlbW9kZWxhbiB0ZXRhcCBkaWxhbmp1dGthbiBrZSBOQiBNaXhlZCBNb2RlbCB1bnR1ayBtZW5nYWtvbW9kaXIga2VtdW5na2luYW4gaGV0ZXJvZ2VuaXRhcyByaXNpa28gYW50YXJrZWNhbWF0YW4uDQoNCjo6Og0KDQojIyMgVGFoYXAgMyDigJQgTkIgTWl4ZWQgTW9kZWwgKFJhbmRvbSBFZmZlY3QgS2VjYW1hdGFuKQ0KDQpTZWJhZ2FpIHBlbmluZ2thdGFuLCBkaXRhbWJhaGthbiBlZmVrIGFjYWsga2VjYW1hdGFuIChyYW5kb20gaW50ZXJjZXB0KSB1bnR1ayBtZW5nYWtvbW9kaXINCmhldGVyb2dlbml0YXMgYW50YXJ3aWxheWFoIGRhbiAibWVtaW5qYW0ga2VrdWF0YW4iIGFudGFydW5pdC4gTW9kZWwgTkIgY2FtcHVyYW4gZGllc3RpbWFzaQ0KZGVuZ2FuIGBnbG1tVE1CYC4NCg0KYGBge3IgbmItbWl4ZWR9DQptX21peCA8LSBnbG1tVE1CKFBuZXVtb25pYSB+IElETCtWSVQrQkdLK0JCTFIrUEhCUytSUyArIFRhaHVuX2YgKw0KICAgICAgICAgICAgICAgICAgICgxIHwgS2VjYW1hdGFuKSArIG9mZnNldChsb2coQmFsaXRhKSksDQogICAgICAgICAgICAgICAgIGZhbWlseT1uYmlub20yLCBkYXRhPWRhdF9tKQ0KDQp2YyA8LSBhcy5udW1lcmljKGF0dHIoVmFyQ29ycihtX21peCkkY29uZCRLZWNhbWF0YW4sICJzdGRkZXYiKSkNCmNhdCgiU2ltcGFuZ2FuIGJha3UgZWZlayBhY2FrIGtlY2FtYXRhbjoiLCByb3VuZCh2YywzKSwNCiAgICAiICgwID0gdGFrIGFkYSB2YXJpYXNpIGFudGFyd2lsYXlhaCB0ZXJzaXNhKVxuXG4iKQ0KDQpmZSA8LSBzdW1tYXJ5KG1fbWl4KSRjb2VmZmljaWVudHMkY29uZA0KaXJyX21peCA8LSBkYXRhLmZyYW1lKA0KICBWYXJpYWJlbCA9IGNvdnMsDQogIElSUiA9IHJvdW5kKGV4cChmZVtjb3ZzLCJFc3RpbWF0ZSJdKSw0KSwNCiAgcF92YWx1ZSA9IHJvdW5kKGZlW2NvdnMsIlByKD58enwpIl0sMykNCikNCmlycl9taXggJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDkuIElSUiBjb3ZhcmlhdGUg4oCUIE5CIE1peGVkIE1vZGVsIChUYWhhcCAzKS4iLCByb3cubmFtZXM9RkFMU0UpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KDQpjYXQoIlxuUGVyYmFuZGluZ2FuIEFJQzogIE5CLUdMTSA9Iiwgcm91bmQoQUlDKG1fZ2xtKSwxKSwNCiAgICAiIHwgTkIgTWl4ZWQgPSIsIHJvdW5kKEFJQyhtX21peCksMSksDQogICAgIlxuKG1vZGVsIGRlbmdhbiBBSUMgbGViaWggcmVuZGFoIGxlYmloIGRpZHVrdW5nKVxuIikNCmBgYA0KDQpgYGB7ciBtb3Jhbi1yZXNpZHVhbC1taXh9DQoNCmRhdF9tJHJlc2lkX21peCA8LSByZXNpZHVhbHMobV9taXgsIHR5cGU9InBlYXJzb24iKQ0KcmVzaWRfbWl4X3RhYiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkodGFodW5fdGVyc2VkaWEsIG1vcmFuX3Jlc2lkLCBrb2xvbT0icmVzaWRfbWl4IikpDQpyZXNpZF9taXhfdGFiICU+JQ0KICBrYWJsZShjYXB0aW9uPSJUYWJlbCAxMC4gTW9yYW4ncyBJIHJlc2lkdWFsIE5CIE1peGVkIE1vZGVsIHBlciB0YWh1bi4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLCBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiKSkNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipLZXB1dHVzYW4uKiogTkIgTWl4ZWQgTW9kZWwgbWVtYmVyaWthbiBrZWNvY29rYW4gamF1aCBsZWJpaCBiYWlrIGRhcmlwYWRhIE5CLUdMTSAoQUlDIDE3ODgsNCB2cyAxODQzLDY7IHNlbGlzaWggNTUsMiBwb2luKSwgZGVuZ2FuIHNpbXBhbmdhbiBiYWt1IGVmZWsgYWNhayBrZWNhbWF0YW4gMCw1MTQgeWFuZyBtZW51bmp1a2thbiBoZXRlcm9nZW5pdGFzIHJpc2lrbyBhbnRhcndpbGF5YWggc3Vic3RhbnNpYWwuIFNldGVsYWggZWZlayBhY2FrIGRpbWFzdWtrYW4sIHRpZGFrIGFkYSBjb3ZhcmlhdGUgeWFuZyBzaWduaWZpa2FuIHBhZGEgYWxwaGEgNSUgKE5hbXVuIEJCTFIgc2lnbmlmaWthbiBwYWRhIGFscGhhIDEwJSkuIFJlc2lkdWFsIE1peGVkIE1vZGVsIGFjYWsgc2VjYXJhIHNwYXNpYWwgZGkgc2VsdXJ1aCB0YWh1biAocCA+IDAsMDUpLCBzZWhpbmdnYSBtb2RlbCBOQi1NaXhlZCBNb2RlbCBkaW5pbGFpIG1lbWFkYWkgZGFuIGRpcGlsaWggc2ViYWdhaSBtb2RlbCBmaW5hbC4NCjo6Og0KDQoNCiMjIyBQZXRhIFJpc2lrbyBXaWxheWFoIChkYXJpIE5CIE1peGVkIE1vZGVsKQ0KDQpgYGB7ciBwZXRhLW1vZGVsLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NiwgZmlnLmNhcD0iR2FtYmFyIDMuIFBldGEgZWZlayBhY2FrIGtlY2FtYXRhbiAoTkIgTWl4ZWQgTW9kZWwpLCBrZXNlbHVydWhhbiBwZXJpb2RlIDIwMTctMjAyMS4ifQ0KDQpyZSA8LSByYW5lZihtX21peCkkY29uZCRLZWNhbWF0YW4NCnJlX2RmIDwtIGRhdGEuZnJhbWUoS2VjYW1hdGFuPXJvd25hbWVzKHJlKSwgcmVmZj1yZVssMV0pDQpyZV9kZiRJUlIgPC0gZXhwKHJlX2RmJHJlZmYpDQpwbV9tb2RlbCA8LSBwZXRhICU+JSBsZWZ0X2pvaW4ocmVfZGYsIGJ5PSJLZWNhbWF0YW4iKQ0KZ2dwbG90KHBtX21vZGVsKSArDQogIGdlb21fc2YoYWVzKGZpbGw9SVJSKSwgY29sb3I9IndoaXRlIiwgbGluZXdpZHRoPTAuMikgKw0KICBnZW9tX3RleHQoZGF0YT1wZXRhX2xibCwgYWVzKFgsIFksIGxhYmVsPU5vKSwgc2l6ZT0yLjUsIGNvbG9yPSJncmV5MjAiKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzIxNjZhYyIsIG1pZD0id2hpdGUiLCBoaWdoPSIjYjIxODJiIiwgbWlkcG9pbnQ9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iSVJSIHdpbGF5YWgiLCBuYS52YWx1ZT0iZ3JleTg1IikgKw0KICBsYWJzKHRpdGxlPSJSaXNpa28gUmVsYXRpZiBQbmV1bW9uaWEgQmFsaXRhIHBlciBLZWNhbWF0YW4gKEVmZWsgQWNhaykiLA0KICAgICAgIHN1YnRpdGxlPSJLZXNlbHVydWhhbiBwZXJpb2RlIDIwMTctMjAyMSIsDQogICAgICAgY2FwdGlvbj0iRGFyaSByYW5kb20gaW50ZXJjZXB0IE5CIE1peGVkIE1vZGVsOyBtZXJhaCA9IHJpc2lrbyBsZWJpaCB0aW5nZ2kuIExpaGF0IGtvdGFrIGtldGVyYW5nYW4gbm9tb3Igd2lsYXlhaC4iKSArDQogIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaSAmIHdpbGF5YWggcHJpb3JpdGFzLioqIFBldGEgZWZlayBhY2FrIGtlY2FtYXRhbiAoR2FtYmFyIDMpIG1lbmdnYW1iYXJrYW4gcmlzaWtvIHJlbGF0aWYgcG5ldW1vbmlhIGJhbGl0YSBhbnRhcndpbGF5YWggc2VsYW1hIHBlcmlvZGUgMjAxNy0yMDIxLCBzZXRlbGFoIG1lbmdvbnRyb2wgZWZlayB0YWh1bi4gS2VjYW1hdGFuIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgbWVudW5qdWtrYW4gcmlzaWtvIHJlbGF0aWYgdGVydGluZ2dpIChiZXJ3YXJuYSBtZXJhaCksIHNlZGFuZ2thbiBzZWJhZ2lhbiBiZXNhciBrZWNhbWF0YW4gbGFpbm55YSBiZXJhZGEgZGkgc2VraXRhciBhdGF1IGRpIGJhd2FoIHJhdGEtcmF0YSBrb3RhLiBLZWNhbWF0YW4gYmVyaXNpa28gdGluZ2dpIHRlcnNlYmFyIHNlY2FyYSBnZW9ncmFmaXMgZGFuIHRpZGFrIG1lbWJlbnR1ayBrbGFzdGVyIGtvbnNpc3RlbiBkZW5nYW4gaGFzaWwgdWppIE1vcmFuJ3MgSSBzcGFzaWFsIHlhbmcgdGlkYWsgc2lnbmlmaWthbi4gUG9sYSBpbmkgbWVuZWdhc2thbiBiYWh3YSB2YXJpYXNpIHJpc2lrbyBwbmV1bW9uaWEgYmFsaXRhIGRpIEtvdGEgQmFuZHVuZyBiZXJzaWZhdCBhbnRhcndpbGF5YWggKGhldGVyb2dlbml0YXMgbG9rYWwpIGFsaWgtYWxpaCBtZW5nZWxvbXBvayBzZWNhcmEgc3Bhc2lhbCwgc2VoaW5nZ2EgQ2luYW1ibyBkYW4gQmFuZHVuZyBLaWR1bCBtZW5qYWRpIGthbmRpZGF0IHByaW9yaXRhcyBpbnRlcnZlbnNpIGJlcmJhc2lzIHdpbGF5YWguDQo6OjoNCg0KIyMgSW1wbGlrYXNpDQoNClRlbXVhbiBhbmFsaXNpcyBpbmkgbWVtaWxpa2kgYmViZXJhcGEgaW1wbGlrYXNpLiBQZXRhIHJpc2lrbyByZWxhdGlmIGtlY2FtYXRhbiBtZW5naWRlbnRpZmlrYXNpIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgc2ViYWdhaSB3aWxheWFoIGRlbmdhbiByaXNpa28gcG5ldW1vbmlhIGJhbGl0YSB5YW5nIHRpbmdnaSBkYW4ga29uc2lzdGVuIHNlcGFuamFuZyBwZXJpb2RlLCBzZWhpbmdnYSBrZWR1YW55YSBtZW5qYWRpIGthbmRpZGF0IHByaW9yaXRhcyB1bnR1ayBwZW5ndWF0YW4gc3VydmVpbGFucywgcGVuZW11YW4ga2FzdXMgZGluaSwgZGFuIGludGVydmVuc2kga2VzZWhhdGFuLiBLYXJlbmEgZGV0ZXJtaW5hbiBwcm9ncmFtIGtlc2VoYXRhbiB0aWRhayBtZW51bmp1a2thbiBhc29zaWFzaSB5YW5nIHNpZ25pZmlrYW4gcGFkYSB0aW5na2F0IGFncmVnYXQga2VjYW1hdGFuIHNlbWVudGFyYSB2YXJpYXNpIHJpc2lrbyBhbnRhcndpbGF5YWgganVzdHJ1IHN1YnN0YW5zaWFsLCBwZW5nZW5kYWxpYW4gcG5ldW1vbmlhIGJhbGl0YSBzZWJhaWtueWEgZGlhcmFoa2FuIHNlY2FyYSBiZXJiYXNpcyB3aWxheWFoLCBtZW1mb2t1c2thbiBzdW1iZXIgZGF5YSBwYWRhIGtlY2FtYXRhbiBiZXJpc2lrbyB0aW5nZ2kga2V0aW1iYW5nIGhhbnlhIG1lbmFpa2thbiBjYWt1cGFuIHByb2dyYW0gc2VjYXJhIG1lcmF0YSBkaSBzZWx1cnVoIGtvdGEuDQpBbmFsaXNpcyBpbmkgbWVtaWxpa2kgc2VqdW1sYWgga2V0ZXJiYXRhc2FuLiBQZXJ0YW1hLCBqdW1sYWggYmFsaXRhIHlhbmcgZGlndW5ha2FuIHNlYmFnYWkgcGVueWVidXQgbWVydXBha2FuIGFuZ2thIHNhc2FyYW4vZXN0aW1hc2kgeWFuZyBkYXBhdCBiZXJiZWRhIGRhcmkgcG9wdWxhc2kgcmlpbC4gS2VkdWEsIGRhdGEga2FzdXMgYmVyc3VtYmVyIGRhcmkgcGVsYXBvcmFuIGZhc2lsaXRhcyBwZWxheWFuYW4ga2VzZWhhdGFuIHlhbmcgcmVudGFuIHRlcmhhZGFwIHBlcmJlZGFhbiBjYWt1cGFuIHBlbmNhdGF0YW4sIGhhbCBpbmkgc2FuZ2F0IG1lbm9uam9sIHBhZGEgMjAyMOKAkzIwMjEsIGtldGlrYSBwZW51cnVuYW4ga2FzdXMga2VtdW5na2luYW4gYmVzYXIgbWVuY2VybWlua2FuIGdhbmdndWFuIHBlbmVtdWFuIGRhbiBwZWxhcG9yYW4gc2VsYW1hIHBhbmRlbWkgQ09WSUQtMTkgc2ViYWdhaW1hbmEgZGlueWF0YWthbiBkYWxhbSBQcm9maWwgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZywgYnVrYW4gcGVudXJ1bmFuIGJlYmFuIHBlbnlha2l0IHlhbmcgc2VzdW5nZ3VobnlhLiBLZXRpZ2EsIG1vZGVsIG1lbmdndW5ha2FuIGVmZWsgYWNhayBrZWNhbWF0YW4geWFuZyBiZXJzaWZhdCBpbmRlcGVuZGVuLCBhZGFueWEgaW5kaWthc2kgYmFod2EgcmlzaWtvIGRhc2FyIGFudGFyd2lsYXlhaCBjZW5kZXJ1bmcgbWVuZ2Vsb21wb2sgc2VjYXJhIHNwYXNpYWwgbWVudW5qdWtrYW4gYmFod2EgcGVtb2RlbGFuIGRlbmdhbiBzdHJ1a3R1ciBzcGFzaWFsIGVrc3BsaXNpdCAoc2VwZXJ0aSBDQVIgYXRhdSBCWU0pIGRhcGF0IG1lbmphZGkgcGVuZ2VtYmFuZ2FuIHlhbmcgbGViaWggdGVwYXQgcGFkYSBzdHVkaSBsYW5qdXRhbiBkYW4ga2VlbXBhdCwgZGFsYW0gbWFrYWxhaCBoYW55YSBtZW5nZ3VuYWthbiA1IHRhaHVuIHNlYmFpa255YSBkaXRhbWJhaGthbiBpbmZvcm1hc2kgdGFodW4gdGVydXBkYXRlLg0KDQojIEtlc2ltcHVsYW4geyNrZXNpbXB1bGFufQ0KDQpJbnNpZGVucyBwbmV1bW9uaWEgYmFsaXRhIHlhbmcgdGVyY2F0YXQgZGkgS290YSBCYW5kdW5nIG1lbnVydW4gdGFqYW0gc2VwYW5qYW5nIDIwMTfigJMyMDIxLCBkYXJpIDEwLjczNSBrYXN1cyAoSVIgNS4yOTQgcGVyIDEwMC4wMDAgYmFsaXRhKSBtZW5qYWRpIDIuMDAzIGthc3VzIChJUiAxLjE0MSksIGRlbmdhbiBwZW51cnVuYW4gdGVyYmVzYXIgcGFkYSBtYXNhIHBhbmRlbWkgeWFuZyBrZW11bmdraW5hbiBkaXBlbmdhcnVoaSBnYW5nZ3VhbiBwZWxhcG9yYW4uIEFuYWxpc2lzIFNJUiBkYW4gcGVuZ2hhbHVzYW4gRW1waXJpY2FsIEJheWVzIG1lbWJhbnR1IG1lbmdpZGVudGlmaWthc2kga2VjYW1hdGFuIGJlcmlzaWtvIHRpbmdnaSBzZWNhcmEgbGViaWggYW5kYWwsIGRlbmdhbiBDaW5hbWJvIGRhbiBCYW5kdW5nIEtpZHVsIGtvbnNpc3RlbiBtZW51bmp1a2thbiByaXNpa28gZGkgYXRhcyByYXRhLXJhdGEga290YS4NClVqaSBhdXRva29yZWxhc2kgbWVudW5qdWtrYW4gcG9sYSB5YW5nIGtoYXM6IE1vcmFuJ3MgSSBzcGFzaWFsIHBlciB0YWh1biBsZW1haCBkYW4gdGlkYWsgc2lnbmlmaWthbiwgc2VtZW50YXJhIE1vcmFuJ3MgSSBzcGFzaW8tdGVtcG9yYWwgc2lnbmlmaWthbiAoMCwxODY7IHAgPSAwLDAwMSksIG1lbmFuZGFrYW4gYmFod2EgZGluYW1pa2EgcmlzaWtvIGxlYmloIGRpZ2VyYWtrYW4gb2xlaCBkaW1lbnNpIHRlbXBvcmFsIGRhcmlwYWRhIHBlbmdlbG9tcG9rYW4gZ2VvZ3JhZmlzIGRhbGFtIHNhdHUgdGFodW4uIE1lbGFsdWkgcGVtb2RlbGFuIGJlcnRpbmdrYXQsIE5CIE1peGVkIE1vZGVsIGRlbmdhbiBlZmVrIGFjYWsga2VjYW1hdGFuIHRlcnBpbGloIHNlYmFnYWkgbW9kZWwgdGVyYmFpayAoQUlDIDE3ODgsNCB2cyAxODQzLDYpLCBkZW5nYW4gc2ltcGFuZ2FuIGJha3UgZWZlayBhY2FrIDAsNTE0IHlhbmcgbWVuZWdhc2thbiBoZXRlcm9nZW5pdGFzIHJpc2lrbyBhbnRhcndpbGF5YWguIEhhbnlhIHNhdHUgY292YXJpYXRlIGNha3VwYW4gcHJvZ3JhbSBrZXNlaGF0YW4geWFuZyBiZXJhc29zaWFzaSBzaWduaWZpa2FuIHBhZGEgbW9kZWwgZmluYWwgKG1lbmdndW5ha2FuIGFscGhhIDEwJSksIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGRldGVybWluYW4gcHJvZ3JhbSB0aWRhayBtZW51bmp1a2thbiBhc29zaWFzaSBrdWF0IGRpIHRpbmdrYXQgYWdyZWdhdCBrZWNhbWF0YW4uDQpQZW5nZW5kYWxpYW4gcG5ldW1vbmlhIGJhbGl0YSBkaSBLb3RhIEJhbmR1bmcgc2ViYWlrbnlhIGRpYXJhaGthbiBiZXJiYXNpcyB3aWxheWFoIGRlbmdhbiBtZW1wcmlvcml0YXNrYW4ga2VjYW1hdGFuIGJlcmlzaWtvIHRpbmdnaSBzZXBlcnRpIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwsIGRpc2VydGFpIHBlbmd1YXRhbiBzaXN0ZW0gcGVuY2F0YXRhbiBkYW4gcGVsYXBvcmFuIGthc3VzIGFnYXIgZGF0YSBsZWJpaCBtZW5jZXJtaW5rYW4gYmViYW4gcGVueWFraXQgeWFuZyBzZXN1bmdndWhueWEuDQoNCiMgRGFmdGFyIFB1c3Rha2EgeyNwdXN0YWthfQ0KDQoxLiBCcm9va3MsIE0uIEUuLCBldCBhbC4gKDIwMTcpLiBnbG1tVE1CIGJhbGFuY2VzIHNwZWVkIGFuZCBmbGV4aWJpbGl0eSBhbW9uZyBwYWNrYWdlcyBmb3IgemVyby1pbmZsYXRlZCBnZW5lcmFsaXplZCBsaW5lYXIgbWl4ZWQgbW9kZWxzLiBUaGUgUiBKb3VybmFsDQoyLiBDbGF5dG9uLCBELiwgJiBLYWxkb3IsIEouICgxOTg3KS4gRW1waXJpY2FsIEJheWVzIGVzdGltYXRlcyBvZiBhZ2Utc3RhbmRhcmRpemVkIHJlbGF0aXZlIHJpc2tzIGZvciB1c2UgaW4gZGlzZWFzZSBtYXBwaW5nLiBCaW9tZXRyaWNzDQozLiBDbGlmZiwgQS4gRC4sICYgT3JkLCBKLiBLLiAoMTk4MSkuIFNwYXRpYWwgcHJvY2Vzc2VzOiBNb2RlbHMgYW5kIGFwcGxpY2F0aW9ucy4gTG9uZG9uOiBQaW9uLg0KNC4gRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZy4gKDIwMTYpLiBQcm9maWwgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZyBUYWh1biAyMDE2LiBCYW5kdW5nOiBEaW5hcyBLZXNlaGF0YW4gS290YSBCYW5kdW5nLg0KNS4gRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZy4gKDIwMjEpLiBQcm9maWwgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZyBUYWh1biAyMDIxLiBCYW5kdW5nOiBEaW5hcyBLZXNlaGF0YW4gS290YSBCYW5kdW5nLg0KNi4gIEhpbGJlLCBKLiBNLiAoMjAxMikuIE5lZ2F0aXZlIEJpbm9taWFsIFJlZ3Jlc3Npb24gKDJuZCBlZC4pLiBDYW1icmlkZ2U6IENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLiANCjcuIEtlbWVudGVyaWFuIEtlc2VoYXRhbiBSZXB1YmxpayBJbmRvbmVzaWEuICgyMDIzKS4gUGVtZXJpbnRhaCBiZXJrb21pdG1lbiB0dXJ1bmthbiBrYXN1cyBrZW1hdGlhbiBha2liYXQgcG5ldW1vbmlhLiBKYWthcnRhOiBLZW1lbmtlcyBSSS4gRGlha3NlcyBkYXJpIGh0dHBzOi8vd3d3LmtlbWtlcy5nby5pZC9pZC8lMjBwZW1lcmludGFoLWJlcmtvbWl0bWVuLXR1cnVua2FuLWthc3VzLWtlbWF0aWFuLWFraWJhdC1wbmV1bW9uaWENCjguIExlZSwgSi4sICYgTGksIFMuICgyMDE3KS4gRXh0ZW5kaW5nIE1vcmFuJ3MgaW5kZXggZm9yIG1lYXN1cmluZyBzcGF0aW90ZW1wb3JhbCBjbHVzdGVyaW5nIG9mIGdlb2dyYXBoaWMgZXZlbnRzLiBHZW9ncmFwaGljYWwgQW5hbHlzaXMgDQo5LiBNYXJzaGFsbCwgUi4gSi4gKDE5OTEpLiBNYXBwaW5nIGRpc2Vhc2UgYW5kIG1vcnRhbGl0eSByYXRlcyB1c2luZyBlbXBpcmljYWwgQmF5ZXMgZXN0aW1hdG9ycy4gSm91cm5hbCBvZiB0aGUgUm95YWwgU3RhdGlzdGljYWwgU29jaWV0eTogU2VyaWVzIEMgKEFwcGxpZWQgU3RhdGlzdGljcykNCjEwLiBNb3JhbiwgUC4gQS4gUC4gKDE5NTApLiBOb3RlcyBvbiBjb250aW51b3VzIHN0b2NoYXN0aWMgcGhlbm9tZW5hLiBCaW9tZXRyaWthDQoxMS4gV29ybGQgSGVhbHRoIE9yZ2FuaXphdGlvbi4gKDIwMjIpLiBQbmV1bW9uaWEgaW4gY2hpbGRyZW4uIEdlbmV2YTogV0hPLiBEaWFrc2VzIGRhcmkgaHR0cHM6Ly93d3cud2hvLmludC9uZXdzLXJvb20vZmFjdC1zaGVldHMvZGV0YWlsL3BuZXVtb25pYQ0KDQotLS0NCg0KPGRldGFpbHM+PHN1bW1hcnk+SW5mb3JtYXNpIHNlc2kgUjwvc3VtbWFyeT4NCmBgYHtyIHNlc2l9DQpzZXNzaW9uSW5mbygpDQpgYGANCjwvZGV0YWlscz4NCg==