
Muhammad Nabil Khairil Anam
Data Science Student
Institut Teknologi Sains Bandung (ITSB)
Studi Kasus 1
Interval Kepercayaan untuk Rata-Rata, \(\sigma\) Diketahui: Sebuah
platform e-commerce ingin memperkirakan
rata-rata jumlah transaksi harian per pengguna setelah
meluncurkan fitur baru. Berdasarkan data historis skala besar,
simpangan baku populasi diketahui.
\[
\begin{eqnarray*}
\sigma &=& 3.2 \quad \text{(simpangan baku populasi)} \\
n &=& 100 \quad \text{(ukuran sampel)} \\
\bar{x} &=& 12.6 \quad \text{(rata-rata sampel)}
\end{eqnarray*}
\]
Tugas:
- Identifikasi uji statistik yang tepat dan jelaskan
pilihan Anda.
- Hitung Interval Kepercayaan untuk:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Buat visualisasi perbandingan dari ketiga Interval
kepercayaan tersebut.
- Interpretasikan hasil dalam konteks analitik bisnis.
Jawab:
Uji Statistik yang
Tepat
Diketahui:
- Simpangan baku populasi \((\sigma)\) diketahui
- Ukuran sampel \((n)\) cukup besar
\((n = 100)\)
- Ingin membuat selang kepercayaan untuk rata-rata populasi
Maka digunakan Uji \(Z\) untuk
rata-rata dengan distribusi normal standar, bukan distribusi \(T\).
Rumus Interval kepercayaan:
\[\bar{x} \pm z_{\alpha/2} \cdot
\frac{\sigma}{\sqrt{n}}\]
Menghitung Interval
Kepercayaan
Diketahui:
\(\sigma = 3.2,\quad n = 100,\quad \bar{x}
= 12.6\)
\(\frac{\sigma}{\sqrt{n}} =
\frac{3.2}{\sqrt{100}} = \frac{3.2}{10} = 0.32\)
Interval
Kepercayaan 90%
\(z_{0.05} = 1.645\)
\[ME = 1.645 \times 0.32 =
0.5264\]
\((12.6 - 0.5264, \ 12.6 + 0.5264) =
(12.0736, \ 13.1264)\)
Interval
Kepercayaan 95%
\(z_{0.025} = 1.96\)
\[ME = 1.96 \times 0.32 =
0.6272\]
\((12.6 - 0.6272, \ 12.6 + 0.6272) =
(11.9728, \ 13.2272)\)
Interval
Kepercayaan 99%
\(z_{0.005} = 2.576\)
\[ME = 2.576 \times 0.32 =
0.82432\]
\((12.6 - 0.82432, \ 12.6 + 0.82432) =
(11.77568, \ 13.42432)\)
Visualisasi
Perbandingan Interval Kepercayaan
Tabel Interval Kepercayaan untuk Rata-rata Transaksi Harian
|
Tingkat_Kepercayaan
|
Z.Score
|
Margin_Error
|
Batas_Bawah
|
Batas_Atas
|
Interval_Kepercayaan
|
|
90%
|
1.645
|
0.5264
|
12.0736
|
13.1264
|
[12.07, 13.13]
|
|
95%
|
1.960
|
0.6272
|
11.9728
|
13.2272
|
[11.97, 13.23]
|
|
99%
|
2.576
|
0.8243
|
11.7757
|
13.4243
|
[11.78, 13.42]
|
Intinya, semakin tinggi tingkat kepercayaannya maka semakin lebar
pula intervalnya karena kita ingin lebih yakin menangkap rata-rata
populasi.
Interpretasi dalam
Konteks Analitik Bisnis
Interpretasi:
- Dengan 90% kepercayaan, rata-rata transaksi harian per pengguna
setelah fitur baru adalah antara 12.07 hingga 13.13 transaksi.
- Dengan 95% kepercayaan, rentangnya 11.97 hingga 13.23
transaksi.
- Dengan 99% kepercayaan, rentangnya 11.78 hingga 13.42
transaksi.
Implikasi bisnis:
Platform dapat yakin bahwa rata-rata transaksi harian per
pengguna setelah fitur baru sekitar 12.6, dengan kemungkinan fluktuasi
sekitar ±0.5 hingga ±0.8 tergantung tingkat keyakinan yang
dipilih.
Karena semua selang kepercayaan berada di atas 11.7, ini
menunjukkan bahwa fitur baru kemungkinan tidak menurunkan jumlah
transaksi rata-rata.
Rekomendasi:
Jika ingin laporan internal yang lebih tepat dengan risiko
kesalahan 10%, gunakan selang 90%.
Jika untuk publikasi atau keputusan strategis, gunakan selang 95%
atau 99% untuk lebih aman.
Perlu diingat bahwa ini adalah rata-rata per pengguna, bukan
total transaksi platform.
Studi Kasus 2
Interval Kepercayaan untuk Rata-Rata, \(\sigma\) Tidak Diketahui: Sebuah
tim Penelitian UX menganalisis waktu
penyelesaian tugas (dalam menit) untuk aplikasi seluler baru.
Data dikumpulkan dari 12 pengguna:
\[
8.4,\; 7.9,\; 9.1,\; 8.7,\; 8.2,\; 9.0,\;
7.8,\; 8.5,\; 8.9,\; 8.1,\; 8.6,\; 8.3
\] Tugas:
- Identifikasi uji statistik yang tepat dan jelaskan alasannya.
- Hitung Interval Kepercayaan untuk:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Visualisasikan ketiga interval tersebut dalam satu plot.
- Jelaskan bagaimana ukuran sampel dan tingkat kepercayaan memengaruhi
lebar interval.
Jawab:
Uji Statistik yang
Tepat
Diketahui:
- σ (simpangan baku populasi) tidak diketahui
- Ukuran sampel kecil (n=12)
- Estimasi menggunakan simpangan baku sampel (s)
Maka, Distribusi t lebih akurat untuk sampel kecil karena memiliki
ekor lebih lebar, menyesuaikan ketidakpastian estimasi σ.
Menghitung Interval
Kepercayaan
Diketahui:
\[CI = \bar{x} \pm t_{\alpha/2, df} \times
\frac{s}{\sqrt{n}}\]
\[df = n-1 = 11,\quad \bar{x} =
8.475,\quad s = 0.409,\quad SE = 0.118\]
Interval
Kepercayaan 90%
\(t_{0.05,11} = 1.796\)
\[ME = 1.796 \times 0.118 =
0.212\]
\[CI = 8.475 \pm 0.212 = [8.263,\;
8.687]\]
Interval
Kepercayaan 95%
\(t_{0.025,11} = 2.201\)
\[ME = 2.201 \times 0.118 =
0.260\]
\[CI = 8.475 \pm 0.260 = [8.215,\;
8.735]\]
Interval
Kepercayaan 99%
\(t_{0.005,11} = 3.106\)
\[ME = 3.106 \times 0.118 =
0.366\]
\[CI = 8.475 \pm 0.366 = [8.109,\;
8.841]\]
Visualisasi Ketiga
Interval dalam Satu Plot

