Study Cases

Confidence Interval ~ Week 13


M. Yustian Putra Muhadi

Institut Tekonologi Sains Bandung


1 Case Study 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{(deviasi standar populasi)} \\ n &=& 100 \quad \text{(ukuran sampel)} \\ \bar{x} &=& 12.6 \quad \text{(rata-rata sampel)} \end{eqnarray*} \]

Tugas:

  1. Identifikasi uji statistik yang tepat dan berikan justifikasi atas pilihan Anda.
  2. Hitung Interval Kepercayaan untuk:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Buat visualisasi perbandingan dari ketiga interval kepercayaan tersebut.
  4. Interpretasikan hasilnya dalam konteks analitik bisnis.

1.1 Uji Statistik yang Tepat & Justifikasi

Karena:

  • Ukuran sampel n=100 besar (≥30) → CLT berlaku.

  • Simpangan baku populasi σ diketahui.

  • Ingin membuat interval kepercayaan untuk rata-rata populasi μ.

Maka uji statistik yang tepat adalah Z-test untuk rata-rata dengan menggunakan distribusi normal standar (Z).

Justifikasi:

  • σ diketahui → gunakan Z, bukan t.

  • Rumus interval kepercayaan:

\[ \bar{x} \pm Z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}} \]


1.2 Perhitungan Confidence Interval

Standard Error (SE):

Rumus umum:

\[ ME = \pm Z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}} \] \[ SE = \frac{\sigma}{\sqrt{n}}= \frac{3.2}{\sqrt{100}}= 0.32 \]

  • 90% Confidence Interval:

\[ Z_{0.05}=1.645 \]

\[ ME=1.645×0.32=0.5264 \]

\[ CI_{90\%} = (12.0736,\; 13.1264) \]

  • 95% Confidence Interval:

\[ Z_{0.025}=1.96 \]

\[ ME=1.96×0.32=0.6272 \]

\[ CI_{95\%} = (11.9728,\; 13.2272) \]

  • 99% Confidence Interval:

\[ Z_{0.005}=2.576 \]

\[ ME=2.576×0.32=0.8243 \]

\[ CI_{99\%} = (11.7757,\; 13.4243) \]

Ringkasan numerik:

Confidence Level Z-value Margin of Error Lower Upper
90% 1.645 0.526 12.074 13.126
95% 1.960 0.627 11.973 13.227
99% 2.576 0.824 11.776 13.424

1.3 visualisasi

Grafik yang ditampilkan menunjukkan:

  • Setiap garis horizontal = satu confidence interval.

  • Titik di tengah = sample mean (12.6).

  • Interval 99% paling lebar, 90% paling sempit.

Ini menggambarkan trade-off antara tingkat kepercayaan dan presisi.


1.4 Interpretasi Business Analytics

  • Dengan 90% keyakinan, rata-rata transaksi harian per user berada di sekitar 12.07 – 13.13 transaksi.

  • Dengan 95% keyakinan, rentangnya sedikit lebih lebar: 11.97 – 13.23.

  • Dengan 99% keyakinan, estimasi paling konservatif: 11.78 – 13.42.

Implikasi Bisnis:

  • Jika keputusan operasional membutuhkan presisi tinggi (misalnya kapasitas server jangka pendek), CI 90% bisa digunakan.

  • Untuk keputusan strategis (forecast pendapatan, evaluasi fitur baru), CI 95% atau 99% lebih aman.

  • Karena seluruh interval berada di atas angka 12, ini menunjukkan fitur baru kemungkinan meningkatkan aktivitas transaksi pengguna.

2 Case Study 2

Interval Kepercayaan untuk Rata-rata, \(\sigma\) Tidak Diketahui: Sebuah tim Riset 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:

  1. Identifikasi uji statistik yang tepat dan jelaskan alasannya.
  2. itung Interval Kepercayaan untuk:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Visualisasikan ketiga interval tersebut dalam satu plot.
  4. Jelaskan bagaimana ukuran sampel dan tingkat kepercayaan memengaruhi lebar interval.

2.1 Identifikasi uji statistik yang tepat dan jelaskan alasannya

Confidence Interval (CI) digunakan untuk mengestimasi rentang nilai rata-rata populasi berdasarkan data sampel. Pada kasus ini, standar deviasi populasi (σ) tidak diketahui dan ukuran sampel kecil (n < 30), sehingga digunakan distribusi t-Student.

Rumus umum:

\[ CI = \bar{x} \pm t_{\alpha/2,df}\left(\frac{s}{\sqrt{n}}\right) \]

Dimana:

  • \(\bar{x}\) = rata-rata sampel.

  • 𝑠= standar deviasi sampel.

  • 𝑛= ukuran sampel.

  • 𝑑𝑓=𝑛−1

  • \(t_{\alpha/2,df}\) = nilai kritis distribusi t.

Uji Statistik Yang Digunakan:

  • One-Sample t Confidence Interval.

Alasan:

  • Simpangan baku populasi (σ) tidak diketahui.

  • Ukuran sampel kecil (n = 12 < 30).

  • Data diasumsikan berasal dari populasi yang mendekati distribusi normal.

  • Data numerik dan kontinu.

Statistik Sample:

\[ \bar{x}=8.45 \]

\[ s=0.4079 \]

\[ n=12,df=11 \]

\[ SE = \frac{s}{\sqrt{n}}=0.1179 \]


2.2 Confidence Interval

  • 90% Confidence Interval:

\[ t_{0.05,11}=1.7959 \]

\[ CI_{90\%} = (8.238,\: 8.662) \]

  • 95% Confidence Interval:

\[ t_{0.025,11} = 2.2010 \]

\[ CI_{95\%} = (8.190,\: 8.710) \]

  • 99% Confidence Interval:

\[ t_{0.005,11} = 3.1058 \]

\[ CI_{99\%} = (8.084,\: 8.816) \]


2.3 Visualisassi

Interpretasi Grafik:

  • Interval 99% paling lebar, diikuti 95% dan 90%

  • Ketidakpastian lebih besar karena σ populasi tidak diketahui

  • Titik hitam menunjukkan rata-rata sampel \(\bar{x}\)


2.4 PENGARUH UKURAN SAMPEL & CONFIDENCE LEVEL

Pengaruh Ukuran Sampel (n):

  • n bertambah → SE mengecil.

  • Confidence interval menjadi lebih sempit.

  • Estimasi mean lebih presisi.

Pengaruh Confidence Level:

  • Confidence level lebih tinggi (99%) → interval lebih lebar.

  • Confidence level lebih rendah (90%) → interval lebih sempit.

  • Ada trade-off antara keyakinan dan ketelitian.

INTERPRETASI (KONTEKS UX):

  • Dengan confidence level 95%, rata-rata waktu penyelesaian tugas pengguna berada antara 8.19 hingga 8.71 menit.

  • Hal ini menunjukkan bahwa performa aplikasi relatif konsisten, meskipun jumlah pengguna yang diuji masih terbatas.

3 Case Study 3

Interval Kepercayaan untuk Proporsi, Pengujian A/B: Sebuah tim ilmu data menjalankan pengujian A/B pada desain tombol Ajakan Bertindak (Call-To-Action/CTA) baru. Hasil eksperimennya adalah:

\[ \begin{eqnarray*} n &=& 400 \quad \text{(jumlah pengguna)} \\ x &=& 156 \quad \text{(pengguna yang mengklik CTA)} \end{eqnarray*} \]

Tugas:

  1. Hitung proporsi sampel \(\hat{p}\).
  2. Hitung Interval Kepercayaan untuk proporsi pada:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Visualisasikan dan bandingkan ketiga interval tersebut.
  4. Jelaskan bagaimana tingkat kepercayaan memengaruhi pengambilan keputusan dalam eksperimen produk.

3.1 SAMPLE PROPORTION

Rumus umum CI Proporsi:

