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


1 Membuat Program dengan List R dan Python

1.1 Buat sebuah list untuk menyimpan 5 orang teman dekatmu

list0 = list()                                              # Membuat List kosong
list5 = list("Ami", "Amu", "Ame", "Ama", "Amo")   # Membuat List berisi 5 item

print(list5)
## [[1]]
## [1] "Ami"
## 
## [[2]]
## [1] "Amu"
## 
## [[3]]
## [1] "Ame"
## 
## [[4]]
## [1] "Ama"
## 
## [[5]]
## [1] "Amo"

1.2 Pilihlah satu orang dari list tersebut yang menjadi teman paling dekatmu dengan menggunakan index

list5 = list("Ami", "Amu", "Ame", "Ama", "Amo")   
print(list5[3])                                             # Print nilai pada index 3
## [[1]]
## [1] "Ame"

1.3 Gantilah satu orang yang tidak begitu dekat denganmu dengan teman baru yang kamu temui baru-baru ini

list5 = list("Ami", "Amu", "Ame", "Ama", "Amo")
list5[4] = "Olaf"                                         # Mengganti item Ama menjadi Olaf

print(list5)
## [[1]]
## [1] "Ami"
## 
## [[2]]
## [1] "Amu"
## 
## [[3]]
## [1] "Ame"
## 
## [[4]]
## [1] "Olaf"
## 
## [[5]]
## [1] "Amo"

1.4 Bagaimana caranya anda menghitung banyak teman yang ada dalam list tersebut

length(list5)                                               # Menghitung banyak teman yang berada di dalam List
## [1] 5

2 Buatlah contoh menyimpan sekumpulan tuple dengan R dan Python, dengan mengikuti instruksi berikut

2.1 Buatlah Tuple dengan 5 item didalamnya

library(sets)                                               # Panggil library sets terlebih dulu
tuple0 = tuple()                                            # Membuat isi tuple (kosong)
tuple1 = tuple("dewa","kekal","dan","tanah","keabadian")
    # membuat isi tuple 5 item
tuple2 = tuple("dunia","di","bawah","cahaya","rembulan")
    # membuat isi tumple 5 item

2.2 Perlihatkan cara Mengakses Nilai Tuple

print(tuple1)
## ("dewa", "kekal", "dan", "tanah", "keabadian")
    #mengakses tuple 1
print(tuple2)
## ("dunia", "di", "bawah", "cahaya", "rembulan")
print(tuple2[5])                                            # Mengakses nilai 5 pada tuple2
## ("rembulan")

2.3 Bagaimana anda melakukan Slicing Nilai Tuple

print(tuple2[2:5])                                          # Memotong tuple 2 berdasarkan order
## ("di", "bawah", "cahaya", "rembulan")

2.4 Nestled Tuple

tuple3 = rep(tuple2, 7)                                     # Mengisi tuple3 dengan tuple2 dan diulang 7 kali
print(tuple3)
## ("dunia", "di", "bawah", "cahaya", "rembulan", "dunia", "di", "bawah",
##  "cahaya", "rembulan", "dunia", "di", "bawah", "cahaya", "rembulan",
##  "dunia", "di", "bawah", "cahaya", "rembulan", "dunia", "di", "bawah",
##  "cahaya", "rembulan", "dunia", "di", "bawah", "cahaya", "rembulan",
##  "dunia", "di", "bawah", "cahaya", "rembulan")
tuple4 = c(tuple1,tuple2)                                  # Mengisi tuple4 dengan tuple1 dan tuple2
print(tuple4)
## ("dewa", "kekal", "dan", "tanah", "keabadian", "dunia", "di", "bawah",
##  "cahaya", "rembulan")

2.5 Unpacking Sequence

tuple1 = tuple("dewa","kekal","dan","tanah","keabadian")
names (tuple1) = c("index1", "index2", "index3", "index4", "index5")
print(tuple1)
## (index1 = "dewa", index2 = "kekal", index3 = "dan", index4 = "tanah",
##  index5 = "keabadian")

