Tugas Praktikum 1 dan 2


1.1 Praktikum 1

1.1.1 Mean untuk Data Kelompok

Mean (rata-rata) adalah ukuran pemusatan yang paling umum digunakan dalam statistik. Data kelompok adalah data yang sudah dikelompokkan dalam bentuk data kelompok. Menghitung mean pada datra kelompok tidak berbeda dengan perhitungan distribusi frekuensi tunggal. Hanya nilai X tidak mewakili nilai variable individu,melainkan mewakili titik tengah interval.

Langkah langkah untuk menghitung mean sebagai berikut :

  • Hitung nilai tengah (\(X_i\)) dari setiap kelas interval:

    \(X_i = \frac{\text{Tepi bawah kelas} + \text{Tepi atas kelas}}{2}\)

  • Kalikan Frekuensi (\(f\)) dengan Nilai Tengah (\(X_i\))} :

    Hitung \(f \cdot X_i\) untuk setiap kelas

  • Hitung Total \(\sum fX\)} :

    Jumlahkan semua hasil dari perkalian frekuensi dengan nilai tengah .

  • Hitung Total Frekuensi (\(n\))} :

    Jumlahkan seluruh frekuensi (𝑓).

  • Substitusi ke Rumus Mean :

\[ \bar{X} = \frac{\sum fX}{n} \]

dimana :

\[\begin{aligned} \bar{X} & = \text{rata-rata hitung data berkelompok} \\ \sum fX & = \text{jumlah dari seluruh hasil perkalian antara frekuensi dan nilai tengah masing-masing kelas} \\ n & = \text{jumlah total data} \end{aligned}\]

contoh :

Dibawah ini adalah data yang sudah dikelompokan dari 20 perusahaan yang sahamnya menjadi pilihan pada bulan maret 2003.

Tabel Data Kelompok untuk mean
Interval Nilai_Tengah Frekuensi
160 - 303 231,5 2
304 - 447 375,5 5
448 - 591 519,5 9
592 - 735 663,5 3
736 - 878 807 1

Penyelesaian dengan outliers:

\[ \bar{X} = \frac{\sum fX}{n} = \frac {2(231,5)+ 5(375,5)+ 9(519,5)+ 3(663,5)+ 1(807)}{20} = \frac {9.813,5}{20} = 490,68 \]

Penyelesaian tanpa outliers:

\[ \bar{X} = \frac{\sum fX}{n} = \frac {2(231,5)+ 5(375,5)+ 9(519,5)+ 3(663,5)}{20} = \frac {9006.5}{19} = 474,03 \]

Kesimpulan :

  • Rata-rata dengan outliers menghasilkan nilai 490,68, yang lebih tinggi dibandingkan rata-rata tanpa outliers. Hal ini menunjukkan bahwa keberadaan data ekstrem (outliers) memengaruhi hasil perhitungan, sehingga menyebabkan nilai rata-rata menjadi tidak sepenuhnya mewakili distribusi data mayoritas.

  • Rata-rata tanpa outliers menghasilkan nilai 474,03, yang lebih mencerminkan karakteristik utama data. Penghapusan outliers membantu mengurangi bias dalam perhitungan rata-rata dan memberikan hasil yang lebih representatif terhadap distribusi data utama.

  • Dengan itu juga penghapusan outliers penting untuk kedua metode ini agar mendapatkan gambaran yang lebih akurat tentang tren atau karakteristik data secara keseluruhan.

Mean dalam bentuk boxplot :

Mean dalam bentuk histogram :

1.1.2 Median untuk Data Kelompok

Median adalah nilai tengah dalam suatu kumpulan data yang telah diurutkan dari data terkecil hingga terbesar atau sebaliknya. Perhitungan median dengan data kelompok dapat dilakukan dengan bantuan frekuensi ku,mulatif kurang dari.

Langkah langkah untuk menghitung median sebagai beikut :

  • Hitung Total Frekuensi (𝑛)

  • Hitung nilai \(\frac{n}{2}\)

  • Kurangkan \(\sum f_{i_0}\) dari \(\frac{n}{2}\)

  • Bagikan hasil tersebut dengan \(f_m\)

  • Kalikan hasilnya dengan \(C\)

  • Tambahkan hasil ke \(tb\) untuk mendapatkan median

  • Substitusi ke Rumus Median:

\[ \text{Med} = tb + \left( \frac{\frac{n}{2} - \sum f_{i_0}}{f_m} \right). C \]

dimana :

\[ \begin{align*} tb & = \text{batas bawah untuk kelas dimana median berada} \\ C & = \text{interval kelas} \\ \sum f_{i_0} & = \text{jumlah frekuensi dari semua kelas dibawah kelas yang mengandung median} \\ f_m & = \text{frekuensi dari kelas yang mengandung median} \end{align*} \] contoh :

Terdapat data kelompok dibawah ini, hitung berapa mediannya !

Tabel Data Kelompok untuk median
Nilai Frekuensi
31 - 40 3
41 - 50 5
51 - 60 10
61 - 70 11
71 - 80 8
81 - 90 3
jumlah 40

penyelesaian :

Jumlah data sebesar 40, maka mediannya terletak pada :

\[ Q_2 = \frac {1}{2} \cdot 40 = 20 \] Maka median terletak didata ke-20.

Sebelum itu, kita harus menentukan frekuensi kumulatif :

Tabel Data Kelompok untuk median frekuensi kumulatif dengan outliers
Nilai Frekuensi Fkk
31 - 40 3 3
41 - 50 5 8
51 - 60 10 18
61 - 70 11 29
71 - 80 8 37
81 - 90 3 40

Pada tabel di atas, didapatkan data berupa:

\[ \begin{aligned} tb &= 61 - 0,5 = 60,5 \\ p &= 10 \\ F_m &= 11 \\ F &= 18 \\ \end{aligned} \]

Cara menghitung median dengan Outliers :

\[ \text{Median} = tb + \left( \frac{\frac{n}{2} - F}{F_m} \right).c \]

\[ \begin{aligned} \text{Median} &= 60,5 + \left( \frac{\frac{40}{2} - 18}{11} \right) 10 \\ &= 60,5 + \left( \frac{20 - 18}{11} \right) 10 \\ &= 60,5 + 1,82 \\ &= 62,32 \end{aligned} \]

Maka median dalam Outliers dari data tersebut adalah \(62,32\).

Cara menghitung median tanpa Outliers :

Tabel Data Kelompok untuk median frekuensi kumulatif tanpa outliers
Nilai Frekuensi Fkk
41 - 50 5 5
51 - 60 10 15
61 - 70 11 26
71 - 80 8 34

pada tabel data diatas, bisa didapatkan sebagai berikut :

  • Total 𝑛=34, sehingga \(\frac {n}{2} = 17\)

  • Kelas median: 61 − 70, dengan parameter :

\[ \begin{aligned} tb &= 61 - 0,5 = 60,5 \\ C &= 10 \\ F_m &= 11 \\ F &= 15 \\ \end{aligned} \]

  • subsitusikan ke rumus :

\[ \begin{aligned} \text{Median} &= 60,5 + \left( \frac{\frac{34}{2} - 15}{11} \right) 10 \\ &= 60,5 + \left( \frac{17 - 15}{11} \right) 10 \\ &= 60,5 + 1.818 \\ &= 62.32 \end{aligned} \]

Kesimpulan :

Hasil perhitungan median dari kedua metode yakni menggunakan outlier dan tanpa menggunakan outliers menunjukkan bahwa nilai median tidak berubah (tetap 62,32). Hal ini membuktikan bahwa median adalah ukuran pemusatan data yang robust atau kuat terhadap outliers, karena posisinya ditentukan oleh urutan data, bukan nilai-nilai ekstrem dalam distribusi. Median tetap menggambarkan nilai tengah data dengan konsisten meskipun distribusi data dimodifikasi.

Median dalam bentuk boxplot :

Median dalam bentuk histogram :

1.1.3 Modus untuk Data Kelompok

Modus adalah nilai yang sering muncul dalam sebuah dataset. Modus digunakan untuk mengetahui nilai yang paling dominan atau paling sering terjadi dalam suatu kumpulan data.

Langkah langkah menghitung modus sebagai berikut :

  • Kurangi frekuensi sebelum kelas modus (\(f_0\)) dari frekuensi kelas modus (\(f_1\))

  • Kurangi frekuensi setelah kelas modus (\(f_2\)) dari frekuensi kelas modus (\(f_1\))

  • Hitung pembilang = \((f_1 - f_0)\) dan penyebut = \((f_1 - f_0) + (f_1 - f_2)\)

  • Bagi pembilang dengan penyebut = \(\frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)}\)

  • Kalikan hasilnya dengan lebar kelas (\(C\))

  • Tambahkan hasil tersebut ke batas bawah kelas modus (\(tb\))

  • Substitusi ke Rumus Modus :

    \(\text{Modus} = tb + \left( \frac{(f_1 - f_0) }{f_1 - f_0 + (f_1 - f_2)} \right). C\)

  • Bisa Juga ditulis dengan :

    \(\text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right). C\)

    di mana:

\[ \begin{aligned} tb &= \text{batas bawah untuk kelas di mana modus berada} \\ C &= \text{interval kelas} \\ (f_1)_0 &= \text{selisih frekuensi yang memuat modus dengan frekuensi kelas sebelumnya} \\ (f_2)_0 &= \text{selisih frekuensi yang memuat modus dengan frekuensi kelas sesudahnya} \end{aligned} \]

contoh :

Sebuah sampel nilai penjualan mingguan (dalam juta rupiah) dari 60 penyalur barang antik di kota mojokerto disajikan seperti berikut :

Tabel Data Kelompok untuk modus frekuensi kumulatif dengan outliers dan tanpa outliers
Nilai_penjualan Banyak_penyalur Frekuensi
10 - 14 4 14,5
15 - 19 5 19,5
20 - 24 8 24,5
25 - 29 13 29,5
30 - 34 20 34,5
35 - 39 10 39,5

Dari tabel diatas, frekuensi modusnya adalah 20 dengan letak kelas ke-5 dan kelas nyatanya adalah 29,5 - 34,5. jadi :

\[ (f_1)_0= 20 - 13 = 7 \\ (f_2)_0 = 20 - 10 = 10 \\ tb = 29, 5 \\ C = 5 \]

Cara menghitung modus dengan Outliers ::

\[ \begin{aligned} \text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0}. C \right) \end{aligned} \]

\[ \begin{aligned} \text{Mod} &= 29,5 \left( \frac{7}{7 + 10} \right). 5 \\ &= 29,5 + (0,41)(5) \\ &= 29,5 + 2,05 \\ &= 31,55 \end{aligned} \]

Jadi, modus dari nilai penjualan mingguan 60 penyalur barang antik dikota mojokerto adalah sebanyak Rp. 31,55 Juta.

Cara menghitung modus tanpa Outliers :

\[ \begin{aligned} \text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0}. C \right) \end{aligned} \]

dengan parameter :

\[ 𝑓_𝑚 = 20 \\ (f_1)_0= 20 - 13 = 7 \\ (f_2)_0 = 20 - 10 = 10 \\ tb = 29, 5 \\ C = 5 \]

\[ \begin{aligned} \text{Mod} &= 29,5 \left( \frac{7}{7 + 10} \right). 5 \\ &= 29,5 + (0,41)(5) \\ &= 29,5 + 2,05 \\ &= 31,55 \end{aligned} \]

Kesimpulan :

  • Modus dengan dan tanpa outliers menghasilkan nilai yang sama, yaitu 31.56. Hal ini menunjukkan bahwa data dalam kelompok ini cukup stabil, sehingga keberadaan atau ketiadaan outliers tidak memengaruhi nilai modus. dan pada tabel Menggunakan semua data asli tanpa menghilangkan nilai ekstrem.

  • Modus 31.56 merepresentasikan nilai yang paling sering muncul dalam dataset ini, baik dengan maupun tanpa mempertimbangkan adanya outliers, sehingga mencerminkan karakteristik utama distribusi data. pada tabel dia Sama dengan data asli karena tidak ada nilai ekstrem (outliers) yang terdeteksi.

Modus dalam bentuk boxplot :

Modus dalam bentuk histogram :

1.2 Praktikum 2

1.2.1 Bisnis

Topik: Analisis data pendapatan bulanan karyawan

Sebuah perusahaan ingin menganalisis data pendapatan bulanan karyawan dari 40 orang. Berikut adalah data yang telah dikelompokkan dalam tabel frekuensi:

Tabel Data Kelompok untuk data kelompok gaji karyawan
Rentan_gaji Frekuensi
1.000.000 - 1.999.999 5
2.000.000 - 2.999.999 10
3.000.000 - 3.999.999 15
4.000.000 - 4.999.999 8
5.000.000 - 5.999.999 2

Penyelesaian :

Diketahui bahwa titik tengah, Frekuensi Kumulatif adalah sebagai berikut :

Tabel Data Kelompok untuk frekuensi kumulatif dan titik tengah dengan outliers
Rentan_gaji Frekuensi Fkk Titik_tengah hasil_kali_frekuensi_dan_titik_tengah
1.000.000 - 1.999.999 5 5 1.500.000 7.500.000
2.000.000 - 2.999.999 10 15 2.500.000 25.000.000
3.000.000 - 3.999.999 15 30 3.500.000 52.500.000
4.000.000 - 4.999.999 8 38 4.500.000 36.000.000
5.000.000 - 5.999.999 2 40 5.500.000 11.000.000

Mean :

Jumlah total frekuensi \(𝑁= 5 + 10 + 15 + 8 + 2 = 40\)

hitung rata-rata gaji karyawan dengan perkalian frekuensi dengan titik tengah, lalu dibagi dengan jumlah total frekuensi:

Menggunakan Outliers:

\[ \begin{aligned} \bar{X} = \frac{\sum fX}{n} = \frac {5(1.500.000)+ 10(2.500.000)+ 15(3.500.000)+ 8(4.500.000)+ 2(5.500.000)}{40} \end{aligned} \] \[ \begin{aligned} = \frac {132.000.000}{40} = 3.300.000 \end{aligned} \]

Tanpa menggunakan Outliers :

Tabel Data Kelompok untuk frekuensi kumulatif dan titik tengah tanpa outliers
Rentan_gaji Frekuensi Titik_tengah hasil_kali_frekuensi_dan_titik_tengah
1.000.000 - 1.999.999 5 1.500.000 7.500.000
2.000.000 - 2.999.999 10 2.500.000 25.000.000
3.000.000 - 3.999.999 15 3.500.000 52.500.000
4.000.000 - 4.999.999 8 4.500.000 36.000.000

Total \({fX}{n}\) tanpa outliers :

\[ 7.500.000+25.000.000+52.500.000+36.000.000=121.000.000 \]

Total Frekuensi tanpa outliers :

\[ 5+10+15+8=38 \]

Lalu Masukan dalam rumus ( tanpa outliers) :

\[ \bar{X} = \frac {121.000.000}{38} = 3.184.211 \]

Kesimpulan :

  • Mean dengan outliers menghasilkan nilai sebesar 3.300.000. Hal ini menunjukkan bahwa keberadaan data ekstrem pada rentang gaji 5.000.000 - 5.999.999 memengaruhi hasil rata-rata, sehingga menghasilkan nilai yang lebih tinggi dibandingkan dengan mayoritas data. Mean ini cocok digunakan jika analisis memerlukan inklusi data ekstrem, misalnya untuk memahami distribusi gaji tinggi.

  • Mean tanpa outliers menghasilkan nilai sebesar 3.184.211, yang lebih mencerminkan kondisi mayoritas data setelah menghilangkan pengaruh rentang gaji ekstrem. Mean ini lebih stabil dan relevan untuk analisis yang fokus pada tren utama dalam distribusi gaji.

Median :

Menggunakan Outliers:

\[ \begin{aligned} \text{Median} = tb + \left( \frac{\frac{n}{2} - F}{F_m} \right). C \end{aligned} \]

\[ \begin{aligned} = 2.999.999,5 + \left( \frac{\frac{40}{2} - 15}{15} \right) 1.000.000 \\ = 2.999.999,5 + \left( \frac{20 - 15}{15} \right) 1.000.000 \\ = 2.999.999,5 + 333.333,3 \\ = 3.333.332,8 Rp \end{aligned} \]

Tanpa menggunakan outliers

Posisi median untuk 𝑛 = 38 adalah:

\[ \frac {n}{2} = \frac {38}{2} = 19 \] Dimana:

𝐿 = batas bawah kelas median = 2.999.999 𝐹 = frekuensi kumulatif sebelum kelas median = 15 𝑓_𝑚 = frekuensi kelas median = 15 𝑐= panjang kelas = 1.000.000

\[ \begin{aligned} = 2.999.999,5 + \left( \frac{\frac{38}{2} - 15}{15} \right) 1.000.000 \\ = 2.999.999,5 + \left( \frac{19 - 15}{15} \right) 1.000.000 \\ = 2.999.999,5 + 266.666,67 \\ = 3.266.666 Rp \end{aligned} \]

