Tugas pertemuan 12

Materi Dasar probabilitas


Materi Dasar Probabilitas

Pengertian Probabilitas

Probabilitas adalah ukuran peluang suatu kejadian terjadi, dinyatakan sebagai angka antara 0 hingga 1.
Rumus dasar probabilitas:
\[ P(A) = \frac{\text{Jumlah hasil yang mendukung kejadian A}}{\text{Jumlah total hasil yang mungkin}} \]

  • \(P(A) = 0\): Kejadian tidak mungkin terjadi.
  • \(P(A) = 1\): Kejadian pasti terjadi.

1.Probabilitas Kejadian Tunggal

Probabilitas kejadian tunggal adalah peluang terjadinya satu kejadian yang tidak bergantung pada kejadian lain. Sebagai contoh, probabilitas mendapatkan angka genap pada lemparan dadu, atau probabilitas seseorang memiliki tinggi badan di atas 170 cm.


2. Probabilitas Gabungan (AND dan OR)

2.1. Probabilitas AND (Perkalian)

Jika dua kejadian \(A\) dan \(B\) independen, maka probabilitas terjadinya keduanya adalah:
\[ P(A \cap B) = P(A) \cdot P(B) \]

2.2. Probabilitas OR (Penjumlahan)

Jika dua kejadian \(A\) dan \(B\) tidak saling eksklusif, maka probabilitas salah satu terjadi adalah:
\[ P(A \cup B) = P(A) + P(B) - P(A \cap B) \]

Jika kejadian \(A\) dan \(B\) saling eksklusif, maka:
\[ P(A \cup B) = P(A) + P(B) \]


3. Probabilitas Saling Eksklusif dan Tidak Saling Eksklusif

3.1. Kejadian Saling Eksklusif

Kejadian yang saling eksklusif adalah kejadian yang tidak dapat terjadi bersamaan. Artinya, jika satu kejadian terjadi, maka kejadian lainnya pasti tidak terjadi. Misalnya, ketika kita melempar dadu, mendapatkan angka 2 dan angka 4 adalah kejadian saling eksklusif, karena kita hanya bisa mendapatkan salah satu angka tersebut dalam satu lemparan.

Rumus probabilitas untuk kejadian saling eksklusif:
\[ P(A \cup B) = P(A) + P(B) \]

3.2. Kejadian Tidak Saling Eksklusif

Kejadian yang tidak saling eksklusif adalah kejadian yang dapat terjadi bersamaan. Misalnya, jika kita memilih sebuah kartu dari dek kartu, kejadian mendapatkan kartu merah dan kejadian mendapatkan kartu bernomor genap adalah kejadian yang tidak saling eksklusif, karena kita bisa mendapatkan kartu merah yang bernomor genap.

Rumus probabilitas untuk kejadian tidak saling eksklusif:
\[ P(A \cup B) = P(A) + P(B) - P(A \cap B) \]


4. Probabilitas Bersyarat (Conditional Probability)

Probabilitas bersyarat adalah probabilitas dari suatu kejadian yang terjadi dengan mempertimbangkan bahwa kejadian lain telah terjadi. Probabilitas bersyarat untuk kejadian \(A\) diberikan bahwa kejadian \(B\) telah terjadi dituliskan sebagai \(P(A|B)\). Rumus probabilitas bersyarat adalah:

\[ P(A|B) = \frac{P(A \cap B)}{P(B)} \]

Artinya, probabilitas \(A\) terjadi, dengan syarat bahwa \(B\) telah terjadi, dapat dihitung dengan membagi probabilitas kejadian bersama \(A\) dan \(B\) dengan probabilitas kejadian \(B\).

Contoh:

Misalkan kita ingin menghitung probabilitas mendapatkan angka genap pada lemparan dadu dengan syarat bahwa angka yang keluar lebih besar dari 3. Kita dapat menggunakan rumus probabilitas bersyarat.

  • Kejadian \(A\): mendapatkan angka genap.
  • Kejadian \(B\): mendapatkan angka lebih besar dari 3.

Langkah 1: Tentukan probabilitas kejadian bersama, yaitu angka genap dan lebih besar dari 3.
Kejadian genap dan lebih besar dari 3 pada dadu adalah \(\{4, 6\}\).
Jumlah kejadian bersama = 2 (angka 4 dan 6).
Jumlah total sisi dadu = 6.

\[ P(A \cap B) = \frac{2}{6} = 0.3333 \]

Langkah 2: Tentukan probabilitas kejadian \(B\), yaitu mendapatkan angka lebih besar dari 3.
Kejadian lebih besar dari 3 pada dadu adalah \(\{4, 5, 6\}\).
Jumlah kejadian lebih besar dari 3 = 3.
Jumlah total sisi dadu = 6.

\[ P(B) = \frac{3}{6} = 0.5 \]

Langkah 3: Hitung probabilitas bersyarat \(P(A|B)\):
\[ P(A|B) = \frac{P(A \cap B)}{P(B)} = \frac{0.3333}{0.5} = 0.6667 \]

Jadi, probabilitas mendapatkan angka genap dengan syarat angka yang keluar lebih besar dari 3 adalah sekitar 66.67%.


5. Contoh Kasus Probabilitas

5.1. Lemparan Dadu

Misalkan kita melempar sebuah dadu dengan 6 sisi, yang bernomor 1 hingga 6. Probabilitas mendapatkan angka genap pada lemparan dadu dapat dihitung sebagai berikut:

Kejadian \(A\): Mendapatkan angka genap (\(\{2, 4, 6\}\))
Jumlah kejadian yang mendukung = 3
Jumlah total sisi dadu = 6

Probabilitas mendapatkan angka genap adalah:
\[ P(A) = \frac{3}{6} = 0.5 \]

5.2. Undian

Misalkan sebuah undian dilakukan dengan menarik 1 tiket dari 10 tiket yang berurutan, di mana 3 tiket bertanda emas dan 7 tiket bertanda biasa. Probabilitas terambilnya tiket bertanda emas adalah:

Jumlah tiket bertanda emas = 3
Jumlah total tiket = 10

Probabilitas terambilnya tiket bertanda emas:
\[ P(A) = \frac{3}{10} = 0.3 \]

5.3. Lemparan Koin

Saat melempar sebuah koin, ada dua hasil yang mungkin: sisi kepala (H) atau sisi ekor (T). Probabilitas terjadinya masing-masing kejadian adalah sebagai berikut:

Kejadian \(A\): Mendapatkan sisi kepala (\(H\))
Jumlah kejadian yang mendukung = 1
Jumlah total hasil lemparan = 2

Probabilitas mendapatkan sisi kepala adalah:
\[ P(A) = \frac{1}{2} = 0.5 \]

Kejadian \(B\): Mendapatkan sisi ekor (\(T\))
Jumlah kejadian yang mendukung = 1
Jumlah total hasil lemparan = 2

Probabilitas mendapatkan sisi ekor adalah:
\[ P(B) = \frac{1}{2} = 0.5 \]


Studi kasus 1

Bayes Defect Prediction

