Confidence Interval ~ Assignment week 13

Logo

Ignasius Rabi Blolong

Student Majoring in Data Science at ITSB

R Programming Data Science Statistics

1 Cases Study I

1.1 Identifikasi

Uji ststistik yang tepat yang digunakan adalah Z-test(uji Z) :

Standar deviasi populasi (σ) diketahui yaitu senilai 3.2

Ukuran sampel (n) cukup besar (n=100, di mana n≥30), sehingga menurut Central Limit Theorem, distribusi rata-rata sampel akan mendekati distribusi normal.

1.2 Perhitungan Interval Kepercayaan (Confidence Intervals)

Rumus umum Interval Kepercayaan (CI) untuk rata-rata dengan σ diketahui adalah:

\[\text{CI} = \bar{x} \pm z \left( \frac{\sigma}{\sqrt{n}} \right)\]

Diketahui: \(\bar{x}\)=12.6, σ=3.2, n=100, maka

\[\frac{3.2}{\sqrt{100}} = 0.32\]

1.3 Perhitungan Interval Kepercayaan per Tingkat Kepercayaan

1.3.1 Untuk Tingkat Kepercayaan 90% (\(z \approx 1.645\))

Proses Perhitungan:

  • Margin of Error (\(E\)): \(1.645 \times 0.32 = 0.5264\)

  • Batas Bawah: \(12.6 - 0.5264 = 12.0736\)

  • Batas Atas: \(12.6 + 0.5264 = 13.1264\)

Hasil Akhir:

\[\text{CI: } [12.07, 13.13]\]


1.3.2 Untuk Tingkat Kepercayaan 95% (\(z \approx 1.96\))

Proses Perhitungan:

  • Margin of Error (\(E\)): \(1.96 \times 0.32 = 0.6272\)

  • Batas Bawah: \(12.6 - 0.6272 = 11.9728\)

  • Batas Atas: \(12.6 + 0.6272 = 13.2272\)

Hasil Akhir:

\[\text{CI: } [11.97, 13.23]\]


1.3.3 Untuk Tingkat Kepercayaan 99% (\(z \approx 2.576\))

Proses Perhitungan:

  • Margin of Error (\(E\)): \(2.576 \times 0.32 = 0.8243\)

  • Batas Bawah: \(12.6 - 0.8243 = 11.7757\)

  • Batas Atas: \(12.6 + 0.8243 = 13.4243\)

Hasil Akhir:

\[\text{CI: } [11.78, 13.42]\]


1.4 Visualisasi Perbandingan

Secara visual, hubungan ketiga interval tersebut adalah sebagai berikut:

90% CI: Paling sempit (presisi tinggi, tapi kepastian lebih rendah).

95% CI: Sedang (standar yang paling umum digunakan).

99% CI: Paling lebar (presisi lebih rendah, tapi tingkat kepastian/keyakinan paling tinggi).

Semakin tinggi tingkat kepercayaan, semakin lebar rentang intervalnya karena nilai kritis z yang digunakan semakin besar.

Tabel Interval Kepercayaan Case Study 1
Confidence Level Batas Bawah Batas Atas
90% 12.074 13.126
95% 11.973 13.227
99% 11.776 13.424

1.5 Interpretasi

Dalam konteks platform e-commerce ini, hasil tersebut berarti:

Pihak manajemen dapat memiliki keyakinan sebesar 95% bahwa rata-rata transaksi harian pengguna yang sebenarnya (setelah fitur baru diluncurkan) berada di kisaran 11.97 hingga 13.23 transaksi.

Jika target perusahaan adalah rata-rata di atas 13 transaksi, maka berdasarkan data ini, kita belum bisa sepenuhnya yakin target tersebut tercapai secara konsisten karena batas bawah interval masih berada di bawah 13.

Hasil ini membantu bisnis dalam mengukur efektivitas fitur baru secara objektif daripada hanya melihat angka rata-rata tunggal (12.6), sehingga pengambilan keputusan (seperti promosi tambahan atau perbaikan fitur) didasarkan pada risiko yang terukur.

2 Cases Study II

2.1 Identifikasi

Berdasarkan data waktu penyelesaian tugas (task completion time) dari 12 pengguna:

Data: 8.4,7.9,9.1,8.7,8.2,9.0,7.8,8.5,8.9,8.1,8.6,8.3

Ukuran Sampel (n): 12

Standar Deviasi Populasi (σ): Tidak Diketahui.

Uji Statistik: Karena nilai σ tidak diketahui dan ukuran sampel kecil (n<30), maka uji statistik yang tepat adalah T-Test (Distribusi-t).

2.2 Perhitungan Statistik Dasar

Sebelum menghitung interval, kita perlu mencari rata-rata sampel \(\bar{x}\) dan standar deviasi sampel (s):

  • Ukuran Sampel (n): 12

  • Derajat Kebebasan (df): n−1=11

  • Rata-rata (\(\bar{x}\)): \(\approx 8.458\)

  • Standar Deviasi Sampel (\(s\)): \(\approx 0.421\)

  • Standard Error (\(SE\)): \(\frac{s}{\sqrt{n}} = \frac{0.421}{\sqrt{12}} \approx 0.1215\)

2.3 Perhitungan Interval Kepercayaan (CI)

Interval Kepercayaan:

  • 90% (\(t \approx 1.796\)): \(8.458 \pm (1.796 \times 0.1215) = [8.240, 8.676]\)

  • 95% (\(t \approx 2.201\)): \(8.458 \pm (2.201 \times 0.1215) = [8.191, 8.725]\)

  • 99% (\(t \approx 3.106\)): \(8.458 \pm (3.106 \times 0.1215) = [8.081, 8.835]\)

2.4 Pengaruh Ukuran Sampel dan Tingkat Kepercayaan

Berikut adalah penjelasan bagaimana kedua faktor tersebut memengaruhi lebar interval:

Tingkat Kepercayaan (Confidence Level): Semakin tinggi tingkat kepercayaan (misal dari 95% ke 99%), semakin lebar intervalnya. Hal ini karena kita membutuhkan rentang yang lebih luas untuk memastikan bahwa rata-rata populasi benar-benar berada di dalam interval tersebut.

Ukuran Sampel (n): Semakin besar ukuran sampel, semakin sempit intervalnya. Secara matematis, n berada di penyebut dalam rumus standard error. Sampel yang lebih besar memberikan estimasi yang lebih presisi terhadap parameter populasi, sehingga ketidakpastian (margin of error) berkurang.

3 Cases Study III

3.1 Identifikasi

Dalam eksperimen A/B Testing untuk desain tombol CTA (Call to Action) yang baru, kita mengukur proporsi pengguna yang melakukan klik. Parameter yang diperoleh adalah: * Ukuran Sampel (\(n\)): \(400\) pengguna.

  • Jumlah Keberhasilan (\(x\)): \(156\) pengguna yang mengklik tombol.

  • Tingkat Kepercayaan: Diuji pada level 90%, 95%, dan 99%.

  • Metode Statistik: Karena kita berurusan dengan data kategori (klik atau tidak klik) dan sampel yang besar, kita menggunakan Z-Distribution for Proportions.

3.2 Penyelesian

Langkah 1: Menghitung Proporsi Sampel (\(\hat{p}\))

\[\hat{p} = \frac{x}{n} = \frac{156}{400} = 0.39\] Artinya, tingkat klik (CTR) pada sampel adalah 39%.

Langkah 2: Menghitung Standard Error (\(SE\)) untuk Proporsi

Rumus yang digunakan adalah: \[SE = \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}}\] Substitusi nilai: \[SE = \sqrt{\frac{0.39 \times (1 - 0.39)}{400}} = \sqrt{\frac{0.39 \times 0.61}{400}} = \sqrt{0.00059475} \approx 0.02439\]

Langkah 3: Menentukan Nilai Kritis Z (\(z_{\alpha/2}\))

  • Untuk 90% Confidence Level: \(z \approx 1.645\)

  • Untuk 95% Confidence Level: \(z \approx 1.96\)

  • Untuk 99% Confidence Level: \(z \approx 2.576\)

Langkah 4: Menghitung Margin of Error (\(E\))

  • \(E_{90}\): \(1.645 \times 0.02439 = 0.0401\)

  • \(E_{95}\): \(1.96 \times 0.02439 = 0.0478\)

  • \(E_{99}\): \(2.576 \times 0.02439 = 0.0628\)

Langkah 5: Menentukan Rentang Interval Kepercayaan (\(\hat{p} \pm E\))

  • CI 90%: \(0.39 \pm 0.0401 = [0.3499, 0.4301]\) atau [34.99%, 43.01%]

  • CI 95%: \(0.39 \pm 0.0478 = [0.3422, 0.4378]\) atau [34.22%, 43.78%]

  • CI 99%: \(0.39 \pm 0.0628 = [0.3272, 0.4528]\) atau [32.72%, 45.28%]

3.3 Visualisasi

Tabel Perhitungan Interval Kepercayaan Proporsi (Case Study 3)
Level Kepercayaan Z-Score Margin Error Batas Bawah Batas Atas
0.90 1.6449 0.0401 0.3499 0.4301
0.95 1.9600 0.0478 0.3422 0.4378
0.99 2.5758 0.0628 0.3272 0.4528

