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


1 R VS Python

Bahasa R dan Python adalah bahasa pemrograman yang popular terutama pada data science karena dapat membantu menganalisis penelitian pada data. Python merupakan bahasa pemrograman tinggi dimana bisa menggunakan instruksi multi guan dengan metode object oriented programming dan menggunakan semantik dinamis untuk memberikan tingkat keterbacaan syntax dimana mendukung multi platform dan multi system, pengembangan program dapat dilakukan dengan cepat dan kode yang jumlahnya lebih sedikit. Sedangkan R merupakan bahasa pemrograma terlebih yang digunakan untuk komputasi statistik dan grafik dimana cocok digunakan utnuk riset dan akademis, syntax yang mudah dipelajar dengan sifat terbuka dimana dapat menambahkan fitur-fitur tambahan dalam bentuk paket.

1.1 Results

1.1.1 Persamaan

Pada bahasa pemrogaram R dan Python memiliki beberapa persamaan yaitu sebagai berikut.

  1. R dan Python adalah bahasa pemrograman multi-paradigma sehingga keduanya mendukung Pemrograman Berorientasi Objek, Pemrograman Imperatif, Pemrograman Prosedural, dan lainnya.

  2. Bahasa yang ditafsirkan.

  3. Digunakan dalam pengembangan algoritma.

  4. Bahasa pemrograman tingkat tinggi.

  5. Bersifat gratis dan open source.

  6. Keduanya dapat diintegrasikan dengan aplikasi lain seperti MySQL, Oracle, GitHub, dll.

  7. Keduanya mendukung file yang berbeda seperti file CSV, file excel, file XML dan file JSON.

  8. Kedua bahasa ters

1.1.2 Perbedaan

Selain memiliki persamaan, R dengan Python juga memiliki perbedaan seperti pada ruang lingkup, pada R hanya mencakup data science dan statsitik namun pada Pyhton mencakup aplikasi dan industri. Dalam pengguanaannya, R mencakup akademis dan penelitian sedangkan Python programmers dan developers. Pada IDE ( user interface), R mengacu pada Rstudio sedangkan Python mengacu pada spyder, Jupyter, Notebook, Pycharm, dan lainnya. Ekstensi pada R yaitu .R dan .Rmd, sedangkan pada Python yaitu .py dan .ipynb . Pada Struktur data, R mencakup vektor, list, matriks, array, faktor, dan bingkai data sedangkan pada Pyhton mencakup list, dictionary dan tupel. Packages dan library pada R mencakup tidyverse, ggplot2, caret, dan zoo, sedangkan pada python mencakup padas, scipy, scikit-learn, tensorflow, dan caret.

R memiliki kelebihan yaitu memiliki banyak library dan kualitas visualisasi grafik yang dihasilkan sangat tinggi, sedangkan pada Python memiliki kelebihan yaitu sistematika penulisan script yang sudah dibaca, fokus pada kecepatan komputasi, pengembangan web, jaringan, otomatisasi, dan lainnya. R juga memiliki kekurangan yaitu ketergantungan antar library, sedangkan pada Python memiliki kekurangan yaitu library lebih sedikit dibandingkan R. Integrasi pada R yaitu fitur Rmarkdown dan shiny, sedangkan pada Python yaitu intregasi aplikasi lebih luas.

2 Syntax Dasar

Pada bahasa pemrograman R dan Python ini terdiri dari variabel yang berguna untuk menyimpan suatu nilai dan komentar yang berguna untuk meningkatkan pemahaman pengguna mengenai skrip atau codding.

2.1 Penugasan Variabel

Pada R, perintah penugasan variabel dapat dinotasikan dengan 3 cara yaitu :

  1. = yang digunakan untuk penugasan sederhana

  2. <- yang digunakan untuk penugasan dari sisi kiri, dan

  3. -> yang digunana untuk penugasan dari didi kanan.

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

2.2 Penambahan Komentar

Kegunaan penambahan kolom komentar pada script R ataupun Python berguna untuk memberi keterangan agar mudah memahami makna dari penggunaan perintahnya. Komentar ini bersifat informasi dengan penulisan awal maupun akhir dengan menggunakan # .

Pada R,

# mengganti nilai x yang sudah direkam ( komentar di awal pernyataan)
x=12
z<- x+y #menggantikan nilai z yang sudah direkam ( komentar di akhir pernyataan)
x+y->z # sama dengan diatas

3 Operator

Operator merupakan simbol yang mengarahkan complier untuk melakukan berbagai macam operasi terhadap bebarapa penugasan. Operator ini mensimulasikan aritmatika, logika, dan lain sebagainya. Dalam R dan Python ini mendukung empat jenis operator sebagai berikut.

3.1 Aritmatika

Operator ini digunakan untuk mensimulasi berbegaia macam operasi matematika namun pada R dan Pyhton memiliki simbol yang berbeda. Pada R operator penjumlahan (+), pengurangan (-), perkalian(* ), pembagian(/), pemangkatan(^), dan modulo(%%). Namun berbeda dengan Python yaitu R operator penjumlahan (+), pengurangan (-), perkalian(* ), pembagian(/), pemangkatan(**), dan modulo(%)

Pada R, adapun contoh sebagai berikut.

x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
x+y # hasil penjumlahan vektor x dan vektor  y
## [1]  4  7 11
print(x+y) #hasil penjumlahan vektor x dan vektor y 
## [1]  4  7 11
print(x*y) #hasil perkalian vektor x dan vektor y
## [1]  4 12 30
print(x-y) #hasil pengurangan vektor x dan vektor y
## [1]  0 -1 -1
print(x/y) #hasil pembagian vektor x dan vektor y
## [1] 1.0000000 0.7500000 0.8333333
print(x^y) #hasil permangkatan vektor x dan vektor  y
## [1]     4    81 15625
print(x%%y) #hasil modulo vektor x dan vektor y
## [1] 0 3 5