Kesimpulan :

  • Dengan outliers, median yang lebih tinggi (3.333.333) mencerminkan keberadaan data yang sangat tinggi, yaitu rentang gaji 5.000.000 - 5.999.999, yang dapat menggeser nilai tengah ke atas.

  • Tanpa outliers, median yang lebih rendah (3.266.666) memberikan gambaran yang lebih akurat dan representatif tentang nilai tengah distribusi gaji penyalur jika mengabaikan data yang tidak biasa atau ekstrim.

  • Oleh karena itu, pemilihan antara menggunakan median dengan atau tanpa outliers sangat bergantung pada tujuan analisis. Jika tujuan analisis adalah menggambarkan distribusi keseluruhan data, termasuk ekstrem, maka median dengan outliers adalah pilihan yang tepat. Namun, jika ingin fokus pada distribusi mayoritas tanpa dipengaruhi oleh data ekstrim, maka median tanpa outliers lebih sesuai.

Modus :

Menggunakan Outliers dan tidak menggunakan Outliers:

\[ \begin{aligned} \text{Modus} = tb + \left( \frac{(f_1 - f_0) }{f_1 - f_0 + (f_1 - f_2)} \right).C \end{aligned} \]

\[ \begin{aligned} \text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right) .c \end{aligned} \]

\[ \begin{aligned} \text{Modus} = 2.999.999,5 + \left( \frac{15−10 }{ (15−10) + (15 - 8)} \right) \times 1.000.000 \end{aligned} \]

\[ \begin{aligned} \text{Mod} &= 2.999.999,5 \left( \frac{5}{5 + 7} \right) 1.000.000\\ &= 2.999.999,5+ (416.667) \\ &= 3.416.666,5 \end{aligned} \]

kelas pendapatan 4.000.000 - 4.999.999 adalah yang paling banyak muncul, sehingga modus memberikan kita indikasi bahwa pendapatan yang paling sering ditemukan di antara karyawan adalah sekitar Rp 3.416.666,5.

Kesimpulan :

  • Modus dengan outliers menghasilkan nilai sebesar 3.416.667, mencakup seluruh data termasuk rentang gaji ekstrem (outliers). Nilai ini mencerminkan kelas dengan frekuensi tertinggi, yaitu kelas 3.000.000 - 3.999.999, yang tetap dominan meskipun ada pengaruh data ekstrem.

  • Modus tanpa outliers juga menghasilkan nilai sebesar 3.416.667. Hal ini menunjukkan bahwa penghapusan outliers tidak memengaruhi hasil, karena kelas dengan frekuensi tertinggi tetap berada di rentang yang sama, yaitu kelas 3.000.000 - 3.999.999.

  • Kesimpulan: Modus dengan dan tanpa outliers memberikan hasil yang sama dalam kasus ini. Hal ini menunjukkan bahwa data cukup terkonsentrasi pada kelas dengan frekuensi tertinggi, sehingga data ekstrem tidak memengaruhi nilai modus secara signifikan.

1.2.2 Kesehatan

Topik: Analisis Distribusi Jumlah Dosis Vaksinasi COVID-19 di Kota Mojokerto

Sebuah dinas kesehatan di kota Mojokerto menganalisis jumlah dosis vaksinasi COVID-19 yang telah diberikan kepada penduduk dalam kelompok usia tertentu. Data jumlah dosis vaksin yang diterima penduduk di kota mojokerto dikelompokkan berdasarkan kelompok usia sebagai berikut:

Tabel Data Kelompok untuk analisis ditribusi jumlah vaksin
Kelompok_usia_.Tahun. Frekuensi_penerima_dosis_vaksin
18 - 29 1000
30 - 39 1500
40 - 49 1200
50 - 59 800
60 - 69 500

Penyelesaian :

Diketahui bahwa titik tengah, Frekuensi Kumulatif adalah sebagai berikut :

Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah analisis menggunakan outliers
Kelompok_usia_.Tahun. Frekuensi_penerima_dosis_vaksin Fkk Nilai_tengah hasil_kali_frekuensi_dan_nilai_tengah
18 - 29 1000 1000 23.5 23,500
30 - 39 1500 2500 34.5 51,750
40 - 49 1200 3700 44.5 53,400
50 - 59 800 4500 54.5 43,600
60 - 69 500 5000 64.5 32,250

Mean :

Jumlah total frekuensi 𝑁= 1000 + 1500 + 1200 + 800 + 500 = 5000

hitung rata-rata dosis vaksinasi:

Menggunakan Outliers

\[ \begin{aligned} \bar{X} = \frac{\sum fX}{n} = \frac {1000(23.5)+ 1500(34.5)+ 1200(44.5)+ 800(54.5)+ 500(64.5)}{5000} \end{aligned} \] \[ \begin{aligned} = \frac {204,500}{5000} = 40.9tahun \end{aligned} \]

Tanpa menggunakan Outliers

Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah analisis tanpa outliers
Kelompok_usia_.Tahun. Frekuensi_penerima_dosis_vaksin Nilai_tengah hasil_kali_frekuensi_dan_nilai_tengah
18 - 29 1000 23.5 23,500
30 - 39 1500 34.5 51,750
40 - 49 1200 44.5 53,400
50 - 59 800 54.5 43,600

Total frekuensi tanpa outliers:

\[ n=1000+1500+1200+800=4500 \]

Menghitung Mean Tanpa Outliers:

\[ \begin{aligned} \bar{X} = {\sum fX} = {23,500+ 51,750 + 53,400 + 43,600} = 172,250 \end{aligned} \] \[ \begin{aligned} = \frac {172,250}{4500} = 38.22 tahun \end{aligned} \]

Kesimpulan :

  • Mean dengan Outliers adalah 40.9, yang mencakup seluruh data, termasuk kelompok usia 60 - 69 yang dianggap sebagai outlier.

  • Mean tanpa Outliers adalah 38.22, yang diperoleh setelah mengabaikan kelompok usia 60 - 69 yang dianggap sebagai outlier.

  • Pengaruh Outliers: Mean dengan outliers lebih tinggi, menunjukkan pengaruh kelompok usia yang lebih tua yang memiliki nilai lebih tinggi (64.5), yang mempengaruhi rata-rata keseluruhan. Setelah menghapus data outlier, rata-rata menjadi lebih rendah, mencerminkan distribusi data mayoritas penerima vaksin.

Median :

Menggunakan Outliers

\[ \begin{aligned} \text{Median} = tb + \left( \frac{\frac{n}{2} - F}{F_m} \right). C \end{aligned} \]

\[ \begin{aligned} \text{Median} &= 29.5 + \left( \frac{\frac{5000}{2} - 1000}{1500} \right) 10 \\ &= 29.5 + \left( \frac{2500 - 1000}{1500} \right) 10 \\ &= 29.5 + 10 \\ &=39.5 tahun \end{aligned} \]

Tanpa menggunakan Outliers

Jumlah total frekuensi tanpa outliers 𝑛=4500

\[ \frac {n}{2} = \frac {4500}{2} = 2250 \] menghitung median tanpa outliers :

\[ \begin{aligned} \text{Median} &= 29.5 + \left( \frac{\frac{4500}{2} - 1000}{1500} \right) 10 \\ &= 29.5 + \left( \frac{2250 - 1000}{1500} \right) 10 \\ &= 29.5 + 8.33 \\ &=37.83 tahun \end{aligned} \]

Kesimpulan :

  • Median dengan Outliers (menghitung dengan seluruh data) adalah 39.5.

  • Median tanpa Outliers (mengabaikan kelompok usia 60 - 69 sebagai outlier) adalah 37.83.

  • Pengaruh Outliers: Perbedaan nilai median menunjukkan bahwa kelompok usia yang lebih tua (60 - 69) yang dianggap sebagai outlier memiliki dampak pada nilai median. Setelah mengabaikan outlier, nilai median sedikit lebih rendah, mencerminkan distribusi data mayoritas penerima vaksin yang lebih terpusat.

Modus :

Menggunnakan Outliers dan tanpa menggunakan Outliers

\[ \begin{aligned} \text{Modus} = tb + \left( \frac{(f_1 - f_0) }{f_1 - f_0 + (f_1 - f_2)} \right).C \end{aligned} \]

\[ \begin{aligned} \text{Mod} = tb + \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right).C \end{aligned} \]

\[ \begin{aligned} \text{Mod} &= 29.5 \left( \frac{500}{500 + 300} \right) 10\\ &= 29.5 + (0.625) \\ &= 35.75tahun \end{aligned} \]

Jadi modus diatas terdapat pada usia sekitar 36.25 tahun adalah usia yang paling sering mendapatkan vaksin, yang termasuk dalam kelompok usia 30 - 39 tahun.

Kesimpulan :

  • Nilai modus tidak terpengaruh oleh outliers dalam data ini.

  • Hal ini disebabkan oleh posisi kelas modus ( 30 − 39 ) yang tidak berubah meskipun outlier (kelas 60−69) dikeluarkan.

  • Modus memberikan informasi tentang kelompok usia yang paling umum dalam data penerima vaksin, yaitu 30 - 39 tahun, terlepas dari keberadaan outliers.

  • Penggunaan batas bawah 𝐿= 29.5 menghasilkan nilai modus yang sama untuk kedua metode. Ini terjadi karena frekuensi tertinggi tetap berada di kelas yang sama ( 30 − 39), sehingga outlier tidak memengaruhi hasil perhitungan modus.

Validasi Data

untuk memvalidasi data maka menggunakan presentase efektivitas vaksinasi tiap kelompok usia ( dalam bentuk % ) :

Tabel Data Kelompok untuk mevalidasi data menggunakan presentase efektivitas vaksinasi
Kelompok_Usia.Tahun. Frekuensi_penerima_vaksin Efektivitas_Vaksinasi…
18 - 29 1000 98%
30 - 39 1500 97%
40 - 49 1200 95%
50 - 59 800 90%
60 - 69 500 85%

Langkah-langkah validasi:

  1. Menghitung Total Efektivitas Vaksinasi dengan rumus :

\[ \text{Rata-rata Efektivitas} = \frac{\Sigma (\text{Frekuensi} \times \text{Efektivitas})}{\Sigma (\text{Frekuensi})} \]

Perhitungan:

\[ \begin{aligned} \text{Rata-rata Efektivitas} = \frac{(1000 \times 98) + (1500 \times 97) + (1200 \times 95) + (800 \times 90) + (500 \times 85)}{5000} \end{aligned} \]

\[ \begin{aligned} = \frac{98000 + 145500 + 114000 + 72000 + 42500}{5000} \end{aligned} \]

\[ \begin{aligned} = \frac{472000}{5000} = 94.4\% \end{aligned} \]

Jadi, rata-rata efektivitas vaksinasi adalah \({94.4\%}\).

  1. Membandingkan dengan Ambang Keberhasilan 99% :

Jika standar keberhasilan adalah 99%, rata-rata efektivitas sebesar 94.4% belum mencapai angka ini. Dengan demikian, vaksinasi pada kelompok ini belum memenuhi kriteria keberhasilan 99%.

  1. Analisis Per Kelompok Usia yang mendekati atau melebihi 99%:
  • Kelompok usia 18 - 29 tahun memiliki efektivitas tertinggi, yaitu 98%, tetapi masih di bawah 99%.

  • Kelompok lainnya memiliki efektivitas yang semakin menurun dengan bertambahnya usia.

  1. Kesimpulan Validasi:
  • Secara keseluruhan, rata-rata efektivitas vaksinasi adalah 94.4%, yang belum mencapai target keberhasilan 99%.

  • Per kelompok, tidak ada kelompok yang mencapai atau melebihi ambang 99%.

  • Untuk mencapai keberhasilan 99%, diperlukan strategi tambahan, seperti meningkatkan cakupan vaksinasi, optimasi dosis untuk kelompok usia tertentu, atau evaluasi terhadap jenis vaksin yang digunakan.

1.2.3 Pendidikan

Topik: Menganalisis bagaimana penggunaan media sosial memengaruhi produktivitas belajar siswa.

data tentang waktu penggunaan media sosial siswa setiap hari (dalam jam) dan rata-rata nilai ujian yang mereka peroleh. Data dibagi dalam kelompok waktu penggunaan media sosial sebagai berikut :

Tabel Data Kelompok untuk median frekuensi kumulatif
waktu_Penggunaan_Media_Sosial_.jam.hari. Frekuensi_siswa Rata_rata_nilai_ujian_.1.100.
0 - 1 8 85
2 - 3 12 75
4 - 5 10 65
6 - 7 5 60

Penyelesaian :

Diketahui bahwa titik tengah, Frekuensi Kumulatif adalah sebagai berikut :

Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah analisis menggunakan outliers
waktu_Penggunaan_Media_Sosial_.jam.hari. Frekuensi_siswa Fkk Titik_tengah hasil_kali_frekuensi_dan_titik_tengah
0 - 1 8 8 0.5 4
2 - 3 12 20 2.5 30
4 - 5 10 30 4.5 45
6 - 7 5 35 6.5 32.5

Mean :

Total frekuensi \((𝑁) = 35\)

Total \(𝑓.𝑥 = 4 + 30 + 45 + 32.5 = 111.5\)

hitung rata-rata penggunaan media sosial:

Menggunakan Outliers

\[ \begin{aligned} \bar{X} = \frac{\sum fX}{n} = \frac {8(0.5)+ 12(2.5)+ 10(4.5)+ 5(6.5)}{35} = \frac {111.5}{35} = 3.18 jam/hari. \end{aligned} \]

Tanpa menggunakan outliers

  • Hitung total hasil kali 𝑓⋅𝑥 tanpa outliers:

\[ Total f⋅x = 4 + 30 + 45 = 79 \] - Jumlah frekuensi (𝑛) tanpa outliers:

\[ n = 8 + 12 + 10 = 30 \]

  • hitung mean :

\[ \begin{aligned} \bar{X} = \frac{\sum fX}{n} = \frac {8(0.5)+ 12(2.5)+ 10(4.5)}{30} = \frac {79}{30} = 2.63 jam/hari. \end{aligned} \]

Kesimpulan :

  • Pengaruh outliers pada mean sangat signifikan. Nilai mean dengan outliers lebih tinggi dibandingkan tanpa outliers.

  • Mean tanpa outliers memberikan representasi yang lebih akurat terhadap waktu penggunaan media sosial mayoritas siswa.

  • Keputusan untuk menggunakan mean dengan atau tanpa outliers tergantung pada tujuan analisis:

    • Dengan outliers: Menggambarkan seluruh distribusi data, termasuk ekstrem.

    • Tanpa outliers: Memberikan gambaran yang lebih stabil dan realistis terhadap data umum.

Median :

Menggunakan Outliers

\[ \begin{aligned} \text{Median} = L_0 + \left( \frac{\frac{n}{2} - F}{F_m} \right). C \end{aligned} \]

\[ \begin{aligned} \text{Median} &= 2 + \left( \frac{\frac{35}{2} - 8}{12} \right) 2 \\ &= 2 + \left( \frac{17.5−8}{12} \right) 2 \\ &= 2+ 1,58 \\ &=3.58 jam/hari. \end{aligned} \]

tanpa menggunakan ourliers

Tabel Data Kelompok untuk frekuensi kumulatif dan nilai tengah analisis tanpa outliers
waktu_Penggunaan_Media_Sosial_.jam.hari. Frekuensi_siswa Fkk
0 - 1 8 8
2 - 3 12 20
4 - 5 10 30
  • mencari :

\[ \frac{n}{2} = \frac{30}{2} = 15 \] - hitung median :

\[ \begin{aligned} \text{Median} &= 2 + \left( \frac{\frac{30}{2} - 8}{12} \right) 2 \\ &= 2 + \left( \frac{15−8}{12} \right) 2 \\ &= 2+ 1,17 \\ &=3.17 jam/hari. \end{aligned} \]

Kesimpulan :

  • Pengaruh outliers pada median tidak terlalu besar, tetapi tetap memberikan perbedaan. Median dengan outliers sedikit lebih tinggi, mencerminkan pengaruh data ekstrem pada nilai tengah.

  • Median tanpa outliers memberikan gambaran yang lebih stabil dan representatif untuk mayoritas data, dengan waktu penggunaan media sosial yang lebih realistis bagi sebagian besar siswa.

Modus :

Menggunakan Outliers dan tanpa outliers

\[ \begin{aligned} \text{Modus} = L_0 + \left( \frac{(f_1 - f_0) }{f_1 - f_0 + (f_1 - f_2)} \right) C \end{aligned} \]

\[ \begin{aligned} \text{Mod} = L_0 \left( \frac{(f_1)_0}{(f_1)_0 + (f_2)_0} \right).C \end{aligned} \] \[ \begin{aligned} \text{Modus} = 2 + \left( \frac{(12−8) }{12 - 8 + (12 - 10)} \right). 2 \end{aligned} \] \[ \begin{aligned} \text{Mod} &= 2 \left( \frac{4}{4 + 2} \right). 2\\ &= 2+1.33 \\ &= 3.33 jam/hari. \end{aligned} \]

