Email             :
RPubs            : https://rpubs.com/noviaanita/
Jurusan          : Fisika Medis
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


1 R Vs Python

R dan Python adalah bahasa pemrograman yang sangat populer, dinamis, digunakan secara luas dalam komunitas data science. R lebih banyak digunakan dalam analisis statistik sementara Python menyediakan pendekatan yang lebih umum mengenai sains data (sehingga dianggap lebih mudah untuk digunakan oleh pemula). Mempelajari kedua bahasa pemrograman ini adalah solusi yang lebih bijak karena keduanya mempunyai kelebihan dan kekurangan masing-masing. R dan Python membutuhkan investasi waktu, latihan dengan tutorial, dan melakukan projek-projek kecil berbasis LAB hingga penerapan sains data pada kasus-kasus yang sebenarnya.

2 Sintaks Dasar

Suatu program di R dan Python yang terdiri dari tiga hal mendasar: Variabel, operan (nilai) dan Komentar. Variabel digunakan untuk menyimpan suatu nilai, sedangkan Komentar digunakan untuk meningkatkan pemahaman pengguna mengenai skrip atau koding.

2.1 Penugasan Variabel

Berikut ini adalah contoh penugasan variabel di dalam R

x = 9
y <- 2
4 -> z
print(c(x,y,z))
## [1] 9 2 4

2.2 Menambahkan Komentar

Berikut ini adalah contoh menambahkan komentar di dalam R

# mengganti nilai x yang sudah di rekam (komentar diawal pernyataan)
x = 9         
y <- 2 + x     # mengganti nilai y yang sudah direkam (komentar diakhir pernyataan)
y - x -> z     # sama dengan diatas

3 Operator

Operator adalah simbol yang mengarah compiler untuk melakukan berbagai macam operasi terhadap beberapa penugasan. Operator mensimulasikan berbagai operasi matematis, logika, dan keputusan yang dilakukan pada sekumpulan Bilangan Kompleks, Integer, dan Numerik sebagai penugasan masukan (input). R dan Python mendukung sebagian besar empat jenis operator biner antara satu set penugasan. Dalam ini, kita akan melihat berbagai jenis operator yang tersedia di R dan Python dan penggunaannya.

3.1 Aritmatika

Penggunaan operator aritmatika dalam program R dan Python adalah untuk mensimulasikan berbagai operasi matematika, seperti penambahan, pengurangan, pekalian, pembagian, dan modulo. Operator aritmatika yang dilakukan bisa saja berupa nilai skalar, bilangan kompleks, atau vektor.

3.1.1 Penjumlahan

Berikut ini adalah contoh penjumlahan di dalam R

x <- c(3,8,4)           # memuat vektor x
y <- c(2,5,7)           # memuat vektor y
cat("hasil penjumlahan vektor x dan y :", x + y, "\n")
## hasil penjumlahan vektor x dan y : 5 13 11

3.1.2 Pengurangan

Berikut ini adalah contoh pengurangan di dalam R

x <- c(4,7,2)           # memuat vektor x
y <- c(5,6,7)           # memuat vektor y
cat("hasil pengurangan vektor x dan y :", x - y, "\n")
## hasil pengurangan vektor x dan y : -1 1 -5

3.1.3 Perkalian

Berikut ini adalah contoh perkalian di dalam R

x <- c(4,6,2)           # memuat vektor x
y <- c(5,8,2)           # memuat vektor y
cat("hasil perkalian vektor x dan y :", x * y, "\n")
## hasil perkalian vektor x dan y : 20 48 4

3.1.4 Pembagian

Berikut ini adalah contoh pembagian di dalam R

x <- c(3,9,2)           # memuat vektor x
y <- c(4,5,3)           # memuat vektor y
cat("hasil pembagian vektor x dan y :", x / y, "\n")
## hasil pembagian vektor x dan y : 0.75 1.8 0.6666667

3.1.5 Pemangkatan

Berikut ini adalah contoh pemangkatan di dalam R

x <- c(3,6,7)           # memuat vektor x
y <- c(2,4,9)           # memuat vektor y
cat("hasil pemangkatan vektor x dan y :", x ^ y, "\n")
## hasil pemangkatan vektor x dan y : 9 1296 40353607