Dari plot terlihat bahwa semakin tinggi tingkat kepercayaan (90% →
95% → 99%), interval menjadi semakin lebar. CI 99% memiliki rentang
terluas (8.109-8.841 menit), menunjukkan bahwa untuk mencapai kepastian
99% bahwa rata-rata populasi berada dalam interval, kita perlu menerima
estimasi yang kurang presisi. Sebaliknya, CI 90% lebih sempit
(8.263-8.687 menit) memberikan estimasi lebih presisi tetapi dengan
keyakinan lebih rendah. Dalam penelitian UX, CI 95% sering menjadi
pilihan optimal sebagai trade-off antara presisi dan tingkat
kepercayaan.
Pengaruh Ukuran
Sampel dan Tingkat Kepercayaan terhadap Lebar Interval
- Tingkat kepercayaan ↑ → Lebar interval ↑
Semakin tinggi keyakinan yang diinginkan, interval harus semakin
lebar untuk menangkap parameter populasi.
- Ukuran sampel ↑ → Lebar interval ↓
Semakin besar sampel, estimasi semakin presisi sehingga interval
semakin sempit (karena standar error menurun).
Hubungan: Untuk mendapatkan interval yang sempit
dengan tingkat kepercayaan tinggi, diperlukan sampel yang besar. Pada
sampel kecil (seperti n=12 ini), interval akan relatif lebar terutama
pada CI 95% dan 99%.
Studi Kasus 3
Interval Kepercayaan untuk Proporsi, Pengujian A/B:
Sebuah tim ilmu data menjalankan pengujian A/B pada
desain tombol Call-To-Action (CTA) baru. Eksperimen
menghasilkan:
\[
\begin{eqnarray*}
n &=& 400 \quad \text{(total pengguna)} \\
x &=& 156 \quad \text{(pengguna yang mengklik CTA)}
\end{eqnarray*}
\]
Tugas:
- Hitung proporsi sampel \(\hat{p}\).
- Hitung Interval Kepercayaan untuk proporsi pada:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Visualisasikan dan bandingkan ketiga Interval tersebut.
- Jelaskan bagaimana tingkat kepercayaan memengaruhi pengambilan
keputusan dalam eksperimen produk.
Jawab:
Hitung Proporsi
Sampel \(\hat{p}\)
\[\hat{p} = \frac{x}{n} = \frac{156}{400}
= 0.39\]
Jadi, proporsi sampel pengguna yang mengklik CTA adalah 0.39 atau
39%.
Hitung Interval
Kepercayaan untuk Proporsi
Rumus interval kepercayaan proporsi:
\[CI = \hat{p} \pm z_{\alpha/2} \times
\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
di mana:
- \(\hat{p} = 0.39\)
- \(n = 400\)
- \(z_{\alpha/2} adalah nilai z
kritis\)
Interval
Kepercayaan 90%
\(z_{0.05} = 1.645\)
\[SE = \sqrt{\frac{0.39 \times 0.61}{400}}
= \sqrt{\frac{0.2379}{400}} = \sqrt{0.00059475} \approx
0.02439\]
\[ME = 1.645 \times 0.02439 \approx
0.04012\]
$$CI = 0.39 = [0.3499,; 0.4301]
≈ [0.350, 0.430]$$
Interval
Kepercayaan 95%
\(z_{0.025} = 1.96\)
\[ME = 1.96 \times 0.02439 \approx
0.04780\]
$$CI = 0.39 = [0.3422,; 0.4378]
≈ [0.342, 0.438]$$
Interval
Kepercayaan 99%
\(z_{0.005} = 2.576\)
\[ME = 2.576 \times 0.02439 \approx
0.06283\]
$$CI = 0.39 = [0.3272,; 0.4528]
≈ [0.327, 0.453]$$
Ringkasan hasil:
- 90% CI: [0.350, 0.430]
- 95% CI: [0.342, 0.438]
- 99% CI: [0.327, 0.453]
Visualisasi
Perbandingan Ketiga Interval

Interpretasi Visual:
- Semakin tinggi tingkat kepercayaan, interval semakin lebar (99% >
95% > 90%)
- Semua interval mencakup proporsi sampel 0.39 di tengahnya
- CI 90% paling sempit memberikan estimasi paling presisi
- Rentang CI 99% menunjukkan kita 99% yakin proporsi klik sebenarnya
di populasi antara 32.7% sampai 45.3%
Pengaruh Tingkat
Kepercayaan terhadap Pengambilan Keputusan dalam Eksperimen Produk
1. Tingkat Kepercayaan sebagai Ukuran Keyakinan:
Semakin tinggi CI (misal 99%), semakin yakin kita bahwa parameter
populasi sesungguhnya berada dalam interval, tetapi interval menjadi
lebih lebar → lebih konservatif dalam klaim.
2. Trade-off dalam Pengambilan Keputusan:
CI 90%: Interval sempit → klaim lebih berani, tetapi risiko
kesalahan lebih tinggi (10% kemungkinan salah). Cocok untuk eksplorasi
cepat atau perubahan minor.
CI 95%: Standard dalam industri → keseimbangan antara keyakinan
dan presisi. Digunakan untuk keputusan dengan dampak menengah.
CI 99%: Interval lebar → sangat hati-hati, hanya menyimpulkan
jika efek sangat jelas. Cocok untuk perubahan besar dengan risiko
tinggi.
3. Implikasi pada A/B Testing:
Jika target konversi sebelumnya 35%, maka:
Dengan CI 95% [0.342, 0.438], kita tidak bisa yakin desain baru
lebih baik (karena 35% masih dalam interval).
Perlu eksperimen lanjutan atau sampel lebih besar untuk
mempersempit interval.
4. Rekomendasi:
Gunakan 95% CI sebagai standar untuk keputusan produk
sehari-hari.
Naikkan ke 99% CI jika konsekuensi kesalahan mahal (misal: fitur
bayaran).
Turunkan ke 90% CI hanya untuk eksplorasi atau validasi hipotesis
awal.
Studi Kasus 4
Perbandingan Presisi (Uji-Z vs Uji-t): Dua tim data
mengukur laten API (dalam milidetik) dalam kondisi yang
berbeda.
\[\begin{eqnarray*}
\text{Tim A:} \\
n &=& 36 \quad \text{(ukuran sampel)} \\
\bar{x} &=& 210 \quad \text{(rata-rata sampel)} \\
\sigma &=& 24 \quad \text{(simpangan baku populasi yang
diketahui)} \\[6pt]
\text{Tim B:} \\
n &=& 36 \quad \text{(ukuran sampel)} \\
\bar{x} &=& 210 \quad \text{(rata-rata sampel)} \\
s &=& 24 \quad \text{(simpangan baku sampel)}
\end{eqnarray*}\]
Tugas
- Identifikasi uji statistik yang digunakan oleh masing-masing
tim.
- Hitung Interval Kepercayaan untuk 90%, 95%, dan
99%.
- Buat visualisasi yang membandingkan semua Interval.
- Jelaskan mengapa lebar interval berbeda, meskipun
data serupa.
Uji Statistik
Masing-masing Tim
Tim A:
- Menggunakan Uji-Z (Distribusi Normal)
- Alasan: Simpangan baku populasi \((σ =
24)\) diketahui
- Rumus: \[CI = \bar{x} \pm z_{\alpha/2}
\times \frac{\sigma}{\sqrt{n}}\]
Tim B:
- Menggunakan Uji-t (Distribusi t-Student)
- Alasan: Simpangan baku populasi tidak diketahui, menggunakan
simpangan baku sampel \((s = 24)\)
- Rumus: \[CI = \bar{x} \pm t_{\alpha/2,
df} \times \frac{s}{\sqrt{n}} dengan df = n-1 = 35\]
Menghitung interval
Kepercayaan
Diketahui:
\[n = 36,\quad \bar{x} = 210,\quad \sigma
= 24,\quad s = 24,\quad SE = \frac{24}{\sqrt{36}} = \frac{24}{6} =
4\]
TIM A (Uji-Z)
\(z_{0.05} = 1.645\)
\[ME = 1.645 \times 4 = 6.58\]
\[CI = 210 \pm 6.58 = [203.42,\;
216.58]\]
\(z_{0.025} = 1.96\)
\[ME = 1.96 \times 4 = 7.84\]
\[CI = 210 \pm 7.84 = [202.16,\;
217.84]\]
\(z_{0.005} = 2.576\)
\[ME = 2.576 \times 4 =
10.304\]
\[CI = 210 \pm 10.304 = [199.696,\;
220.304]\]
TIM B (Uji-t, df =
35)
\(t_{0.05,35} \approx 1.690\)
\[ME = 1.690 \times 4 = 6.76\]
\[CI = 210 \pm 6.76 = [203.24,\;
216.76]\]
\(t_{0.025,35} \approx 2.030\)
\[ME = 2.030 \times 4 = 8.12\]
\[CI = 210 \pm 8.12 = [201.88,\;
218.12]\]
\(t_{0.005,35} \approx 2.724\)
\[ME = 2.724 \times 4 =
10.896\]
\[CI = 210 \pm 10.896 = [199.104,\;
220.896]\]
Ringkasan
Tim A (Z):
CI 90% [203.42, 216.58], CI 95% [202.16, 217.84], CI 99% [199.70,
220.30]
Tim B (t):
CI 90% [203.24, 216.76], CI 95% [201.88, 218.12], CI 99% [199.10,
220.90]
Visualisasi
Perbandingan Interval

Interpretasi Visual:
Untuk setiap tingkat kepercayaan, interval Uji-t lebih lebar
daripada Uji-Z
Perbedaan lebar semakin terlihat pada CI 95% dan 99%
Semua interval berpusat di sekitar rata-rata 210 ms
Distribusi t memberikan estimasi yang lebih konservatif (interval
lebih lebar) karena mengakui ketidakpastian tambahan dari estimasi
σ
Mengapa Lebar
Interval Berbeda Meskipun Data Serupa
- Sumber Perbedaan:
- Tim A mengetahui σ populasi → menggunakan distribusi normal (Z)
- Tim B tidak mengetahui σ → menggunakan distribusi t-Student
- Distribusi t lebih konservatif:
Distribusi t memiliki ekor lebih tebal daripada distribusi normal,
sehingga nilai kritis \(t_{\alpha/2} >
z_{\alpha/2}\) untuk derajat kebebasan terbatas.
3 Efek pada CI:
- \(t_{0.025,35} \approx 2.030 >
z_{0.025} = 1.96\)
- \(0.005,35} \approx 2.724 > z_{0.005} =
2.576\) *Semakin tinggi tingkat kepercayaan, perbedaan semakin
jelas.
- Alasan filosofis:
Uji-t mengakui ketidakpastian tambahan karena σ diestimasi dari
sampel, sehingga interval dibuat lebih lebar untuk kompensasi.
- Konvergensi:
Untuk n besar (biasanya > 30), distribusi t ≈ normal. Namun dengan
n=36, perbedaan masih terlihat, terutama pada CI 99%.
Kesimpulan:
Perbedaan lebar interval berasal dari ketidakpastian tambahan dalam
estimasi σ pada uji-t, yang direpresentasikan melalui distribusi dengan
ekor lebih tebal.
Studi Kasus 5
interval Kepercayaan Satu Sisi: Sebuah perusahaan
Software as a Service (SaaS) ingin memastikan bahwa
minimal 70% pengguna aktif mingguan memanfaatkan fitur
premium.
Dari eksperimen:
\[
\begin{eqnarray*}
n &=& 250 \quad \text{(total pengguna)} \\
x &=& 185 \quad \text{(pengguna premium aktif)}
\end{eqnarray*}
\]
Manajemen hanya tertarik pada batas bawah dari
perkiraan.
Tugas:
- Identifikasi Jenis Interval Kepercayaan dan uji
yang tepat.
- Hitung Interval Kepercayaan satu sisi (batas bawah)
untuk:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Visualisasikan batas bawah untuk semua tingkat kepercayaan.
- Tentukan apakah target 70% terpenuhi secara
statistik.
Jawab:
Jenis Interval
Kepercayaan dan Uji Statistik
Jenis Interval: Interval kepercayaan satu sisi (one-sided)
khususnya batas bawah (lower bound)
Alasan: Manajemen hanya ingin mengetahui nilai minimal proporsi
pengguna yang memanfaatkan fitur premium
Uji Statistik: Uji-Z untuk proporsi karena sampel besar (n=250)
dan mengestimasi proporsi populasi
Rumus umum:
\[\hat{p} - z_{\alpha} \times SE (hanya
batas bawah)\]
Menghitung Interval
Kepercayaan Satu Sisi (Batas Bawah)
Diketahui:
\[n = 250,\quad x = 185,\quad \hat{p} =
\frac{185}{250} = 0.74\]
\[SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}
= \sqrt{\frac{0.74 \times 0.26}{250}} = \sqrt{\frac{0.1924}{250}} =
\sqrt{0.0007696} \approx 0.02774\]
Batas bawah
90%
\(z_{0.10} = 1.282\) \[LB = 0.74 - 1.282 \times 0.02774 = 0.74 - 0.03556
= 0.70444
≈ 0.704\]
Batas bawah
95%
\(z_{0.05} = 1.645\) \[LB = 0.74 - 1.645 \times 0.02774 = 0.74 - 0.04563
= 0.69437
≈ 0.694\]
Batas bawah
99%
\(z_{0.01} = 2.326\) \[LB = 0.74 - 2.326 \times 0.02774 = 0.74 - 0.06453
= 0.67547
≈ 0.675\]
Ringkasan:
- 90% LB: 0.704 (kita 90% yakin proporsi sebenarnya ≥ 70.4%)
- 95% LB: 0.694 (kita 95% yakin proporsi sebenarnya ≥ 69.4%)
- 99% LB: 0.675 (kita 99% yakin proporsi sebenarnya ≥ 67.5%)
Visualisasi Batas
Bawah Untuk Semua Tingkat Kepercayaan

