UTS_PEMOGRAMAN_WHIRDYANA SHALFA_52240010

Logo

1. Buat program sederhana dalam R dan Python yang melakukan hal berikut:

  1. Menerima dua bilangan dari pengguna

  2. Menghitung dan menampilkan hasil:

  • Penjumlahan
  • Perkalian
  • Pembagian
  • Bilangan pertama pangkat bilangan kedua
  1. Menampilkan tipe data masing-masing hasil operasi
# Menerima dua bilangan dari pengguna (di-hardcode di sini agar bisa di-knit)
a <- 10
b <- 5

# Operasi
penjumlahan <- a + b
perkalian <- a * b
pembagian <- a / b
pangkat <- a ^ b

# Menampilkan hasil dan tipe data
cat("=== Hasil Operasi ===\n")
## === Hasil Operasi ===
cat("Penjumlahan :", a, "+", b, "=", penjumlahan, "\t(tipe:", typeof(penjumlahan), ")\n")
## Penjumlahan : 10 + 5 = 15    (tipe: double )
cat("Perkalian   :", a, "*", b, "=", perkalian, "\t(tipe:", typeof(perkalian), ")\n")
## Perkalian   : 10 * 5 = 50    (tipe: double )
cat("Pembagian   :", a, "/", b, "=", pembagian, "\t(tipe:", typeof(pembagian), ")\n")
## Pembagian   : 10 / 5 = 2     (tipe: double )
cat("Pangkat     :", a, "^", b, "=", pangkat, "\t(tipe:", typeof(pangkat), ")\n")
## Pangkat     : 10 ^ 5 = 1e+05     (tipe: double )

2. Tulislah program dalam R dan Python yang:

  1. Menerima input nilai ujian dari pengguna (0–100)
  2. Menampilkan keterangan berdasarkan ketentuan berikut:
  • Nilai ≥ 85: “Sangat Baik”
  • Nilai 70–84: “Baik”
  • Nilai 60–69: “Cukup”
  • Nilai < 60: “Perlu Perbaikan”
# Menerima input nilai ujian dari pengguna
nilai <- 88

# Menentukan keterangan berdasarkan nilai (jika input valid)
if (!is.na(nilai)) {
  if (nilai >= 85) {
    keterangan <- "Sangat Baik"
  } else if (nilai >= 70) {
    keterangan <- "Baik"
  } else if (nilai >= 60) {
    keterangan <- "Cukup"
  } else {
    keterangan <- "Perlu Perbaikan"
  }

  # Menampilkan hasil
  cat("Nilai:", nilai, "-", keterangan, "\n")
} else {
  cat("Input tidak valid!\n")
}
## Nilai: 88 - Sangat Baik

3. Buatlah fungsi dalam R dan Python bernama kelipatan_genap(n) yang:

  1. Menerima input integer n

  2. Menggunakan loop untuk mencetak semua bilangan genap kelipatan 4 dari 1 hingga n

  3. Contoh output jika n = 20: 4, 8, 12, 16, 20

# Simulasi input pengguna
input <- "60"
n <- suppressWarnings(as.integer(input))

if (is.na(n) || n < 1) {
  cat("Masukkan harus berupa bilangan bulat positif.\n")
} else {
  cat("Bilangan genap kelipatan 4 dari 1 hingga", n, "adalah:\n")
  
  first <- TRUE
  for (i in 1:n) {
    if (i %% 4 == 0) {
      if (!first) {
        cat(", ")
      }
      cat(i)
      first <- FALSE
    }
  }
  cat("\n")
}
## Bilangan genap kelipatan 4 dari 1 hingga 60 adalah:
## 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60

4. Asumsikan data berasal dari 3 file CSV berbeda (januari.csv, februari.csv, maret.csv). Tugas Anda:

  • Bagian 1: Data Collection

Asumsikan data berasal dari 3 file CSV berbeda (januari.csv, februari.csv, maret.csv). Tugas Anda:

  1. Gabungkan ketiga file menjadi satu dataset.

  2. Tampilkan jumlah total baris dan kolom setelah digabung.

## Total baris: 150 dan total kolom: 9
Data Gabungan - 10 Baris Teratas
OrderID Tanggal Produk Kategori Harga Jumlah Total Pembeli Kota
1001 01-01-2024 Laptop A NA 15000000 empat NA Budi@ Bandung
1002 02-01-2024 Tas Branded Fashion 15000000 2 NA Budi@ Surabaya
1003 03-01-2024 Tas Branded Aksesoris 15000000 3 NA anonymous Bandung
1004 04-01-2024 Kemeja NA 15000000 dua NA Andi123 Bandung
1005 05-01-2024 - Fashion Rp750.000 3 NA anonymous Jakarta
1006 06-01-2024 Smartphone X Fashion 15000000 empat NA Sinta99 Bandung
1007 07-01-2024 Sepatu ‘Nike’ Elektronik 1.200.000 3 NA anonymous Bandung
1008 08-01-2024 - Elektronik 250000 dua NA anonymous Jakarta
1009 09-01-2024 Smartphone X Elektronik 15000000 empat NA anonymous -
1010 10-01-2024 Sepatu ‘Nike’ Aksesoris Rp750.000 2 NA Sinta99 Surabaya
  • Bagian 2: Data Cleaning

Lakukan pembersihan data berikut:

  1. Standarkan format tanggal ke bentuk YYYY-MM-DD.

  2. Ubah kolom Harga dan Jumlah menjadi format numerik.

  3. Hitung ulang nilai kolom Total = Harga * Jumlah.

  4. Ganti nilai yang tidak valid (contoh: -, “dua”, “Rp”, “anonymous”) dengan nilai yang sesuai atau NA.

  5. Hapus baris yang tidak memiliki nama produk (Produk kosong atau -).

INTERPRETASI

Setelah dilakukan pembersihan data (Data Cleaning), data penjualan dari bulan Januari hingga Maret sudah terintegrasi dan berada dalam kondisi yang siap untuk dianalisis. Proses ini mencakup standarisasi format tanggal (YYYY-MM-DD) agar seluruh transaksi tercatat secara kronologis, serta pembersihan pada kolom harga dan jumlah dari karakter yang tidak sesuai.