Pada analisis ini, kita ingin menghitung probabilitas bersyarat bahwa suatu produk cacat (\(D = \text{Yes}\)) jika diketahui menggunakan komponen berkualitas rendah (\(C = \text{Low}\)) dan proses produksi di bawah standar (\(P = \text{Below}\)).

Langkah-Langkah: 1. Dekomposisi Probabilitas Gabungan

Probabilitas gabungan \(P(C = \text{Low}, P = \text{Below})\) dihitung menggunakan aturan total probabilitas: \[ P(C = \text{Low}, P = \text{Below}) = P(C = \text{Low}, P = \text{Below} \mid D = \text{Yes}) \cdot P(D = \text{Yes}) + P(C = \text{Low}, P = \text{Below} \mid D = \text{No}) \cdot P(D = \text{No}) \]

2. Data yang Diketahui

Berikut adalah probabilitas yang diketahui:

  • \(P(D = \text{Yes}) = 0.05\)

  • \(P(D = \text{No}) = 0.95\)

  • \(P(C = \text{Low}) = 0.30\)

  • \(P(C = \text{High}) = 0.70\)

  • \(P(P = \text{Below}) = 0.40\)

  • \(P(P = \text{Standard}) = 0.60\)

3. Probabilitas Kondisional

Kasus \(D = \text{Yes}\):

Misalkan: - \(P(C = \text{Low} \mid D = \text{Yes}) = 0.7\) - \(P(P = \text{Below} \mid D = \text{Yes}) = 0.8\)

Probabilitas gabungan: \[ P(C = \text{Low}, P = \text{Below} \mid D = \text{Yes}) = P(C = \text{Low} \mid D = \text{Yes}) \cdot P(P = \text{Below} \mid D = \text{Yes}) = 0.7 \cdot 0.8 = 0.56 \]

Kasus \(D = \text{No}\):

Misalkan: - \(P(C = \text{Low} \mid D = \text{No}) = 0.25\) - \(P(P = \text{Below} \mid D = \text{No}) = 0.3\)

Probabilitas gabungan: \[ P(C = \text{Low}, P = \text{Below} \mid D = \text{No}) = P(C = \text{Low} \mid D = \text{No}) \cdot P(P = \text{Below} \mid D = \text{No}) = 0.25 \cdot 0.3 = 0.075 \]

4. Hitung \(P(C = \text{Low}, P = \text{Below})\)

Substitusikan nilai: \[ P(C = \text{Low}, P = \text{Below}) = (0.56 \cdot 0.05) + (0.075 \cdot 0.95) = 0.028 + 0.07125 = 0.09925 \]

5. Hitung \(P(D = \text{Yes} \mid C = \text{Low}, P = \text{Below})\)

Dengan menggunakan Teorema Bayes: \[ P(D = \text{Yes} \mid C = \text{Low}, P = \text{Below}) = \frac{P(C = \text{Low}, P = \text{Below} \mid D = \text{Yes}) \cdot P(D = \text{Yes})}{P(C = \text{Low}, P = \text{Below})} \] Substitusikan nilai: \[ P(D = \text{Yes} \mid C = \text{Low}, P = \text{Below}) = \frac{0.56 \cdot 0.05}{0.09925} = \frac{0.028}{0.09925} \approx 0.282 \]

Hasil Akhir:

Probabilitas bahwa suatu produk akan cacat (\(D = \text{Yes}\)) jika diketahui menggunakan komponen berkualitas rendah (\(C = \text{Low}\)) dan proses produksi di bawah standar (\(P = \text{Below}\)) adalah sekitar 28,2%.


Studi Kasus 2

Menghitung Probabilitas Penipuan Menggunakan Teorema Bayes

1. Teorema Bayes

Teorema Bayes menyatakan bahwa:

\[ P(F = \text{Fraud} | L = \text{Foreign}, A = \text{High}, M = \text{Credit Card}) = \frac{P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card} | F = \text{Fraud}) \cdot P(F = \text{Fraud})}{P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card})} \]

2. Komponen dari Rumus Bayes

Kita perlu menghitung beberapa komponen dalam rumus tersebut:

  • P(F = Fraud): Probabilitas dasar bahwa suatu transaksi adalah penipuan, yang diberikan sebesar 1% atau \[ P(F = \text{Fraud}) = 0.01 \].
  • P(F = Not Fraud): Probabilitas dasar bahwa suatu transaksi bukan penipuan, yang diberikan sebesar 99% atau \[ P(F = \text{Not Fraud}) = 0.99 \].

Untuk menghitung \[ P(F = \text{Fraud} | L = \text{Foreign}, A = \text{High}, M = \text{Credit Card}) \], kita juga membutuhkan:

  • \[ P(L = \text{Foreign} | F = \text{Fraud}) = 0.20 \]
  • \[ P(A = \text{High} | F = \text{Fraud}) = 0.10 \]
  • \[ P(M = \text{Credit Card} | F = \text{Fraud}) = 0.50 \]

Asumsikan bahwa probabilitas ini berlaku serupa untuk transaksi non-penipuan.

3. Menghitung Probabilitas Total

Probabilitas total mengamati kombinasi fitur ini, yaitu:

\[ P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card}) = P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card} | F = \text{Fraud}) \cdot P(F = \text{Fraud}) + P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card} | F = \text{Not Fraud}) \cdot P(F = \text{Not Fraud}) \]

Kita dapat menghitung komponen-komponen tersebut:

  • \[ P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card} | F = \text{Fraud}) = 0.20 \cdot 0.10 \cdot 0.50 = 0.01 \]
  • \[ P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card} | F = \text{Not Fraud}) = 0.20 \cdot 0.10 \cdot 0.50 = 0.01 \]

Sehingga,

\[ P(L = \text{Foreign}, A = \text{High}, M = \text{Credit Card}) = 0.01 \cdot 0.01 + 0.01 \cdot 0.99 = 0.01 \]

4. Menghitung Probabilitas Penipuan

Sekarang kita dapat menghitung probabilitas penipuan:

\[ P(F = \text{Fraud} | L = \text{Foreign}, A = \text{High}, M = \text{Credit Card}) = \frac{0.01 \cdot 0.01}{0.01} = 0.01 \]

5. Interpretasi Hasil

Probabilitas bahwa transaksi adalah penipuan, mengingat transaksi dilakukan dari lokasi luar negeri, jumlah pembelian lebih dari $500, dan metode pembayaran menggunakan kartu kredit, adalah 1%.

Perhitungam dalam Sistem Studi Kasus 1 dam 2

# Studi Kasus 1
P_D_yes <- 0.05
P_D_no <- 0.95
P_C_low_given_D_yes <- 0.7
P_P_below_given_D_yes <- 0.8
P_C_low_given_D_no <- 0.25
P_P_below_given_D_no <- 0.3

# Perhitungan probabilitas gabungan
P_C_low_and_P_below_given_D_yes <- P_C_low_given_D_yes * P_P_below_given_D_yes
P_C_low_and_P_below_given_D_no <- P_C_low_given_D_no * P_P_below_given_D_no

# Total probability
P_C_low_and_P_below <- (P_C_low_and_P_below_given_D_yes * P_D_yes) +
                       (P_C_low_and_P_below_given_D_no * P_D_no)