3 Buatlah contoh menyimpan sekumpulan Dictionary dengan R dan Python, yang memuat type data float, integer, character, dan logical, list, tuple, dictionary dengan mengikuti instruksi berikut

3.1 Akses suatu nilai Item dari Dictionary

library(Dict)                                               # Mengaktifkan library Dict
## 
## Attaching package: 'Dict'
## The following object is masked from 'package:sets':
## 
##     %>%
Permana = dict(
  nama = "Garry Julius",
  # Memasukkan nama pada dict
  
  umur = as.integer(19),
  # Memasukkan umur pada dict
  
  hobi = list("Bermain", "Berenang", "membaca"),
  # Memasukkan List hobi
  
  asal = ("Bandar Lampung"),
  # memasukan tempat kelahiran
  
  menikah = FALSE,
  
  sosmed = tuple(instagram= "boring.garr",
                 facebook= "julius.garry")
  )
cat("Nama saya adalah:", Permana$get('nama'))             # Mengakses nama pada dict Permana
## Nama saya adalah: Garry Julius
print(Permana$get('sosmed')['instagram'])                   # Mengakses sosmed instagram
## (instagram = "boring.garr")

3.2 Menambah atau Mengubah suatu Nilai Item pada Dictionary

Permana["nama"] = "Garry Julius Permana"                 # Mengubah nilai item dictionary
print(Permana$get('nama'))
## [1] "Garry Julius Permana"

3.3 Menghapus item dalam Dictionary

Permana$remove("asal")                                  # Mengapus item asal pada dictionary 
print(Permana)
## # A tibble: 5 x 2
##   key     value     
##   <chr>   <list>    
## 1 hobi    <list [3]>
## 2 menikah <lgl [1]> 
## 3 nama    <chr [1]> 
## 4 sosmed  <tuple>   
## 5 umur    <int [1]>

4 Silahkan untuk menemukan operasi Pengindeksan, Pengirisan, dan Subsetting Data Frame dengan Menggunkan R dan Python.

df1_R <- data.frame(nomor =c(1:5),
                    "nama"
=c("Ei","Yoimiya","Ayaka","Yae","Kokomi"),
                    "Jabatan"
=c("direktur","Marketing","HRD","Sekretaris","manajer"),
                    "Gaji"
=c("216 juta","4 juta","15 juta","10 juta","25 juta"),
                    "alamat"
=c("Raiden","Naganohara","Kamisato","Guuji","Sangonomiya")
)
print(df1_R)
##   nomor    nama    Jabatan     Gaji      alamat
## 1     1      Ei   direktur 216 juta      Raiden
## 2     2 Yoimiya  Marketing   4 juta  Naganohara
## 3     3   Ayaka        HRD  15 juta    Kamisato
## 4     4     Yae Sekretaris  10 juta       Guuji
## 5     5  Kokomi    manajer  25 juta Sangonomiya
df2_R <- data.frame(nomor =c(6:10),
                    "nama"
=c("Jean","Lisa","kaeya","Eula","Barbara"),
                    "Jabatan"
=c("Wakil pimpinan","Pustakawan","Analis","Pengumpul Data","Penyambut Tamu"),
                    "Gaji"
=c("170 juta","6 juta","19 juta","23 juta","4 juta"),
                    "alamat"
=c("Gunhilder","Minci","Alberich","Lawrence","Pegg")
)
print(df2_R)
##   nomor    nama        Jabatan     Gaji    alamat
## 1     6    Jean Wakil pimpinan 170 juta Gunhilder
## 2     7    Lisa     Pustakawan   6 juta     Minci
## 3     8   kaeya         Analis  19 juta  Alberich
## 4     9    Eula Pengumpul Data  23 juta  Lawrence
## 5    10 Barbara Penyambut Tamu   4 juta      Pegg

4.1 Penggabungan 2 frame

df3_R = rbind(df1_R,df2_R) # menggabungkan data frame 1 dan 2

4.2 indeks data frame