Selain itu juga dapat menambahakan komentar pada hasil perhitungan di dalam R dengan cara sebagai berikut.

x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
cat("Penjumlahan vektor x dan y:", x + y, "\n")
## Penjumlahan vektor x dan y: 4 7 11
cat("pengurangan vektor x dan vektor y :",x - y, "\n")
## pengurangan vektor x dan vektor y : 0 -1 -1
cat("perkalian vektor x dan vektor y :",x * y, "\n")
## perkalian vektor x dan vektor y : 4 12 30
cat("pembagian vektor x dan vektor y :", x / y, "\n")
## pembagian vektor x dan vektor y : 1 0.75 0.8333333
cat("pemangkatan vektor x dan vektor y :",x ^ y, "\n")
## pemangkatan vektor x dan vektor y : 4 81 15625
cat("modulo vektor x dan vektor y :" ,x %% y, "\n")
## modulo vektor x dan vektor y : 0 3 5

3.2 Relasional

Pada R dan Python ini memiliki oeprator relasional yang sama guna untuk melakukan perbandingan antara elemen yang bersesuaian pada setiap opran dengna mengembalikan nilai TRUE jika operan pertama memenuhi relasi dibandingan dengan operan lainnya dimana nilai TRUE ini jauh lebih besar daripada nilai FALSE.

Operan relasional pada R dan Pyhton sebagai berikut.

Operator kurang dari (<) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih kecil daripada operan ekdua dan mengembalikan FALSE.

Operan kurang dari sama dengan (<=) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama kurang dari atau sama dengan elemen operan kedua dan mengembalikan FALSE.

Operan lebih besar dari (>) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih besar daripada operan kedua dan mengembalikan FALSE.

Operan lebih dari sama dengan (>=) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih besar dari atau sama dengan elemen operan kedua dan mengembalikan FALSE.

Operan sama dengan (==) berguna untuk mengembalikan TRUE jika dan hanya jika kedua sisi memiliki nilai yang sama.

Operan tidak sama dengan (!=) berguna untuk mengembalikan TRUE jika elemen yang bersesuaian pada oprena pertama tidak sama dengan dari operan kedua.

x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
cat("vektor x kurang dari vektor y :",x < y, "\n")
## vektor x kurang dari vektor y : FALSE TRUE TRUE
cat("vektor x kurang dari sama dengan vektor y :",x <= y, "\n")
## vektor x kurang dari sama dengan vektor y : TRUE TRUE TRUE
cat("vektor x lebih besar dari vektor y :",x > y,"\n")
## vektor x lebih besar dari vektor y : FALSE FALSE FALSE
cat("vektor x lebih besar dari sama dengan vektor  y :",x >= y, "\n")
## vektor x lebih besar dari sama dengan vektor  y : TRUE FALSE FALSE
cat("vektor x sama dengan vektor  y :",x == y, "\n")
## vektor x sama dengan vektor  y : TRUE FALSE FALSE
cat("vektor x tidak sama dengan vektor  y :",x != y, "\n")
## vektor x tidak sama dengan vektor  y : FALSE TRUE TRUE

3.3 Logika

Operator logika ini mensimulasikan operasi keputusan dengan mengevaluasi ke nilai TRUE atau FALSE. Simbol pada R dan Python pada operasional logika ini memiliki kesamaan sebagai berikut.

Operator NOT(!) ini merupakan operasi negasi atau kebalikan pasa status elemen operan.

Operator AND(&) ini merupakan membalikkan TRUE jika kedua operan bernilai benar.

Operan OR(|) ini merupakan menggembalikan TRUE jika salah satu operan adalah benar.

Operan XOR (^) ini merupakan menggembalikan TRUE, jika salah satu dari kedua elemen pertama operan bernilai benar.

Pada R, adapun contoh sebagai berikut.

x<-c(0,TRUE,FALSE)
y<-c(TRUE,0.1,4+3i)
#melakukan operasi logikan pada operan
cat("logika negasi(~) untuk vektor x:",!x, "\n")
## logika negasi(~) untuk vektor x: TRUE FALSE TRUE
cat("logika negasi(~) untuk vektor y:",!y, "\n")
## logika negasi(~) untuk vektor y: FALSE FALSE FALSE
cat("logika konjungsi(Dan):",x & y, "\n")
## logika konjungsi(Dan): FALSE TRUE FALSE
cat("logika disjungsi(Or):",x | y, "\n")
## logika disjungsi(Or): TRUE TRUE TRUE
cat("logika disjungsi parsial(Or):",x||y, "\n")
## logika disjungsi parsial(Or): TRUE

3.4 Lainnya

Pada R, adapun contoh sebagai berikut.

x<-c(2,3,5) #memuat vektor x
y<-c(2,4,6) #memuat vektor y
sqrt(x*y) #bentuk akar
## [1] 2.000000 3.464102 5.477226
log(x) #logaritma
## [1] 0.6931472 1.0986123 1.6094379
exp(y) #eksponen
## [1]   7.389056  54.598150 403.428793
(x/y)+y #tanda kurung
## [1] 3.000000 4.750000 6.833333

4 Tipe Data

Tipe data pada R dan Pyhton memanglah sangat penting. Pada tipe data R dan Pyhton memiliki kesamaan maupun perbedaan Sebagai berikut.

Tipe data Double atau Float (5.6) dengan bilangan yang mempunyai koman. Tipe data integer (5) merupakan bilangan bulat 1,2,…,n. Tipe data String atau character (‘Dsiencelabs’) ini merupakan karakter atau kalimat bisa berupa huruf , angka, dan lainnya dengan diampit tanda (‘) atau (“).