3.1.6 Modulo

Berikut ini adalah contoh modulo di dalam R

x <- c(2,4,3)           # memuat vektor x
y <- c(5,4,3)           # memuat vektor y
cat("Modulo vektor x dan y :", x %% y, "\n")
## Modulo vektor x dan y : 2 0 0

3.2 Relasional

Operator relasional melakukan operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Mengembalikan nilai Boolean TRUE jika operan pertama memenuhi relasi dibandingkan dengan operan kedua. Nilai TRUE selalu dianggap lebih besar dari FALSE.

3.2.1 Kurang dari

Berikut ini adalah contoh relasional kurang dari di dalam R

x <- c(1,5,2)           # memuat vektor x
y <- c(1,3,4)           # memuat vektor y
cat("vektor x kurang dari vektor y :", x < y, "\n")
## vektor x kurang dari vektor y : FALSE FALSE TRUE

3.2.2 Kurang dari sama dengan

Berikut ini adalah contoh relasional kurang dari sama dengan di dalam R

x <- c(2,5,7)           # memuat vektor x
y <- c(1,3,4)           # memuat vektor y
cat("vektor x kurang dari sama dengan vektor y :", x <= y, "\n")
## vektor x kurang dari sama dengan vektor y : FALSE FALSE FALSE

3.2.3 Lebih besar dari

Berikut ini adalah contoh relasional lebih dari di dalam R

x <- c(1,6,15)          # memuat vektor x
y <- c(3,9,11)          # memuat vektor y
cat("vektor x lebih besar dari vektor y :", x > y, "\n")
## vektor x lebih besar dari vektor y : FALSE FALSE TRUE

3.2.4 Lebih besar dari sama dengan

Berikut ini adalah contoh relasional lebih besar dari sama dengan di dalam R

x <- c(2,6,7)           # memuat vektor x
y <- c(1,9,5)           # memuat vektor y
cat("vektor x lebih besar dari sama dengan vektor y :", x >= y, "\n")
## vektor x lebih besar dari sama dengan vektor y : TRUE FALSE TRUE

3.2.5 Sama dengan

Berikut ini adalah contoh relasional sama dengan di dalam R

x <- c(1,2,3)           # memuat vektor x
y <- c(9,8,7)           # memuat vektor y
cat("vektor x sama dengan vektor y :", x == y, "\n")
## vektor x sama dengan vektor y : FALSE FALSE FALSE

3.2.6 Tidak sama dengan

Berikut ini adalah contoh relasional tidak sama dengan di dalam R

x <- c(2,5,3)           # memuat vektor x
y <- c(1,6,4)           # memuat vektor y
cat("vektor x tidak sama dengan vektor y :", x != y, "\n")
## vektor x tidak sama dengan vektor y : TRUE TRUE TRUE

3.3 Logika

Operator logis mensimulasikan operasi keutusan, berdasarkan operator yang ditentukan antara operan, yang kemudian dievaluasi ke nilai Boolean Benar atau Salah. Nilai bilangan bulat bukan nol dianggap sebagai nilai BENAR, baik itu bilangan kompleks atau bilangan real.

3.3.1 Operasi Negasi (NOT)

Berikut ini adalah contoh dari operasi negasi (NOT) di dalam R

x <- c(1.2,TRUE,3)
y <- c(TRUE,FALSE,2+5i)
cat("Logika negasi (~) untuk vektor x :", !x, "\n")
## Logika negasi (~) untuk vektor x : FALSE FALSE FALSE
cat("Logika negasi (NOT) untuk vektor y :", !y, "\n")
## Logika negasi (NOT) untuk vektor y : FALSE TRUE FALSE

3.3.2 Logika konjungsi (AND)

Berikut ini adalah contoh dari logika konjungsi (AND) di dalam R

x <- c(0.3,TRUE,2)
y <- c(TRUE,FALSE,0)
cat("Logika konjungsi (AND) :", x & y, "\n")
## Logika konjungsi (AND) : TRUE FALSE FALSE

3.3.3 Logika Disjungsi (OR)

Berikut ini adalah contoh dari logika disjungsi (OR) di dalam R

