Second Task

Exercises Week 4

Data Science Student

Carol Dupino Pereira

NIM: 52250051

R Studio
Statistics
BS
Bakti Siregar
LinkedIn

1 Practicum

independent Practice: Conditional Statements and Loops In R

Use the following dummy dataset:

Table 1: Data Performa Karyawan
ID Name Age Salary Position Performance
1 Bagas 25 5000 Staff Good
2 Joan 30 7000 Supervisor Very Good
3 Alya 27 6500 Staff Average
4 Dwi 35 10000 Manager Good
5 Nabil 40 12000 Director Very Good
library(dplyr)
# Simpan data ke variabel 'df_karyawan'
df_karyawan <- data.frame(
  ID = 1:5,
  Name = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
  Age = c(25, 30, 27, 35, 40),
  Salary = c(5000, 7000, 6500, 10000, 12000),
  Position = c("Staff", "Supervisor", "Staff", "Manager", "Director"),
  Performance = c("Good", "Very Good", "Average", "Good", "Very Good")
)

# Cek apakah data sudah masuk
print(df_karyawan)
  ID  Name Age Salary   Position Performance
1  1 Bagas  25   5000      Staff        Good
2  2  Joan  30   7000 Supervisor   Very Good
3  3  Alya  27   6500      Staff     Average
4  4   Dwi  35  10000    Manager        Good
5  5 Nabil  40  12000   Director   Very Good

1.1 Conditional Statements

Determine bonus levels based on employee performence:

  • Very Good → 20% of salary
  • Good → 10% of salary
  • Average → 5% of salary
# Kita akan menggunakan variabel df_karyawan yang sudah dibuat di awal agar kamu tidak perlu menulis ulang datanya.

# Menggunakan looping dan kondisional if-else

# Logika Kondisional: Menentukan multiplier berdasarkan performa

for (i in 1:nrow(df_karyawan)) {
  perf <- df_karyawan$Performance[i]
  sal  <- df_karyawan$Salary[i]
  
  if (perf == "Very Good") {
    bonus <- sal * 0.20 # Bonus 20% jika performa sangat baik
  } else if (perf == "Good") {
    bonus <- sal * 0.10 # Bonus 10% jika performa baik
  } else if (perf == "Average") {
    bonus <- sal * 0.05 # Bonus 5% jika performa rata-rata
  } else {
    bonus <- 0
  }
  
# Tidak ada bonus jika di luar kategori tersebut

  # Menampilkan hasil dengan cat() agar output teks bersih tanpa nomor baris
  
  cat(paste0("Name: ", df_karyawan$Name[i], ", Bonus: ", bonus, "\n"))
}
Name: Bagas, Bonus: 500
Name: Joan, Bonus: 1400
Name: Alya, Bonus: 325
Name: Dwi, Bonus: 1000
Name: Nabil, Bonus: 2400

1.2 Loops(For & While)

  • Use for loop to list employess with a salary greater than 6000.
# Menggunakan For Loop untuk struktur pengulanga  dataset sesuai instruksi

# Menggunakan for loop untuk memproses baris demi baris (iterasi)

for (i in 1:nrow(df_karyawan)) {
  if (df_karyawan$Salary[i] > 6000) {
    cat(paste0(
      "Name:", df_karyawan$Name[i], 
      ", Salary:", df_karyawan$Salary[i],
      "\n"))
  }
}
Name:Joan, Salary:7000
Name:Alya, Salary:6500
Name:Dwi, Salary:10000
Name:Nabil, Salary:12000
  • Use a while loop to display employess until a “Manager” is found.
# Menggunakan While Loop untuk perulangan yang bekerja berdasarkan syarat atau kondisi 
i <- 1
while (i <= nrow(df_karyawan)) {
  posisi <- df_karyawan$Position[i]
  cat(paste0(
    "Name: ", df_karyawan$Name[i], 
    ", Position: ", posisi))
  
  if (posisi == "Manager") {
    cat(" (Stop here)\n")
    break
  }
  
  cat("\n")
  i <- i + 1
}
Name: Bagas, Position: Staff
Name: Joan, Position: Supervisor
Name: Alya, Position: Staff
Name: Dwi, Position: Manager (Stop here)
  • Use break to stop the loop when an employee with a salary above 10,000 is found.
# Berhenti saat gaji di atas 10.000