Selain itu, nilai-nilai yang tidak relevan seperti simbol, teks non-angka, atau entri kosong telah diindentifikasi dan dibersihkan agar tidak mengganggu hasil analisis. Basis data tanpa nama produk juga dihapus untuk menjaga kualitas informasi. Dengan demikian, dataset akhir menjadi lebih rapi, akurat, dan dapat disajikan secara interaktif sehingga dapat memudahkan dalam menelusuri dan memahami isi dari data secara efisien.

  • Bagian 3: Data Transformation

Lakukan transformasi data sebagai berikut:

  1. Buat kolom baru Bulan berdasarkan tanggal transaksi.

  2. Hitung total penjualan (Total) per kategori produk.

  3. Hitung jumlah transaksi dari setiap kota.

  4. Buat ringkasan jumlah total penjualan per bulan.

## Total Penjualan per Kategori:
##     Kategori     Total
## 1            168762000
## 2  Aksesoris 332264250
## 3 Elektronik 212756750
## 4    Fashion 225259750
## 
## Jumlah Transaksi per Kota:
##       Kota Jumlah_Transaksi
## 1        -               38
## 2  Bandung               37
## 3  Jakarta               38
## 4 Surabaya               37
## 
## Total Penjualan per Bulan:
##      Bulan    Total
## 1  0001-02   250000
## 2  0002-01 30000000
## 3  0002-02     1500
## 4  0002-03 45001500
## 5  0003-01 45000000
## 6  0003-02 15000000
## 7  0003-03      750
## 8  0003-04     2250
## 9  0004-03     4500
## 10 0004-04   250000
## 11 0005-01     2250
## 12 0005-03 45000000
## 13 0005-04     2250
## 14 0006-02     2250
## 15 0006-03 30000000
## 16 0006-04      750
## 17 0007-02 45000000
## 18 0007-03   750000
## 19 0007-04   750000
## 20 0008-02     2250
## 21 0008-03   750000
## 22 0008-04   250000
## 23 0009-02   750000
## 24 0009-03     1500
## 25 0010-01     1500
## 26 0010-02 45000000
## 27 0010-03 15000000
## 28 0011-02 45000000
## 29 0011-03   250000
## 30 0012-02   500000
## 31 0013-01     1500
## 32 0013-02 45000000
## 33 0013-03   250000
## 34 0014-02   250000
## 35 0016-01 30000000
## 36 0016-03 30001500
## 37 0016-04     1500
## 38 0017-02 45500000
## 39 0017-03 15750000
## 40 0017-04 45000000
## 41 0019-03 30000000
## 42 0019-04     2250
## 43 0020-03 75000000
## 44 0021-01 15000000
## 45 0021-02   750000
## 46 0022-01     1500
## 47 0022-02 45000000
## 48 0022-03   750000
## 49 0023-01     2250
## 50 0023-02     2250
## 51 0024-01 30000000
## 52 0024-02   250000
## 53 0025-01 45000000
## 54 0025-02     2250
## 55 0025-03 45000000
## 56 0026-01   250000
## 57 0026-03 30000000
## 58 0027-01   750000
## 59 0027-02 45000000
## 60 0028-02     2250
## 61 0029-02      750
## 62 0031-01      750
## 63 0031-03      750
  • VISUALISASI

INTERPRETASI

Berdasarkan hasil analisis data penjualan kuartal pertama yang telah dibersihkan dan digabung (Januari-Maret), diperoleh beberapa temuan penting. Dari sisi kategori produk, Aksesoris menghasilkan total penjualan tertinggi sebesar Rp332.264.250, diikuti oleh Fashion sebesar Rp225.259.750, dan Elektronik sebesar Rp212.756.750. Dominasi kategori Aksesoris ini terlihat jelas pada grafik batang dan grafik lingkaran, di mana segmennya jauh lebih besar dibanding kategori lainnya.

Dari sisi wilayah, transaksi tersebar relatif merata antara Jakarta (38 transaksi), Bandung (37), dan Surabaya (37), namun terdapat 38 transaksi yang tidak mencantumkan kota asal (missing value), yang ditampilkan sebagai “-”. Ini mengindikasikan masih ada kekurangan dalam kualitas input data yang sebaiknya ditindaklanjuti pada tahap validasi

Dari segi waktu, penjualan mengalami lonjakan tajam pada bulan Februari (Rp75.003.000) dan Maret (Rp60.003.000), seperti tergambar dalam grafik garis yang menunjukkan tren peningkatan pada periode tersebut. Namun, terdapat nilai penjualan besar yang terakumulasi di entri dengan tanggal tidak valid (NaT) sebesar Rp574.519.500, yang artinya data tersebut tidak tercatat pada bulan tertentu. Ini menjadi sinyal bahwa masih ada baris data yang tidak memiliki format tanggal yang sesuai, meskipun sudah dilakukan konversi ganda.

Secara keseluruhan, visualisasi yang disajikan mampu memperjelas hasil perhitungan dan mempermudah identifikasi pola, seperti dominasi kategori Aksesoris, tren bulanan, serta keberadaan data yang tidak terkelompok secara benar. Ini memberikan gambaran komprehensif yang sangat berguna untuk pengambilan keputusan ke depan.