print(df3_R)
##    nomor    nama        Jabatan     Gaji      alamat
## 1      1      Ei       direktur 216 juta      Raiden
## 2      2 Yoimiya      Marketing   4 juta  Naganohara
## 3      3   Ayaka            HRD  15 juta    Kamisato
## 4      4     Yae     Sekretaris  10 juta       Guuji
## 5      5  Kokomi        manajer  25 juta Sangonomiya
## 6      6    Jean Wakil pimpinan 170 juta   Gunhilder
## 7      7    Lisa     Pustakawan   6 juta       Minci
## 8      8   kaeya         Analis  19 juta    Alberich
## 9      9    Eula Pengumpul Data  23 juta    Lawrence
## 10    10 Barbara Penyambut Tamu   4 juta        Pegg

4.3 dimensi data frame

dim(df3_R)  #memeriksa dimensi data frame
## [1] 10  5

4.4 struktur data frame

str(df3_R)  #memeriksa strukrut data frame
## 'data.frame':    10 obs. of  5 variables:
##  $ nomor  : int  1 2 3 4 5 6 7 8 9 10
##  $ nama   : chr  "Ei" "Yoimiya" "Ayaka" "Yae" ...
##  $ Jabatan: chr  "direktur" "Marketing" "HRD" "Sekretaris" ...
##  $ Gaji   : chr  "216 juta" "4 juta" "15 juta" "10 juta" ...
##  $ alamat : chr  "Raiden" "Naganohara" "Kamisato" "Guuji" ...

4.5 summary data frame

summary(df3_R)  #summary statistik data frame
##      nomor           nama             Jabatan              Gaji          
##  Min.   : 1.00   Length:10          Length:10          Length:10         
##  1st Qu.: 3.25   Class :character   Class :character   Class :character  
##  Median : 5.50   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 5.50                                                           
##  3rd Qu.: 7.75                                                           
##  Max.   :10.00                                                           
##     alamat         
##  Length:10         
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

5 Buatlah operasi Ganti Nama Variabel pada suatu Data Frame dengan menggunakan R dan Python

df2_R<-df1_R                                  
# Merubah nama data frame df1_R menjadi df2_R
names(df2_R)<-c("Kode",                       
                   "Nama",
                   "Jabatan",
                   "Gaji",
                   "Alamat")
# Merubah nama variable pada data frame df2_R