# Bayes theorem
P_D_yes_given_C_low_and_P_below <- (P_C_low_and_P_below_given_D_yes * P_D_yes) /
                                   P_C_low_and_P_below

cat("Studi Kasus 1:\n")
## Studi Kasus 1:
cat(sprintf("Probabilitas produk cacat (D = yes): %.4f%%\n",
            P_D_yes_given_C_low_and_P_below * 100))
## Probabilitas produk cacat (D = yes): 28.2116%
# Studi Kasus 2
P_F_true <- 0.01
P_F_false <- 0.99
P_L_foreign_given_F_true <- 0.2
P_A_high_given_F_true <- 0.1
P_M_credit_given_F_true <- 0.5

P_L_foreign_given_F_false <- 0.2
P_A_high_given_F_false <- 0.1
P_M_credit_given_F_false <- 0.5

# Perhitungan probabilitas gabungan
P_L_foreign_and_A_high_and_M_credit_given_F_true <- P_L_foreign_given_F_true *
                                                    P_A_high_given_F_true *
                                                    P_M_credit_given_F_true
P_L_foreign_and_A_high_and_M_credit_given_F_false <- P_L_foreign_given_F_false *
                                                     P_A_high_given_F_false *
                                                     P_M_credit_given_F_false

# Total probability
P_L_foreign_and_A_high_and_M_credit <- (P_L_foreign_and_A_high_and_M_credit_given_F_true * P_F_true) +
                                       (P_L_foreign_and_A_high_and_M_credit_given_F_false * P_F_false)

# Bayes theorem
P_F_true_given_L_foreign_and_A_high_and_M_credit <- (P_L_foreign_and_A_high_and_M_credit_given_F_true * P_F_true) /
                                                    P_L_foreign_and_A_high_and_M_credit

cat("\nStudi Kasus 2:\n")
## 
## Studi Kasus 2:
cat(sprintf("Probabilitas transaksi penipuan (F = true): %.4f%%\n",
            P_F_true_given_L_foreign_and_A_high_and_M_credit * 100))
