Basic Programing Data Sains Praktikum 1
Basic Programing
A. Mengidentifikasi Tipe Data
###1. Identifikasi Tipe Data setiap Variabel
| Variabel | Nilai | Python | R |
|---|---|---|---|
| a | 42 | int | numeric |
| b | 3.14 | float | numeric |
| c | “Hello” | str | character |
| d | FALSE / False | bool | logical |
| e | [1, 2, 3] | list | numeric (vector) |
| f | {“name”: “Alice”, “age”: 25} | dict | list |
2. Cetak Tipe Data setiap variabel menggunakan type() (Python) dan class() (R)
# Mendefinisikan variabel
a <- 42 # Integer (Bilangan bulat)
a <- as.integer(42)
b <- 3.14 # Numeric (Angka desimal)
c <- "Hello" # Character (Teks)
d <- FALSE # Logical (Boolean)
e <- c(1, 2, 3) # Numeric (Vektor angka)
f <- list("Name" = "Alice", "age" = 25) # List (Kumpulan elemen dengan tipe berbeda)
# Mencetak tipe data tiap variabel
cat(
"Tipe data a:", class(a), "\n", # Integer
"Tipe data b:", class(b), "\n", # Numeric
"Tipe data c:", class(c), "\n", # Character
"Tipe data d:", class(d), "\n", # Logical
"Tipe data e:", class(e), "\n", # Numeric
"Tipe data f:", class(f), "\n" # List
)## Tipe data a: integer
## Tipe data b: numeric
## Tipe data c: character
## Tipe data d: logical
## Tipe data e: numeric
## Tipe data f: list
B. Variabel dan Manipulasi Data
1. Mengidentifikasi Variabel ke dalam R
x: \(20\)
y: \(5\)
text1: \(Data\)
text2: \(Science\)
- Memperbarui nilai \(x\) dengan menambahkan \(10\).
- Menggabungkan \(text1\) dan \(text2\) ke dalam kata Data Science.
- Mengubah teks gabungan menjadi huruf besar.
# Definisi variabel
x <- 20
y <- 5
text1 <- "Data"
text2 <- "Science"
# Operasi pada variabel
x <- x + 10 # Menambah 10 ke x
merged_text <- paste0(text1, " ", text2) # Menggabungkan teks tanpa sep
capitalized_text <- toupper(merged_text) # Konversi ke huruf besar
# Menampilkan hasil
cat(
sprintf("Nilai x ditambah 10: %d\n", x),
sprintf("Teks gabungan: %s\n", merged_text),
sprintf("Teks dalam huruf besar: %s\n", capitalized_text)
)## Nilai x ditambah 10: 30
## Teks gabungan: Data Science
## Teks dalam huruf besar: DATA SCIENCE
C. Operasi Aritmatika
Variabel-variabel
a : \(15\)
b : \(4\)
- Menghitung jumlah, selisih, perkalian, pembagian, dan modulo dari a dan b.
- Menghitung a pangkat b
- Membuat variabel baru c = a/b ubah menjadi integer.
# Mendefinisikan variabel
a <- 15
b <- 4
# 1. Hitung operasi aritmatika dasar
jumlah <- a + b # Penjumlahan
selisih <- a - b # Pengurangan
produk <- a * b # Perkalian
pembagian <- a / b # Pembagian
modulo <- a %% b # Sisa pembagian
# 2. Hitung a pangkat b
pangkat <- a^b
# 3. Buat variabel baru c dan ubah menjadi integer
c <- as.integer(a / b)
# Menampilkan hasil
cat(
"Hasil Penjumlahan:", jumlah, "\n",
"Hasil Pengurangan:", selisih, "\n",
"Hasil Perkalian:", produk, "\n",
"Hasil Pembagian:", pembagian, "\n",
"Hasil Modulo:", modulo, "\n",
"Hasil Pangkat:", pangkat, "\n",
"Nilai c sebagai integer:", c, "\n"
)## Hasil Penjumlahan: 19
## Hasil Pengurangan: 11
## Hasil Perkalian: 60
## Hasil Pembagian: 3.75
## Hasil Modulo: 3
## Hasil Pangkat: 50625
## Nilai c sebagai integer: 3
D. Operasi String
Text : Hello, Data Science!
- Ekstrak \(5\) karakter pertama dari teks.
- Menghitung jumlah karakter dalam teks.
- Mengubah teks menjadi huruf kecil.
# Mendefinisikan string
teks <- "Hello, Data Science!"
# Operasi string
lima_karakter_pertama <- substr(teks, start = 1, stop = 5) # Mengambil 5 karakter pertama
panjang_teks <- nchar(teks) # Menghitung total karakter
teks_lower <- tolower(teks) # Mengonversi teks menjadi huruf kecil
# Menampilkan hasil
cat(
"Lima karakter pertama:", lima_karakter_pertama, "\n",
"Total jumlah karakter:", panjang_teks, "\n",
"Teks dalam bentuk kecil:", teks_lower, "\n"
)## Lima karakter pertama: Hello
## Total jumlah karakter: 20
## Teks dalam bentuk kecil: hello, data science!
E. Operator Perbandingan dan Logika
Mengingat variabel-variabel berikut:
x: \(7\)
y : \(10\)
- Periksa apakah x lebih besar dari y.
- Periksa apakah x kurang dari atau sama dengan y.
- Periksa apakah x tidak sama dengan y.
- Evaluasilah ekspresi (x > 5) AND (y < 20).
# Mendefinisikan variabel
x <- 7
y <- 10
# Operasi perbandingan
lebih_besar <- x > y # Apakah x lebih besar dari y?
kurang_sama <- x <= y # Apakah x kurang dari atau sama dengan y?
tidak_sama <- x != y # Apakah x tidak sama dengan y?
# Operasi logika
logika_and <- (x > 5) & (y < 20) # Evaluasi ekspresi (x > 5) AND (y < 20)
# Menampilkan hasil
cat(
"Apakah x lebih besar dari y?:", lebih_besar, "\n",
"Apakah x kurang dari atau sama dengan y?:", kurang_sama, "\n",
"Apakah x tidak sama dengan y?:", tidak_sama, "\n",
"Evaluasi (x > 5) AND (y < 20):", logika_and, "\n"
)## Apakah x lebih besar dari y?: FALSE
## Apakah x kurang dari atau sama dengan y?: TRUE
## Apakah x tidak sama dengan y?: TRUE
## Evaluasi (x > 5) AND (y < 20): TRUE
F. Konversi Tipe Data
num_str : \(123\)
num_float : \(45.67\)
- Ubah num_str ke bilangan dan tambahkan \(10\).
- Ubah num_float ke bilangan bulat.
- Mengonversi num_float kembali menjadi string.
# Mendefinisikan variabel
num_str <- "123"
num_float <- 45.67
# Konversi dan operasi
num_str_ke_bilangan <- as.numeric(num_str) + 10 # Ubah num_str ke bilangan dan tambahkan 10
num_float_ke_bulat <- as.integer(num_float) # Ubah num_float ke bilangan bulat
num_float_ke_string <- as.character(num_float) # Ubah num_float kembali ke string
# Menampilkan hasil
cat(
"Hasil konversi num_str ke bilangan dan ditambah 10:", num_str_ke_bilangan, "\n",
"Hasil konversi num_float ke bilangan bulat:", num_float_ke_bulat, "\n",
"Hasil konversi num_float ke string:", num_float_ke_string, "\n"
)## Hasil konversi num_str ke bilangan dan ditambah 10: 133
## Hasil konversi num_float ke bilangan bulat: 45
## Hasil konversi num_float ke string: 45.67
G. Tantangan Bonus
Buat program interaktif yang meminta pengguna untuk memasukkan:
- Nama
- Usia
- Kota kelahiran
Kemudian, cetak output sebagai berikut:
Hello [Name], you are [Age] years old and from [Hometown].
# Cegah error jika dijalankan langsung tanpa params
if (!exists("params")) {
params <- list(name = "Default Nabila", age = 19, hometown = "Riau")
}
# Gunakan params
name <- params$name
age <- params$age
hometown <- params$hometown
cat("Hello", name, ", you are", age, "years old and from", hometown, "\n")## Hello Default Nabila , you are 19 years old and from Riau
LS0tDQp0aXRsZTogIkJhc2ljIFByb2dyYW1pbmcgRGF0YSBTYWlucyBQcmFrdGlrdW0gMSINCg0KYXV0aG9yOiANCiAgICAtICJOYWJpbGEgQW5nZ2l0YSBQdXRyaSINCiAgICANCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZS9zdHlsZSBjc3MuY3NzIg0KLS0tDQo8aW1nIHNyYz0iaW1nL3Byb2ZpbGUuanBnIiBhbHQ9IlByb2ZpbGUiIGlkPSJsb2dvLXV0YW1hIiBzdHlsZT0id2lkdGg6MzAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ii8+DQoNCg0KIyAqKkJhc2ljIFByb2dyYW1pbmcqKg0KDQojIyAqKkEuIE1lbmdpZGVudGlmaWthc2kgVGlwZSBEYXRhKioNCg0KIyMjKioxLiBJZGVudGlmaWthc2kgVGlwZSBEYXRhIHNldGlhcCBWYXJpYWJlbCoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW11YXQgcGFrZXQgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIE1lbWJ1YXQgZGF0YSBmcmFtZQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBWYXJpYWJlbCA9IGMoImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiksDQogIE5pbGFpID0gYygiNDIiLCAiMy4xNCIsICJcIkhlbGxvXCIiLCAiRkFMU0UgLyBGYWxzZSIsICJbMSwgMiwgM10iLCAie1wibmFtZVwiOiBcIkFsaWNlXCIsIFwiYWdlXCI6IDI1fSIpLA0KICBQeXRob24gPSBjKCJpbnQiLCAiZmxvYXQiLCAic3RyIiwgImJvb2wiLCAibGlzdCIsICJkaWN0IiksDQogIFIgPSBjKCJudW1lcmljIiwgIm51bWVyaWMiLCAiY2hhcmFjdGVyIiwgImxvZ2ljYWwiLCAibnVtZXJpYyAodmVjdG9yKSIsICJsaXN0IikNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbCBkZW5nYW4gc3R5bGluZyBkYW4gd2FybmEgcGFkYSB0ZWtzIGhlYWRlcg0Ka2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBib29rdGFicyA9IFRSVUUsIGNhcHRpb24gPSAiSWRlbnRpZmlrYXNpIFRpcGUgRGF0YSBkYWxhbSBQeXRob24gZGFuIFIiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJhY2tncm91bmQgPSAibGlnaHRibHVlIikgJT4lICAjIFdhcm5hIGxhdGFyIGJlbGFrYW5nIGtvbG9tICdWYXJpYWJlbCcNCiAgY29sdW1uX3NwZWMoMiwgYmFja2dyb3VuZCA9ICJsaWdodGdyZWVuIikgJT4lICMgV2FybmEgbGF0YXIgYmVsYWthbmcga29sb20gJ05pbGFpJw0KICBjb2x1bW5fc3BlYygzLCBiYWNrZ3JvdW5kID0gImxpZ2h0eWVsbG93IikgJT4lIyBXYXJuYSBsYXRhciBiZWxha2FuZyBrb2xvbSAnUHl0aG9uJw0KICBjb2x1bW5fc3BlYyg0LCBiYWNrZ3JvdW5kID0gImxpZ2h0Y29yYWwiKSAlPiUgICMgV2FybmEgbGF0YXIgYmVsYWthbmcga29sb20gJ1InDQogICMgTWVtYmVyaWthbiB3YXJuYSBwYWRhIHRla3MgaGVhZGVyIGtvbG9tDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiSWRlbnRpZmlrYXNpIFRpcGUgRGF0YSIgPSAzKSwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICJkYXJrYmx1ZSIpICU+JQ0KICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImRhcmtibHVlIikNCmBgYA0KDQojIyMgKioyLiBDZXRhayBUaXBlIERhdGEgc2V0aWFwIHZhcmlhYmVsIG1lbmdndW5ha2FuIHR5cGUoKSAoUHl0aG9uKSBkYW4gY2xhc3MoKSAoUikqKg0KDQpgYGB7ciBlY2hvPVRSVUV9DQojIE1lbmRlZmluaXNpa2FuIHZhcmlhYmVsDQphIDwtIDQyICAjIEludGVnZXIgKEJpbGFuZ2FuIGJ1bGF0KQ0KYSA8LSBhcy5pbnRlZ2VyKDQyKSANCmIgPC0gMy4xNCAgIyBOdW1lcmljIChBbmdrYSBkZXNpbWFsKQ0KYyA8LSAiSGVsbG8iICAjIENoYXJhY3RlciAoVGVrcykNCmQgPC0gRkFMU0UgICMgTG9naWNhbCAoQm9vbGVhbikNCmUgPC0gYygxLCAyLCAzKSAgIyBOdW1lcmljIChWZWt0b3IgYW5na2EpDQpmIDwtIGxpc3QoIk5hbWUiID0gIkFsaWNlIiwgImFnZSIgPSAyNSkgICMgTGlzdCAoS3VtcHVsYW4gZWxlbWVuIGRlbmdhbiB0aXBlIGJlcmJlZGEpDQoNCiMgTWVuY2V0YWsgdGlwZSBkYXRhIHRpYXAgdmFyaWFiZWwNCmNhdCgNCiAgIlRpcGUgZGF0YSBhOiIsIGNsYXNzKGEpLCAiXG4iLCAgIyBJbnRlZ2VyDQogICJUaXBlIGRhdGEgYjoiLCBjbGFzcyhiKSwgIlxuIiwgICMgTnVtZXJpYw0KICAiVGlwZSBkYXRhIGM6IiwgY2xhc3MoYyksICJcbiIsICAjIENoYXJhY3Rlcg0KICAiVGlwZSBkYXRhIGQ6IiwgY2xhc3MoZCksICJcbiIsICAjIExvZ2ljYWwNCiAgIlRpcGUgZGF0YSBlOiIsIGNsYXNzKGUpLCAiXG4iLCAgIyBOdW1lcmljDQogICJUaXBlIGRhdGEgZjoiLCBjbGFzcyhmKSwgIlxuIiAgICMgTGlzdA0KKQ0KYGBgDQoNCiMjICoqQi4gVmFyaWFiZWwgZGFuIE1hbmlwdWxhc2kgRGF0YSoqDQoNCiMjIyAqKjEuIE1lbmdpZGVudGlmaWthc2kgVmFyaWFiZWwga2UgZGFsYW0gUioqDQoNCioqeCoqOiAkMjAkDQoNCioqeSoqOiAkNSQNCg0KKip0ZXh0MSoqOiAkRGF0YSQNCg0KKip0ZXh0MioqOiAkU2NpZW5jZSQNCg0KLSBNZW1wZXJiYXJ1aSBuaWxhaSAkeCQgZGVuZ2FuIG1lbmFtYmFoa2FuICQxMCQuDQotIE1lbmdnYWJ1bmdrYW4gJHRleHQxJCBkYW4gJHRleHQyJCBrZSBkYWxhbSBrYXRhICoqRGF0YSBTY2llbmNlKiouDQotIE1lbmd1YmFoIHRla3MgZ2FidW5nYW4gbWVuamFkaSBodXJ1ZiBiZXNhci4NCmBgYHtyIGVjaG89VFJVRX0NCiMgRGVmaW5pc2kgdmFyaWFiZWwNCnggPC0gMjANCnkgPC0gNQ0KdGV4dDEgPC0gIkRhdGEiDQp0ZXh0MiA8LSAiU2NpZW5jZSINCg0KIyBPcGVyYXNpIHBhZGEgdmFyaWFiZWwNCnggPC0geCArIDEwICAjIE1lbmFtYmFoIDEwIGtlIHgNCm1lcmdlZF90ZXh0IDwtIHBhc3RlMCh0ZXh0MSwgIiAiLCB0ZXh0MikgICMgTWVuZ2dhYnVuZ2thbiB0ZWtzIHRhbnBhIHNlcA0KY2FwaXRhbGl6ZWRfdGV4dCA8LSB0b3VwcGVyKG1lcmdlZF90ZXh0KSAgIyBLb252ZXJzaSBrZSBodXJ1ZiBiZXNhcg0KDQojIE1lbmFtcGlsa2FuIGhhc2lsDQpjYXQoDQogIHNwcmludGYoIk5pbGFpIHggZGl0YW1iYWggMTA6ICVkXG4iLCB4KSwNCiAgc3ByaW50ZigiVGVrcyBnYWJ1bmdhbjogJXNcbiIsIG1lcmdlZF90ZXh0KSwNCiAgc3ByaW50ZigiVGVrcyBkYWxhbSBodXJ1ZiBiZXNhcjogJXNcbiIsIGNhcGl0YWxpemVkX3RleHQpDQopDQpgYGANCg0KIyMgKipDLiBPcGVyYXNpIEFyaXRtYXRpa2EqKg0KDQoqKlZhcmlhYmVsLXZhcmlhYmVsKioNCg0KKiphKiogOiAkMTUkDQoNCioqYioqIDogJDQkDQoNCi0gTWVuZ2hpdHVuZyBqdW1sYWgsIHNlbGlzaWgsIHBlcmthbGlhbiwgcGVtYmFnaWFuLCBkYW4gbW9kdWxvIGRhcmkgKiphKiogZGFuICoqYioqLg0KLSBNZW5naGl0dW5nICoqYSoqIHBhbmdrYXQgKipiKioNCi0gTWVtYnVhdCB2YXJpYWJlbCBiYXJ1ICoqYyA9IGEvYioqIHViYWggbWVuamFkaSBpbnRlZ2VyLg0KYGBge3IgZWNobz1UUlVFfQ0KIyBNZW5kZWZpbmlzaWthbiB2YXJpYWJlbA0KYSA8LSAxNQ0KYiA8LSA0DQoNCiMgMS4gSGl0dW5nIG9wZXJhc2kgYXJpdG1hdGlrYSBkYXNhcg0KanVtbGFoIDwtIGEgKyBiICAgICAgICAjIFBlbmp1bWxhaGFuDQpzZWxpc2loIDwtIGEgLSBiICAgICAgICMgUGVuZ3VyYW5nYW4NCnByb2R1ayA8LSBhICogYiAgICAgICAgIyBQZXJrYWxpYW4NCnBlbWJhZ2lhbiA8LSBhIC8gYiAgICAgIyBQZW1iYWdpYW4NCm1vZHVsbyA8LSBhICUlIGIgICAgICAgIyBTaXNhIHBlbWJhZ2lhbg0KDQojIDIuIEhpdHVuZyBhIHBhbmdrYXQgYg0KcGFuZ2thdCA8LSBhXmINCg0KIyAzLiBCdWF0IHZhcmlhYmVsIGJhcnUgYyBkYW4gdWJhaCBtZW5qYWRpIGludGVnZXINCmMgPC0gYXMuaW50ZWdlcihhIC8gYikNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiSGFzaWwgUGVuanVtbGFoYW46IiwganVtbGFoLCAiXG4iLA0KICAiSGFzaWwgUGVuZ3VyYW5nYW46Iiwgc2VsaXNpaCwgIlxuIiwNCiAgIkhhc2lsIFBlcmthbGlhbjoiLCBwcm9kdWssICJcbiIsDQogICJIYXNpbCBQZW1iYWdpYW46IiwgcGVtYmFnaWFuLCAiXG4iLA0KICAiSGFzaWwgTW9kdWxvOiIsIG1vZHVsbywgIlxuIiwNCiAgIkhhc2lsIFBhbmdrYXQ6IiwgcGFuZ2thdCwgIlxuIiwNCiAgIk5pbGFpIGMgc2ViYWdhaSBpbnRlZ2VyOiIsIGMsICJcbiINCikNCmBgYA0KDQojIyAqKkQuIE9wZXJhc2kgU3RyaW5nKioNCg0KKipUZXh0KiogOiAqKkhlbGxvLCBEYXRhIFNjaWVuY2UhKioNCg0KLSBFa3N0cmFrICQ1JCBrYXJha3RlciBwZXJ0YW1hIGRhcmkgdGVrcy4NCi0gTWVuZ2hpdHVuZyBqdW1sYWgga2FyYWt0ZXIgZGFsYW0gdGVrcy4NCi0gTWVuZ3ViYWggdGVrcyBtZW5qYWRpIGh1cnVmIGtlY2lsLg0KDQpgYGB7ciBlY2hvPVRSVUV9DQojIE1lbmRlZmluaXNpa2FuIHN0cmluZw0KdGVrcyA8LSAiSGVsbG8sIERhdGEgU2NpZW5jZSEiDQoNCiMgT3BlcmFzaSBzdHJpbmcNCmxpbWFfa2FyYWt0ZXJfcGVydGFtYSA8LSBzdWJzdHIodGVrcywgc3RhcnQgPSAxLCBzdG9wID0gNSkgIyBNZW5nYW1iaWwgNSBrYXJha3RlciBwZXJ0YW1hDQpwYW5qYW5nX3Rla3MgPC0gbmNoYXIodGVrcykgIyBNZW5naGl0dW5nIHRvdGFsIGthcmFrdGVyDQp0ZWtzX2xvd2VyIDwtIHRvbG93ZXIodGVrcykgIyBNZW5nb252ZXJzaSB0ZWtzIG1lbmphZGkgaHVydWYga2VjaWwNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiTGltYSBrYXJha3RlciBwZXJ0YW1hOiIsIGxpbWFfa2FyYWt0ZXJfcGVydGFtYSwgIlxuIiwNCiAgIlRvdGFsIGp1bWxhaCBrYXJha3RlcjoiLCBwYW5qYW5nX3Rla3MsICJcbiIsDQogICJUZWtzIGRhbGFtIGJlbnR1ayBrZWNpbDoiLCB0ZWtzX2xvd2VyLCAiXG4iDQopDQpgYGANCg0KIyMgKipFLiBPcGVyYXRvciBQZXJiYW5kaW5nYW4gZGFuIExvZ2lrYSoqDQoNCk1lbmdpbmdhdCB2YXJpYWJlbC12YXJpYWJlbCBiZXJpa3V0Og0KDQoqKngqKjogJDckDQoNCioqeSoqIDogJDEwJA0KDQotIFBlcmlrc2EgYXBha2FoICoqeCoqIGxlYmloIGJlc2FyIGRhcmkgKip5KiouDQotIFBlcmlrc2EgYXBha2FoICoqeCoqIGt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4gKip5KiouDQotIFBlcmlrc2EgYXBha2FoICoqeCoqIHRpZGFrICoqc2FtYSBkZW5nYW4qKiAqKnkqKi4NCi0gRXZhbHVhc2lsYWggZWtzcHJlc2kgKiooeCA+IDUpIEFORCAoeSA8IDIwKSoqLg0KDQpgYGB7ciBlY2hvPVRSVUV9DQojIE1lbmRlZmluaXNpa2FuIHZhcmlhYmVsDQp4IDwtIDcNCnkgPC0gMTANCg0KIyBPcGVyYXNpIHBlcmJhbmRpbmdhbg0KbGViaWhfYmVzYXIgPC0geCA+IHkgICMgQXBha2FoIHggbGViaWggYmVzYXIgZGFyaSB5Pw0Ka3VyYW5nX3NhbWEgPC0geCA8PSB5ICMgQXBha2FoIHgga3VyYW5nIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiB5Pw0KdGlkYWtfc2FtYSA8LSB4ICE9IHkgICMgQXBha2FoIHggdGlkYWsgc2FtYSBkZW5nYW4geT8NCg0KIyBPcGVyYXNpIGxvZ2lrYQ0KbG9naWthX2FuZCA8LSAoeCA+IDUpICYgKHkgPCAyMCkgICMgRXZhbHVhc2kgZWtzcHJlc2kgKHggPiA1KSBBTkQgKHkgPCAyMCkNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiQXBha2FoIHggbGViaWggYmVzYXIgZGFyaSB5PzoiLCBsZWJpaF9iZXNhciwgIlxuIiwNCiAgIkFwYWthaCB4IGt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4geT86Iiwga3VyYW5nX3NhbWEsICJcbiIsDQogICJBcGFrYWggeCB0aWRhayBzYW1hIGRlbmdhbiB5PzoiLCB0aWRha19zYW1hLCAiXG4iLA0KICAiRXZhbHVhc2kgKHggPiA1KSBBTkQgKHkgPCAyMCk6IiwgbG9naWthX2FuZCwgIlxuIg0KKQ0KYGBgDQoNCiMjICoqRi4gS29udmVyc2kgVGlwZSBEYXRhKioNCg0KKipudW1fc3RyKiogOiAkMTIzJA0KDQoqKm51bV9mbG9hdCoqIDogJDQ1LjY3JA0KDQotIFViYWggKipudW1fc3RyKioga2UgYmlsYW5nYW4gZGFuIHRhbWJhaGthbiAkMTAkLg0KLSBVYmFoICoqbnVtX2Zsb2F0Kioga2UgYmlsYW5nYW4gYnVsYXQuDQotIE1lbmdvbnZlcnNpICoqbnVtX2Zsb2F0Kioga2VtYmFsaSBtZW5qYWRpIHN0cmluZy4NCg0KYGBge3IgZWNobz1UUlVFfQ0KIyBNZW5kZWZpbmlzaWthbiB2YXJpYWJlbA0KbnVtX3N0ciA8LSAiMTIzIg0KbnVtX2Zsb2F0IDwtIDQ1LjY3DQoNCiMgS29udmVyc2kgZGFuIG9wZXJhc2kNCm51bV9zdHJfa2VfYmlsYW5nYW4gPC0gYXMubnVtZXJpYyhudW1fc3RyKSArIDEwICAjIFViYWggbnVtX3N0ciBrZSBiaWxhbmdhbiBkYW4gdGFtYmFoa2FuIDEwDQpudW1fZmxvYXRfa2VfYnVsYXQgPC0gYXMuaW50ZWdlcihudW1fZmxvYXQpICAgICAgIyBVYmFoIG51bV9mbG9hdCBrZSBiaWxhbmdhbiBidWxhdA0KbnVtX2Zsb2F0X2tlX3N0cmluZyA8LSBhcy5jaGFyYWN0ZXIobnVtX2Zsb2F0KSAgICMgVWJhaCBudW1fZmxvYXQga2VtYmFsaSBrZSBzdHJpbmcNCg0KIyBNZW5hbXBpbGthbiBoYXNpbA0KY2F0KA0KICAiSGFzaWwga29udmVyc2kgbnVtX3N0ciBrZSBiaWxhbmdhbiBkYW4gZGl0YW1iYWggMTA6IiwgbnVtX3N0cl9rZV9iaWxhbmdhbiwgIlxuIiwNCiAgIkhhc2lsIGtvbnZlcnNpIG51bV9mbG9hdCBrZSBiaWxhbmdhbiBidWxhdDoiLCBudW1fZmxvYXRfa2VfYnVsYXQsICJcbiIsDQogICJIYXNpbCBrb252ZXJzaSBudW1fZmxvYXQga2Ugc3RyaW5nOiIsIG51bV9mbG9hdF9rZV9zdHJpbmcsICJcbiINCikNCmBgYA0KDQojIyAqKkcuIFRhbnRhbmdhbiBCb251cyoqDQoNCkJ1YXQgcHJvZ3JhbSBpbnRlcmFrdGlmIHlhbmcgbWVtaW50YSBwZW5nZ3VuYSB1bnR1ayBtZW1hc3Vra2FuOg0KDQotIE5hbWENCi0gVXNpYQ0KLSBLb3RhIGtlbGFoaXJhbg0KDQpLZW11ZGlhbiwgY2V0YWsgb3V0cHV0IHNlYmFnYWkgYmVyaWt1dDoNCg0KKipIZWxsbyBbTmFtZV0sIHlvdSBhcmUgW0FnZV0geWVhcnMgb2xkIGFuZCBmcm9tIFtIb21ldG93bl0qKi4NCg0KYGBge3IgZWNobz1UUlVFfQ0KIyBDZWdhaCBlcnJvciBqaWthIGRpamFsYW5rYW4gbGFuZ3N1bmcgdGFucGEgcGFyYW1zDQppZiAoIWV4aXN0cygicGFyYW1zIikpIHsNCiAgcGFyYW1zIDwtIGxpc3QobmFtZSA9ICJEZWZhdWx0IE5hYmlsYSIsIGFnZSA9IDE5LCBob21ldG93biA9ICJSaWF1IikNCn0NCg0KIyBHdW5ha2FuIHBhcmFtcw0KbmFtZSA8LSBwYXJhbXMkbmFtZQ0KYWdlIDwtIHBhcmFtcyRhZ2UNCmhvbWV0b3duIDwtIHBhcmFtcyRob21ldG93bg0KDQpjYXQoIkhlbGxvIiwgbmFtZSwgIiwgeW91IGFyZSIsIGFnZSwgInllYXJzIG9sZCBhbmQgZnJvbSIsIGhvbWV0b3duLCAiXG4iKQ0KYGBg