Berdasarkan perhitungan menggunakan metode modus, ditemukan bahwa kelas interval 2 - 3 jam/hari adalah kelas dengan frekuensi tertinggi, yaitu sebanyak 12 siswa. Dengan didapatkan nilai modus sebesar 2.67 jam/hari.

Kesimpulan :

  • Modus dengan dan tanpa outliers menghasilkan nilai yang sama dalam kasus ini. Ini menunjukkan bahwa data dalam kelompok ini cukup terkonsentrasi pada kelas dengan frekuensi tinggi (2 - 3 jam/hari), sehingga pengaruh data ekstrem pada kelas 6 - 7 jam/hari tidak terlalu mempengaruhi nilai modus.

  • Modus yang ditemukan adalah 3.33 jam/hari, yang menunjukkan waktu penggunaan media sosial yang paling umum digunakan oleh siswa dalam dataset ini, baik dengan maupun tanpa memperhitungkan outliers.

LS0tDQp0aXRsZTogIlR1Z2FzIFByYWt0aWt1bSAxIGRhbiAyIg0KYXV0aG9yOiAiV2hpcmR5YW5hIFNoYWxmYSBBeXViaSINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogIkM6L1VzZXJzL1NBTEZBL09uZURyaXZlL0RvY3VtZW50cy9wcmFrdGlrdW0vc3R5bGUuY3NzIg0KLS0tDQoNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIDEuMSBQcmFrdGlrdW0gMQ0KDQojIDEuMS4xIE1lYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQogTWVhbiAocmF0YS1yYXRhKSBhZGFsYWggdWt1cmFuIHBlbXVzYXRhbiB5YW5nIHBhbGluZyB1bXVtIGRpZ3VuYWthbiBkYWxhbSBzdGF0aXN0aWsuIERhdGEga2Vsb21wb2sgYWRhbGFoIGRhdGEgeWFuZyBzdWRhaCBkaWtlbG9tcG9ra2FuIGRhbGFtIGJlbnR1ayBkYXRhIGtlbG9tcG9rLiBNZW5naGl0dW5nIG1lYW4gcGFkYSBkYXRyYSBrZWxvbXBvayB0aWRhayBiZXJiZWRhIGRlbmdhbiBwZXJoaXR1bmdhbiBkaXN0cmlidXNpIGZyZWt1ZW5zaSB0dW5nZ2FsLiBIYW55YSBuaWxhaSBYIHRpZGFrIG1ld2FraWxpIG5pbGFpIHZhcmlhYmxlIGluZGl2aWR1LG1lbGFpbmthbiBtZXdha2lsaSB0aXRpayB0ZW5nYWggaW50ZXJ2YWwuDQogDQoNCiBMYW5na2FoIGxhbmdrYWggdW50dWsgbWVuZ2hpdHVuZyBtZWFuIHNlYmFnYWkgYmVyaWt1dCA6DQoNCg0KLSBIaXR1bmcgbmlsYWkgdGVuZ2FoIChcKFhfaVwpKSBkYXJpIHNldGlhcCBrZWxhcyBpbnRlcnZhbDoNCg0KICAkWF9pID0gXGZyYWN7XHRleHR7VGVwaSBiYXdhaCBrZWxhc30gKyBcdGV4dHtUZXBpIGF0YXMga2VsYXN9fXsyfSQNCg0KDQotIEthbGlrYW4gRnJla3VlbnNpIChcKGZcKSkgZGVuZ2FuIE5pbGFpIFRlbmdhaCAoXChYX2lcKSl9IDoNCg0KICBIaXR1bmcgXChmIFxjZG90IFhfaVwpIHVudHVrIHNldGlhcCBrZWxhcw0KDQoNCi0gSGl0dW5nIFRvdGFsIFwoXHN1bSBmWFwpfSA6DQoNCiAgSnVtbGFoa2FuIHNlbXVhIGhhc2lsIGRhcmkgcGVya2FsaWFuIGZyZWt1ZW5zaSBkZW5nYW4gbmlsYWkgdGVuZ2FoIC4NCg0KDQotIEhpdHVuZyBUb3RhbCBGcmVrdWVuc2kgKFwoblwpKX0gOg0KDQogIEp1bWxhaGthbiBzZWx1cnVoIGZyZWt1ZW5zaSAo8J2RkykuDQoNCg0KLSBTdWJzdGl0dXNpIGtlIFJ1bXVzIE1lYW4gOg0KDQokJA0KXGJhcntYfSA9IFxmcmFje1xzdW0gZlh9e259DQokJA0KIA0KZGltYW5hIDogDQoNCg0KXGJlZ2lue2FsaWduZWR9DQpcYmFye1h9ICYgPSBcdGV4dHtyYXRhLXJhdGEgaGl0dW5nIGRhdGEgYmVya2Vsb21wb2t9IFxcDQpcc3VtIGZYICYgPSBcdGV4dHtqdW1sYWggZGFyaSBzZWx1cnVoIGhhc2lsIHBlcmthbGlhbiBhbnRhcmEgZnJla3VlbnNpIGRhbiBuaWxhaSB0ZW5nYWggbWFzaW5nLW1hc2luZyBrZWxhc30gXFwNCm4gJiA9IFx0ZXh0e2p1bWxhaCB0b3RhbCBkYXRhfQ0KXGVuZHthbGlnbmVkfQ0KDQoNCmNvbnRvaCA6DQoNCiAgRGliYXdhaCBpbmkgYWRhbGFoIGRhdGEgeWFuZyBzdWRhaCBkaWtlbG9tcG9rYW4gZGFyaSAyMCBwZXJ1c2FoYWFuIHlhbmcgc2FoYW1ueWEgbWVuamFkaSBwaWxpaGFuIHBhZGEgICAgIGJ1bGFuIG1hcmV0IDIwMDMuDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEga2Vsb21wb2sNCmxpYnJhcnkoa25pdHIpDQoNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgIkludGVydmFsIiA9IGMoIjE2MCAtIDMwMyIsICIzMDQgLSA0NDciLCAiNDQ4IC0gNTkxIiwgIjU5MiAtIDczNSIsICI3MzYgLSA4NzgiKSwNCiAgIk5pbGFpX1RlbmdhaCIgPSBjKCIyMzEsNSIsICIzNzUsNSIsICI1MTksNSIsICI2NjMsNSIsICI4MDciKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKDIsIDUsIDksIDMsIDEpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgbWVhbiIpDQoNCmBgYA0KDQojIyBQZW55ZWxlc2FpYW4gZGVuZ2FuIG91dGxpZXJzOg0KDQokJA0KXGJhcntYfSA9IFxmcmFje1xzdW0gZlh9e259ID0gXGZyYWMgezIoMjMxLDUpKyA1KDM3NSw1KSsgOSg1MTksNSkrIDMoNjYzLDUpKyAxKDgwNyl9ezIwfSANCj0gXGZyYWMgezkuODEzLDV9ezIwfQ0KPSA0OTAsNjgNCiQkDQoNCiMjIFBlbnllbGVzYWlhbiB0YW5wYSBvdXRsaWVyczoNCg0KJCQNClxiYXJ7WH0gPSBcZnJhY3tcc3VtIGZYfXtufSA9IFxmcmFjIHsyKDIzMSw1KSsgNSgzNzUsNSkrIDkoNTE5LDUpKyAzKDY2Myw1KX17MjB9IA0KPSBcZnJhYyB7OTAwNi41fXsxOX0NCj0gNDc0LDAzDQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBSYXRhLXJhdGEgZGVuZ2FuIG91dGxpZXJzIG1lbmdoYXNpbGthbiBuaWxhaSA0OTAsNjgsIHlhbmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiByYXRhLXJhdGEgdGFucGEgb3V0bGllcnMuIEhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2Ega2ViZXJhZGFhbiBkYXRhIGVrc3RyZW0gKG91dGxpZXJzKSBtZW1lbmdhcnVoaSBoYXNpbCBwZXJoaXR1bmdhbiwgc2VoaW5nZ2EgbWVueWViYWJrYW4gbmlsYWkgcmF0YS1yYXRhIG1lbmphZGkgdGlkYWsgc2VwZW51aG55YSBtZXdha2lsaSBkaXN0cmlidXNpIGRhdGEgbWF5b3JpdGFzLg0KDQotIFJhdGEtcmF0YSB0YW5wYSBvdXRsaWVycyBtZW5naGFzaWxrYW4gbmlsYWkgNDc0LDAzLCB5YW5nIGxlYmloIG1lbmNlcm1pbmthbiBrYXJha3RlcmlzdGlrIHV0YW1hIGRhdGEuIFBlbmdoYXB1c2FuIG91dGxpZXJzIG1lbWJhbnR1IG1lbmd1cmFuZ2kgYmlhcyBkYWxhbSBwZXJoaXR1bmdhbiByYXRhLXJhdGEgZGFuIG1lbWJlcmlrYW4gaGFzaWwgeWFuZyBsZWJpaCByZXByZXNlbnRhdGlmIHRlcmhhZGFwIGRpc3RyaWJ1c2kgZGF0YSB1dGFtYS4NCg0KLSBEZW5nYW4gaXR1IGp1Z2EgcGVuZ2hhcHVzYW4gb3V0bGllcnMgcGVudGluZyB1bnR1ayBrZWR1YSBtZXRvZGUgaW5pIGFnYXIgbWVuZGFwYXRrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCBha3VyYXQgdGVudGFuZyB0cmVuIGF0YXUga2FyYWt0ZXJpc3RpayBkYXRhIHNlY2FyYSBrZXNlbHVydWhhbi4NCg0KIyMgTWVhbiBkYWxhbSBiZW50dWsgYm94cGxvdCA6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIH0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IEludGVydmFsIG5pbGFpIGRhbiBmcmVrdWVuc2kNCmludGVydmFsIDwtIGMoIjE2MCAtIDMwMyIsICIzMDQgLSA0NDciLCAiNDQ4IC0gNTkxIiwgIjU5MiAtIDczNSIsICI3MzYgLSA4NzgiKQ0KZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDIsIDUsIDksIDMsIDEpICAjIERlbmdhbiBvdXRsaWVycw0KZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIGMoMiwgNSwgOSwgMywgMCkgICAgICMgVGFucGEgb3V0bGllcnMgKG1lbmdoYXB1cyBrZWxhcyA3MzYgLSA4NzgpDQoNCiMgTmlsYWkgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbA0KbmlsYWlfdGVuZ2FoIDwtIGMoMjMxLjUsIDM3NS41LCA1MTkuNSwgNjYzLjUsIDgwNykNCg0KIyBNZW5naGl0dW5nIHRvdGFsIGZyZWt1ZW5zaSB1bnR1ayBrZWR1YSBkYXRhc2V0DQp0b3RhbF9mcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzKQ0KdG90YWxfZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzICogbmlsYWlfdGVuZ2FoKSAvIHRvdGFsX2ZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMNCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gc3VtKGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyAqIG5pbGFpX3RlbmdhaCkgLyB0b3RhbF9mcmVrdWVuc2lfdGFucGFfb3V0bGllcnMNCg0KIyBNZW1idWF0IGRhdGEgdW50dWsgYm94cGxvdA0KIyBEYXRhIGRlbmdhbiBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gcmVwKG5pbGFpX3RlbmdhaCwgZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycykNCiMgRGF0YSB0YW5wYSBvdXRsaWVycw0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwgDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSwgDQogIHkgPSB+TmlsYWksIA0KICBjb2xvciA9IH5LZWxvbXBvaywgDQogIHR5cGUgPSAiYm94IiwgDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIsICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQogIGJveG1lYW4gPSBUUlVFICAjIE1lbmFtcGlsa2FuIGdhcmlzIHBlbWJhdGFzIHVudHVrIHJhdGEtcmF0YQ0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lYW4iLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMg0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMg0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQojIyBNZWFuIGRhbGFtIGJlbnR1ayBoaXN0b2dyYW0gOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBJbnRlcnZhbCBuaWxhaSBkYW4gZnJla3VlbnNpDQppbnRlcnZhbCA8LSBjKCIxNjAgLSAzMDMiLCAiMzA0IC0gNDQ3IiwgIjQ0OCAtIDU5MSIsICI1OTIgLSA3MzUiLCAiNzM2IC0gODc4IikNCmZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMgPC0gYygyLCA1LCA5LCAzLCAxKSAgIyBEZW5nYW4gb3V0bGllcnMNCmZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyA8LSBjKDIsIDUsIDksIDMsMCkgICAgICMgVGFucGEgb3V0bGllcnMgKG1lbmdoYXB1cyBrZWxhcyA3MzYgLSA4NzgpDQoNCiMgTmlsYWkgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbA0KbmlsYWlfdGVuZ2FoIDwtIGMoMjMxLjUsIDM3NS41LCA1MTkuNSwgNjYzLjUsIDgwNykNCg0KIyBNZW5naGl0dW5nIHRvdGFsIGZyZWt1ZW5zaSB1bnR1ayBrZWR1YSBkYXRhc2V0DQp0b3RhbF9mcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzKQ0KdG90YWxfZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmcmVrdWVuc2lfZGVuZ2FuX291dGxpZXJzICogbmlsYWlfdGVuZ2FoKSAvIHRvdGFsX2ZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMNCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gc3VtKGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyAqIG5pbGFpX3RlbmdhaCkgLyB0b3RhbF9mcmVrdWVuc2lfdGFucGFfb3V0bGllcnMNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBtYXNpbmctbWFzaW5nIGRhdGFzZXQNCiMgRGF0YSBkZW5nYW4gb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIHJlcChuaWxhaV90ZW5nYWgsIGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMpDQojIERhdGEgdGFucGEgb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gcmVwKG5pbGFpX3RlbmdhaCwgZnJla3VlbnNpX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdoaXR1bmcgZGVuc2l0eSBwbG90DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgUGFzdGlrYW4gdGlkYWsgYWRhIG5pbGFpIG5lZ2F0aWYgZGkgeCBkYW4geQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X3RhbnBhX291dGxpZXJzJHgpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fZGVuZ2FuX291dGxpZXJzLCBtZWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl90YW5wYV9vdXRsaWVycywgbWVhbl90YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJSYXRhLXJhdGEgKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIHJhdGEtcmF0YSBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayByYXRhLXJhdGEgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQoNCiMgMS4xLjIgTWVkaWFuIHVudHVrIERhdGEgS2Vsb21wb2sNCg0KICBNZWRpYW4gYWRhbGFoIG5pbGFpIHRlbmdhaCBkYWxhbSBzdWF0dSBrdW1wdWxhbiBkYXRhIHlhbmcgdGVsYWggZGl1cnV0a2FuIGRhcmkgZGF0YSB0ZXJrZWNpbCBoaW5nZ2EgdGVyYmVzYXIgYXRhdSBzZWJhbGlrbnlhLiBQZXJoaXR1bmdhbiBtZWRpYW4gZGVuZ2FuIGRhdGEga2Vsb21wb2sgZGFwYXQgZGlsYWt1a2FuIGRlbmdhbiBiYW50dWFuIGZyZWt1ZW5zaSBrdSxtdWxhdGlmIGt1cmFuZyBkYXJpLiANCiAgDQogIExhbmdrYWggbGFuZ2thaCB1bnR1ayBtZW5naGl0dW5nIG1lZGlhbiBzZWJhZ2FpIGJlaWt1dCA6DQoNCi0gSGl0dW5nIFRvdGFsIEZyZWt1ZW5zaSAo8J2RmykNCg0KLSBIaXR1bmcgbmlsYWkgXChcZnJhY3tufXsyfVwpDQoNCi0gS3VyYW5na2FuIFwoXHN1bSBmX3tpXzB9XCkgZGFyaSBcKFxmcmFje259ezJ9XCkNCg0KLSBCYWdpa2FuIGhhc2lsIHRlcnNlYnV0IGRlbmdhbiBcKGZfbVwpDQoNCi0gS2FsaWthbiBoYXNpbG55YSBkZW5nYW4gXChDXCkNCg0KLSBUYW1iYWhrYW4gaGFzaWwga2UgXCh0YlwpIHVudHVrIG1lbmRhcGF0a2FuIG1lZGlhbg0KDQotIFN1YnN0aXR1c2kga2UgUnVtdXMgTWVkaWFuOg0KDQokJA0KXHRleHR7TWVkfSA9IHRiICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gXHN1bSBmX3tpXzB9fXtmX219IFxyaWdodCkuIEMNCiQkDQoNCmRpbWFuYSA6IA0KDQokJA0KXGJlZ2lue2FsaWduKn0NCnRiICYgPSBcdGV4dHtiYXRhcyBiYXdhaCB1bnR1ayBrZWxhcyBkaW1hbmEgbWVkaWFuIGJlcmFkYX0gXFwNCkMgJiA9IFx0ZXh0e2ludGVydmFsIGtlbGFzfSBcXA0KXHN1bSBmX3tpXzB9ICYgPSBcdGV4dHtqdW1sYWggZnJla3VlbnNpIGRhcmkgc2VtdWEga2VsYXMgZGliYXdhaCBrZWxhcyB5YW5nIG1lbmdhbmR1bmcgbWVkaWFufSBcXA0KZl9tICYgPSBcdGV4dHtmcmVrdWVuc2kgZGFyaSBrZWxhcyB5YW5nIG1lbmdhbmR1bmcgbWVkaWFufQ0KXGVuZHthbGlnbip9DQokJA0KY29udG9oIDogDQoNClRlcmRhcGF0IGRhdGEga2Vsb21wb2sgZGliYXdhaCBpbmksIGhpdHVuZyBiZXJhcGEgbWVkaWFubnlhICENCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWkiID0gYygiMzEgLSA0MCIsICI0MSAtIDUwIiwgIjUxIC0gNjAiLCAiNjEgLSA3MCIsICI3MSAtIDgwIiwgIjgxIC0gOTAiLCAianVtbGFoIiksDQogICJGcmVrdWVuc2kiID0gYygzLCA1LCAxMCwgMTEsIDgsIDMsIDQwKQ0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIG1lZGlhbiIpDQoNCmBgYA0KDQpwZW55ZWxlc2FpYW4gOg0KDQpKdW1sYWggZGF0YSBzZWJlc2FyIDQwLCBtYWthIG1lZGlhbm55YSB0ZXJsZXRhayBwYWRhIDoNCg0KJCQNClFfMiA9IFxmcmFjIHsxfXsyfSBcY2RvdCA0MCA9IDIwDQokJA0KTWFrYSBtZWRpYW4gdGVybGV0YWsgZGlkYXRhIGtlLTIwLg0KDQpTZWJlbHVtIGl0dSwga2l0YSBoYXJ1cyBtZW5lbnR1a2FuIGZyZWt1ZW5zaSBrdW11bGF0aWYgIDoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWkiID0gYygiMzEgLSA0MCIsICI0MSAtIDUwIiwgIjUxIC0gNjAiLCAiNjEgLSA3MCIsICI3MSAtIDgwIiwgIjgxIC0gOTAiKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKDMsIDUsIDEwLCAxMSwgOCwgMyksDQogICJGa2siID0gYygiMyIsICI4IiwgIjE4IiwgIjI5IiwgIjM3IiwgIjQwIikNCiAgIA0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIG1lZGlhbiBmcmVrdWVuc2kga3VtdWxhdGlmIGRlbmdhbiBvdXRsaWVycyIpDQoNCmBgYA0KDQpQYWRhIHRhYmVsIGRpIGF0YXMsIGRpZGFwYXRrYW4gZGF0YSBiZXJ1cGE6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCiAgICB0YiAmPSA2MSAtIDAsNSA9IDYwLDUgXFwNCiAgICBwICY9IDEwIFxcDQogICAgRl9tICY9IDExIFxcDQogICAgRiAmPSAxOCBcXA0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgQ2FyYSBtZW5naGl0dW5nIG1lZGlhbiBkZW5nYW4gT3V0bGllcnMgOg0KDQokJA0KXHRleHR7TWVkaWFufSA9IHRiICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Rl9tfSBccmlnaHQpLmMNCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01lZGlhbn0gJj0gNjAsNSArIFxsZWZ0KCBcZnJhY3tcZnJhY3s0MH17Mn0gLSAxOH17MTF9IFxyaWdodCkgMTAgXFwNCiY9IDYwLDUgKyBcbGVmdCggXGZyYWN7MjAgLSAxOH17MTF9IFxyaWdodCkgMTAgXFwgJj0gNjAsNSArIDEsODIgXFwgJj0gNjIsMzINClxlbmR7YWxpZ25lZH0NCiQkDQoNCiAgTWFrYSBtZWRpYW4gZGFsYW0gT3V0bGllcnMgIGRhcmkgZGF0YSB0ZXJzZWJ1dCBhZGFsYWggXCggNjIsMzIgXCkuDQogIA0KIyMgQ2FyYSBtZW5naGl0dW5nIG1lZGlhbiB0YW5wYSBPdXRsaWVycyA6ICANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWkiID0gYygiNDEgLSA1MCIsICI1MSAtIDYwIiwgIjYxIC0gNzAiLCAiNzEgLSA4MCIpLA0KICAiRnJla3VlbnNpIiA9IGMoNSwgMTAsIDExLCA4KSwNCiAgIkZrayIgPSBjKCI1IiwgIjE1IiwgIjI2IiwgIjM0IikNCiAgIA0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIG1lZGlhbiBmcmVrdWVuc2kga3VtdWxhdGlmIHRhbnBhIG91dGxpZXJzIikNCg0KYGBgDQoNCnBhZGEgdGFiZWwgZGF0YSBkaWF0YXMsIGJpc2EgZGlkYXBhdGthbiBzZWJhZ2FpIGJlcmlrdXQgOg0KDQotIFRvdGFsIPCdkZs9MzQsIHNlaGluZ2dhICRcZnJhYyB7bn17Mn0gPSAxNyQNCg0KLSBLZWxhcyBtZWRpYW46IDYxIOKIkiA3MCwgZGVuZ2FuIHBhcmFtZXRlciA6DQogDQokJA0KXGJlZ2lue2FsaWduZWR9DQogICAgdGIgJj0gNjEgLSAwLDUgPSA2MCw1ICBcXA0KICAgIEMgJj0gMTAgIFxcDQogICAgRl9tICY9IDExICBcXA0KICAgIEYgJj0gMTUgIFxcDQpcZW5ke2FsaWduZWR9DQokJA0KDQotIHN1YnNpdHVzaWthbiBrZSBydW11cyA6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01lZGlhbn0gJj0gNjAsNSArIFxsZWZ0KCBcZnJhY3tcZnJhY3szNH17Mn0gLSAxNX17MTF9IFxyaWdodCkgMTAgXFwNCiY9IDYwLDUgKyBcbGVmdCggXGZyYWN7MTcgLSAxNX17MTF9IFxyaWdodCkgMTAgXFwgJj0gNjAsNSArIDEuODE4IFxcICY9IDYyLjMyDQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KSGFzaWwgcGVyaGl0dW5nYW4gbWVkaWFuIGRhcmkga2VkdWEgbWV0b2RlIHlha25pIG1lbmdndW5ha2FuIG91dGxpZXIgZGFuIHRhbnBhIG1lbmdndW5ha2FuIG91dGxpZXJzIG1lbnVuanVra2FuIGJhaHdhIG5pbGFpIG1lZGlhbiB0aWRhayBiZXJ1YmFoICh0ZXRhcCA2MiwzMikuIEhhbCBpbmkgbWVtYnVrdGlrYW4gYmFod2EgbWVkaWFuIGFkYWxhaCB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgeWFuZyByb2J1c3QgYXRhdSBrdWF0IHRlcmhhZGFwIG91dGxpZXJzLCBrYXJlbmEgcG9zaXNpbnlhIGRpdGVudHVrYW4gb2xlaCB1cnV0YW4gZGF0YSwgYnVrYW4gbmlsYWktbmlsYWkgZWtzdHJlbSBkYWxhbSBkaXN0cmlidXNpLiBNZWRpYW4gdGV0YXAgbWVuZ2dhbWJhcmthbiBuaWxhaSB0ZW5nYWggZGF0YSBkZW5nYW4ga29uc2lzdGVuIG1lc2tpcHVuIGRpc3RyaWJ1c2kgZGF0YSBkaW1vZGlmaWthc2kuDQoNCiMjIE1lZGlhbiBkYWxhbSBiZW50dWsgYm94cGxvdCA6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIH0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IEludGVydmFsIG5pbGFpIGRhbiBmcmVrdWVuc2kNCmludGVydmFsIDwtIGMoIjMxIC0gNDAiLCAiNDEgLSA1MCIsICI1MSAtIDYwIiwgIjYxIC0gNzAiLCAiNzEgLSA4MCIsICI4MSAtIDkwIikNCmZyZWt1ZW5zaSA8LSBjKDMsIDUsIDEwLCAxMSwgOCwgMykgICMgRnJla3VlbnNpDQpmcmVrdWVuc2lfa3VtdWxhdGlmIDwtIGMoMywgOCwgMTgsIDI5LCAzNywgNDApICAjIEZyZWt1ZW5zaSBLdW11bGF0aWYNCg0KIyBOaWxhaSB0ZW5nYWggdW50dWsgc2V0aWFwIGludGVydmFsDQpuaWxhaV90ZW5nYWggPC0gYygzNS41LCA0NS41LCA1NS41LCA2NS41LCA3NS41LCA4NS41KQ0KDQojIE1lbmdoaXR1bmcgdG90YWwgZnJla3VlbnNpDQp0b3RhbF9mcmVrdWVuc2kgPC0gc3VtKGZyZWt1ZW5zaSkNCg0KIyBNZW5naGl0dW5nIG5pbGFpIHRlbmdhaCAobWVkaWFuKQ0KbWVkaWFuIDwtIHN1bShmcmVrdWVuc2kgKiBuaWxhaV90ZW5nYWgpIC8gdG90YWxfZnJla3VlbnNpDQoNCiMgTmlsYWkgbWVkaWFuIHlhbmcgc3VkYWggZGloaXR1bmcgKDYyLjMyKQ0KbWVkaWFuIDwtIDYyLjMyDQoNCiMgTWVtYnVhdCBkYXRhIHVudHVrIGJveHBsb3QNCiMgRGF0YSB1bnR1ayBib3hwbG90IGFkYWxhaCBuaWxhaSB0ZW5nYWggeWFuZyBkaXVsYW5nIHNlc3VhaSBkZW5nYW4gZnJla3VlbnNpDQpkYXRhIDwtIHJlcChuaWxhaV90ZW5nYWgsIGZyZWt1ZW5zaSkNCg0KIyBNZW5naGl0dW5nIGRhdGEgdW50dWsgdmlzdWFsaXNhc2kgKERlbmdhbiBPdXRsaWVycyBkYW4gVGFucGEgT3V0bGllcnMpDQojIEFzdW1zaSB0aWRhayBhZGEga2VsYXMgeWFuZyBkaWhhcHVzLCBoYW55YSBwZXJoaXR1bmdhbiB1bnR1ayBrZWR1YSBrZWxvbXBvaw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gZGF0YQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBkYXRhW2ZyZWt1ZW5zaSA8PSA4XSAgIyBNZW55YXJpbmcgbmlsYWkgZGVuZ2FuIGZyZWt1ZW5zaSBsZWJpaCBkYXJpIDggKHVudHVrICdUYW5wYSBPdXRsaWVycycpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoDQogIGRmLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiwgICMgTWVuYW1waWxrYW4gdGl0aWsgb3V0bGllcnMNCiAgYm94bWVhbiA9IFRSVUUgICMgTWVuYW1waWxrYW4gZ2FyaXMgcGVtYmF0YXMgdW50dWsgcmF0YS1yYXRhDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsICAjIExva2FzaSBtZWRpYW4NCiAgICAgICAgeSA9IG1lZGlhbiwgICAgICAgICAgICAgIyBOaWxhaSBtZWRpYW4NCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuLCAyKSksICAjIFRla3MgdW50dWsgbWVkaWFuDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsICAgICAgICMgTWVuYW1waWxrYW4gdGFuZGEgcGFuYWgNCiAgICAgICAgYXJyb3doZWFkID0gMiAgICAgICAgICAgIyBHYXlhIHBhbmFoDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsICAjIExva2FzaSBtZWRpYW4gdW50dWsgVGFucGEgT3V0bGllcnMNCiAgICAgICAgeSA9IG1lZGlhbiwgICAgICAgICAgICAjIE5pbGFpIG1lZGlhbg0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW4sIDIpKSwgICMgVGVrcyB1bnR1ayBtZWRpYW4NCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwgICAgICAjIE1lbmFtcGlsa2FuIHRhbmRhIHBhbmFoDQogICAgICAgIGFycm93aGVhZCA9IDIgICAgICAgICAgIyBHYXlhIHBhbmFoDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCg0KIyMgTWVkaWFuIGRhbGFtIGJlbnR1ayBoaXN0b2dyYW0gOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBJbnRlcnZhbCBuaWxhaSBkYW4gZnJla3VlbnNpDQppbnRlcnZhbCA8LSBjKCIzMSAtIDQwIiwgIjQxIC0gNTAiLCAiNTEgLSA2MCIsICI2MSAtIDcwIiwgIjcxIC0gODAiLCAiODEgLSA5MCIpDQpmcmVrdWVuc2kgPC0gYygzLCA1LCAxMCwgMTEsIDgsIDMpICAjIEZyZWt1ZW5zaQ0KZnJla3VlbnNpX2t1bXVsYXRpZiA8LSBjKDMsIDgsIDE4LCAyOSwgMzcsIDQwKSAgIyBGcmVrdWVuc2kgS3VtdWxhdGlmDQoNCiMgTmlsYWkgdGVuZ2FoIHVudHVrIHNldGlhcCBpbnRlcnZhbA0KbmlsYWlfdGVuZ2FoIDwtIGMoMzUuNSwgNDUuNSwgNTUuNSwgNjUuNSwgNzUuNSwgODUuNSkNCg0KIyBNZW5naGl0dW5nIHRvdGFsIGZyZWt1ZW5zaQ0KdG90YWxfZnJla3VlbnNpIDwtIHN1bShmcmVrdWVuc2kpDQoNCiMgTWVuZ2hpdHVuZyBwb3Npc2kgbWVkaWFuDQpwb3Npc2lfbWVkaWFuIDwtIHRvdGFsX2ZyZWt1ZW5zaSAvIDIgICMgUG9zaXNpIG1lZGlhbiA9IE4gLyAyDQojIE1lbmVudHVrYW4gaW50ZXJ2YWwgbWVkaWFuDQppbnRlcnZhbF9tZWRpYW4gPC0gd2hpY2goZnJla3VlbnNpX2t1bXVsYXRpZiA+PSBwb3Npc2lfbWVkaWFuKVsxXQ0KTCA8LSBuaWxhaV90ZW5nYWhbaW50ZXJ2YWxfbWVkaWFuXSAtIChuaWxhaV90ZW5nYWhbaW50ZXJ2YWxfbWVkaWFuXSAtIG5pbGFpX3RlbmdhaFtpbnRlcnZhbF9tZWRpYW4gLSAxXSkgLyAyDQpGIDwtIGlmZWxzZShpbnRlcnZhbF9tZWRpYW4gPT0gMSwgMCwgZnJla3VlbnNpX2t1bXVsYXRpZltpbnRlcnZhbF9tZWRpYW4gLSAxXSkNCmYgPC0gZnJla3VlbnNpW2ludGVydmFsX21lZGlhbl0NCmMgPC0gbmlsYWlfdGVuZ2FoW2ludGVydmFsX21lZGlhbl0gLSBuaWxhaV90ZW5nYWhbaW50ZXJ2YWxfbWVkaWFuIC0gMV0NCg0KIyBNZW5naGl0dW5nIG1lZGlhbg0KbWVkaWFuIDwtIEwgKyAoKHBvc2lzaV9tZWRpYW4gLSBGKSAvIGYpICogYw0KDQojIE1lbWJ1YXQgZGF0YSB1bnR1ayBib3hwbG90DQojIERhdGEgdW50dWsgYm94cGxvdCBhZGFsYWggbmlsYWkgdGVuZ2FoIHlhbmcgZGl1bGFuZyBzZXN1YWkgZGVuZ2FuIGZyZWt1ZW5zaQ0KZGF0YSA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2kpDQoNCiMgTWVuZ2hpdHVuZyBkYXRhIHVudHVrIHZpc3VhbGlzYXNpIChEZW5nYW4gT3V0bGllcnMgZGFuIFRhbnBhIE91dGxpZXJzKQ0KIyBBc3Vtc2kgdGlkYWsgYWRhIGtlbGFzIHlhbmcgZGloYXB1cywgaGFueWEgcGVyaGl0dW5nYW4gdW50dWsga2VkdWEga2Vsb21wb2sNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGRhdGENCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gZGF0YVtmcmVrdWVuc2kgPD0gOF0gICMgTWVueWFyaW5nIG5pbGFpIGRlbmdhbiBmcmVrdWVuc2kgbGViaWggZGFyaSA4ICh1bnR1ayAnVGFucGEgT3V0bGllcnMnKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRmIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHgsDQogICAgeSA9IH5kZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKSR4LA0KICAgIHkgPSB+ZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbiwgbWVkaWFuKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbiB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW4sIG1lZGlhbiksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWRpYW4gcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW4sIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWRpYW4gZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbiwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW4sIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYCANCg0KDQojIDEuMS4zIE1vZHVzIHVudHVrIERhdGEgS2Vsb21wb2sNCg0KICBNb2R1cyBhZGFsYWggbmlsYWkgeWFuZyBzZXJpbmcgbXVuY3VsIGRhbGFtIHNlYnVhaCBkYXRhc2V0LiBNb2R1cyBkaWd1bmFrYW4gdW50dWsgbWVuZ2V0YWh1aSBuaWxhaSB5YW5nIHBhbGluZyBkb21pbmFuIGF0YXUgcGFsaW5nIHNlcmluZyB0ZXJqYWRpIGRhbGFtIHN1YXR1IGt1bXB1bGFuIGRhdGEuDQoNCkxhbmdrYWggbGFuZ2thaCBtZW5naGl0dW5nIG1vZHVzIHNlYmFnYWkgYmVyaWt1dCA6DQoNCi0gS3VyYW5naSBmcmVrdWVuc2kgc2ViZWx1bSBrZWxhcyBtb2R1cyAoXChmXzBcKSkgZGFyaSBmcmVrdWVuc2kga2VsYXMgbW9kdXMgKFwoZl8xXCkpDQoNCiAgICANCi0gS3VyYW5naSBmcmVrdWVuc2kgc2V0ZWxhaCBrZWxhcyBtb2R1cyAoXChmXzJcKSkgZGFyaSBmcmVrdWVuc2kga2VsYXMgbW9kdXMgKFwoZl8xXCkpDQoNCg0KLSBIaXR1bmcgcGVtYmlsYW5nID0gJChmXzEgLSBmXzApJCBkYW4gcGVueWVidXQgPSAkKGZfMSAtIGZfMCkgKyAoZl8xIC0gZl8yKSQNCg0KICANCi0gQmFnaSBwZW1iaWxhbmcgZGVuZ2FuIHBlbnllYnV0ID0gJFxmcmFje2ZfMSAtIGZfMH17KGZfMSAtIGZfMCkgKyAoZl8xIC0gICAgZl8yKX0kDQoNCg0KLSBLYWxpa2FuIGhhc2lsbnlhIGRlbmdhbiBsZWJhciBrZWxhcyAoXChDXCkpDQoNCg0KLSBUYW1iYWhrYW4gaGFzaWwgdGVyc2VidXQga2UgYmF0YXMgYmF3YWgga2VsYXMgbW9kdXMgKFwodGJcKSkNCg0KDQotIFN1YnN0aXR1c2kga2UgUnVtdXMgTW9kdXMgOg0KDQogICRcdGV4dHtNb2R1c30gPSB0YiArIFxsZWZ0KCBcZnJhY3soZl8xIC0gZl8wKSB9e2ZfMSAtIGZfMCArIChmXzEgLSBmXzIpfSBccmlnaHQpLiBDJA0KDQotIEJpc2EgSnVnYSBkaXR1bGlzIGRlbmdhbiA6IA0KDQogICRcdGV4dHtNb2R9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSlfMH17KGZfMSlfMCArIChmXzIpXzB9IFxyaWdodCkuIEMkDQoNCg0KICBkaSBtYW5hOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQp0YiAmPSBcdGV4dHtiYXRhcyBiYXdhaCB1bnR1ayBrZWxhcyBkaSBtYW5hIG1vZHVzIGJlcmFkYX0gXFwNCkMgJj0gXHRleHR7aW50ZXJ2YWwga2VsYXN9IFxcDQooZl8xKV8wICY9IFx0ZXh0e3NlbGlzaWggZnJla3VlbnNpIHlhbmcgbWVtdWF0IG1vZHVzIGRlbmdhbiBmcmVrdWVuc2kgICBrZWxhcyBzZWJlbHVtbnlhfSBcXA0KKGZfMilfMCAmPSBcdGV4dHtzZWxpc2loIGZyZWt1ZW5zaSB5YW5nIG1lbXVhdCBtb2R1cyBkZW5nYW4gZnJla3VlbnNpIGtlbGFzIHNlc3VkYWhueWF9DQpcZW5ke2FsaWduZWR9DQokJA0KDQpjb250b2ggOg0KDQogIFNlYnVhaCBzYW1wZWwgbmlsYWkgcGVuanVhbGFuIG1pbmdndWFuIChkYWxhbSBqdXRhIHJ1cGlhaCkgZGFyaSA2MCBwZW55YWx1ciBiYXJhbmcgYW50aWsgZGkga290YSAgICAgICAgICBtb2pva2VydG8gZGlzYWppa2FuIHNlcGVydGkgYmVyaWt1dCA6DQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWlfcGVuanVhbGFuIiA9IGMoIjEwIC0gMTQiLCAiMTUgLSAxOSIsICIyMCAtIDI0IiwgIjI1IC0gMjkiLCAiMzAgLSAzNCIsICIzNSAtIDM5IiksDQogICJCYW55YWtfcGVueWFsdXIiID0gYygiNCIsICI1IiwgIjgiLCAiMTMiLCAiMjAiLCAiMTAiKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKCAiMTQsNSIsICIxOSw1IiwgIjI0LDUiLCAiMjksNSIsICIzNCw1IiwgIjM5LDUiKSANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBtb2R1cyBmcmVrdWVuc2kga3VtdWxhdGlmIGRlbmdhbiBvdXRsaWVycyBkYW4gdGFucGEgb3V0bGllcnMiKQ0KDQpgYGANCg0KDQpEYXJpIHRhYmVsIGRpYXRhcywgZnJla3VlbnNpIG1vZHVzbnlhIGFkYWxhaCAyMCBkZW5nYW4gbGV0YWsga2VsYXMga2UtNSBkYW4ga2VsYXMgbnlhdGFueWEgYWRhbGFoIDI5LDUgLSAzNCw1LiBqYWRpIDoNCg0KJCQNCihmXzEpXzA9IDIwIC0gMTMgPSA3IFxcDQooZl8yKV8wID0gMjAgLSAxMCA9IDEwIFxcDQp0YiA9IDI5LCA1IFxcDQpDID0gNSANCiQkDQoNCiMjIENhcmEgbWVuZ2hpdHVuZyBtb2R1cyBkZW5nYW4gT3V0bGllcnMgOjoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kfSA9IHRiICsgXGxlZnQoIFxmcmFjeyhmXzEpXzB9eyhmXzEpXzAgKyAoZl8yKV8wfS4gQyBccmlnaHQpDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ICY9IDI5LDUgXGxlZnQoIFxmcmFjezd9ezcgKyAxMH0gXHJpZ2h0KS4gNSBcXA0KJj0gMjksNSArICgwLDQxKSg1KSBcXA0KJj0gMjksNSArIDIsMDUgXFwNCiY9IDMxLDU1DQpcZW5ke2FsaWduZWR9DQokJA0KDQpKYWRpLCBtb2R1cyBkYXJpIG5pbGFpIHBlbmp1YWxhbiBtaW5nZ3VhbiA2MCBwZW55YWx1ciBiYXJhbmcgYW50aWsgZGlrb3RhIG1vam9rZXJ0byBhZGFsYWggc2ViYW55YWsgUnAuIDMxLDU1IEp1dGEuDQoNCiMjIENhcmEgbWVuZ2hpdHVuZyBtb2R1cyB0YW5wYSBPdXRsaWVycyA6ICANCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kfSA9IHRiICsgXGxlZnQoIFxmcmFjeyhmXzEpXzB9eyhmXzEpXzAgKyAoZl8yKV8wfS4gQyBccmlnaHQpDQpcZW5ke2FsaWduZWR9DQokJA0KDQpkZW5nYW4gcGFyYW1ldGVyIDoNCg0KJCQNCvCdkZNf8J2RmiA9IDIwIFxcDQooZl8xKV8wPSAyMCAtIDEzID0gNyBcXA0KKGZfMilfMCA9IDIwIC0gMTAgPSAxMCBcXA0KdGIgPSAyOSwgNSBcXA0KQyA9IDUgDQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ICY9IDI5LDUgXGxlZnQoIFxmcmFjezd9ezcgKyAxMH0gXHJpZ2h0KS4gNSBcXA0KJj0gMjksNSArICgwLDQxKSg1KSBcXA0KJj0gMjksNSArIDIsMDUgXFwNCiY9IDMxLDU1DQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBNb2R1cyBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXJzIG1lbmdoYXNpbGthbiBuaWxhaSB5YW5nIHNhbWEsIHlhaXR1IDMxLjU2LiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGRhdGEgZGFsYW0ga2Vsb21wb2sgaW5pIGN1a3VwIHN0YWJpbCwgc2VoaW5nZ2Ega2ViZXJhZGFhbiBhdGF1IGtldGlhZGFhbiBvdXRsaWVycyB0aWRhayBtZW1lbmdhcnVoaSBuaWxhaSBtb2R1cy4gZGFuIHBhZGEgdGFiZWwgTWVuZ2d1bmFrYW4gc2VtdWEgZGF0YSBhc2xpIHRhbnBhIG1lbmdoaWxhbmdrYW4gbmlsYWkgZWtzdHJlbS4NCg0KLSBNb2R1cyAzMS41NiBtZXJlcHJlc2VudGFzaWthbiBuaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsIGRhbGFtIGRhdGFzZXQgaW5pLCBiYWlrIGRlbmdhbiBtYXVwdW4gdGFucGEgbWVtcGVydGltYmFuZ2thbiBhZGFueWEgb3V0bGllcnMsIHNlaGluZ2dhIG1lbmNlcm1pbmthbiBrYXJha3RlcmlzdGlrIHV0YW1hIGRpc3RyaWJ1c2kgZGF0YS4gcGFkYSB0YWJlbCBkaWEgU2FtYSBkZW5nYW4gZGF0YSBhc2xpIGthcmVuYSB0aWRhayBhZGEgbmlsYWkgZWtzdHJlbSAob3V0bGllcnMpIHlhbmcgdGVyZGV0ZWtzaS4NCg0KDQojIyBNb2R1cyBkYWxhbSBiZW50dWsgYm94cGxvdCA6DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIH0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IEludGVydmFsIG5pbGFpIGRhbiBmcmVrdWVuc2kNCmludGVydmFsIDwtIGMoIjEwIC0gMTQiLCAiMTUgLSAxOSIsICIyMCAtIDI0IiwgIjI1IC0gMjkiLCAiMzAgLSAzNCIsICIzNSAtIDM5IikNCmZyZWt1ZW5zaSA8LSBjKDQsIDUsIDgsIDEzLCAyMCwgMTApICAjIEZyZWt1ZW5zaQ0KZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIGMoNCwgNSwgOCwgMTMsIDIwLCAwKSAgIyBNZW5naGFwdXMga2VsYXMgdGVyYWtoaXIgdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVycw0KbmlsYWlfdGVuZ2FoIDwtIGMoMTIsIDE3LCAyMiwgMjcsIDMyLCAzNykgICMgTmlsYWkgdGVuZ2FoDQoNCiMgTW9kdXMgdGV0YXAgKHNlc3VhaSBwZXJpbnRhaCkNCm1vZHVzX2Rlbmdhbl9vdXRsaWVycyA8LSAzMS41NQ0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gMzEuNTUNCg0KIyBNZW1idWF0IGRhdGEgdW50dWsgYm94cGxvdA0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gcmVwKG5pbGFpX3RlbmdhaCwgZnJla3VlbnNpKQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIHVudHVrIHZpc3VhbGlzYXNpDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwgDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGYsDQogIHkgPSB+TmlsYWksDQogIGNvbG9yID0gfktlbG9tcG9rLA0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIsICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQogIGJveG1lYW4gPSBUUlVFICAjIE1lbmFtcGlsa2FuIGdhcmlzIHBlbWJhdGFzIHVudHVrIHJhdGEtcmF0YQ0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgUGVuanVhbGFuIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbG9tcG9rIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgICAgICB5ID0gbW9kdXNfZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIG1vZHVzX2Rlbmdhbl9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ2JsdWUnLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c190YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1c190YW5wYV9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCiMjIE1vZHVzIGRhbGFtIGJlbnR1ayBoaXN0b2dyYW0gOg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBJbnRlcnZhbCBuaWxhaSBkYW4gZnJla3VlbnNpDQppbnRlcnZhbCA8LSBjKCIxMCAtIDE0IiwgIjE1IC0gMTkiLCAiMjAgLSAyNCIsICIyNSAtIDI5IiwgIjMwIC0gMzQiLCAiMzUgLSAzOSIpDQpmcmVrdWVuc2kgPC0gYyg0LCA1LCA4LCAxMywgMjAsIDEwKSAgIyBGcmVrdWVuc2kNCm5pbGFpX3RlbmdhaCA8LSBjKDEyLCAxNywgMjIsIDI3LCAzMiwgMzcpICAjIE5pbGFpIHRlbmdhaA0KDQojIE1lbmdoaXR1bmcgbW9kdXMgc2VjYXJhIG1hbnVhbA0KaW5kZWtzX21vZHVzIDwtIHdoaWNoLm1heChmcmVrdWVuc2kpICAjIE1lbmVudHVrYW4ga2VsYXMgbW9kdXMNCkwgPC0gMzAuNSAgIyBCYXRhcyBiYXdhaCBrZWxhcyBtb2R1cyB1bnR1ayBpbnRlcnZhbCAiMzAgLSAzNCINCmQxIDwtIDcgICMgZnJla3VlbnNpW2luZGVrc19tb2R1c10gLSBmcmVrdWVuc2lbaW5kZWtzX21vZHVzIC0gMV0NCmQyIDwtIDcgICMgZnJla3VlbnNpW2luZGVrc19tb2R1c10gLSBmcmVrdWVuc2lbaW5kZWtzX21vZHVzICsgMV0NCmMgPC0gMTAgICMgUGFuamFuZyBpbnRlcnZhbA0KbW9kdXMgPC0gTCArIChkMSAvIChkMSArIGQyKSkgKiBjICAjIEhhc2lsIHBlcmhpdHVuZ2FuDQoNCiMgTWVuZXRhcGthbiBoYXNpbCBtb2R1cyBzZWNhcmEgbWFudWFsIGppa2EgcGVybHUNCm1vZHVzIDwtIDMxLjU1ICAjIE5pbGFpIHRldGFwIHNlYmFnYWkgMzEuNTUNCg0KIyBNZW1idWF0IGRhdGEgdW50dWsgYm94cGxvdA0KZGF0YSA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2kpDQoNCiMgTWVuZ2hpdHVuZyBkYXRhIHVudHVrIHZpc3VhbGlzYXNpIChEZW5nYW4gT3V0bGllcnMgZGFuIFRhbnBhIE91dGxpZXJzKQ0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gZGF0YQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBkYXRhW2ZyZWt1ZW5zaSA8PSA4XSAgIyBNZW55YXJpbmcgbmlsYWkgZGVuZ2FuIGZyZWt1ZW5zaSBsZWJpaCBkYXJpIDggKHVudHVrICdUYW5wYSBPdXRsaWVycycpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGYgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCBkZW5nYW4gZ2FyaXMgbW9kdXMNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKSR4LA0KICAgIHkgPSB+ZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeCwNCiAgICB5ID0gfmRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzLCBtb2R1cyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTW9kdXMgKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1vZHVzIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzLCBtb2R1cyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgUGVuanVhbGFuIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIG1vZHVzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKSR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1cyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQoNCiMgMS4yIFByYWt0aWt1bSAyIA0KDQojIDEuMi4xIEJpc25pcw0KDQpUb3BpazogQW5hbGlzaXMgZGF0YSBwZW5kYXBhdGFuIGJ1bGFuYW4ga2FyeWF3YW4NCg0KU2VidWFoIHBlcnVzYWhhYW4gaW5naW4gbWVuZ2FuYWxpc2lzIGRhdGEgcGVuZGFwYXRhbiBidWxhbmFuIGthcnlhd2FuIGRhcmkgNDAgb3JhbmcuIEJlcmlrdXQgYWRhbGFoIGRhdGEgeWFuZyB0ZWxhaCBkaWtlbG9tcG9ra2FuIGRhbGFtIHRhYmVsIGZyZWt1ZW5zaToNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiUmVudGFuX2dhamkiID0gYygiMS4wMDAuMDAwIC0gMS45OTkuOTk5IiwgIjIuMDAwLjAwMCAtIDIuOTk5Ljk5OSIsICIzLjAwMC4wMDAgLSAzLjk5OS45OTkiLCAiNC4wMDAuMDAwIC0gNC45OTkuOTk5IiwgIjUuMDAwLjAwMCAtIDUuOTk5Ljk5OSIpLA0KICAiRnJla3VlbnNpIiA9IGMoICI1IiwgIjEwIiwgIjE1IiwgIjgiLCAiMiIpIA0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIGRhdGEga2Vsb21wb2sgZ2FqaSBrYXJ5YXdhbiIpDQoNCmBgYA0KDQpQZW55ZWxlc2FpYW4gOg0KDQpEaWtldGFodWkgYmFod2EgdGl0aWsgdGVuZ2FoLCBGcmVrdWVuc2kgS3VtdWxhdGlmIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJSZW50YW5fZ2FqaSIgPSBjKCIxLjAwMC4wMDAgLSAxLjk5OS45OTkiLCAiMi4wMDAuMDAwIC0gMi45OTkuOTk5IiwgIjMuMDAwLjAwMCAtIDMuOTk5Ljk5OSIsICI0LjAwMC4wMDAgLSA0Ljk5OS45OTkiLCAiNS4wMDAuMDAwIC0gNS45OTkuOTk5IiksDQogICJGcmVrdWVuc2kiID0gYyggIjUiLCAiMTAiLCAiMTUiLCAiOCIsICIyIiksIA0KICAiRmtrIiA9IGMoICI1IiwgIjE1IiwgIjMwIiwgIjM4IiwgIjQwIiksIA0KICAiVGl0aWtfdGVuZ2FoIiA9IGMoICIxLjUwMC4wMDAiLCAiMi41MDAuMDAwIiwgIjMuNTAwLjAwMCIsICI0LjUwMC4wMDAiLCAiNS41MDAuMDAwIiksDQogICJoYXNpbF9rYWxpX2ZyZWt1ZW5zaV9kYW5fdGl0aWtfdGVuZ2FoIiA9IGMoICI3LjUwMC4wMDAiLCAiMjUuMDAwLjAwMCIsICI1Mi41MDAuMDAwIiwgIjM2LjAwMC4wMDAiLCAiMTEuMDAwLjAwMCIpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgZnJla3VlbnNpIGt1bXVsYXRpZiBkYW4gdGl0aWsgdGVuZ2FoIGRlbmdhbiBvdXRsaWVycyIpDQoNCmBgYA0KDQojIyBNZWFuIDogDQoNCiAgSnVtbGFoIHRvdGFsIGZyZWt1ZW5zaSAk8J2RgT0gNSArIDEwICsgMTUgKyA4ICsgMiA9IDQwJA0KDQpoaXR1bmcgcmF0YS1yYXRhIGdhamkga2FyeWF3YW4gZGVuZ2FuIHBlcmthbGlhbiBmcmVrdWVuc2kgZGVuZ2FuIHRpdGlrIHRlbmdhaCwgbGFsdSBkaWJhZ2kgZGVuZ2FuIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2k6DQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcYmFye1h9ID0gXGZyYWN7XHN1bSBmWH17bn0gPSBcZnJhYyB7NSgxLjUwMC4wMDApKyAxMCgyLjUwMC4wMDApKyAxNSgzLjUwMC4wMDApKyA4KDQuNTAwLjAwMCkrIDIoNS41MDAuMDAwKX17NDB9DQpcZW5ke2FsaWduZWR9DQokJA0KJCQNClxiZWdpbnthbGlnbmVkfQ0KPSBcZnJhYyB7MTMyLjAwMC4wMDB9ezQwfQ0KPSAzLjMwMC4wMDANClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIFRhbnBhIG1lbmdndW5ha2FuIE91dGxpZXJzIDoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiUmVudGFuX2dhamkiID0gYygiMS4wMDAuMDAwIC0gMS45OTkuOTk5IiwgIjIuMDAwLjAwMCAtIDIuOTk5Ljk5OSIsICIzLjAwMC4wMDAgLSAzLjk5OS45OTkiLCAiNC4wMDAuMDAwIC0gNC45OTkuOTk5IiksDQogICJGcmVrdWVuc2kiID0gYyggIjUiLCAiMTAiLCAiMTUiLCAiOCIpLCANCiAgIlRpdGlrX3RlbmdhaCIgPSBjKCAiMS41MDAuMDAwIiwgIjIuNTAwLjAwMCIsICIzLjUwMC4wMDAiLCAiNC41MDAuMDAwIiksDQogICJoYXNpbF9rYWxpX2ZyZWt1ZW5zaV9kYW5fdGl0aWtfdGVuZ2FoIiA9IGMoICI3LjUwMC4wMDAiLCAiMjUuMDAwLjAwMCIsICI1Mi41MDAuMDAwIiwgIjM2LjAwMC4wMDAiKQ0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIGZyZWt1ZW5zaSBrdW11bGF0aWYgZGFuIHRpdGlrIHRlbmdhaCB0YW5wYSBvdXRsaWVycyIpDQoNCmBgYA0KDQoNClRvdGFsICR7Zlh9e259JCB0YW5wYSBvdXRsaWVycyA6DQoNCiQkDQo3LjUwMC4wMDArMjUuMDAwLjAwMCs1Mi41MDAuMDAwKzM2LjAwMC4wMDA9MTIxLjAwMC4wMDANCiQkDQoNClRvdGFsIEZyZWt1ZW5zaSB0YW5wYSBvdXRsaWVycyA6DQoNCiQkDQo1KzEwKzE1Kzg9MzgNCiQkDQoNCg0KTGFsdSBNYXN1a2FuIGRhbGFtIHJ1bXVzICggdGFucGEgb3V0bGllcnMpIDoNCg0KJCQNClxiYXJ7WH0gPSBcZnJhYyB7MTIxLjAwMC4wMDB9ezM4fSA9IDMuMTg0LjIxMQ0KJCQNCg0KIyMgS2VzaW1wdWxhbiA6DQoNCi0gTWVhbiBkZW5nYW4gb3V0bGllcnMgbWVuZ2hhc2lsa2FuIG5pbGFpIHNlYmVzYXIgMy4zMDAuMDAwLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGtlYmVyYWRhYW4gZGF0YSBla3N0cmVtIHBhZGEgcmVudGFuZyBnYWppIDUuMDAwLjAwMCAtIDUuOTk5Ljk5OSBtZW1lbmdhcnVoaSBoYXNpbCByYXRhLXJhdGEsIHNlaGluZ2dhIG1lbmdoYXNpbGthbiBuaWxhaSB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gZGVuZ2FuIG1heW9yaXRhcyBkYXRhLiBNZWFuIGluaSBjb2NvayBkaWd1bmFrYW4gamlrYSBhbmFsaXNpcyBtZW1lcmx1a2FuIGlua2x1c2kgZGF0YSBla3N0cmVtLCBtaXNhbG55YSB1bnR1ayBtZW1haGFtaSBkaXN0cmlidXNpIGdhamkgdGluZ2dpLiAgDQoNCi0gTWVhbiB0YW5wYSBvdXRsaWVycyBtZW5naGFzaWxrYW4gbmlsYWkgc2ViZXNhciAzLjE4NC4yMTEsIHlhbmcgbGViaWggbWVuY2VybWlua2FuIGtvbmRpc2kgbWF5b3JpdGFzIGRhdGEgc2V0ZWxhaCBtZW5naGlsYW5na2FuIHBlbmdhcnVoIHJlbnRhbmcgZ2FqaSBla3N0cmVtLiBNZWFuIGluaSBsZWJpaCBzdGFiaWwgZGFuIHJlbGV2YW4gdW50dWsgYW5hbGlzaXMgeWFuZyBmb2t1cyBwYWRhIHRyZW4gdXRhbWEgZGFsYW0gZGlzdHJpYnVzaSBnYWppLg0KDQojIyBNZWRpYW4gOg0KDQojIyBNZW5nZ3VuYWthbiBPdXRsaWVyczoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSA9IHRiICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Rl9tfSBccmlnaHQpLiBDDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQo9IDIuOTk5Ljk5OSw1ICsgXGxlZnQoIFxmcmFje1xmcmFjezQwfXsyfSAtIDE1fXsxNX0gXHJpZ2h0KSAxLjAwMC4wMDAgXFwNCj0gMi45OTkuOTk5LDUgKyBcbGVmdCggXGZyYWN7MjAgLSAxNX17MTV9IFxyaWdodCkgMS4wMDAuMDAwIFxcID0gMi45OTkuOTk5LDUgKyAzMzMuMzMzLDMgXFwgDQo9IDMuMzMzLjMzMiw4IFJwIA0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgVGFucGEgbWVuZ2d1bmFrYW4gb3V0bGllcnMNCg0KUG9zaXNpIG1lZGlhbiB1bnR1ayDwnZGbID0gMzggYWRhbGFoOg0KDQokJA0KXGZyYWMge259ezJ9ID0gXGZyYWMgezM4fXsyfSA9IDE5DQokJA0KRGltYW5hOg0KDQrwnZC/ID0gYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuID0gMi45OTkuOTk5IA0K8J2QuSA9IGZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4gPSAxNQ0K8J2Rk1/wnZGaID0gZnJla3VlbnNpIGtlbGFzIG1lZGlhbiA9IDE1DQrwnZGQPSBwYW5qYW5nIGtlbGFzID0gMS4wMDAuMDAwDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCj0gMi45OTkuOTk5LDUgKyBcbGVmdCggXGZyYWN7XGZyYWN7Mzh9ezJ9IC0gMTV9ezE1fSBccmlnaHQpIDEuMDAwLjAwMCBcXA0KPSAyLjk5OS45OTksNSArIFxsZWZ0KCBcZnJhY3sxOSAtIDE1fXsxNX0gXHJpZ2h0KSAxLjAwMC4wMDAgXFwgPSAyLjk5OS45OTksNSArIDI2Ni42NjYsNjcgXFwgDQo9IDMuMjY2LjY2NiBScCANClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIEtlc2ltcHVsYW4gOiANCg0KLSBEZW5nYW4gb3V0bGllcnMsIG1lZGlhbiB5YW5nIGxlYmloIHRpbmdnaSAoMy4zMzMuMzMzKSBtZW5jZXJtaW5rYW4ga2ViZXJhZGFhbiBkYXRhIHlhbmcgc2FuZ2F0IHRpbmdnaSwgeWFpdHUgcmVudGFuZyBnYWppIDUuMDAwLjAwMCAtIDUuOTk5Ljk5OSwgeWFuZyBkYXBhdCBtZW5nZ2VzZXIgbmlsYWkgdGVuZ2FoIGtlIGF0YXMuDQoNCi0gVGFucGEgb3V0bGllcnMsIG1lZGlhbiB5YW5nIGxlYmloIHJlbmRhaCAoMy4yNjYuNjY2KSBtZW1iZXJpa2FuIGdhbWJhcmFuIHlhbmcgbGViaWggYWt1cmF0IGRhbiByZXByZXNlbnRhdGlmIHRlbnRhbmcgbmlsYWkgdGVuZ2FoIGRpc3RyaWJ1c2kgZ2FqaSBwZW55YWx1ciBqaWthIG1lbmdhYmFpa2FuIGRhdGEgeWFuZyB0aWRhayBiaWFzYSBhdGF1IGVrc3RyaW0uDQoNCi0gT2xlaCBrYXJlbmEgaXR1LCBwZW1pbGloYW4gYW50YXJhIG1lbmdndW5ha2FuIG1lZGlhbiBkZW5nYW4gYXRhdSB0YW5wYSBvdXRsaWVycyBzYW5nYXQgYmVyZ2FudHVuZyBwYWRhIHR1anVhbiBhbmFsaXNpcy4gSmlrYSB0dWp1YW4gYW5hbGlzaXMgYWRhbGFoIG1lbmdnYW1iYXJrYW4gZGlzdHJpYnVzaSBrZXNlbHVydWhhbiBkYXRhLCB0ZXJtYXN1ayBla3N0cmVtLCBtYWthIG1lZGlhbiBkZW5nYW4gb3V0bGllcnMgYWRhbGFoIHBpbGloYW4geWFuZyB0ZXBhdC4gTmFtdW4sIGppa2EgaW5naW4gZm9rdXMgcGFkYSBkaXN0cmlidXNpIG1heW9yaXRhcyB0YW5wYSBkaXBlbmdhcnVoaSBvbGVoIGRhdGEgZWtzdHJpbSwgbWFrYSBtZWRpYW4gdGFucGEgb3V0bGllcnMgbGViaWggc2VzdWFpLg0KDQojIyBNb2R1cyA6DQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzIGRhbiB0aWRhayBtZW5nZ3VuYWthbiBPdXRsaWVyczoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kdXN9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSAtIGZfMCkgfXtmXzEgLSBmXzAgKyAoZl8xIC0gZl8yKX0gXHJpZ2h0KS5DDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSlfMH17KGZfMSlfMCArIChmXzIpXzB9IFxyaWdodCkgLmMNClxlbmR7YWxpZ25lZH0NCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01vZHVzfSA9IDIuOTk5Ljk5OSw1ICsgXGxlZnQoIFxmcmFjezE14oiSMTAgfXsgKDE14oiSMTApICsgKDE1IC0gOCl9IFxyaWdodCkgXHRpbWVzIDEuMDAwLjAwMA0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KICAgIFx0ZXh0e01vZH0gJj0gMi45OTkuOTk5LDUgXGxlZnQoIFxmcmFjezV9ezUgKyA3fSBccmlnaHQpIDEuMDAwLjAwMFxcDQogICAgJj0gMi45OTkuOTk5LDUrICg0MTYuNjY3KSBcXA0KICAgICY9IDMuNDE2LjY2Niw1DQpcZW5ke2FsaWduZWR9DQokJA0KDQogIGtlbGFzIHBlbmRhcGF0YW4gNC4wMDAuMDAwIC0gNC45OTkuOTk5IGFkYWxhaCB5YW5nIHBhbGluZyBiYW55YWsgbXVuY3VsLCBzZWhpbmdnYSBtb2R1cyBtZW1iZXJpa2FuIGtpdGEgICBpbmRpa2FzaSBiYWh3YSBwZW5kYXBhdGFuIHlhbmcgcGFsaW5nIHNlcmluZyBkaXRlbXVrYW4gZGkgYW50YXJhIGthcnlhd2FuIGFkYWxhaCBzZWtpdGFyIFJwIDMuNDE2LjY2Niw1Lg0KDQoNCiMjIEtlc2ltcHVsYW4gOg0KDQotIE1vZHVzIGRlbmdhbiBvdXRsaWVycyBtZW5naGFzaWxrYW4gbmlsYWkgc2ViZXNhciAzLjQxNi42NjcsIG1lbmNha3VwIHNlbHVydWggZGF0YSB0ZXJtYXN1ayByZW50YW5nIGdhamkgZWtzdHJlbSAob3V0bGllcnMpLiBOaWxhaSBpbmkgbWVuY2VybWlua2FuIGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpLCB5YWl0dSBrZWxhcyAzLjAwMC4wMDAgLSAzLjk5OS45OTksIHlhbmcgdGV0YXAgZG9taW5hbiBtZXNraXB1biBhZGEgcGVuZ2FydWggZGF0YSBla3N0cmVtLiAgDQoNCi0gTW9kdXMgdGFucGEgb3V0bGllcnMganVnYSBtZW5naGFzaWxrYW4gbmlsYWkgc2ViZXNhciAzLjQxNi42NjcuIEhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2EgcGVuZ2hhcHVzYW4gb3V0bGllcnMgdGlkYWsgbWVtZW5nYXJ1aGkgaGFzaWwsIGthcmVuYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSB0ZXRhcCBiZXJhZGEgZGkgcmVudGFuZyB5YW5nIHNhbWEsIHlhaXR1IGtlbGFzIDMuMDAwLjAwMCAtIDMuOTk5Ljk5OS4gIA0KDQotIEtlc2ltcHVsYW46IE1vZHVzIGRlbmdhbiBkYW4gdGFucGEgb3V0bGllcnMgbWVtYmVyaWthbiBoYXNpbCB5YW5nIHNhbWEgZGFsYW0ga2FzdXMgaW5pLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGRhdGEgY3VrdXAgdGVya29uc2VudHJhc2kgcGFkYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSwgc2VoaW5nZ2EgZGF0YSBla3N0cmVtIHRpZGFrIG1lbWVuZ2FydWhpIG5pbGFpIG1vZHVzIHNlY2FyYSBzaWduaWZpa2FuLg0KDQojIDEuMi4yIEtlc2VoYXRhbg0KDQpUb3BpazogQW5hbGlzaXMgRGlzdHJpYnVzaSBKdW1sYWggRG9zaXMgVmFrc2luYXNpIENPVklELTE5IGRpIEtvdGEgTW9qb2tlcnRvDQoNClNlYnVhaCBkaW5hcyBrZXNlaGF0YW4gZGkga290YSBNb2pva2VydG8gbWVuZ2FuYWxpc2lzIGp1bWxhaCBkb3NpcyB2YWtzaW5hc2kgQ09WSUQtMTkgeWFuZyB0ZWxhaCBkaWJlcmlrYW4ga2VwYWRhIHBlbmR1ZHVrIGRhbGFtIGtlbG9tcG9rIHVzaWEgdGVydGVudHUuIERhdGEganVtbGFoIGRvc2lzIHZha3NpbiB5YW5nIGRpdGVyaW1hIHBlbmR1ZHVrIGRpIGtvdGEgbW9qb2tlcnRvIGRpa2Vsb21wb2trYW4gYmVyZGFzYXJrYW4ga2Vsb21wb2sgdXNpYSBzZWJhZ2FpIGJlcmlrdXQ6DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEga2Vsb21wb2sNCmxpYnJhcnkoa25pdHIpDQoNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgIktlbG9tcG9rX3VzaWFfKFRhaHVuKSIgPSBjKCIxOCAtIDI5IiwgIjMwIC0gMzkiLCAiNDAgLSA0OSIsICI1MCAtIDU5IiwgIjYwIC0gNjkiKSwNCiAgIkZyZWt1ZW5zaV9wZW5lcmltYV9kb3Npc192YWtzaW4iID0gYyggIjEwMDAiLCAiMTUwMCIsICIxMjAwIiwgIjgwMCIsICI1MDAiKSANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBhbmFsaXNpcyBkaXRyaWJ1c2kganVtbGFoIHZha3NpbiIpDQoNCmBgYA0KDQpQZW55ZWxlc2FpYW4gOg0KDQpEaWtldGFodWkgYmFod2EgdGl0aWsgdGVuZ2FoLCBGcmVrdWVuc2kgS3VtdWxhdGlmIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva191c2lhXyhUYWh1bikiID0gYygiMTggLSAyOSIsICIzMCAtIDM5IiwgIjQwIC0gNDkiLCAiNTAgLSA1OSIsICI2MCAtIDY5IiksDQogICJGcmVrdWVuc2lfcGVuZXJpbWFfZG9zaXNfdmFrc2luIiA9IGMoICIxMDAwIiwgIjE1MDAiLCAiMTIwMCIsICI4MDAiLCAiNTAwIiksIA0KICAiRmtrIiA9IGMoICIxMDAwIiwgIjI1MDAiLCAiMzcwMCIsICI0NTAwIiwgIjUwMDAiKSwgDQogICJOaWxhaV90ZW5nYWgiID0gYyggIjIzLjUiLCAiMzQuNSIsICI0NC41IiwgIjU0LjUiLCAiNjQuNSIpLA0KICAiaGFzaWxfa2FsaV9mcmVrdWVuc2lfZGFuX25pbGFpX3RlbmdhaCIgPSBjKCAiMjMsNTAwIiwgIjUxLDc1MCIsICI1Myw0MDAiLCAiNDMsNjAwIiwgIjMyLDI1MCIpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgZnJla3VlbnNpIGt1bXVsYXRpZiBkYW4gbmlsYWkgdGVuZ2FoIGFuYWxpc2lzIG1lbmdndW5ha2FuIG91dGxpZXJzIikNCg0KYGBgDQoNCiMjIE1lYW4gOg0KDQogIEp1bWxhaCB0b3RhbCBmcmVrdWVuc2kg8J2RgT0gMTAwMCArIDE1MDAgKyAxMjAwICsgODAwICsgNTAwID0gNTAwMA0KDQpoaXR1bmcgcmF0YS1yYXRhIGRvc2lzIHZha3NpbmFzaToNCg0KIyMgTWVuZ2d1bmFrYW4gT3V0bGllcnMgDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClxiYXJ7WH0gPSBcZnJhY3tcc3VtIGZYfXtufSA9IFxmcmFjIHsxMDAwKDIzLjUpKyAxNTAwKDM0LjUpKyAxMjAwKDQ0LjUpKyA4MDAoNTQuNSkrIDUwMCg2NC41KX17NTAwMH0NClxlbmR7YWxpZ25lZH0NCiQkDQokJA0KXGJlZ2lue2FsaWduZWR9DQo9IFxmcmFjIHsyMDQsNTAwfXs1MDAwfQ0KPSA0MC45dGFodW4NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIFRhbnBhIG1lbmdndW5ha2FuIE91dGxpZXJzIA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva191c2lhXyhUYWh1bikiID0gYygiMTggLSAyOSIsICIzMCAtIDM5IiwgIjQwIC0gNDkiLCAiNTAgLSA1OSIpLA0KICAiRnJla3VlbnNpX3BlbmVyaW1hX2Rvc2lzX3Zha3NpbiIgPSBjKCAiMTAwMCIsICIxNTAwIiwgIjEyMDAiLCAiODAwIiksIA0KICAiTmlsYWlfdGVuZ2FoIiA9IGMoICIyMy41IiwgIjM0LjUiLCAiNDQuNSIsICI1NC41IiksDQogICJoYXNpbF9rYWxpX2ZyZWt1ZW5zaV9kYW5fbmlsYWlfdGVuZ2FoIiA9IGMoICIyMyw1MDAiLCAiNTEsNzUwIiwgIjUzLDQwMCIsICI0Myw2MDAiKQ0KKQ0KIyBNZW5hbXBpbGthbiB0YWJlbA0KDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIGZyZWt1ZW5zaSBrdW11bGF0aWYgZGFuIG5pbGFpIHRlbmdhaCBhbmFsaXNpcyB0YW5wYSBvdXRsaWVycyIpDQoNCmBgYA0KDQpUb3RhbCBmcmVrdWVuc2kgdGFucGEgb3V0bGllcnM6IA0KDQokJA0Kbj0xMDAwKzE1MDArMTIwMCs4MDA9NDUwMA0KJCQNCg0KIE1lbmdoaXR1bmcgTWVhbiBUYW5wYSBPdXRsaWVyczoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXGJhcntYfSA9IHtcc3VtIGZYfSA9IHsyMyw1MDArIDUxLDc1MCArIDUzLDQwMCArIDQzLDYwMH0gPSAxNzIsMjUwDQpcZW5ke2FsaWduZWR9DQokJA0KJCQNClxiZWdpbnthbGlnbmVkfQ0KPSBcZnJhYyB7MTcyLDI1MH17NDUwMH0NCj0gMzguMjIgdGFodW4NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIEtlc2ltcHVsYW4gOg0KDQotIE1lYW4gZGVuZ2FuIE91dGxpZXJzIGFkYWxhaCA0MC45LCB5YW5nICBtZW5jYWt1cCBzZWx1cnVoIGRhdGEsIHRlcm1hc3VrIGtlbG9tcG9rICB1c2lhIDYwIC0gNjkgeWFuZyBkaWFuZ2dhcCBzZWJhZ2FpIG91dGxpZXIuDQoNCi0gTWVhbiB0YW5wYSBPdXRsaWVycyBhZGFsYWggMzguMjIsIHlhbmcgZGlwZXJvbGVoIHNldGVsYWggbWVuZ2FiYWlrYW4ga2Vsb21wb2sgdXNpYSAgIDYwIC0gNjkgeWFuZyBkaWFuZ2dhcCBzZWJhZ2FpIG91dGxpZXIuDQoNCi0gUGVuZ2FydWggT3V0bGllcnM6IE1lYW4gZGVuZ2FuIG91dGxpZXJzICBsZWJpaCB0aW5nZ2ksIG1lbnVuanVra2FuIHBlbmdhcnVoIGtlbG9tcG9rICAgdXNpYSB5YW5nIGxlYmloIHR1YSB5YW5nIG1lbWlsaWtpIG5pbGFpIGxlYmloIHRpbmdnaSAoNjQuNSksIHlhbmcgbWVtcGVuZ2FydWhpICByYXRhLXJhdGEga2VzZWx1cnVoYW4uIFNldGVsYWggbWVuZ2hhcHVzICBkYXRhIG91dGxpZXIsIHJhdGEtcmF0YSBtZW5qYWRpIGxlYmloICByZW5kYWgsIG1lbmNlcm1pbmthbiBkaXN0cmlidXNpIGRhdGEgbWF5b3JpdGFzIHBlbmVyaW1hIHZha3Npbi4NCg0KIyMgTWVkaWFuIDogDQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzIA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNZWRpYW59ID0gdGIgKyBcbGVmdCggXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtGX219IFxyaWdodCkuIEMNClxlbmR7YWxpZ25lZH0NCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01lZGlhbn0gJj0gMjkuNSArIFxsZWZ0KCBcZnJhY3tcZnJhY3s1MDAwfXsyfSAtIDEwMDB9ezE1MDB9IFxyaWdodCkgMTAgXFwNCiY9IDI5LjUgKyBcbGVmdCggXGZyYWN7MjUwMCAtIDEwMDB9ezE1MDB9IFxyaWdodCkgMTAgXFwgJj0gMjkuNSArIDEwIFxcICY9MzkuNSB0YWh1bg0KXGVuZHthbGlnbmVkfQ0KJCQgDQoNCiMjIFRhbnBhIG1lbmdndW5ha2FuIE91dGxpZXJzIA0KDQpKdW1sYWggdG90YWwgZnJla3VlbnNpIHRhbnBhIG91dGxpZXJzIPCdkZs9NDUwMA0KDQokJA0KXGZyYWMge259ezJ9ID0gXGZyYWMgezQ1MDB9ezJ9ID0gMjI1MA0KJCQNCm1lbmdoaXR1bmcgbWVkaWFuIHRhbnBhIG91dGxpZXJzIDoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSAmPSAyOS41ICsgXGxlZnQoIFxmcmFje1xmcmFjezQ1MDB9ezJ9IC0gMTAwMH17MTUwMH0gXHJpZ2h0KSAxMCBcXA0KJj0gMjkuNSArIFxsZWZ0KCBcZnJhY3syMjUwIC0gMTAwMH17MTUwMH0gXHJpZ2h0KSAxMCBcXCAmPSAyOS41ICsgOC4zMyBcXCAmPTM3LjgzIHRhaHVuDQpcZW5ke2FsaWduZWR9DQokJCANCg0KIyMgS2VzaW1wdWxhbiA6DQoNCi0gTWVkaWFuIGRlbmdhbiBPdXRsaWVycyAobWVuZ2hpdHVuZyBkZW5nYW4gc2VsdXJ1aCBkYXRhKSBhZGFsYWggMzkuNS4NCg0KLSBNZWRpYW4gdGFucGEgT3V0bGllcnMgKG1lbmdhYmFpa2FuIGtlbG9tcG9rIHVzaWEgNjAgLSA2OSBzZWJhZ2FpIG91dGxpZXIpIGFkYWxhaCAzNy44My4NCg0KLSBQZW5nYXJ1aCBPdXRsaWVyczogUGVyYmVkYWFuIG5pbGFpIG1lZGlhbiBtZW51bmp1a2thbiBiYWh3YSBrZWxvbXBvayB1c2lhIHlhbmcgbGViaWggdHVhICg2MCAtIDY5KSB5YW5nIGRpYW5nZ2FwIHNlYmFnYWkgb3V0bGllciBtZW1pbGlraSBkYW1wYWsgcGFkYSBuaWxhaSBtZWRpYW4uIFNldGVsYWggbWVuZ2FiYWlrYW4gb3V0bGllciwgbmlsYWkgbWVkaWFuIHNlZGlraXQgbGViaWggcmVuZGFoLCBtZW5jZXJtaW5rYW4gZGlzdHJpYnVzaSBkYXRhIG1heW9yaXRhcyBwZW5lcmltYSB2YWtzaW4geWFuZyBsZWJpaCB0ZXJwdXNhdC4NCg0KDQojIyBNb2R1cyA6DQoNCg0KIyMgTWVuZ2d1bm5ha2FuIE91dGxpZXJzIGRhbiB0YW5wYSBtZW5nZ3VuYWthbiBPdXRsaWVycyANCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kdXN9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSAtIGZfMCkgfXtmXzEgLSBmXzAgKyAoZl8xIC0gZl8yKX0gXHJpZ2h0KS5DDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ID0gdGIgKyBcbGVmdCggXGZyYWN7KGZfMSlfMH17KGZfMSlfMCArIChmXzIpXzB9IFxyaWdodCkuQw0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kfSAmPSAyOS41IFxsZWZ0KCBcZnJhY3s1MDB9ezUwMCArIDMwMH0gXHJpZ2h0KSAxMFxcDQogJj0gMjkuNSArICgwLjYyNSkgXFwgJj0gMzUuNzV0YWh1bg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KICBKYWRpIG1vZHVzIGRpYXRhcyB0ZXJkYXBhdCBwYWRhIHVzaWEgc2VraXRhciAzNi4yNSB0YWh1biBhZGFsYWggdXNpYSB5YW5nIHBhbGluZyBzZXJpbmcgbWVuZGFwYXRrYW4gICAgICAgdmFrc2luLCB5YW5nIHRlcm1hc3VrIGRhbGFtIGtlbG9tcG9rIHVzaWEgMzAgLSAzOSB0YWh1bi4NCiAgDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBOaWxhaSBtb2R1cyB0aWRhayB0ZXJwZW5nYXJ1aCBvbGVoIG91dGxpZXJzIGRhbGFtIGRhdGEgaW5pLg0KDQotIEhhbCBpbmkgZGlzZWJhYmthbiBvbGVoIHBvc2lzaSBrZWxhcyBtb2R1cyAoIDMwIOKIkiAzOSApIHlhbmcgdGlkYWsgYmVydWJhaCBtZXNraXB1biBvdXRsaWVyIChrZWxhcyANCjYw4oiSNjkpIGRpa2VsdWFya2FuLg0KDQotIE1vZHVzIG1lbWJlcmlrYW4gaW5mb3JtYXNpIHRlbnRhbmcga2Vsb21wb2sgdXNpYSB5YW5nIHBhbGluZyB1bXVtIGRhbGFtIGRhdGEgcGVuZXJpbWEgdmFrc2luLCB5YWl0dSAzMCAtIDM5IHRhaHVuLCB0ZXJsZXBhcyBkYXJpIGtlYmVyYWRhYW4gb3V0bGllcnMuDQoNCi0gUGVuZ2d1bmFhbiBiYXRhcyBiYXdhaCDwnZC/PSAyOS41IG1lbmdoYXNpbGthbiBuaWxhaSBtb2R1cyB5YW5nIHNhbWEgdW50dWsga2VkdWEgbWV0b2RlLiBJbmkgdGVyamFkaSBrYXJlbmEgZnJla3VlbnNpIHRlcnRpbmdnaSB0ZXRhcCBiZXJhZGEgZGkga2VsYXMgeWFuZyBzYW1hICggMzAg4oiSIDM5KSwgc2VoaW5nZ2Egb3V0bGllciB0aWRhayBtZW1lbmdhcnVoaSBoYXNpbCBwZXJoaXR1bmdhbiBtb2R1cy4NCg0KDQojIyBWYWxpZGFzaSBEYXRhIA0KDQp1bnR1ayBtZW12YWxpZGFzaSBkYXRhIG1ha2EgbWVuZ2d1bmFrYW4gcHJlc2VudGFzZSBlZmVrdGl2aXRhcyB2YWtzaW5hc2kgIHRpYXAga2Vsb21wb2sgdXNpYSAoIGRhbGFtIGJlbnR1ayAlICkgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva19Vc2lhKFRhaHVuKSIgPSBjKCIxOCAtIDI5IiwgIjMwIC0gMzkiLCAiNDAgLSA0OSIsICI1MCAtIDU5IiwgIjYwIC0gNjkiKSwNCiAgIkZyZWt1ZW5zaV9wZW5lcmltYV92YWtzaW4iID0gYygiMTAwMCIsICIxNTAwIiwgIjEyMDAiLCAiODAwIiwgIjUwMCIpLA0KICAiRWZla3Rpdml0YXNfVmFrc2luYXNpKCUpIiA9IGMoICI5OCUiLCAiOTclIiwgIjk1JSIsICI5MCUiLCAiODUlIikgDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgbWV2YWxpZGFzaSBkYXRhIG1lbmdndW5ha2FuIHByZXNlbnRhc2UgZWZla3Rpdml0YXMgdmFrc2luYXNpIikNCg0KYGBgDQogDQojIyBMYW5na2FoLWxhbmdrYWggdmFsaWRhc2k6DQoNCjEuIE1lbmdoaXR1bmcgVG90YWwgRWZla3Rpdml0YXMgVmFrc2luYXNpIGRlbmdhbiBydW11cyA6DQoNCiQkDQpcdGV4dHtSYXRhLXJhdGEgRWZla3Rpdml0YXN9ID0gXGZyYWN7XFNpZ21hIChcdGV4dHtGcmVrdWVuc2l9IFx0aW1lcyBcdGV4dHtFZmVrdGl2aXRhc30pfXtcU2lnbWEgKFx0ZXh0e0ZyZWt1ZW5zaX0pfQ0KJCQNCg0KUGVyaGl0dW5nYW46DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e1JhdGEtcmF0YSBFZmVrdGl2aXRhc30gPSBcZnJhY3soMTAwMCBcdGltZXMgOTgpICsgKDE1MDAgXHRpbWVzIDk3KSArICgxMjAwIFx0aW1lcyA5NSkgKyAoODAwIFx0aW1lcyA5MCkgKyAoNTAwIFx0aW1lcyA4NSl9ezUwMDB9DQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQo9IFxmcmFjezk4MDAwICsgMTQ1NTAwICsgMTE0MDAwICsgNzIwMDAgKyA0MjUwMH17NTAwMH0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCj0gXGZyYWN7NDcyMDAwfXs1MDAwfSA9IDk0LjRcJQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KICBKYWRpLCByYXRhLXJhdGEgZWZla3Rpdml0YXMgdmFrc2luYXNpIGFkYWxhaCAkezk0LjRcJX0kLg0KDQoyLiBNZW1iYW5kaW5na2FuIGRlbmdhbiBBbWJhbmcgS2ViZXJoYXNpbGFuIDk5JSA6DQoNCkppa2Egc3RhbmRhciBrZWJlcmhhc2lsYW4gYWRhbGFoIDk5JSwgcmF0YS1yYXRhIGVmZWt0aXZpdGFzIHNlYmVzYXIgOTQuNCUgYmVsdW0gbWVuY2FwYWkgYW5na2EgaW5pLiBEZW5nYW4gZGVtaWtpYW4sIHZha3NpbmFzaSBwYWRhIGtlbG9tcG9rIGluaSBiZWx1bSBtZW1lbnVoaSBrcml0ZXJpYSBrZWJlcmhhc2lsYW4gOTklLg0KDQozLiBBbmFsaXNpcyBQZXIgS2Vsb21wb2sgVXNpYSB5YW5nIG1lbmRla2F0aSBhdGF1IG1lbGViaWhpIDk5JToNCg0KICAtIEtlbG9tcG9rIHVzaWEgMTggLSAyOSB0YWh1biBtZW1pbGlraSBlZmVrdGl2aXRhcyB0ZXJ0aW5nZ2ksIHlhaXR1IDk4JSwgICAgIHRldGFwaSBtYXNpaCBkaSBiYXdhaCA5OSUuDQogIA0KICAtIEtlbG9tcG9rIGxhaW5ueWEgbWVtaWxpa2kgZWZla3Rpdml0YXMgeWFuZyBzZW1ha2luIG1lbnVydW4gZGVuZ2FuICAgICAgICAgYmVydGFtYmFobnlhIHVzaWEuDQogIA0KNC4gS2VzaW1wdWxhbiBWYWxpZGFzaToNCg0KICAtIFNlY2FyYSBrZXNlbHVydWhhbiwgcmF0YS1yYXRhIGVmZWt0aXZpdGFzIHZha3NpbmFzaSBhZGFsYWggOTQuNCUsIHlhbmcgICAgIGJlbHVtIG1lbmNhcGFpIHRhcmdldCBrZWJlcmhhc2lsYW4gOTklLg0KICANCiAgLSBQZXIga2Vsb21wb2ssIHRpZGFrIGFkYSBrZWxvbXBvayB5YW5nIG1lbmNhcGFpIGF0YXUgbWVsZWJpaGkgYW1iYW5nICAgICAgIDk5JS4NCiAgDQogIC0gVW50dWsgbWVuY2FwYWkga2ViZXJoYXNpbGFuIDk5JSwgZGlwZXJsdWthbiBzdHJhdGVnaSB0YW1iYWhhbiwgc2VwZXJ0aSAgICAgbWVuaW5na2F0a2FuIGNha3VwYW4gdmFrc2luYXNpLCBvcHRpbWFzaSBkb3NpcyB1bnR1ayBrZWxvbXBvayB1c2lhICAgICAgICB0ZXJ0ZW50dSwgYXRhdSBldmFsdWFzaSB0ZXJoYWRhcCBqZW5pcyB2YWtzaW4geWFuZyBkaWd1bmFrYW4uDQoNCg0KIyAxLjIuMyBQZW5kaWRpa2FuDQoNClRvcGlrOiBNZW5nYW5hbGlzaXMgYmFnYWltYW5hIHBlbmdndW5hYW4gbWVkaWEgc29zaWFsIG1lbWVuZ2FydWhpIHByb2R1a3Rpdml0YXMgYmVsYWphciBzaXN3YS4NCg0KZGF0YSB0ZW50YW5nIHdha3R1IHBlbmdndW5hYW4gbWVkaWEgc29zaWFsIHNpc3dhIHNldGlhcCBoYXJpIChkYWxhbSBqYW0pIGRhbiByYXRhLXJhdGEgbmlsYWkgdWppYW4geWFuZyBtZXJla2EgcGVyb2xlaC4gRGF0YSBkaWJhZ2kgZGFsYW0ga2Vsb21wb2sgd2FrdHUgcGVuZ2d1bmFhbiBtZWRpYSBzb3NpYWwgc2ViYWdhaSBiZXJpa3V0IDoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJ3YWt0dV9QZW5nZ3VuYWFuX01lZGlhX1Nvc2lhbF8oamFtL2hhcmkpIiA9IGMoIjAgLSAxIiwgIjIgLSAzIiwgIjQgLSA1IiwgIjYgLSA3IiksDQogICJGcmVrdWVuc2lfc2lzd2EiID0gYygiOCIsICIxMiIsICIxMCIsICI1IiksDQogICJSYXRhX3JhdGFfbmlsYWlfdWppYW5fKDEtMTAwKSIgPSBjKCAiODUiLCAiNzUiLCAiNjUiLCAiNjAiKSANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBtZWRpYW4gZnJla3VlbnNpIGt1bXVsYXRpZiIpDQoNCmBgYA0KDQpQZW55ZWxlc2FpYW4gOg0KDQpEaWtldGFodWkgYmFod2EgdGl0aWsgdGVuZ2FoLCBGcmVrdWVuc2kgS3VtdWxhdGlmIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJ3YWt0dV9QZW5nZ3VuYWFuX01lZGlhX1Nvc2lhbF8oamFtL2hhcmkpIiA9IGMoIjAgLSAxIiwgIjIgLSAzIiwgIjQgLSA1IiwgIjYgLSA3IiksDQogICJGcmVrdWVuc2lfc2lzd2EiID0gYygiOCIsICIxMiIsICIxMCIsICI1IiksIA0KICAiRmtrIiA9IGMoICI4IiwgIjIwIiwgIjMwIiwgIjM1IiksIA0KICAiVGl0aWtfdGVuZ2FoIiA9IGMoICIwLjUiLCAiMi41IiwgIjQuNSIsICI2LjUiKSwNCiAgImhhc2lsX2thbGlfZnJla3VlbnNpX2Rhbl90aXRpa190ZW5nYWgiID0gYyggIjQiLCAiMzAiLCAiNDUiLCAiMzIuNSIpDQopDQojIE1lbmFtcGlsa2FuIHRhYmVsDQoNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsgZnJla3VlbnNpIGt1bXVsYXRpZiBkYW4gbmlsYWkgdGVuZ2FoIGFuYWxpc2lzIG1lbmdndW5ha2FuIG91dGxpZXJzIikNCg0KYGBgDQoNCiMjIE1lYW4gOg0KDQogIFRvdGFsIGZyZWt1ZW5zaSAkKPCdkYEpID0gMzUkDQoNCiAgVG90YWwgJPCdkZMu8J2RpSA9IDQgKyAzMCArIDQ1ICsgMzIuNSA9IDExMS41JA0KDQpoaXR1bmcgcmF0YS1yYXRhIHBlbmdndW5hYW4gbWVkaWEgc29zaWFsOg0KDQojIyBNZW5nZ3VuYWthbiBPdXRsaWVycw0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcYmFye1h9ID0gXGZyYWN7XHN1bSBmWH17bn0gPSBcZnJhYyB7OCgwLjUpKyAxMigyLjUpKyAxMCg0LjUpKyA1KDYuNSl9ezM1fQ0KPSBcZnJhYyB7MTExLjV9ezM1fQ0KPSAzLjE4IGphbS9oYXJpLg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgVGFucGEgbWVuZ2d1bmFrYW4gb3V0bGllcnMNCg0KLSBIaXR1bmcgdG90YWwgaGFzaWwga2FsaSDwnZGT4ouF8J2RpSB0YW5wYSBvdXRsaWVyczoNCg0KJCQNClRvdGFsIGbii4V4ID0gNCArIDMwICsgNDUgPSA3OQ0KJCQNCi0gSnVtbGFoIGZyZWt1ZW5zaSAo8J2RmykgdGFucGEgb3V0bGllcnM6DQoNCiQkDQpuID0gOCArIDEyICsgMTAgPSAzMA0KJCQNCg0KLSBoaXR1bmcgbWVhbiA6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClxiYXJ7WH0gPSBcZnJhY3tcc3VtIGZYfXtufSA9IFxmcmFjIHs4KDAuNSkrIDEyKDIuNSkrIDEwKDQuNSl9ezMwfQ0KPSBcZnJhYyB7Nzl9ezMwfQ0KPSAyLjYzIGphbS9oYXJpLg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KIyMgS2VzaW1wdWxhbiA6DQoNCi0gUGVuZ2FydWggb3V0bGllcnMgcGFkYSBtZWFuIHNhbmdhdCBzaWduaWZpa2FuLiBOaWxhaSBtZWFuIGRlbmdhbiBvdXRsaWVycyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHRhbnBhIG91dGxpZXJzLg0KDQotIE1lYW4gdGFucGEgb3V0bGllcnMgbWVtYmVyaWthbiByZXByZXNlbnRhc2kgeWFuZyBsZWJpaCBha3VyYXQgdGVyaGFkYXAgd2FrdHUgcGVuZ2d1bmFhbiBtZWRpYSBzb3NpYWwgbWF5b3JpdGFzIHNpc3dhLg0KDQotIEtlcHV0dXNhbiB1bnR1ayBtZW5nZ3VuYWthbiBtZWFuIGRlbmdhbiBhdGF1IHRhbnBhIG91dGxpZXJzIHRlcmdhbnR1bmcgcGFkYSB0dWp1YW4gYW5hbGlzaXM6DQoNCiAgLSBEZW5nYW4gb3V0bGllcnM6IE1lbmdnYW1iYXJrYW4gc2VsdXJ1aCBkaXN0cmlidXNpIGRhdGEsIHRlcm1hc3VrIGVrc3RyZW0uDQogIA0KICAtIFRhbnBhIG91dGxpZXJzOiBNZW1iZXJpa2FuIGdhbWJhcmFuIHlhbmcgbGViaWggc3RhYmlsIGRhbiByZWFsaXN0aXMgdGVyaGFkYXAgZGF0YSB1bXVtLg0KICANCiAgDQojIyBNZWRpYW4gOiANCg0KIyMgTWVuZ2d1bmFrYW4gT3V0bGllcnMNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSA9IExfMCArIFxsZWZ0KCBcZnJhY3tcZnJhY3tufXsyfSAtIEZ9e0ZfbX0gXHJpZ2h0KS4gQw0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TWVkaWFufSAmPSAyICsgXGxlZnQoIFxmcmFje1xmcmFjezM1fXsyfSAtIDh9ezEyfSBccmlnaHQpIDIgXFwNCiY9IDIgKyBcbGVmdCggXGZyYWN7MTcuNeKIkjh9ezEyfSBccmlnaHQpIDIgXFwgJj0gMisgMSw1OCBcXCAmPTMuNTggamFtL2hhcmkuDQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyB0YW5wYSBtZW5nZ3VuYWthbiBvdXJsaWVycyANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAid2FrdHVfUGVuZ2d1bmFhbl9NZWRpYV9Tb3NpYWxfKGphbS9oYXJpKSIgPSBjKCIwIC0gMSIsICIyIC0gMyIsICI0IC0gNSIpLA0KICAiRnJla3VlbnNpX3Npc3dhIiA9IGMoIjgiLCAiMTIiLCAiMTAiKSwgDQogICJGa2siID0gYygiOCIsICIyMCIsICIzMCIpIA0KICANCikNCiMgTWVuYW1waWxrYW4gdGFiZWwNCg0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBmcmVrdWVuc2kga3VtdWxhdGlmIGRhbiBuaWxhaSB0ZW5nYWggYW5hbGlzaXMgdGFucGEgb3V0bGllcnMiKQ0KDQpgYGANCg0KLSBtZW5jYXJpIFxmcmFje259ezJ9IDoNCg0KJCQNClxmcmFje259ezJ9ID0gXGZyYWN7MzB9ezJ9ID0gMTUNCiQkDQotIGhpdHVuZyBtZWRpYW4gOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNZWRpYW59ICY9IDIgKyBcbGVmdCggXGZyYWN7XGZyYWN7MzB9ezJ9IC0gOH17MTJ9IFxyaWdodCkgMiBcXA0KJj0gMiArIFxsZWZ0KCBcZnJhY3sxNeKIkjh9ezEyfSBccmlnaHQpIDIgXFwgJj0gMisgMSwxNyBcXCAmPTMuMTcgamFtL2hhcmkuDQpcZW5ke2FsaWduZWR9DQokJA0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBQZW5nYXJ1aCBvdXRsaWVycyBwYWRhIG1lZGlhbiB0aWRhayB0ZXJsYWx1IGJlc2FyLCB0ZXRhcGkgdGV0YXAgbWVtYmVyaWthbiBwZXJiZWRhYW4uIE1lZGlhbiBkZW5nYW4gb3V0bGllcnMgc2VkaWtpdCBsZWJpaCB0aW5nZ2ksIG1lbmNlcm1pbmthbiBwZW5nYXJ1aCBkYXRhIGVrc3RyZW0gcGFkYSBuaWxhaSB0ZW5nYWguDQoNCi0gTWVkaWFuIHRhbnBhIG91dGxpZXJzIG1lbWJlcmlrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCBzdGFiaWwgZGFuIHJlcHJlc2VudGF0aWYgdW50dWsgbWF5b3JpdGFzIGRhdGEsIGRlbmdhbiB3YWt0dSBwZW5nZ3VuYWFuIG1lZGlhIHNvc2lhbCB5YW5nIGxlYmloIHJlYWxpc3RpcyBiYWdpIHNlYmFnaWFuIGJlc2FyIHNpc3dhLg0KDQojIyBNb2R1cyA6DQoNCiMjIE1lbmdndW5ha2FuIE91dGxpZXJzIGRhbiB0YW5wYSBvdXRsaWVycw0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R1c30gPSBMXzAgKyBcbGVmdCggXGZyYWN7KGZfMSAtIGZfMCkgfXtmXzEgLSBmXzAgKyAoZl8xIC0gZl8yKX0gXHJpZ2h0KSBDDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcdGV4dHtNb2R9ID0gTF8wIFxsZWZ0KCBcZnJhY3soZl8xKV8wfXsoZl8xKV8wICsgKGZfMilfMH0gXHJpZ2h0KS5DDQpcZW5ke2FsaWduZWR9DQokJA0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXHRleHR7TW9kdXN9ID0gMiArIFxsZWZ0KCBcZnJhY3soMTLiiJI4KSB9ezEyIC0gOCArICgxMiAtIDEwKX0gXHJpZ2h0KS4gMg0KXGVuZHthbGlnbmVkfQ0KJCQNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e01vZH0gJj0gMiBcbGVmdCggXGZyYWN7NH17NCArIDJ9IFxyaWdodCkuIDJcXA0KICY9IDIrMS4zMyBcXCAmPSAzLjMzIGphbS9oYXJpLg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KICBCZXJkYXNhcmthbiBwZXJoaXR1bmdhbiBtZW5nZ3VuYWthbiBtZXRvZGUgbW9kdXMsIGRpdGVtdWthbiBiYWh3YSBrZWxhcyBpbnRlcnZhbCAyIC0gMyBqYW0vaGFyaSBhZGFsYWggICAga2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB0ZXJ0aW5nZ2ksIHlhaXR1IHNlYmFueWFrIDEyIHNpc3dhLiBEZW5nYW4gZGlkYXBhdGthbiBuaWxhaSBtb2R1cyBzZWJlc2FyIDIuNjcgICAgIGphbS9oYXJpLg0KDQojIyBLZXNpbXB1bGFuIDoNCg0KLSBNb2R1cyBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXJzIG1lbmdoYXNpbGthbiBuaWxhaSB5YW5nIHNhbWEgZGFsYW0ga2FzdXMgaW5pLiBJbmkgbWVudW5qdWtrYW4gYmFod2EgZGF0YSBkYWxhbSBrZWxvbXBvayBpbmkgY3VrdXAgdGVya29uc2VudHJhc2kgcGFkYSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRpbmdnaSAoMiAtIDMgamFtL2hhcmkpLCBzZWhpbmdnYSBwZW5nYXJ1aCBkYXRhIGVrc3RyZW0gcGFkYSBrZWxhcyA2IC0gNyBqYW0vaGFyaSB0aWRhayB0ZXJsYWx1IG1lbXBlbmdhcnVoaSBuaWxhaSBtb2R1cy4NCg0KLSBNb2R1cyB5YW5nIGRpdGVtdWthbiBhZGFsYWggMy4zMyBqYW0vaGFyaSwgeWFuZyBtZW51bmp1a2thbiB3YWt0dSBwZW5nZ3VuYWFuIG1lZGlhIHNvc2lhbCB5YW5nIHBhbGluZyB1bXVtIGRpZ3VuYWthbiBvbGVoIHNpc3dhIGRhbGFtIGRhdGFzZXQgaW5pLCBiYWlrIGRlbmdhbiBtYXVwdW4gdGFucGEgbWVtcGVyaGl0dW5na2FuIG91dGxpZXJzLg==