\[ \hat{p} \pm Z_{\alpha/2}\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

\[ \hat{p} = \frac{156}{400} = 0.39 \]

Artinya: 39% pengguna mengklik CTA.


3.2 CONFIDENCE INTERVAL

Standar Error (SE):

\[ SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

\[ = \sqrt{\frac{0.39(1-0.39)}{400}} \]

\[ = \sqrt{\frac{0.39(0.61)}{400}} \]

\[ = 0.0244 \]

  • 90% Confidence Interval:

\[ 𝑍_{0.05}=1.645 \]

\[ CI_{90\%}=(0.350,\:0.430) \]

  • 95% Confidence Interval:

\[ Z_{0.025}=1.96 \]

\[ CI_{95\%}=(0.342,\:0.438) \]

  • 99% Confidence Interval:

\[ Z_{0.005}=2.576 \]

\[ CI_{99\%}=(0.327,\:0.453) \]


3.3 VISUALISASI

Interpretasi grafik:

  • CI 99% paling lebar (paling konservatif).

  • CI 90% paling sempit (lebih presisi).

  • Titik menunjukkan estimasi CTR = 0.39.


3.4 PENGARUH CONFIDENCE LEVEL

Confidence Level Rendah (90%):

  • Interval lebih sempit.

  • Keputusan lebih cepat.

  • Risiko kesalahan lebih besar.

Confidence Level Tinggi (99%):

  • Interval lebih lebar.

  • Keputusan lebih aman.

  • Cocok untuk perubahan besar (high risk).

Praktik Umum Produk:

  • 95% CI paling sering digunakan → keseimbangan antara kecepatan eksperimen & kepercayaan hasil.

INTERPRETASI BISNIS:

Dengan 95% confidence, tingkat klik CTA berada antara 34.2% hingga 43.8%. Jika batas bawah CI masih lebih tinggi dari desain lama, maka desain CTA baru layak untuk diluncurkan.

4 Case Study 4

Perbandingan Presisi (Uji Z vs Uji t): Dua tim data mengukur latensi API (dalam milidetik) dalam kondisi yang berbeda.

\[\begin{eqnarray*} \text{Team A:} \\ n &=& 36 \quad \text{(sample size)} \\ \bar{x} &=& 210 \quad \text{(sample mean)} \\ \sigma &=& 24 \quad \text{(known population standard deviation)} \\[6pt] \text{Team B:} \\ n &=& 36 \quad \text{(sample size)} \\ \bar{x} &=& 210 \quad \text{(sample mean)} \\ s &=& 24 \quad \text{(sample standard deviation)} \end{eqnarray*}\]

Tugas:

  1. Identifikasi uji statistik yang digunakan oleh setiap tim.
  2. Hitung Interval Kepercayaan untuk 90%, 95%, dan 99%.
  3. Buat visualisasi yang membandingkan semua interval.
  4. Jelaskan mengapa lebar interval berbeda, meskipun dengan data yang serupa.

4.1 IDENTIFIKASI UJI STATISTIK

Penentuan uji statistik didasarkan pada apakah deviasi standar populasi diketahui atau hanya diestimasi dari sampel.

  • Team A (Uji Z): Menggunakan Uji Z (One-sample Z-test) karena deviasi standar populasi (\(\sigma\)) diketahui secara pasti.

  • Team B (Uji t): Menggunakan Uji t (One-sample t-test) karena deviasi standar populasi tidak diketahui, sehingga menggunakan deviasi standar sampel (\(s\)). Meskipun ukuran sampel (\(n = 36\)) cukup besar, distribusi \(t\) memberikan hasil yang lebih konservatif dan tepat untuk data sampel.

Tim Uji Statistik Alasan
Team A Z Confidence Interval σ diketahui
Team B t Confidence Interval σ tidak diketahui, pakai s

4.2 PERHITUNGAN CONFIDENCE INTERVAL

Rumus umum untuk Interval Kepercayaan (CI):

\[\text{CI} = \bar{x} \pm (\text{Critical Value}) \times \frac{s \text{ atau } \sigma}{\sqrt{n}} \]

Standard Error (sama secara numerik):

\[ SE = \frac{24}{\sqrt{36}} = \frac{24}{6} = 4 \]

  • Z-Test (Team A):
Confidence Z CI
90% 1.645 (203.42 , 216.58)
95% 1.96 (202.16 , 217.84)
99% 2.576 (199.70 , 220.30)
  • t-Test (Team B), df = 35
Confidence t CI
90% 1.690 (203.24 , 216.76)
95% 2.030 (201.88 , 218.12)
99% 2.724 (199.10 , 220.90)

CI t-Test selalu sedikit lebih lebar.


4.3 VISUALISASI PERBANDINGAN INTERVAL

Interpretasi Grafik:

  • Interval t-test lebih lebar dibanding Z-test.

  • Hal ini terjadi karena σ populasi tidak diketahui, sehingga ketidakpastian lebih besar.

  • Pada confidence level yang sama, semakin tinggi level → interval semakin lebar.


4.4 MENGAPA LEBAR INTERVAL BERBEDA

Meskipun nilai rata-rata dan deviasi standarnya identik (24), terdapat perbedaan lebar interval karena faktor ketidakpastian (uncertainty):

  • Informasi yang Tersedia: Team A memiliki informasi “pasti” mengenai populasi (\(\sigma\)). Team B hanya memiliki estimasi dari sampel (\(s\)). Karena \(s\) bisa bervariasi dari satu sampel ke sampel lainnya, Uji t menambahkan “margin pengaman” yang lebih luas.

  • Karakteristik Distribusi: Distribusi \(t\) memiliki ekor yang lebih gemuk (heavier tails) dibandingkan distribusi Z. Ini berarti pada tingkat kepercayaan yang sama, nilai kritis \(t\) akan selalu lebih besar daripada nilai kritis \(Z\).

  • Tingkat Kepercayaan: Semakin tinggi tingkat kepercayaan (misal 99%), semakin besar nilai kritis yang digunakan, sehingga interval semakin lebar untuk memastikan parameter populasi benar-benar tertangkap di dalamnya.

INTERPRETASI PRAKTIS (DATA ENGINEERING):

  • Team A bisa membuat keputusan lebih cepat karena estimasi lebih presisi.

  • Team B lebih konservatif, cocok untuk sistem kritis.

  • Untuk latency API, interval sempit = kepercayaan tinggi terhadap SLA.

5 Case Study 5

Interval Kepercayaan Satu Sisi: Sebuah perusahaan Software as a Service (SaaS) ingin memastikan bahwa setidaknya 70% pengguna aktif mingguan menggunakan fitur premium.

Dari percobaan:

\[ \begin{eqnarray*} n &=& 250 \quad \text{(total users)} \\ x &=& 185 \quad \text{(active premium users)} \end{eqnarray*} \]

Manajemen hanya tertarik pada batas bawah dari estimasi tersebut.

Tugas:

  1. Identifikasi jenis Interval Kepercayaan dan uji yang sesuai.
  2. Hitung Interval Kepercayaan bawah satu sisi pada:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Visualisasikan batas bawah untuk semua tingkat kepercayaan.
  4. Tentukan apakah target 70% terpenuhi secara statistik.

5.1 JENIS CONFIDENCE INTERVAL & UJI STATISTIK

  • Jenis Interval: Lower One-Sided Confidence Interval (Batas Bawah Satu Sisi). Manajemen hanya ingin memastikan bahwa proporsi tidak jatuh di bawah angka tertentu (70%).

  • Uji yang Sesuai: One-Sample Z-Test for Proportions. Dengan \(n = 250\), syarat normalitas terpenuhi karena \(np\) dan \(n(1-p)\) keduanya jauh di atas 10.

Alasan:

  • Data berbentuk proporsi.

  • Sampel besar.

  • Fokus hanya pada batas bawah.


5.2 PERHITUNGAN CONFIDENCE INTERVAL

Sample Proportion:

\[ \hat{p} = \frac{x}{n}= \frac{185}{250}= 0.74 \]

Standard Error:

\[ SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

\[ = \sqrt{\frac{0.74(1-0.74)}{250}} \]

\[ = \sqrt{\frac{0.74(0.26)}{250}} \]

\[ = 0.0277 \]

Rumus One-Sided Lower CI:

\[ \text{Lower Bound} = \hat{p} - Z_{\alpha} \cdot SE \]

One-Sided Lower Confidence Intervals:

Confidence Level Perhitunggan (\(0.74 - Z \times 0.0277\)) Lower Bound
90% 1.282 0.705
95% 1.645 0.694
99% 2.326 0.676

5.3 VISUALISASI LOWER BOUNDS

Interpretasi grafik:

  • Titik = lower bound.

  • Garis vertikal = target 70%.

  • Jika titik berada di kanan garis, target terpenuhi.

  • Grafik menunjukkan bahwa hanya pada confidence level 90%, lower bound berada di atas target 70%. Pada confidence level 95% dan 99%, target belum terpenuhi.


5.4 APAKAH TARGET 70% TERPENUHI

Kesimpulannya bergantung pada tingkat ketatnya standar yang digunakan manajemen:

  • Pada Tingkat Kepercayaan 90%: TERPENUHI. Secara statistik, kita yakin 90% bahwa setidaknya 70.45% pengguna adalah pengguna premium. Karena 70.45% > 70%, target tercapai pada level ini.

  • Pada Tingkat Kepercayaan 95%: TIDAK TERPENUHI (Secara Statistik). Batas bawah berada di 69.44%. Meskipun sangat dekat, kita tidak bisa menjamin 100% bahwa angka aslinya tidak berada di bawah 70% dengan tingkat keyakinan ini.

  • Pada Tingkat Kepercayaan 99%: TIDAK TERPENUHI. Margin kesalahan pada tingkat kepercayaan tinggi terlalu lebar, sehingga batas bawah turun ke 67.56%.

Confidence Lower Bound Target 70%
90% 70.5% Ya
95% 69.4% Tidak
99% 67.6% Tidak

INTERPRETASI BISNIS:

  • Dengan 90% confidence, perusahaan dapat mengklaim target 70% tercapai.

  • Dengan 95% atau 99% confidence, bukti belum cukup kuat.

  • Semakin tinggi confidence level → keputusan lebih konservatif.

LS0tDQp0aXRsZTogIiBTdHVkeSBDYXNlcyAiICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCg0Kc3VidGl0bGU6ICIgQ29uZmlkZW5jZSBJbnRlcnZhbCB+IFdlZWsgMTMgIiAgICAgICAgIyBTdWJ0aXRsZSBvciB0b3BpYyBmb3Igd2VlayAxMA0KYXV0aG9yOiANCiAgLSAiTS4gWXVzdGlhbiBQdXRyYSBNdWhhZGkiICAgICAgICAgICAgICAgIyBSZXBsYWNlIHdpdGggeW91ciBmdWxsIG5hbWUNCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgICMgQXV0byBkaXNwbGF5cyBjdXJyZW50IGRhdGUNCg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBjc3M6ICJzdHlsZS5jc3MiICAgICAgICAgICAgICAgICAgICAgIyA8LS0tIFBBTkdHSUwgRklMRSBDU1MgREkgU0lOSQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlICAgICAgICAgICAgICAgICAjIEVtYmVkIGFsbCByZXNvdXJjZXMNCiAgICB0aHVtYm5haWxzOiB0cnVlICAgICAgICAgICAgICAgICAgICAgIyBTaG93IGltYWdlIHRodW1ibmFpbHMNCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgIyBFbmFibGUgY2xpY2stdG8tem9vbSBpbWFnZXMNCiAgICBnYWxsZXJ5OiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgIyBHcm91cCBpbWFnZXMgaW50byBnYWxsZXJ5DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlICAgICAgICAgICAgICAgICMgTnVtYmVyIGFsbCBzZWN0aW9ucw0KICAgIGxpYl9kaXI6IGxpYnMgICAgICAgICAgICAgICAgICAgICAgICAjIFNhdmUgSlMvQ1NTIGxpYnJhcmllcw0KICAgIGRmX3ByaW50OiAicGFnZWQiICAgICAgICAgICAgICAgICAgICAjIFBhZ2VkIGRhdGEgZnJhbWVzDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyIgICAgICAgICAgICAgICAgICMgRXhwYW5kYWJsZSBjb2RlIGJsb2Nrcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgICAgICAgICAgICAgICAjIEFkZCBidXR0b24gdG8gZG93bmxvYWQgUiBjb2RlDQoNCi0tLQ0KDQo8c3R5bGU+DQppbWcgew0KICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsNCiAgbWF4LXdpZHRoOiBub25lICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KDQotLS0NCg0KYGBge3IgcHJvZmlsZSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoaHRtbHRvb2xzKQ0KSFRNTCgnDQo8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDMwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y1ZjdmYSAwJSwgI2MzY2ZlMiAxMDAlKTsgcGFkZGluZzogMzBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgbWFyZ2luOiAyMHB4IDA7Ij4NCiAgPGRpdj4NCiAgICA8aW1nIHNyYz0iTXVoaGguanBnIiANCiAgICAgICAgIHN0eWxlPSJ3aWR0aDogMjUwcHg7IGhlaWdodDogMjUwcHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgb2JqZWN0LWZpdDogY292ZXI7IGJvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwwLDAsMC4yKTsiPg0KICA8L2Rpdj4NCiAgPGRpdj4NCiAgICA8aDEgc3R5bGU9ImNvbG9yOiAjMmMzZTUwOyBtYXJnaW46IDA7Ij5NLiBZdXN0aWFuIFB1dHJhIE11aGFkaTwvaDE+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjN2Y4YzhkOyBtYXJnaW46IDVweCAwIDE1cHggMDsiPkluc3RpdHV0IFRla29ub2xvZ2kgU2FpbnMgQmFuZHVuZzwvcD4NCiAgICANCiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDE1cHg7IG1hcmdpbi10b3A6IDIwcHg7Ij4NCiAgICAgIDxidXR0b24gc3R5bGU9ImJhY2tncm91bmQ6ICMzNDk4ZGI7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4NCiAgICAgICAgUiBQcm9ncmFtbWluZw0KICAgICAgPC9idXR0b24+DQogICAgICA8YnV0dG9uIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZTc0YzNjOyBjb2xvcjogV2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyI+DQogICAgICAgIERhdGEgU2NpZW5jZQ0KICAgICAgPC9idXR0b24+DQogICAgICA8YnV0dG9uIHN0eWxlPSJiYWNrZ3JvdW5kOiAjMmVjYzcxOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyI+DQogICAgICAgIFN0YXRpc3RpY3MNCiAgICAgIDwvYnV0dG9uPg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCg0KYGBgDQoNCi0tLQ0KDQojIyBDYXNlIFN0dWR5IDENCg0KKipJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBSYXRhLXJhdGEsICRcc2lnbWEkIERpa2V0YWh1aToqKiBTZWJ1YWggKipwbGF0Zm9ybSBlLWNvbW1lcmNlKiogaW5naW4gbWVtcGVya2lyYWthbiAqKnJhdGEtcmF0YSBqdW1sYWggdHJhbnNha3NpIGhhcmlhbiBwZXIgcGVuZ2d1bmEqKiBzZXRlbGFoIG1lbHVuY3Vya2FuIGZpdHVyIGJhcnUuIEJlcmRhc2Fya2FuIGRhdGEgaGlzdG9yaXMgc2thbGEgYmVzYXIsICoqc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kqKiBkaWtldGFodWkuDQoNCiQkDQpcYmVnaW57ZXFuYXJyYXkqfQ0KXHNpZ21hICY9JiAzLjIgXHF1YWQgXHRleHR7KGRldmlhc2kgc3RhbmRhciBwb3B1bGFzaSl9IFxcDQpuICY9JiAxMDAgXHF1YWQgXHRleHR7KHVrdXJhbiBzYW1wZWwpfSBcXA0KXGJhcnt4fSAmPSYgMTIuNiBccXVhZCBcdGV4dHsocmF0YS1yYXRhIHNhbXBlbCl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCioqVHVnYXM6KioNCg0KMS4gSWRlbnRpZmlrYXNpICoqdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0KiogZGFuIGJlcmlrYW4ganVzdGlmaWthc2kgYXRhcyBwaWxpaGFuIEFuZGEuDQoyLiBIaXR1bmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWs6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBCdWF0ICoqdmlzdWFsaXNhc2kgcGVyYmFuZGluZ2FuKiogZGFyaSBrZXRpZ2EgaW50ZXJ2YWwga2VwZXJjYXlhYW4gdGVyc2VidXQuDQo0LiBJbnRlcnByZXRhc2lrYW4gaGFzaWxueWEgZGFsYW0ga29udGVrcyBhbmFsaXRpayBiaXNuaXMuDQoNCi0tLQ0KDQojIyMgKlVqaSBTdGF0aXN0aWsgeWFuZyBUZXBhdCAmIEp1c3RpZmlrYXNpKg0KDQoqKkthcmVuYToqKg0KDQotIFVrdXJhbiBzYW1wZWwgKipuPTEwMCBiZXNhciAo4omlMzApKiog4oaSIENMVCBiZXJsYWt1Lg0KDQotIFNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpICoqz4MqKiBkaWtldGFodWkuDQoNCi0gSW5naW4gbWVtYnVhdCBpbnRlcnZhbCBrZXBlcmNheWFhbiB1bnR1ayByYXRhLXJhdGEgcG9wdWxhc2kgKirOvC4qKg0KDQpNYWthIHVqaSBzdGF0aXN0aWsgeWFuZyB0ZXBhdCBhZGFsYWggKipaLXRlc3QqKiB1bnR1ayByYXRhLXJhdGEgZGVuZ2FuIG1lbmdndW5ha2FuICoqZGlzdHJpYnVzaSBub3JtYWwgc3RhbmRhciAoWikuKioNCg0KKipKdXN0aWZpa2FzaToqKg0KDQotIM+DIGRpa2V0YWh1aSDihpIgZ3VuYWthbiBaLCBidWthbiB0Lg0KDQotIFJ1bXVzIGludGVydmFsIGtlcGVyY2F5YWFuOg0KDQokJA0KXGJhcnt4fSBccG0gWl97XGFscGhhLzJ9IFxjZG90IFxmcmFje1xzaWdtYX17XHNxcnR7bn19DQokJA0KDQotLS0NCg0KIyMjICpQZXJoaXR1bmdhbiBDb25maWRlbmNlIEludGVydmFsKg0KDQoqKlN0YW5kYXJkIEVycm9yIChTRSk6KioNCg0KKipSdW11cyB1bXVtOioqDQoNCiQkDQpNRSA9IFxwbSBaX3tcYWxwaGEvMn0gXGNkb3QgXGZyYWN7XHNpZ21hfXtcc3FydHtufX0NCiQkDQokJA0KU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fT0gXGZyYWN7My4yfXtcc3FydHsxMDB9fT0gMC4zMg0KJCQNCg0KLSAqKjkwJSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCiQkDQpaX3swLjA1fT0xLjY0NQ0KJCQNCg0KJCQNCk1FPTEuNjQ1w5cwLjMyPTAuNTI2NA0KJCQNCg0KJCQNCkNJX3s5MFwlfSA9ICgxMi4wNzM2LFw7IDEzLjEyNjQpDQokJA0KDQoNCi0gKio5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KWl97MC4wMjV9PTEuOTYNCiQkDQoNCiQkDQpNRT0xLjk2w5cwLjMyPTAuNjI3Mg0KJCQNCg0KJCQNCkNJX3s5NVwlfSA9ICgxMS45NzI4LFw7IDEzLjIyNzIpDQokJA0KDQoNCi0gKio5OSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KWl97MC4wMDV9PTIuNTc2DQokJA0KDQokJA0KTUU9Mi41NzbDlzAuMzI9MC44MjQzDQokJA0KDQokJA0KQ0lfezk5XCV9ID0gKDExLjc3NTcsXDsgMTMuNDI0MykNCiQkDQoNCioqUmluZ2thc2FuIG51bWVyaWs6KioNCg0KfCBDb25maWRlbmNlIExldmVsIHwgWi12YWx1ZSB8IE1hcmdpbiBvZiBFcnJvciB8IExvd2VyICB8IFVwcGVyICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tIHwgLS0tLS0tIHwNCnwgOTAlICAgICAgICAgICAgICB8IDEuNjQ1ICAgfCAwLjUyNiAgICAgICAgICAgfCAxMi4wNzQgfCAxMy4xMjYgfA0KfCA5NSUgICAgICAgICAgICAgIHwgMS45NjAgICB8IDAuNjI3ICAgICAgICAgICB8IDExLjk3MyB8IDEzLjIyNyB8DQp8IDk5JSAgICAgICAgICAgICAgfCAyLjU3NiAgIHwgMC44MjQgICAgICAgICAgIHwgMTEuNzc2IHwgMTMuNDI0IHwNCg0KLS0tDQoNCiMjIyAqdmlzdWFsaXNhc2kqDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YSBmcmFtZQ0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHMgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpKSwNCiAgTG93ZXIgPSBjKDEyLjA3MzYsIDExLjk3MjgsIDExLjc3NTcpLA0KICBVcHBlciA9IGMoMTMuMTI2NCwgMTMuMjI3MiwgMTMuNDI0MyksDQogIE1lYW4gID0gMTIuNg0KKQ0KDQojIFBsb3QNCmdncGxvdChjaV9kYXRhLCBhZXMoeSA9IExldmVsKSkgKw0KICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IExvd2VyLCB4bWF4ID0gVXBwZXIpLCBoZWlnaHQgPSAwLjIsIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IE1lYW4pLCBzaXplID0gMykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbXBhcmlzb24gb2YgQ29uZmlkZW5jZSBJbnRlcnZhbHMiLA0KICAgIHggPSAiQXZlcmFnZSBEYWlseSBUcmFuc2FjdGlvbnMgcGVyIFVzZXIiLA0KICAgIHkgPSAiQ29uZmlkZW5jZSBMZXZlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKipHcmFmaWsgeWFuZyBkaXRhbXBpbGthbiBtZW51bmp1a2thbjoqKg0KDQotIFNldGlhcCBnYXJpcyBob3Jpem9udGFsID0gKipzYXR1IGNvbmZpZGVuY2UgaW50ZXJ2YWwuKioNCg0KLSBUaXRpayBkaSB0ZW5nYWggPSBzYW1wbGUgbWVhbiAqKigxMi42KS4qKg0KDQotIEludGVydmFsICoqOTklKiogcGFsaW5nIGxlYmFyLCAqKjkwJSoqIHBhbGluZyBzZW1waXQuDQoNCioqSW5pIG1lbmdnYW1iYXJrYW4gdHJhZGUtb2ZmIGFudGFyYSB0aW5na2F0IGtlcGVyY2F5YWFuIGRhbiBwcmVzaXNpLioqDQoNCg0KLS0tDQoNCiMjIyAqSW50ZXJwcmV0YXNpIEJ1c2luZXNzIEFuYWx5dGljcyoNCg0KLSBEZW5nYW4gKio5MCUqKiBrZXlha2luYW4sIHJhdGEtcmF0YSB0cmFuc2Frc2kgaGFyaWFuIHBlciB1c2VyIGJlcmFkYSBkaSBzZWtpdGFyICoqMTIuMDcg4oCTIDEzLjEzKiogdHJhbnNha3NpLg0KDQotIERlbmdhbiAqKjk1JSoqIGtleWFraW5hbiwgcmVudGFuZ255YSBzZWRpa2l0IGxlYmloIGxlYmFyOiAqKjExLjk3IOKAkyAxMy4yMy4qKg0KDQotIERlbmdhbiAqKjk5JSoqIGtleWFraW5hbiwgZXN0aW1hc2kgcGFsaW5nIGtvbnNlcnZhdGlmOiAqKjExLjc4IOKAkyAxMy40Mi4qKg0KDQoqKkltcGxpa2FzaSBCaXNuaXM6KioNCg0KLSBKaWthIGtlcHV0dXNhbiBvcGVyYXNpb25hbCBtZW1idXR1aGthbiBwcmVzaXNpIHRpbmdnaSAobWlzYWxueWEga2FwYXNpdGFzIHNlcnZlciBqYW5na2EgcGVuZGVrKSwgKipDSSA5MCUqKiBiaXNhIGRpZ3VuYWthbi4NCg0KLSBVbnR1ayBrZXB1dHVzYW4gc3RyYXRlZ2lzIChmb3JlY2FzdCBwZW5kYXBhdGFuLCBldmFsdWFzaSBmaXR1ciBiYXJ1KSwgKipDSSA5NSUqKiBhdGF1ICoqOTklKiogbGViaWggYW1hbi4NCg0KLSBLYXJlbmEgc2VsdXJ1aCBpbnRlcnZhbCBiZXJhZGEgZGkgYXRhcyBhbmdrYSAqKjEyLCoqIGluaSBtZW51bmp1a2thbiBmaXR1ciBiYXJ1IGtlbXVuZ2tpbmFuIG1lbmluZ2thdGthbiBha3Rpdml0YXMgdHJhbnNha3NpIHBlbmdndW5hLg0KDQojIyBDYXNlIFN0dWR5IDIgDQoNCioqSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWsgUmF0YS1yYXRhLCAkXHNpZ21hJCBUaWRhayBEaWtldGFodWk6KiogU2VidWFoICoqdGltIFJpc2V0IFVYKiogbWVuZ2FuYWxpc2lzICoqd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIChkYWxhbSBtZW5pdCkqKiB1bnR1ayBhcGxpa2FzaSBzZWx1bGVyIGJhcnUuIERhdGEgZGlrdW1wdWxrYW4gZGFyaSAqKjEyIHBlbmdndW5hKio6DQoNCiQkDQo4LjQsXDsgNy45LFw7IDkuMSxcOyA4LjcsXDsgOC4yLFw7IDkuMCxcOw0KNy44LFw7IDguNSxcOyA4LjksXDsgOC4xLFw7IDguNixcOyA4LjMNCiQkDQoNCioqVHVnYXM6KioNCg0KMS4gSWRlbnRpZmlrYXNpICoqdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0KiogZGFuIGplbGFza2FuIGFsYXNhbm55YS4NCjIuIGl0dW5nIEludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrOg0KICAgLSAkOTBcJSQNCiAgIC0gJDk1XCUkDQogICAtICQ5OVwlJA0KMy4gVmlzdWFsaXNhc2lrYW4ga2V0aWdhIGludGVydmFsIHRlcnNlYnV0IGRhbGFtIHNhdHUgcGxvdC4NCjQuIEplbGFza2FuIGJhZ2FpbWFuYSAqKnVrdXJhbiBzYW1wZWwgZGFuIHRpbmdrYXQga2VwZXJjYXlhYW4qKiBtZW1lbmdhcnVoaSBsZWJhciBpbnRlcnZhbC4NCg0KDQotLS0NCg0KIyMjICpJZGVudGlmaWthc2kgdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0IGRhbiBqZWxhc2thbiBhbGFzYW5ueWEqDQoNCkNvbmZpZGVuY2UgSW50ZXJ2YWwgKiooQ0kpKiogZGlndW5ha2FuIHVudHVrIG1lbmdlc3RpbWFzaSByZW50YW5nIG5pbGFpIHJhdGEtcmF0YSBwb3B1bGFzaSBiZXJkYXNhcmthbiBkYXRhIHNhbXBlbC4gUGFkYSBrYXN1cyBpbmksIHN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAqKijPgykqKiB0aWRhayBkaWtldGFodWkgZGFuIHVrdXJhbiBzYW1wZWwga2VjaWwgKioobiA8IDMwKSwqKiBzZWhpbmdnYSBkaWd1bmFrYW4gZGlzdHJpYnVzaSAqKnQtU3R1ZGVudC4qKg0KDQoqKlJ1bXVzIHVtdW06KioNCg0KJCQNCkNJID0gXGJhcnt4fSBccG0gdF97XGFscGhhLzIsZGZ9XGxlZnQoXGZyYWN7c317XHNxcnR7bn19XHJpZ2h0KQ0KJCQNCg0KKipEaW1hbmE6KioNCg0KLSAqKiRcYmFye3h9JCoqID0gcmF0YS1yYXRhIHNhbXBlbC4NCg0KLSAqKvCdkaAqKj0gc3RhbmRhciBkZXZpYXNpIHNhbXBlbC4NCg0KLSAqKvCdkZsqKj0gdWt1cmFuIHNhbXBlbC4NCg0KLSAqKvCdkZHwnZGTKio98J2Rm+KIkjENCg0KLSAqKiR0X3tcYWxwaGEvMixkZn0kKiogPSBuaWxhaSBrcml0aXMgZGlzdHJpYnVzaSB0Lg0KDQoqKlVqaSBTdGF0aXN0aWsgWWFuZyBEaWd1bmFrYW46KioNCg0KLSBPbmUtU2FtcGxlIHQgQ29uZmlkZW5jZSBJbnRlcnZhbC4NCg0KKipBbGFzYW46KioNCg0KLSBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSAqKijPgykqKiB0aWRhayBkaWtldGFodWkuDQoNCi0gVWt1cmFuIHNhbXBlbCBrZWNpbCAqKihuID0gMTIgPCAzMCkuKioNCg0KLSBEYXRhIGRpYXN1bXNpa2FuIGJlcmFzYWwgZGFyaSBwb3B1bGFzaSB5YW5nIG1lbmRla2F0aSBkaXN0cmlidXNpIG5vcm1hbC4NCg0KLSBEYXRhIG51bWVyaWsgZGFuIGtvbnRpbnUuDQoNCioqU3RhdGlzdGlrIFNhbXBsZToqKg0KDQokJA0KXGJhcnt4fT04LjQ1DQokJA0KDQokJA0Kcz0wLjQwNzkNCiQkDQoNCiQkDQpuPTEyLGRmPTExDQokJA0KDQokJA0KU0UgPSBcZnJhY3tzfXtcc3FydHtufX09MC4xMTc5DQokJA0KDQotLS0NCg0KIyMjICpDb25maWRlbmNlIEludGVydmFsKg0KDQotICoqOTAlIENvbmZpZGVuY2UgSW50ZXJ2YWw6KioNCg0KJCQNCnRfezAuMDUsMTF9PTEuNzk1OQ0KJCQNCg0KJCQNCkNJX3s5MFwlfSA9ICg4LjIzOCxcOiA4LjY2MikNCiQkDQoNCi0gKio5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KdF97MC4wMjUsMTF9ID0gMi4yMDEwDQokJA0KDQokJA0KQ0lfezk1XCV9ID0gKDguMTkwLFw6IDguNzEwKQ0KJCQNCg0KLSAqKjk5JSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCiQkDQp0X3swLjAwNSwxMX0gPSAzLjEwNTgNCiQkDQoNCiQkDQpDSV97OTlcJX0gPSAoOC4wODQsXDogOC44MTYpDQokJA0KDQotLS0NCg0KIyMjICpWaXN1YWxpc2Fzc2kqDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YQ0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHMgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpKSwNCiAgTG93ZXIgPSBjKDguMjM4LCA4LjE5MCwgOC4wODQpLA0KICBVcHBlciA9IGMoOC42NjIsIDguNzEwLCA4LjgxNikNCikNCg0KbWVhbl94IDwtIDguNDUNCg0KIyBQbG90DQpnZ3Bsb3QoY2lfZGF0YSwgYWVzKHkgPSBMZXZlbCkpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gTG93ZXIsIHhlbmQgPSBVcHBlciwgeWVuZCA9IExldmVsKSwgbGluZXdpZHRoID0gMS4zKSArDQogIGdlb21fcG9pbnQoYWVzKHggPSBtZWFuX3gpLCBzaXplID0gMykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvciBNZWFuICjPgyBVbmtub3duKSIsDQogICAgeCA9ICJUYXNrIENvbXBsZXRpb24gVGltZSAobWludXRlcykiLA0KICAgIHkgPSAiQ29uZmlkZW5jZSBMZXZlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKipJbnRlcnByZXRhc2kgR3JhZmlrOioqDQoNCi0gSW50ZXJ2YWwgKio5OSUqKiBwYWxpbmcgbGViYXIsIGRpaWt1dGkgKio5NSUgZGFuIDkwJSoqDQoNCi0gS2V0aWRha3Bhc3RpYW4gbGViaWggYmVzYXIga2FyZW5hICoqz4MqKiBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkNCg0KLSBUaXRpayBoaXRhbSBtZW51bmp1a2thbiByYXRhLXJhdGEgc2FtcGVsICoqJFxiYXJ7eH0kKioNCg0KLS0tDQoNCiMjIyAqUEVOR0FSVUggVUtVUkFOIFNBTVBFTCAmIENPTkZJREVOQ0UgTEVWRUwqDQoNCioqUGVuZ2FydWggVWt1cmFuIFNhbXBlbCAobik6KioNCg0KLSBuIGJlcnRhbWJhaCDihpIgU0UgbWVuZ2VjaWwuDQoNCi0gQ29uZmlkZW5jZSBpbnRlcnZhbCBtZW5qYWRpIGxlYmloIHNlbXBpdC4NCg0KLSBFc3RpbWFzaSBtZWFuIGxlYmloIHByZXNpc2kuDQoNCioqUGVuZ2FydWggQ29uZmlkZW5jZSBMZXZlbDoqKg0KDQotIENvbmZpZGVuY2UgbGV2ZWwgbGViaWggdGluZ2dpICoqKDk5JSkg4oaSIGludGVydmFsIGxlYmloIGxlYmFyLioqDQoNCi0gQ29uZmlkZW5jZSBsZXZlbCBsZWJpaCByZW5kYWggKiooOTAlKSDihpIgaW50ZXJ2YWwgbGViaWggc2VtcGl0LioqDQoNCi0gQWRhIHRyYWRlLW9mZiBhbnRhcmEga2V5YWtpbmFuIGRhbiBrZXRlbGl0aWFuLg0KDQoqKklOVEVSUFJFVEFTSSAoS09OVEVLUyBVWCk6KioNCg0KLSBEZW5nYW4gY29uZmlkZW5jZSBsZXZlbCAqKjk1JSwqKiByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIHBlbmdndW5hIGJlcmFkYSBhbnRhcmEgKio4LjE5IGhpbmdnYSA4LjcxIG1lbml0LioqDQoNCi0gSGFsIGluaSBtZW51bmp1a2thbiBiYWh3YSBwZXJmb3JtYSBhcGxpa2FzaSByZWxhdGlmIGtvbnNpc3RlbiwgbWVza2lwdW4ganVtbGFoIHBlbmdndW5hIHlhbmcgZGl1amkgbWFzaWggdGVyYmF0YXMuDQoNCg0KIyMgQ2FzZSBTdHVkeSAzIA0KDQoqKkludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrIFByb3BvcnNpLCBQZW5ndWppYW4gQS9COioqIFNlYnVhaCB0aW0gaWxtdSBkYXRhIG1lbmphbGFua2FuICoqcGVuZ3VqaWFuIEEvQioqIHBhZGEgZGVzYWluIHRvbWJvbCAqQWpha2FuIEJlcnRpbmRhayAoQ2FsbC1Uby1BY3Rpb24vQ1RBKSogYmFydS4gSGFzaWwgZWtzcGVyaW1lbm55YSBhZGFsYWg6DQoNCiQkDQpcYmVnaW57ZXFuYXJyYXkqfQ0KbiAmPSYgNDAwIFxxdWFkIFx0ZXh0eyhqdW1sYWggcGVuZ2d1bmEpfSBcXA0KeCAmPSYgMTU2IFxxdWFkIFx0ZXh0eyhwZW5nZ3VuYSB5YW5nIG1lbmdrbGlrIENUQSl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCioqVHVnYXM6KioNCg0KMS4gSGl0dW5nICoqcHJvcG9yc2kgc2FtcGVsKiogJFxoYXR7cH0kLg0KMi4gSGl0dW5nIEludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrIHByb3BvcnNpIHBhZGE6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBWaXN1YWxpc2FzaWthbiBkYW4gYmFuZGluZ2thbiBrZXRpZ2EgaW50ZXJ2YWwgdGVyc2VidXQuDQo0LiBKZWxhc2thbiBiYWdhaW1hbmEgdGluZ2thdCBrZXBlcmNheWFhbiBtZW1lbmdhcnVoaSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gZGFsYW0gZWtzcGVyaW1lbiBwcm9kdWsuDQoNCi0tLQ0KDQojIyMgKlNBTVBMRSBQUk9QT1JUSU9OKg0KDQoqKlJ1bXVzIHVtdW0gQ0kgUHJvcG9yc2k6KioNCg0KJCQNClxoYXR7cH0gXHBtIFpfe1xhbHBoYS8yfVxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19DQokJA0KDQoNCiQkDQpcaGF0e3B9ID0gXGZyYWN7MTU2fXs0MDB9ID0gMC4zOQ0KJCQNCg0KKipBcnRpbnlhOiAzOSUqKiBwZW5nZ3VuYSBtZW5na2xpayBDVEEuDQoNCi0tLQ0KDQojIyMgKkNPTkZJREVOQ0UgSU5URVJWQUwqDQoNCioqU3RhbmRhciBFcnJvciAoU0UpOioqDQoNCiQkDQpTRSA9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19DQokJA0KDQoNCiQkDQo9IFxzcXJ0e1xmcmFjezAuMzkoMS0wLjM5KX17NDAwfX0NCiQkDQoNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MC4zOSgwLjYxKX17NDAwfX0NCiQkDQoNCg0KJCQNCiA9IDAuMDI0NA0KJCQNCg0KLSAqKjkwJSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCg0KJCQNCvCdkY1fezAuMDV9PTEuNjQ1DQokJA0KDQokJA0KQ0lfezkwXCV9PSgwLjM1MCxcOjAuNDMwKQ0KJCQNCg0KLSAqKjk1JSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCiQkDQpaX3swLjAyNX09MS45Ng0KJCQNCg0KJCQNCkNJX3s5NVwlfT0oMC4zNDIsXDowLjQzOCkNCiQkDQoNCi0gKio5OSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KWl97MC4wMDV9PTIuNTc2DQokJA0KDQokJA0KQ0lfezk5XCV9PSgwLjMyNyxcOjAuNDUzKQ0KJCQNCg0KLS0tDQoNCiMjIyAqVklTVUFMSVNBU0kqDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YQ0KcF9oYXQgPC0gMTU2IC8gNDAwDQpuIDwtIDQwMA0KU0UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBDb25maWRlbmNlIGludGVydmFscw0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHMgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpKSwNCiAgTG93ZXIgPSBjKA0KICAgIHBfaGF0IC0gMS42NDUgKiBTRSwNCiAgICBwX2hhdCAtIDEuOTYgICogU0UsDQogICAgcF9oYXQgLSAyLjU3NiAqIFNFDQogICksDQogIFVwcGVyID0gYygNCiAgICBwX2hhdCArIDEuNjQ1ICogU0UsDQogICAgcF9oYXQgKyAxLjk2ICAqIFNFLA0KICAgIHBfaGF0ICsgMi41NzYgKiBTRQ0KICApDQopDQoNCiMgUGxvdA0KZ2dwbG90KGNpX2RhdGEsIGFlcyh5ID0gTGV2ZWwpKSArDQogIGdlb21fc2VnbWVudChhZXMoeCA9IExvd2VyLCB4ZW5kID0gVXBwZXIsIHllbmQgPSBMZXZlbCksIGxpbmV3aWR0aCA9IDEuMykgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gcF9oYXQpLCBzaXplID0gMykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvciBDVEEgQ2xpY2sgUHJvcG9ydGlvbiIsDQogICAgeCA9ICJDbGljay1UaHJvdWdoIFJhdGUgKFByb3BvcnRpb24pIiwNCiAgICB5ID0gIkNvbmZpZGVuY2UgTGV2ZWwiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXNpIGdyYWZpazoqKg0KDQotIENJICoqOTklKiogcGFsaW5nIGxlYmFyIChwYWxpbmcga29uc2VydmF0aWYpLg0KDQotIENJICoqOTAlKiogcGFsaW5nIHNlbXBpdCAobGViaWggcHJlc2lzaSkuDQoNCi0gVGl0aWsgbWVudW5qdWtrYW4gZXN0aW1hc2kgQ1RSID0gKiowLjM5LioqDQoNCi0tLQ0KDQojIyMgKlBFTkdBUlVIIENPTkZJREVOQ0UgTEVWRUwqDQoNCioqQ29uZmlkZW5jZSBMZXZlbCBSZW5kYWggKDkwJSk6KioNCg0KLSBJbnRlcnZhbCBsZWJpaCBzZW1waXQuDQoNCi0gS2VwdXR1c2FuIGxlYmloIGNlcGF0Lg0KDQotIFJpc2lrbyBrZXNhbGFoYW4gbGViaWggYmVzYXIuDQoNCioqQ29uZmlkZW5jZSBMZXZlbCBUaW5nZ2kgKDk5JSk6KioNCg0KLSBJbnRlcnZhbCBsZWJpaCBsZWJhci4NCg0KLSBLZXB1dHVzYW4gbGViaWggYW1hbi4NCg0KLSBDb2NvayB1bnR1ayBwZXJ1YmFoYW4gYmVzYXIgKGhpZ2ggcmlzaykuDQoNCioqUHJha3RpayBVbXVtIFByb2R1azoqKg0KDQotICoqOTUlKiogQ0kgcGFsaW5nIHNlcmluZyBkaWd1bmFrYW4NCuKGkiBrZXNlaW1iYW5nYW4gYW50YXJhIGtlY2VwYXRhbiBla3NwZXJpbWVuICYga2VwZXJjYXlhYW4gaGFzaWwuDQoNCioqSU5URVJQUkVUQVNJIEJJU05JUzoqKg0KDQpEZW5nYW4gKio5NSUqKiBjb25maWRlbmNlLCB0aW5na2F0IGtsaWsgQ1RBIGJlcmFkYSBhbnRhcmEgKiozNC4yJSBoaW5nZ2EgNDMuOCUuKiogSmlrYSBiYXRhcyBiYXdhaCBDSSBtYXNpaCBsZWJpaCB0aW5nZ2kgZGFyaSBkZXNhaW4gbGFtYSwgbWFrYSBkZXNhaW4gQ1RBIGJhcnUgbGF5YWsgdW50dWsgZGlsdW5jdXJrYW4uDQoNCiMjIENhc2UgU3R1ZHkgNCANCg0KKipQZXJiYW5kaW5nYW4gUHJlc2lzaSAoVWppIFogdnMgVWppIHQpOioqIER1YSB0aW0gZGF0YSBtZW5ndWt1ciAqKmxhdGVuc2kgQVBJIChkYWxhbSBtaWxpZGV0aWspKiogZGFsYW0ga29uZGlzaSB5YW5nIGJlcmJlZGEuDQoNClxiZWdpbntlcW5hcnJheSp9DQpcdGV4dHtUZWFtIEE6fSBcXA0KbiAmPSYgMzYgXHF1YWQgXHRleHR7KHNhbXBsZSBzaXplKX0gXFwNClxiYXJ7eH0gJj0mIDIxMCBccXVhZCBcdGV4dHsoc2FtcGxlIG1lYW4pfSBcXA0KXHNpZ21hICY9JiAyNCBccXVhZCBcdGV4dHsoa25vd24gcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24pfSBcXFs2cHRdDQoNClx0ZXh0e1RlYW0gQjp9IFxcDQpuICY9JiAzNiBccXVhZCBcdGV4dHsoc2FtcGxlIHNpemUpfSBcXA0KXGJhcnt4fSAmPSYgMjEwIFxxdWFkIFx0ZXh0eyhzYW1wbGUgbWVhbil9IFxcDQpzICY9JiAyNCBccXVhZCBcdGV4dHsoc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbil9DQpcZW5ke2VxbmFycmF5Kn0NCg0KKipUdWdhczoqKg0KDQoxLiBJZGVudGlmaWthc2kgdWppIHN0YXRpc3RpayB5YW5nIGRpZ3VuYWthbiBvbGVoIHNldGlhcCB0aW0uDQoyLiBIaXR1bmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWsgKio5MCUsIDk1JSwgZGFuIDk5JSoqLg0KMy4gQnVhdCB2aXN1YWxpc2FzaSB5YW5nIG1lbWJhbmRpbmdrYW4gc2VtdWEgaW50ZXJ2YWwuDQo0LiBKZWxhc2thbiBtZW5nYXBhICoqbGViYXIgaW50ZXJ2YWwgYmVyYmVkYSoqLCBtZXNraXB1biBkZW5nYW4gZGF0YSB5YW5nIHNlcnVwYS4NCg0KLS0tDQoNCiMjIyAqSURFTlRJRklLQVNJIFVKSSBTVEFUSVNUSUsqDQoNClBlbmVudHVhbiB1amkgc3RhdGlzdGlrIGRpZGFzYXJrYW4gcGFkYSBhcGFrYWggZGV2aWFzaSBzdGFuZGFyIHBvcHVsYXNpIGRpa2V0YWh1aSBhdGF1IGhhbnlhIGRpZXN0aW1hc2kgZGFyaSBzYW1wZWwuDQoNCi0gKipUZWFtIEEgKFVqaSBaKToqKiBNZW5nZ3VuYWthbiAqKlVqaSBaIChPbmUtc2FtcGxlIFotdGVzdCkqKiBrYXJlbmEgZGV2aWFzaSBzdGFuZGFyIHBvcHVsYXNpICoqKCRcc2lnbWEkKSoqIGRpa2V0YWh1aSBzZWNhcmEgcGFzdGkuDQoNCi0gKipUZWFtIEIgKFVqaSB0KToqKiBNZW5nZ3VuYWthbiAqKlVqaSB0IChPbmUtc2FtcGxlIHQtdGVzdCkqKiBrYXJlbmEgZGV2aWFzaSBzdGFuZGFyIHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aSwgc2VoaW5nZ2EgbWVuZ2d1bmFrYW4gZGV2aWFzaSBzdGFuZGFyIHNhbXBlbCAqKigkcyQpLioqIE1lc2tpcHVuIHVrdXJhbiBzYW1wZWwgKiooJG4gPSAzNiQpKiogY3VrdXAgYmVzYXIsIGRpc3RyaWJ1c2kgKiokdCQqKiBtZW1iZXJpa2FuIGhhc2lsIHlhbmcgbGViaWgga29uc2VydmF0aWYgZGFuIHRlcGF0IHVudHVrIGRhdGEgc2FtcGVsLg0KDQp8IFRpbSAgICB8IFVqaSBTdGF0aXN0aWsgICAgICAgICAgICAgfCBBbGFzYW4gICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IFRlYW0gQSB8ICoqWiBDb25maWRlbmNlIEludGVydmFsKiogfCDPgyBkaWtldGFodWkgICAgICAgICAgICAgICAgfA0KfCBUZWFtIEIgfCAqKnQgQ29uZmlkZW5jZSBJbnRlcnZhbCoqIHwgz4MgdGlkYWsgZGlrZXRhaHVpLCBwYWthaSBzIHwNCg0KLS0tDQoNCiMjIyAqUEVSSElUVU5HQU4gQ09ORklERU5DRSBJTlRFUlZBTCoNCg0KKipSdW11cyB1bXVtIHVudHVrIEludGVydmFsIEtlcGVyY2F5YWFuIChDSSk6KioNCg0KJCRcdGV4dHtDSX0gPSBcYmFye3h9IFxwbSAoXHRleHR7Q3JpdGljYWwgVmFsdWV9KSBcdGltZXMgXGZyYWN7cyBcdGV4dHsgYXRhdSB9IFxzaWdtYX17XHNxcnR7bn19DQokJA0KDQoqKlN0YW5kYXJkIEVycm9yIChzYW1hIHNlY2FyYSBudW1lcmlrKToqKg0KDQoNCiQkDQpTRSA9IFxmcmFjezI0fXtcc3FydHszNn19ID0gXGZyYWN7MjR9ezZ9ID0gNA0KJCQNCg0KDQotICoqWi1UZXN0IChUZWFtIEEpOioqDQoNCnwgQ29uZmlkZW5jZSB8IFogICAgIHwgQ0kgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8DQp8IDkwJSAgICAgICAgfCAxLjY0NSB8ICgyMDMuNDIgLCAyMTYuNTgpIHwNCnwgOTUlICAgICAgICB8IDEuOTYgIHwgKDIwMi4xNiAsIDIxNy44NCkgfA0KfCA5OSUgICAgICAgIHwgMi41NzYgfCAoMTk5LjcwICwgMjIwLjMwKSB8DQoNCg0KLSAqKnQtVGVzdCAoVGVhbSBCKSwgZGYgPSAzNSoqDQoNCnwgQ29uZmlkZW5jZSB8IHQgICAgIHwgQ0kgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8DQp8IDkwJSAgICAgICAgfCAxLjY5MCB8ICgyMDMuMjQgLCAyMTYuNzYpIHwNCnwgOTUlICAgICAgICB8IDIuMDMwIHwgKDIwMS44OCAsIDIxOC4xMikgfA0KfCA5OSUgICAgICAgIHwgMi43MjQgfCAoMTk5LjEwICwgMjIwLjkwKSB8DQoNCioqQ0kgdC1UZXN0Kiogc2VsYWx1IHNlZGlraXQgbGViaWggbGViYXIuDQoNCi0tLQ0KDQojIyMgKlZJU1VBTElTQVNJIFBFUkJBTkRJTkdBTiBJTlRFUlZBTCoNCg0KYGBge3IsZWNobz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBNZWFuIGFuZCBTRQ0KbWVhbl94IDwtIDIxMA0KU0UgPC0gNA0KDQojIFogaW50ZXJ2YWxzDQpDSV9aIDwtIGRhdGEuZnJhbWUoDQogIExldmVsID0gYygiOTAlIFoiLCAiOTUlIFoiLCAiOTklIFoiKSwNCiAgTG93ZXIgPSBtZWFuX3ggKyBjKC0xLjY0NSwgLTEuOTYsIC0yLjU3NikgKiBTRSwNCiAgVXBwZXIgPSBtZWFuX3ggKyBjKCAxLjY0NSwgIDEuOTYsICAyLjU3NikgKiBTRSwNCiAgVGVzdCAgPSAiWi1UZXN0Ig0KKQ0KDQojIHQgaW50ZXJ2YWxzIChkZiA9IDM1KQ0KQ0lfdCA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGMoIjkwJSB0IiwgIjk1JSB0IiwgIjk5JSB0IiksDQogIExvd2VyID0gbWVhbl94ICsgYygtMS42OTAsIC0yLjAzMCwgLTIuNzI0KSAqIFNFLA0KICBVcHBlciA9IG1lYW5feCArIGMoIDEuNjkwLCAgMi4wMzAsICAyLjcyNCkgKiBTRSwNCiAgVGVzdCAgPSAidC1UZXN0Ig0KKQ0KDQojIENvbWJpbmUNCkNJX2FsbCA8LSByYmluZChDSV9aLCBDSV90KQ0KDQojIFBsb3QNCmdncGxvdChDSV9hbGwsIGFlcyh5ID0gTGV2ZWwpKSArDQogIGdlb21fc2VnbWVudChhZXMoeCA9IExvd2VyLCB4ZW5kID0gVXBwZXIsIHllbmQgPSBMZXZlbCksIGxpbmV3aWR0aCA9IDEuMikgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gbWVhbl94KSwgc2l6ZSA9IDMpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJaLVRlc3QgdnMgdC1UZXN0IENvbmZpZGVuY2UgSW50ZXJ2YWwgQ29tcGFyaXNvbiIsDQogICAgeCA9ICJBUEkgTGF0ZW5jeSAobXMpIiwNCiAgICB5ID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgVHlwZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKipJbnRlcnByZXRhc2kgR3JhZmlrOioqDQoNCi0gSW50ZXJ2YWwgdC10ZXN0IGxlYmloIGxlYmFyIGRpYmFuZGluZyBaLXRlc3QuDQoNCi0gSGFsIGluaSB0ZXJqYWRpIGthcmVuYSDPgyBwb3B1bGFzaSB0aWRhayBkaWtldGFodWksIHNlaGluZ2dhIGtldGlkYWtwYXN0aWFuIGxlYmloIGJlc2FyLg0KDQotIFBhZGEgY29uZmlkZW5jZSBsZXZlbCB5YW5nIHNhbWEsIHNlbWFraW4gdGluZ2dpIGxldmVsIOKGkiBpbnRlcnZhbCBzZW1ha2luIGxlYmFyLg0KDQotLS0NCg0KIyMjICpNRU5HQVBBIExFQkFSIElOVEVSVkFMIEJFUkJFREEqDQoNCioqTWVza2lwdW4gbmlsYWkgcmF0YS1yYXRhIGRhbiBkZXZpYXNpIHN0YW5kYXJueWEgaWRlbnRpayAoMjQpLCB0ZXJkYXBhdCBwZXJiZWRhYW4gbGViYXIgaW50ZXJ2YWwga2FyZW5hIGZha3RvciBrZXRpZGFrcGFzdGlhbiAodW5jZXJ0YWludHkpOioqDQoNCi0gKipJbmZvcm1hc2kgeWFuZyBUZXJzZWRpYToqKiBUZWFtIEEgbWVtaWxpa2kgaW5mb3JtYXNpICJwYXN0aSIgbWVuZ2VuYWkgcG9wdWxhc2kgKiooJFxzaWdtYSQpLioqIFRlYW0gQiBoYW55YSBtZW1pbGlraSBlc3RpbWFzaSBkYXJpIHNhbXBlbCAqKigkcyQpLioqIEthcmVuYSAqKiRzJCoqIGJpc2EgYmVydmFyaWFzaSBkYXJpIHNhdHUgc2FtcGVsIGtlIHNhbXBlbCBsYWlubnlhLCBVamkgdCBtZW5hbWJhaGthbiAibWFyZ2luIHBlbmdhbWFuIiB5YW5nIGxlYmloIGx1YXMuDQoNCi0gKipLYXJha3RlcmlzdGlrIERpc3RyaWJ1c2k6KiogRGlzdHJpYnVzaSAqKiR0JCoqIG1lbWlsaWtpIGVrb3IgeWFuZyBsZWJpaCBnZW11ayAoaGVhdmllciB0YWlscykgZGliYW5kaW5na2FuIGRpc3RyaWJ1c2kgWi4gSW5pIGJlcmFydGkgcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHlhbmcgc2FtYSwgbmlsYWkga3JpdGlzICoqJHQkKiogYWthbiBzZWxhbHUgbGViaWggYmVzYXIgZGFyaXBhZGEgbmlsYWkga3JpdGlzICoqJFokLioqDQoNCi0gKipUaW5na2F0IEtlcGVyY2F5YWFuOioqIFNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4gKG1pc2FsICoqOTklKiopLCBzZW1ha2luIGJlc2FyIG5pbGFpIGtyaXRpcyB5YW5nIGRpZ3VuYWthbiwgc2VoaW5nZ2EgaW50ZXJ2YWwgc2VtYWtpbiBsZWJhciB1bnR1ayBtZW1hc3Rpa2FuIHBhcmFtZXRlciBwb3B1bGFzaSBiZW5hci1iZW5hciB0ZXJ0YW5na2FwIGRpIGRhbGFtbnlhLg0KDQoqKklOVEVSUFJFVEFTSSBQUkFLVElTIChEQVRBIEVOR0lORUVSSU5HKToqKg0KDQotIFRlYW0gQSBiaXNhIG1lbWJ1YXQga2VwdXR1c2FuIGxlYmloIGNlcGF0IGthcmVuYSBlc3RpbWFzaSBsZWJpaCBwcmVzaXNpLg0KDQotIFRlYW0gQiBsZWJpaCBrb25zZXJ2YXRpZiwgY29jb2sgdW50dWsgc2lzdGVtIGtyaXRpcy4NCg0KLSBVbnR1ayBsYXRlbmN5IEFQSSwgaW50ZXJ2YWwgc2VtcGl0ID0ga2VwZXJjYXlhYW4gdGluZ2dpIHRlcmhhZGFwIFNMQS4NCg0KIyMgQ2FzZSBTdHVkeSA1DQoNCioqSW50ZXJ2YWwgS2VwZXJjYXlhYW4gU2F0dSBTaXNpOioqIFNlYnVhaCBwZXJ1c2FoYWFuICoqU29mdHdhcmUgYXMgYSBTZXJ2aWNlIChTYWFTKSoqIGluZ2luIG1lbWFzdGlrYW4gYmFod2EgKipzZXRpZGFrbnlhIDcwJSBwZW5nZ3VuYSBha3RpZiBtaW5nZ3VhbioqIG1lbmdndW5ha2FuIGZpdHVyIHByZW1pdW0uDQoNCkRhcmkgcGVyY29iYWFuOg0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDI1MCBccXVhZCBcdGV4dHsodG90YWwgdXNlcnMpfSBcXA0KeCAmPSYgMTg1IFxxdWFkIFx0ZXh0eyhhY3RpdmUgcHJlbWl1bSB1c2Vycyl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCk1hbmFqZW1lbiBoYW55YSB0ZXJ0YXJpayBwYWRhICoqYmF0YXMgYmF3YWgqKiBkYXJpIGVzdGltYXNpIHRlcnNlYnV0Lg0KDQoqKlR1Z2FzOioqDQoNCjEuIElkZW50aWZpa2FzaSAqKmplbmlzIEludGVydmFsIEtlcGVyY2F5YWFuKiogZGFuIHVqaSB5YW5nIHNlc3VhaS4NCjIuIEhpdHVuZyAqKkludGVydmFsIEtlcGVyY2F5YWFuIGJhd2FoIHNhdHUgc2lzaSoqIHBhZGE6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBWaXN1YWxpc2FzaWthbiBiYXRhcyBiYXdhaCB1bnR1ayBzZW11YSB0aW5na2F0IGtlcGVyY2F5YWFuLg0KNC4gVGVudHVrYW4gYXBha2FoICoqdGFyZ2V0IDcwJSoqIHRlcnBlbnVoaSBzZWNhcmEgc3RhdGlzdGlrLg0KDQotLS0NCg0KIyMjICpKRU5JUyBDT05GSURFTkNFIElOVEVSVkFMICYgVUpJIFNUQVRJU1RJSyoNCg0KLSBKZW5pcyBJbnRlcnZhbDogKipMb3dlciBPbmUtU2lkZWQgQ29uZmlkZW5jZSBJbnRlcnZhbCoqIChCYXRhcyBCYXdhaCBTYXR1IFNpc2kpLiBNYW5hamVtZW4gaGFueWEgaW5naW4gbWVtYXN0aWthbiBiYWh3YSBwcm9wb3JzaSB0aWRhayBqYXR1aCBkaSBiYXdhaCBhbmdrYSB0ZXJ0ZW50dSAqKig3MCUpLioqDQoNCi0gVWppIHlhbmcgU2VzdWFpOiAqKk9uZS1TYW1wbGUgWi1UZXN0IGZvciBQcm9wb3J0aW9ucy4qKiBEZW5nYW4gKiokbiA9IDI1MCQsKiogc3lhcmF0IG5vcm1hbGl0YXMgdGVycGVudWhpIGthcmVuYSAqKiRucCQgZGFuICRuKDEtcCkkKioga2VkdWFueWEgamF1aCBkaSBhdGFzICoqMTAuKioNCg0KKipBbGFzYW46KioNCg0KLSBEYXRhIGJlcmJlbnR1ayBwcm9wb3JzaS4NCg0KLSBTYW1wZWwgYmVzYXIuDQoNCi0gRm9rdXMgaGFueWEgcGFkYSBiYXRhcyBiYXdhaC4NCg0KLS0tDQoNCiMjIyAqUEVSSElUVU5HQU4gQ09ORklERU5DRSBJTlRFUlZBTCoNCg0KDQoqKlNhbXBsZSBQcm9wb3J0aW9uOioqDQoNCiQkDQpcaGF0e3B9ID0gXGZyYWN7eH17bn09IFxmcmFjezE4NX17MjUwfT0gMC43NA0KJCQNCg0KKipTdGFuZGFyZCBFcnJvcjoqKg0KDQokJA0KU0UgPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fQ0KJCQNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MC43NCgxLTAuNzQpfXsyNTB9fQ0KJCQNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MC43NCgwLjI2KX17MjUwfX0NCiQkDQoNCiQkDQo9IDAuMDI3Nw0KJCQNCg0KKipSdW11cyBPbmUtU2lkZWQgTG93ZXIgQ0k6KioNCg0KJCQNClx0ZXh0e0xvd2VyIEJvdW5kfSA9IFxoYXR7cH0gLSBaX3tcYWxwaGF9IFxjZG90IFNFDQokJA0KDQoqKk9uZS1TaWRlZCBMb3dlciBDb25maWRlbmNlIEludGVydmFsczoqKg0KDQp8IENvbmZpZGVuY2UgTGV2ZWwgfCBazrEgICAgfCBQZXJoaXR1bmdnYW4gKCQwLjc0IC0gWiBcdGltZXMgMC4wMjc3JCkgIExvd2VyIEJvdW5kIHwNCnwgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tIHwgLS0tLS0tLS0tLS0gfA0KfCA5MCUgICAgICAgICAgICAgIHwgMS4yODIgfCAwLjcwNSAgICAgICB8DQp8IDk1JSAgICAgICAgICAgICAgfCAxLjY0NSB8IDAuNjk0ICAgICAgIHwNCnwgOTklICAgICAgICAgICAgICB8IDIuMzI2IHwgMC42NzYgICAgICAgfA0KDQotLS0NCg0KIyMjICpWSVNVQUxJU0FTSSBMT1dFUiBCT1VORFMqDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YQ0KcF9oYXQgPC0gMTg1IC8gMjUwDQpuIDwtIDI1MA0KU0UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBaIHZhbHVlcyAmIGNvbmZpZGVuY2UgbGV2ZWxzDQpjaV9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIExldmVsID0gZmFjdG9yKGMoIjkwJSIsICI5NSUiLCAiOTklIiksIGxldmVscyA9IGMoIjkwJSIsICI5NSUiLCAiOTklIikpLA0KICBaID0gYygxLjI4MiwgMS42NDUsIDIuMzI2KQ0KKQ0KDQojIExvd2VyIGJvdW5kcw0KY2lfZGF0YSRMb3dlckJvdW5kIDwtIHBfaGF0IC0gY2lfZGF0YSRaICogU0UNCg0KIyBQbG90DQpnZ3Bsb3QoY2lfZGF0YSwgYWVzKHggPSBMb3dlckJvdW5kLCB5ID0gTGV2ZWwpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC43MCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgNCiAgICAidGV4dCIsDQogICAgeCA9IDAuNzAsDQogICAgeSA9IDMuMywNCiAgICBsYWJlbCA9ICJUYXJnZXQgPSA3MCUiLA0KICAgIGhqdXN0ID0gMA0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJPbmUtU2lkZWQgTG93ZXIgQ29uZmlkZW5jZSBCb3VuZHMgZm9yIFByZW1pdW0gVXNhZ2UiLA0KICAgIHggPSAiTG93ZXIgQ29uZmlkZW5jZSBCb3VuZCAoUHJvcG9ydGlvbikiLA0KICAgIHkgPSAiQ29uZmlkZW5jZSBMZXZlbCINCiAgKSArDQogIHhsaW0oMC42NSwgMC43OCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXNpIGdyYWZpazoqKg0KDQotIFRpdGlrID0gbG93ZXIgYm91bmQuDQoNCi0gR2FyaXMgdmVydGlrYWwgPSB0YXJnZXQgKio3MCUqKi4NCg0KLSBKaWthIHRpdGlrIGJlcmFkYSBkaSBrYW5hbiBnYXJpcywgdGFyZ2V0IHRlcnBlbnVoaS4NCg0KLSBHcmFmaWsgbWVudW5qdWtrYW4gYmFod2EgaGFueWEgcGFkYSBjb25maWRlbmNlIGxldmVsICoqOTAlKiosDQpsb3dlciBib3VuZCBiZXJhZGEgZGkgYXRhcyB0YXJnZXQgKio3MCUqKi4NClBhZGEgY29uZmlkZW5jZSBsZXZlbCAqKjk1JSBkYW4gOTklKiosIHRhcmdldCBiZWx1bSB0ZXJwZW51aGkuDQoNCg0KLS0tDQoNCiMjIyAqQVBBS0FIIFRBUkdFVCA3MCUgVEVSUEVOVUhJKg0KDQoqKktlc2ltcHVsYW5ueWEgYmVyZ2FudHVuZyBwYWRhIHRpbmdrYXQga2V0YXRueWEgc3RhbmRhciB5YW5nIGRpZ3VuYWthbiBtYW5hamVtZW46KioNCg0KLSBQYWRhIFRpbmdrYXQgS2VwZXJjYXlhYW4gKio5MCU6KiogVEVSUEVOVUhJLiBTZWNhcmEgc3RhdGlzdGlrLCBraXRhIHlha2luICoqOTAlKiogYmFod2Egc2V0aWRha255YSAqKjcwLjQ1JSoqIHBlbmdndW5hIGFkYWxhaCBwZW5nZ3VuYSBwcmVtaXVtLiBLYXJlbmEgKio3MC40NSUgPiA3MCUsKiogdGFyZ2V0IHRlcmNhcGFpIHBhZGEgbGV2ZWwgaW5pLg0KDQotIFBhZGEgVGluZ2thdCBLZXBlcmNheWFhbiAqKjk1JToqKiBUSURBSyBURVJQRU5VSEkgKFNlY2FyYSBTdGF0aXN0aWspLiBCYXRhcyBiYXdhaCBiZXJhZGEgZGkgKio2OS40NCUuKiogTWVza2lwdW4gc2FuZ2F0IGRla2F0LCBraXRhIHRpZGFrIGJpc2EgbWVuamFtaW4gKioxMDAlKiogYmFod2EgYW5na2EgYXNsaW55YSB0aWRhayBiZXJhZGEgZGkgYmF3YWggKio3MCUqKiBkZW5nYW4gdGluZ2thdCBrZXlha2luYW4gaW5pLg0KDQotIFBhZGEgVGluZ2thdCBLZXBlcmNheWFhbiAqKjk5JSoqOiBUSURBSyBURVJQRU5VSEkuIE1hcmdpbiBrZXNhbGFoYW4gcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHRpbmdnaSB0ZXJsYWx1IGxlYmFyLCBzZWhpbmdnYSBiYXRhcyBiYXdhaCB0dXJ1biBrZSAqKjY3LjU2JS4qKg0KDQp8IENvbmZpZGVuY2UgfCBMb3dlciBCb3VuZCB8IFRhcmdldCA3MCUgfA0KfCAtLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tIHwNCnwgOTAlICAgICAgICB8IDcwLjUlICAgICAgIHwgICBZYSAgICAgICB8DQp8IDk1JSAgICAgICAgfCA2OS40JSAgICAgICB8ICAgVGlkYWsgICAgfA0KfCA5OSUgICAgICAgIHwgNjcuNiUgICAgICAgfCAgIFRpZGFrICAgIHwNCg0KKipJTlRFUlBSRVRBU0kgQklTTklTOioqDQoNCi0gRGVuZ2FuICoqOTAlKiogY29uZmlkZW5jZSwgcGVydXNhaGFhbiBkYXBhdCBtZW5na2xhaW0gdGFyZ2V0IDcwJSB0ZXJjYXBhaS4NCg0KLSBEZW5nYW4gKio5NSUgYXRhdSA5OSUqKiBjb25maWRlbmNlLCBidWt0aSBiZWx1bSBjdWt1cCBrdWF0Lg0KDQotIFNlbWFraW4gdGluZ2dpIGNvbmZpZGVuY2UgbGV2ZWwg4oaSIGtlcHV0dXNhbiBsZWJpaCBrb25zZXJ2YXRpZi4NCg0KIyMgUmVmZXJlbnNpDQoNCi0gaHR0cHM6Ly93d3cubXltYXRoc2Nsb3VkLmNvbS9hcGkvZG93bmxvYWQvbW9kdWxlcy9BUC1TdGF0aXN0aWNzL1RleHRib29rcy9TdGF0aXN0aWNzJTIwZm9yJTIwRHVtbWllcy5wZGY/aWQ9MjUzMDI2MzUmdXRtX3NvdXJjZT1jaGF0Z3B0LmNvbQ0KDQotIGh0dHBzOi8vYXNzZXRzLm9wZW5zdGF4Lm9yZy9vc2Ntcy1wcm9kY21zL21lZGlhL2RvY3VtZW50cy9JbnRyb2R1Y3RvcnlTdGF0aXN0aWNzLU9QX2k2dEFJN2UucGRmP3V0bV9zb3VyY2U9Y2hhdGdwdC5jb20NCg0KLSBodHRwczovL3VnZXNzMy53b3JkcHJlc3MuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAxL2JsdW1hbi1zdGVwLWJ5LXN0ZXAtc3RhdGlzdGljcy04dGgtZWRpdGlvbi5wZGY/dXRtX3NvdXJjZT1jaGF0Z3B0LmNvbQ0KDQoNCg0KDQoNCg==