x <- c(0.1,TRUE,2)
y <- c(TRUE,1,0)
cat("Logika disjungsi (OR) :", x | y, "\n")
## Logika disjungsi (OR) : TRUE TRUE TRUE

3.3.4 Logika Disjungsi Parsial

Berikut ini adalah contoh dari logika disjungsi parsial di dalam R

x <- c(TRUE,TRUE,FALSE)
y <- c(FALSE,TRUE,FALSE)
cat("Logika disjungsi parsial :", x || y, "\n")
## Logika disjungsi parsial : TRUE

3.4 Lain-lain

Berikut ini merupakan beberapa operator yang mungkin akan anda perlukan saat menggunakan R

3.4.1 Akar

Berikut ini adalah contoh bentuk akar di dalam R

x <- c(6,3,2)           # memuat vektor x
y <- c(4,2,5)           # memuat vektor y
sqrt(x*y)               # bentuk akar
## [1] 4.898979 2.449490 3.162278

3.4.2 Logaritma

Berikut ini adalah contoh logaritma di dalam R

x <- c(3,4,2)           # memuat vektor x
y <- c(2,5,6)           # memuat vektor y
log(x)                  # logaritma x
## [1] 1.0986123 1.3862944 0.6931472
log(y)                  # logaritma y
## [1] 0.6931472 1.6094379 1.7917595

3.4.3 Eksponen

Berikut ini adalah contoh eksponen di dalam R

x <- c(7,4,2)           # memuat vektor x
y <- c(1,5,3)           # memuat vektor y
exp(x)                  # bentuk eksponen x
## [1] 1096.633158   54.598150    7.389056
exp(y)                  # bentuk eksponen y
## [1]   2.718282 148.413159  20.085537

3.4.4 Tanda kurung

Berikut ini adalah contoh penggunaan tanda kurung di dalam R

x <- c(3,4,2)           # memuat vektor x
y <- c(4,7,1)           # memuat vektor y
(x+y) * x               # penggunaan tanda kurung
## [1] 21 44  6

4 Tipe data

Tipe data merupakan konsep penting dalam suatu pemrograman. Berikut ini adalah koding R yang dapat digunakan untuk menetapkan tipe data:

d1 = 2.1                # memuat nilai desimal
d2 = as.integer(4)      # memuat nilai integer
d2 = 8L                 # cara lain untuk memuat nilai integer
d3 = c(TRUE,FALSE)      # Bolean/Logical 
d3 = as.logical(c(1,8)) # cara lain untuk memuat Bolean/Logical
d4 = c("a",'b','123')   # String/Character
d5 = 1 + 5i             # Complex

Untuk memeriksa tipe data dalam R:

class(d2)               # cetak nama kelas variabel
## [1] "integer"
typeof(d5)              # cetak tipe variabel x
## [1] "complex"

5 Bantuan

Salah satu bagian penting dalam bekerja dengan bahasa R adalah mengetahui di mana mencari bantuan. R memiliki beberapa fasiitas in-line, selain berbagai sumber daya bantuan di R. Anda dapat menggunakan bantuan untuk fungsi tertentu.