3.4 Interpretasi

Berdasarkan analisis di atas, kita memiliki keyakinan 95% bahwa tingkat klik (Click-Through Rate) yang sebenarnya untuk tombol desain baru di seluruh populasi pengguna berada di rentang 34.22% hingga 43.78%.

Hasil ini memberikan bukti kuat bagi tim produk bahwa performa tombol baru ini cukup stabil. Namun, jika tim produk memiliki target minimal klik sebesar 45%, maka berdasarkan data ini, target tersebut belum tercapai secara signifikan karena batas atas interval (43.78%) masih berada di bawah target tersebut.

4 Cases Study IV

4.1 Identifikasi

Berdasarkan data yang tersedia :

Team A: Menggunakan Z-Test. Justifikasi: Standar deviasi populasi (σ) diketahui (24) dan ukuran sampel (n=36) memenuhi syarat sampel besar (n≥30).

Team B: Menggunakan T-Test. Justifikasi: Standar deviasi populasi tidak diketahui, sehingga tim menggunakan standar deviasi sampel (s=24). Meskipun n=36, penggunaan s mengarahkan pada distribusi-t untuk presisi yang lebih konservatif.

Data Kelompok A (Server Lama):

  • \(n_1 = 15\)
  • \(\bar{x}_1 = 3.2\) detik
  • \(s_1 = 0.5\) detik

Data Kelompok B (Server Baru):

  • \(n_2 = 12\)
  • \(\bar{x}_2 = 2.8\) detik
  • \(s_2 = 0.4\) detik

Tingkat Kepercayaan: 95% (\(\alpha = 0.05\)).

4.2 Penyelesaian

Langkah 1: Menghitung Point Estimate (Selisih Mean)

\[\text{Point Estimate} = \bar{x}_1 - \bar{x}_2 = 3.2 - 2.8 = 0.4 \text{ detik}\]

Langkah 2: Menghitung Standard Error of the Difference (\(SE\) atau \(S_{\bar{x}_1 - \bar{x}_2}\)) Rumus (Welch’s):

\[SE = \sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}\] \[SE = \sqrt{\frac{0.5^2}{15} + \frac{0.4^2}{12}} = \sqrt{\frac{0.25}{15} + \frac{0.16}{12}}\] \[SE = \sqrt{0.01667 + 0.01333} = \sqrt{0.0300} \approx 0.1732\]

Langkah 3: Menentukan Degrees of Freedom (\(df\))

Menggunakan rumus konservatif (yang lebih sederhana/kecil di antara \(n_1-1\) atau \(n_2-1\)): \[df = \min(15-1, 12-1) = 11\]

Langkah 4: Menentukan Nilai Kritis \(t\) (\(t_{\alpha/2, df}\))

Untuk 95% CI dengan \(df = 11\): \[t^* \approx 2.201\]

Langkah 5: Menghitung Margin of Error (\(E\))

\[E = t^* \times SE = 2.201 \times 0.1732 \approx 0.3812\]

Langkah 6: Menentukan Interval Kepercayaan

\[(\bar{x}_1 - \bar{x}_2) \pm E = 0.4 \pm 0.3812 = [0.0188, 0.7812]\]

4.3 Visualisasi

## Selisih Mean: 0.4
## Margin of Error: 0.356724
## 95% CI: [ 0.04327601 , 0.756724 ]

4.4 Interpretasi

Karena rentang Interval Kepercayaan [0.0188, 0.7812] seluruhnya berada di atas angka 0, kita dapat menyimpulkan dengan tingkat kepercayaan 95% bahwa Server Baru secara signifikan lebih cepat daripada Server Lama.

Meskipun sampelnya kecil, bukti statistik menunjukkan adanya penghematan waktu muat minimal 0.018 detik hingga maksimal 0.78 detik. Penggunaan Server Baru sangat direkomendasikan untuk meningkatkan pengalaman pengguna.

5 Cases Study V

5.1 Identifikasi

Tipe Interval Kepercayaan: One-sided lower confidence interval (batas bawah satu sisi). Hal ini karena manajemen hanya tertarik untuk memastikan bahwa nilai proporsi setidaknya (at least) mencapai target tertentu.

Uji Statistik: Z-test for Proportion. Kita berurusan dengan data kategori (pengguna aktif premium vs bukan) dengan ukuran sampel yang besar (n=250), sehingga distribusi normal dapat digunakan untuk mendekati distribusi binomial.

Manajemen ingin mengevaluasi peluncuran fitur premium baru. Pertanyaan kuncinya bukan mencari rentang di antara dua angka, melainkan memastikan apakah proporsi pengguna setidaknya (minimal) mencapai target 70%.

  • Ukuran Sampel (\(n\)): \(250\) pengguna.

  • Jumlah Sukses (\(x\)): \(185\) pengguna yang menyukai fitur.

  • Target Manajemen: \(70\%\) (\(0.70\)).

  • Metode: Menggunakan One-Sided Lower Confidence Bound (Batas Bawah Satu Sisi). Kita menggunakan distribusi Z karena ini adalah estimasi proporsi dengan sampel besar.

5.2 Penyelesaian

Langkah 1: Menghitung Proporsi Sampel (\(\hat{p}\))

\[\hat{p} = \frac{x}{n} = \frac{185}{250} = 0.74\] Hasil sampel menunjukkan tingkat kesukaan sebesar 74%.

Langkah 2: Menghitung Standard Error (\(SE\))

\[SE = \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}}\] \[SE = \sqrt{\frac{0.74 \times (1 - 0.74)}{250}} = \sqrt{\frac{0.74 \times 0.26}{250}} = \sqrt{0.0007696} \approx 0.02774\]

Langkah 3: Menentukan Nilai Z Satu Sisi (\(z_{\alpha}\))

Berbeda dengan interval dua sisi, pada satu sisi kita memusatkan seluruh tingkat kesalahan (\(\alpha\)) di satu ujung distribusi: * Untuk 90% Confidence (One-sided): \(z \approx 1.282\) * Untuk 95% Confidence (One-sided): \(z \approx 1.645\)

Langkah 4: Menghitung Lower Bound (Batas Bawah)

Rumus: \(Lower Bound = \hat{p} - (z \times SE)\)

  • Pada Tingkat Kepercayaan 90%:

    \[0.74 - (1.282 \times 0.02774) = 0.74 - 0.0355 = 0.7045 \text{ atau } \mathbf{70.45\%}\]

  • Pada Tingkat Kepercayaan 95%:

    \[0.74 - (1.645 \times 0.02774) = 0.74 - 0.0456 = 0.6944 \text{ atau } \mathbf{69.44\%}\]

5.3 Visualisasi

Analisis Batas Bawah Satu Sisi (Case Study 5)
Level Kepercayaan Z-Critical (1-side) Batas Bawah (LB) Target 70% Tercapai?
0.90 1.2816 0.7044 TRUE
0.95 1.6449 0.6944 FALSE

5.4 Interpretasi

Berdasarkan hasil analisis satu sisi:

Pada tingkat kepercayaan 90%, kita bisa menyatakan bahwa secara statistik proporsi pengguna yang menyukai fitur adalah setidaknya 70.45%. Karena angka ini di atas 70%, target dianggap terpenuhi.

Namun, jika manajemen menuntut tingkat kepastian lebih tinggi (95%), batas bawah kita turun menjadi 69.44%. Secara ketat, kita gagal menyatakan bahwa target 70% tercapai karena batas bawah tersebut sedikit di bawah target.

Rekomendasi: Perusahaan berada di posisi yang sangat dekat dengan target. Disarankan melakukan iterasi kecil pada fitur untuk meningkatkan kepuasan pengguna sebelum penarikan kesimpulan akhir.