Namun berbeda dengan Tipe data Bolean atau Logical dan Complex pada R dan Pyhton yang berbeda. Tipe data Logical ada R (TRUE/FALSE) namun pada Python (True/False) ini merupakan benak nilai 1 dan salah nilai 0. Tipe data Complex pada R (1+5i) namun pada Pyhton (1+5j) ini merupakan pasangan angka real dan imajiner.

Pada R, adapun contoh sebagai berikut.

c1 <- 1.3                #memuat nilai desimal
c2 <- as.integer(1)     #tetapkan nilai integer
c2 <- 1L                 #caralain unutk memual nilai integer di R
c3 <- c(TRUE,FALSE)      #bolean atau logical
c3 <- as.logical(c(0,1)) #caralain untuk memuat bolean atau logical
c4 <- c("d",'e', '456')  #string atau character
c5 <- 3 + 5i             #complex

Contoh :

class(c1)               #cetak nama kelar variabel
## [1] "numeric"
typeof(c1)              #cetak tipe variabel x
## [1] "double"

5 Bantuan

Pada R, adapun contoh sebagai berikut.

# help.start()         # Menu untuk mendapat menavigasi bantuan lokal berbasis web
# ?help                # Menu untuk mendapat menavigasi bantuan lokal berbasis web
# ? class              # mendapatkan bantuan untuk fungsi class
# help(class)          # mendapatkan bantuan untuk fungsi class
# ??class              # jika tidak mengetahui fungsi yang dicari
# help.search('class') # jika tidak mengetahui fungsi yang dicari
LS0tDQp0aXRsZTogIkFMT0dBUklUTUEgREFOIFNUUlVLVFVSIERBVEEiDQpzdWJ0aXRsZTogIlRVR0FTIDIiDQphdXRob3I6ICJCcmlnaXRhIFRpYXJhIEVsZ2l0eWFuYSBNZWxhbnRpa2EgKDIwMjA0OTIwMDAxKSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGh0bWxfZG9jdW1lbnQ6IG51bGwNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogc2FuZHN0b25lDQogICAgY3NzOiBzdHlsZTEuY3NzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQotLS0NCg0KDQo8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbjogMHB4IDEwMHB4IDBweCAwcHg7IHdpZHRoOjI1JSIgc3JjPSJmb3RvcHJpYmFkaS5qcGciLz4gDQoNCmBgYHtyIGxvZ28sIGVjaG89RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGggPSAnMzAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJsb2dvLnBuZyIpDQpgYGANCg0KRW1haWwgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7OiAgYnJpZ2l0YS5tZWxhbnRpa2FAc3R1ZGVudC5tYXRhbmF1bml2ZXJzaXR5LmFjLmlkIDxicj4NClJQdWJzICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IGh0dHBzOi8vcnB1YnMuY29tL2JyaWdpdGF0aWFyYWVtLyA8YnI+DQpKdXJ1c2FuICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IFtTdGF0aXN0aWthXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEFSQSBDZW50ZXIsIE1hdGFuYSBVbml2ZXJzaXR5IFRvd2VyIDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IEpsLiBDQkQgQmFyYXQgS2F2LCBSVC4xLCBDdXJ1ZyBTYW5nZXJlbmcsIEtlbGFwYSBEdWEsIFRhbmdlcmFuZywgQmFudGVuIDE1ODEwLg0KDQoqKioqDQoNCiMgUiBWUyBQeXRob24gDQoNCkJhaGFzYSBSIGRhbiBQeXRob24gYWRhbGFoIGJhaGFzYSBwZW1yb2dyYW1hbiB5YW5nIHBvcHVsYXIgdGVydXRhbWEgcGFkYSBkYXRhIHNjaWVuY2Uga2FyZW5hIGRhcGF0IG1lbWJhbnR1IG1lbmdhbmFsaXNpcyBwZW5lbGl0aWFuIHBhZGEgZGF0YS4gUHl0aG9uIG1lcnVwYWthbiBiYWhhc2EgcGVtcm9ncmFtYW4gdGluZ2dpIGRpbWFuYSBiaXNhIG1lbmdndW5ha2FuIGluc3RydWtzaSBtdWx0aSBndWFuIGRlbmdhbiBtZXRvZGUgb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nIGRhbiBtZW5nZ3VuYWthbiBzZW1hbnRpayBkaW5hbWlzIHVudHVrIG1lbWJlcmlrYW4gdGluZ2thdCBrZXRlcmJhY2FhbiBzeW50YXggZGltYW5hIG1lbmR1a3VuZyBtdWx0aSBwbGF0Zm9ybSBkYW4gbXVsdGkgc3lzdGVtLCBwZW5nZW1iYW5nYW4gcHJvZ3JhbSBkYXBhdCBkaWxha3VrYW4gZGVuZ2FuIGNlcGF0IGRhbiBrb2RlIHlhbmcganVtbGFobnlhIGxlYmloIHNlZGlraXQuIFNlZGFuZ2thbiBSIG1lcnVwYWthbiBiYWhhc2EgcGVtcm9ncmFtYSB0ZXJsZWJpaCB5YW5nIGRpZ3VuYWthbiB1bnR1ayBrb21wdXRhc2kgc3RhdGlzdGlrIGRhbiBncmFmaWsgZGltYW5hIGNvY29rIGRpZ3VuYWthbiB1dG51ayByaXNldCBkYW4gYWthZGVtaXMsIHN5bnRheCB5YW5nIG11ZGFoIGRpcGVsYWphciBkZW5nYW4gc2lmYXQgdGVyYnVrYSBkaW1hbmEgZGFwYXQgbWVuYW1iYWhrYW4gZml0dXItZml0dXIgdGFtYmFoYW4gZGFsYW0gYmVudHVrIHBha2V0LiANCg0KIyMgUmVzdWx0cyB7LnRhYnNldH0NCg0KIyMjIFBlcnNhbWFhbg0KDQpQYWRhIGJhaGFzYSBwZW1yb2dhcmFtIFIgZGFuIFB5dGhvbiBtZW1pbGlraSBiZWJlcmFwYSBwZXJzYW1hYW4geWFpdHUgc2ViYWdhaSBiZXJpa3V0LiANCg0KMS4JUiBkYW4gUHl0aG9uIGFkYWxhaCBiYWhhc2EgcGVtcm9ncmFtYW4gbXVsdGktcGFyYWRpZ21hIHNlaGluZ2dhIGtlZHVhbnlhIG1lbmR1a3VuZyBQZW1yb2dyYW1hbiBCZXJvcmllbnRhc2kgT2JqZWssIFBlbXJvZ3JhbWFuIEltcGVyYXRpZiwgUGVtcm9ncmFtYW4gUHJvc2VkdXJhbCwgZGFuIGxhaW5ueWEuDQoNCjIuCUJhaGFzYSB5YW5nIGRpdGFmc2lya2FuLg0KDQozLglEaWd1bmFrYW4gZGFsYW0gcGVuZ2VtYmFuZ2FuIGFsZ29yaXRtYS4NCg0KNC4JQmFoYXNhIHBlbXJvZ3JhbWFuIHRpbmdrYXQgdGluZ2dpLg0KDQo1LglCZXJzaWZhdCBncmF0aXMgZGFuIG9wZW4gc291cmNlLg0KDQo2LglLZWR1YW55YSBkYXBhdCBkaWludGVncmFzaWthbiBkZW5nYW4gYXBsaWthc2kgbGFpbiBzZXBlcnRpIE15U1FMLCBPcmFjbGUsIEdpdEh1YiwgZGxsLg0KDQo3LglLZWR1YW55YSBtZW5kdWt1bmcgZmlsZSB5YW5nIGJlcmJlZGEgc2VwZXJ0aSBmaWxlIENTViwgZmlsZSBleGNlbCwgZmlsZSBYTUwgZGFuIGZpbGUgSlNPTi4NCg0KOC4JS2VkdWEgYmFoYXNhIHRlcnMNCg0KIyMjIFBlcmJlZGFhbiANCg0KU2VsYWluIG1lbWlsaWtpIHBlcnNhbWFhbiwgUiBkZW5nYW4gUHl0aG9uIGp1Z2EgbWVtaWxpa2kgcGVyYmVkYWFuIHNlcGVydGkgcGFkYSBydWFuZyBsaW5na3VwLCBwYWRhIFIgaGFueWEgbWVuY2FrdXAgZGF0YSBzY2llbmNlIGRhbiBzdGF0c2l0aWsgbmFtdW4gcGFkYSBQeWh0b24gbWVuY2FrdXAgYXBsaWthc2kgZGFuIGluZHVzdHJpLiBEYWxhbSBwZW5nZ3VhbmFhbm55YSwgUiBtZW5jYWt1cCBha2FkZW1pcyBkYW4gcGVuZWxpdGlhbiBzZWRhbmdrYW4gUHl0aG9uIHByb2dyYW1tZXJzIGRhbiBkZXZlbG9wZXJzLiAgUGFkYSBJREUgKCB1c2VyIGludGVyZmFjZSksIFIgbWVuZ2FjdSBwYWRhIFJzdHVkaW8gc2VkYW5na2FuIFB5dGhvbiBtZW5nYWN1IHBhZGEgc3B5ZGVyLCBKdXB5dGVyLCBOb3RlYm9vaywgUHljaGFybSwgZGFuIGxhaW5ueWEuIEVrc3RlbnNpIHBhZGEgUiB5YWl0dSAuUiBkYW4gLlJtZCwgc2VkYW5na2FuIHBhZGEgUHl0aG9uIHlhaXR1IC5weSBkYW4gLmlweW5iIC4gUGFkYSBTdHJ1a3R1ciBkYXRhLCBSIG1lbmNha3VwIHZla3RvciwgbGlzdCwgbWF0cmlrcywgYXJyYXksIGZha3RvciwgZGFuIGJpbmdrYWkgZGF0YSBzZWRhbmdrYW4gcGFkYSBQeWh0b24gbWVuY2FrdXAgbGlzdCwgZGljdGlvbmFyeSBkYW4gdHVwZWwuIFBhY2thZ2VzIGRhbiBsaWJyYXJ5IHBhZGEgUiBtZW5jYWt1cCB0aWR5dmVyc2UsIGdncGxvdDIsIGNhcmV0LCBkYW4gem9vLCBzZWRhbmdrYW4gcGFkYSBweXRob24gbWVuY2FrdXAgcGFkYXMsIHNjaXB5LCBzY2lraXQtbGVhcm4sIHRlbnNvcmZsb3csIGRhbiBjYXJldC4gDQoNClIgbWVtaWxpa2kga2VsZWJpaGFuIHlhaXR1IG1lbWlsaWtpIGJhbnlhayBsaWJyYXJ5IGRhbiBrdWFsaXRhcyB2aXN1YWxpc2FzaSBncmFmaWsgeWFuZyBkaWhhc2lsa2FuIHNhbmdhdCB0aW5nZ2ksIHNlZGFuZ2thbiBwYWRhIFB5dGhvbiBtZW1pbGlraSBrZWxlYmloYW4geWFpdHUgc2lzdGVtYXRpa2EgcGVudWxpc2FuIHNjcmlwdCB5YW5nIHN1ZGFoIGRpYmFjYSwgZm9rdXMgcGFkYSBrZWNlcGF0YW4ga29tcHV0YXNpLCBwZW5nZW1iYW5nYW4gd2ViLCBqYXJpbmdhbiwgb3RvbWF0aXNhc2ksIGRhbiBsYWlubnlhLiBSIGp1Z2EgbWVtaWxpa2kga2VrdXJhbmdhbiB5YWl0dSBrZXRlcmdhbnR1bmdhbiBhbnRhciBsaWJyYXJ5LCBzZWRhbmdrYW4gcGFkYSBQeXRob24gbWVtaWxpa2kga2VrdXJhbmdhbiB5YWl0dSBsaWJyYXJ5IGxlYmloIHNlZGlraXQgZGliYW5kaW5na2FuIFIuIEludGVncmFzaSBwYWRhIFIgeWFpdHUgZml0dXIgUm1hcmtkb3duIGRhbiBzaGlueSwgc2VkYW5na2FuIHBhZGEgUHl0aG9uIHlhaXR1IGludHJlZ2FzaSBhcGxpa2FzaSBsZWJpaCBsdWFzLiANCg0KIyBTeW50YXggRGFzYXINCg0KUGFkYSBiYWhhc2EgcGVtcm9ncmFtYW4gUiBkYW4gUHl0aG9uIGluaSB0ZXJkaXJpIGRhcmkgdmFyaWFiZWwgeWFuZyBiZXJndW5hIHVudHVrIG1lbnlpbXBhbiBzdWF0dSBuaWxhaSBkYW4ga29tZW50YXIgeWFuZyBiZXJndW5hIHVudHVrIG1lbmluZ2thdGthbiBwZW1haGFtYW4gcGVuZ2d1bmEgbWVuZ2VuYWkgc2tyaXAgYXRhdSBjb2RkaW5nLiANCg0KIyMgUGVudWdhc2FuIFZhcmlhYmVsDQoNClBhZGEgUiwgcGVyaW50YWggcGVudWdhc2FuIHZhcmlhYmVsIGRhcGF0IGRpbm90YXNpa2FuIGRlbmdhbiAzIGNhcmEgeWFpdHUgOg0KDQoxLgk9ICB5YW5nIGRpZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gc2VkZXJoYW5hDQoNCjIuCTwtIHlhbmcgZGlndW5ha2FuIHVudHVrIHBlbnVnYXNhbiBkYXJpIHNpc2kga2lyaSwgZGFuDQoNCjMuCS0+IHlhbmcgZGlndW5hbmEgdW50dWsgcGVudWdhc2FuIGRhcmkgZGlkaSBrYW5hbi4NCg0KYGBge3J9DQp4PTMNCnk8LTUNCjItPnoNCnByaW50KGMoeCx5LHopKQ0KDQpgYGANCg0KIyMgUGVuYW1iYWhhbiBLb21lbnRhcg0KDQpLZWd1bmFhbiBwZW5hbWJhaGFuIGtvbG9tIGtvbWVudGFyIHBhZGEgc2NyaXB0IFIgYXRhdXB1biBQeXRob24gYmVyZ3VuYSB1bnR1ayBtZW1iZXJpIGtldGVyYW5nYW4gYWdhciBtdWRhaCBtZW1haGFtaSBtYWtuYSBkYXJpIHBlbmdndW5hYW4gcGVyaW50YWhueWEuIEtvbWVudGFyIGluaSBiZXJzaWZhdCBpbmZvcm1hc2kgZGVuZ2FuIHBlbnVsaXNhbiBhd2FsIG1hdXB1biBha2hpciBkZW5nYW4gbWVuZ2d1bmFrYW4gIyAuDQoNClBhZGEgUiwNCg0KYGBge3J9DQojIG1lbmdnYW50aSBuaWxhaSB4IHlhbmcgc3VkYWggZGlyZWthbSAoIGtvbWVudGFyIGRpIGF3YWwgcGVybnlhdGFhbikNCng9MTINCno8LSB4K3kgI21lbmdnYW50aWthbiBuaWxhaSB6IHlhbmcgc3VkYWggZGlyZWthbSAoIGtvbWVudGFyIGRpIGFraGlyIHBlcm55YXRhYW4pDQp4K3ktPnogIyBzYW1hIGRlbmdhbiBkaWF0YXMNCmBgYA0KDQojIE9wZXJhdG9yDQoNCk9wZXJhdG9yIG1lcnVwYWthbiBzaW1ib2wgeWFuZyBtZW5nYXJhaGthbiBjb21wbGllciB1bnR1ayBtZWxha3VrYW4gYmVyYmFnYWkgbWFjYW0gb3BlcmFzaSB0ZXJoYWRhcCBiZWJhcmFwYSBwZW51Z2FzYW4uIE9wZXJhdG9yIGluaSBtZW5zaW11bGFzaWthbiBhcml0bWF0aWthLCBsb2dpa2EsIGRhbiBsYWluIHNlYmFnYWlueWEuIERhbGFtIFIgZGFuIFB5dGhvbiBpbmkgbWVuZHVrdW5nIGVtcGF0IGplbmlzIG9wZXJhdG9yIHNlYmFnYWkgYmVyaWt1dC4NCg0KIyMgQXJpdG1hdGlrYQ0KDQpPcGVyYXRvciBpbmkgZGlndW5ha2FuIHVudHVrIG1lbnNpbXVsYXNpIGJlcmJlZ2FpYSBtYWNhbSBvcGVyYXNpIG1hdGVtYXRpa2EgbmFtdW4gcGFkYSBSIGRhbiBQeWh0b24gbWVtaWxpa2kgc2ltYm9sIHlhbmcgYmVyYmVkYS4gUGFkYSBSIG9wZXJhdG9yIHBlbmp1bWxhaGFuICgrKSwgcGVuZ3VyYW5nYW4gKC0pLCBwZXJrYWxpYW4oKiApLCBwZW1iYWdpYW4oLyksIHBlbWFuZ2thdGFuKF4pLCBkYW4gbW9kdWxvKCUlKS4gTmFtdW4gYmVyYmVkYSBkZW5nYW4gUHl0aG9uIHlhaXR1IFIgb3BlcmF0b3IgcGVuanVtbGFoYW4gKCspLCBwZW5ndXJhbmdhbiAoLSksIHBlcmthbGlhbigqICksIHBlbWJhZ2lhbigvKSwgcGVtYW5na2F0YW4oKiopLCBkYW4gbW9kdWxvKCUpDQoNClBhZGEgUiwgYWRhcHVuIGNvbnRvaCBzZWJhZ2FpIGJlcmlrdXQuDQoNCmBgYHtyfQ0KeDwtYygyLDMsNSkgI21lbXVhdCB2ZWt0b3IgeA0KeTwtYygyLDQsNikgI21lbXVhdCB2ZWt0b3IgeQ0KeCt5ICMgaGFzaWwgcGVuanVtbGFoYW4gdmVrdG9yIHggZGFuIHZla3RvciAgeQ0KDQpgYGANCg0KYGBge3J9DQpwcmludCh4K3kpICNoYXNpbCBwZW5qdW1sYWhhbiB2ZWt0b3IgeCBkYW4gdmVrdG9yIHkgDQpgYGANCg0KYGBge3J9DQpwcmludCh4KnkpICNoYXNpbCBwZXJrYWxpYW4gdmVrdG9yIHggZGFuIHZla3RvciB5DQpgYGANCg0KDQpgYGB7cn0NCnByaW50KHgteSkgI2hhc2lsIHBlbmd1cmFuZ2FuIHZla3RvciB4IGRhbiB2ZWt0b3IgeQ0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoeC95KSAjaGFzaWwgcGVtYmFnaWFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeQ0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoeF55KSAjaGFzaWwgcGVybWFuZ2thdGFuIHZla3RvciB4IGRhbiB2ZWt0b3IgIHkNCmBgYA0KDQpgYGB7cn0NCnByaW50KHglJXkpICNoYXNpbCBtb2R1bG8gdmVrdG9yIHggZGFuIHZla3RvciB5DQpgYGANCg0KU2VsYWluIGl0dSBqdWdhIGRhcGF0IG1lbmFtYmFoYWthbiBrb21lbnRhciBwYWRhIGhhc2lsIHBlcmhpdHVuZ2FuIGRpIGRhbGFtIFIgZGVuZ2FuIGNhcmEgc2ViYWdhaSBiZXJpa3V0Lg0KDQpgYGB7cn0NCng8LWMoMiwzLDUpICNtZW11YXQgdmVrdG9yIHgNCnk8LWMoMiw0LDYpICNtZW11YXQgdmVrdG9yIHkNCmBgYA0KDQpgYGB7cn0NCmNhdCgiUGVuanVtbGFoYW4gdmVrdG9yIHggZGFuIHk6IiwgeCArIHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoInBlbmd1cmFuZ2FuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6Iix4IC0geSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgicGVya2FsaWFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6Iix4ICogeSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgicGVtYmFnaWFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6IiwgeCAvIHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoInBlbWFuZ2thdGFuIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6Iix4IF4geSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibW9kdWxvIHZla3RvciB4IGRhbiB2ZWt0b3IgeSA6IiAseCAlJSB5LCAiXG4iKQ0KYGBgDQoNCiMjIFJlbGFzaW9uYWwNCg0KUGFkYSBSIGRhbiBQeXRob24gaW5pIG1lbWlsaWtpIG9lcHJhdG9yIHJlbGFzaW9uYWwgeWFuZyBzYW1hIGd1bmEgdW50dWsgbWVsYWt1a2FuIHBlcmJhbmRpbmdhbiBhbnRhcmEgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBzZXRpYXAgb3ByYW4gZGVuZ25hIG1lbmdlbWJhbGlrYW4gbmlsYWkgVFJVRSBqaWthIG9wZXJhbiBwZXJ0YW1hIG1lbWVudWhpIHJlbGFzaSBkaWJhbmRpbmdhbiBkZW5nYW4gb3BlcmFuIGxhaW5ueWEgZGltYW5hIG5pbGFpIFRSVUUgaW5pIGphdWggbGViaWggYmVzYXIgZGFyaXBhZGEgbmlsYWkgRkFMU0UuDQoNCipPcGVyYW4gcmVsYXNpb25hbCBwYWRhIFIgZGFuIFB5aHRvbiBzZWJhZ2FpIGJlcmlrdXQuKg0KDQpPcGVyYXRvciBrdXJhbmcgZGFyaSAoPCkgYmVyZ3VuYSB1bnR1ayBtZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiBwZXJ0YW1hIGxlYmloIGtlY2lsIGRhcmlwYWRhIG9wZXJhbiBla2R1YSBkYW4gbWVuZ2VtYmFsaWthbiBGQUxTRS4NCg0KT3BlcmFuIGt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuICg8PSkgYmVyZ3VuYSB1bnR1ayBtZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiBwZXJ0YW1hIGt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4gZWxlbWVuIG9wZXJhbiBrZWR1YSBkYW4gbWVuZ2VtYmFsaWthbiBGQUxTRS4NCg0KT3BlcmFuIGxlYmloIGJlc2FyIGRhcmkgKD4pIGJlcmd1bmEgdW50dWsgbWVuZ2VtYmFsaWthbiBUUlVFIGppa2EgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBvcGVyYW4gcGVydGFtYSBsZWJpaCBiZXNhciBkYXJpcGFkYSBvcGVyYW4ga2VkdWEgZGFuIG1lbmdlbWJhbGlrYW4gRkFMU0UuDQoNCk9wZXJhbiBsZWJpaCBkYXJpIHNhbWEgZGVuZ2FuICg+PSkgYmVyZ3VuYSB1bnR1ayBtZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiBwZXJ0YW1hIGxlYmloIGJlc2FyIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiBlbGVtZW4gb3BlcmFuIGtlZHVhIGRhbiBtZW5nZW1iYWxpa2FuIEZBTFNFLg0KDQpPcGVyYW4gc2FtYSBkZW5nYW4gKD09KSBiZXJndW5hIHVudHVrIG1lbmdlbWJhbGlrYW4gVFJVRSBqaWthICBkYW4gaGFueWEgamlrYSAga2VkdWEgc2lzaSBtZW1pbGlraSBuaWxhaSB5YW5nIHNhbWEuDQoNCk9wZXJhbiB0aWRhayBzYW1hIGRlbmdhbiAoIT0pIGJlcmd1bmEgdW50dWsgbWVuZ2VtYmFsaWthbiBUUlVFIGppa2EgIGVsZW1lbiB5YW5nIGJlcnNlc3VhaWFuIHBhZGEgb3ByZW5hIHBlcnRhbWEgdGlkYWsgc2FtYSBkZW5nYW4gZGFyaSBvcGVyYW4ga2VkdWEuDQoNCmBgYHtyfQ0KeDwtYygyLDMsNSkgI21lbXVhdCB2ZWt0b3IgeA0KeTwtYygyLDQsNikgI21lbXVhdCB2ZWt0b3IgeQ0KDQpgYGANCg0KYGBge3J9DQpjYXQoInZla3RvciB4IGt1cmFuZyBkYXJpIHZla3RvciB5IDoiLHggPCB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJ2ZWt0b3IgeCBrdXJhbmcgZGFyaSBzYW1hIGRlbmdhbiB2ZWt0b3IgeSA6Iix4IDw9IHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoInZla3RvciB4IGxlYmloIGJlc2FyIGRhcmkgdmVrdG9yIHkgOiIseCA+IHksIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgidmVrdG9yIHggbGViaWggYmVzYXIgZGFyaSBzYW1hIGRlbmdhbiB2ZWt0b3IgIHkgOiIseCA+PSB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJ2ZWt0b3IgeCBzYW1hIGRlbmdhbiB2ZWt0b3IgIHkgOiIseCA9PSB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJ2ZWt0b3IgeCB0aWRhayBzYW1hIGRlbmdhbiB2ZWt0b3IgIHkgOiIseCAhPSB5LCAiXG4iKQ0KYGBgDQoNCiMjIExvZ2lrYQ0KDQpPcGVyYXRvciBsb2dpa2EgaW5pIG1lbnNpbXVsYXNpa2FuIG9wZXJhc2kga2VwdXR1c2FuIGRlbmdhbiBtZW5nZXZhbHVhc2kga2UgbmlsYWkgVFJVRSBhdGF1IEZBTFNFLiBTaW1ib2wgcGFkYSBSIGRhbiBQeXRob24gcGFkYSBvcGVyYXNpb25hbCBsb2dpa2EgaW5pIG1lbWlsaWtpIGtlc2FtYWFuIHNlYmFnYWkgYmVyaWt1dC4NCg0KT3BlcmF0b3IgTk9UKCEpIGluaSBtZXJ1cGFrYW4gb3BlcmFzaSBuZWdhc2kgYXRhdSBrZWJhbGlrYW4gcGFzYSBzdGF0dXMgZWxlbWVuIG9wZXJhbi4NCg0KT3BlcmF0b3IgQU5EKCYpIGluaSBtZXJ1cGFrYW4gbWVtYmFsaWtrYW4gVFJVRSBqaWthIGtlZHVhIG9wZXJhbiBiZXJuaWxhaSBiZW5hci4NCg0KT3BlcmFuIE9SKHwpIGluaSBtZXJ1cGFrYW4gbWVuZ2dlbWJhbGlrYW4gVFJVRSBqaWthIHNhbGFoIHNhdHUgb3BlcmFuIGFkYWxhaCBiZW5hci4NCg0KT3BlcmFuIFhPUiAoXikgaW5pIG1lcnVwYWthbiBtZW5nZ2VtYmFsaWthbiBUUlVFLCBqaWthIHNhbGFoIHNhdHUgZGFyaSBrZWR1YSBlbGVtZW4gcGVydGFtYSBvcGVyYW4gYmVybmlsYWkgYmVuYXIuDQoNCipQYWRhIFIsIGFkYXB1biBjb250b2ggc2ViYWdhaSBiZXJpa3V0LioNCg0KYGBge3J9DQp4PC1jKDAsVFJVRSxGQUxTRSkNCnk8LWMoVFJVRSwwLjEsNCszaSkNCiNtZWxha3VrYW4gb3BlcmFzaSBsb2dpa2FuIHBhZGEgb3BlcmFuDQpgYGANCg0KYGBge3J9DQpjYXQoImxvZ2lrYSBuZWdhc2kofikgdW50dWsgdmVrdG9yIHg6IiwheCwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibG9naWthIG5lZ2FzaSh+KSB1bnR1ayB2ZWt0b3IgeToiLCF5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJsb2dpa2Ega29uanVuZ3NpKERhbik6Iix4ICYgeSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibG9naWthIGRpc2p1bmdzaShPcik6Iix4IHwgeSwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgibG9naWthIGRpc2p1bmdzaSBwYXJzaWFsKE9yKToiLHh8fHksICJcbiIpDQpgYGANCg0KIyMgTGFpbm55YQ0KDQpQYWRhIFIsIGFkYXB1biBjb250b2ggc2ViYWdhaSBiZXJpa3V0Lg0KDQpgYGB7cn0NCng8LWMoMiwzLDUpICNtZW11YXQgdmVrdG9yIHgNCnk8LWMoMiw0LDYpICNtZW11YXQgdmVrdG9yIHkNCmBgYA0KDQpgYGB7cn0NCnNxcnQoeCp5KSAjYmVudHVrIGFrYXINCmBgYA0KDQpgYGB7cn0NCmxvZyh4KSAjbG9nYXJpdG1hDQpgYGANCg0KYGBge3J9DQpleHAoeSkgI2Vrc3BvbmVuDQpgYGANCg0KYGBge3J9DQooeC95KSt5ICN0YW5kYSBrdXJ1bmcNCmBgYA0KDQojIFRpcGUgRGF0YQ0KDQpUaXBlIGRhdGEgcGFkYSBSIGRhbiBQeWh0b24gbWVtYW5nbGFoIHNhbmdhdCBwZW50aW5nLiBQYWRhIHRpcGUgZGF0YSBSIGRhbiBQeWh0b24gbWVtaWxpa2kga2VzYW1hYW4gbWF1cHVuIHBlcmJlZGFhbiBTZWJhZ2FpIGJlcmlrdXQuDQoNClRpcGUgZGF0YSBEb3VibGUgYXRhdSBGbG9hdCAoNS42KSBkZW5nYW4gYmlsYW5nYW4geWFuZyBtZW1wdW55YWkga29tYW4uIFRpcGUgZGF0YSBpbnRlZ2VyICg1KSBtZXJ1cGFrYW4gYmlsYW5nYW4gYnVsYXQgMSwyLC4uLixuLiBUaXBlIGRhdGEgU3RyaW5nIGF0YXUgY2hhcmFjdGVyICjigJhEc2llbmNlbGFic+KAmSkgaW5pIG1lcnVwYWthbiBrYXJha3RlciBhdGF1IGthbGltYXQgYmlzYSBiZXJ1cGEgaHVydWYgLCBhbmdrYSwgZGFuIGxhaW5ueWEgZGVuZ2FuIGRpYW1waXQgdGFuZGEgKOKAmCkgYXRhdSAo4oCcKS4NCg0KTmFtdW4gYmVyYmVkYSBkZW5nYW4gVGlwZSBkYXRhIEJvbGVhbiBhdGF1IExvZ2ljYWwgZGFuIENvbXBsZXggcGFkYSBSIGRhbiBQeWh0b24geWFuZyBiZXJiZWRhLiBUaXBlIGRhdGEgTG9naWNhbCBhZGEgUiAoVFJVRS9GQUxTRSkgbmFtdW4gcGFkYSBQeXRob24gKFRydWUvRmFsc2UpIGluaSBtZXJ1cGFrYW4gYmVuYWsgbmlsYWkgMSBkYW4gc2FsYWggbmlsYWkgMC4gVGlwZSBkYXRhIENvbXBsZXggcGFkYSBSICgxKzVpKSBuYW11biBwYWRhIFB5aHRvbiAoMSs1aikgaW5pIG1lcnVwYWthbiBwYXNhbmdhbiBhbmdrYSByZWFsIGRhbiBpbWFqaW5lci4NCg0KDQoqUGFkYSBSLCBhZGFwdW4gY29udG9oIHNlYmFnYWkgYmVyaWt1dC4qDQoNCmBgYHtyfQ0KYzEgPC0gMS4zICAgICAgICAgICAgICAgICNtZW11YXQgbmlsYWkgZGVzaW1hbA0KYzIgPC0gYXMuaW50ZWdlcigxKSAgICAgI3RldGFwa2FuIG5pbGFpIGludGVnZXINCmMyIDwtIDFMICAgICAgICAgICAgICAgICAjY2FyYWxhaW4gdW51dGsgbWVtdWFsIG5pbGFpIGludGVnZXIgZGkgUg0KYzMgPC0gYyhUUlVFLEZBTFNFKSAgICAgICNib2xlYW4gYXRhdSBsb2dpY2FsDQpjMyA8LSBhcy5sb2dpY2FsKGMoMCwxKSkgI2NhcmFsYWluIHVudHVrIG1lbXVhdCBib2xlYW4gYXRhdSBsb2dpY2FsDQpjNCA8LSBjKCJkIiwnZScsICc0NTYnKSAgI3N0cmluZyBhdGF1IGNoYXJhY3Rlcg0KYzUgPC0gMyArIDVpICAgICAgICAgICAgICNjb21wbGV4DQpgYGANCg0KKkNvbnRvaCA6Kg0KDQpgYGB7cn0NCmNsYXNzKGMxKSAgICAgICAgICAgICAgICNjZXRhayBuYW1hIGtlbGFyIHZhcmlhYmVsDQpgYGANCg0KYGBge3J9DQp0eXBlb2YoYzEpICAgICAgICAgICAgICAjY2V0YWsgdGlwZSB2YXJpYWJlbCB4DQpgYGANCg0KIyBCYW50dWFuDQoNClBhZGEgUiwgYWRhcHVuIGNvbnRvaCBzZWJhZ2FpIGJlcmlrdXQuDQoNCmBgYHtyfQ0KIyBoZWxwLnN0YXJ0KCkgICAgICAgICAjIE1lbnUgdW50dWsgbWVuZGFwYXQgbWVuYXZpZ2FzaSBiYW50dWFuIGxva2FsIGJlcmJhc2lzIHdlYg0KIyA/aGVscCAgICAgICAgICAgICAgICAjIE1lbnUgdW50dWsgbWVuZGFwYXQgbWVuYXZpZ2FzaSBiYW50dWFuIGxva2FsIGJlcmJhc2lzIHdlYg0KIyA/IGNsYXNzICAgICAgICAgICAgICAjIG1lbmRhcGF0a2FuIGJhbnR1YW4gdW50dWsgZnVuZ3NpIGNsYXNzDQojIGhlbHAoY2xhc3MpICAgICAgICAgICMgbWVuZGFwYXRrYW4gYmFudHVhbiB1bnR1ayBmdW5nc2kgY2xhc3MNCiMgPz9jbGFzcyAgICAgICAgICAgICAgIyBqaWthIHRpZGFrIG1lbmdldGFodWkgZnVuZ3NpIHlhbmcgZGljYXJpDQojIGhlbHAuc2VhcmNoKCdjbGFzcycpICMgamlrYSB0aWRhayBtZW5nZXRhaHVpIGZ1bmdzaSB5YW5nIGRpY2FyaQ0KYGBgDQo=