print(df2_R)
##   Kode    Nama    Jabatan     Gaji      Alamat
## 1    1      Ei   direktur 216 juta      Raiden
## 2    2 Yoimiya  Marketing   4 juta  Naganohara
## 3    3   Ayaka        HRD  15 juta    Kamisato
## 4    4     Yae Sekretaris  10 juta       Guuji
## 5    5  Kokomi    manajer  25 juta Sangonomiya
LS0tDQp0aXRsZTogIlR1Z2FzIDMiDQpzdWJ0aXRsZTogIkFsZ29yaXRtYSBkYW4gU3RydWt0dXIgZGF0YSINCmF1dGhvcjogIkdhcnJ5IEp1bGl1cyAoMjAyMDQ5MjAwMDMpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9Im1lLnBuZyIvPiANCg0KYGBge3IgbG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICczMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImxvZ29tYXRhbmEucG5nIikNCmBgYA0KDQpFbWFpbCAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs6ICBnYXJyeWp1bGl1c3Blcm1hbkBnbWFpbC5jb20gPGJyPg0KcnB1YnMgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDs6IGh0dHBzOi8vcnB1YnMuY29tL0dhcnIgPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbU3RhdGlzdGlrYSBCaXNuaXNdKGh0dHBzOi8vbWF0YW5hdW5pdmVyc2l0eS5hYy5pZC8/bHk9YWNhZGVtaWMmYz1zYikgPGJyPg0KQWRkcmVzcyAgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDogQVJBIENlbnRlciwgTWF0YW5hIFVuaXZlcnNpdHkgVG93ZXIgPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgSmwuIENCRCBCYXJhdCBLYXYsIFJULjEsIEN1cnVnIFNhbmdlcmVuZywgS2VsYXBhIER1YSwgVGFuZ2VyYW5nLCBCYW50ZW4gMTU4MTAuDQoNCioqKioNCg0KIyBNZW1idWF0IFByb2dyYW0gZGVuZ2FuIExpc3QgUiBkYW4gUHl0aG9uDQoNCiMjICpCdWF0IHNlYnVhaCBsaXN0IHVudHVrIG1lbnlpbXBhbiA1IG9yYW5nIHRlbWFuIGRla2F0bXUqDQoNCmBgYHtyIGVjaG89VFJVRX0NCmxpc3QwID0gbGlzdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtYnVhdCBMaXN0IGtvc29uZw0KbGlzdDUgPSBsaXN0KCJBbWkiLCAiQW11IiwgIkFtZSIsICJBbWEiLCAiQW1vIikgICAjIE1lbWJ1YXQgTGlzdCBiZXJpc2kgNSBpdGVtDQoNCnByaW50KGxpc3Q1KQ0KYGBgDQoNCiMjICpQaWxpaGxhaCBzYXR1IG9yYW5nIGRhcmkgbGlzdCB0ZXJzZWJ1dCB5YW5nIG1lbmphZGkgdGVtYW4gcGFsaW5nIGRla2F0bXUgZGVuZ2FuIG1lbmdndW5ha2FuIGluZGV4Kg0KDQpgYGB7cn0NCmxpc3Q1ID0gbGlzdCgiQW1pIiwgIkFtdSIsICJBbWUiLCAiQW1hIiwgIkFtbyIpICAgDQpwcmludChsaXN0NVszXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFByaW50IG5pbGFpIHBhZGEgaW5kZXggMw0KYGBgDQoNCiMjICpHYW50aWxhaCBzYXR1IG9yYW5nIHlhbmcgdGlkYWsgYmVnaXR1IGRla2F0IGRlbmdhbm11IGRlbmdhbiB0ZW1hbiBiYXJ1IHlhbmcga2FtdSB0ZW11aSBiYXJ1LWJhcnUgaW5pKg0KDQpgYGB7cn0NCmxpc3Q1ID0gbGlzdCgiQW1pIiwgIkFtdSIsICJBbWUiLCAiQW1hIiwgIkFtbyIpDQpsaXN0NVs0XSA9ICJPbGFmIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW5nZ2FudGkgaXRlbSBBbWEgbWVuamFkaSBPbGFmDQoNCnByaW50KGxpc3Q1KQ0KYGBgDQoNCiMjICpCYWdhaW1hbmEgY2FyYW55YSBhbmRhIG1lbmdoaXR1bmcgYmFueWFrIHRlbWFuIHlhbmcgYWRhIGRhbGFtIGxpc3QgdGVyc2VidXQqDQoNCmBgYHtyfQ0KbGVuZ3RoKGxpc3Q1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW5naGl0dW5nIGJhbnlhayB0ZW1hbiB5YW5nIGJlcmFkYSBkaSBkYWxhbSBMaXN0DQpgYGANCg0KIyBCdWF0bGFoIGNvbnRvaCBtZW55aW1wYW4gc2VrdW1wdWxhbiB0dXBsZSBkZW5nYW4gUiBkYW4gUHl0aG9uLCBkZW5nYW4gbWVuZ2lrdXRpIGluc3RydWtzaSBiZXJpa3V0DQoNCiMjICpCdWF0bGFoIFR1cGxlIGRlbmdhbiA1IGl0ZW0gZGlkYWxhbW55YSoNCg0KYGBge3J9DQpsaWJyYXJ5KHNldHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFBhbmdnaWwgbGlicmFyeSBzZXRzIHRlcmxlYmloIGR1bHUNCnR1cGxlMCA9IHR1cGxlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtYnVhdCBpc2kgdHVwbGUgKGtvc29uZykNCnR1cGxlMSA9IHR1cGxlKCJkZXdhIiwia2VrYWwiLCJkYW4iLCJ0YW5haCIsImtlYWJhZGlhbiIpDQogICAgIyBtZW1idWF0IGlzaSB0dXBsZSA1IGl0ZW0NCnR1cGxlMiA9IHR1cGxlKCJkdW5pYSIsImRpIiwiYmF3YWgiLCJjYWhheWEiLCJyZW1idWxhbiIpDQogICAgIyBtZW1idWF0IGlzaSB0dW1wbGUgNSBpdGVtDQpgYGANCg0KIyMgKlBlcmxpaGF0a2FuIGNhcmEgTWVuZ2Frc2VzIE5pbGFpIFR1cGxlKg0KDQpgYGB7cn0NCnByaW50KHR1cGxlMSkNCiAgICAjbWVuZ2Frc2VzIHR1cGxlIDENCnByaW50KHR1cGxlMikNCnByaW50KHR1cGxlMls1XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVuZ2Frc2VzIG5pbGFpIDUgcGFkYSB0dXBsZTINCmBgYA0KDQojIyAqQmFnYWltYW5hIGFuZGEgbWVsYWt1a2FuIFNsaWNpbmcgTmlsYWkgVHVwbGUqDQoNCmBgYHtyfQ0KcHJpbnQodHVwbGUyWzI6NV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW1vdG9uZyB0dXBsZSAyIGJlcmRhc2Fya2FuIG9yZGVyDQpgYGANCg0KIyMgKk5lc3RsZWQgVHVwbGUqDQoNCmBgYHtyfQ0KdHVwbGUzID0gcmVwKHR1cGxlMiwgNykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW5naXNpIHR1cGxlMyBkZW5nYW4gdHVwbGUyIGRhbiBkaXVsYW5nIDcga2FsaQ0KcHJpbnQodHVwbGUzKQ0KdHVwbGU0ID0gYyh0dXBsZTEsdHVwbGUyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbmdpc2kgdHVwbGU0IGRlbmdhbiB0dXBsZTEgZGFuIHR1cGxlMg0KcHJpbnQodHVwbGU0KQ0KYGBgDQoNCiMjICpVbnBhY2tpbmcgU2VxdWVuY2UqDQoNCmBgYHtyfQ0KdHVwbGUxID0gdHVwbGUoImRld2EiLCJrZWthbCIsImRhbiIsInRhbmFoIiwia2VhYmFkaWFuIikNCm5hbWVzICh0dXBsZTEpID0gYygiaW5kZXgxIiwgImluZGV4MiIsICJpbmRleDMiLCAiaW5kZXg0IiwgImluZGV4NSIpDQpwcmludCh0dXBsZTEpDQpgYGANCg0KIyBCdWF0bGFoIGNvbnRvaCBtZW55aW1wYW4gc2VrdW1wdWxhbiBEaWN0aW9uYXJ5IGRlbmdhbiBSIGRhbiBQeXRob24sIHlhbmcgbWVtdWF0IHR5cGUgZGF0YSBmbG9hdCwgaW50ZWdlciwgY2hhcmFjdGVyLCBkYW4gbG9naWNhbCwgbGlzdCwgdHVwbGUsIGRpY3Rpb25hcnkgZGVuZ2FuIG1lbmdpa3V0aSBpbnN0cnVrc2kgYmVyaWt1dA0KDQojIyAqQWtzZXMgc3VhdHUgbmlsYWkgSXRlbSBkYXJpIERpY3Rpb25hcnkqDQoNCmBgYHtyfQ0KbGlicmFyeShEaWN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW5nYWt0aWZrYW4gbGlicmFyeSBEaWN0DQpgYGANCg0KYGBge3J9DQpQZXJtYW5hID0gZGljdCgNCiAgbmFtYSA9ICJHYXJyeSBKdWxpdXMiLA0KICAjIE1lbWFzdWtrYW4gbmFtYSBwYWRhIGRpY3QNCiAgDQogIHVtdXIgPSBhcy5pbnRlZ2VyKDE5KSwNCiAgIyBNZW1hc3Vra2FuIHVtdXIgcGFkYSBkaWN0DQogIA0KICBob2JpID0gbGlzdCgiQmVybWFpbiIsICJCZXJlbmFuZyIsICJtZW1iYWNhIiksDQogICMgTWVtYXN1a2thbiBMaXN0IGhvYmkNCiAgDQogIGFzYWwgPSAoIkJhbmRhciBMYW1wdW5nIiksDQogICMgbWVtYXN1a2FuIHRlbXBhdCBrZWxhaGlyYW4NCiAgDQogIG1lbmlrYWggPSBGQUxTRSwNCiAgDQogIHNvc21lZCA9IHR1cGxlKGluc3RhZ3JhbT0gImJvcmluZy5nYXJyIiwNCiAgICAgICAgICAgICAgICAgZmFjZWJvb2s9ICJqdWxpdXMuZ2FycnkiKQ0KICApDQpgYGANCg0KYGBge3J9DQpjYXQoIk5hbWEgc2F5YSBhZGFsYWg6IiwgUGVybWFuYSRnZXQoJ25hbWEnKSkgICAgICAgICAgICAgIyBNZW5nYWtzZXMgbmFtYSBwYWRhIGRpY3QgUGVybWFuYQ0KcHJpbnQoUGVybWFuYSRnZXQoJ3Nvc21lZCcpWydpbnN0YWdyYW0nXSkgICAgICAgICAgICAgICAgICAgIyBNZW5nYWtzZXMgc29zbWVkIGluc3RhZ3JhbQ0KYGBgDQoNCiMjICpNZW5hbWJhaCBhdGF1IE1lbmd1YmFoIHN1YXR1IE5pbGFpIEl0ZW0gcGFkYSBEaWN0aW9uYXJ5Kg0KDQpgYGB7cn0NClBlcm1hbmFbIm5hbWEiXSA9ICJHYXJyeSBKdWxpdXMgUGVybWFuYSIgICAgICAgICAgICAgICAgICMgTWVuZ3ViYWggbmlsYWkgaXRlbSBkaWN0aW9uYXJ5DQpwcmludChQZXJtYW5hJGdldCgnbmFtYScpKQ0KYGBgDQoNCiMjICpNZW5naGFwdXMgaXRlbSBkYWxhbSBEaWN0aW9uYXJ5Kg0KYGBge3J9DQpQZXJtYW5hJHJlbW92ZSgiYXNhbCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVuZ2FwdXMgaXRlbSBhc2FsIHBhZGEgZGljdGlvbmFyeSANCnByaW50KFBlcm1hbmEpDQpgYGANCg0KIyBTaWxhaGthbiB1bnR1ayBtZW5lbXVrYW4gb3BlcmFzaSBQZW5naW5kZWtzYW4sIFBlbmdpcmlzYW4sIGRhbiBTdWJzZXR0aW5nIERhdGEgRnJhbWUgZGVuZ2FuIE1lbmdndW5rYW4gUiBkYW4gUHl0aG9uLg0KDQpgYGB7cn0NCmRmMV9SIDwtIGRhdGEuZnJhbWUobm9tb3IgPWMoMTo1KSwNCiAgICAgICAgICAgICAgICAgICAgIm5hbWEiDQo9YygiRWkiLCJZb2ltaXlhIiwiQXlha2EiLCJZYWUiLCJLb2tvbWkiKSwNCiAgICAgICAgICAgICAgICAgICAgIkphYmF0YW4iDQo9YygiZGlyZWt0dXIiLCJNYXJrZXRpbmciLCJIUkQiLCJTZWtyZXRhcmlzIiwibWFuYWplciIpLA0KICAgICAgICAgICAgICAgICAgICAiR2FqaSINCj1jKCIyMTYganV0YSIsIjQganV0YSIsIjE1IGp1dGEiLCIxMCBqdXRhIiwiMjUganV0YSIpLA0KICAgICAgICAgICAgICAgICAgICAiYWxhbWF0Ig0KPWMoIlJhaWRlbiIsIk5hZ2Fub2hhcmEiLCJLYW1pc2F0byIsIkd1dWppIiwiU2FuZ29ub21peWEiKQ0KKQ0KcHJpbnQoZGYxX1IpDQpgYGANCg0KYGBge3J9DQpkZjJfUiA8LSBkYXRhLmZyYW1lKG5vbW9yID1jKDY6MTApLA0KICAgICAgICAgICAgICAgICAgICAibmFtYSINCj1jKCJKZWFuIiwiTGlzYSIsImthZXlhIiwiRXVsYSIsIkJhcmJhcmEiKSwNCiAgICAgICAgICAgICAgICAgICAgIkphYmF0YW4iDQo9YygiV2FraWwgcGltcGluYW4iLCJQdXN0YWthd2FuIiwiQW5hbGlzIiwiUGVuZ3VtcHVsIERhdGEiLCJQZW55YW1idXQgVGFtdSIpLA0KICAgICAgICAgICAgICAgICAgICAiR2FqaSINCj1jKCIxNzAganV0YSIsIjYganV0YSIsIjE5IGp1dGEiLCIyMyBqdXRhIiwiNCBqdXRhIiksDQogICAgICAgICAgICAgICAgICAgICJhbGFtYXQiDQo9YygiR3VuaGlsZGVyIiwiTWluY2kiLCJBbGJlcmljaCIsIkxhd3JlbmNlIiwiUGVnZyIpDQopDQpwcmludChkZjJfUikNCmBgYA0KDQojIyAqUGVuZ2dhYnVuZ2FuIDIgZnJhbWUqDQoNCmBgYHtyfQ0KZGYzX1IgPSByYmluZChkZjFfUixkZjJfUikgIyBtZW5nZ2FidW5na2FuIGRhdGEgZnJhbWUgMSBkYW4gMg0KYGBgDQoNCiMjICppbmRla3MgZGF0YSBmcmFtZSoNCmBgYHtyfQ0KcHJpbnQoZGYzX1IpDQpgYGANCg0KIyMgKmRpbWVuc2kgZGF0YSBmcmFtZSoNCg0KYGBge3J9DQpkaW0oZGYzX1IpICAjbWVtZXJpa3NhIGRpbWVuc2kgZGF0YSBmcmFtZQ0KYGBgDQoNCiMjICpzdHJ1a3R1ciBkYXRhIGZyYW1lKg0KDQpgYGB7cn0NCnN0cihkZjNfUikgICNtZW1lcmlrc2Egc3RydWtydXQgZGF0YSBmcmFtZQ0KYGBgDQoNCiMjICpzdW1tYXJ5IGRhdGEgZnJhbWUqDQoNCmBgYHtyfQ0Kc3VtbWFyeShkZjNfUikgICNzdW1tYXJ5IHN0YXRpc3RpayBkYXRhIGZyYW1lDQpgYGANCg0KIyBCdWF0bGFoIG9wZXJhc2kgR2FudGkgTmFtYSBWYXJpYWJlbCBwYWRhIHN1YXR1IERhdGEgRnJhbWUgZGVuZ2FuIG1lbmdndW5ha2FuIFIgZGFuIFB5dGhvbg0KDQpgYGB7cn0NCmRmMl9SPC1kZjFfUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgTWVydWJhaCBuYW1hIGRhdGEgZnJhbWUgZGYxX1IgbWVuamFkaSBkZjJfUg0KbmFtZXMoZGYyX1IpPC1jKCJLb2RlIiwgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICJOYW1hIiwNCiAgICAgICAgICAgICAgICAgICAiSmFiYXRhbiIsDQogICAgICAgICAgICAgICAgICAgIkdhamkiLA0KICAgICAgICAgICAgICAgICAgICJBbGFtYXQiKQ0KIyBNZXJ1YmFoIG5hbWEgdmFyaWFibGUgcGFkYSBkYXRhIGZyYW1lIGRmMl9SDQoNCnByaW50KGRmMl9SKQ0KYGBg