LS0tDQp0aXRsZTogIlVUU19QRU1PR1JBTUFOX1dISVJEWUFOQSBTSEFMRkFfNTIyNDAwMTAiDQphdXRob3I6ICJXaGlyZHlhbmEgU2hhbGZhIEF5dWJpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDogDQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAiQzovVXNlcnMvU0FMRkEvT25lRHJpdmUvRG9jdW1lbnRzL3ByYWt0aWt1bS9zdHlsZS5jc3MiDQotLS0NCjxpbWcgaWQ9ImZvdG8tc2hhbGZhIiBzcmM9IkM6L1VzZXJzL1NBTEZBL09uZURyaXZlL0RvY3VtZW50cy9mb3RvIHNoYWxmYS5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQotLS0NCg0KIyMgKioxLiBCdWF0IHByb2dyYW0gc2VkZXJoYW5hIGRhbGFtIFIgZGFuIFB5dGhvbiB5YW5nIG1lbGFrdWthbiBoYWwgYmVyaWt1dDoqKg0KDQphLiBNZW5lcmltYSBkdWEgYmlsYW5nYW4gZGFyaSBwZW5nZ3VuYQ0KDQpiLiBNZW5naGl0dW5nIGRhbiBtZW5hbXBpbGthbiBoYXNpbDoNCi0gUGVuanVtbGFoYW4NCi0gUGVya2FsaWFuDQotIFBlbWJhZ2lhbg0KLSBCaWxhbmdhbiBwZXJ0YW1hIHBhbmdrYXQgYmlsYW5nYW4ga2VkdWENCg0KYy4gTWVuYW1waWxrYW4gdGlwZSBkYXRhIG1hc2luZy1tYXNpbmcgaGFzaWwgb3BlcmFzaQ0KDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUV9DQojIE1lbmVyaW1hIGR1YSBiaWxhbmdhbiBkYXJpIHBlbmdndW5hIChkaS1oYXJkY29kZSBkaSBzaW5pIGFnYXIgYmlzYSBkaS1rbml0KQ0KYSA8LSAxMA0KYiA8LSA1DQoNCiMgT3BlcmFzaQ0KcGVuanVtbGFoYW4gPC0gYSArIGINCnBlcmthbGlhbiA8LSBhICogYg0KcGVtYmFnaWFuIDwtIGEgLyBiDQpwYW5na2F0IDwtIGEgXiBiDQoNCiMgTWVuYW1waWxrYW4gaGFzaWwgZGFuIHRpcGUgZGF0YQ0KY2F0KCI9PT0gSGFzaWwgT3BlcmFzaSA9PT1cbiIpDQpjYXQoIlBlbmp1bWxhaGFuIDoiLCBhLCAiKyIsIGIsICI9IiwgcGVuanVtbGFoYW4sICJcdCh0aXBlOiIsIHR5cGVvZihwZW5qdW1sYWhhbiksICIpXG4iKQ0KY2F0KCJQZXJrYWxpYW4gICA6IiwgYSwgIioiLCBiLCAiPSIsIHBlcmthbGlhbiwgIlx0KHRpcGU6IiwgdHlwZW9mKHBlcmthbGlhbiksICIpXG4iKQ0KY2F0KCJQZW1iYWdpYW4gICA6IiwgYSwgIi8iLCBiLCAiPSIsIHBlbWJhZ2lhbiwgIlx0KHRpcGU6IiwgdHlwZW9mKHBlbWJhZ2lhbiksICIpXG4iKQ0KY2F0KCJQYW5na2F0ICAgICA6IiwgYSwgIl4iLCBiLCAiPSIsIHBhbmdrYXQsICJcdCh0aXBlOiIsIHR5cGVvZihwYW5na2F0KSwgIilcbiIpDQpgYGANCg0KDQojIyAqKjIuIFR1bGlzbGFoIHByb2dyYW0gZGFsYW0gUiBkYW4gUHl0aG9uIHlhbmc6KioNCg0KYS4gTWVuZXJpbWEgaW5wdXQgbmlsYWkgdWppYW4gZGFyaSBwZW5nZ3VuYSAoMOKAkzEwMCkNCmIuIE1lbmFtcGlsa2FuIGtldGVyYW5nYW4gYmVyZGFzYXJrYW4ga2V0ZW50dWFuIGJlcmlrdXQ6DQotIE5pbGFpIOKJpSA4NTog4oCcU2FuZ2F0IEJhaWvigJ0NCi0gTmlsYWkgNzDigJM4NDog4oCcQmFpa+KAnQ0KLSBOaWxhaSA2MOKAkzY5OiDigJxDdWt1cOKAnQ0KLSBOaWxhaSA8IDYwOiDigJxQZXJsdSBQZXJiYWlrYW7igJ0NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRX0NCiMgTWVuZXJpbWEgaW5wdXQgbmlsYWkgdWppYW4gZGFyaSBwZW5nZ3VuYQ0KbmlsYWkgPC0gODgNCg0KIyBNZW5lbnR1a2FuIGtldGVyYW5nYW4gYmVyZGFzYXJrYW4gbmlsYWkgKGppa2EgaW5wdXQgdmFsaWQpDQppZiAoIWlzLm5hKG5pbGFpKSkgew0KICBpZiAobmlsYWkgPj0gODUpIHsNCiAgICBrZXRlcmFuZ2FuIDwtICJTYW5nYXQgQmFpayINCiAgfSBlbHNlIGlmIChuaWxhaSA+PSA3MCkgew0KICAgIGtldGVyYW5nYW4gPC0gIkJhaWsiDQogIH0gZWxzZSBpZiAobmlsYWkgPj0gNjApIHsNCiAgICBrZXRlcmFuZ2FuIDwtICJDdWt1cCINCiAgfSBlbHNlIHsNCiAgICBrZXRlcmFuZ2FuIDwtICJQZXJsdSBQZXJiYWlrYW4iDQogIH0NCg0KICAjIE1lbmFtcGlsa2FuIGhhc2lsDQogIGNhdCgiTmlsYWk6IiwgbmlsYWksICItIiwga2V0ZXJhbmdhbiwgIlxuIikNCn0gZWxzZSB7DQogIGNhdCgiSW5wdXQgdGlkYWsgdmFsaWQhXG4iKQ0KfQ0KYGBgDQoNCiMjICoqMy4gQnVhdGxhaCBmdW5nc2kgZGFsYW0gUiBkYW4gUHl0aG9uIGJlcm5hbWEga2VsaXBhdGFuX2dlbmFwKG4pIHlhbmc6KioNCg0KYS4gTWVuZXJpbWEgaW5wdXQgaW50ZWdlciBuDQoNCmIuIE1lbmdndW5ha2FuIGxvb3AgdW50dWsgbWVuY2V0YWsgc2VtdWEgYmlsYW5nYW4gZ2VuYXAga2VsaXBhdGFuIDQgZGFyaSAxICBoaW5nZ2Egbg0KDQpjLiBDb250b2ggb3V0cHV0IGppa2EgbiA9IDIwOiA0LCA4LCAxMiwgMTYsIDIwDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUV9DQojIFNpbXVsYXNpIGlucHV0IHBlbmdndW5hDQppbnB1dCA8LSAiNjAiDQpuIDwtIHN1cHByZXNzV2FybmluZ3MoYXMuaW50ZWdlcihpbnB1dCkpDQoNCmlmIChpcy5uYShuKSB8fCBuIDwgMSkgew0KICBjYXQoIk1hc3Vra2FuIGhhcnVzIGJlcnVwYSBiaWxhbmdhbiBidWxhdCBwb3NpdGlmLlxuIikNCn0gZWxzZSB7DQogIGNhdCgiQmlsYW5nYW4gZ2VuYXAga2VsaXBhdGFuIDQgZGFyaSAxIGhpbmdnYSIsIG4sICJhZGFsYWg6XG4iKQ0KICANCiAgZmlyc3QgPC0gVFJVRQ0KICBmb3IgKGkgaW4gMTpuKSB7DQogICAgaWYgKGkgJSUgNCA9PSAwKSB7DQogICAgICBpZiAoIWZpcnN0KSB7DQogICAgICAgIGNhdCgiLCAiKQ0KICAgICAgfQ0KICAgICAgY2F0KGkpDQogICAgICBmaXJzdCA8LSBGQUxTRQ0KICAgIH0NCiAgfQ0KICBjYXQoIlxuIikNCn0NCmBgYA0KDQojIyAqKjQuIEFzdW1zaWthbiBkYXRhIGJlcmFzYWwgZGFyaSAzIGZpbGUgQ1NWIGJlcmJlZGEgKGphbnVhcmkuY3N2LCBmZWJydWFyaS5jc3YsIG1hcmV0LmNzdikuIFR1Z2FzIEFuZGE6KioNCg0KLSAqKkJhZ2lhbiAxOiBEYXRhIENvbGxlY3Rpb24qKg0KDQpBc3Vtc2lrYW4gZGF0YSBiZXJhc2FsIGRhcmkgMyBmaWxlIENTViBiZXJiZWRhIChqYW51YXJpLmNzdiwgZmVicnVhcmkuY3N2LCBtYXJldC5jc3YpLiBUdWdhcyBBbmRhOg0KDQphLiBHYWJ1bmdrYW4ga2V0aWdhIGZpbGUgbWVuamFkaSBzYXR1IGRhdGFzZXQuDQoNCmIuIFRhbXBpbGthbiBqdW1sYWggdG90YWwgYmFyaXMgZGFuIGtvbG9tIHNldGVsYWggZGlnYWJ1bmcuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBwdXN0YWthIHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShyZWFkcikgICMgVW50dWsgbWVtYmFjYSBmaWxlIENTVg0KbGlicmFyeShkcGx5cikgICMgVW50dWsgbWFuaXB1bGFzaSBkYXRhDQpsaWJyYXJ5KGtuaXRyKSAgIyBVbnR1ayBtZW1idWF0IG91dHB1dCB0YWJlbCB5YW5nIGxlYmloIHJhcGkNCg0KIyBNZW5naW1wb3IgZGF0YSBkYXJpIHRpZ2EgYnVsYW4NCmRhdGFfamFuIDwtIHJlYWRfY3N2KCJDOi8jIFNIQUxGQS9LdWxpYWgvU2VtZXN0ZXIgMi9EYXRhIFNjaWVuY2UgUHJvZ3JhbW1pbmcvZGF0YV9wZW5qdWFsYW5fa3VhcnRhbDFfZnVsbCAtIEphbnVhcmkuY3N2IikNCmRhdGFfZmViIDwtIHJlYWRfY3N2KCJDOi8jIFNIQUxGQS9LdWxpYWgvU2VtZXN0ZXIgMi9EYXRhIFNjaWVuY2UgUHJvZ3JhbW1pbmcvZGF0YV9wZW5qdWFsYW5fa3VhcnRhbDFfZnVsbCAtIEZlYnJ1YXJpLmNzdiIpDQpkYXRhX21hciA8LSByZWFkX2NzdigiQzovIyBTSEFMRkEvS3VsaWFoL1NlbWVzdGVyIDIvRGF0YSBTY2llbmNlIFByb2dyYW1taW5nL2RhdGFfcGVuanVhbGFuX2t1YXJ0YWwxX2Z1bGwgLSBNYXJldC5jc3YiKQ0KDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhc2V0IGRhcmkga2V0aWdhIGJ1bGFuDQpjb21iaW5lZF9kYXRhIDwtIGJpbmRfcm93cyhkYXRhX2phbiwgZGF0YV9mZWIsIGRhdGFfbWFyKQ0KDQojIE1lbmFtcGlsa2FuIGluZm9ybWFzaSB0ZW50YW5nIHVrdXJhbiBkYXRhIGdhYnVuZ2FuDQpjYXQoIlRvdGFsIGJhcmlzOiIsIG5yb3coY29tYmluZWRfZGF0YSksICJkYW4gdG90YWwga29sb206IiwgbmNvbChjb21iaW5lZF9kYXRhKSwgIlxuIikNCg0KIyBNZW5hbXBpbGthbiAxMCBkYXRhIHBlcnRhbWEgZGFsYW0gYmVudHVrIHRhYmVsIHlhbmcgbGViaWggcmFwaQ0Ka2FibGUoaGVhZChjb21iaW5lZF9kYXRhLCAxMCksIGNhcHRpb24gPSAiRGF0YSBHYWJ1bmdhbiAtIDEwIEJhcmlzIFRlcmF0YXMiKQ0KYGBgDQoNCg0KLSAqKkJhZ2lhbiAyOiBEYXRhIENsZWFuaW5nKioNCg0KTGFrdWthbiBwZW1iZXJzaWhhbiBkYXRhIGJlcmlrdXQ6DQoNCmEuIFN0YW5kYXJrYW4gZm9ybWF0IHRhbmdnYWwga2UgYmVudHVrIFlZWVktTU0tREQuDQoNCmIuIFViYWgga29sb20gSGFyZ2EgZGFuIEp1bWxhaCBtZW5qYWRpIGZvcm1hdCBudW1lcmlrLg0KDQpjLiBIaXR1bmcgdWxhbmcgbmlsYWkga29sb20gVG90YWwgPSBIYXJnYSAqIEp1bWxhaC4NCg0KZC4gR2FudGkgbmlsYWkgeWFuZyB0aWRhayB2YWxpZCAoY29udG9oOiAtLCAiZHVhIiwgIlJwIiwgImFub255bW91cyIpIGRlbmdhbiBuaWxhaSB5YW5nIHNlc3VhaSBhdGF1IE5BLg0KDQplLiBIYXB1cyBiYXJpcyB5YW5nIHRpZGFrIG1lbWlsaWtpIG5hbWEgcHJvZHVrIChQcm9kdWsga29zb25nIGF0YXUgLSkuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkocmVhZHIpDQoNCiMgPT09IDEuIE1lbWJhY2EgRmlsZSBDU1YgPT09DQpkZl9qYW4gPC0gcmVhZF9jc3YoImRhdGFfcGVuanVhbGFuX2t1YXJ0YWwxX2Z1bGwgLSBKYW51YXJpLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpkZl9mZWIgPC0gcmVhZF9jc3YoImRhdGFfcGVuanVhbGFuX2t1YXJ0YWwxX2Z1bGwgLSBGZWJydWFyaS5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQ0KZGZfbWFyIDwtIHJlYWRfY3N2KCJkYXRhX3Blbmp1YWxhbl9rdWFydGFsMV9mdWxsIC0gTWFyZXQuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkNCg0KIyA9PT0gMi4gTWVuZ2dhYnVuZ2thbiBTZW11YSBEYXRhID09PQ0KZ2FidW5nIDwtIGJpbmRfcm93cyhkZl9qYW4sIGRmX2ZlYiwgZGZfbWFyKQ0KDQojID09PSAzLiBLb252ZXJzaSBLb2xvbSBUYW5nZ2FsIGtlIEZvcm1hdCBEYXRlID09PQ0KZ2FidW5nJFRhbmdnYWwgPC0gYXMuRGF0ZShnYWJ1bmckVGFuZ2dhbCwgZm9ybWF0ID0gIiVZLSVtLSVkIikNCmlmIChhbnkoaXMubmEoZ2FidW5nJFRhbmdnYWwpKSkgew0KICBnYWJ1bmckVGFuZ2dhbCA8LSBhcy5EYXRlKGdhYnVuZyRUYW5nZ2FsLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQ0KfQ0KaWYgKGFueShpcy5uYShnYWJ1bmckVGFuZ2dhbCkpKSB7DQogIGdhYnVuZyRUYW5nZ2FsIDwtIGFzLkRhdGUoZ2FidW5nJFRhbmdnYWwsIGZvcm1hdCA9ICIlbS8lZC8lWSIpDQp9DQoNCiMgPT09IDQuIEJlcnNpaGthbiBLb2xvbSBIYXJnYSBkYW4gSnVtbGFoID09PQ0KZ2FidW5nJEhhcmdhIDwtIGFzLm51bWVyaWMoZ3N1YigiW14wLTldIiwgIiIsIGFzLmNoYXJhY3RlcihnYWJ1bmckSGFyZ2EpKSkNCmdhYnVuZyRKdW1sYWggPC0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOV0iLCAiIiwgYXMuY2hhcmFjdGVyKGdhYnVuZyRKdW1sYWgpKSkNCg0KIyA9PT0gNS4gSGl0dW5nIFVsYW5nIEtvbG9tIFRvdGFsID09PQ0KZ2FidW5nJFRvdGFsIDwtIGdhYnVuZyRIYXJnYSAqIGdhYnVuZyRKdW1sYWgNCg0KIyA9PT0gNi4gQmVyc2loa2FuIE5pbGFpIFRpZGFrIFZhbGlkIChraHVzdXMga29sb20ga2FyYWt0ZXIpID09PQ0KbmlsYWlfc2FsYWggPC0gYygiLSIsICJkdWEiLCAiUnAiLCAiYW5vbnltb3VzIiwgIiIpDQprb2xvbV9rYXJha3RlciA8LSBzYXBwbHkoZ2FidW5nLCBpcy5jaGFyYWN0ZXIpDQpnYWJ1bmdba29sb21fa2FyYWt0ZXJdIDwtIGxhcHBseShnYWJ1bmdba29sb21fa2FyYWt0ZXJdLCBmdW5jdGlvbihjb2wpIHsNCiAgY29sW2NvbCAlaW4lIG5pbGFpX3NhbGFoXSA8LSBOQQ0KICByZXR1cm4oY29sKQ0KfSkNCg0KIyA9PT0gNy4gSGFwdXMgQmFyaXMgVGFucGEgTmFtYSBQcm9kdWsgPT09DQpnYWJ1bmcgPC0gZ2FidW5nWyEoaXMubmEoZ2FidW5nJFByb2R1aykgfCBnYWJ1bmckUHJvZHVrID09ICIiKSwgXQ0KDQojID09PSA4LiBIYXB1cyBCYXJpcyB5YW5nIE1lbmdhbmR1bmcgTkEgZGkgS29sb20gUGVudGluZyA9PT0NCmdhYnVuZyA8LSBnYWJ1bmcgJT4lIGZpbHRlcighaXMubmEoVGFuZ2dhbCksICFpcy5uYShIYXJnYSksICFpcy5uYShKdW1sYWgpLCAhaXMubmEoVG90YWwpKQ0KDQojID09PSA5LiBUYW1waWxrYW4gVGFiZWwgSW50ZXJha3RpZiA9PT0NCmRhdGF0YWJsZSgNCiAgZ2FidW5nLA0KICBvcHRpb25zID0gbGlzdCgNCiAgICBwYWdlTGVuZ3RoID0gMTAsDQogICAgbGVuZ3RoTWVudSA9IGMoNSwgMTAsIDE1LCAyMCksDQogICAgYXV0b1dpZHRoID0gVFJVRQ0KICApLA0KICBjYXB0aW9uID0gIlRhYmVsIEludGVyYWt0aWY6IDEwIEJhcmlzIFBlcnRhbWEgRGF0YSBTZXRlbGFoIFBlbWJlcnNpaGFuIg0KKQ0KDQpgYGANCg0KKklOVEVSUFJFVEFTSSoNCg0KU2V0ZWxhaCBkaWxha3VrYW4gcGVtYmVyc2loYW4gZGF0YSAoRGF0YSBDbGVhbmluZyksIGRhdGEgcGVuanVhbGFuIGRhcmkgYnVsYW4gSmFudWFyaSBoaW5nZ2EgTWFyZXQgc3VkYWggdGVyaW50ZWdyYXNpIGRhbiBiZXJhZGEgZGFsYW0ga29uZGlzaSB5YW5nIHNpYXAgdW50dWsgZGlhbmFsaXNpcy4gUHJvc2VzIGluaSBtZW5jYWt1cCBzdGFuZGFyaXNhc2kgZm9ybWF0IHRhbmdnYWwgKFlZWVktTU0tREQpIGFnYXIgc2VsdXJ1aCB0cmFuc2Frc2kgdGVyY2F0YXQgc2VjYXJhIGtyb25vbG9naXMsIHNlcnRhIHBlbWJlcnNpaGFuIHBhZGEga29sb20gaGFyZ2EgZGFuIGp1bWxhaCBkYXJpIGthcmFrdGVyIHlhbmcgdGlkYWsgc2VzdWFpLg0KDQpTZWxhaW4gaXR1LCBuaWxhaS1uaWxhaSB5YW5nIHRpZGFrIHJlbGV2YW4gc2VwZXJ0aSBzaW1ib2wsIHRla3Mgbm9uLWFuZ2thLCBhdGF1IGVudHJpIGtvc29uZyB0ZWxhaCBkaWluZGVudGlmaWthc2kgZGFuIGRpYmVyc2loa2FuIGFnYXIgdGlkYWsgbWVuZ2dhbmdndSBoYXNpbCBhbmFsaXNpcy4gQmFzaXMgZGF0YSB0YW5wYSBuYW1hIHByb2R1ayBqdWdhIGRpaGFwdXMgdW50dWsgbWVuamFnYSBrdWFsaXRhcyBpbmZvcm1hc2kuIERlbmdhbiBkZW1pa2lhbiwgZGF0YXNldCBha2hpciBtZW5qYWRpIGxlYmloIHJhcGksIGFrdXJhdCwgZGFuIGRhcGF0IGRpc2FqaWthbiBzZWNhcmEgaW50ZXJha3RpZiBzZWhpbmdnYSBkYXBhdCBtZW11ZGFoa2FuIGRhbGFtIG1lbmVsdXN1cmkgZGFuIG1lbWFoYW1pIGlzaSBkYXJpIGRhdGEgc2VjYXJhIGVmaXNpZW4uDQoNCg0KLSAqKkJhZ2lhbiAzOiBEYXRhIFRyYW5zZm9ybWF0aW9uKioNCg0KTGFrdWthbiB0cmFuc2Zvcm1hc2kgZGF0YSBzZWJhZ2FpIGJlcmlrdXQ6DQoNCmEuIEJ1YXQga29sb20gYmFydSBCdWxhbiBiZXJkYXNhcmthbiB0YW5nZ2FsIHRyYW5zYWtzaS4NCg0KYi4gSGl0dW5nIHRvdGFsIHBlbmp1YWxhbiAoVG90YWwpIHBlciBrYXRlZ29yaSBwcm9kdWsuDQoNCmMuIEhpdHVuZyBqdW1sYWggdHJhbnNha3NpIGRhcmkgc2V0aWFwIGtvdGEuDQoNCmQuIEJ1YXQgcmluZ2thc2FuIGp1bWxhaCB0b3RhbCBwZW5qdWFsYW4gcGVyIGJ1bGFuLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1iYWNhIGZpbGUgQ1NWDQpkZl9qYW4gPC0gcmVhZC5jc3YoImRhdGFfcGVuanVhbGFuX2t1YXJ0YWwxX2Z1bGwgLSBKYW51YXJpLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCmRmX2ZlYiA8LSByZWFkLmNzdigiZGF0YV9wZW5qdWFsYW5fa3VhcnRhbDFfZnVsbCAtIEZlYnJ1YXJpLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCmRmX21hciA8LSByZWFkLmNzdigiZGF0YV9wZW5qdWFsYW5fa3VhcnRhbDFfZnVsbCAtIE1hcmV0LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCg0KIyBNZW5nZ2FidW5na2FuIHNlbXVhIGRhdGENCmdhYnVuZyA8LSByYmluZChkZl9qYW4sIGRmX2ZlYiwgZGZfbWFyKQ0KDQojIEtvbnZlcnNpIGtvbG9tIFRhbmdnYWwga2UgZm9ybWF0IERhdGUgZGFuIHRhbWJhaGthbiBrb2xvbSBCdWxhbg0KZ2FidW5nJFRhbmdnYWwgPC0gYXMuRGF0ZShnYWJ1bmckVGFuZ2dhbCwgZm9ybWF0ID0gIiVZLSVtLSVkIikNCmlmIChhbnkoaXMubmEoZ2FidW5nJFRhbmdnYWwpKSkgew0KICBnYWJ1bmckVGFuZ2dhbCA8LSBhcy5EYXRlKGdhYnVuZyRUYW5nZ2FsLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQ0KfQ0KZ2FidW5nJEJ1bGFuIDwtIGZvcm1hdChnYWJ1bmckVGFuZ2dhbCwgIiVZLSVtIikNCg0KIyBQYXN0aWthbiBrb2xvbSBIYXJnYSwgSnVtbGFoLCBkYW4gVG90YWwgbnVtZXJpaw0KZ2FidW5nJEhhcmdhIDwtIGFzLm51bWVyaWMoZ3N1YigiW14wLTkuXSIsICIiLCBhcy5jaGFyYWN0ZXIoZ2FidW5nJEhhcmdhKSkpDQpnYWJ1bmckSnVtbGFoIDwtIGFzLm51bWVyaWMoZ3N1YigiW14wLTkuXSIsICIiLCBhcy5jaGFyYWN0ZXIoZ2FidW5nJEp1bWxhaCkpKQ0KZ2FidW5nJFRvdGFsIDwtIGdhYnVuZyRIYXJnYSAqIGdhYnVuZyRKdW1sYWgNCg0KIyBiLiBUb3RhbCBwZW5qdWFsYW4gcGVyIGthdGVnb3JpDQp0b3RhbF9wZXJfa2F0ZWdvcmkgPC0gYWdncmVnYXRlKFRvdGFsIH4gS2F0ZWdvcmksIGRhdGEgPSBnYWJ1bmcsIHN1bSwgbmEucm0gPSBUUlVFKQ0KY2F0KCJUb3RhbCBQZW5qdWFsYW4gcGVyIEthdGVnb3JpOlxuIikNCnByaW50KHRvdGFsX3Blcl9rYXRlZ29yaSkNCg0KIyBjLiBKdW1sYWggdHJhbnNha3NpIHBlciBrb3RhDQp0cmFuc2Frc2lfcGVyX2tvdGEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShnYWJ1bmckS290YSkpDQpjb2xuYW1lcyh0cmFuc2Frc2lfcGVyX2tvdGEpIDwtIGMoIktvdGEiLCAiSnVtbGFoX1RyYW5zYWtzaSIpDQpjYXQoIlxuSnVtbGFoIFRyYW5zYWtzaSBwZXIgS290YTpcbiIpDQpwcmludCh0cmFuc2Frc2lfcGVyX2tvdGEpDQoNCiMgZC4gVG90YWwgcGVuanVhbGFuIHBlciBidWxhbg0KcGVuanVhbGFuX3Blcl9idWxhbiA8LSBhZ2dyZWdhdGUoVG90YWwgfiBCdWxhbiwgZGF0YSA9IGdhYnVuZywgc3VtLCBuYS5ybSA9IFRSVUUpDQpjYXQoIlxuVG90YWwgUGVuanVhbGFuIHBlciBCdWxhbjpcbiIpDQpwcmludChwZW5qdWFsYW5fcGVyX2J1bGFuKQ0KYGBgDQoNCi0gKipWSVNVQUxJU0FTSSoqIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocGxvdGx5KQ0KDQojID09PSBEYWZ0YXIga2F0ZWdvcmkgZGFuIGtvdGEgeWFuZyB2YWxpZCA9PT0NCmthdGVnb3JpX3ZhbGlkIDwtIGMoIkZhc2hpb24iLCAiRWxla3Ryb25payIsICJBa3Nlc29yaXMiKQ0Ka290YV92YWxpZCA8LSBjKCJKYWthcnRhIiwgIkJhbmR1bmciLCAiU3VyYWJheWEiKQ0KDQojID09PSBhLiBUb3RhbCBQZW5qdWFsYW4gcGVyIEthdGVnb3JpIChCYXIgQ2hhcnQpID09PQ0KdG90YWxfcGVyX2thdGVnb3JpX2ZpbHRlcmVkIDwtIHRvdGFsX3Blcl9rYXRlZ29yaSAlPiUNCiAgZmlsdGVyKEthdGVnb3JpICVpbiUga2F0ZWdvcmlfdmFsaWQgJiAhaXMubmEoVG90YWwpICYgVG90YWwgPiAwKQ0KDQp0b3RhbF9wZXJfa2F0ZWdvcmlfZmlsdGVyZWQkS2F0ZWdvcmkgPC0gYXMuY2hhcmFjdGVyKHRvdGFsX3Blcl9rYXRlZ29yaV9maWx0ZXJlZCRLYXRlZ29yaSkNCg0Ka2F0ZWdvcmlfcGxvdCA8LSBnZ3Bsb3QodG90YWxfcGVyX2thdGVnb3JpX2ZpbHRlcmVkLCBhZXMoeCA9IHJlb3JkZXIoS2F0ZWdvcmksIFRvdGFsKSwgeSA9IFRvdGFsLCBmaWxsID0gS2F0ZWdvcmkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiVG90YWwgUGVuanVhbGFuIHBlciBLYXRlZ29yaSIsIHggPSAiS2F0ZWdvcmkiLCB5ID0gIlRvdGFsIFBlbmp1YWxhbiIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmdncGxvdGx5KGthdGVnb3JpX3Bsb3QpDQoNCg0KIyA9PT0gYi4gSnVtbGFoIFRyYW5zYWtzaSBwZXIgS290YSAoUGllIENoYXJ0KSA9PT0NCnRyYW5zYWtzaV9wZXJfa290YV9maXhlZCA8LSBkYXRhLmZyYW1lKA0KICBLb3RhID0gYygiQmFuZHVuZyIsICJKYWthcnRhIiwgIlN1cmFiYXlhIiksDQogIEp1bWxhaF9UcmFuc2Frc2kgPSBjKDM3LCAzOCwgMzcpDQopDQoNCnRyYW5zYWtzaV9wZXJfa290YV9maXhlZCA8LSB0cmFuc2Frc2lfcGVyX2tvdGFfZml4ZWQgJT4lDQogIG11dGF0ZShwZXJzZW4gPSBKdW1sYWhfVHJhbnNha3NpIC8gc3VtKEp1bWxhaF9UcmFuc2Frc2kpICogMTAwLA0KICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoS290YSwgIjogIiwgSnVtbGFoX1RyYW5zYWtzaSwgIiB0cmFuc2Frc2kgKCIsIHJvdW5kKHBlcnNlbiwgMSksICIlKSIpKQ0KDQprb3RhX3BpZSA8LSBwbG90X2x5KA0KICB0cmFuc2Frc2lfcGVyX2tvdGFfZml4ZWQsDQogIGxhYmVscyA9IH5sYWJlbCwNCiAgdmFsdWVzID0gfkp1bWxhaF9UcmFuc2Frc2ksDQogIHR5cGUgPSAncGllJywNCiAgdGV4dGluZm8gPSAnbGFiZWwrcGVyY2VudCcsDQogIGluc2lkZXRleHRvcmllbnRhdGlvbiA9ICdyYWRpYWwnDQopICU+JQ0KICBsYXlvdXQodGl0bGUgPSAiSnVtbGFoIFRyYW5zYWtzaSBwZXIgS290YSAtIFBpZSBDaGFydCIpDQoNCmtvdGFfcGllDQoNCiMgPT09IGMuIFRvdGFsIFBlbmp1YWxhbiBwZXIgQnVsYW4gKExpbmUgQ2hhcnQpID09PQ0KcGVuanVhbGFuX3Blcl9idWxhbl9maWx0ZXJlZCA8LSBwZW5qdWFsYW5fcGVyX2J1bGFuICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFRvdGFsKSAmIFRvdGFsID4gMCkNCg0KYnVsYW5fcGxvdCA8LSBnZ3Bsb3QocGVuanVhbGFuX3Blcl9idWxhbl9maWx0ZXJlZCwgYWVzKHggPSBCdWxhbiwgeSA9IFRvdGFsLCBncm91cCA9IDEpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJyZWQiLCBzaXplID0gMikgKw0KICBsYWJzKHRpdGxlID0gIlRvdGFsIFBlbmp1YWxhbiBwZXIgQnVsYW4iLCB4ID0gIkJ1bGFuIiwgeSA9ICJUb3RhbCBQZW5qdWFsYW4iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShidWxhbl9wbG90KQ0KDQpgYGANCg0KDQoqSU5URVJQUkVUQVNJKg0KDQpCZXJkYXNhcmthbiBoYXNpbCBhbmFsaXNpcyBkYXRhIHBlbmp1YWxhbiBrdWFydGFsIHBlcnRhbWEgeWFuZyB0ZWxhaCBkaWJlcnNpaGthbiBkYW4gZGlnYWJ1bmcgKEphbnVhcmktTWFyZXQpLCBkaXBlcm9sZWggYmViZXJhcGEgdGVtdWFuIHBlbnRpbmcuIERhcmkgc2lzaSBrYXRlZ29yaSBwcm9kdWssIEFrc2Vzb3JpcyBtZW5naGFzaWxrYW4gdG90YWwgcGVuanVhbGFuIHRlcnRpbmdnaSBzZWJlc2FyIFJwMzMyLjI2NC4yNTAsIGRpaWt1dGkgb2xlaCBGYXNoaW9uIHNlYmVzYXIgUnAyMjUuMjU5Ljc1MCwgZGFuIEVsZWt0cm9uaWsgc2ViZXNhciBScDIxMi43NTYuNzUwLiBEb21pbmFzaSBrYXRlZ29yaSBBa3Nlc29yaXMgaW5pIHRlcmxpaGF0IGplbGFzIHBhZGEgZ3JhZmlrIGJhdGFuZyBkYW4gZ3JhZmlrIGxpbmdrYXJhbiwgZGkgbWFuYSBzZWdtZW5ueWEgamF1aCBsZWJpaCBiZXNhciBkaWJhbmRpbmcga2F0ZWdvcmkgbGFpbm55YS4NCg0KRGFyaSBzaXNpIHdpbGF5YWgsIHRyYW5zYWtzaSB0ZXJzZWJhciByZWxhdGlmIG1lcmF0YSBhbnRhcmEgSmFrYXJ0YSAoMzggdHJhbnNha3NpKSwgQmFuZHVuZyAoMzcpLCBkYW4gU3VyYWJheWEgKDM3KSwgbmFtdW4gdGVyZGFwYXQgMzggdHJhbnNha3NpIHlhbmcgdGlkYWsgbWVuY2FudHVta2FuIGtvdGEgYXNhbCAobWlzc2luZyB2YWx1ZSksIHlhbmcgZGl0YW1waWxrYW4gc2ViYWdhaSDigJwt4oCdLiBJbmkgbWVuZ2luZGlrYXNpa2FuIG1hc2loIGFkYSBrZWt1cmFuZ2FuIGRhbGFtIGt1YWxpdGFzIGlucHV0IGRhdGEgeWFuZyBzZWJhaWtueWEgZGl0aW5kYWtsYW5qdXRpIHBhZGEgdGFoYXAgdmFsaWRhc2kNCg0KRGFyaSBzZWdpIHdha3R1LCBwZW5qdWFsYW4gbWVuZ2FsYW1pIGxvbmpha2FuIHRhamFtIHBhZGEgYnVsYW4gRmVicnVhcmkgKFJwNzUuMDAzLjAwMCkgZGFuIE1hcmV0IChScDYwLjAwMy4wMDApLCBzZXBlcnRpIHRlcmdhbWJhciBkYWxhbSBncmFmaWsgZ2FyaXMgeWFuZyBtZW51bmp1a2thbiB0cmVuIHBlbmluZ2thdGFuIHBhZGEgcGVyaW9kZSB0ZXJzZWJ1dC4gTmFtdW4sIHRlcmRhcGF0IG5pbGFpIHBlbmp1YWxhbiBiZXNhciB5YW5nIHRlcmFrdW11bGFzaSBkaSBlbnRyaSBkZW5nYW4gdGFuZ2dhbCB0aWRhayB2YWxpZCAoTmFUKSBzZWJlc2FyIFJwNTc0LjUxOS41MDAsIHlhbmcgYXJ0aW55YSBkYXRhIHRlcnNlYnV0IHRpZGFrIHRlcmNhdGF0IHBhZGEgYnVsYW4gdGVydGVudHUuIEluaSBtZW5qYWRpIHNpbnlhbCBiYWh3YSBtYXNpaCBhZGEgYmFyaXMgZGF0YSB5YW5nIHRpZGFrIG1lbWlsaWtpIGZvcm1hdCB0YW5nZ2FsIHlhbmcgc2VzdWFpLCBtZXNraXB1biBzdWRhaCBkaWxha3VrYW4ga29udmVyc2kgZ2FuZGEuDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgdmlzdWFsaXNhc2kgeWFuZyBkaXNhamlrYW4gbWFtcHUgbWVtcGVyamVsYXMgaGFzaWwgcGVyaGl0dW5nYW4gZGFuIG1lbXBlcm11ZGFoIGlkZW50aWZpa2FzaSBwb2xhLCBzZXBlcnRpIGRvbWluYXNpIGthdGVnb3JpIEFrc2Vzb3JpcywgdHJlbiBidWxhbmFuLCBzZXJ0YSBrZWJlcmFkYWFuIGRhdGEgeWFuZyB0aWRhayB0ZXJrZWxvbXBvayBzZWNhcmEgYmVuYXIuIEluaSBtZW1iZXJpa2FuIGdhbWJhcmFuIGtvbXByZWhlbnNpZiB5YW5nIHNhbmdhdCBiZXJndW5hIHVudHVrIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBrZSBkZXBhbi4NCg==