for (i in 1:nrow(df_karyawan)) {
  if (df_karyawan$Salary[i] > 10000) {
    cat(paste0(
      "(Stopped because ", df_karyawan$Name[i],
      " has a salary above 10,000)\n"))
    break
  }
  cat(paste0("Name: ", df_karyawan$Name[i], ", Salary: ",
             df_karyawan$Salary[i], "\n"))
}
Name: Bagas, Salary: 5000
Name: Joan, Salary: 7000
Name: Alya, Salary: 6500
Name: Dwi, Salary: 10000
(Stopped because Nabil has a salary above 10,000)
  • Use continue to skip employess with“Average” performence.
# "Average"digunakan sebagai label atau kategori di kolom Performance dan untuk menentukan jumlah bonus 
for (i in 1:nrow(df_karyawan)) {
  if (df_karyawan$Performance[i] == "Average") {
    next
  }
  cat(paste0(
    "Name: ", df_karyawan$Name[i], 
    ", Performance: ", df_karyawan$Performance[i],
    "\n"))
}
Name: Bagas, Performance: Good
Name: Joan, Performance: Very Good
Name: Dwi, Performance: Good
Name: Nabil, Performance: Very Good
cat("(Alya is skipped because the performance is \"Average\")\n")
(Alya is skipped because the performance is "Average")
LS0tDQp0aXRsZTogIlNlY29uZCBUYXNrIg0Kc3VidGl0bGU6ICJFeGVyY2lzZXMgV2VlayA0IiAgDQphdXRob3I6ICJDYXJvbCBEdXBpbm8gUGVyZWlyYSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cm9ib2Jvb2s6DQogICAgaGlnaGxpZ2h0OiBrYXRlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUgICAgICAgIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICANCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgIA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICANCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgIA0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICANCiAgICBjb2RlX2Rvd25sb2FkOiBUcnVlICAgICAgICAgDQogICAgdG9jX2RlcHRoOiAzICAgICAgICAgICAgICAgIA0KICAgIHVzZV9ib29rZG93bjogdHJ1ZSAgICAgICAgICANCiAgICBjc3M6ICJUdWdhczIuY3NzIg0KLS0tDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGh0bWx0b29scykNCg0KSFRNTCgnDQo8c3R5bGU+DQogIC8qIE1lbmdndW5ha2FuIGZvbnQgSW50ZXIgeWFuZyBiZXJzaWggKi8NCiAgQGltcG9ydCB1cmwoXCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDA7NzAwOzgwMDs5MDAmZGlzcGxheT1zd2FwXCcpOw0KDQogIC8qIEVmZWsgaG92ZXIgdW50dWsgY2FyZCBnZWxhcCBkaSBhdGFzIGJnIHB1dGloICovDQogIC5wcm9maWxlLWNhcmQ6aG92ZXIgew0KICAgIGJvcmRlci1jb2xvcjogcmdiYSg1NiwgMTg5LCAyNDgsIDAuNSkgIWltcG9ydGFudDsNCiAgICBib3gtc2hhZG93OiAwIDI1cHggNTBweCAtMTJweCByZ2JhKDAsIDAsIDAsIDAuMjUpICFpbXBvcnRhbnQ7DQogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOw0KICB9DQoNCiAgLmJ0bi1jb25uZWN0OmhvdmVyIHsNCiAgICBiYWNrZ3JvdW5kOiAjMzhiZGY4ICFpbXBvcnRhbnQ7DQogICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7DQogIH0NCjwvc3R5bGU+DQoNCjxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBwYWRkaW5nOiA2MHB4IDEwcHg7IGZvbnQtZmFtaWx5OiJJbnRlciwgc2Fucy1zZXJpZjsgb3ZlcmZsb3c6IGhpZGRlbjsiPg0KICANCiAgPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB0b3A6IDA7IGxlZnQ6IDA7IG9wYWNpdHk6IDAuMTsgei1pbmRleDogMDsiPg0KICAgIDxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDE0NDAgODAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KICAgICAgPGNpcmNsZSBjeD0iMTAlIiBjeT0iMTAlIiByPSIxNTAiIGZpbGw9IiMzOGJkZjgiIGZpbHRlcj0iYmx1cig4MHB4KSIvPg0KICAgICAgPGNpcmNsZSBjeD0iOTAlIiBjeT0iOTAlIiByPSIyMDAiIGZpbGw9IiM5MzMzZWEiIGZpbHRlcj0iYmx1cigxMDBweCkiLz4NCiAgICA8L3N2Zz4NCiAgPC9kaXY+DQoNCiAgPGRpdiBjbGFzcz0icHJvZmlsZS1jYXJkIiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBiYWNrZ3JvdW5kOiAjMWUyOTNiOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IGJvcmRlci1yYWRpdXM6IDI1cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiAyNXB4OyBwYWRkaW5nOiAzMHB4OyBtYXgtd2lkdGg6IDU1MHB4OyB3aWR0aDogMTAwJTsgYm94LXNoYWRvdzogMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMSk7IHotaW5kZXg6IDE7IHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7Ij4NCiAgICANCiAgICA8ZGl2IHN0eWxlPSJmbGV4OiAwIDAgMTUwcHg7IHotaW5kZXg6IDE7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7Ij4NCiAgICAgIDxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogNHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMzhiZGY4LCAjOTMzM2VhKTsgYm9yZGVyLXJhZGl1czogNTAlOyI+DQogICAgICAgIDxpbWcgc3JjPSJjYXJvbF8xLmpwZyIgDQogICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxNDBweDsgaGVpZ2h0OiAxNDBweDsgYm9yZGVyLXJhZGl1czogNTAlOyBvYmplY3QtZml0OiBjb3ZlcjsgZGlzcGxheTogYmxvY2s7IGJvcmRlcjogNHB4IHNvbGlkICMxZTI5M2I7Ij4NCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KDQogICAgPGRpdiBzdHlsZT0iZmxleDogMTsgbWluLXdpZHRoOiAyMDBweDsgY29sb3I6ICNmOGZhZmM7IHotaW5kZXg6IDE7Ij4NCiAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDhweDsiPg0KICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogcmdiYSg1NiwgMTg5LCAyNDgsIDAuMSk7IGNvbG9yOiAjMzhiZGY4OyBwYWRkaW5nOiAzcHggMTBweDsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDlweDsgZm9udC13ZWlnaHQ6IDgwMDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDFweDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMik7Ij4NCiAgICAgICAgICBEYXRhIFNjaWVuY2UgU3R1ZGVudA0KICAgICAgICA8L3NwYW4+DQogICAgICA8L2Rpdj4NCg0KICAgICAgPGgxIHN0eWxlPSJtYXJnaW46IDA7IGZvbnQtc2l6ZTogMjZweDsgZm9udC13ZWlnaHQ6IDgwMDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjZmZmZmZmLCAjY2JkNWUxKTsgLXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHRleHQ7IC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiB0cmFuc3BhcmVudDsgbGV0dGVyLXNwYWNpbmc6IC0xcHg7IHBhZGRpbmctYm90dG9tOiAycHg7Ij4NCiAgICAgICAgQ2Fyb2wgRHVwaW5vIFBlcmVpcmENCiAgICAgIDwvaDE+DQogICAgICANCiAgICAgIDxwIHN0eWxlPSJmb250LXNpemU6IDEzcHg7IGNvbG9yOiAjOTRhM2I4OyBtYXJnaW46IDVweCAwIDE1cHggMDsiPg0KICAgICAgICBOSU06IDxzcGFuIHN0eWxlPSJjb2xvcjogIzM4YmRmODsgZm9udC13ZWlnaHQ6IDYwMDsiPjUyMjUwMDUxPC9zcGFuPg0KICAgICAgPC9wPg0KDQogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogMjBweDsgZmxleC13cmFwOiB3cmFwOyI+DQogICAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7IHBhZGRpbmc6IDVweCAxMnB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBmb250LXNpemU6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7Ij5SIFN0dWRpbzwvZGl2Pg0KICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDUpOyBwYWRkaW5nOiA1cHggMTJweDsgYm9yZGVyLXJhZGl1czogMTBweDsgZm9udC1zaXplOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDUpOyI+U3RhdGlzdGljczwvZGl2Pg0KICAgICAgPC9kaXY+DQoNCiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiAxNXB4OyBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjA4KTsgcGFkZGluZy10b3A6IDE1cHg7Ij4NCiAgICAgICAgDQogICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsiPg0KICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAzNXB4OyBoZWlnaHQ6IDM1cHg7IGJhY2tncm91bmQ6ICMwZjE3MmE7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKTsgYm9yZGVyLXJhZGl1czogMTBweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExcHg7IGNvbG9yOiAjMzhiZGY4OyI+DQogICAgICAgICAgICBCUw0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjZjFmNWY5OyI+QmFrdGkgU2lyZWdhcjwvZGl2Pg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCg0KICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vY2Fyb2wtZHVwaW5vLXBlcmVpcmEtYTQ5NDgyMzhhIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsiPg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImJ0bi1jb25uZWN0IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZmZmZjsgY29sb3I6ICMwZjE3MmE7IHBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyB0cmFuc2l0aW9uOiAwLjNzIGVhc2U7Ij4NCiAgICAgICAgICAgIDxzcGFuPkxpbmtlZEluPC9zcGFuPg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2E+DQoNCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCmBgYA0KDQoNCiMjIFByYWN0aWN1bQ0KDQppbmRlcGVuZGVudCBQcmFjdGljZTogQ29uZGl0aW9uYWwgU3RhdGVtZW50cyBhbmQgTG9vcHMgSW4gUg0KDQpVc2UgdGhlIGZvbGxvd2luZyAqKmR1bW15IGRhdGFzZXQqKjoNCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgIyBNZW1idWF0IGRhdGEgZnJhbWUgc2ViYWdhaSBiYXNpcyBkYXRhIGthcnlhd2FuDQpkYXRhX2thcnlhd2FuIDwtIGRhdGEuZnJhbWUoDQogIElEID0gYygxLCAyLCAzLCA0LCA1KSwNCiAgTmFtZSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwNCiAgQWdlID0gYygyNSwgMzAsIDI3LCAzNSwgNDApLA0KICBTYWxhcnkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksDQogIFBvc2l0aW9uID0gYygiU3RhZmYiLCAiU3VwZXJ2aXNvciIsICJTdGFmZiIsICJNYW5hZ2VyIiwgIkRpcmVjdG9yIiksDQogIFBlcmZvcm1hbmNlID0gYygiR29vZCIsICJWZXJ5IEdvb2QiLCAiQXZlcmFnZSIsICJHb29kIiwgIlZlcnkgR29vZCIpDQopDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQpsaWJyYXJ5KGtuaXRyKQ0KDQprYWJsZShkYXRhX2thcnlhd2FuLCBjYXB0aW9uID0gIkRhdGEgUGVyZm9ybWEgS2FyeWF3YW4iKQ0KDQpgYGANCg0KYGBge3IsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGNvbW1lbnQ9IiJ9DQpsaWJyYXJ5KGRwbHlyKQ0KIyBTaW1wYW4gZGF0YSBrZSB2YXJpYWJlbCAnZGZfa2FyeWF3YW4nDQpkZl9rYXJ5YXdhbiA8LSBkYXRhLmZyYW1lKA0KICBJRCA9IDE6NSwNCiAgTmFtZSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwNCiAgQWdlID0gYygyNSwgMzAsIDI3LCAzNSwgNDApLA0KICBTYWxhcnkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksDQogIFBvc2l0aW9uID0gYygiU3RhZmYiLCAiU3VwZXJ2aXNvciIsICJTdGFmZiIsICJNYW5hZ2VyIiwgIkRpcmVjdG9yIiksDQogIFBlcmZvcm1hbmNlID0gYygiR29vZCIsICJWZXJ5IEdvb2QiLCAiQXZlcmFnZSIsICJHb29kIiwgIlZlcnkgR29vZCIpDQopDQoNCiMgQ2VrIGFwYWthaCBkYXRhIHN1ZGFoIG1hc3VrDQpwcmludChkZl9rYXJ5YXdhbikNCmBgYA0KIyMjIENvbmRpdGlvbmFsIFN0YXRlbWVudHMNCg0KRGV0ZXJtaW5lICoqYm9udXMgbGV2ZWxzKiogYmFzZWQgb24gZW1wbG95ZWUgKipwZXJmb3JtZW5jZSoqOg0KDQotICoqVmVyeSBHb29kKiog4oaSIDIwJSBvZiBzYWxhcnkNCi0gKipHb29kKiog4oaSIDEwJSBvZiBzYWxhcnkgDQotICoqQXZlcmFnZSoqIOKGkiA1JSBvZiBzYWxhcnkNCg0KYGBge3IsY29tbWVudD0iIn0NCiMgS2l0YSBha2FuIG1lbmdndW5ha2FuIHZhcmlhYmVsIGRmX2thcnlhd2FuIHlhbmcgc3VkYWggZGlidWF0IGRpIGF3YWwgYWdhciBrYW11IHRpZGFrIHBlcmx1IG1lbnVsaXMgdWxhbmcgZGF0YW55YS4NCg0KIyBNZW5nZ3VuYWthbiBsb29waW5nIGRhbiBrb25kaXNpb25hbCBpZi1lbHNlDQoNCiMgTG9naWthIEtvbmRpc2lvbmFsOiBNZW5lbnR1a2FuIG11bHRpcGxpZXIgYmVyZGFzYXJrYW4gcGVyZm9ybWENCg0KZm9yIChpIGluIDE6bnJvdyhkZl9rYXJ5YXdhbikpIHsNCiAgcGVyZiA8LSBkZl9rYXJ5YXdhbiRQZXJmb3JtYW5jZVtpXQ0KICBzYWwgIDwtIGRmX2thcnlhd2FuJFNhbGFyeVtpXQ0KICANCiAgaWYgKHBlcmYgPT0gIlZlcnkgR29vZCIpIHsNCiAgICBib251cyA8LSBzYWwgKiAwLjIwICMgQm9udXMgMjAlIGppa2EgcGVyZm9ybWEgc2FuZ2F0IGJhaWsNCiAgfSBlbHNlIGlmIChwZXJmID09ICJHb29kIikgew0KICAgIGJvbnVzIDwtIHNhbCAqIDAuMTAgIyBCb251cyAxMCUgamlrYSBwZXJmb3JtYSBiYWlrDQogIH0gZWxzZSBpZiAocGVyZiA9PSAiQXZlcmFnZSIpIHsNCiAgICBib251cyA8LSBzYWwgKiAwLjA1ICMgQm9udXMgNSUgamlrYSBwZXJmb3JtYSByYXRhLXJhdGENCiAgfSBlbHNlIHsNCiAgICBib251cyA8LSAwDQogIH0NCiAgDQojIFRpZGFrIGFkYSBib251cyBqaWthIGRpIGx1YXIga2F0ZWdvcmkgdGVyc2VidXQNCg0KICAjIE1lbmFtcGlsa2FuIGhhc2lsIGRlbmdhbiBjYXQoKSBhZ2FyIG91dHB1dCB0ZWtzIGJlcnNpaCB0YW5wYSBub21vciBiYXJpcw0KICANCiAgY2F0KHBhc3RlMCgiTmFtZTogIiwgZGZfa2FyeWF3YW4kTmFtZVtpXSwgIiwgQm9udXM6ICIsIGJvbnVzLCAiXG4iKSkNCn0NCmBgYA0KDQojIyMgTG9vcHMoRm9yICYgV2hpbGUpDQoNCi0gVXNlICAqKmZvciBsb29wKiogdG8gbGlzdCBlbXBsb3llc3Mgd2l0aCBhIHNhbGFyeSBncmVhdGVyIHRoYW4gKio2MDAwKiouDQpgYGB7cixjb21tZW50PSIifQ0KDQojIE1lbmdndW5ha2FuIEZvciBMb29wIHVudHVrIHN0cnVrdHVyIHBlbmd1bGFuZ2EgIGRhdGFzZXQgc2VzdWFpIGluc3RydWtzaQ0KDQojIE1lbmdndW5ha2FuIGZvciBsb29wIHVudHVrIG1lbXByb3NlcyBiYXJpcyBkZW1pIGJhcmlzIChpdGVyYXNpKQ0KDQpmb3IgKGkgaW4gMTpucm93KGRmX2thcnlhd2FuKSkgew0KICBpZiAoZGZfa2FyeWF3YW4kU2FsYXJ5W2ldID4gNjAwMCkgew0KICAgIGNhdChwYXN0ZTAoDQogICAgICAiTmFtZToiLCBkZl9rYXJ5YXdhbiROYW1lW2ldLCANCiAgICAgICIsIFNhbGFyeToiLCBkZl9rYXJ5YXdhbiRTYWxhcnlbaV0sDQogICAgICAiXG4iKSkNCiAgfQ0KfQ0KDQpgYGANCg0KLSBVc2UgYSAqKndoaWxlIGxvb3AqKiB0byBkaXNwbGF5IGVtcGxveWVzcyB1bnRpbCBhICoqIk1hbmFnZXIiKiogaXMgZm91bmQuDQoNCmBgYHtyLGNvbW1lbnQ9IiJ9DQojIE1lbmdndW5ha2FuIFdoaWxlIExvb3AgdW50dWsgcGVydWxhbmdhbiB5YW5nIGJla2VyamEgYmVyZGFzYXJrYW4gc3lhcmF0IGF0YXUga29uZGlzaSANCmkgPC0gMQ0Kd2hpbGUgKGkgPD0gbnJvdyhkZl9rYXJ5YXdhbikpIHsNCiAgcG9zaXNpIDwtIGRmX2thcnlhd2FuJFBvc2l0aW9uW2ldDQogIGNhdChwYXN0ZTAoDQogICAgIk5hbWU6ICIsIGRmX2thcnlhd2FuJE5hbWVbaV0sIA0KICAgICIsIFBvc2l0aW9uOiAiLCBwb3Npc2kpKQ0KICANCiAgaWYgKHBvc2lzaSA9PSAiTWFuYWdlciIpIHsNCiAgICBjYXQoIiAoU3RvcCBoZXJlKVxuIikNCiAgICBicmVhaw0KICB9DQogIA0KICBjYXQoIlxuIikNCiAgaSA8LSBpICsgMQ0KfQ0KYGBgDQoNCi0gVXNlICoqYnJlYWsqKiB0byBzdG9wIHRoZSBsb29wIHdoZW4gYW4gZW1wbG95ZWUgd2l0aCBhIHNhbGFyeSBhYm92ZSAqKjEwLDAwMCoqIGlzIGZvdW5kLg0KDQpgYGB7cixjb21tZW50PSIifQ0KIyBCZXJoZW50aSBzYWF0IGdhamkgZGkgYXRhcyAxMC4wMDANCg0KZm9yIChpIGluIDE6bnJvdyhkZl9rYXJ5YXdhbikpIHsNCiAgaWYgKGRmX2thcnlhd2FuJFNhbGFyeVtpXSA+IDEwMDAwKSB7DQogICAgY2F0KHBhc3RlMCgNCiAgICAgICIoU3RvcHBlZCBiZWNhdXNlICIsIGRmX2thcnlhd2FuJE5hbWVbaV0sDQogICAgICAiIGhhcyBhIHNhbGFyeSBhYm92ZSAxMCwwMDApXG4iKSkNCiAgICBicmVhaw0KICB9DQogIGNhdChwYXN0ZTAoIk5hbWU6ICIsIGRmX2thcnlhd2FuJE5hbWVbaV0sICIsIFNhbGFyeTogIiwNCiAgICAgICAgICAgICBkZl9rYXJ5YXdhbiRTYWxhcnlbaV0sICJcbiIpKQ0KfQ0KYGBgDQoNCi0gVXNlICoqY29udGludWUqKiB0byAqKnNraXAqKiBlbXBsb3llc3Mgd2l0aCoqIkF2ZXJhZ2UiKiogcGVyZm9ybWVuY2UuDQoNCmBgYHtyLGNvbW1lbnQ9IiJ9DQojICJBdmVyYWdlImRpZ3VuYWthbiBzZWJhZ2FpIGxhYmVsIGF0YXUga2F0ZWdvcmkgZGkga29sb20gUGVyZm9ybWFuY2UgZGFuIHVudHVrIG1lbmVudHVrYW4ganVtbGFoIGJvbnVzIA0KZm9yIChpIGluIDE6bnJvdyhkZl9rYXJ5YXdhbikpIHsNCiAgaWYgKGRmX2thcnlhd2FuJFBlcmZvcm1hbmNlW2ldID09ICJBdmVyYWdlIikgew0KICAgIG5leHQNCiAgfQ0KICBjYXQocGFzdGUwKA0KICAgICJOYW1lOiAiLCBkZl9rYXJ5YXdhbiROYW1lW2ldLCANCiAgICAiLCBQZXJmb3JtYW5jZTogIiwgZGZfa2FyeWF3YW4kUGVyZm9ybWFuY2VbaV0sDQogICAgIlxuIikpDQp9DQpjYXQoIihBbHlhIGlzIHNraXBwZWQgYmVjYXVzZSB0aGUgcGVyZm9ybWFuY2UgaXMgXCJBdmVyYWdlXCIpXG4iKQ0KDQpgYGANCg0K