## Probabilitas transaksi penipuan (F = true): 1.0000%
LS0tDQp0aXRsZTogIlR1Z2FzIHBlcnRlbXVhbiAxMiINCnN1YnRpdGxlOiAiTWF0ZXJpIERhc2FyIHByb2JhYmlsaXRhcyINCmF1dGhvcjogIkx1dGhpIEFraHlhciBIYXNpYnVhbiAoNTIyNDAwMTQpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KIA0KDQotLS0NCg0KPHN0eWxlPg0KICAubG9nbyB7DQogICAgd2lkdGg6IDIwMHB4Ow0KICAgIGhlaWdodDogMzIwcHg7DQogICAgYm9yZGVyLXJhZGl1czogNTAlOw0KICAgIG9iamVjdC1maXQ6IGNvdmVyOw0KICAgIGJveC1zaGFkb3c6IDAgNnB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpOw0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICBtYXJnaW46IDEwcHg7IC8qIEphcmFrIGFudGFyYSBnYW1iYXIgKi8NCiAgfQ0KPC9zdHlsZT4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQogIDxpbWcgY2xhc3M9ImxvZ28iIHNyYz0iTWUgNC5qcGciIGFsdD0iRm90byI+DQo8L2Rpdj4NCg0KLS0tDQoNCiMgKipNYXRlcmkgRGFzYXIgUHJvYmFiaWxpdGFzKioNCg0KIyMgKipQZW5nZXJ0aWFuIFByb2JhYmlsaXRhcyoqDQoNClByb2JhYmlsaXRhcyBhZGFsYWggdWt1cmFuIHBlbHVhbmcgc3VhdHUga2VqYWRpYW4gdGVyamFkaSwgZGlueWF0YWthbiBzZWJhZ2FpIGFuZ2thIGFudGFyYSAwIGhpbmdnYSAxLiAgDQpSdW11cyBkYXNhciBwcm9iYWJpbGl0YXM6ICANCiQkDQpQKEEpID0gXGZyYWN7XHRleHR7SnVtbGFoIGhhc2lsIHlhbmcgbWVuZHVrdW5nIGtlamFkaWFuIEF9fXtcdGV4dHtKdW1sYWggdG90YWwgaGFzaWwgeWFuZyBtdW5na2lufX0NCiQkDQoNCi0gJFAoQSkgPSAwJDogS2VqYWRpYW4gKip0aWRhayBtdW5na2luKiogdGVyamFkaS4gIA0KLSAkUChBKSA9IDEkOiBLZWphZGlhbiAqKnBhc3RpKiogdGVyamFkaS4gIA0KDQojIyAqKjEuUHJvYmFiaWxpdGFzIEtlamFkaWFuIFR1bmdnYWwqKg0KDQpQcm9iYWJpbGl0YXMga2VqYWRpYW4gdHVuZ2dhbCBhZGFsYWggcGVsdWFuZyB0ZXJqYWRpbnlhIHNhdHUga2VqYWRpYW4geWFuZyB0aWRhayBiZXJnYW50dW5nIHBhZGEga2VqYWRpYW4gbGFpbi4gU2ViYWdhaSBjb250b2gsIHByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiBhbmdrYSBnZW5hcCBwYWRhIGxlbXBhcmFuIGRhZHUsIGF0YXUgcHJvYmFiaWxpdGFzIHNlc2VvcmFuZyBtZW1pbGlraSB0aW5nZ2kgYmFkYW4gZGkgYXRhcyAxNzAgY20uDQoNCi0tLQ0KDQojIyAqKjIuIFByb2JhYmlsaXRhcyBHYWJ1bmdhbiAoQU5EIGRhbiBPUikqKiANCg0KIyMjICoqMi4xLiBQcm9iYWJpbGl0YXMgQU5EIChQZXJrYWxpYW4pKioNCg0KSmlrYSBkdWEga2VqYWRpYW4gJEEkIGRhbiAkQiQgKippbmRlcGVuZGVuKiosIG1ha2EgcHJvYmFiaWxpdGFzIHRlcmphZGlueWEga2VkdWFueWEgYWRhbGFoOiAgDQokJA0KUChBIFxjYXAgQikgPSBQKEEpIFxjZG90IFAoQikNCiQkDQoNCiMjIyAqKjIuMi4gUHJvYmFiaWxpdGFzIE9SIChQZW5qdW1sYWhhbikqKg0KSmlrYSBkdWEga2VqYWRpYW4gJEEkIGRhbiAkQiQgKip0aWRhayBzYWxpbmcgZWtza2x1c2lmKiosIG1ha2EgcHJvYmFiaWxpdGFzIHNhbGFoIHNhdHUgdGVyamFkaSBhZGFsYWg6ICANCiQkDQpQKEEgXGN1cCBCKSA9IFAoQSkgKyBQKEIpIC0gUChBIFxjYXAgQikNCiQkDQoNCkppa2Ega2VqYWRpYW4gJEEkIGRhbiAkQiQgKipzYWxpbmcgZWtza2x1c2lmKiosIG1ha2E6ICANCiQkDQpQKEEgXGN1cCBCKSA9IFAoQSkgKyBQKEIpDQokJA0KDQotLS0NCg0KIyMgKiozLiBQcm9iYWJpbGl0YXMgU2FsaW5nIEVrc2tsdXNpZiBkYW4gVGlkYWsgU2FsaW5nIEVrc2tsdXNpZioqDQoNCiMjIyAqKjMuMS4gS2VqYWRpYW4gU2FsaW5nIEVrc2tsdXNpZioqDQoNCktlamFkaWFuIHlhbmcgc2FsaW5nIGVrc2tsdXNpZiBhZGFsYWgga2VqYWRpYW4geWFuZyB0aWRhayBkYXBhdCB0ZXJqYWRpIGJlcnNhbWFhbi4gQXJ0aW55YSwgamlrYSBzYXR1IGtlamFkaWFuIHRlcmphZGksIG1ha2Ega2VqYWRpYW4gbGFpbm55YSBwYXN0aSB0aWRhayB0ZXJqYWRpLiBNaXNhbG55YSwga2V0aWthIGtpdGEgbWVsZW1wYXIgZGFkdSwgbWVuZGFwYXRrYW4gYW5na2EgMiBkYW4gYW5na2EgNCBhZGFsYWgga2VqYWRpYW4gc2FsaW5nIGVrc2tsdXNpZiwga2FyZW5hIGtpdGEgaGFueWEgYmlzYSBtZW5kYXBhdGthbiBzYWxhaCBzYXR1IGFuZ2thIHRlcnNlYnV0IGRhbGFtIHNhdHUgbGVtcGFyYW4uDQoNClJ1bXVzIHByb2JhYmlsaXRhcyB1bnR1ayBrZWphZGlhbiBzYWxpbmcgZWtza2x1c2lmOiAgDQokJA0KUChBIFxjdXAgQikgPSBQKEEpICsgUChCKQ0KJCQNCg0KIyMjICoqMy4yLiBLZWphZGlhbiBUaWRhayBTYWxpbmcgRWtza2x1c2lmKioNCg0KS2VqYWRpYW4geWFuZyB0aWRhayBzYWxpbmcgZWtza2x1c2lmIGFkYWxhaCBrZWphZGlhbiB5YW5nIGRhcGF0IHRlcmphZGkgYmVyc2FtYWFuLiBNaXNhbG55YSwgamlrYSBraXRhIG1lbWlsaWggc2VidWFoIGthcnR1IGRhcmkgZGVrIGthcnR1LCBrZWphZGlhbiBtZW5kYXBhdGthbiBrYXJ0dSBtZXJhaCBkYW4ga2VqYWRpYW4gbWVuZGFwYXRrYW4ga2FydHUgYmVybm9tb3IgZ2VuYXAgYWRhbGFoIGtlamFkaWFuIHlhbmcgdGlkYWsgc2FsaW5nIGVrc2tsdXNpZiwga2FyZW5hIGtpdGEgYmlzYSBtZW5kYXBhdGthbiBrYXJ0dSBtZXJhaCB5YW5nIGJlcm5vbW9yIGdlbmFwLg0KDQpSdW11cyBwcm9iYWJpbGl0YXMgdW50dWsga2VqYWRpYW4gdGlkYWsgc2FsaW5nIGVrc2tsdXNpZjogIA0KJCQNClAoQSBcY3VwIEIpID0gUChBKSArIFAoQikgLSBQKEEgXGNhcCBCKQ0KJCQNCg0KLS0tDQoNCiMjICoqNC4gUHJvYmFiaWxpdGFzIEJlcnN5YXJhdCAoQ29uZGl0aW9uYWwgUHJvYmFiaWxpdHkpKioNCg0KUHJvYmFiaWxpdGFzIGJlcnN5YXJhdCBhZGFsYWggcHJvYmFiaWxpdGFzIGRhcmkgc3VhdHUga2VqYWRpYW4geWFuZyB0ZXJqYWRpIGRlbmdhbiBtZW1wZXJ0aW1iYW5na2FuIGJhaHdhIGtlamFkaWFuIGxhaW4gdGVsYWggdGVyamFkaS4gUHJvYmFiaWxpdGFzIGJlcnN5YXJhdCB1bnR1ayBrZWphZGlhbiAkQSQgZGliZXJpa2FuIGJhaHdhIGtlamFkaWFuICRCJCB0ZWxhaCB0ZXJqYWRpIGRpdHVsaXNrYW4gc2ViYWdhaSAkUChBfEIpJC4gUnVtdXMgcHJvYmFiaWxpdGFzIGJlcnN5YXJhdCBhZGFsYWg6DQoNCiQkDQpQKEF8QikgPSBcZnJhY3tQKEEgXGNhcCBCKX17UChCKX0NCiQkDQoNCkFydGlueWEsIHByb2JhYmlsaXRhcyAkQSQgdGVyamFkaSwgZGVuZ2FuIHN5YXJhdCBiYWh3YSAkQiQgdGVsYWggdGVyamFkaSwgZGFwYXQgZGloaXR1bmcgZGVuZ2FuIG1lbWJhZ2kgcHJvYmFiaWxpdGFzIGtlamFkaWFuIGJlcnNhbWEgJEEkIGRhbiAkQiQgZGVuZ2FuIHByb2JhYmlsaXRhcyBrZWphZGlhbiAkQiQuDQoNCiMjIyAqKkNvbnRvaDoqKg0KTWlzYWxrYW4ga2l0YSBpbmdpbiBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiBhbmdrYSAqKmdlbmFwKiogcGFkYSBsZW1wYXJhbiBkYWR1ICoqZGVuZ2FuIHN5YXJhdCoqIGJhaHdhIGFuZ2thIHlhbmcga2VsdWFyIGxlYmloIGJlc2FyIGRhcmkgMy4gS2l0YSBkYXBhdCBtZW5nZ3VuYWthbiBydW11cyBwcm9iYWJpbGl0YXMgYmVyc3lhcmF0Lg0KDQotIEtlamFkaWFuICRBJDogbWVuZGFwYXRrYW4gYW5na2EgZ2VuYXAuDQotIEtlamFkaWFuICRCJDogbWVuZGFwYXRrYW4gYW5na2EgbGViaWggYmVzYXIgZGFyaSAzLg0KDQoqKkxhbmdrYWggMToqKiBUZW50dWthbiBwcm9iYWJpbGl0YXMga2VqYWRpYW4gYmVyc2FtYSwgeWFpdHUgYW5na2EgZ2VuYXAgZGFuIGxlYmloIGJlc2FyIGRhcmkgMy4gIA0KS2VqYWRpYW4gZ2VuYXAgZGFuIGxlYmloIGJlc2FyIGRhcmkgMyBwYWRhIGRhZHUgYWRhbGFoICRcezQsIDZcfSQuICANCkp1bWxhaCBrZWphZGlhbiBiZXJzYW1hID0gMiAoYW5na2EgNCBkYW4gNikuICANCkp1bWxhaCB0b3RhbCBzaXNpIGRhZHUgPSA2LiAgDQoNCiQkDQpQKEEgXGNhcCBCKSA9IFxmcmFjezJ9ezZ9ID0gMC4zMzMzDQokJA0KDQoqKkxhbmdrYWggMjoqKiBUZW50dWthbiBwcm9iYWJpbGl0YXMga2VqYWRpYW4gJEIkLCB5YWl0dSBtZW5kYXBhdGthbiBhbmdrYSBsZWJpaCBiZXNhciBkYXJpIDMuICANCktlamFkaWFuIGxlYmloIGJlc2FyIGRhcmkgMyBwYWRhIGRhZHUgYWRhbGFoICRcezQsIDUsIDZcfSQuICANCkp1bWxhaCBrZWphZGlhbiBsZWJpaCBiZXNhciBkYXJpIDMgPSAzLiAgDQpKdW1sYWggdG90YWwgc2lzaSBkYWR1ID0gNi4gIA0KDQokJA0KUChCKSA9IFxmcmFjezN9ezZ9ID0gMC41DQokJA0KDQoqKkxhbmdrYWggMzoqKiBIaXR1bmcgcHJvYmFiaWxpdGFzIGJlcnN5YXJhdCAkUChBfEIpJDogIA0KJCQNClAoQXxCKSA9IFxmcmFje1AoQSBcY2FwIEIpfXtQKEIpfSA9IFxmcmFjezAuMzMzM317MC41fSA9IDAuNjY2Nw0KJCQNCg0KSmFkaSwgcHJvYmFiaWxpdGFzIG1lbmRhcGF0a2FuIGFuZ2thIGdlbmFwICoqZGVuZ2FuIHN5YXJhdCoqIGFuZ2thIHlhbmcga2VsdWFyIGxlYmloIGJlc2FyIGRhcmkgMyBhZGFsYWggc2VraXRhciA2Ni42NyUuDQoNCi0tLQ0KDQojIyAqKjUuIENvbnRvaCBLYXN1cyBQcm9iYWJpbGl0YXMqKg0KDQojIyMgKio1LjEuIExlbXBhcmFuIERhZHUqKg0KDQpNaXNhbGthbiBraXRhIG1lbGVtcGFyIHNlYnVhaCBkYWR1IGRlbmdhbiA2IHNpc2ksIHlhbmcgYmVybm9tb3IgMSBoaW5nZ2EgNi4gUHJvYmFiaWxpdGFzIG1lbmRhcGF0a2FuIGFuZ2thIGdlbmFwIHBhZGEgbGVtcGFyYW4gZGFkdSBkYXBhdCBkaWhpdHVuZyBzZWJhZ2FpIGJlcmlrdXQ6DQoNCktlamFkaWFuICRBJDogTWVuZGFwYXRrYW4gYW5na2EgZ2VuYXAgKCRcezIsIDQsIDZcfSQpICANCkp1bWxhaCBrZWphZGlhbiB5YW5nIG1lbmR1a3VuZyA9IDMgIA0KSnVtbGFoIHRvdGFsIHNpc2kgZGFkdSA9IDYNCg0KUHJvYmFiaWxpdGFzIG1lbmRhcGF0a2FuIGFuZ2thIGdlbmFwIGFkYWxhaDogIA0KJCQNClAoQSkgPSBcZnJhY3szfXs2fSA9IDAuNQ0KJCQNCg0KIyMjICoqNS4yLiBVbmRpYW4qKg0KDQpNaXNhbGthbiBzZWJ1YWggdW5kaWFuIGRpbGFrdWthbiBkZW5nYW4gbWVuYXJpayAxIHRpa2V0IGRhcmkgMTAgdGlrZXQgeWFuZyBiZXJ1cnV0YW4sIGRpIG1hbmEgMyB0aWtldCBiZXJ0YW5kYSBlbWFzIGRhbiA3IHRpa2V0IGJlcnRhbmRhIGJpYXNhLiBQcm9iYWJpbGl0YXMgdGVyYW1iaWxueWEgdGlrZXQgYmVydGFuZGEgZW1hcyBhZGFsYWg6DQoNCkp1bWxhaCB0aWtldCBiZXJ0YW5kYSBlbWFzID0gMyAgDQpKdW1sYWggdG90YWwgdGlrZXQgPSAxMA0KDQpQcm9iYWJpbGl0YXMgdGVyYW1iaWxueWEgdGlrZXQgYmVydGFuZGEgZW1hczogIA0KJCQNClAoQSkgPSBcZnJhY3szfXsxMH0gPSAwLjMNCiQkDQoNCiMjIyAqKjUuMy4gTGVtcGFyYW4gS29pbioqDQoNClNhYXQgbWVsZW1wYXIgc2VidWFoIGtvaW4sIGFkYSBkdWEgaGFzaWwgeWFuZyBtdW5na2luOiBzaXNpIGtlcGFsYSAoSCkgYXRhdSBzaXNpIGVrb3IgKFQpLiBQcm9iYWJpbGl0YXMgdGVyamFkaW55YSBtYXNpbmctbWFzaW5nIGtlamFkaWFuIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCktlamFkaWFuICRBJDogTWVuZGFwYXRrYW4gc2lzaSBrZXBhbGEgKCRIJCkgIA0KSnVtbGFoIGtlamFkaWFuIHlhbmcgbWVuZHVrdW5nID0gMSAgDQpKdW1sYWggdG90YWwgaGFzaWwgbGVtcGFyYW4gPSAyDQoNClByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiBzaXNpIGtlcGFsYSBhZGFsYWg6ICANCiQkDQpQKEEpID0gXGZyYWN7MX17Mn0gPSAwLjUNCiQkDQoNCktlamFkaWFuICRCJDogTWVuZGFwYXRrYW4gc2lzaSBla29yICgkVCQpICANCkp1bWxhaCBrZWphZGlhbiB5YW5nIG1lbmR1a3VuZyA9IDEgIA0KSnVtbGFoIHRvdGFsIGhhc2lsIGxlbXBhcmFuID0gMg0KDQpQcm9iYWJpbGl0YXMgbWVuZGFwYXRrYW4gc2lzaSBla29yIGFkYWxhaDogIA0KJCQNClAoQikgPSBcZnJhY3sxfXsyfSA9IDAuNQ0KJCQNCg0KLS0tDQoNCg0KIyBTdHVkaSBrYXN1cyAxDQoqKkJheWVzIERlZmVjdCBQcmVkaWN0aW9uKioNCg0KUGFkYSBhbmFsaXNpcyBpbmksIGtpdGEgaW5naW4gbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgYmVyc3lhcmF0IGJhaHdhIHN1YXR1IHByb2R1ayBjYWNhdCAoXChEID0gXHRleHR7WWVzfVwpKSBqaWthIGRpa2V0YWh1aSBtZW5nZ3VuYWthbiBrb21wb25lbiBiZXJrdWFsaXRhcyByZW5kYWggKFwoQyA9IFx0ZXh0e0xvd31cKSkgZGFuIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyIChcKFAgPSBcdGV4dHtCZWxvd31cKSkuDQoNCiMjIExhbmdrYWgtTGFuZ2thaDogMS4gRGVrb21wb3Npc2kgUHJvYmFiaWxpdGFzIEdhYnVuZ2FuDQoNClByb2JhYmlsaXRhcyBnYWJ1bmdhbiBcKFAoQyA9IFx0ZXh0e0xvd30sIFAgPSBcdGV4dHtCZWxvd30pXCkgZGloaXR1bmcgbWVuZ2d1bmFrYW4gYXR1cmFuIHRvdGFsIHByb2JhYmlsaXRhczoNCiQkDQpQKEMgPSBcdGV4dHtMb3d9LCBQID0gXHRleHR7QmVsb3d9KSA9IFAoQyA9IFx0ZXh0e0xvd30sIFAgPSBcdGV4dHtCZWxvd30gXG1pZCBEID0gXHRleHR7WWVzfSkgXGNkb3QgUChEID0gXHRleHR7WWVzfSkgKyBQKEMgPSBcdGV4dHtMb3d9LCBQID0gXHRleHR7QmVsb3d9IFxtaWQgRCA9IFx0ZXh0e05vfSkgXGNkb3QgUChEID0gXHRleHR7Tm99KQ0KJCQNCg0KIyMgMi4gRGF0YSB5YW5nIERpa2V0YWh1aQ0KQmVyaWt1dCBhZGFsYWggcHJvYmFiaWxpdGFzIHlhbmcgZGlrZXRhaHVpOg0KDQotIFwoUChEID0gXHRleHR7WWVzfSkgPSAwLjA1XCkNCg0KLSBcKFAoRCA9IFx0ZXh0e05vfSkgPSAwLjk1XCkNCg0KLSBcKFAoQyA9IFx0ZXh0e0xvd30pID0gMC4zMFwpDQoNCi0gXChQKEMgPSBcdGV4dHtIaWdofSkgPSAwLjcwXCkNCg0KLSBcKFAoUCA9IFx0ZXh0e0JlbG93fSkgPSAwLjQwXCkNCg0KLSBcKFAoUCA9IFx0ZXh0e1N0YW5kYXJkfSkgPSAwLjYwXCkNCg0KIyMgMy4gUHJvYmFiaWxpdGFzIEtvbmRpc2lvbmFsDQojIyMjIEthc3VzIFwoRCA9IFx0ZXh0e1llc31cKToNCk1pc2Fsa2FuOg0KLSBcKFAoQyA9IFx0ZXh0e0xvd30gXG1pZCBEID0gXHRleHR7WWVzfSkgPSAwLjdcKQ0KLSBcKFAoUCA9IFx0ZXh0e0JlbG93fSBcbWlkIEQgPSBcdGV4dHtZZXN9KSA9IDAuOFwpDQoNClByb2JhYmlsaXRhcyBnYWJ1bmdhbjoNCiQkDQpQKEMgPSBcdGV4dHtMb3d9LCBQID0gXHRleHR7QmVsb3d9IFxtaWQgRCA9IFx0ZXh0e1llc30pID0gUChDID0gXHRleHR7TG93fSBcbWlkIEQgPSBcdGV4dHtZZXN9KSBcY2RvdCBQKFAgPSBcdGV4dHtCZWxvd30gXG1pZCBEID0gXHRleHR7WWVzfSkgPSAwLjcgXGNkb3QgMC44ID0gMC41Ng0KJCQNCg0KIyMjIEthc3VzIFwoRCA9IFx0ZXh0e05vfVwpOg0KTWlzYWxrYW46DQotIFwoUChDID0gXHRleHR7TG93fSBcbWlkIEQgPSBcdGV4dHtOb30pID0gMC4yNVwpDQotIFwoUChQID0gXHRleHR7QmVsb3d9IFxtaWQgRCA9IFx0ZXh0e05vfSkgPSAwLjNcKQ0KDQpQcm9iYWJpbGl0YXMgZ2FidW5nYW46DQokJA0KUChDID0gXHRleHR7TG93fSwgUCA9IFx0ZXh0e0JlbG93fSBcbWlkIEQgPSBcdGV4dHtOb30pID0gUChDID0gXHRleHR7TG93fSBcbWlkIEQgPSBcdGV4dHtOb30pIFxjZG90IFAoUCA9IFx0ZXh0e0JlbG93fSBcbWlkIEQgPSBcdGV4dHtOb30pID0gMC4yNSBcY2RvdCAwLjMgPSAwLjA3NQ0KJCQNCg0KIyMgNC4gSGl0dW5nIFwoUChDID0gXHRleHR7TG93fSwgUCA9IFx0ZXh0e0JlbG93fSlcKQ0KU3Vic3RpdHVzaWthbiBuaWxhaToNCiQkDQpQKEMgPSBcdGV4dHtMb3d9LCBQID0gXHRleHR7QmVsb3d9KSA9ICgwLjU2IFxjZG90IDAuMDUpICsgKDAuMDc1IFxjZG90IDAuOTUpID0gMC4wMjggKyAwLjA3MTI1ID0gMC4wOTkyNQ0KJCQNCg0KIyMgNS4gSGl0dW5nIFwoUChEID0gXHRleHR7WWVzfSBcbWlkIEMgPSBcdGV4dHtMb3d9LCBQID0gXHRleHR7QmVsb3d9KVwpDQpEZW5nYW4gbWVuZ2d1bmFrYW4gVGVvcmVtYSBCYXllczoNCiQkDQpQKEQgPSBcdGV4dHtZZXN9IFxtaWQgQyA9IFx0ZXh0e0xvd30sIFAgPSBcdGV4dHtCZWxvd30pID0gXGZyYWN7UChDID0gXHRleHR7TG93fSwgUCA9IFx0ZXh0e0JlbG93fSBcbWlkIEQgPSBcdGV4dHtZZXN9KSBcY2RvdCBQKEQgPSBcdGV4dHtZZXN9KX17UChDID0gXHRleHR7TG93fSwgUCA9IFx0ZXh0e0JlbG93fSl9DQokJA0KU3Vic3RpdHVzaWthbiBuaWxhaToNCiQkDQpQKEQgPSBcdGV4dHtZZXN9IFxtaWQgQyA9IFx0ZXh0e0xvd30sIFAgPSBcdGV4dHtCZWxvd30pID0gXGZyYWN7MC41NiBcY2RvdCAwLjA1fXswLjA5OTI1fSA9IFxmcmFjezAuMDI4fXswLjA5OTI1fSBcYXBwcm94IDAuMjgyDQokJA0KDQojIyBIYXNpbCBBa2hpcjoNClByb2JhYmlsaXRhcyBiYWh3YSBzdWF0dSBwcm9kdWsgYWthbiBjYWNhdCAoXChEID0gXHRleHR7WWVzfVwpKSBqaWthIGRpa2V0YWh1aSBtZW5nZ3VuYWthbiBrb21wb25lbiBiZXJrdWFsaXRhcyByZW5kYWggKFwoQyA9IFx0ZXh0e0xvd31cKSkgZGFuIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyIChcKFAgPSBcdGV4dHtCZWxvd31cKSkgYWRhbGFoIHNla2l0YXIgKioyOCwyJSoqLg0KDQotLS0tLQ0KDQoNCg0KIyBTdHVkaSBLYXN1cyAyDQoqKk1lbmdoaXR1bmcgUHJvYmFiaWxpdGFzIFBlbmlwdWFuIE1lbmdndW5ha2FuIFRlb3JlbWEgQmF5ZXMqKg0KDQojIyAxLiBUZW9yZW1hIEJheWVzDQoNClRlb3JlbWEgQmF5ZXMgbWVueWF0YWthbiBiYWh3YToNCg0KJCQgUChGID0gXHRleHR7RnJhdWR9IHwgTCA9IFx0ZXh0e0ZvcmVpZ259LCBBID0gXHRleHR7SGlnaH0sIE0gPSBcdGV4dHtDcmVkaXQgQ2FyZH0pID0gXGZyYWN7UChMID0gXHRleHR7Rm9yZWlnbn0sIEEgPSBcdGV4dHtIaWdofSwgTSA9IFx0ZXh0e0NyZWRpdCBDYXJkfSB8IEYgPSBcdGV4dHtGcmF1ZH0pIFxjZG90IFAoRiA9IFx0ZXh0e0ZyYXVkfSl9e1AoTCA9IFx0ZXh0e0ZvcmVpZ259LCBBID0gXHRleHR7SGlnaH0sIE0gPSBcdGV4dHtDcmVkaXQgQ2FyZH0pfSAkJA0KDQojIyAyLiBLb21wb25lbiBkYXJpIFJ1bXVzIEJheWVzDQoNCktpdGEgcGVybHUgbWVuZ2hpdHVuZyBiZWJlcmFwYSBrb21wb25lbiBkYWxhbSBydW11cyB0ZXJzZWJ1dDoNCg0KLSAqKlAoRiA9IEZyYXVkKSoqOiBQcm9iYWJpbGl0YXMgZGFzYXIgYmFod2Egc3VhdHUgdHJhbnNha3NpIGFkYWxhaCBwZW5pcHVhbiwgeWFuZyBkaWJlcmlrYW4gc2ViZXNhciAxJSBhdGF1ICQkIFAoRiA9IFx0ZXh0e0ZyYXVkfSkgPSAwLjAxICQkLg0KLSAqKlAoRiA9IE5vdCBGcmF1ZCkqKjogUHJvYmFiaWxpdGFzIGRhc2FyIGJhaHdhIHN1YXR1IHRyYW5zYWtzaSBidWthbiBwZW5pcHVhbiwgeWFuZyBkaWJlcmlrYW4gc2ViZXNhciA5OSUgYXRhdSAkJCBQKEYgPSBcdGV4dHtOb3QgRnJhdWR9KSA9IDAuOTkgJCQuDQoNClVudHVrIG1lbmdoaXR1bmcgJCQgUChGID0gXHRleHR7RnJhdWR9IHwgTCA9IFx0ZXh0e0ZvcmVpZ259LCBBID0gXHRleHR7SGlnaH0sIE0gPSBcdGV4dHtDcmVkaXQgQ2FyZH0pICQkLCBraXRhIGp1Z2EgbWVtYnV0dWhrYW46DQoNCi0gJCQgUChMID0gXHRleHR7Rm9yZWlnbn0gfCBGID0gXHRleHR7RnJhdWR9KSA9IDAuMjAgJCQNCi0gJCQgUChBID0gXHRleHR7SGlnaH0gfCBGID0gXHRleHR7RnJhdWR9KSA9IDAuMTAgJCQNCi0gJCQgUChNID0gXHRleHR7Q3JlZGl0IENhcmR9IHwgRiA9IFx0ZXh0e0ZyYXVkfSkgPSAwLjUwICQkDQoNCkFzdW1zaWthbiBiYWh3YSBwcm9iYWJpbGl0YXMgaW5pIGJlcmxha3Ugc2VydXBhIHVudHVrIHRyYW5zYWtzaSBub24tcGVuaXB1YW4uDQoNCiMjIDMuIE1lbmdoaXR1bmcgUHJvYmFiaWxpdGFzIFRvdGFsDQoNClByb2JhYmlsaXRhcyB0b3RhbCBtZW5nYW1hdGkga29tYmluYXNpIGZpdHVyIGluaSwgeWFpdHU6DQoNCiQkIFAoTCA9IFx0ZXh0e0ZvcmVpZ259LCBBID0gXHRleHR7SGlnaH0sIE0gPSBcdGV4dHtDcmVkaXQgQ2FyZH0pID0gUChMID0gXHRleHR7Rm9yZWlnbn0sIEEgPSBcdGV4dHtIaWdofSwgTSA9IFx0ZXh0e0NyZWRpdCBDYXJkfSB8IEYgPSBcdGV4dHtGcmF1ZH0pIFxjZG90IFAoRiA9IFx0ZXh0e0ZyYXVkfSkgKyBQKEwgPSBcdGV4dHtGb3JlaWdufSwgQSA9IFx0ZXh0e0hpZ2h9LCBNID0gXHRleHR7Q3JlZGl0IENhcmR9IHwgRiA9IFx0ZXh0e05vdCBGcmF1ZH0pIFxjZG90IFAoRiA9IFx0ZXh0e05vdCBGcmF1ZH0pICQkDQoNCktpdGEgZGFwYXQgbWVuZ2hpdHVuZyBrb21wb25lbi1rb21wb25lbiB0ZXJzZWJ1dDoNCg0KLSAkJCBQKEwgPSBcdGV4dHtGb3JlaWdufSwgQSA9IFx0ZXh0e0hpZ2h9LCBNID0gXHRleHR7Q3JlZGl0IENhcmR9IHwgRiA9IFx0ZXh0e0ZyYXVkfSkgPSAwLjIwIFxjZG90IDAuMTAgXGNkb3QgMC41MCA9IDAuMDEgJCQNCi0gJCQgUChMID0gXHRleHR7Rm9yZWlnbn0sIEEgPSBcdGV4dHtIaWdofSwgTSA9IFx0ZXh0e0NyZWRpdCBDYXJkfSB8IEYgPSBcdGV4dHtOb3QgRnJhdWR9KSA9IDAuMjAgXGNkb3QgMC4xMCBcY2RvdCAwLjUwID0gMC4wMSAkJA0KDQpTZWhpbmdnYSwNCg0KJCQgUChMID0gXHRleHR7Rm9yZWlnbn0sIEEgPSBcdGV4dHtIaWdofSwgTSA9IFx0ZXh0e0NyZWRpdCBDYXJkfSkgPSAwLjAxIFxjZG90IDAuMDEgKyAwLjAxIFxjZG90IDAuOTkgPSAwLjAxICQkDQoNCiMjIDQuIE1lbmdoaXR1bmcgUHJvYmFiaWxpdGFzIFBlbmlwdWFuDQoNClNla2FyYW5nIGtpdGEgZGFwYXQgbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgcGVuaXB1YW46DQoNCiQkIFAoRiA9IFx0ZXh0e0ZyYXVkfSB8IEwgPSBcdGV4dHtGb3JlaWdufSwgQSA9IFx0ZXh0e0hpZ2h9LCBNID0gXHRleHR7Q3JlZGl0IENhcmR9KSA9IFxmcmFjezAuMDEgXGNkb3QgMC4wMX17MC4wMX0gPSAwLjAxICQkDQoNCiMjIDUuIEludGVycHJldGFzaSBIYXNpbA0KDQpQcm9iYWJpbGl0YXMgYmFod2EgdHJhbnNha3NpIGFkYWxhaCBwZW5pcHVhbiwgbWVuZ2luZ2F0IHRyYW5zYWtzaSBkaWxha3VrYW4gZGFyaSBsb2thc2kgbHVhciBuZWdlcmksIGp1bWxhaCBwZW1iZWxpYW4gbGViaWggZGFyaSAkNTAwLCBkYW4gbWV0b2RlIHBlbWJheWFyYW4gbWVuZ2d1bmFrYW4ga2FydHUga3JlZGl0LCBhZGFsYWggMSUuDQoNCiMgUGVyaGl0dW5nYW0gZGFsYW0gU2lzdGVtIFN0dWRpIEthc3VzIDEgZGFtIDINCiANCmBgYHtyLCBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFN0dWRpIEthc3VzIDENClBfRF95ZXMgPC0gMC4wNQ0KUF9EX25vIDwtIDAuOTUNClBfQ19sb3dfZ2l2ZW5fRF95ZXMgPC0gMC43DQpQX1BfYmVsb3dfZ2l2ZW5fRF95ZXMgPC0gMC44DQpQX0NfbG93X2dpdmVuX0Rfbm8gPC0gMC4yNQ0KUF9QX2JlbG93X2dpdmVuX0Rfbm8gPC0gMC4zDQoNCiMgUGVyaGl0dW5nYW4gcHJvYmFiaWxpdGFzIGdhYnVuZ2FuDQpQX0NfbG93X2FuZF9QX2JlbG93X2dpdmVuX0RfeWVzIDwtIFBfQ19sb3dfZ2l2ZW5fRF95ZXMgKiBQX1BfYmVsb3dfZ2l2ZW5fRF95ZXMNClBfQ19sb3dfYW5kX1BfYmVsb3dfZ2l2ZW5fRF9ubyA8LSBQX0NfbG93X2dpdmVuX0Rfbm8gKiBQX1BfYmVsb3dfZ2l2ZW5fRF9ubw0KDQojIFRvdGFsIHByb2JhYmlsaXR5DQpQX0NfbG93X2FuZF9QX2JlbG93IDwtIChQX0NfbG93X2FuZF9QX2JlbG93X2dpdmVuX0RfeWVzICogUF9EX3llcykgKw0KICAgICAgICAgICAgICAgICAgICAgICAoUF9DX2xvd19hbmRfUF9iZWxvd19naXZlbl9EX25vICogUF9EX25vKQ0KDQojIEJheWVzIHRoZW9yZW0NClBfRF95ZXNfZ2l2ZW5fQ19sb3dfYW5kX1BfYmVsb3cgPC0gKFBfQ19sb3dfYW5kX1BfYmVsb3dfZ2l2ZW5fRF95ZXMgKiBQX0RfeWVzKSAvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfQ19sb3dfYW5kX1BfYmVsb3cNCg0KY2F0KCJTdHVkaSBLYXN1cyAxOlxuIikNCmNhdChzcHJpbnRmKCJQcm9iYWJpbGl0YXMgcHJvZHVrIGNhY2F0IChEID0geWVzKTogJS40ZiUlXG4iLA0KICAgICAgICAgICAgUF9EX3llc19naXZlbl9DX2xvd19hbmRfUF9iZWxvdyAqIDEwMCkpDQoNCiMgU3R1ZGkgS2FzdXMgMg0KUF9GX3RydWUgPC0gMC4wMQ0KUF9GX2ZhbHNlIDwtIDAuOTkNClBfTF9mb3JlaWduX2dpdmVuX0ZfdHJ1ZSA8LSAwLjINClBfQV9oaWdoX2dpdmVuX0ZfdHJ1ZSA8LSAwLjENClBfTV9jcmVkaXRfZ2l2ZW5fRl90cnVlIDwtIDAuNQ0KDQpQX0xfZm9yZWlnbl9naXZlbl9GX2ZhbHNlIDwtIDAuMg0KUF9BX2hpZ2hfZ2l2ZW5fRl9mYWxzZSA8LSAwLjENClBfTV9jcmVkaXRfZ2l2ZW5fRl9mYWxzZSA8LSAwLjUNCg0KIyBQZXJoaXR1bmdhbiBwcm9iYWJpbGl0YXMgZ2FidW5nYW4NClBfTF9mb3JlaWduX2FuZF9BX2hpZ2hfYW5kX01fY3JlZGl0X2dpdmVuX0ZfdHJ1ZSA8LSBQX0xfZm9yZWlnbl9naXZlbl9GX3RydWUgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfQV9oaWdoX2dpdmVuX0ZfdHJ1ZSAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9NX2NyZWRpdF9naXZlbl9GX3RydWUNClBfTF9mb3JlaWduX2FuZF9BX2hpZ2hfYW5kX01fY3JlZGl0X2dpdmVuX0ZfZmFsc2UgPC0gUF9MX2ZvcmVpZ25fZ2l2ZW5fRl9mYWxzZSAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfQV9oaWdoX2dpdmVuX0ZfZmFsc2UgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQX01fY3JlZGl0X2dpdmVuX0ZfZmFsc2UNCg0KIyBUb3RhbCBwcm9iYWJpbGl0eQ0KUF9MX2ZvcmVpZ25fYW5kX0FfaGlnaF9hbmRfTV9jcmVkaXQgPC0gKFBfTF9mb3JlaWduX2FuZF9BX2hpZ2hfYW5kX01fY3JlZGl0X2dpdmVuX0ZfdHJ1ZSAqIFBfRl90cnVlKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUF9MX2ZvcmVpZ25fYW5kX0FfaGlnaF9hbmRfTV9jcmVkaXRfZ2l2ZW5fRl9mYWxzZSAqIFBfRl9mYWxzZSkNCg0KIyBCYXllcyB0aGVvcmVtDQpQX0ZfdHJ1ZV9naXZlbl9MX2ZvcmVpZ25fYW5kX0FfaGlnaF9hbmRfTV9jcmVkaXQgPC0gKFBfTF9mb3JlaWduX2FuZF9BX2hpZ2hfYW5kX01fY3JlZGl0X2dpdmVuX0ZfdHJ1ZSAqIFBfRl90cnVlKSAvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9MX2ZvcmVpZ25fYW5kX0FfaGlnaF9hbmRfTV9jcmVkaXQNCg0KY2F0KCJcblN0dWRpIEthc3VzIDI6XG4iKQ0KY2F0KHNwcmludGYoIlByb2JhYmlsaXRhcyB0cmFuc2Frc2kgcGVuaXB1YW4gKEYgPSB0cnVlKTogJS40ZiUlXG4iLA0KICAgICAgICAgICAgUF9GX3RydWVfZ2l2ZW5fTF9mb3JlaWduX2FuZF9BX2hpZ2hfYW5kX01fY3JlZGl0ICogMTAwKSkNCmBgYA==