Interpretasi Visual:
Setiap garis hijau menunjukkan area nilai yang mungkin untuk
proporsi sebenarnya (dari batas bawah sampai 1)
Batas bawah 90% (0.704) di atas target 70% → area hijau tebal
menunjukkan kepastian ≥70%
Batas bawah 95% (0.694) dan 99% (0.675) berada di bawah atau di
sekitar target → keyakinan lebih rendah
Semakin tinggi tingkat kepercayaan, batas bawah semakin rendah
(lebih konservatif)
Menentukan Apakah
Target 70% Terpenuhi Secara Statistik
- Tentukan Apakah Target 70% Terpenuhi Secara Statistik
Analisis per tingkat kepercayaan:
- Pada CI 90%:
- Batas bawah = 0.704 > 0.70
- ✅ Target terpenuhi – kita 90% yakin proporsi sebenarnya ≥
70.4%
- Pada CI 95%:
- Batas bawah = 0.694 < 0.70
- ❌ Target tidak terpenuhi – dengan keyakinan 95%, proporsi
sebenarnya bisa serendah 69.4%
- Pada CI 99%:
- Batas bawah = 0.675 < 0.70
- ❌ Target tidak terpenuhi – dengan keyakinan 99%, proporsi
sebenarnya bisa serendah 67.5%
Kesimpulan praktis:
- Jika perusahaan bersedia menerima risiko 10% (CI 90%), target
tercapai.
- Jika menggunakan standar industri CI 95%, target belum
tercapai.
- Untuk kepastian tinggi (CI 99%), masih perlu peningkatan fitur
premium.
Rekomendasi:
Dengan proporsi sampel 74%, perusahaan sebaiknya:
- Tambahkan sampel untuk memperkecil standar error
- Tingkatkan kualitas fitur premium agar lebih menarik
- Pertimbangkan toleransi risiko – jika risiko 10% dapat diterima,
klaim target terpenuhi
Kesimpulan dan
Referensi
Interval kepercayaan merupakan cerminan trade-off antara presisi dan
keyakinan—semakin tinggi tingkat kepercayaan, interval semakin lebar
namun keyakinan semakin besar. Sampel kecil atau ketidakpastian
parameter (seperti σ tidak diketahui) melebarkan interval, sementara
sampel besar mempersempitnya. Dalam pengambilan keputusan produk
(seperti A/B testing), CI 95% umum digunakan sebagai standar, tetapi
pilihan tingkat kepercayaan harus disesuaikan dengan risiko bisnis: CI
99% untuk perubahan berisiko tinggi, CI 90% untuk eksplorasi cepat.
Casella, G., & Berger, R. L. (2021). Statistical Inference
(2nd ed.). Cengage Learning. (Bab 7–10: Estimation and Confidence
Intervals)
Moore, D. S., McCabe, G. P., & Craig, B. A. (2021).
Introduction to the Practice of Statistics (10th ed.). W.H. Freeman.
(Bab 6–8: Introduction to Inference, Inference for Proportions)
Wasserman, L. (2013). All of Statistics: A Concise Course in
Statistical Inference. Springer. (Chapter 7: Confidence Intervals,
Chapter 9: Hypothesis Testing)
Kohavi, R., Tang, D., & Xu, Y. (2020). Trustworthy Online
Controlled Experiments: A Practical Guide to A/B Testing. Cambridge
University Press. (Chapter 3: Confidence Intervals in
Experimentation)
Wickham, H., & Grolemund, G. (2017). R for Data Science.
O’Reilly Media. (Chapter 15: Confidence Intervals with broom
package)
Kabacoff, R. I. (2022). R in Action: Data Analysis and Graphics
with R and Tidyverse (3rd ed.). Manning Publications. (Chapter 7: Basic
Statistics, Section 7.3: Confidence Intervals)
Ries, E. (2011). The Lean Startup: How Today’s Entrepreneurs Use
Continuous Innovation to Create Radically Successful Businesses. Crown
Business. (Bab 8: Measure – menggunakan metrik dan interval kepercayaan
untuk validasi)
Siroker, D., & Koomen, P. (2013). A/B Testing: The Most
Powerful Way to Turn Clicks Into Customers. Wiley. (Chapter 5:
Statistical Significance and Confidence Intervals)
https://rpubs.com/dsciencelabs/1381014
LS0tDQp0aXRsZTogIkNvbmZpZGVuY2UgSW50ZXJ2YWwgfiBXZWVrIDEzIg0KYXV0aG9yOiAiTXVoYW1tYWQgTmFiaWwgS2hhaXJpbCBBbmFtIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIiAgIyBBdXRvIGRpc3BsYXlzIGN1cnJlbnQgZGF0ZQ0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBjc3M6ICJjdXN0b20uY3NzIiAgICAgICAgICAgICAgICAgICAgICMgPC0tLSBQQU5HR0lMIEZJTEUgQ1NTIERJIFNJTkkNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgICAgICAgICAgIyBFbWJlZCBhbGwgcmVzb3VyY2VzDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICMgU2hvdyBpbWFnZSB0aHVtYm5haWxzDQogICAgbGlnaHRib3g6IHRydWUgICAgICAgICAgICAgICAgICAgICAgICMgRW5hYmxlIGNsaWNrLXRvLXpvb20gaW1hZ2VzDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICMgR3JvdXAgaW1hZ2VzIGludG8gZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAgICAgICAgICAjIE51bWJlciBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgICAgICAgICAgIyBTYXZlIEpTL0NTUyBsaWJyYXJpZXMNCiAgICBkZl9wcmludDogInBhZ2VkIiAgICAgICAgICAgICAgICAgICAgIyBQYWdlZCBkYXRhIGZyYW1lcw0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICAgICAgICAgICAjIEV4cGFuZGFibGUgY29kZSBibG9ja3MNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICAgICAgICAgICAgIyBBZGQgYnV0dG9uIHRvIGRvd25sb2FkIFIgY29kZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkgIyBUYW1iYWhrYW4gbWVzc2FnZS93YXJuaW5nPUZBTFNFDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocm1kZm9ybWF0cykgIyBPcHRpb25hbCwgamlrYSBpbmdpbiBtZW1hc3Rpa2FuIHBhY2thZ2UgdGVybG9hZA0KDQpgYGANCg0KLS0tDQoNCjxkaXYgY2xhc3M9InByb2ZpbGUtY29udGFpbmVyIj4NCiAgDQogIDxpbWcgDQogICAgc3JjPSJDOi9Vc2Vycy9JeWFuL0Rvd25sb2Fkcy9Qcm9iYWJpbGl0eSBEaXN0cmlidXRpb24gd2VlayAxMS9NeUZvdG8uanBnLmpwZyIgDQogICAgYWx0PSJQcm9maWxlIFBpY3R1cmUiIA0KICAgIGNsYXNzPSJwcm9maWxlLXBpYy1uZXciIA0KICAgIHN0eWxlPSINCiAgICAgIHdpZHRoOiAxODBweCAhaW1wb3J0YW50OyANCiAgICAgIGhlaWdodDogMTgwcHggIWltcG9ydGFudDsgDQogICAgICBib3JkZXItcmFkaXVzOiA1MCUgIWltcG9ydGFudDsgDQogICAgICBib3JkZXI6IDRweCBzb2xpZCAjMzQ5OGRiICFpbXBvcnRhbnQ7IA0KICAgICAgYm94LXNoYWRvdzogMCAwIDE1cHggcmdiYSg1MiwgMTUyLCAyMTksIDAuNykgIWltcG9ydGFudDsNCiAgICAgIG9iamVjdC1maXQ6IGNvdmVyOw0KICAgICAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KICAgICINCiAgLz4NCg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLW5hbWUiPk11aGFtbWFkIE5hYmlsIEtoYWlyaWwgQW5hbTwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLXByb2RpIj5EYXRhIFNjaWVuY2UgU3R1ZGVudDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJwcm9maWxlLWluc3RhbnNpIj5JbnN0aXR1dCBUZWtub2xvZ2kgU2FpbnMgQmFuZHVuZyAoSVRTQik8L2Rpdj4NCiAgDQogIDxicj4gPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCi0tLQ0KDQojIFN0dWRpIEthc3VzIDENCg0KKipJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBSYXRhLVJhdGEsICRcc2lnbWEkIERpa2V0YWh1aToqKiBTZWJ1YWggKipwbGF0Zm9ybSBlLWNvbW1lcmNlKiogaW5naW4gbWVtcGVya2lyYWthbiAqKnJhdGEtcmF0YSBqdW1sYWggdHJhbnNha3NpIGhhcmlhbiBwZXIgcGVuZ2d1bmEqKiBzZXRlbGFoIG1lbHVuY3Vya2FuIGZpdHVyIGJhcnUuIEJlcmRhc2Fya2FuIGRhdGEgaGlzdG9yaXMgc2thbGEgYmVzYXIsICoqc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kqKiBkaWtldGFodWkuDQoNCiQkDQpcYmVnaW57ZXFuYXJyYXkqfQ0KXHNpZ21hICY9JiAzLjIgXHF1YWQgXHRleHR7KHNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpKX0gXFwNCm4gJj0mIDEwMCBccXVhZCBcdGV4dHsodWt1cmFuIHNhbXBlbCl9IFxcDQpcYmFye3h9ICY9JiAxMi42IFxxdWFkIFx0ZXh0eyhyYXRhLXJhdGEgc2FtcGVsKX0NClxlbmR7ZXFuYXJyYXkqfQ0KJCQNCg0KKipUdWdhczoqKg0KDQoxLiAgSWRlbnRpZmlrYXNpICoqdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0KiogZGFuIGplbGFza2FuIHBpbGloYW4gQW5kYS4NCjIuICBIaXR1bmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWs6DQogICAgLSAkOTBcJSQNCiAgICAtICQ5NVwlJA0KICAgIC0gJDk5XCUkDQozLiAgQnVhdCAqKnZpc3VhbGlzYXNpIHBlcmJhbmRpbmdhbioqIGRhcmkga2V0aWdhIEludGVydmFsIGtlcGVyY2F5YWFuIHRlcnNlYnV0Lg0KNC4gIEludGVycHJldGFzaWthbiBoYXNpbCBkYWxhbSBrb250ZWtzIGFuYWxpdGlrIGJpc25pcy4NCg0KKipKYXdhYjoqKg0KDQojIyBVamkgU3RhdGlzdGlrIHlhbmcgVGVwYXQNCg0KKipEaWtldGFodWk6KioNCg0KKiBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSAkKFxzaWdtYSkkIGRpa2V0YWh1aQ0KKiBVa3VyYW4gc2FtcGVsICQobikkIGN1a3VwIGJlc2FyICQobiA9IDEwMCkkDQoqIEluZ2luIG1lbWJ1YXQgc2VsYW5nIGtlcGVyY2F5YWFuIHVudHVrIHJhdGEtcmF0YSBwb3B1bGFzaQ0KDQpNYWthIGRpZ3VuYWthbiBVamkgJFokIHVudHVrIHJhdGEtcmF0YSBkZW5nYW4gZGlzdHJpYnVzaSBub3JtYWwgc3RhbmRhciwgYnVrYW4gZGlzdHJpYnVzaSAkVCQuDQoNCioqUnVtdXMgSW50ZXJ2YWwga2VwZXJjYXlhYW46KioNCg0KJCRcYmFye3h9IFxwbSB6X3tcYWxwaGEvMn0gXGNkb3QgXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KDQojIyBNZW5naGl0dW5nIEludGVydmFsIEtlcGVyY2F5YWFuDQoNCioqRGlrZXRhaHVpOioqDQoNCiRcc2lnbWEgPSAzLjIsXHF1YWQgbiA9IDEwMCxccXVhZCBcYmFye3h9ID0gMTIuNiQNCg0KJFxmcmFje1xzaWdtYX17XHNxcnR7bn19ID0gXGZyYWN7My4yfXtcc3FydHsxMDB9fSA9IFxmcmFjezMuMn17MTB9ID0gMC4zMiQNCg0KIyMjIEludGVydmFsIEtlcGVyY2F5YWFuIDkwJQ0KDQokel97MC4wNX0gPSAxLjY0NSQgDQoNCiQkTUUgPSAxLjY0NSBcdGltZXMgMC4zMiA9IDAuNTI2NCQkDQoNCiQoMTIuNiAtIDAuNTI2NCwgXCAxMi42ICsgMC41MjY0KSA9ICgxMi4wNzM2LCBcIDEzLjEyNjQpJA0KDQojIyMgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gOTUlDQoNCiR6X3swLjAyNX0gPSAxLjk2JCANCg0KJCRNRSA9IDEuOTYgXHRpbWVzIDAuMzIgPSAwLjYyNzIkJA0KDQokKDEyLjYgLSAwLjYyNzIsIFwgMTIuNiArIDAuNjI3MikgPSAoMTEuOTcyOCwgXCAxMy4yMjcyKSQNCg0KIyMjIEludGVydmFsIEtlcGVyY2F5YWFuIDk5JQ0KDQokel97MC4wMDV9ID0gMi41NzYkIA0KDQokJE1FID0gMi41NzYgXHRpbWVzIDAuMzIgPSAwLjgyNDMyJCQNCg0KJCgxMi42IC0gMC44MjQzMiwgXCAxMi42ICsgMC44MjQzMikgPSAoMTEuNzc1NjgsIFwgMTMuNDI0MzIpJA0KDQojIyBWaXN1YWxpc2FzaSBQZXJiYW5kaW5nYW4gSW50ZXJ2YWwgS2VwZXJjYXlhYW4NCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIExvYWQgbGlicmFyeSB1bnR1ayB0YWJlbCByYXBpDQppZiAoIXJlcXVpcmUoa2FibGVFeHRyYSkpIGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIERhdGEgaW5wdXQNCnNpZ21hIDwtIDMuMg0KbiA8LSAxMDANCnhfYmFyIDwtIDEyLjYNCnNlIDwtIHNpZ21hIC8gc3FydChuKSAgIyBTdGFuZGFyZCBlcnJvciA9IDAuMzINCg0KIyBIaXR1bmcgc2VsYW5nIGtlcGVyY2F5YWFuDQp6XzkwIDwtIDEuNjQ1DQp6Xzk1IDwtIDEuOTYNCnpfOTkgPC0gMi41NzYNCg0KbWFyZ2luX2Vycm9yXzkwIDwtIHpfOTAgKiBzZQ0KbWFyZ2luX2Vycm9yXzk1IDwtIHpfOTUgKiBzZQ0KbWFyZ2luX2Vycm9yXzk5IDwtIHpfOTkgKiBzZQ0KDQpsb3dlcl85MCA8LSB4X2JhciAtIG1hcmdpbl9lcnJvcl85MA0KdXBwZXJfOTAgPC0geF9iYXIgKyBtYXJnaW5fZXJyb3JfOTANCmxvd2VyXzk1IDwtIHhfYmFyIC0gbWFyZ2luX2Vycm9yXzk1DQp1cHBlcl85NSA8LSB4X2JhciArIG1hcmdpbl9lcnJvcl85NQ0KbG93ZXJfOTkgPC0geF9iYXIgLSBtYXJnaW5fZXJyb3JfOTkNCnVwcGVyXzk5IDwtIHhfYmFyICsgbWFyZ2luX2Vycm9yXzk5DQoNCiMgQnVhdCBkYXRhIGZyYW1lDQp0YWJlbF9jaSA8LSBkYXRhLmZyYW1lKA0KICAiVGluZ2thdF9LZXBlcmNheWFhbiIgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICAiWi1TY29yZSIgPSBjKHpfOTAsIHpfOTUsIHpfOTkpLA0KICAiTWFyZ2luX0Vycm9yIiA9IGMoDQogICAgcm91bmQobWFyZ2luX2Vycm9yXzkwLCA0KSwNCiAgICByb3VuZChtYXJnaW5fZXJyb3JfOTUsIDQpLA0KICAgIHJvdW5kKG1hcmdpbl9lcnJvcl85OSwgNCkNCiAgKSwNCiAgIkJhdGFzX0Jhd2FoIiA9IGMoDQogICAgcm91bmQobG93ZXJfOTAsIDQpLA0KICAgIHJvdW5kKGxvd2VyXzk1LCA0KSwNCiAgICByb3VuZChsb3dlcl85OSwgNCkNCiAgKSwNCiAgIkJhdGFzX0F0YXMiID0gYygNCiAgICByb3VuZCh1cHBlcl85MCwgNCksDQogICAgcm91bmQodXBwZXJfOTUsIDQpLA0KICAgIHJvdW5kKHVwcGVyXzk5LCA0KQ0KICApLA0KICAiSW50ZXJ2YWxfS2VwZXJjYXlhYW4iID0gYygNCiAgICBwYXN0ZTAoIlsiLCByb3VuZChsb3dlcl85MCwgMiksICIsICIsIHJvdW5kKHVwcGVyXzkwLCAyKSwgIl0iKSwNCiAgICBwYXN0ZTAoIlsiLCByb3VuZChsb3dlcl85NSwgMiksICIsICIsIHJvdW5kKHVwcGVyXzk1LCAyKSwgIl0iKSwNCiAgICBwYXN0ZTAoIlsiLCByb3VuZChsb3dlcl85OSwgMiksICIsICIsIHJvdW5kKHVwcGVyXzk5LCAyKSwgIl0iKQ0KICApDQopDQoNCiMgVGFtcGlsa2FuIHRhYmVsIFNFREVSSEFOQSB0YXBpIFJBUEkNCnRhYmVsX2NpICU+JQ0KICBrYmwoDQogICAgY2FwdGlvbiA9ICJUYWJlbCBJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBSYXRhLXJhdGEgVHJhbnNha3NpIEhhcmlhbiIsDQogICAgYWxpZ24gPSBjKCJjIiwgImMiLCAiYyIsICJjIiwgImMiLCAiYyIpDQogICkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciINCiAgKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiIzJFODZDMSIsIGNvbG9yID0gIndoaXRlIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0Y4RjlGQSIpICU+JQ0KICByb3dfc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNFOUVDRUYiKSAlPiUNCiAgcm93X3NwZWMoMywgYmFja2dyb3VuZCA9ICIjREVFMkU2IikgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUNCiAgY29sdW1uX3NwZWMoNiwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIiMyRTg2QzEiKQ0KDQpgYGANCg0KSW50aW55YSwgc2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbm55YSBtYWthIHNlbWFraW4gbGViYXIgcHVsYSBpbnRlcnZhbG55YSBrYXJlbmEga2l0YSBpbmdpbiBsZWJpaCB5YWtpbiBtZW5hbmdrYXAgcmF0YS1yYXRhIHBvcHVsYXNpLg0KDQojIyBJbnRlcnByZXRhc2kgZGFsYW0gS29udGVrcyBBbmFsaXRpayBCaXNuaXMNCg0KKipJbnRlcnByZXRhc2k6KioNCg0KKiBEZW5nYW4gOTAlIGtlcGVyY2F5YWFuLCByYXRhLXJhdGEgdHJhbnNha3NpIGhhcmlhbiBwZXIgcGVuZ2d1bmEgc2V0ZWxhaCBmaXR1ciBiYXJ1IGFkYWxhaCBhbnRhcmEgMTIuMDcgaGluZ2dhIDEzLjEzIHRyYW5zYWtzaS4NCiogRGVuZ2FuIDk1JSBrZXBlcmNheWFhbiwgcmVudGFuZ255YSAxMS45NyBoaW5nZ2EgMTMuMjMgdHJhbnNha3NpLg0KKiBEZW5nYW4gOTklIGtlcGVyY2F5YWFuLCByZW50YW5nbnlhIDExLjc4IGhpbmdnYSAxMy40MiB0cmFuc2Frc2kuDQoNCioqSW1wbGlrYXNpIGJpc25pczoqKg0KDQoxLiBQbGF0Zm9ybSBkYXBhdCB5YWtpbiBiYWh3YSByYXRhLXJhdGEgdHJhbnNha3NpIGhhcmlhbiBwZXIgcGVuZ2d1bmEgc2V0ZWxhaCBmaXR1ciBiYXJ1IHNla2l0YXIgMTIuNiwgZGVuZ2FuIGtlbXVuZ2tpbmFuIGZsdWt0dWFzaSBzZWtpdGFyIMKxMC41IGhpbmdnYSDCsTAuOCB0ZXJnYW50dW5nIHRpbmdrYXQga2V5YWtpbmFuIHlhbmcgZGlwaWxpaC4NCg0KMi4gS2FyZW5hIHNlbXVhIHNlbGFuZyBrZXBlcmNheWFhbiBiZXJhZGEgZGkgYXRhcyAxMS43LCBpbmkgbWVudW5qdWtrYW4gYmFod2EgZml0dXIgYmFydSBrZW11bmdraW5hbiB0aWRhayBtZW51cnVua2FuIGp1bWxhaCB0cmFuc2Frc2kgcmF0YS1yYXRhLg0KDQoqKlJla29tZW5kYXNpOioqDQoNCiogSmlrYSBpbmdpbiBsYXBvcmFuIGludGVybmFsIHlhbmcgbGViaWggdGVwYXQgZGVuZ2FuIHJpc2lrbyBrZXNhbGFoYW4gMTAlLCBndW5ha2FuIHNlbGFuZyA5MCUuDQoNCiogSmlrYSB1bnR1ayBwdWJsaWthc2kgYXRhdSBrZXB1dHVzYW4gc3RyYXRlZ2lzLCBndW5ha2FuIHNlbGFuZyA5NSUgYXRhdSA5OSUgdW50dWsgbGViaWggYW1hbi4NCg0KKiBQZXJsdSBkaWluZ2F0IGJhaHdhIGluaSBhZGFsYWggcmF0YS1yYXRhIHBlciBwZW5nZ3VuYSwgYnVrYW4gdG90YWwgdHJhbnNha3NpIHBsYXRmb3JtLg0KDQo8L2Rpdj4gDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIFN0dWRpIEthc3VzIDINCg0KKipJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBSYXRhLVJhdGEsICRcc2lnbWEkIFRpZGFrIERpa2V0YWh1aToqKiBTZWJ1YWggKip0aW0gUGVuZWxpdGlhbiBVWCoqIG1lbmdhbmFsaXNpcyAqKndha3R1IHBlbnllbGVzYWlhbiB0dWdhcyAoZGFsYW0gbWVuaXQpKiogdW50dWsgYXBsaWthc2kgc2VsdWxlciBiYXJ1LiBEYXRhIGRpa3VtcHVsa2FuIGRhcmkgKioxMiBwZW5nZ3VuYSoqOg0KDQokJA0KOC40LFw7IDcuOSxcOyA5LjEsXDsgOC43LFw7IDguMixcOyA5LjAsXDsNCjcuOCxcOyA4LjUsXDsgOC45LFw7IDguMSxcOyA4LjYsXDsgOC4zDQokJA0KKipUdWdhczoqKg0KDQoxLiBJZGVudGlmaWthc2kgdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0IGRhbiBqZWxhc2thbiBhbGFzYW5ueWEuDQoyLiBIaXR1bmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWs6DQogICAqICQ5MFwlJA0KICAgKiAkOTVcJSQNCiAgICogJDk5XCUkDQozLiBWaXN1YWxpc2FzaWthbiBrZXRpZ2EgaW50ZXJ2YWwgdGVyc2VidXQgZGFsYW0gc2F0dSBwbG90Lg0KNC4gSmVsYXNrYW4gYmFnYWltYW5hIHVrdXJhbiBzYW1wZWwgZGFuIHRpbmdrYXQga2VwZXJjYXlhYW4gbWVtZW5nYXJ1aGkgbGViYXIgaW50ZXJ2YWwuDQoNCioqSmF3YWI6KioNCg0KIyMgVWppIFN0YXRpc3RpayB5YW5nIFRlcGF0DQoNCioqRGlrZXRhaHVpOioqDQoNCiogz4MgKHNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpKSB0aWRhayBkaWtldGFodWkNCiogVWt1cmFuIHNhbXBlbCBrZWNpbCAobj0xMikNCiogRXN0aW1hc2kgbWVuZ2d1bmFrYW4gc2ltcGFuZ2FuIGJha3Ugc2FtcGVsIChzKQ0KDQpNYWthLCBEaXN0cmlidXNpIHQgbGViaWggYWt1cmF0IHVudHVrIHNhbXBlbCBrZWNpbCBrYXJlbmEgbWVtaWxpa2kgZWtvciBsZWJpaCBsZWJhciwgbWVueWVzdWFpa2FuIGtldGlkYWtwYXN0aWFuIGVzdGltYXNpIM+DLg0KDQojIyBNZW5naGl0dW5nIEludGVydmFsIEtlcGVyY2F5YWFuDQoNCioqRGlrZXRhaHVpOioqDQoNCiQkQ0kgPSBcYmFye3h9IFxwbSB0X3tcYWxwaGEvMiwgZGZ9IFx0aW1lcyBcZnJhY3tzfXtcc3FydHtufX0kJA0KDQokJGRmID0gbi0xID0gMTEsXHF1YWQgXGJhcnt4fSA9IDguNDc1LFxxdWFkIHMgPSAwLjQwOSxccXVhZCBTRSA9IDAuMTE4JCQNCg0KIyMjIEludGVydmFsIEtlcGVyY2F5YWFuIDkwJSANCg0KJHRfezAuMDUsMTF9ID0gMS43OTYkDQoNCiQkTUUgPSAxLjc5NiBcdGltZXMgMC4xMTggPSAwLjIxMiQkDQoNCiQkQ0kgPSA4LjQ3NSBccG0gMC4yMTIgPSBbOC4yNjMsXDsgOC42ODddJCQNCg0KIyMjIEludGVydmFsIEtlcGVyY2F5YWFuIDk1JSANCg0KJHRfezAuMDI1LDExfSA9IDIuMjAxJA0KDQokJE1FID0gMi4yMDEgXHRpbWVzIDAuMTE4ID0gMC4yNjAkJA0KDQokJENJID0gOC40NzUgXHBtIDAuMjYwID0gWzguMjE1LFw7IDguNzM1XSQkDQoNCiMjIyBJbnRlcnZhbCBLZXBlcmNheWFhbiA5OSUgDQoNCiR0X3swLjAwNSwxMX0gPSAzLjEwNiQNCg0KJCRNRSA9IDMuMTA2IFx0aW1lcyAwLjExOCA9IDAuMzY2JCQNCg0KJCRDSSA9IDguNDc1IFxwbSAwLjM2NiA9IFs4LjEwOSxcOyA4Ljg0MV0kJA0KDQojIyBWaXN1YWxpc2FzaSBLZXRpZ2EgSW50ZXJ2YWwgZGFsYW0gU2F0dSBQbG90DQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1UUlVFfQ0KDQojIERhdGEgdW50dWsgcGxvdHRpbmcNCnRpbmdrYXRfY2kgPC0gYygiOTklIiwgIjk1JSIsICI5MCUiKQ0KYmF3YWggPC0gYyg4LjEwOSwgOC4yMTUsIDguMjYzKQ0KYXRhcyA8LSBjKDguODQxLCA4LjczNSwgOC42ODcpDQptZWFuX3ZhbCA8LSA4LjQ3NQ0KDQojIEJ1YXQgcGxvdA0KcGxvdCgxLCB0eXBlID0gIm4iLCANCiAgICAgeGxpbSA9IGMoOC4wLCA4LjkpLCANCiAgICAgeWxpbSA9IGMoMC41LCAzLjUpLA0KICAgICB4bGFiID0gIldha3R1IChtZW5pdCkiLCANCiAgICAgeWxhYiA9ICJUaW5na2F0IEtlcGVyY2F5YWFuIiwNCiAgICAgeWF4dCA9ICJuIiwNCiAgICAgbWFpbiA9ICJJbnRlcnZhbCBLZXBlcmNheWFhbiBSYXRhLXJhdGEgV2FrdHUgUGVueWVsZXNhaWFuIFR1Z2FzIikNCg0KIyBUYW1iYWggZ2FyaXMgdmVydGlrYWwgdW50dWsgcmF0YS1yYXRhDQphYmxpbmUodiA9IG1lYW5fdmFsLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgbHdkID0gMS41KQ0KdGV4dChtZWFuX3ZhbCwgMy4zLCAiUmF0YS1yYXRhID0gOC40NzUiLCBjb2wgPSAicmVkIiwgY2V4ID0gMC44LCBwb3MgPSA0KQ0KDQojIFBsb3QgaW50ZXJ2YWwNCmZvcihpIGluIDE6Mykgew0KICAjIEdhcmlzIGhvcml6b250YWwgdW50dWsgaW50ZXJ2YWwNCiAgbGluZXMoYyhiYXdhaFtpXSwgYXRhc1tpXSksIGMoaSwgaSksIGNvbCA9ICJibHVlIiwgbHdkID0gMykNCiAgIyBUaXRpayB1bnR1ayBiYXRhcw0KICBwb2ludHMoYmF3YWhbaV0sIGksIGNvbCA9ICJkYXJrYmx1ZSIsIHBjaCA9ICJ8IiwgY2V4ID0gMS41KQ0KICBwb2ludHMoYXRhc1tpXSwgaSwgY29sID0gImRhcmtibHVlIiwgcGNoID0gInwiLCBjZXggPSAxLjUpDQogICMgTGFiZWwgYmF0YXMNCiAgdGV4dChiYXdhaFtpXSwgaSAtIDAuMTUsIHJvdW5kKGJhd2FoW2ldLCAzKSwgY2V4ID0gMC43LCBjb2wgPSAiZGFya2JsdWUiKQ0KICB0ZXh0KGF0YXNbaV0sIGkgLSAwLjE1LCByb3VuZChhdGFzW2ldLCAzKSwgY2V4ID0gMC43LCBjb2wgPSAiZGFya2JsdWUiKQ0KfQ0KDQojIExhYmVsIHRpbmdrYXQga2VwZXJjYXlhYW4gZGkgc3VtYnUgeQ0KYXhpcygyLCBhdCA9IDE6MywgbGFiZWxzID0gdGluZ2thdF9jaSwgbGFzID0gMSkNCg0KIyBUYW1iYWggZ3JpZA0KZ3JpZCgpDQoNCiMgTGVnZW5kYSBzZWRlcmhhbmENCmxlZ2VuZCgidG9wcmlnaHQiLCANCiAgICAgICBsZWdlbmQgPSBjKCJJbnRlcnZhbCBLZXBlcmNheWFhbiIsICJSYXRhLXJhdGEgc2FtcGVsIiksDQogICAgICAgY29sID0gYygiYmx1ZSIsICJyZWQiKSwNCiAgICAgICBsdHkgPSBjKDEsIDIpLA0KICAgICAgIGx3ZCA9IGMoMywgMS41KSwNCiAgICAgICBjZXggPSAwLjgpDQoNCmBgYA0KDQotLS0NCg0KRGFyaSBwbG90IHRlcmxpaGF0IGJhaHdhIHNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4gKDkwJSDihpIgOTUlIOKGkiA5OSUpLCBpbnRlcnZhbCBtZW5qYWRpIHNlbWFraW4gbGViYXIuIENJIDk5JSBtZW1pbGlraSByZW50YW5nIHRlcmx1YXMgKDguMTA5LTguODQxIG1lbml0KSwgbWVudW5qdWtrYW4gYmFod2EgdW50dWsgbWVuY2FwYWkga2VwYXN0aWFuIDk5JSBiYWh3YSByYXRhLXJhdGEgcG9wdWxhc2kgYmVyYWRhIGRhbGFtIGludGVydmFsLCBraXRhIHBlcmx1IG1lbmVyaW1hIGVzdGltYXNpIHlhbmcga3VyYW5nIHByZXNpc2kuIFNlYmFsaWtueWEsIENJIDkwJSBsZWJpaCBzZW1waXQgKDguMjYzLTguNjg3IG1lbml0KSBtZW1iZXJpa2FuIGVzdGltYXNpIGxlYmloIHByZXNpc2kgdGV0YXBpIGRlbmdhbiBrZXlha2luYW4gbGViaWggcmVuZGFoLiBEYWxhbSBwZW5lbGl0aWFuIFVYLCBDSSA5NSUgc2VyaW5nIG1lbmphZGkgcGlsaWhhbiBvcHRpbWFsIHNlYmFnYWkgdHJhZGUtb2ZmIGFudGFyYSBwcmVzaXNpIGRhbiB0aW5na2F0IGtlcGVyY2F5YWFuLg0KDQojIyBQZW5nYXJ1aCBVa3VyYW4gU2FtcGVsIGRhbiBUaW5na2F0IEtlcGVyY2F5YWFuIHRlcmhhZGFwIExlYmFyIEludGVydmFsDQoNCiogVGluZ2thdCBrZXBlcmNheWFhbiDihpEg4oaSIExlYmFyIGludGVydmFsIOKGkQ0KDQpTZW1ha2luIHRpbmdnaSBrZXlha2luYW4geWFuZyBkaWluZ2lua2FuLCBpbnRlcnZhbCBoYXJ1cyBzZW1ha2luIGxlYmFyIHVudHVrIG1lbmFuZ2thcCBwYXJhbWV0ZXIgcG9wdWxhc2kuDQoNCiogVWt1cmFuIHNhbXBlbCDihpEg4oaSIExlYmFyIGludGVydmFsIOKGkw0KDQpTZW1ha2luIGJlc2FyIHNhbXBlbCwgZXN0aW1hc2kgc2VtYWtpbiBwcmVzaXNpIHNlaGluZ2dhIGludGVydmFsIHNlbWFraW4gc2VtcGl0IChrYXJlbmEgc3RhbmRhciBlcnJvciBtZW51cnVuKS4NCg0KKipIdWJ1bmdhbjoqKiBVbnR1ayBtZW5kYXBhdGthbiBpbnRlcnZhbCB5YW5nIHNlbXBpdCBkZW5nYW4gdGluZ2thdCBrZXBlcmNheWFhbiB0aW5nZ2ksIGRpcGVybHVrYW4gc2FtcGVsIHlhbmcgYmVzYXIuIFBhZGEgc2FtcGVsIGtlY2lsIChzZXBlcnRpIG49MTIgaW5pKSwgaW50ZXJ2YWwgYWthbiByZWxhdGlmIGxlYmFyIHRlcnV0YW1hIHBhZGEgQ0kgOTUlIGRhbiA5OSUuDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgU3R1ZGkgS2FzdXMgMw0KDQoqKkludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrIFByb3BvcnNpLCBQZW5ndWppYW4gQS9COioqIFNlYnVhaCB0aW0gaWxtdSBkYXRhIG1lbmphbGFua2FuICoqcGVuZ3VqaWFuIEEvQioqIHBhZGEgZGVzYWluIHRvbWJvbCAqQ2FsbC1Uby1BY3Rpb24gKENUQSkqIGJhcnUuIEVrc3BlcmltZW4gbWVuZ2hhc2lsa2FuOg0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDQwMCBccXVhZCBcdGV4dHsodG90YWwgcGVuZ2d1bmEpfSBcXA0KeCAmPSYgMTU2IFxxdWFkIFx0ZXh0eyhwZW5nZ3VuYSB5YW5nIG1lbmdrbGlrIENUQSl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCioqVHVnYXM6KioNCg0KMS4gIEhpdHVuZyAqKnByb3BvcnNpIHNhbXBlbCoqICRcaGF0e3B9JC4NCjIuICBIaXR1bmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWsgcHJvcG9yc2kgcGFkYToNCiAgICAtICQ5MFwlJA0KICAgIC0gJDk1XCUkDQogICAgLSAkOTlcJSQNCjMuICBWaXN1YWxpc2FzaWthbiBkYW4gYmFuZGluZ2thbiBrZXRpZ2EgSW50ZXJ2YWwgdGVyc2VidXQuDQo0LiAgSmVsYXNrYW4gYmFnYWltYW5hIHRpbmdrYXQga2VwZXJjYXlhYW4gbWVtZW5nYXJ1aGkgcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIGRhbGFtIGVrc3BlcmltZW4gcHJvZHVrLg0KDQoqKkphd2FiOioqDQoNCiMjIEhpdHVuZyBQcm9wb3JzaSBTYW1wZWwgJFxoYXR7cH0kDQoNCiQkXGhhdHtwfSA9IFxmcmFje3h9e259ID0gXGZyYWN7MTU2fXs0MDB9ID0gMC4zOSQkDQoNCkphZGksIHByb3BvcnNpIHNhbXBlbCBwZW5nZ3VuYSB5YW5nIG1lbmdrbGlrIENUQSBhZGFsYWggMC4zOSBhdGF1IDM5JS4NCg0KIyMgSGl0dW5nIEludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrIFByb3BvcnNpDQoNCioqUnVtdXMgaW50ZXJ2YWwga2VwZXJjYXlhYW4gcHJvcG9yc2k6KioNCg0KJCRDSSA9IFxoYXR7cH0gXHBtIHpfe1xhbHBoYS8yfSBcdGltZXMgXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0kJA0KDQpkaSBtYW5hOg0KDQoqICRcaGF0e3B9ID0gMC4zOSQNCiogJG4gPSA0MDAkDQoqICR6X3tcYWxwaGEvMn0gYWRhbGFoIG5pbGFpIHoga3JpdGlzJA0KDQojIyMgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gOTAlDQoNCiR6X3swLjA1fSA9IDEuNjQ1JA0KDQokJFNFID0gXHNxcnR7XGZyYWN7MC4zOSBcdGltZXMgMC42MX17NDAwfX0gPSBcc3FydHtcZnJhY3swLjIzNzl9ezQwMH19ID0gXHNxcnR7MC4wMDA1OTQ3NX0gXGFwcHJveCAwLjAyNDM5JCQNCg0KJCRNRSA9IDEuNjQ1IFx0aW1lcyAwLjAyNDM5IFxhcHByb3ggMC4wNDAxMiQkDQoNCiQkQ0kgPSAwLjM5IFxwbSAwLjA0MDEyID0gWzAuMzQ5OSxcOyAwLjQzMDFdDQoNCuKJiCBbMC4zNTAsIDAuNDMwXSQkDQoNCiMjIyBJbnRlcnZhbCBLZXBlcmNheWFhbiA5NSUNCg0KJHpfezAuMDI1fSA9IDEuOTYkDQoNCiQkTUUgPSAxLjk2IFx0aW1lcyAwLjAyNDM5IFxhcHByb3ggMC4wNDc4MCQkDQoNCiQkQ0kgPSAwLjM5IFxwbSAwLjA0NzgwID0gWzAuMzQyMixcOyAwLjQzNzhdDQoNCuKJiCBbMC4zNDIsIDAuNDM4XSQkDQoNCiMjIyBJbnRlcnZhbCBLZXBlcmNheWFhbiA5OSUNCg0KJHpfezAuMDA1fSA9IDIuNTc2JA0KDQokJE1FID0gMi41NzYgXHRpbWVzIDAuMDI0MzkgXGFwcHJveCAwLjA2MjgzJCQNCg0KJCRDSSA9IDAuMzkgXHBtIDAuMDYyODMgPSBbMC4zMjcyLFw7IDAuNDUyOF0NCg0K4omIIFswLjMyNywgMC40NTNdJCQNCg0KKipSaW5na2FzYW4gaGFzaWw6KioNCg0KKiA5MCUgQ0k6IFswLjM1MCwgMC40MzBdDQoqIDk1JSBDSTogWzAuMzQyLCAwLjQzOF0NCiogOTklIENJOiBbMC4zMjcsIDAuNDUzXQ0KDQojIyBWaXN1YWxpc2FzaSBQZXJiYW5kaW5nYW4gS2V0aWdhIEludGVydmFsDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KIyBEYXRhIHVudHVrIHBsb3R0aW5nDQp0aW5na2F0X2NpIDwtIGMoIjk5JSIsICI5NSUiLCAiOTAlIikNCnByb3BvcnNpIDwtIDAuMzkNCmJhd2FoIDwtIGMoMC4zMjcsIDAuMzQyLCAwLjM1MCkNCmF0YXMgPC0gYygwLjQ1MywgMC40MzgsIDAuNDMwKQ0KDQojIFBsb3QNCnBsb3QoMSwgdHlwZSA9ICJuIiwgDQogICAgIHhsaW0gPSBjKDAuMzAsIDAuNDgpLCANCiAgICAgeWxpbSA9IGMoMC41LCAzLjUpLA0KICAgICB4bGFiID0gIlByb3BvcnNpIEtsaWsgKHApIiwgDQogICAgIHlsYWIgPSAiVGluZ2thdCBLZXBlcmNheWFhbiIsDQogICAgIHlheHQgPSAibiIsDQogICAgIG1haW4gPSAiSW50ZXJ2YWwgS2VwZXJjYXlhYW4gUHJvcG9yc2kgS2xpayBDVEEgKG49NDAwKSIpDQoNCiMgR2FyaXMgdmVydGlrYWwgdW50dWsgcHJvcG9yc2kgc2FtcGVsDQphYmxpbmUodiA9IHByb3BvcnNpLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgbHdkID0gMikNCnRleHQocHJvcG9yc2ksIDMuMywgInDMgiA9IDAuMzkiLCBjb2wgPSAicmVkIiwgY2V4ID0gMC45LCBwb3MgPSA0KQ0KDQojIFBsb3QgaW50ZXJ2YWwNCmNvbG9ycyA8LSBjKCIjRTc0QzNDIiwgIiMzNDk4REIiLCAiIzJFQ0M3MSIpICMgOTklLCA5NSUsIDkwJQ0KDQpmb3IoaSBpbiAxOjMpIHsNCiAgIyBHYXJpcyBob3Jpem9udGFsDQogIGxpbmVzKGMoYmF3YWhbaV0sIGF0YXNbaV0pLCBjKGksIGkpLCBjb2wgPSBjb2xvcnNbaV0sIGx3ZCA9IDQpDQogICMgQmF0YXMga2lyaQ0KICBwb2ludHMoYmF3YWhbaV0sIGksIGNvbCA9IGNvbG9yc1tpXSwgcGNoID0gInwiLCBjZXggPSAyKQ0KICAjIEJhdGFzIGthbmFuDQogIHBvaW50cyhhdGFzW2ldLCBpLCBjb2wgPSBjb2xvcnNbaV0sIHBjaCA9ICJ8IiwgY2V4ID0gMikNCiAgIyBMYWJlbCBiYXRhcw0KICB0ZXh0KGJhd2FoW2ldLCBpIC0gMC4yLCByb3VuZChiYXdhaFtpXSwgMyksIGNleCA9IDAuOCwgY29sID0gY29sb3JzW2ldKQ0KICB0ZXh0KGF0YXNbaV0sIGkgLSAwLjIsIHJvdW5kKGF0YXNbaV0sIDMpLCBjZXggPSAwLjgsIGNvbCA9IGNvbG9yc1tpXSkNCn0NCg0KIyBTdW1idSB5DQpheGlzKDIsIGF0ID0gMTozLCBsYWJlbHMgPSB0aW5na2F0X2NpLCBsYXMgPSAxKQ0KDQojIEdyaWQNCmdyaWQoKQ0KDQojIExlZ2VuZGENCmxlZ2VuZCgidG9wcmlnaHQiLCANCiAgICAgICBsZWdlbmQgPSBjKCI5OSUgQ0kiLCAiOTUlIENJIiwgIjkwJSBDSSIsICJQcm9wb3JzaSBzYW1wZWwgKHDMgikiKSwNCiAgICAgICBjb2wgPSBjKCIjRTc0QzNDIiwgIiMzNDk4REIiLCAiIzJFQ0M3MSIsICJyZWQiKSwNCiAgICAgICBsdHkgPSBjKDEsIDEsIDEsIDIpLA0KICAgICAgIGx3ZCA9IGMoNCwgNCwgNCwgMiksDQogICAgICAgY2V4ID0gMC44KQ0KDQpgYGANCg0KKipJbnRlcnByZXRhc2kgVmlzdWFsOioqDQoNCjEuIFNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4sIGludGVydmFsIHNlbWFraW4gbGViYXIgKDk5JSA+IDk1JSA+IDkwJSkNCjIuIFNlbXVhIGludGVydmFsIG1lbmNha3VwIHByb3BvcnNpIHNhbXBlbCAwLjM5IGRpIHRlbmdhaG55YQ0KMy4gQ0kgOTAlIHBhbGluZyBzZW1waXQgbWVtYmVyaWthbiBlc3RpbWFzaSBwYWxpbmcgcHJlc2lzaQ0KNC4gUmVudGFuZyBDSSA5OSUgbWVudW5qdWtrYW4ga2l0YSA5OSUgeWFraW4gcHJvcG9yc2kga2xpayBzZWJlbmFybnlhIGRpIHBvcHVsYXNpIGFudGFyYSAzMi43JSBzYW1wYWkgNDUuMyUNCg0KIyMgUGVuZ2FydWggVGluZ2thdCBLZXBlcmNheWFhbiB0ZXJoYWRhcCBQZW5nYW1iaWxhbiBLZXB1dHVzYW4gZGFsYW0gRWtzcGVyaW1lbiBQcm9kdWsNCg0KKioxLiBUaW5na2F0IEtlcGVyY2F5YWFuIHNlYmFnYWkgVWt1cmFuIEtleWFraW5hbjoqKg0KDQpTZW1ha2luIHRpbmdnaSBDSSAobWlzYWwgOTklKSwgc2VtYWtpbiB5YWtpbiBraXRhIGJhaHdhIHBhcmFtZXRlciBwb3B1bGFzaSBzZXN1bmdndWhueWEgYmVyYWRhIGRhbGFtIGludGVydmFsLCB0ZXRhcGkgaW50ZXJ2YWwgbWVuamFkaSBsZWJpaCBsZWJhciDihpIgbGViaWgga29uc2VydmF0aWYgZGFsYW0ga2xhaW0uDQoNCioqMi4gVHJhZGUtb2ZmIGRhbGFtIFBlbmdhbWJpbGFuIEtlcHV0dXNhbjoqKg0KDQogICAqIENJIDkwJTogSW50ZXJ2YWwgc2VtcGl0IOKGkiBrbGFpbSBsZWJpaCBiZXJhbmksIHRldGFwaSByaXNpa28ga2VzYWxhaGFuIGxlYmloIHRpbmdnaSAoMTAlIGtlbXVuZ2tpbmFuIHNhbGFoKS4gQ29jb2sgdW50dWsgZWtzcGxvcmFzaSBjZXBhdCBhdGF1IHBlcnViYWhhbiBtaW5vci4NCiAgIA0KICAgKiBDSSA5NSU6IFN0YW5kYXJkIGRhbGFtIGluZHVzdHJpIOKGkiBrZXNlaW1iYW5nYW4gYW50YXJhIGtleWFraW5hbiBkYW4gcHJlc2lzaS4gRGlndW5ha2FuIHVudHVrIGtlcHV0dXNhbiBkZW5nYW4gZGFtcGFrIG1lbmVuZ2FoLg0KICAgDQogICAqIENJIDk5JTogSW50ZXJ2YWwgbGViYXIg4oaSIHNhbmdhdCBoYXRpLWhhdGksIGhhbnlhIG1lbnlpbXB1bGthbiBqaWthIGVmZWsgc2FuZ2F0IGplbGFzLiBDb2NvayB1bnR1ayBwZXJ1YmFoYW4gYmVzYXIgZGVuZ2FuIHJpc2lrbyB0aW5nZ2kuDQogICANCioqMy4gSW1wbGlrYXNpIHBhZGEgQS9CIFRlc3Rpbmc6KioNCg0KSmlrYSB0YXJnZXQga29udmVyc2kgc2ViZWx1bW55YSAzNSUsIG1ha2E6DQoNCiAgICogRGVuZ2FuIENJIDk1JSBbMC4zNDIsIDAuNDM4XSwga2l0YSB0aWRhayBiaXNhIHlha2luIGRlc2FpbiBiYXJ1IGxlYmloIGJhaWsgKGthcmVuYSAzNSUgbWFzaWggZGFsYW0gaW50ZXJ2YWwpLg0KICAgDQogICAqIFBlcmx1IGVrc3BlcmltZW4gbGFuanV0YW4gYXRhdSBzYW1wZWwgbGViaWggYmVzYXIgdW50dWsgbWVtcGVyc2VtcGl0IGludGVydmFsLg0KICAgDQoqKjQuIFJla29tZW5kYXNpOioqDQoNCiAgICogR3VuYWthbiA5NSUgQ0kgc2ViYWdhaSBzdGFuZGFyIHVudHVrIGtlcHV0dXNhbiBwcm9kdWsgc2VoYXJpLWhhcmkuDQogICANCiAgICogTmFpa2thbiBrZSA5OSUgQ0kgamlrYSBrb25zZWt1ZW5zaSBrZXNhbGFoYW4gbWFoYWwgKG1pc2FsOiBmaXR1ciBiYXlhcmFuKS4NCiAgIA0KICAgKiBUdXJ1bmthbiBrZSA5MCUgQ0kgaGFueWEgdW50dWsgZWtzcGxvcmFzaSBhdGF1IHZhbGlkYXNpIGhpcG90ZXNpcyBhd2FsLg0KDQo8L2Rpdj4gDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIFN0dWRpIEthc3VzIDQNCg0KKipQZXJiYW5kaW5nYW4gUHJlc2lzaSAoVWppLVogdnMgVWppLXQpOioqIER1YSB0aW0gZGF0YSBtZW5ndWt1ciAqKmxhdGVuIEFQSSAoZGFsYW0gbWlsaWRldGlrKSoqIGRhbGFtIGtvbmRpc2kgeWFuZyBiZXJiZWRhLg0KDQpcYmVnaW57ZXFuYXJyYXkqfQ0KXHRleHR7VGltIEE6fSBcXA0KbiAmPSYgMzYgXHF1YWQgXHRleHR7KHVrdXJhbiBzYW1wZWwpfSBcXA0KXGJhcnt4fSAmPSYgMjEwIFxxdWFkIFx0ZXh0eyhyYXRhLXJhdGEgc2FtcGVsKX0gXFwNClxzaWdtYSAmPSYgMjQgXHF1YWQgXHRleHR7KHNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpIHlhbmcgZGlrZXRhaHVpKX0gXFxbNnB0XQ0KDQpcdGV4dHtUaW0gQjp9IFxcDQpuICY9JiAzNiBccXVhZCBcdGV4dHsodWt1cmFuIHNhbXBlbCl9IFxcDQpcYmFye3h9ICY9JiAyMTAgXHF1YWQgXHRleHR7KHJhdGEtcmF0YSBzYW1wZWwpfSBcXA0KcyAmPSYgMjQgXHF1YWQgXHRleHR7KHNpbXBhbmdhbiBiYWt1IHNhbXBlbCl9DQpcZW5ke2VxbmFycmF5Kn0NCg0KKipUdWdhcyoqDQoNCjEuICBJZGVudGlmaWthc2kgdWppIHN0YXRpc3RpayB5YW5nIGRpZ3VuYWthbiBvbGVoIG1hc2luZy1tYXNpbmcgdGltLg0KMi4gIEhpdHVuZyBJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayAqKjkwJSwgOTUlLCBkYW4gOTklKiouDQozLiAgQnVhdCB2aXN1YWxpc2FzaSB5YW5nIG1lbWJhbmRpbmdrYW4gc2VtdWEgSW50ZXJ2YWwuDQo0LiAgSmVsYXNrYW4gbWVuZ2FwYSAqKmxlYmFyIGludGVydmFsIGJlcmJlZGEqKiwgbWVza2lwdW4gZGF0YSBzZXJ1cGEuDQoNCiMjIFVqaSBTdGF0aXN0aWsgTWFzaW5nLW1hc2luZyBUaW0NCg0KKipUaW0gQToqKg0KDQoqIE1lbmdndW5ha2FuIFVqaS1aIChEaXN0cmlidXNpIE5vcm1hbCkNCiogQWxhc2FuOiBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSAkKM+DID0gMjQpJCBkaWtldGFodWkNCiogUnVtdXM6ICAkJENJID0gXGJhcnt4fSBccG0gel97XGFscGhhLzJ9IFx0aW1lcyBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQkIA0KDQoqKlRpbSBCOioqDQoNCiogTWVuZ2d1bmFrYW4gVWppLXQgKERpc3RyaWJ1c2kgdC1TdHVkZW50KQ0KKiBBbGFzYW46IFNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aSwgbWVuZ2d1bmFrYW4gc2ltcGFuZ2FuIGJha3Ugc2FtcGVsICQocyA9IDI0KSQNCiogUnVtdXM6ICAkJENJID0gXGJhcnt4fSBccG0gdF97XGFscGhhLzIsIGRmfSBcdGltZXMgXGZyYWN7c317XHNxcnR7bn19ICBkZW5nYW4gIGRmID0gbi0xID0gMzUkJA0KDQojIyBNZW5naGl0dW5nIGludGVydmFsIEtlcGVyY2F5YWFuDQoNCioqRGlrZXRhaHVpOioqDQoNCiQkbiA9IDM2LFxxdWFkIFxiYXJ7eH0gPSAyMTAsXHF1YWQgXHNpZ21hID0gMjQsXHF1YWQgcyA9IDI0LFxxdWFkIFNFID0gXGZyYWN7MjR9e1xzcXJ0ezM2fX0gPSBcZnJhY3syNH17Nn0gPSA0JCQNCg0KIyMjIFRJTSBBIChVamktWikNCg0KKiBJbnRlcnZhbCBLZXBlcmNheWFhbiA5MCUNCg0KJHpfezAuMDV9ID0gMS42NDUkDQoNCiQkTUUgPSAxLjY0NSBcdGltZXMgNCA9IDYuNTgkJA0KDQokJENJID0gMjEwIFxwbSA2LjU4ID0gWzIwMy40MixcOyAyMTYuNThdJCQNCg0KKiBJbnRlcnZhbCBLZXBlcmNheWFhbiA5NSUNCg0KJHpfezAuMDI1fSA9IDEuOTYkDQoNCiQkTUUgPSAxLjk2IFx0aW1lcyA0ID0gNy44NCQkDQoNCiQkQ0kgPSAyMTAgXHBtIDcuODQgPSBbMjAyLjE2LFw7IDIxNy44NF0kJA0KDQoqIEludGVydmFsIEtlcGVyY2F5YWFuIDk5JQ0KDQokel97MC4wMDV9ID0gMi41NzYkDQoNCiQkTUUgPSAyLjU3NiBcdGltZXMgNCA9IDEwLjMwNCQkDQoNCiQkQ0kgPSAyMTAgXHBtIDEwLjMwNCA9IFsxOTkuNjk2LFw7IDIyMC4zMDRdJCQNCg0KIyMjIFRJTSBCIChVamktdCwgZGYgPSAzNSkNCg0KKiBJbnRlcnZhbCBLZXBlcmNheWFhbiA5MCUNCg0KJHRfezAuMDUsMzV9IFxhcHByb3ggMS42OTAkDQoNCiQkTUUgPSAxLjY5MCBcdGltZXMgNCA9IDYuNzYkJA0KDQokJENJID0gMjEwIFxwbSA2Ljc2ID0gWzIwMy4yNCxcOyAyMTYuNzZdJCQNCg0KKiBJbnRlcnZhbCBLZXBlcmNheWFhbiA5NSUNCg0KJHRfezAuMDI1LDM1fSBcYXBwcm94IDIuMDMwJA0KDQokJE1FID0gMi4wMzAgXHRpbWVzIDQgPSA4LjEyJCQNCg0KJCRDSSA9IDIxMCBccG0gOC4xMiA9IFsyMDEuODgsXDsgMjE4LjEyXSQkDQoNCiogSW50ZXJ2YWwgS2VwZXJjYXlhYW4gOTklDQoNCiR0X3swLjAwNSwzNX0gXGFwcHJveCAyLjcyNCQNCg0KJCRNRSA9IDIuNzI0IFx0aW1lcyA0ID0gMTAuODk2JCQNCg0KJCRDSSA9IDIxMCBccG0gMTAuODk2ID0gWzE5OS4xMDQsXDsgMjIwLjg5Nl0kJA0KDQojIyMgUmluZ2thc2FuDQoNCipUaW0gQSAoWik6KiANCg0KQ0kgOTAlIFsyMDMuNDIsIDIxNi41OF0sIENJIDk1JSBbMjAyLjE2LCAyMTcuODRdLCBDSSA5OSUgWzE5OS43MCwgMjIwLjMwXQ0KDQoqVGltIEIgKHQpOioNCg0KQ0kgOTAlIFsyMDMuMjQsIDIxNi43Nl0sIENJIDk1JSBbMjAxLjg4LCAyMTguMTJdLCBDSSA5OSUgWzE5OS4xMCwgMjIwLjkwXQ0KDQotLS0NCg0KIyMgVmlzdWFsaXNhc2kgUGVyYmFuZGluZ2FuIEludGVydmFsDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQojIERhdGEgdW50dWsgcGxvdHRpbmcNCnRpbmdrYXQgPC0gYygiOTAlIiwgIjk1JSIsICI5OSUiKQ0KDQojIFRpbSBBIChaKQ0KYmF3YWhfQSA8LSBjKDIwMy40MiwgMjAyLjE2LCAxOTkuNzApDQphdGFzX0EgPC0gYygyMTYuNTgsIDIxNy44NCwgMjIwLjMwKQ0KDQojIFRpbSBCICh0KQ0KYmF3YWhfQiA8LSBjKDIwMy4yNCwgMjAxLjg4LCAxOTkuMTApDQphdGFzX0IgPC0gYygyMTYuNzYsIDIxOC4xMiwgMjIwLjkwKQ0KDQojIFBsb3QNCnBsb3QoMSwgdHlwZSA9ICJuIiwgDQogICAgIHhsaW0gPSBjKDE5OCwgMjIzKSwgDQogICAgIHlsaW0gPSBjKDAsIDcpLA0KICAgICB4bGFiID0gIkxhdGVuIEFQSSAobXMpIiwgDQogICAgIHlsYWIgPSAiVGluZ2thdCBLZXBlcmNheWFhbiAmIE1ldG9kZSIsDQogICAgIHlheHQgPSAibiIsDQogICAgIG1haW4gPSAiUGVyYmFuZGluZ2FuIENJOiBVamktWiB2cyBVamktdCAobj0zNiwgeMyEPTIxMCkiKQ0KDQojIFRhbWJhaCBnYXJpcyByYXRhLXJhdGENCmFibGluZSh2ID0gMjEwLCBjb2wgPSAiZ3JheSIsIGx0eSA9IDIsIGx3ZCA9IDEpDQp0ZXh0KDIxMCwgNi44LCAieMyEID0gMjEwIiwgY29sID0gImdyYXkiLCBjZXggPSAwLjgpDQoNCiMgUGxvdCBUaW0gQSAoWikgLSBwb3Npc2kgeSBsZWJpaCB0aW5nZ2kNCmZvcihpIGluIDE6Mykgew0KICB5X3Bvc19BIDwtIDYgLSAoaS0xKSowLjgNCiAgbGluZXMoYyhiYXdhaF9BW2ldLCBhdGFzX0FbaV0pLCBjKHlfcG9zX0EsIHlfcG9zX0EpLCBjb2wgPSAiI0U3NEMzQyIsIGx3ZCA9IDMpDQogIHBvaW50cyhiYXdhaF9BW2ldLCB5X3Bvc19BLCBjb2wgPSAiI0U3NEMzQyIsIHBjaCA9ICJ8IiwgY2V4ID0gMS41KQ0KICBwb2ludHMoYXRhc19BW2ldLCB5X3Bvc19BLCBjb2wgPSAiI0U3NEMzQyIsIHBjaCA9ICJ8IiwgY2V4ID0gMS41KQ0KICB0ZXh0KChiYXdhaF9BW2ldK2F0YXNfQVtpXSkvMiwgeV9wb3NfQSArIDAuMTUsICJaIiwgY29sID0gIiNFNzRDM0MiLCBjZXggPSAwLjgpDQp9DQoNCiMgUGxvdCBUaW0gQiAodCkgLSBwb3Npc2kgeSBsZWJpaCByZW5kYWgNCmZvcihpIGluIDE6Mykgew0KICB5X3Bvc19CIDwtIDMgLSAoaS0xKSowLjgNCiAgbGluZXMoYyhiYXdhaF9CW2ldLCBhdGFzX0JbaV0pLCBjKHlfcG9zX0IsIHlfcG9zX0IpLCBjb2wgPSAiIzM0OThEQiIsIGx3ZCA9IDMpDQogIHBvaW50cyhiYXdhaF9CW2ldLCB5X3Bvc19CLCBjb2wgPSAiIzM0OThEQiIsIHBjaCA9ICJ8IiwgY2V4ID0gMS41KQ0KICBwb2ludHMoYXRhc19CW2ldLCB5X3Bvc19CLCBjb2wgPSAiIzM0OThEQiIsIHBjaCA9ICJ8IiwgY2V4ID0gMS41KQ0KICB0ZXh0KChiYXdhaF9CW2ldK2F0YXNfQltpXSkvMiwgeV9wb3NfQiArIDAuMTUsICJ0IiwgY29sID0gIiMzNDk4REIiLCBjZXggPSAwLjgpDQp9DQoNCiMgTGFiZWwgc3VtYnUgeQ0KYXhpcygyLCBhdCA9IGMoNS42LCA0LjgsIDQuMCwgMi42LCAxLjgsIDEuMCksIA0KICAgICBsYWJlbHMgPSBjKCJaLTkwJSIsICJaLTk1JSIsICJaLTk5JSIsICJ0LTkwJSIsICJ0LTk1JSIsICJ0LTk5JSIpLA0KICAgICBsYXMgPSAxLCBjZXguYXhpcyA9IDAuOCkNCg0KIyBHcmlkDQpncmlkKCkNCg0KIyBMZWdlbmRhDQpsZWdlbmQoInRvcHJpZ2h0IiwgDQogICAgICAgbGVnZW5kID0gYygiVWppLVogKM+DIGRpa2V0YWh1aSkiLCAiVWppLXQgKM+DIHRpZGFrIGRpa2V0YWh1aSkiLCAiUmF0YS1yYXRhIiksDQogICAgICAgY29sID0gYygiI0U3NEMzQyIsICIjMzQ5OERCIiwgImdyYXkiKSwNCiAgICAgICBsdHkgPSBjKDEsIDEsIDIpLA0KICAgICAgIGx3ZCA9IGMoMywgMywgMSksDQogICAgICAgY2V4ID0gMC44KQ0KDQpgYGANCg0KLS0tDQoNCioqSW50ZXJwcmV0YXNpIFZpc3VhbDoqKg0KDQoqIFVudHVrIHNldGlhcCB0aW5na2F0IGtlcGVyY2F5YWFuLCBpbnRlcnZhbCBVamktdCBsZWJpaCBsZWJhciBkYXJpcGFkYSBVamktWg0KDQoqIFBlcmJlZGFhbiBsZWJhciBzZW1ha2luIHRlcmxpaGF0IHBhZGEgQ0kgOTUlIGRhbiA5OSUNCg0KKiBTZW11YSBpbnRlcnZhbCBiZXJwdXNhdCBkaSBzZWtpdGFyIHJhdGEtcmF0YSAyMTAgbXMNCg0KKiBEaXN0cmlidXNpIHQgbWVtYmVyaWthbiBlc3RpbWFzaSB5YW5nIGxlYmloIGtvbnNlcnZhdGlmIChpbnRlcnZhbCBsZWJpaCBsZWJhcikga2FyZW5hIG1lbmdha3VpIGtldGlkYWtwYXN0aWFuIHRhbWJhaGFuIGRhcmkgZXN0aW1hc2kgz4MNCg0KIyMgTWVuZ2FwYSBMZWJhciBJbnRlcnZhbCBCZXJiZWRhIE1lc2tpcHVuIERhdGEgU2VydXBhDQoNCjEuIFN1bWJlciBQZXJiZWRhYW46DQoNCiogVGltIEEgbWVuZ2V0YWh1aSDPgyBwb3B1bGFzaSDihpIgbWVuZ2d1bmFrYW4gZGlzdHJpYnVzaSBub3JtYWwgKFopDQoqIFRpbSBCIHRpZGFrIG1lbmdldGFodWkgz4Mg4oaSIG1lbmdndW5ha2FuIGRpc3RyaWJ1c2kgdC1TdHVkZW50DQoNCjIuIERpc3RyaWJ1c2kgdCBsZWJpaCBrb25zZXJ2YXRpZjoNCg0KRGlzdHJpYnVzaSB0IG1lbWlsaWtpIGVrb3IgbGViaWggdGViYWwgZGFyaXBhZGEgZGlzdHJpYnVzaSBub3JtYWwsIHNlaGluZ2dhIG5pbGFpIGtyaXRpcyAgJHRfe1xhbHBoYS8yfSA+IHpfe1xhbHBoYS8yfSQgIHVudHVrIGRlcmFqYXQga2ViZWJhc2FuIHRlcmJhdGFzLg0KDQozIEVmZWsgcGFkYSBDSToNCg0KKiAkdF97MC4wMjUsMzV9IFxhcHByb3ggMi4wMzAgPiB6X3swLjAyNX0gPSAxLjk2JA0KKiAkMC4wMDUsMzV9IFxhcHByb3ggMi43MjQgPiB6X3swLjAwNX0gPSAyLjU3NiQNCipTZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuLCBwZXJiZWRhYW4gc2VtYWtpbiBqZWxhcy4NCg0KNC4gQWxhc2FuIGZpbG9zb2ZpczoNCg0KVWppLXQgbWVuZ2FrdWkga2V0aWRha3Bhc3RpYW4gdGFtYmFoYW4ga2FyZW5hIM+DIGRpZXN0aW1hc2kgZGFyaSBzYW1wZWwsIHNlaGluZ2dhIGludGVydmFsIGRpYnVhdCBsZWJpaCBsZWJhciB1bnR1ayBrb21wZW5zYXNpLg0KDQo1LiBLb252ZXJnZW5zaToNCg0KVW50dWsgbiBiZXNhciAoYmlhc2FueWEgPiAzMCksIGRpc3RyaWJ1c2kgdCDiiYggbm9ybWFsLiBOYW11biBkZW5nYW4gbj0zNiwgcGVyYmVkYWFuIG1hc2loIHRlcmxpaGF0LCB0ZXJ1dGFtYSBwYWRhIENJIDk5JS4NCg0KKipLZXNpbXB1bGFuOioqDQoNClBlcmJlZGFhbiBsZWJhciBpbnRlcnZhbCBiZXJhc2FsIGRhcmkga2V0aWRha3Bhc3RpYW4gdGFtYmFoYW4gZGFsYW0gZXN0aW1hc2kgz4MgcGFkYSB1amktdCwgeWFuZyBkaXJlcHJlc2VudGFzaWthbiBtZWxhbHVpIGRpc3RyaWJ1c2kgZGVuZ2FuIGVrb3IgbGViaWggdGViYWwuDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgU3R1ZGkgS2FzdXMgNQ0KDQoqKmludGVydmFsIEtlcGVyY2F5YWFuIFNhdHUgU2lzaToqKiBTZWJ1YWggcGVydXNhaGFhbiAqKlNvZnR3YXJlIGFzIGEgU2VydmljZSAoU2FhUykqKiBpbmdpbiBtZW1hc3Rpa2FuIGJhaHdhICoqbWluaW1hbCA3MCUgcGVuZ2d1bmEgYWt0aWYgbWluZ2d1YW4qKiBtZW1hbmZhYXRrYW4gZml0dXIgcHJlbWl1bS4NCg0KRGFyaSBla3NwZXJpbWVuOg0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDI1MCBccXVhZCBcdGV4dHsodG90YWwgcGVuZ2d1bmEpfSBcXA0KeCAmPSYgMTg1IFxxdWFkIFx0ZXh0eyhwZW5nZ3VuYSBwcmVtaXVtIGFrdGlmKX0NClxlbmR7ZXFuYXJyYXkqfQ0KJCQNCg0KTWFuYWplbWVuIGhhbnlhIHRlcnRhcmlrIHBhZGEgKipiYXRhcyBiYXdhaCoqIGRhcmkgcGVya2lyYWFuLg0KDQoqKlR1Z2FzOioqDQoNCjEuICBJZGVudGlmaWthc2kgKipKZW5pcyBJbnRlcnZhbCBLZXBlcmNheWFhbioqIGRhbiB1amkgeWFuZyB0ZXBhdC4NCjIuICBIaXR1bmcgKipJbnRlcnZhbCBLZXBlcmNheWFhbiBzYXR1IHNpc2kgKGJhdGFzIGJhd2FoKSoqIHVudHVrOg0KICAgIC0gJDkwXCUkDQogICAgLSAkOTVcJSQNCiAgICAtICQ5OVwlJA0KMy4gIFZpc3VhbGlzYXNpa2FuIGJhdGFzIGJhd2FoIHVudHVrIHNlbXVhIHRpbmdrYXQga2VwZXJjYXlhYW4uDQo0LiAgVGVudHVrYW4gYXBha2FoICoqdGFyZ2V0IDcwJSoqIHRlcnBlbnVoaSBzZWNhcmEgc3RhdGlzdGlrLg0KDQoqKkphd2FiOioqDQoNCiMjIEplbmlzIEludGVydmFsIEtlcGVyY2F5YWFuIGRhbiBVamkgU3RhdGlzdGlrDQoNCiogSmVuaXMgSW50ZXJ2YWw6IEludGVydmFsIGtlcGVyY2F5YWFuIHNhdHUgc2lzaSAob25lLXNpZGVkKSBraHVzdXNueWEgYmF0YXMgYmF3YWggKGxvd2VyIGJvdW5kKQ0KDQoqIEFsYXNhbjogTWFuYWplbWVuIGhhbnlhIGluZ2luIG1lbmdldGFodWkgbmlsYWkgbWluaW1hbCBwcm9wb3JzaSBwZW5nZ3VuYSB5YW5nIG1lbWFuZmFhdGthbiBmaXR1ciBwcmVtaXVtDQoNCiogVWppIFN0YXRpc3RpazogVWppLVogdW50dWsgcHJvcG9yc2kga2FyZW5hIHNhbXBlbCBiZXNhciAobj0yNTApIGRhbiBtZW5nZXN0aW1hc2kgcHJvcG9yc2kgcG9wdWxhc2kNCg0KKipSdW11cyB1bXVtOioqDQoNCiQkXGhhdHtwfSAtIHpfe1xhbHBoYX0gXHRpbWVzIFNFICAoaGFueWEgYmF0YXMgYmF3YWgpJCQNCg0KIyMgTWVuZ2hpdHVuZyBJbnRlcnZhbCBLZXBlcmNheWFhbiBTYXR1IFNpc2kgKEJhdGFzIEJhd2FoKQ0KDQoqKkRpa2V0YWh1aToqKg0KDQokJG4gPSAyNTAsXHF1YWQgeCA9IDE4NSxccXVhZCBcaGF0e3B9ID0gXGZyYWN7MTg1fXsyNTB9ID0gMC43NCQkDQoNCiQkU0UgPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSA9IFxzcXJ0e1xmcmFjezAuNzQgXHRpbWVzIDAuMjZ9ezI1MH19ID0gXHNxcnR7XGZyYWN7MC4xOTI0fXsyNTB9fSA9IFxzcXJ0ezAuMDAwNzY5Nn0gXGFwcHJveCAwLjAyNzc0JCQNCg0KIyMjIEJhdGFzIGJhd2FoIDkwJQ0KDQokel97MC4xMH0gPSAxLjI4MiQNCiQkTEIgPSAwLjc0IC0gMS4yODIgXHRpbWVzIDAuMDI3NzQgPSAwLjc0IC0gMC4wMzU1NiA9IDAuNzA0NDQNCuKJiCAwLjcwNCQkDQoNCiMjIyBCYXRhcyBiYXdhaCA5NSUNCg0KJHpfezAuMDV9ID0gMS42NDUkDQokJExCID0gMC43NCAtIDEuNjQ1IFx0aW1lcyAwLjAyNzc0ID0gMC43NCAtIDAuMDQ1NjMgPSAwLjY5NDM3DQriiYggMC42OTQkJA0KDQojIyMgQmF0YXMgYmF3YWggOTklDQoNCiR6X3swLjAxfSA9IDIuMzI2JA0KJCRMQiA9IDAuNzQgLSAyLjMyNiBcdGltZXMgMC4wMjc3NCA9IDAuNzQgLSAwLjA2NDUzID0gMC42NzU0Nw0K4omIIDAuNjc1JCQNCg0KKipSaW5na2FzYW46KioNCg0KKiA5MCUgTEI6IDAuNzA0IChraXRhIDkwJSB5YWtpbiBwcm9wb3JzaSBzZWJlbmFybnlhIOKJpSA3MC40JSkNCiogOTUlIExCOiAwLjY5NCAoa2l0YSA5NSUgeWFraW4gcHJvcG9yc2kgc2ViZW5hcm55YSDiiaUgNjkuNCUpDQoqIDk5JSBMQjogMC42NzUgKGtpdGEgOTklIHlha2luIHByb3BvcnNpIHNlYmVuYXJueWEg4omlIDY3LjUlKQ0KDQojIyBWaXN1YWxpc2FzaSBCYXRhcyBCYXdhaCBVbnR1ayBTZW11YSBUaW5na2F0IEtlcGVyY2F5YWFuDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KIyBEYXRhDQp0aW5na2F0IDwtIGMoIjkwJSIsICI5NSUiLCAiOTklIikNCmJhdGFzX2Jhd2FoIDwtIGMoMC43MDQsIDAuNjk0LCAwLjY3NSkNCnRhcmdldCA8LSAwLjcwDQpwcm9wX3NhbXBlbCA8LSAwLjc0DQoNCiMgUGxvdA0KcGxvdCgxLCB0eXBlID0gIm4iLCANCiAgICAgeGxpbSA9IGMoMC42NiwgMC43OCksIA0KICAgICB5bGltID0gYygwLjUsIDMuNSksDQogICAgIHhsYWIgPSAiUHJvcG9yc2kgUGVuZ2d1bmEgUHJlbWl1bSIsIA0KICAgICB5bGFiID0gIlRpbmdrYXQgS2VwZXJjYXlhYW4iLA0KICAgICB5YXh0ID0gIm4iLA0KICAgICBtYWluID0gIkludGVydmFsIEtlcGVyY2F5YWFuIFNhdHUgU2lzaSAoQmF0YXMgQmF3YWgpXG5uPTI1MCwgeD0xODUsIHDMgj0wLjc0IikNCg0KIyBHYXJpcyB2ZXJ0aWthbCB1bnR1ayB0YXJnZXQgZGFuIHByb3BvcnNpIHNhbXBlbA0KYWJsaW5lKHYgPSB0YXJnZXQsIGNvbCA9ICJyZWQiLCBsdHkgPSAyLCBsd2QgPSAxLjUpDQp0ZXh0KHRhcmdldCwgMy4zLCAiVGFyZ2V0IDcwJSIsIGNvbCA9ICJyZWQiLCBjZXggPSAwLjgsIHBvcyA9IDQpDQoNCmFibGluZSh2ID0gcHJvcF9zYW1wZWwsIGNvbCA9ICJibHVlIiwgbHR5ID0gMiwgbHdkID0gMS41KQ0KdGV4dChwcm9wX3NhbXBlbCwgMy4zLCAicMyCID0gMC43NCIsIGNvbCA9ICJibHVlIiwgY2V4ID0gMC44LCBwb3MgPSAyKQ0KDQojIFBsb3QgYmF0YXMgYmF3YWggKGhhbnlhIGJhZ2lhbiBraXJpKQ0KZm9yKGkgaW4gMTozKSB7DQogICMgR2FyaXMgZGFyaSBiYXRhcyBiYXdhaCBrZSBtYWtzaW11bQ0KICBsaW5lcyhjKGJhdGFzX2Jhd2FoW2ldLCAwLjc4KSwgYyhpLCBpKSwgY29sID0gIiMyRUNDNzEiLCBsd2QgPSAzKQ0KICAjIFRpdGlrIGJhdGFzIGJhd2FoDQogIHBvaW50cyhiYXRhc19iYXdhaFtpXSwgaSwgY29sID0gImRhcmtncmVlbiIsIHBjaCA9ICJ8IiwgY2V4ID0gMikNCiAgIyBMYWJlbCBiYXRhcyBiYXdhaA0KICB0ZXh0KGJhdGFzX2Jhd2FoW2ldLCBpIC0gMC4yLCByb3VuZChiYXRhc19iYXdhaFtpXSwgMyksIGNleCA9IDAuOCwgY29sID0gImRhcmtncmVlbiIpDQogICMgQXJlYSBhbWFuIChraXJpIGRhcmkgZ2FyaXMgdGFyZ2V0KQ0KICBpZihiYXRhc19iYXdhaFtpXSA+IHRhcmdldCkgew0KICAgIGxpbmVzKGModGFyZ2V0LCBiYXRhc19iYXdhaFtpXSksIGMoaSwgaSksIGNvbCA9ICJncmVlbiIsIGx3ZCA9IDUpDQogIH0NCn0NCg0KIyBTdW1idSB5DQpheGlzKDIsIGF0ID0gMTozLCBsYWJlbHMgPSB0aW5na2F0LCBsYXMgPSAxKQ0KDQojIEdyaWQNCmdyaWQoKQ0KDQojIExlZ2VuZGENCmxlZ2VuZCgiYm90dG9tbGVmdCIsIA0KICAgICAgIGxlZ2VuZCA9IGMoIkJhdGFzIGJhd2FoIENJIiwgIlRhcmdldCA3MCUiLCAiUHJvcG9yc2kgc2FtcGVsIChwzIIpIiwgIkFyZWEg4omlIHRhcmdldCIpLA0KICAgICAgIGNvbCA9IGMoImRhcmtncmVlbiIsICJyZWQiLCAiYmx1ZSIsICJncmVlbiIpLA0KICAgICAgIGx0eSA9IGMoTkEsIDIsIDIsIDEpLA0KICAgICAgIHBjaCA9IGMoInwiLCBOQSwgTkEsIE5BKSwNCiAgICAgICBsd2QgPSBjKE5BLCAxLjUsIDEuNSwgMyksDQogICAgICAgY2V4ID0gMC44KQ0KDQpgYGANCg0KLS0tDQoNCioqSW50ZXJwcmV0YXNpIFZpc3VhbDoqKg0KDQoqIFNldGlhcCBnYXJpcyBoaWphdSBtZW51bmp1a2thbiBhcmVhIG5pbGFpIHlhbmcgbXVuZ2tpbiB1bnR1ayBwcm9wb3JzaSBzZWJlbmFybnlhIChkYXJpIGJhdGFzIGJhd2FoIHNhbXBhaSAxKQ0KDQoqIEJhdGFzIGJhd2FoIDkwJSAoMC43MDQpIGRpIGF0YXMgdGFyZ2V0IDcwJSDihpIgYXJlYSBoaWphdSB0ZWJhbCBtZW51bmp1a2thbiBrZXBhc3RpYW4g4omlNzAlDQoNCiogQmF0YXMgYmF3YWggOTUlICgwLjY5NCkgZGFuIDk5JSAoMC42NzUpIGJlcmFkYSBkaSBiYXdhaCBhdGF1IGRpIHNla2l0YXIgdGFyZ2V0IOKGkiBrZXlha2luYW4gbGViaWggcmVuZGFoDQoNCiogU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiwgYmF0YXMgYmF3YWggc2VtYWtpbiByZW5kYWggKGxlYmloIGtvbnNlcnZhdGlmKQ0KDQojIyBNZW5lbnR1a2FuIEFwYWthaCBUYXJnZXQgNzAlIFRlcnBlbnVoaSBTZWNhcmEgU3RhdGlzdGlrDQoNCjQuIFRlbnR1a2FuIEFwYWthaCBUYXJnZXQgNzAlIFRlcnBlbnVoaSBTZWNhcmEgU3RhdGlzdGlrDQoNCioqQW5hbGlzaXMgcGVyIHRpbmdrYXQga2VwZXJjYXlhYW46KioNCg0KMS4gUGFkYSBDSSA5MCU6DQoNCiogQmF0YXMgYmF3YWggPSAwLjcwNCA+IDAuNzANCiog4pyFIFRhcmdldCB0ZXJwZW51aGkg4oCTIGtpdGEgOTAlIHlha2luIHByb3BvcnNpIHNlYmVuYXJueWEg4omlIDcwLjQlDQoNCjIuIFBhZGEgQ0kgOTUlOg0KDQoqIEJhdGFzIGJhd2FoID0gMC42OTQgPCAwLjcwDQoqIOKdjCBUYXJnZXQgdGlkYWsgdGVycGVudWhpIOKAkyBkZW5nYW4ga2V5YWtpbmFuIDk1JSwgcHJvcG9yc2kgc2ViZW5hcm55YSBiaXNhIHNlcmVuZGFoIDY5LjQlDQoNCjMuIFBhZGEgQ0kgOTklOg0KDQoqIEJhdGFzIGJhd2FoID0gMC42NzUgPCAwLjcwDQoqIOKdjCBUYXJnZXQgdGlkYWsgdGVycGVudWhpIOKAkyBkZW5nYW4ga2V5YWtpbmFuIDk5JSwgcHJvcG9yc2kgc2ViZW5hcm55YSBiaXNhIHNlcmVuZGFoIDY3LjUlDQoNCioqS2VzaW1wdWxhbiBwcmFrdGlzOioqDQoNCiogSmlrYSBwZXJ1c2FoYWFuIGJlcnNlZGlhIG1lbmVyaW1hIHJpc2lrbyAxMCUgKENJIDkwJSksIHRhcmdldCB0ZXJjYXBhaS4NCiogSmlrYSBtZW5nZ3VuYWthbiBzdGFuZGFyIGluZHVzdHJpIENJIDk1JSwgdGFyZ2V0IGJlbHVtIHRlcmNhcGFpLg0KKiBVbnR1ayBrZXBhc3RpYW4gdGluZ2dpIChDSSA5OSUpLCBtYXNpaCBwZXJsdSBwZW5pbmdrYXRhbiBmaXR1ciBwcmVtaXVtLg0KDQoqKlJla29tZW5kYXNpOioqDQoNCkRlbmdhbiBwcm9wb3JzaSBzYW1wZWwgNzQlLCBwZXJ1c2FoYWFuIHNlYmFpa255YToNCg0KMS4gVGFtYmFoa2FuIHNhbXBlbCB1bnR1ayBtZW1wZXJrZWNpbCBzdGFuZGFyIGVycm9yDQoyLiBUaW5na2F0a2FuIGt1YWxpdGFzIGZpdHVyIHByZW1pdW0gYWdhciBsZWJpaCBtZW5hcmlrDQozLiBQZXJ0aW1iYW5na2FuIHRvbGVyYW5zaSByaXNpa28g4oCTIGppa2EgcmlzaWtvIDEwJSBkYXBhdCBkaXRlcmltYSwga2xhaW0gdGFyZ2V0IHRlcnBlbnVoaQ0KDQo8L2Rpdj4gDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIEtlc2ltcHVsYW4gZGFuIFJlZmVyZW5zaQ0KDQpJbnRlcnZhbCBrZXBlcmNheWFhbiBtZXJ1cGFrYW4gY2VybWluYW4gdHJhZGUtb2ZmIGFudGFyYSBwcmVzaXNpIGRhbiBrZXlha2luYW7igJRzZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuLCBpbnRlcnZhbCBzZW1ha2luIGxlYmFyIG5hbXVuIGtleWFraW5hbiBzZW1ha2luIGJlc2FyLiBTYW1wZWwga2VjaWwgYXRhdSBrZXRpZGFrcGFzdGlhbiBwYXJhbWV0ZXIgKHNlcGVydGkgz4MgdGlkYWsgZGlrZXRhaHVpKSBtZWxlYmFya2FuIGludGVydmFsLCBzZW1lbnRhcmEgc2FtcGVsIGJlc2FyIG1lbXBlcnNlbXBpdG55YS4gRGFsYW0gcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHByb2R1ayAoc2VwZXJ0aSBBL0IgdGVzdGluZyksIENJIDk1JSB1bXVtIGRpZ3VuYWthbiBzZWJhZ2FpIHN0YW5kYXIsIHRldGFwaSBwaWxpaGFuIHRpbmdrYXQga2VwZXJjYXlhYW4gaGFydXMgZGlzZXN1YWlrYW4gZGVuZ2FuIHJpc2lrbyBiaXNuaXM6IENJIDk5JSB1bnR1ayBwZXJ1YmFoYW4gYmVyaXNpa28gdGluZ2dpLCBDSSA5MCUgdW50dWsgZWtzcGxvcmFzaSBjZXBhdC4NCg0KKiBDYXNlbGxhLCBHLiwgJiBCZXJnZXIsIFIuIEwuICgyMDIxKS4gU3RhdGlzdGljYWwgSW5mZXJlbmNlICgybmQgZWQuKS4gQ2VuZ2FnZSBMZWFybmluZy4NCihCYWIgN+KAkzEwOiBFc3RpbWF0aW9uIGFuZCBDb25maWRlbmNlIEludGVydmFscykNCg0KKiBNb29yZSwgRC4gUy4sIE1jQ2FiZSwgRy4gUC4sICYgQ3JhaWcsIEIuIEEuICgyMDIxKS4gSW50cm9kdWN0aW9uIHRvIHRoZSBQcmFjdGljZSBvZiBTdGF0aXN0aWNzICgxMHRoIGVkLikuIFcuSC4gRnJlZW1hbi4NCihCYWIgNuKAkzg6IEludHJvZHVjdGlvbiB0byBJbmZlcmVuY2UsIEluZmVyZW5jZSBmb3IgUHJvcG9ydGlvbnMpDQoNCiogV2Fzc2VybWFuLCBMLiAoMjAxMykuIEFsbCBvZiBTdGF0aXN0aWNzOiBBIENvbmNpc2UgQ291cnNlIGluIFN0YXRpc3RpY2FsIEluZmVyZW5jZS4gU3ByaW5nZXIuDQooQ2hhcHRlciA3OiBDb25maWRlbmNlIEludGVydmFscywgQ2hhcHRlciA5OiBIeXBvdGhlc2lzIFRlc3RpbmcpDQoNCiogS29oYXZpLCBSLiwgVGFuZywgRC4sICYgWHUsIFkuICgyMDIwKS4gVHJ1c3R3b3J0aHkgT25saW5lIENvbnRyb2xsZWQgRXhwZXJpbWVudHM6IEEgUHJhY3RpY2FsIEd1aWRlIHRvIEEvQiBUZXN0aW5nLiBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcy4NCihDaGFwdGVyIDM6IENvbmZpZGVuY2UgSW50ZXJ2YWxzIGluIEV4cGVyaW1lbnRhdGlvbikNCg0KKiBXaWNraGFtLCBILiwgJiBHcm9sZW11bmQsIEcuICgyMDE3KS4gUiBmb3IgRGF0YSBTY2llbmNlLiBPJ1JlaWxseSBNZWRpYS4NCihDaGFwdGVyIDE1OiBDb25maWRlbmNlIEludGVydmFscyB3aXRoIGJyb29tIHBhY2thZ2UpDQoNCiogS2FiYWNvZmYsIFIuIEkuICgyMDIyKS4gUiBpbiBBY3Rpb246IERhdGEgQW5hbHlzaXMgYW5kIEdyYXBoaWNzIHdpdGggUiBhbmQgVGlkeXZlcnNlICgzcmQgZWQuKS4gTWFubmluZyBQdWJsaWNhdGlvbnMuDQooQ2hhcHRlciA3OiBCYXNpYyBTdGF0aXN0aWNzLCBTZWN0aW9uIDcuMzogQ29uZmlkZW5jZSBJbnRlcnZhbHMpDQoNCiogUmllcywgRS4gKDIwMTEpLiBUaGUgTGVhbiBTdGFydHVwOiBIb3cgVG9kYXkncyBFbnRyZXByZW5ldXJzIFVzZSBDb250aW51b3VzIElubm92YXRpb24gdG8gQ3JlYXRlIFJhZGljYWxseSBTdWNjZXNzZnVsIEJ1c2luZXNzZXMuIENyb3duIEJ1c2luZXNzLg0KKEJhYiA4OiBNZWFzdXJlIOKAkyBtZW5nZ3VuYWthbiBtZXRyaWsgZGFuIGludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrIHZhbGlkYXNpKQ0KDQoqIFNpcm9rZXIsIEQuLCAmIEtvb21lbiwgUC4gKDIwMTMpLiBBL0IgVGVzdGluZzogVGhlIE1vc3QgUG93ZXJmdWwgV2F5IHRvIFR1cm4gQ2xpY2tzIEludG8gQ3VzdG9tZXJzLiBXaWxleS4NCihDaGFwdGVyIDU6IFN0YXRpc3RpY2FsIFNpZ25pZmljYW5jZSBhbmQgQ29uZmlkZW5jZSBJbnRlcnZhbHMpDQoNCiogaHR0cHM6Ly9ycHVicy5jb20vZHNjaWVuY2VsYWJzLzEzODEwMTQNCg0KPC9kaXY+IA==