help.start()            # menu bantuan lokal berbasis web
?help                   # menu bantuan lokal berbasis web
?class                  # bantuan untuk fungsi 'class'
help(class)             # bantuan untuk fungsi 'class'
??class                 # jika tidak tahu nama fungsi yang dicari
help.search('class')    # jika tidak tahu nama fungsi yang dicari
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIlR1Z2FzIDIiDQphdXRob3I6ICJOb3ZpYSBBbml0YSAoMjAyMTQ1MjAwMDgpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9Im5vdmlhLkpQRyIvPiANCg0KYGBge3IgbG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICczMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImxvZ29tYXRhbmEucG5nIikNCmBgYA0KDQpFbWFpbCAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs6ICBub3ZpYWFsYmwwMkBnbWFpbC5jb20gPGJyPg0KUlB1YnMgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogaHR0cHM6Ly9ycHVicy5jb20vbm92aWFhbml0YS8gPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbRmlzaWthIE1lZGlzXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEFSQSBDZW50ZXIsIE1hdGFuYSBVbml2ZXJzaXR5IFRvd2VyIDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IEpsLiBDQkQgQmFyYXQgS2F2LCBSVC4xLCBDdXJ1ZyBTYW5nZXJlbmcsIEtlbGFwYSBEdWEsIFRhbmdlcmFuZywgQmFudGVuIDE1ODEwLg0KDQoqKioqDQoNCiMgUiBWcyBQeXRob24NCg0KUiBkYW4gUHl0aG9uIGFkYWxhaCBiYWhhc2EgcGVtcm9ncmFtYW4geWFuZyBzYW5nYXQgcG9wdWxlciwgZGluYW1pcywgZGlndW5ha2FuIHNlY2FyYSBsdWFzIGRhbGFtIGtvbXVuaXRhcyBkYXRhIHNjaWVuY2UuIFIgbGViaWggYmFueWFrIGRpZ3VuYWthbiBkYWxhbSBhbmFsaXNpcyBzdGF0aXN0aWsgc2VtZW50YXJhIFB5dGhvbiBtZW55ZWRpYWthbiBwZW5kZWthdGFuIHlhbmcgbGViaWggdW11bSBtZW5nZW5haSBzYWlucyBkYXRhIChzZWhpbmdnYSBkaWFuZ2dhcCBsZWJpaCBtdWRhaCB1bnR1ayBkaWd1bmFrYW4gb2xlaCBwZW11bGEpLiBNZW1wZWxhamFyaSBrZWR1YSBiYWhhc2EgcGVtcm9ncmFtYW4gaW5pIGFkYWxhaCBzb2x1c2kgeWFuZyBsZWJpaCBiaWphayBrYXJlbmEga2VkdWFueWEgbWVtcHVueWFpIGtlbGViaWhhbiBkYW4ga2VrdXJhbmdhbiBtYXNpbmctbWFzaW5nLiBSIGRhbiBQeXRob24gbWVtYnV0dWhrYW4gaW52ZXN0YXNpIHdha3R1LCBsYXRpaGFuIGRlbmdhbiB0dXRvcmlhbCwgZGFuIG1lbGFrdWthbiBwcm9qZWstcHJvamVrIGtlY2lsIGJlcmJhc2lzIExBQiBoaW5nZ2EgcGVuZXJhcGFuIHNhaW5zIGRhdGEgcGFkYSBrYXN1cy1rYXN1cyB5YW5nIHNlYmVuYXJueWEuDQoNCiMgU2ludGFrcyBEYXNhcg0KDQpTdWF0dSBwcm9ncmFtIGRpIFIgZGFuIFB5dGhvbiB5YW5nIHRlcmRpcmkgZGFyaSB0aWdhIGhhbCBtZW5kYXNhcjogVmFyaWFiZWwsIG9wZXJhbiAobmlsYWkpIGRhbiBLb21lbnRhci4gVmFyaWFiZWwgZGlndW5ha2FuIHVudHVrIG1lbnlpbXBhbiBzdWF0dSBuaWxhaSwgc2VkYW5na2FuIEtvbWVudGFyIGRpZ3VuYWthbiB1bnR1ayBtZW5pbmdrYXRrYW4gcGVtYWhhbWFuIHBlbmdndW5hIG1lbmdlbmFpIHNrcmlwIGF0YXUga29kaW5nLg0KDQoNCg0KIyMgUGVudWdhc2FuIFZhcmlhYmVsDQoNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVudWdhc2FuIHZhcmlhYmVsIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA9IDkNCnkgPC0gMg0KNCAtPiB6DQpwcmludChjKHgseSx6KSkNCmBgYA0KDQoNCiMjIE1lbmFtYmFoa2FuIEtvbWVudGFyDQoNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggbWVuYW1iYWhrYW4ga29tZW50YXIgZGkgZGFsYW0gUg0KYGBge3J9DQojIG1lbmdnYW50aSBuaWxhaSB4IHlhbmcgc3VkYWggZGkgcmVrYW0gKGtvbWVudGFyIGRpYXdhbCBwZXJueWF0YWFuKQ0KeCA9IDkgICAgICAgICANCnkgPC0gMiArIHggICAgICMgbWVuZ2dhbnRpIG5pbGFpIHkgeWFuZyBzdWRhaCBkaXJla2FtIChrb21lbnRhciBkaWFraGlyIHBlcm55YXRhYW4pDQp5IC0geCAtPiB6ICAgICAjIHNhbWEgZGVuZ2FuIGRpYXRhcw0KYGBgDQoNCg0KDQojIE9wZXJhdG9yDQoNCk9wZXJhdG9yIGFkYWxhaCBzaW1ib2wgeWFuZyBtZW5nYXJhaCBjb21waWxlciB1bnR1ayBtZWxha3VrYW4gYmVyYmFnYWkgbWFjYW0gb3BlcmFzaSB0ZXJoYWRhcCBiZWJlcmFwYSBwZW51Z2FzYW4uIE9wZXJhdG9yIG1lbnNpbXVsYXNpa2FuIGJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlzLCBsb2dpa2EsIGRhbiBrZXB1dHVzYW4geWFuZyBkaWxha3VrYW4gcGFkYSBzZWt1bXB1bGFuIEJpbGFuZ2FuIEtvbXBsZWtzLCBJbnRlZ2VyLCBkYW4gTnVtZXJpayBzZWJhZ2FpIHBlbnVnYXNhbiBtYXN1a2FuIChpbnB1dCkuIFIgZGFuIFB5dGhvbiBtZW5kdWt1bmcgc2ViYWdpYW4gYmVzYXIgZW1wYXQgamVuaXMgb3BlcmF0b3IgYmluZXIgYW50YXJhIHNhdHUgc2V0IHBlbnVnYXNhbi4gRGFsYW0gaW5pLCBraXRhIGFrYW4gbWVsaWhhdCBiZXJiYWdhaSBqZW5pcyBvcGVyYXRvciB5YW5nIHRlcnNlZGlhIGRpIFIgZGFuIFB5dGhvbiBkYW4gcGVuZ2d1bmFhbm55YS4NCg0KDQojIyBBcml0bWF0aWthDQoNClBlbmdndW5hYW4gb3BlcmF0b3IgYXJpdG1hdGlrYSBkYWxhbSBwcm9ncmFtIFIgZGFuIFB5dGhvbiBhZGFsYWggdW50dWsgbWVuc2ltdWxhc2lrYW4gYmVyYmFnYWkgb3BlcmFzaSBtYXRlbWF0aWthLCBzZXBlcnRpIHBlbmFtYmFoYW4sIHBlbmd1cmFuZ2FuLCBwZWthbGlhbiwgcGVtYmFnaWFuLCBkYW4gbW9kdWxvLiBPcGVyYXRvciBhcml0bWF0aWthIHlhbmcgZGlsYWt1a2FuIGJpc2Egc2FqYSBiZXJ1cGEgbmlsYWkgc2thbGFyLCBiaWxhbmdhbiBrb21wbGVrcywgYXRhdSB2ZWt0b3IuDQoNCg0KIyMjIFBlbmp1bWxhaGFuDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIHBlbmp1bWxhaGFuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDMsOCw0KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYygyLDUsNykgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoImhhc2lsIHBlbmp1bWxhaGFuIHZla3RvciB4IGRhbiB5IDoiLCB4ICsgeSwgIlxuIikNCmBgYA0KDQojIyMgUGVuZ3VyYW5nYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVuZ3VyYW5nYW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoNCw3LDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDUsNiw3KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgiaGFzaWwgcGVuZ3VyYW5nYW4gdmVrdG9yIHggZGFuIHkgOiIsIHggLSB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBQZXJrYWxpYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVya2FsaWFuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDQsNiwyKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYyg1LDgsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoImhhc2lsIHBlcmthbGlhbiB2ZWt0b3IgeCBkYW4geSA6IiwgeCAqIHksICJcbiIpDQpgYGANCg0KIyMjIFBlbWJhZ2lhbg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBwZW1iYWdpYW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMyw5LDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDQsNSwzKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgiaGFzaWwgcGVtYmFnaWFuIHZla3RvciB4IGRhbiB5IDoiLCB4IC8geSwgIlxuIikNCmBgYA0KDQojIyMgUGVtYW5na2F0YW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVtYW5na2F0YW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMyw2LDcpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDIsNCw5KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgiaGFzaWwgcGVtYW5na2F0YW4gdmVrdG9yIHggZGFuIHkgOiIsIHggXiB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBNb2R1bG8NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggbW9kdWxvIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDIsNCwzKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYyg1LDQsMykgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoIk1vZHVsbyB2ZWt0b3IgeCBkYW4geSA6IiwgeCAlJSB5LCAiXG4iKQ0KYGBgDQoNCg0KIyMgUmVsYXNpb25hbA0KDQpPcGVyYXRvciByZWxhc2lvbmFsIG1lbGFrdWthbiBvcGVyYXNpIHBlcmJhbmRpbmdhbiBhbnRhcmEgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBzZXRpYXAgb3BlcmFuLiBNZW5nZW1iYWxpa2FuIG5pbGFpIEJvb2xlYW4gVFJVRSBqaWthIG9wZXJhbiBwZXJ0YW1hIG1lbWVudWhpIHJlbGFzaSBkaWJhbmRpbmdrYW4gZGVuZ2FuIG9wZXJhbiBrZWR1YS4gTmlsYWkgVFJVRSBzZWxhbHUgZGlhbmdnYXAgbGViaWggYmVzYXIgZGFyaSBGQUxTRS4NCg0KDQojIyMgS3VyYW5nIGRhcmkNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcmVsYXNpb25hbCBrdXJhbmcgZGFyaSBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYygxLDUsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoMSwzLDQpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KY2F0KCJ2ZWt0b3IgeCBrdXJhbmcgZGFyaSB2ZWt0b3IgeSA6IiwgeCA8IHksICJcbiIpDQpgYGANCg0KIyMjIEt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIHJlbGFzaW9uYWwga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMiw1LDcpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDEsMyw0KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgidmVrdG9yIHgga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gdmVrdG9yIHkgOiIsIHggPD0geSwgIlxuIikNCmBgYA0KDQojIyMgTGViaWggYmVzYXIgZGFyaQ0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCByZWxhc2lvbmFsIGxlYmloIGRhcmkgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMSw2LDE1KSAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDMsOSwxMSkgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgidmVrdG9yIHggbGViaWggYmVzYXIgZGFyaSB2ZWt0b3IgeSA6IiwgeCA+IHksICJcbiIpDQpgYGANCg0KIyMjIExlYmloIGJlc2FyIGRhcmkgc2FtYSBkZW5nYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcmVsYXNpb25hbCBsZWJpaCBiZXNhciBkYXJpIHNhbWEgZGVuZ2FuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDIsNiw3KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYygxLDksNSkgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoInZla3RvciB4IGxlYmloIGJlc2FyIGRhcmkgc2FtYSBkZW5nYW4gdmVrdG9yIHkgOiIsIHggPj0geSwgIlxuIikNCmBgYA0KDQojIyMgU2FtYSBkZW5nYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcmVsYXNpb25hbCBzYW1hIGRlbmdhbiBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYygxLDIsMykgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoOSw4LDcpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KY2F0KCJ2ZWt0b3IgeCBzYW1hIGRlbmdhbiB2ZWt0b3IgeSA6IiwgeCA9PSB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBUaWRhayBzYW1hIGRlbmdhbg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCByZWxhc2lvbmFsIHRpZGFrIHNhbWEgZGVuZ2FuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDIsNSwzKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYygxLDYsNCkgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoInZla3RvciB4IHRpZGFrIHNhbWEgZGVuZ2FuIHZla3RvciB5IDoiLCB4ICE9IHksICJcbiIpDQpgYGANCg0KDQojIyBMb2dpa2ENCg0KT3BlcmF0b3IgbG9naXMgbWVuc2ltdWxhc2lrYW4gb3BlcmFzaSBrZXV0dXNhbiwgYmVyZGFzYXJrYW4gb3BlcmF0b3IgeWFuZyBkaXRlbnR1a2FuIGFudGFyYSBvcGVyYW4sIHlhbmcga2VtdWRpYW4gZGlldmFsdWFzaSBrZSBuaWxhaSBCb29sZWFuIEJlbmFyIGF0YXUgU2FsYWguIE5pbGFpIGJpbGFuZ2FuIGJ1bGF0IGJ1a2FuIG5vbCBkaWFuZ2dhcCBzZWJhZ2FpIG5pbGFpIEJFTkFSLCBiYWlrIGl0dSBiaWxhbmdhbiBrb21wbGVrcyBhdGF1IGJpbGFuZ2FuIHJlYWwuDQoNCiMjIyBPcGVyYXNpIE5lZ2FzaSAoTk9UKQ0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBkYXJpIG9wZXJhc2kgbmVnYXNpIChOT1QpIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDEuMixUUlVFLDMpDQp5IDwtIGMoVFJVRSxGQUxTRSwyKzVpKQ0KY2F0KCJMb2dpa2EgbmVnYXNpICh+KSB1bnR1ayB2ZWt0b3IgeCA6IiwgIXgsICJcbiIpDQpgYGANCmBgYHtyfQ0KY2F0KCJMb2dpa2EgbmVnYXNpIChOT1QpIHVudHVrIHZla3RvciB5IDoiLCAheSwgIlxuIikNCmBgYA0KDQojIyMgTG9naWthIGtvbmp1bmdzaSAoQU5EKQ0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBkYXJpIGxvZ2lrYSBrb25qdW5nc2kgKEFORCkgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMC4zLFRSVUUsMikNCnkgPC0gYyhUUlVFLEZBTFNFLDApDQpjYXQoIkxvZ2lrYSBrb25qdW5nc2kgKEFORCkgOiIsIHggJiB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBMb2dpa2EgRGlzanVuZ3NpIChPUikNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggZGFyaSBsb2dpa2EgZGlzanVuZ3NpIChPUikgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMC4xLFRSVUUsMikNCnkgPC0gYyhUUlVFLDEsMCkNCmNhdCgiTG9naWthIGRpc2p1bmdzaSAoT1IpIDoiLCB4IHwgeSwgIlxuIikNCmBgYA0KDQojIyMgTG9naWthIERpc2p1bmdzaSBQYXJzaWFsIA0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBkYXJpIGxvZ2lrYSBkaXNqdW5nc2kgcGFyc2lhbCBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYyhUUlVFLFRSVUUsRkFMU0UpDQp5IDwtIGMoRkFMU0UsVFJVRSxGQUxTRSkNCmNhdCgiTG9naWthIGRpc2p1bmdzaSBwYXJzaWFsIDoiLCB4IHx8IHksICJcbiIpDQpgYGANCg0KIyMgTGFpbi1sYWluDQpCZXJpa3V0IGluaSBtZXJ1cGFrYW4gYmViZXJhcGEgb3BlcmF0b3IgeWFuZyBtdW5na2luIGFrYW4gYW5kYSBwZXJsdWthbiBzYWF0IG1lbmdndW5ha2FuIFINCg0KIyMjIEFrYXINCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggYmVudHVrIGFrYXIgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoNiwzLDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDQsMiw1KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCnNxcnQoeCp5KSAgICAgICAgICAgICAgICMgYmVudHVrIGFrYXINCmBgYA0KDQojIyMgTG9nYXJpdG1hDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIGxvZ2FyaXRtYSBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYygzLDQsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoMiw1LDYpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KbG9nKHgpICAgICAgICAgICAgICAgICAgIyBsb2dhcml0bWEgeA0KbG9nKHkpICAgICAgICAgICAgICAgICAgIyBsb2dhcml0bWEgeQ0KYGBgDQoNCiMjIyBFa3Nwb25lbg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBla3Nwb25lbiBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYyg3LDQsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoMSw1LDMpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KZXhwKHgpICAgICAgICAgICAgICAgICAgIyBiZW50dWsgZWtzcG9uZW4geA0KZXhwKHkpICAgICAgICAgICAgICAgICAgIyBiZW50dWsgZWtzcG9uZW4geQ0KYGBgDQoNCiMjIyBUYW5kYSBrdXJ1bmcNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVuZ2d1bmFhbiB0YW5kYSBrdXJ1bmcgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMyw0LDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDQsNywxKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCih4K3kpICogeCAgICAgICAgICAgICAgICMgcGVuZ2d1bmFhbiB0YW5kYSBrdXJ1bmcNCmBgYA0KDQojIFRpcGUgZGF0YQ0KDQpUaXBlIGRhdGEgbWVydXBha2FuIGtvbnNlcCBwZW50aW5nIGRhbGFtIHN1YXR1IHBlbXJvZ3JhbWFuLiBCZXJpa3V0IGluaSBhZGFsYWgga29kaW5nIFIgeWFuZyBkYXBhdCBkaWd1bmFrYW4gdW50dWsgbWVuZXRhcGthbiB0aXBlIGRhdGE6DQoNCmBgYHtyfQ0KZDEgPSAyLjEgICAgICAgICAgICAgICAgIyBtZW11YXQgbmlsYWkgZGVzaW1hbA0KZDIgPSBhcy5pbnRlZ2VyKDQpICAgICAgIyBtZW11YXQgbmlsYWkgaW50ZWdlcg0KZDIgPSA4TCAgICAgICAgICAgICAgICAgIyBjYXJhIGxhaW4gdW50dWsgbWVtdWF0IG5pbGFpIGludGVnZXINCmQzID0gYyhUUlVFLEZBTFNFKSAgICAgICMgQm9sZWFuL0xvZ2ljYWwgDQpkMyA9IGFzLmxvZ2ljYWwoYygxLDgpKSAjIGNhcmEgbGFpbiB1bnR1ayBtZW11YXQgQm9sZWFuL0xvZ2ljYWwNCmQ0ID0gYygiYSIsJ2InLCcxMjMnKSAgICMgU3RyaW5nL0NoYXJhY3Rlcg0KZDUgPSAxICsgNWkgICAgICAgICAgICAgIyBDb21wbGV4DQpgYGANCg0KVW50dWsgbWVtZXJpa3NhIHRpcGUgZGF0YSBkYWxhbSBSOg0KYGBge3J9DQpjbGFzcyhkMikgICAgICAgICAgICAgICAjIGNldGFrIG5hbWEga2VsYXMgdmFyaWFiZWwNCnR5cGVvZihkNSkgICAgICAgICAgICAgICMgY2V0YWsgdGlwZSB2YXJpYWJlbCB4DQpgYGANCg0KIyBCYW50dWFuDQoNClNhbGFoIHNhdHUgYmFnaWFuIHBlbnRpbmcgZGFsYW0gYmVrZXJqYSBkZW5nYW4gYmFoYXNhIFIgYWRhbGFoIG1lbmdldGFodWkgZGkgbWFuYSBtZW5jYXJpIGJhbnR1YW4uIFIgbWVtaWxpa2kgYmViZXJhcGEgZmFzaWl0YXMgaW4tbGluZSwgc2VsYWluIGJlcmJhZ2FpIHN1bWJlciBkYXlhIGJhbnR1YW4gZGkgUi4gQW5kYSBkYXBhdCBtZW5nZ3VuYWthbiBiYW50dWFuIHVudHVrIGZ1bmdzaSB0ZXJ0ZW50dS4NCg0KYGBge3J9Iw0KaGVscC5zdGFydCgpICAgICAgICAgICAgIyBtZW51IGJhbnR1YW4gbG9rYWwgYmVyYmFzaXMgd2ViDQo/aGVscCAgICAgICAgICAgICAgICAgICAjIG1lbnUgYmFudHVhbiBsb2thbCBiZXJiYXNpcyB3ZWINCj9jbGFzcyAgICAgICAgICAgICAgICAgICMgYmFudHVhbiB1bnR1ayBmdW5nc2kgJ2NsYXNzJw0KaGVscChjbGFzcykgICAgICAgICAgICAgIyBiYW50dWFuIHVudHVrIGZ1bmdzaSAnY2xhc3MnDQo/P2NsYXNzICAgICAgICAgICAgICAgICAjIGppa2EgdGlkYWsgdGFodSBuYW1hIGZ1bmdzaSB5YW5nIGRpY2FyaQ0KaGVscC5zZWFyY2goJ2NsYXNzJykgICAgIyBqaWthIHRpZGFrIHRhaHUgbmFtYSBmdW5nc2kgeWFuZyBkaWNhcmkNCmBgYA0KDQo=