LS0tDQp0aXRsZTogIiINCmF1dGhvcjogIklnbmFzaXVzIFJhYmkgQmxvbG9uZyAoNTIyNTAwNzMpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlIA0KICAgIGNzczogInN0YXRpc3Rpa2EuY3NzIg0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogZmxhdGx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCmBgYA0KDQo8aDEgY2xhc3M9ImhlYWRlci10aXRsZSI+Q29uZmlkZW5jZSBJbnRlcnZhbCB+IEFzc2lnbm1lbnQgd2VlayAxMzwvaDE+DQogIA0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLWNhcmQiPg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLWltYWdlIj4NCiAgPGltZyBpZD0iRm90byIgc3JjPSJmb3RvaWdhLmpwZWciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQogIDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLWluZm8iPg0KICA8aDI+SWduYXNpdXMgUmFiaSBCbG9sb25nPC9oMj4NCiAgPHA+U3R1ZGVudCBNYWpvcmluZyBpbiBEYXRhIFNjaWVuY2UgYXQgSVRTQjwvcD4NCiAgDQogIDxkaXYgY2xhc3M9ImJhZGdlcyI+DQogIDxzcGFuIGNsYXNzPSJiYWRnZSBiYWRnZS1ibHVlIj5SIFByb2dyYW1taW5nPC9zcGFuPg0KICA8c3BhbiBjbGFzcz0iYmFkZ2UgYmFkZ2UtcmVkIj5EYXRhIFNjaWVuY2U8L3NwYW4+DQogIDxzcGFuIGNsYXNzPSJiYWRnZSBiYWRnZS1ncmVlbiI+U3RhdGlzdGljczwvc3Bhbj4NCiAgPC9kaXY+DQogIDwvZGl2Pg0KICA8L2Rpdj4NCg0KIyBDYXNlcyBTdHVkeSBJDQoNCiMjIElkZW50aWZpa2FzaQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KVWppIHN0c3Rpc3RpayB5YW5nIHRlcGF0IHlhbmcgZGlndW5ha2FuIGFkYWxhaCBaLXRlc3QodWppIFopIDoNCg0KU3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICjPgykgZGlrZXRhaHVpIHlhaXR1IHNlbmlsYWkgMy4yDQoNClVrdXJhbiBzYW1wZWwgKG4pIGN1a3VwIGJlc2FyIChuPTEwMCwgZGkgbWFuYSBu4omlMzApLCBzZWhpbmdnYSBtZW51cnV0IENlbnRyYWwgTGltaXQgVGhlb3JlbSwNCiAgICBkaXN0cmlidXNpIHJhdGEtcmF0YSBzYW1wZWwgYWthbiBtZW5kZWthdGkgZGlzdHJpYnVzaSBub3JtYWwuDQogICAgDQo8L2Rpdj4NCg0KIyMgUGVyaGl0dW5nYW4gSW50ZXJ2YWwgS2VwZXJjYXlhYW4gKENvbmZpZGVuY2UgSW50ZXJ2YWxzKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KUnVtdXMgdW11bSBJbnRlcnZhbCBLZXBlcmNheWFhbiAoQ0kpIHVudHVrIHJhdGEtcmF0YSBkZW5nYW4gz4MgZGlrZXRhaHVpIGFkYWxhaDoNCg0KJCRcdGV4dHtDSX0gPSBcYmFye3h9IFxwbSB6IFxsZWZ0KCBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSBccmlnaHQpJCQNCg0KRGlrZXRhaHVpOiAkXGJhcnt4fSQ9MTIuNiwgz4M9My4yLCBuPTEwMCwgbWFrYSANCg0KJCRcZnJhY3szLjJ9e1xzcXJ0ezEwMH19ID0gMC4zMiQkDQoNCjwvZGl2Pg0KDQojIyBQZXJoaXR1bmdhbiBJbnRlcnZhbCBLZXBlcmNheWFhbiBwZXIgVGluZ2thdCBLZXBlcmNheWFhbg0KDQojIyMgVW50dWsgVGluZ2thdCBLZXBlcmNheWFhbiA5MCUgKCR6IFxhcHByb3ggMS42NDUkKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KKipQcm9zZXMgUGVyaGl0dW5nYW46KioNCg0KKiAqKk1hcmdpbiBvZiBFcnJvciAoJEUkKToqKiAkMS42NDUgXHRpbWVzIDAuMzIgPSAwLjUyNjQkDQoNCiogKipCYXRhcyBCYXdhaDoqKiAkMTIuNiAtIDAuNTI2NCA9IDEyLjA3MzYkDQoNCiogKipCYXRhcyBBdGFzOioqICQxMi42ICsgMC41MjY0ID0gMTMuMTI2NCQNCg0KKipIYXNpbCBBa2hpcjoqKg0KDQokJFx0ZXh0e0NJOiB9IFsxMi4wNywgMTMuMTNdJCQNCjwvZGl2Pg0KDQotLS0NCg0KIyMjIFVudHVrIFRpbmdrYXQgS2VwZXJjYXlhYW4gOTUlICgkeiBcYXBwcm94IDEuOTYkKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KKipQcm9zZXMgUGVyaGl0dW5nYW46KioNCg0KKiAqKk1hcmdpbiBvZiBFcnJvciAoJEUkKToqKiAkMS45NiBcdGltZXMgMC4zMiA9IDAuNjI3MiQNCg0KKiAqKkJhdGFzIEJhd2FoOioqICQxMi42IC0gMC42MjcyID0gMTEuOTcyOCQNCg0KKiAqKkJhdGFzIEF0YXM6KiogJDEyLjYgKyAwLjYyNzIgPSAxMy4yMjcyJA0KDQoqKkhhc2lsIEFraGlyOioqDQoNCiQkXHRleHR7Q0k6IH0gWzExLjk3LCAxMy4yM10kJA0KPC9kaXY+DQoNCi0tLQ0KDQojIyMgVW50dWsgVGluZ2thdCBLZXBlcmNheWFhbiA5OSUgKCR6IFxhcHByb3ggMi41NzYkKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNjZDsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmZjMTA3OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KKipQcm9zZXMgUGVyaGl0dW5nYW46KioNCg0KKiAqKk1hcmdpbiBvZiBFcnJvciAoJEUkKToqKiAkMi41NzYgXHRpbWVzIDAuMzIgPSAwLjgyNDMkDQoNCiogKipCYXRhcyBCYXdhaDoqKiAkMTIuNiAtIDAuODI0MyA9IDExLjc3NTckDQoNCiogKipCYXRhcyBBdGFzOioqICQxMi42ICsgMC44MjQzID0gMTMuNDI0MyQNCg0KKipIYXNpbCBBa2hpcjoqKg0KDQokJFx0ZXh0e0NJOiB9IFsxMS43OCwgMTMuNDJdJCQNCjwvZGl2Pg0KDQotLS0NCg0KIyMgVmlzdWFsaXNhc2kgUGVyYmFuZGluZ2FuDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmM2ZmOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDdiZmY7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KDQpTZWNhcmEgdmlzdWFsLCBodWJ1bmdhbiBrZXRpZ2EgaW50ZXJ2YWwgdGVyc2VidXQgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dDoNCg0KOTAlIENJOiBQYWxpbmcgc2VtcGl0IChwcmVzaXNpIHRpbmdnaSwgdGFwaSBrZXBhc3RpYW4gbGViaWggcmVuZGFoKS4NCg0KOTUlIENJOiBTZWRhbmcgKHN0YW5kYXIgeWFuZyBwYWxpbmcgdW11bSBkaWd1bmFrYW4pLg0KDQo5OSUgQ0k6IFBhbGluZyBsZWJhciAocHJlc2lzaSBsZWJpaCByZW5kYWgsIHRhcGkgdGluZ2thdCBrZXBhc3RpYW4va2V5YWtpbmFuIHBhbGluZyB0aW5nZ2kpLg0KDQpTZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuLCBzZW1ha2luIGxlYmFyIHJlbnRhbmcgaW50ZXJ2YWxueWEga2FyZW5hIG5pbGFpIGtyaXRpcyB6IHlhbmcgZGlndW5ha2FuIHNlbWFraW4gYmVzYXIuDQo8L2Rpdj4NCg0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2Q0ZWRkYTsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMjhhNzQ1OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KYGBge3IgY3MxX2NhbGN9DQojIElucHV0IERhdGENCnhfYmFyIDwtIDEyLjYNCnNpZ21hIDwtIDMuMg0KbiA8LSAxMDANCnNlIDwtIHNpZ21hIC8gc3FydChuKQ0KDQojIFBlcmhpdHVuZ2FuIENJDQpjb25mX2xldmVscyA8LSBjKDAuOTAsIDAuOTUsIDAuOTkpDQpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoTGV2ZWwgPSBjb25mX2xldmVscykgJT4lDQogIG11dGF0ZSgNCiAgICBaX3Njb3JlID0gcW5vcm0oMSAtICgxIC0gTGV2ZWwpIC8gMiksDQogICAgTWFyZ2luX29mX0Vycm9yID0gWl9zY29yZSAqIHNlLA0KICAgIExvd2VyX0JvdW5kID0geF9iYXIgLSBNYXJnaW5fb2ZfRXJyb3IsDQogICAgVXBwZXJfQm91bmQgPSB4X2JhciArIE1hcmdpbl9vZl9FcnJvciwNCiAgICBMYWJlbCA9IHBhc3RlMChMZXZlbCAqIDEwMCwgIiUiKQ0KICApDQoNCiMgVGFtcGlsa2FuIFRhYmVsDQprbml0cjo6a2FibGUocmVzdWx0c1ssIGMoIkxhYmVsIiwgIkxvd2VyX0JvdW5kIiwgIlVwcGVyX0JvdW5kIildLCANCiAgICAgICAgICAgICBkaWdpdHMgPSAzLCANCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCJDb25maWRlbmNlIExldmVsIiwgIkJhdGFzIEJhd2FoIiwgIkJhdGFzIEF0YXMiKSwNCiAgICAgICAgICAgICBjYXB0aW9uID0gIlRhYmVsIEludGVydmFsIEtlcGVyY2F5YWFuIENhc2UgU3R1ZHkgMSIpDQogICAgICAgICAgICAgDQojIG1lbmFtcGlsa2FuIHZpc3VhbA0KZ2dwbG90KHJlc3VsdHMsIGFlcyh4ID0gTGFiZWwsIHkgPSB4X2JhcikpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMywgY29sb3IgPSAiZGFya2JsdWUiKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlcl9Cb3VuZCwgeW1heCA9IFVwcGVyX0JvdW5kKSwgDQogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIHNpemUgPSAxLCBjb2xvciA9ICJzdGVlbGJsdWUiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHhfYmFyLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArDQogIGxhYnModGl0bGUgPSAiUGVyYmFuZGluZ2FuIFByZXNpc2kgSW50ZXJ2YWwgS2VwZXJjYXlhYW4iLA0KICAgICAgIHN1YnRpdGxlID0gIlJhdGEtcmF0YSB0cmFuc2Frc2kgaGFyaWFuIHBlbmdndW5hIChuPTEwMCkiLA0KICAgICAgIHggPSAiVGluZ2thdCBLZXBlcmNheWFhbiIsIHkgPSAiUmF0YS1yYXRhIFRyYW5zYWtzaSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQogIA0KYGBgDQo8L2Rpdj4NCiANCiANCiMjIEludGVycHJldGFzaSANCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCkRhbGFtIGtvbnRla3MgcGxhdGZvcm0gZS1jb21tZXJjZSBpbmksIGhhc2lsIHRlcnNlYnV0IGJlcmFydGk6DQoNClBpaGFrIG1hbmFqZW1lbiBkYXBhdCBtZW1pbGlraSBrZXlha2luYW4gc2ViZXNhciA5NSUgYmFod2EgcmF0YS1yYXRhIHRyYW5zYWtzaSBoYXJpYW4gcGVuZ2d1bmEgeWFuZyBzZWJlbmFybnlhIChzZXRlbGFoICAgICAgICAgIGZpdHVyIGJhcnUgZGlsdW5jdXJrYW4pIGJlcmFkYSBkaSBraXNhcmFuIDExLjk3IGhpbmdnYSAxMy4yMyB0cmFuc2Frc2kuDQoNCkppa2EgdGFyZ2V0IHBlcnVzYWhhYW4gYWRhbGFoIHJhdGEtcmF0YSBkaSBhdGFzIDEzIHRyYW5zYWtzaSwgbWFrYSBiZXJkYXNhcmthbiBkYXRhIGluaSwga2l0YSBiZWx1bSBiaXNhIHNlcGVudWhueWEgeWFraW4gICAgICAgIHRhcmdldCB0ZXJzZWJ1dCB0ZXJjYXBhaSBzZWNhcmEga29uc2lzdGVuIGthcmVuYSBiYXRhcyBiYXdhaCBpbnRlcnZhbCBtYXNpaCBiZXJhZGEgZGkgYmF3YWggMTMuDQoNCkhhc2lsIGluaSBtZW1iYW50dSBiaXNuaXMgZGFsYW0gbWVuZ3VrdXIgZWZla3Rpdml0YXMgZml0dXIgYmFydSBzZWNhcmEgb2JqZWt0aWYgZGFyaXBhZGEgaGFueWEgbWVsaWhhdCBhbmdrYSByYXRhLXJhdGEgICAgICAgICAgIHR1bmdnYWwgKDEyLjYpLCBzZWhpbmdnYSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gKHNlcGVydGkgcHJvbW9zaSB0YW1iYWhhbiBhdGF1IHBlcmJhaWthbiBmaXR1cikgZGlkYXNhcmthbiBwYWRhIHJpc2lrbyB5YW5nICAgICAgIHRlcnVrdXIuDQogIA0KPC9kaXY+DQogDQogIA0KIyBDYXNlcyBTdHVkeSBJSQ0KDQojIyBJZGVudGlmaWthc2kNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCkJlcmRhc2Fya2FuIGRhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzICh0YXNrIGNvbXBsZXRpb24gdGltZSkgZGFyaSAxMiBwZW5nZ3VuYToNCg0KRGF0YTogOC40LDcuOSw5LjEsOC43LDguMiw5LjAsNy44LDguNSw4LjksOC4xLDguNiw4LjMNCg0KVWt1cmFuIFNhbXBlbCAobik6IDEyDQoNClN0YW5kYXIgRGV2aWFzaSBQb3B1bGFzaSAoz4MpOiBUaWRhayBEaWtldGFodWkuDQoNClVqaSBTdGF0aXN0aWs6IEthcmVuYSBuaWxhaSDPgyB0aWRhayBkaWtldGFodWkgZGFuIHVrdXJhbiBzYW1wZWwga2VjaWwgKG48MzApLCBtYWthIHVqaSBzdGF0aXN0aWsgeWFuZyB0ZXBhdCBhZGFsYWggVC1UZXN0IChEaXN0cmlidXNpLXQpLg0KDQo8L2Rpdj4NCg0KIyMgUGVyaGl0dW5nYW4gU3RhdGlzdGlrIERhc2FyDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmM2ZmOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDdiZmY7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KDQpTZWJlbHVtIG1lbmdoaXR1bmcgaW50ZXJ2YWwsIGtpdGEgcGVybHUgbWVuY2FyaSByYXRhLXJhdGEgc2FtcGVsICRcYmFye3h9JCBkYW4gc3RhbmRhciBkZXZpYXNpIHNhbXBlbCAocyk6DQoNCiogVWt1cmFuIFNhbXBlbCAobik6IDEyDQoNCiogRGVyYWphdCBLZWJlYmFzYW4gKGRmKTogbuKIkjE9MTENCg0KKiBSYXRhLXJhdGEgKCRcYmFye3h9JCk6ICRcYXBwcm94IDguNDU4JA0KDQoqIFN0YW5kYXIgRGV2aWFzaSBTYW1wZWwgKCRzJCk6ICRcYXBwcm94IDAuNDIxJA0KDQoqIFN0YW5kYXJkIEVycm9yICgkU0UkKTogJFxmcmFje3N9e1xzcXJ0e259fSA9IFxmcmFjezAuNDIxfXtcc3FydHsxMn19IFxhcHByb3ggMC4xMjE1JA0KDQo8L2Rpdj4NCg0KIyMgUGVyaGl0dW5nYW4gSW50ZXJ2YWwgS2VwZXJjYXlhYW4gKENJKQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCioqSW50ZXJ2YWwgS2VwZXJjYXlhYW46KioNCg0KKiAqKjkwJSAoJHQgXGFwcHJveCAxLjc5NiQpOioqICQ4LjQ1OCBccG0gKDEuNzk2IFx0aW1lcyAwLjEyMTUpID0gWzguMjQwLCA4LjY3Nl0kDQoNCiogKio5NSUgKCR0IFxhcHByb3ggMi4yMDEkKToqKiAkOC40NTggXHBtICgyLjIwMSBcdGltZXMgMC4xMjE1KSA9IFs4LjE5MSwgOC43MjVdJA0KDQoqICoqOTklICgkdCBcYXBwcm94IDMuMTA2JCk6KiogJDguNDU4IFxwbSAoMy4xMDYgXHRpbWVzIDAuMTIxNSkgPSBbOC4wODEsIDguODM1XSQNCg0KPC9kaXY+DQoNCiMjIFBlbmdhcnVoIFVrdXJhbiBTYW1wZWwgZGFuIFRpbmdrYXQgS2VwZXJjYXlhYW4NCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCkJlcmlrdXQgYWRhbGFoIHBlbmplbGFzYW4gYmFnYWltYW5hIGtlZHVhIGZha3RvciB0ZXJzZWJ1dCBtZW1lbmdhcnVoaSBsZWJhciBpbnRlcnZhbDoNCg0KVGluZ2thdCBLZXBlcmNheWFhbiAoQ29uZmlkZW5jZSBMZXZlbCk6IFNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4gKG1pc2FsIGRhcmkgOTUlIGtlIDk5JSksIHNlbWFraW4gbGViYXIgICAgICAgICAgICAgICAgaW50ZXJ2YWxueWEuIEhhbCBpbmkga2FyZW5hIGtpdGEgbWVtYnV0dWhrYW4gcmVudGFuZyB5YW5nIGxlYmloIGx1YXMgdW50dWsgbWVtYXN0aWthbiBiYWh3YSByYXRhLXJhdGEgcG9wdWxhc2kgYmVuYXItYmVuYXIgICAgICAgYmVyYWRhIGRpIGRhbGFtIGludGVydmFsIHRlcnNlYnV0Lg0KDQpVa3VyYW4gU2FtcGVsIChuKTogU2VtYWtpbiBiZXNhciB1a3VyYW4gc2FtcGVsLCBzZW1ha2luIHNlbXBpdCBpbnRlcnZhbG55YS4gU2VjYXJhIG1hdGVtYXRpcywgbiBiZXJhZGEgZGkgcGVueWVidXQgZGFsYW0gICAgICAgICBydW11cyBzdGFuZGFyZCBlcnJvci4gU2FtcGVsIHlhbmcgbGViaWggYmVzYXIgbWVtYmVyaWthbiBlc3RpbWFzaSB5YW5nIGxlYmloIHByZXNpc2kgdGVyaGFkYXAgcGFyYW1ldGVyIHBvcHVsYXNpLCBzZWhpbmdnYSAgICAgICBrZXRpZGFrcGFzdGlhbiAobWFyZ2luIG9mIGVycm9yKSBiZXJrdXJhbmcuICAgDQogICAgDQo8L2Rpdj4NCiAgDQoNCiMgQ2FzZXMgU3R1ZHkgSUlJDQoNCiMjIElkZW50aWZpa2FzaSANCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQpEYWxhbSBla3NwZXJpbWVuIEEvQiBUZXN0aW5nIHVudHVrIGRlc2FpbiB0b21ib2wgQ1RBICgqQ2FsbCB0byBBY3Rpb24qKSB5YW5nIGJhcnUsIGtpdGEgbWVuZ3VrdXIgcHJvcG9yc2kgcGVuZ2d1bmEgeWFuZyBtZWxha3VrYW4ga2xpay4gUGFyYW1ldGVyIHlhbmcgZGlwZXJvbGVoIGFkYWxhaDoNCiogKipVa3VyYW4gU2FtcGVsICgkbiQpOioqICQ0MDAkIHBlbmdndW5hLg0KDQoqICoqSnVtbGFoIEtlYmVyaGFzaWxhbiAoJHgkKToqKiAkMTU2JCBwZW5nZ3VuYSB5YW5nIG1lbmdrbGlrIHRvbWJvbC4NCg0KKiAqKlRpbmdrYXQgS2VwZXJjYXlhYW46KiogRGl1amkgcGFkYSBsZXZlbCA5MCUsIDk1JSwgZGFuIDk5JS4NCg0KKiAqKk1ldG9kZSBTdGF0aXN0aWs6KiogS2FyZW5hIGtpdGEgYmVydXJ1c2FuIGRlbmdhbiBkYXRhIGthdGVnb3JpIChrbGlrIGF0YXUgdGlkYWsga2xpaykgZGFuIHNhbXBlbCB5YW5nIGJlc2FyLCBraXRhIG1lbmdndW5ha2FuICoqWi1EaXN0cmlidXRpb24gZm9yIFByb3BvcnRpb25zKiouDQoNCjwvZGl2Pg0KDQojIyBQZW55ZWxlc2lhbiANCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCioqTGFuZ2thaCAxOiBNZW5naGl0dW5nIFByb3BvcnNpIFNhbXBlbCAoJFxoYXR7cH0kKSoqDQoNCiQkXGhhdHtwfSA9IFxmcmFje3h9e259ID0gXGZyYWN7MTU2fXs0MDB9ID0gMC4zOSQkDQpBcnRpbnlhLCB0aW5na2F0IGtsaWsgKENUUikgcGFkYSBzYW1wZWwgYWRhbGFoIDM5JS4NCg0KKipMYW5na2FoIDI6IE1lbmdoaXR1bmcgU3RhbmRhcmQgRXJyb3IgKCRTRSQpIHVudHVrIFByb3BvcnNpKioNCg0KUnVtdXMgeWFuZyBkaWd1bmFrYW4gYWRhbGFoOg0KJCRTRSA9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMSAtIFxoYXR7cH0pfXtufX0kJA0KU3Vic3RpdHVzaSBuaWxhaToNCiQkU0UgPSBcc3FydHtcZnJhY3swLjM5IFx0aW1lcyAoMSAtIDAuMzkpfXs0MDB9fSA9IFxzcXJ0e1xmcmFjezAuMzkgXHRpbWVzIDAuNjF9ezQwMH19ID0gXHNxcnR7MC4wMDA1OTQ3NX0gXGFwcHJveCAwLjAyNDM5JCQNCg0KKipMYW5na2FoIDM6IE1lbmVudHVrYW4gTmlsYWkgS3JpdGlzIFogKCR6X3tcYWxwaGEvMn0kKSoqDQoNCiogVW50dWsgOTAlIENvbmZpZGVuY2UgTGV2ZWw6ICR6IFxhcHByb3ggMS42NDUkDQoNCiogVW50dWsgOTUlIENvbmZpZGVuY2UgTGV2ZWw6ICR6IFxhcHByb3ggMS45NiQNCg0KKiBVbnR1ayA5OSUgQ29uZmlkZW5jZSBMZXZlbDogJHogXGFwcHJveCAyLjU3NiQNCg0KKipMYW5na2FoIDQ6IE1lbmdoaXR1bmcgTWFyZ2luIG9mIEVycm9yICgkRSQpKioNCg0KKiAqKiRFX3s5MH0kOioqICQxLjY0NSBcdGltZXMgMC4wMjQzOSA9IDAuMDQwMSQNCg0KKiAqKiRFX3s5NX0kOioqICQxLjk2IFx0aW1lcyAwLjAyNDM5ID0gMC4wNDc4JA0KDQoqICoqJEVfezk5fSQ6KiogJDIuNTc2IFx0aW1lcyAwLjAyNDM5ID0gMC4wNjI4JA0KDQoqKkxhbmdrYWggNTogTWVuZW50dWthbiBSZW50YW5nIEludGVydmFsIEtlcGVyY2F5YWFuICgkXGhhdHtwfSBccG0gRSQpKioNCg0KKiAqKkNJIDkwJToqKiAkMC4zOSBccG0gMC4wNDAxID0gWzAuMzQ5OSwgMC40MzAxXSQgYXRhdSAqKlszNC45OSUsIDQzLjAxJV0qKg0KDQoqICoqQ0kgOTUlOioqICQwLjM5IFxwbSAwLjA0NzggPSBbMC4zNDIyLCAwLjQzNzhdJCBhdGF1ICoqWzM0LjIyJSwgNDMuNzglXSoqDQoNCiogKipDSSA5OSU6KiogJDAuMzkgXHBtIDAuMDYyOCA9IFswLjMyNzIsIDAuNDUyOF0kIGF0YXUgKipbMzIuNzIlLCA0NS4yOCVdKioNCg0KPC9kaXY+DQoNCg0KIyMgVmlzdWFsaXNhc2kNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCmBgYHtyIGNzM19wcm9wb3J0aW9uX2FuYWx5c2lzfQ0KIyAxLiBNZW5lbnR1a2FuIElucHV0IERhdGENCnRvdGFsX24gPC0gNDAwDQp0b3RhbF9zdWNjZXNzIDwtIDE1Ng0Kc2FtcGxlX3Byb3AgPC0gdG90YWxfc3VjY2VzcyAvIHRvdGFsX24NCg0KIyAyLiBNZW5naGl0dW5nIFN0YW5kYXJkIEVycm9yIHNlY2FyYSBla3NwbGlzaXQNCnN0YW5kYXJkX2Vycm9yX3AgPC0gc3FydCgoc2FtcGxlX3Byb3AgKiAoMSAtIHNhbXBsZV9wcm9wKSkgLyB0b3RhbF9uKQ0KDQojIDMuIE1lbWJ1YXQgVGFiZWwgdW50dWsgYmVyYmFnYWkgVGluZ2thdCBLZXBlcmNheWFhbg0KY2lfbGV2ZWxzIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCnpfc2NvcmVzIDwtIHFub3JtKDEgLSAoMSAtIGNpX2xldmVscykgLyAyKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGFmcmFtZQ0KcHJvcG9ydGlvbl9yZXN1bHRzIDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjaV9sZXZlbHMsDQogIFpfU2NvcmUgPSB6X3Njb3JlcywNCiAgTWFyZ2luX29mX0Vycm9yID0gel9zY29yZXMgKiBzdGFuZGFyZF9lcnJvcl9wDQopDQoNCiMgTWVuZ2hpdHVuZyBCYXRhcyBCYXdhaCBkYW4gQmF0YXMgQXRhcw0KcHJvcG9ydGlvbl9yZXN1bHRzJExvd2VyX0JvdW5kIDwtIHNhbXBsZV9wcm9wIC0gcHJvcG9ydGlvbl9yZXN1bHRzJE1hcmdpbl9vZl9FcnJvcg0KcHJvcG9ydGlvbl9yZXN1bHRzJFVwcGVyX0JvdW5kIDwtIHNhbXBsZV9wcm9wICsgcHJvcG9ydGlvbl9yZXN1bHRzJE1hcmdpbl9vZl9FcnJvcg0KDQojIDQuIE1lbmFtcGlsa2FuIFRhYmVsIEhhc2lsIGRlbmdhbiBmb3JtYXQgcmFwaQ0Ka25pdHI6OmthYmxlKHByb3BvcnRpb25fcmVzdWx0cywgDQogICAgICAgICAgICAgZGlnaXRzID0gNCwgDQogICAgICAgICAgICAgY2FwdGlvbiA9ICJUYWJlbCBQZXJoaXR1bmdhbiBJbnRlcnZhbCBLZXBlcmNheWFhbiBQcm9wb3JzaSAoQ2FzZSBTdHVkeSAzKSIsDQogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiTGV2ZWwgS2VwZXJjYXlhYW4iLCAiWi1TY29yZSIsICJNYXJnaW4gRXJyb3IiLCAiQmF0YXMgQmF3YWgiLCAiQmF0YXMgQXRhcyIpKQ0KDQojIDUuIFZpc3VhbGlzYXNpIE1lbmdndW5ha2FuIGdncGxvdDINCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChwcm9wb3J0aW9uX3Jlc3VsdHMsIGFlcyh4ID0gYXMuZmFjdG9yKENvbmZpZGVuY2VfTGV2ZWwgKiAxMDApLCB5ID0gc2FtcGxlX3Byb3ApKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlcl9Cb3VuZCwgeW1heCA9IFVwcGVyX0JvdW5kLCBjb2xvciA9IGFzLmZhY3RvcihDb25maWRlbmNlX0xldmVsKSksIA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBzaXplID0gMS4yKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkpICsNCiAgbGFicyh0aXRsZSA9ICJWaXN1YWxpc2FzaSBJbnRlcnZhbCBLZXBlcmNheWFhbiBQcm9wb3JzaSBLbGlrIENUQSIsDQogICAgICAgc3VidGl0bGUgPSAiU2VtYWtpbiB0aW5nZ2kga2VwZXJjYXlhYW4sIHJlbnRhbmcgZXN0aW1hc2kgc2VtYWtpbiBsZWJhciIsDQogICAgICAgeCA9ICJUaW5na2F0IEtlcGVyY2F5YWFuICglKSIsDQogICAgICAgeSA9ICJQcm9wb3JzaSBLbGlrICglKSIsDQogICAgICAgY29sb3IgPSAiTGV2ZWwiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCjwvZGl2Pg0KDQojIyBJbnRlcnByZXRhc2kNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCkJlcmRhc2Fya2FuIGFuYWxpc2lzIGRpIGF0YXMsIGtpdGEgbWVtaWxpa2kga2V5YWtpbmFuIDk1JSBiYWh3YSB0aW5na2F0IGtsaWsgKENsaWNrLVRocm91Z2ggUmF0ZSkgeWFuZyBzZWJlbmFybnlhIHVudHVrIHRvbWJvbCBkZXNhaW4gYmFydSBkaSBzZWx1cnVoIHBvcHVsYXNpIHBlbmdndW5hIGJlcmFkYSBkaSByZW50YW5nIDM0LjIyJSBoaW5nZ2EgNDMuNzglLg0KDQpIYXNpbCBpbmkgbWVtYmVyaWthbiBidWt0aSBrdWF0IGJhZ2kgdGltIHByb2R1ayBiYWh3YSBwZXJmb3JtYSB0b21ib2wgYmFydSBpbmkgY3VrdXAgc3RhYmlsLiBOYW11biwgamlrYSB0aW0gcHJvZHVrIG1lbWlsaWtpIHRhcmdldCBtaW5pbWFsIGtsaWsgc2ViZXNhciA0NSUsIG1ha2EgYmVyZGFzYXJrYW4gZGF0YSBpbmksIHRhcmdldCB0ZXJzZWJ1dCBiZWx1bSB0ZXJjYXBhaSBzZWNhcmEgc2lnbmlmaWthbiBrYXJlbmEgYmF0YXMgYXRhcyBpbnRlcnZhbCAoNDMuNzglKSBtYXNpaCBiZXJhZGEgZGkgYmF3YWggdGFyZ2V0IHRlcnNlYnV0LiAgICAgICAgICAgICANCg0KPC9kaXY+DQoNCiMgQ2FzZXMgU3R1ZHkgSVYNCg0KIyMgSWRlbnRpZmlrYXNpIA0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KQmVyZGFzYXJrYW4gZGF0YSB5YW5nIHRlcnNlZGlhIDoNCg0KVGVhbSBBOiBNZW5nZ3VuYWthbiBaLVRlc3QuDQpKdXN0aWZpa2FzaTogU3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICjPgykgZGlrZXRhaHVpICgyNCkgZGFuIHVrdXJhbiBzYW1wZWwgKG49MzYpIG1lbWVudWhpIHN5YXJhdCBzYW1wZWwgYmVzYXIgKG7iiaUzMCkuDQoNClRlYW0gQjogTWVuZ2d1bmFrYW4gVC1UZXN0Lg0KSnVzdGlmaWthc2k6IFN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWksIHNlaGluZ2dhIHRpbSBtZW5nZ3VuYWthbiBzdGFuZGFyIGRldmlhc2kgc2FtcGVsIChzPTI0KS4gTWVza2lwdW4gbj0zNiwgICAgcGVuZ2d1bmFhbiBzIG1lbmdhcmFoa2FuIHBhZGEgZGlzdHJpYnVzaS10IHVudHVrIHByZXNpc2kgeWFuZyBsZWJpaCBrb25zZXJ2YXRpZi4NCg0KKipEYXRhIEtlbG9tcG9rIEEgKFNlcnZlciBMYW1hKToqKg0KDQoqICRuXzEgPSAxNSQNCiogJFxiYXJ7eH1fMSA9IDMuMiQgZGV0aWsNCiogJHNfMSA9IDAuNSQgZGV0aWsNCg0KKipEYXRhIEtlbG9tcG9rIEIgKFNlcnZlciBCYXJ1KToqKg0KDQoqICRuXzIgPSAxMiQNCiogJFxiYXJ7eH1fMiA9IDIuOCQgZGV0aWsNCiogJHNfMiA9IDAuNCQgZGV0aWsNCg0KKipUaW5na2F0IEtlcGVyY2F5YWFuOioqIDk1JSAoJFxhbHBoYSA9IDAuMDUkKS4NCg0KPC9kaXY+DQoNCg0KIyMgUGVueWVsZXNhaWFuIA0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KKipMYW5na2FoIDE6IE1lbmdoaXR1bmcgUG9pbnQgRXN0aW1hdGUgKFNlbGlzaWggTWVhbikqKg0KDQokJFx0ZXh0e1BvaW50IEVzdGltYXRlfSA9IFxiYXJ7eH1fMSAtIFxiYXJ7eH1fMiA9IDMuMiAtIDIuOCA9IDAuNCBcdGV4dHsgZGV0aWt9JCQNCg0KKipMYW5na2FoIDI6IE1lbmdoaXR1bmcgU3RhbmRhcmQgRXJyb3Igb2YgdGhlIERpZmZlcmVuY2UgKCRTRSQgYXRhdSAkU197XGJhcnt4fV8xIC0gXGJhcnt4fV8yfSQpKioNClJ1bXVzIChXZWxjaCdzKToNCg0KJCRTRSA9IFxzcXJ0e1xmcmFje3NfMV4yfXtuXzF9ICsgXGZyYWN7c18yXjJ9e25fMn19JCQNCiQkU0UgPSBcc3FydHtcZnJhY3swLjVeMn17MTV9ICsgXGZyYWN7MC40XjJ9ezEyfX0gPSBcc3FydHtcZnJhY3swLjI1fXsxNX0gKyBcZnJhY3swLjE2fXsxMn19JCQNCiQkU0UgPSBcc3FydHswLjAxNjY3ICsgMC4wMTMzM30gPSBcc3FydHswLjAzMDB9IFxhcHByb3ggMC4xNzMyJCQNCg0KKipMYW5na2FoIDM6IE1lbmVudHVrYW4gRGVncmVlcyBvZiBGcmVlZG9tICgkZGYkKSoqDQoNCk1lbmdndW5ha2FuIHJ1bXVzIGtvbnNlcnZhdGlmICh5YW5nIGxlYmloIHNlZGVyaGFuYS9rZWNpbCBkaSBhbnRhcmEgJG5fMS0xJCBhdGF1ICRuXzItMSQpOg0KJCRkZiA9IFxtaW4oMTUtMSwgMTItMSkgPSAxMSQkDQoNCioqTGFuZ2thaCA0OiBNZW5lbnR1a2FuIE5pbGFpIEtyaXRpcyAkdCQgKCR0X3tcYWxwaGEvMiwgZGZ9JCkqKg0KDQpVbnR1ayA5NSUgQ0kgZGVuZ2FuICRkZiA9IDExJDoNCiQkdF4qIFxhcHByb3ggMi4yMDEkJA0KDQoqKkxhbmdrYWggNTogTWVuZ2hpdHVuZyBNYXJnaW4gb2YgRXJyb3IgKCRFJCkqKg0KDQokJEUgPSB0XiogXHRpbWVzIFNFID0gMi4yMDEgXHRpbWVzIDAuMTczMiBcYXBwcm94IDAuMzgxMiQkDQoNCioqTGFuZ2thaCA2OiBNZW5lbnR1a2FuIEludGVydmFsIEtlcGVyY2F5YWFuKioNCg0KJCQoXGJhcnt4fV8xIC0gXGJhcnt4fV8yKSBccG0gRSA9IDAuNCBccG0gMC4zODEyID0gWzAuMDE4OCwgMC43ODEyXSQkDQoNCjwvZGl2Pg0KDQoNCiMjIFZpc3VhbGlzYXNpDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmM2ZmOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDdiZmY7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KDQpgYGB7ciBjczRfbWVhbl9kaWZmZXJlbmNlfQ0KIyBEZWZpbmlzaSBEYXRhDQpvbGRfbWVhbiA8LSAzLjI7IG9sZF9zZCA8LSAwLjU7IG9sZF9uIDwtIDE1DQpuZXdfbWVhbiA8LSAyLjg7IG5ld19zZCA8LSAwLjQ7IG5ld19uIDwtIDEyDQoNCiMgIFNlbGlzaWggTWVhbg0KbWVhbl9kaWZmIDwtIG9sZF9tZWFuIC0gbmV3X21lYW4NCg0KIyAgTWVuZ2hpdHVuZyBTRSAoV2VsY2gncykNCnNlX2RpZmYgPC0gc3FydCgob2xkX3NkXjIgLyBvbGRfbikgKyAobmV3X3NkXjIgLyBuZXdfbikpDQoNCiMgIE1lbmdoaXR1bmcgRGVncmVlcyBvZiBGcmVlZG9tIChTYXR0ZXJ0aHdhaXRlIGFwcHJveGltYXRpb24pDQpkZl93ZWxjaCA8LSAoKG9sZF9zZF4yL29sZF9uICsgbmV3X3NkXjIvbmV3X24pXjIpIC8gDQogICAgICAgICAgICAoKChvbGRfc2ReMi9vbGRfbileMi8ob2xkX24tMSkpICsgKChuZXdfc2ReMi9uZXdfbileMi8obmV3X24tMSkpKQ0KDQojICBNZW5naGl0dW5nIFQtQ3JpdGljYWwgZGFuIE1hcmdpbiBvZiBFcnJvciAoOTUlKQ0KdF9jcml0XzQgPC0gcXQoMC45NzUsIGRmID0gZGZfd2VsY2gpDQptZV80IDwtIHRfY3JpdF80ICogc2VfZGlmZg0KDQojICBIYXNpbCBBa2hpcg0KbG93ZXJfNCA8LSBtZWFuX2RpZmYgLSBtZV80DQp1cHBlcl80IDwtIG1lYW5fZGlmZiArIG1lXzQNCg0KY2F0KCJTZWxpc2loIE1lYW46IiwgbWVhbl9kaWZmLCAiXG4iKQ0KY2F0KCJNYXJnaW4gb2YgRXJyb3I6IiwgbWVfNCwgIlxuIikNCmNhdCgiOTUlIENJOiBbIiwgbG93ZXJfNCwgIiwiLCB1cHBlcl80LCAiXVxuIikNCg0KIyAgVmlzdWFsaXNhc2kgU2VsaXNpaA0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRhdGEuZnJhbWUoeCA9ICJPbGQgdnMgTmV3IFNlcnZlciIsIHkgPSBtZWFuX2RpZmYpLCBhZXMoeD14LCB5PXkpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDUsIGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsb3dlcl80LCB5bWF4ID0gdXBwZXJfNCksIHdpZHRoID0gMC4yLCBjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkludGVydmFsIEtlcGVyY2F5YWFuIFNlbGlzaWggS2VjZXBhdGFuIFNlcnZlciIsDQogICAgICAgc3VidGl0bGUgPSAiSW50ZXJ2YWwgdGlkYWsgbWVsZXdhdGkgYW5na2EgMCwgbWVudW5qdWtrYW4gcGVyYmVkYWFuIHNpZ25pZmlrYW4iLA0KICAgICAgIHggPSAiIiwgeSA9ICJTZWxpc2loIFdha3R1IE11YXQgKGRldGlrKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KPC9kaXY+DQoNCiMjIEludGVycHJldGFzaQ0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KS2FyZW5hIHJlbnRhbmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gWzAuMDE4OCwgMC43ODEyXSBzZWx1cnVobnlhIGJlcmFkYSBkaSBhdGFzIGFuZ2thIDAsIGtpdGEgZGFwYXQgbWVueWltcHVsa2FuIGRlbmdhbiB0aW5na2F0IGtlcGVyY2F5YWFuIDk1JSBiYWh3YSBTZXJ2ZXIgQmFydSBzZWNhcmEgc2lnbmlmaWthbiBsZWJpaCBjZXBhdCBkYXJpcGFkYSBTZXJ2ZXIgTGFtYS4NCg0KTWVza2lwdW4gc2FtcGVsbnlhIGtlY2lsLCBidWt0aSBzdGF0aXN0aWsgbWVudW5qdWtrYW4gYWRhbnlhIHBlbmdoZW1hdGFuIHdha3R1IG11YXQgbWluaW1hbCAwLjAxOCBkZXRpayBoaW5nZ2EgbWFrc2ltYWwgMC43OCBkZXRpay4gUGVuZ2d1bmFhbiBTZXJ2ZXIgQmFydSBzYW5nYXQgZGlyZWtvbWVuZGFzaWthbiB1bnR1ayBtZW5pbmdrYXRrYW4gcGVuZ2FsYW1hbiBwZW5nZ3VuYS4NCg0KPC9kaXY+DQoNCiMgQ2FzZXMgU3R1ZHkgViANCg0KIyMgSWRlbnRpZmlrYXNpIA0KPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2U3ZjNmZjsgcGFkZGluZzogMTVweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA3YmZmOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7Ij4NCg0KVGlwZSBJbnRlcnZhbCBLZXBlcmNheWFhbjogT25lLXNpZGVkIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGJhdGFzIGJhd2FoIHNhdHUgc2lzaSkuIA0KSGFsIGluaSBrYXJlbmEgbWFuYWplbWVuIGhhbnlhIHRlcnRhcmlrIHVudHVrIG1lbWFzdGlrYW4gYmFod2EgbmlsYWkgcHJvcG9yc2kgc2V0aWRha255YSAoYXQgbGVhc3QpIG1lbmNhcGFpIHRhcmdldCB0ZXJ0ZW50dS4NCg0KVWppIFN0YXRpc3RpazogWi10ZXN0IGZvciBQcm9wb3J0aW9uLg0KS2l0YSBiZXJ1cnVzYW4gZGVuZ2FuIGRhdGEga2F0ZWdvcmkgKHBlbmdndW5hIGFrdGlmIHByZW1pdW0gdnMgYnVrYW4pIGRlbmdhbiB1a3VyYW4gc2FtcGVsIHlhbmcgYmVzYXIgKG49MjUwKSwgc2VoaW5nZ2EgICAgICAgICAgZGlzdHJpYnVzaSBub3JtYWwgZGFwYXQgZGlndW5ha2FuIHVudHVrIG1lbmRla2F0aSBkaXN0cmlidXNpIGJpbm9taWFsLg0KDQpNYW5hamVtZW4gaW5naW4gbWVuZ2V2YWx1YXNpIHBlbHVuY3VyYW4gZml0dXIgcHJlbWl1bSBiYXJ1LiBQZXJ0YW55YWFuIGt1bmNpbnlhIGJ1a2FuIG1lbmNhcmkgcmVudGFuZyBkaSBhbnRhcmEgZHVhIGFuZ2thLCBtZWxhaW5rYW4gbWVtYXN0aWthbiBhcGFrYWggcHJvcG9yc2kgcGVuZ2d1bmEgKipzZXRpZGFrbnlhKiogKG1pbmltYWwpIG1lbmNhcGFpIHRhcmdldCA3MCUuDQoNCiogKipVa3VyYW4gU2FtcGVsICgkbiQpOioqICQyNTAkIHBlbmdndW5hLg0KDQoqICoqSnVtbGFoIFN1a3NlcyAoJHgkKToqKiAkMTg1JCBwZW5nZ3VuYSB5YW5nIG1lbnl1a2FpIGZpdHVyLg0KDQoqICoqVGFyZ2V0IE1hbmFqZW1lbjoqKiAkNzBcJSQgKCQwLjcwJCkuDQoNCiogKipNZXRvZGU6KiogTWVuZ2d1bmFrYW4gKipPbmUtU2lkZWQgTG93ZXIgQ29uZmlkZW5jZSBCb3VuZCoqIChCYXRhcyBCYXdhaCBTYXR1IFNpc2kpLiBLaXRhIG1lbmdndW5ha2FuIGRpc3RyaWJ1c2kgWiBrYXJlbmEgaW5pIGFkYWxhaCBlc3RpbWFzaSBwcm9wb3JzaSBkZW5nYW4gc2FtcGVsIGJlc2FyLg0KDQo8L2Rpdj4NCg0KIyMgUGVueWVsZXNhaWFuDQo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmM2ZmOyBwYWRkaW5nOiAxNXB4OyBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDdiZmY7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsiPg0KDQoqKkxhbmdrYWggMTogTWVuZ2hpdHVuZyBQcm9wb3JzaSBTYW1wZWwgKCRcaGF0e3B9JCkqKg0KDQokJFxoYXR7cH0gPSBcZnJhY3t4fXtufSA9IFxmcmFjezE4NX17MjUwfSA9IDAuNzQkJA0KSGFzaWwgc2FtcGVsIG1lbnVuanVra2FuIHRpbmdrYXQga2VzdWthYW4gc2ViZXNhciA3NCUuDQoNCioqTGFuZ2thaCAyOiBNZW5naGl0dW5nIFN0YW5kYXJkIEVycm9yICgkU0UkKSoqDQoNCiQkU0UgPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEgLSBcaGF0e3B9KX17bn19JCQNCiQkU0UgPSBcc3FydHtcZnJhY3swLjc0IFx0aW1lcyAoMSAtIDAuNzQpfXsyNTB9fSA9IFxzcXJ0e1xmcmFjezAuNzQgXHRpbWVzIDAuMjZ9ezI1MH19ID0gXHNxcnR7MC4wMDA3Njk2fSBcYXBwcm94IDAuMDI3NzQkJA0KDQoqKkxhbmdrYWggMzogTWVuZW50dWthbiBOaWxhaSBaIFNhdHUgU2lzaSAoJHpfe1xhbHBoYX0kKSoqDQoNCkJlcmJlZGEgZGVuZ2FuIGludGVydmFsIGR1YSBzaXNpLCBwYWRhIHNhdHUgc2lzaSBraXRhIG1lbXVzYXRrYW4gc2VsdXJ1aCB0aW5na2F0IGtlc2FsYWhhbiAoJFxhbHBoYSQpIGRpIHNhdHUgdWp1bmcgZGlzdHJpYnVzaToNCiogVW50dWsgKio5MCUgQ29uZmlkZW5jZSoqIChPbmUtc2lkZWQpOiAkeiBcYXBwcm94IDEuMjgyJA0KKiBVbnR1ayAqKjk1JSBDb25maWRlbmNlKiogKE9uZS1zaWRlZCk6ICR6IFxhcHByb3ggMS42NDUkDQoNCioqTGFuZ2thaCA0OiBNZW5naGl0dW5nIExvd2VyIEJvdW5kIChCYXRhcyBCYXdhaCkqKg0KDQpSdW11czogJExvd2VyIEJvdW5kID0gXGhhdHtwfSAtICh6IFx0aW1lcyBTRSkkDQoNCiogKipQYWRhIFRpbmdrYXQgS2VwZXJjYXlhYW4gOTAlOioqDQoNCiAgJCQwLjc0IC0gKDEuMjgyIFx0aW1lcyAwLjAyNzc0KSA9IDAuNzQgLSAwLjAzNTUgPSAwLjcwNDUgXHRleHR7IGF0YXUgfSBcbWF0aGJmezcwLjQ1XCV9JCQNCiAgDQoqICoqUGFkYSBUaW5na2F0IEtlcGVyY2F5YWFuIDk1JToqKg0KDQogICQkMC43NCAtICgxLjY0NSBcdGltZXMgMC4wMjc3NCkgPSAwLjc0IC0gMC4wNDU2ID0gMC42OTQ0IFx0ZXh0eyBhdGF1IH0gXG1hdGhiZns2OS40NFwlfSQkDQoNCjwvZGl2Pg0KDQoNCg0KIyMgVmlzdWFsaXNhc2kNCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCmBgYHtyIGNzNV9vbmVzaWRlZF9hbmFseXNpc30NCiMgMS4gRGVmaW5pc2kgVmFyaWFiZWwNCm5fNSA8LSAyNTANCnhfNSA8LSAxODUNCnBfaGF0XzUgPC0geF81IC8gbl81DQp0YXJnZXRfNSA8LSAwLjcwDQoNCiMgMi4gUGVyaGl0dW5nYW4gU0UNCnNlXzUgPC0gc3FydCgocF9oYXRfNSAqICgxIC0gcF9oYXRfNSkpIC8gbl81KQ0KDQojIDMuIE1lbmdoaXR1bmcgTG93ZXIgQm91bmQgdW50dWsgOTAlIGRhbiA5NSUNCiMgUGVyaGF0aWthbiBwZW5nZ3VuYWFuIHFub3JtKDAuOTApIGRhbiBxbm9ybSgwLjk1KSB1bnR1ayBzYXR1IHNpc2kNCmNvbmZfbGV2ZWxzXzUgPC0gYygwLjkwLCAwLjk1KQ0Kel9vbmVzaWRlZCA8LSBxbm9ybShjb25mX2xldmVsc181KQ0KDQpsb3dlcl9ib3VuZHMgPC0gcF9oYXRfNSAtICh6X29uZXNpZGVkICogc2VfNSkNCg0KIyA0LiBNZW1idWF0IFRhYmVsIEhhc2lsDQpkZl9jczUgPC0gZGF0YS5mcmFtZSgNCiAgQ29uZmlkZW5jZV9MZXZlbCA9IGNvbmZfbGV2ZWxzXzUsDQogIFpfQ3JpdGljYWwgPSB6X29uZXNpZGVkLA0KICBMb3dlcl9Cb3VuZCA9IGxvd2VyX2JvdW5kcywNCiAgVGFyZ2V0X01ldCA9IGxvd2VyX2JvdW5kcyA+PSB0YXJnZXRfNQ0KKQ0KDQprbml0cjo6a2FibGUoZGZfY3M1LCBkaWdpdHMgPSA0LCANCiAgICAgICAgICAgICBjYXB0aW9uID0gIkFuYWxpc2lzIEJhdGFzIEJhd2FoIFNhdHUgU2lzaSAoQ2FzZSBTdHVkeSA1KSIsDQogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiTGV2ZWwgS2VwZXJjYXlhYW4iLCAiWi1Dcml0aWNhbCAoMS1zaWRlKSIsICJCYXRhcyBCYXdhaCAoTEIpIiwgIlRhcmdldCA3MCUgVGVyY2FwYWk/IikpDQoNCiMgNS4gVmlzdWFsaXNhc2kNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChkZl9jczUsIGFlcyh4ID0gYXMuZmFjdG9yKENvbmZpZGVuY2VfTGV2ZWwgKiAxMDApLCB5ID0gTG93ZXJfQm91bmQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBhZXMoZmlsbCA9IFRhcmdldF9NZXQpLCB3aWR0aCA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfNSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMS41LCB5ID0gdGFyZ2V0XzUgKyAwLjAyLCBsYWJlbCA9ICJUYXJnZXQgTWFuYWplbWVuICg3MCUpIiwgY29sb3IgPSAicmVkIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLCBsaW1pdHMgPSBjKDAsIDAuOCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRkFMU0UiID0gIiNmODc2NmQiLCAiVFJVRSIgPSAiIzAwYmEzOCIpKSArDQogIGxhYnModGl0bGUgPSAiRXZhbHVhc2kgVGFyZ2V0IEZpdHVyIFByZW1pdW0gKEJhdGFzIEJhd2FoIDkwJSB2cyA5NSUpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJXYXJuYSBoaWphdSBtZW51bmp1a2thbiBiYXRhcyBiYXdhaCBtYXNpaCBkaSBhdGFzIHRhcmdldCA3MCUiLA0KICAgICAgIHggPSAiVGluZ2thdCBLZXBlcmNheWFhbiAoJSkiLA0KICAgICAgIHkgPSAiQmF0YXMgQmF3YWggRXN0aW1hc2kgKCUpIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KPC9kaXY+DQoNCiMjIEludGVycHJldGFzaSANCjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlN2YzZmY7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwN2JmZjsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNXB4OyI+DQoNCkJlcmRhc2Fya2FuIGhhc2lsIGFuYWxpc2lzIHNhdHUgc2lzaToNCg0KUGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIDkwJSwga2l0YSBiaXNhIG1lbnlhdGFrYW4gYmFod2Egc2VjYXJhIHN0YXRpc3RpayBwcm9wb3JzaSBwZW5nZ3VuYSB5YW5nIG1lbnl1a2FpIGZpdHVyIGFkYWxhaCBzZXRpZGFrbnlhIDcwLjQ1JS4gS2FyZW5hIGFuZ2thIGluaSBkaSBhdGFzIDcwJSwgdGFyZ2V0IGRpYW5nZ2FwIHRlcnBlbnVoaS4NCg0KTmFtdW4sIGppa2EgbWFuYWplbWVuIG1lbnVudHV0IHRpbmdrYXQga2VwYXN0aWFuIGxlYmloIHRpbmdnaSAoOTUlKSwgYmF0YXMgYmF3YWgga2l0YSB0dXJ1biBtZW5qYWRpIDY5LjQ0JS4gU2VjYXJhIGtldGF0LCBraXRhIGdhZ2FsIG1lbnlhdGFrYW4gYmFod2EgdGFyZ2V0IDcwJSB0ZXJjYXBhaSBrYXJlbmEgYmF0YXMgYmF3YWggdGVyc2VidXQgc2VkaWtpdCBkaSBiYXdhaCB0YXJnZXQuDQoNClJla29tZW5kYXNpOiBQZXJ1c2FoYWFuIGJlcmFkYSBkaSBwb3Npc2kgeWFuZyBzYW5nYXQgZGVrYXQgZGVuZ2FuIHRhcmdldC4gRGlzYXJhbmthbiBtZWxha3VrYW4gaXRlcmFzaSBrZWNpbCBwYWRhIGZpdHVyIHVudHVrIG1lbmluZ2thdGthbiBrZXB1YXNhbiBwZW5nZ3VuYSBzZWJlbHVtIHBlbmFyaWthbiBrZXNpbXB1bGFuIGFraGlyLg0KDQo8L2Rpdj4NCg==