Visualisasi Data Dasar

Exercises ~ Week 4

Logo


1 Pendahuluan

Dokumen ini membahas eksplorasi data sederhana tentang Konsumsi listrik rumah tangga, yang bertujuan untuk memahami hubungan antara cuaca dan penggunaan listrik. Kami akan menganalisis data harian seperti suhu udara, kondisi cuaca (seperti hujan atau panas), serta konsumsi listrik rumah tangga. Tujuannya adalah membantu kita melihat bagaimana faktor-faktor ini saling memengaruhi, misalnya, apakah suhu yang tinggi membuat penggunaan listrik meningkat.


2 Persiapan data

library(DT)
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggridges)

set.seed(123)  # Agar hasil acak selalu sama

# Membuat tanggal dari 1–30 Oktober 2023
tanggal_seq <- seq(as.Date("2023-10-01"), as.Date("2023-10-30"), by = "day")

# Membuat data utama
data <- data.frame(
  Tanggal = tanggal_seq,  # Kolom tanggal
  Suhu = round(runif(length(tanggal_seq), 20, 35), 1),  # Suhu harian acak (20–35 °C)
  
    # Mengulang nama hari agar sesuai panjang tanggal
    Hari = rep( 
    c("Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"),
    length.out = length(tanggal_seq)
  )
)

# Membuat Kolom Cuaca (Ordinal)
# klasifikasikan kondisi cuaca berdasarkan suhu (20-26.9 = Hujan, 27-31.9 = Cerah, 32 ke atas = Panas)
data$Cuaca <- cut(
  data$Suhu,
  breaks = c(-Inf, 26.9, 31.9, Inf),  # batas nilai suhu sesuai instruksi
  labels = c("Hujan", "Cerah", "Panas"), 
  ordered_result = TRUE  # menjadikan variabel ini menjadi Ordinal
)


# Tambahan Baru: Membuat Kolom Data Discrete untuk Jumlah Orang Rumah
data$Jumlah_Orang_Rumah <- sample(2:5, size = nrow(data), replace = TRUE)  # Hanya 2, 3, 4, 5
  # Penjelasan sederhana: sample() membuat angka acak dari 2 hingga 5, sebanyak baris di data.


# Jika suhu naik, maka konsumsi listrik naik juga,tapi seberapa besar kenaikannya tergantung kondisi cuaca:   Panas -> Tinggi, Cerah -> sedang, Hujan -> kecil.
# Menghitung Konsumsi Listrik (Continuous)
data$Konsumsi_kWh <- round( 
  ifelse(
    data$Cuaca == "Panas",  ## Jika cuaca 'Panas'
    40 + 0.7 * data$Suhu + rnorm(nrow(data), 0, 1.5),  # konsumsi tinggi, dipengaruhi Suhu
    # Jika penggunaan listrik dasar adalah 40 kWh, maka untuk setiap kenaikan suhu sebesar 1 °C, konsumsi         listrik akan bertambah 0.7 kWh. 
    
    ifelse(
      data$Cuaca == "Cerah",  ## Jika 'Cerah'
      30 + 0.6 * data$Suhu + rnorm(nrow(data), 0, 1.5),  # konsumsi sedang, dipengaruhi Suhu
      # Jika penggunaan listrik dasar adalah 30 kWh, maka setiap kenaikan suhu 1°C akan menambah konsumsi           listrik sebesar 0.6 kWh.
      
      20 + 0.5 * data$Suhu + rnorm(nrow(data), 0, 1.5)   ## Jika 'Hujan', konsumsi rendah, dipengaruhi Suhu
      #Jika penggunaan listrik dasar adalah 20 kWh, maka setiap kenaikan suhu 1°C akan menambah konsumsi          listrik sebesar 0.5 kWh.
      
    # rnorm itu untuk menambahkan nilai acak. nrow itu untuk mengisi berapa yang di perlukan pada data (30)
    )
  ),
  1
)

# Membuat Tingkat Penggunaan (Ordinal) berdasarkan Konsumsi_kWh
data$Tingkat_Penggunaan <- cut( 
  data$Konsumsi_kWh,  # Gunakan Konsumsi_kWh sebagai input
  breaks = c(-Inf, 30 , 50, Inf),  # Batas: di bawah 30 = Rendah, 30-50 = Sedang, 50+ = Tinggi
  labels = c("Rendah", "Sedang", "Tinggi"), 
  ordered_result = TRUE
) # Penjelasan sederhana: semuanya berhubungan Suhu -> Cuaca -> Konsumsi_kWh -> Tingkat_Penggunaan.

datatable(
  data,  # Hanya kolom yang diminta
  rownames = TRUE, # kalau TRUE dia jadi ada angkanya di bagian kiri. jika FALSE jadi tidak ada
  options = list(
    pageLength = 10,  # 10 baris per halaman
    autoWidth = TRUE, # untuk isi table itu automatis mengatur lebarnya
    scrollCollapse = TRUE 
  ),
  caption = "Tabel 1. Dataset Konsumsi Listrik Rumah Tangga Berdasarkan Cuaca"
)

3 Visualisasi

3.1 Bar Chart

ggplot(data, aes(x = Tanggal, y = Konsumsi_kWh, fill = Cuaca)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Konsumsi_kWh), vjust = -0.5, size = 3) +
  labs(title = "Konsumsi Listrik Harian Berdasarkan Cuaca",
       x = "Tanggal",
       y = "Konsumsi (kWh)",
       fill = "Cuaca") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  1. Penjelasan Code :
  • ggplot(data, aes(x = Tanggal, y = Konsumsi_kWh, fill = Cuaca)) → memanggil dataset data dan menentukan bahwa sumbu X berisi tanggal, sumbu Y berisi konsumsi listrik, serta warna batang diisi berdasarkan kategori cuaca.

  • geom_bar(stat = “identity”) → membuat grafik batang dengan tinggi batang sesuai nilai sebenarnya dari Konsumsi_kWh.

  • geom_text(aes(label = Konsumsi_kWh), vjust = -0.5, size = 3) → menambahkan label angka di atas tiap batang agar nilai konsumsi terlihat jelas.

  • labs(…) → menambahkan judul dan nama sumbu pada grafik agar mudah dibaca.

  • theme_minimal() → menggunakan tema sederhana agar tampilan grafik bersih.

  • theme(axis.text.x = element_text(angle = 45, hjust = 1)) → memiringkan teks tanggal di sumbu X agar tidak saling menumpuk.

  1. Penjelasan Visualisasi :

Grafik batang ini memperlihatkan perubahan konsumsi listrik rumah tangga setiap hari berdasarkan kondisi cuaca. Batang berwarna menunjukkan kategori cuaca, sedangkan tinggi batang menunjukkan besar penggunaan listrik. Dari grafik terlihat bahwa cuaca panas menyebabkan konsumsi listrik meningkat, sementara cuaca hujan cenderung menurunkan penggunaan energi. Visualisasi ini membantu mengenali pola hubungan antara faktor cuaca dan tingkat pemakaian listrik harian.

  1. Definisi :

Bar chart adalah grafik yang menampilkan data dalam bentuk batang vertikal atau horizontal, di mana panjang batang mewakili nilai suatu kategori. Grafik ini digunakan untuk menyoroti perbandingan nilai antar kelompok.

  1. Aturan Penggunaan :

Gunakan bar chart untuk membandingkan nilai antar kelompok data kategorikal seperti nominal atau ordinal, terhadap variabel numerik yang menggambarkan besarnya suatu nilai. Visualisasi ini efektif saat ingin menonjolkan perbedaan antar kategori secara jelas dan langsung.

  1. Kelebihan :
  • Mudah dibaca dan cepat menunjukkan perbedaan antar kategori.
  • Cocok untuk menampilkan data ringkasan atau hasil agregasi.
  • Warna dan label dapat memperjelas pesan yang ingin disampaikan.
  1. Kekurangan :
  • Kurang cocok untuk data kontinu atau deret waktu panjang.
  • Terlalu banyak kategori dapat membuat grafik sulit dibaca.
  • Tidak menunjukkan tren atau hubungan antarvariabel numerik.

3.2 Histogram

ggplot(data, aes(x = Konsumsi_kWh)) +
  geom_histogram(bins = 10, fill = "skyblue", color = "black") +
  labs(title = "Distribusi Konsumsi Listrik", x = "Konsumsi (kWh)", y = "Frekuensi") +
  theme_minimal()

  1. Penjelasan Code :
  • ggplot(data, aes(x = Konsumsi_kWh)) → Menetapkan data dan sumbu X sebagai nilai konsumsi listrik.

  • geom_histogram(bins = 10, fill = “skyblue”, color = “black”) → Membuat histogram dengan 10 batang (bin) berwarna biru muda dan garis tepi hitam.

  • labs(…) → Menambahkan judul dan label sumbu X serta Y.

  • theme_minimal() → Menggunakan tema sederhana agar tampilannya bersih.

  1. Penjelasan Visualisasi :

Histogram ini menampilkan distribusi konsumsi listrik rumah tangga dalam rentang nilai tertentu. Setiap batang menunjukkan jumlah hari yang memiliki konsumsi listrik pada kisaran tertentu. Dari grafik ini dapat dilihat apakah data konsumsi listrik cenderung merata atau berkumpul pada nilai tertentu.

  1. Definisi :

Histogram adalah grafik batang yang menunjukkan frekuensi data numerik dalam interval tertentu. Grafik ini digunakan untuk memahami sebaran nilai data kontinu, seperti konsumsi listrik atau suhu.

  1. Aturan Penggunaan :

Gunakan histogram untuk menggambarkan distribusi data numerik kontinu, agar dapat melihat pola sebaran dan kecenderungan nilai pada suatu rentang tertentu.

  1. Kelebihan :
  • Menampilkan distribusi data dengan jelas.
  • Mudah melihat pola, seperti data condong ke kanan/kiri.
  • Dapat mendeteksi nilai ekstrem (outlier).
  1. Kekurangan :
  • Tidak menampilkan hubungan antarvariabel.
  • Hasil bisa berbeda tergantung banyaknya interval (bin).
  • Kurang efektif jika data terlalu sedikit.

3.3 Boxplot

ggplot(data, aes(x = Cuaca, y = Konsumsi_kWh, fill = Cuaca)) +
  geom_boxplot() +
  labs(title = "Boxplot Konsumsi Listrik Berdasarkan Cuaca", x = "Cuaca", y = "Konsumsi (kWh)") +
  theme_minimal()

  1. Penjelasan Code :
  • ggplot(data, aes(x = Cuaca, y = Konsumsi_kWh, fill = Cuaca)) → Mengatur sumbu X berdasarkan kategori cuaca dan Y sebagai nilai konsumsi listrik.

  • geom_boxplot() → Membuat grafik boxplot yang menampilkan median, kuartil, dan outlier.

  • labs(…) → Menambahkan judul dan label sumbu X serta Y.

  • theme_minimal() → Menggunakan tema sederhana agar tampilannya bersih.

  1. Penjelasan Visualisasi :

Boxplot ini memperlihatkan variasi konsumsi listrik untuk setiap kondisi cuaca. Kotak menunjukkan rentang nilai tengah data, garis dalam kotak adalah median, dan titik di luar kotak adalah outlier. Visualisasi ini memudahkan kita membandingkan persebaran konsumsi listrik antar kategori cuaca.

  1. Definisi :

Boxplot adalah grafik yang menampilkan ringkasan statistik seperti median, kuartil, dan outlier untuk membandingkan beberapa kelompok data.

  1. Aturan Penggunaan :

Gunakan boxplot untuk menganalisis distribusi data numerik berdasarkan kategori (ordinal atau nominal), seperti perbedaan konsumsi listrik berdasarkan cuaca.

  1. Kelebihan :
  • Mudah menemukan persebaran data dan outlier.
  • Efektif membandingkan beberapa kelompok data.
  • Menunjukkan rentang dan simetri data.
  1. Kekurangan :
  • Tidak menampilkan nilai individual secara detail.
  • Sulit dipahami oleh pengguna awam tanpa penjelasan.
  • Tidak menunjukkan distribusi penuh seperti histogram.

3.4 Pie Chart

library(dplyr)
library(ggplot2)

# --- Buat data ringkasan untuk pie chart ---
pie_data <- data %>%
  count(Tingkat_Penggunaan) %>%
  mutate(
    prop = n / sum(n),
    label = paste0(Tingkat_Penggunaan, "\n", n, " hari\n(", round(prop * 100, 1), "%)")
  )

# --- Warna kategori ---
warna_kategori <- c(
  "Rendah" = "green3",
  "Sedang" = "dodgerblue3",
  "Tinggi" = "red3"
)

# --- Plot pie chart tanpa keterangan tambahan ---
ggplot(pie_data, aes(x = "", y = prop, fill = Tingkat_Penggunaan)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = label),
            position = position_stack(vjust = 0.5),
            color = "black", size = 3) +
  scale_fill_manual(values = warna_kategori) +
  labs(
    title = "Proporsi Tingkat Penggunaan Listrik per Hari",
    subtitle = "Menunjukkan jumlah hari dan persentase setiap kategori penggunaan",
    fill = "Tingkat Penggunaan",
    caption = paste0(
      "Periode pengamatan: ",
      format(min(data$Tanggal), "%d %B %Y"), " – ",
      format(max(data$Tanggal), "%d %B %Y")
    )
  ) +
  theme_void(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
    plot.subtitle = element_text(size = 11, hjust = 0.5, color = "gray30"),
    legend.position = "right",
    plot.caption = element_text(hjust = 0, size = 9, color = "gray30", lineheight = 1.3)
  )

  1. Penjelasan Code :
  • count(Tingkat_Penggunaan) → Menghitung jumlah data untuk setiap kategori tingkat penggunaan.

  • mutate(prop = n / sum(n), …) → Menghitung proporsi dan membuat label teks dengan jumlah hari dan persentase.

  • geom_bar(stat = “identity”) → Membuat batang untuk setiap kategori (akan diubah menjadi lingkaran).

  • coord_polar(“y”) → Mengubah grafik batang menjadi bentuk lingkaran (pie).

  • geom_text(…) → Menambahkan label teks pada setiap irisan.

  • scale_fill_manual(…) → Mengatur warna untuk tiap kategori.

  • theme_void() → Menghapus garis dan sumbu agar fokus pada pie chart.

  1. Penjelasan Visualisasi :

Pie chart ini memperlihatkan proporsi kategori tingkat penggunaan listrik rumah tangga. Setiap irisan mewakili persentase jumlah hari pada tiap tingkat penggunaan (rendah, sedang, tinggi). Grafik ini membantu memahami porsi kontribusi setiap kategori terhadap total keseluruhan hari.

  1. Definisi :

Pie chart adalah grafik berbentuk lingkaran yang dibagi menjadi beberapa irisan untuk menunjukkan proporsi dari total data.

  1. Aturan Penggunaan :

Gunakan pie chart untuk data kategorikal nominal atau ordinal, ketika ingin menunjukkan perbandingan bagian terhadap total keseluruhan.

  1. Kelebihan :
  • Menarik secara visual dan mudah dipahami.
  • Cocok untuk menunjukkan komposisi data.
  • Efektif untuk perbandingan sederhana antar kategori.
  1. Kekurangan :
  • Sulit dibandingkan jika ukuran irisan mirip.
  • Tidak akurat untuk analisis numerik rinci.
  • Tidak cocok jika jumlah kategori terlalu banyak.

3.5 Scatter Plot

ggplot(data, aes(x = Suhu, y = Konsumsi_kWh, color = Cuaca)) +
  geom_point(size = 3, alpha = 0.8) +
  labs(title = "Hubungan Suhu dan Konsumsi Listrik", x = "Suhu (\u00B0C)", y = "Konsumsi (kWh)") +
  theme_minimal() #\u00B0C itu unicode dari (°C)

  1. Penjelasan Code:
  • ggplot(data, aes(x = Suhu, y = Konsumsi_kWh, color = Cuaca)) → Menentukan suhu sebagai sumbu X, konsumsi listrik sebagai sumbu Y, dan warna berdasarkan cuaca.

  • geom_point(size = 3, alpha = 0.8) → Membuat titik-titik data dengan ukuran 3 dan transparansi 80%.

  • labs(…) → Memberikan judul dan label pada sumbu.

  • theme_minimal() → Menjaga tampilan tetap sederhana.

  1. Penjelasan Visualisasi :

Scatter plot ini menunjukkan hubungan antara suhu dan konsumsi listrik rumah tangga. Titik-titik berwarna merepresentasikan kondisi cuaca, memperlihatkan bahwa semakin tinggi suhu, konsumsi listrik juga meningkat. Grafik ini membantu mengidentifikasi pola korelasi antara dua variabel numerik.

  1. Definisi :

Scatter plot adalah grafik yang menampilkan hubungan antara dua variabel numerik menggunakan titik-titik data.

  1. Aturan Penggunaan :

Gunakan scatter plot untuk data numerik kontinu, ketika ingin melihat pola, hubungan, atau tren antara dua variabel seperti suhu dan konsumsi listrik.

  1. Kelebihan :
  • Efektif menunjukkan hubungan antarvariabel.
  • Dapat mengidentifikasi tren, korelasi, dan outlier.
  • Visualisasi sederhana namun informatif.
  1. Kekurangan :
  • Sulit dibaca jika data sangat banyak dan tumpang tindih.
  • Tidak cocok untuk data kategorikal.
  • Membutuhkan interpretasi statistik tambahan untuk analisis mendalam.

3.6 Line Plot

ggplot(data, aes(x = Tanggal, y = Konsumsi_kWh, color = Cuaca, group = 1)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  labs(title = "Tren Konsumsi Listrik Harian",
       x = "Tanggal",
       y = "Konsumsi (kWh)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  1. Penjelasan Code :
  • ggplot(data, aes(x = Tanggal, y = Konsumsi_kWh, color = Cuaca, group = 1)) → Menentukan tanggal sebagai sumbu X dan konsumsi listrik sebagai Y, dengan warna mengikuti cuaca.

  • geom_line(linewidth = 1) → Menghubungkan titik data dengan garis untuk menunjukkan tren waktu.

  • geom_point(size = 2) → Menambahkan titik di setiap tanggal agar lebih jelas.

  • labs(…) → Menambahkan judul dan label sumbu.

  • theme_minimal() → Mengatur tema sederhana.

  • theme(axis.text.x = element_text(angle = 45, hjust = 1)) → Memiringkan teks tanggal agar lebih terbaca.

  1. Penjelasan Visualisasi :

Line plot ini menampilkan perubahan konsumsi listrik dari waktu ke waktu. Setiap garis menggambarkan tren harian, menunjukkan bagaimana konsumsi listrik meningkat atau menurun sesuai kondisi cuaca. Grafik ini membantu mengenali pola musiman atau perubahan penggunaan energi seiring berjalannya waktu.

  1. Definisi :

Line plot adalah grafik yang menghubungkan titik-titik data dalam urutan tertentu untuk menampilkan perubahan atau tren dari waktu ke waktu.

  1. Aturan Penggunaan :

Gunakan line plot untuk data numerik yang diukur berdasarkan urutan waktu (time series), seperti tanggal, jam, atau bulan, guna memantau tren atau perubahan nilai secara berkelanjutan.

  1. Kelebihan :
  • Efektif menunjukkan tren dan fluktuasi dari waktu ke waktu.
  • Mudah diinterpretasikan untuk data berurutan.
  • Dapat menampilkan lebih dari satu seri data dengan warna berbeda.
  1. Kekurangan :
  • Tidak cocok untuk data kategori tanpa urutan waktu.
  • Sulit dibaca jika banyak garis tumpang tindih.
  • Tidak menunjukkan variasi dalam setiap titik data.

3.7 Density Plot

ggplot(data, aes(x = Konsumsi_kWh, fill = Cuaca)) +
  geom_density(alpha = 0.6) +
  labs(title = "Kepadatan Distribusi Konsumsi Listrik per Cuaca", x = "Konsumsi (kWh)", y = "Kepadatan") +
  theme_minimal()

  1. Penjelasan Code :
  • ggplot(data, aes(x = Konsumsi_kWh, fill = Cuaca)) → Menetapkan data konsumsi listrik dengan warna berdasarkan cuaca.

  • geom_density(alpha = 0.6) → Membuat kurva kepadatan dengan transparansi 60%.

  • labs(…) → Menambahkan judul dan label pada grafik.

  • theme_minimal() → Mengatur tampilan agar sederhana dan bersih.

  1. Penjelasan Visualisasi :

Density plot ini menampilkan sebaran konsumsi listrik untuk setiap kondisi cuaca dalam bentuk kurva halus. Setiap warna menunjukkan kategori cuaca, dan tinggi kurva menunjukkan kepadatan data di nilai tertentu. Grafik ini berguna untuk membandingkan bagaimana pola distribusi listrik berbeda antar cuaca.

  1. Definisi :

Density plot adalah grafik berbentuk kurva yang menunjukkan distribusi probabilitas data numerik secara halus, mirip histogram tetapi tanpa batang, sehingga bentuk sebaran data terlihat lebih mulus.

  1. Aturan Penggunaan :

Gunakan density plot untuk data numerik kontinu, terutama saat ingin membandingkan bentuk distribusi antara beberapa kelompok atau kategori.

  1. Kelebihan :
  • Menampilkan bentuk distribusi data dengan halus.
  • Mudah membandingkan pola antara beberapa kelompok.
  • Lebih rapi dibanding histogram saat data padat.
  1. Kekurangan :
  • Tidak menunjukkan jumlah data secara langsung.
  • Sulit ditafsirkan jika data terlalu sedikit.
  • Overlap antar kurva dapat mengurangi keterbacaan.

3.8 Riggeline

ggplot(data, aes(x = Konsumsi_kWh, y = Cuaca, fill = Cuaca)) +
  geom_density_ridges(alpha = 0.7) +
  labs(title = "Ridgeline Plot Konsumsi Listrik Berdasarkan Cuaca", x = "Konsumsi (kWh)", y = "Cuaca") +
  theme_minimal()
## Picking joint bandwidth of 0.764

  1. Penjelasan Code :
  • ggplot(data, aes(x = Konsumsi_kWh, y = Cuaca, fill = Cuaca)) → Menetapkan sumbu X untuk konsumsi listrik dan sumbu Y untuk kategori cuaca.

  • geom_density_ridges(alpha = 0.7) → Membuat kurva kepadatan bertumpuk untuk tiap kategori.

  • labs(…) → Menambahkan judul dan label sumbu.

  • theme_minimal() → Mengatur tampilan agar bersih dan profesional.

  1. Penjelasan Visualisasi :

Ridgeline plot ini menggambarkan perbandingan sebaran konsumsi listrik antar kondisi cuaca dalam bentuk kurva bertumpuk. Setiap kurva memperlihatkan kepadatan data untuk masing-masing kategori, sehingga perbedaan pola antar cuaca terlihat jelas. Grafik ini memberikan tampilan visual yang menarik untuk analisis perbandingan distribusi.

  1. Definisi :

Ridgeline plot adalah variasi dari density plot yang menampilkan beberapa kurva distribusi secara bertumpuk untuk membandingkan bentuk sebaran data dari berbagai kelompok kategori.

  1. Aturan Penggunaan :

Gunakan ridgeline plot untuk data numerik kontinu yang terbagi dalam beberapa kelompok kategori, seperti konsumsi listrik berdasarkan cuaca, untuk menyoroti perbedaan pola distribusi antar kelompok.

  1. Kelebihan :
  • Memberikan tampilan visual yang menarik dan informatif.
  • Mudah membandingkan banyak kategori dalam satu grafik.
  • Menunjukkan perbedaan bentuk distribusi dengan jelas.
  1. Kekurangan :
  • Sulit dibaca jika terlalu banyak kategori.
  • Bisa membingungkan bagi pengguna awam.
  • Membutuhkan ruang visual lebih besar agar tetap jelas.

4 Kesimpulan

Berdasarkan data yang dihasilkan, dapat diamati bahwa kondisi cuaca berperan penting terhadap tingkat konsumsi listrik. Saat cuaca panas, konsumsi listrik cenderung meningkat karena penggunaan alat pendingin seperti kipas angin dan AC lebih tinggi. Sebaliknya, pada saat hujan, konsumsi listrik relatif menurun karena suhu lingkungan sudah cukup sejuk, Asumsikan saja ketika cuaca sedang panas penggunaan alat pendingin ruangan 10 jam perhari, Cerah hanya 8,5 Jam, dan saat hujan menjadi 7 Jam.

Secara keseluruhan, dataset ini menunjukkan keterkaitan logis antara variabel suhu, cuaca, dan konsumsi listrik, serta dapat menjadi contoh praktis untuk memahami jenis data dan logika pengelompokan dalam analisis data dasar menggunakan bahasa R.

LS0tDQp0aXRsZTogIlZpc3VhbGlzYXNpIERhdGEgRGFzYXIiICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCnN1YnRpdGxlOiAiRXhlcmNpc2VzIH4gV2VlayA0IiAgIyBTdWJ0aXRsZSBvciB0b3BpYyBmb3Igd2VlayA0DQphdXRob3I6DQotICJLZWxvbXBvayAxIg0KLSAiUmVmYW50YW51ciBIdW5zdWwgSGFxaWIiDQotICJDYWhheWEgTWVkaW5hIFNlbWlkYW5nIg0KLSAiQWRpbmRhIE1haXphIElzaGZhaGFuaSINCi0gIkNoYW5kcmEgUml6YWwgQWxhbXN5YWgiDQotICJGaXR5YW5hbmRyYSBBdGhhciBBZHlha3NhIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgIyBBdXRvIGRpc3BsYXlzIHRoZSBjdXJyZW50IGRhdGUNCm91dHB1dDogICAgICAgICAgICAgICAgICAgICAgICAgIyBPdXRwdXQgc2VjdGlvbiBkZWZpbmVzIHRoZSBmb3JtYXQgYW5kIGxheW91dCANCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUgICAgICAgICMgRW1iZWRzIGFsbCByZXNvdXJjZXMgKENTUywgSlMsIGltYWdlcykgDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgICMgRGlzcGxheXMgaW1hZ2UgdGh1bWJuYWlscyBpbiB0aGUgZG9jDQogICAgbGlnaHRib3g6IHRydWUgICAgICAgICAgICAgICMgRW5hYmxlcyBjbGljayB0byBlbmxhcmdlIGltYWdlcw0KICAgIGdhbGxlcnk6IHRydWUgICAgICAgICAgICAgICAjIEdyb3VwcyBpbWFnZXMgaW50byBhbiBpbnRlcmFjdGl2ZSBnYWxsZXJ5DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlICAgICAgICMgQXV0b21hdGljYWxseSBudW1iZXJzIGFsbCBzZWN0aW9ucw0KICAgIGxpYl9kaXI6IGxpYnMgICAgICAgICAgICAgICAjIERpcmVjdG9yeSB3aGVyZSBKYXZhU2NyaXB0L0NTUyBsaWJyYXJpZXMNCiAgICBkZl9wcmludDogInBhZ2VkIiAgICAgICAgICAgIyBEaXNwbGF5cyBkYXRhIGZyYW1lcyBhcyBpbnRlcmFjdGl2ZSBwYWdlZCANCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IiAgICAgICAgIyBBbGxvd3MgZm9sZGluZy91bmZvbGRpbmcgUiBjb2RlIGJsb2NrcyANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICAgIyBBZGRzIGEgYnV0dG9uIHRvIGRvd25sb2FkIGFsbCBSIGNvZGUNCi0tLQ0KDQo8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ZYW5EcmFhL1dlZWszU3RhdGlzdGlrYS9tYWluL0ZPVE9fS0VMT01QT0suanBnIiBhbHQ9IkxvZ28iIHN0eWxlPSJ3aWR0aDoyMDBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiPg0KDQotLS0NCg0KDQojIFBlbmRhaHVsdWFuDQpEb2t1bWVuIGluaSBtZW1iYWhhcyBla3NwbG9yYXNpIGRhdGEgc2VkZXJoYW5hIHRlbnRhbmcgKipLb25zdW1zaSBsaXN0cmlrIHJ1bWFoIHRhbmdnYSoqLCB5YW5nIGJlcnR1anVhbiB1bnR1ayBtZW1haGFtaSBodWJ1bmdhbiBhbnRhcmEgY3VhY2EgZGFuIHBlbmdndW5hYW4gbGlzdHJpay4gS2FtaSBha2FuIG1lbmdhbmFsaXNpcyBkYXRhIGhhcmlhbiBzZXBlcnRpIHN1aHUgdWRhcmEsIGtvbmRpc2kgY3VhY2EgKHNlcGVydGkgaHVqYW4gYXRhdSBwYW5hcyksIHNlcnRhIGtvbnN1bXNpIGxpc3RyaWsgcnVtYWggdGFuZ2dhLiBUdWp1YW5ueWEgYWRhbGFoIG1lbWJhbnR1IGtpdGEgbWVsaWhhdCBiYWdhaW1hbmEgZmFrdG9yLWZha3RvciBpbmkgc2FsaW5nIG1lbWVuZ2FydWhpLCBtaXNhbG55YSwgYXBha2FoIHN1aHUgeWFuZyB0aW5nZ2kgbWVtYnVhdCBwZW5nZ3VuYWFuIGxpc3RyaWsgbWVuaW5na2F0Lg0KDQotLS0NCg0KIyBQZXJzaWFwYW4gZGF0YQ0KYGBge3J9DQpsaWJyYXJ5KERUKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dyaWRnZXMpDQoNCnNldC5zZWVkKDEyMykgICMgQWdhciBoYXNpbCBhY2FrIHNlbGFsdSBzYW1hDQoNCiMgTWVtYnVhdCB0YW5nZ2FsIGRhcmkgMeKAkzMwIE9rdG9iZXIgMjAyMw0KdGFuZ2dhbF9zZXEgPC0gc2VxKGFzLkRhdGUoIjIwMjMtMTAtMDEiKSwgYXMuRGF0ZSgiMjAyMy0xMC0zMCIpLCBieSA9ICJkYXkiKQ0KDQojIE1lbWJ1YXQgZGF0YSB1dGFtYQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBUYW5nZ2FsID0gdGFuZ2dhbF9zZXEsICAjIEtvbG9tIHRhbmdnYWwNCiAgU3VodSA9IHJvdW5kKHJ1bmlmKGxlbmd0aCh0YW5nZ2FsX3NlcSksIDIwLCAzNSksIDEpLCAgIyBTdWh1IGhhcmlhbiBhY2FrICgyMOKAkzM1IMKwQykNCiAgDQogICAgIyBNZW5ndWxhbmcgbmFtYSBoYXJpIGFnYXIgc2VzdWFpIHBhbmphbmcgdGFuZ2dhbA0KICAgIEhhcmkgPSByZXAoIA0KICAgIGMoIlNlbmluIiwgIlNlbGFzYSIsICJSYWJ1IiwgIkthbWlzIiwgIkp1bWF0IiwgIlNhYnR1IiwgIk1pbmdndSIpLA0KICAgIGxlbmd0aC5vdXQgPSBsZW5ndGgodGFuZ2dhbF9zZXEpDQogICkNCikNCg0KIyBNZW1idWF0IEtvbG9tIEN1YWNhIChPcmRpbmFsKQ0KIyBrbGFzaWZpa2FzaWthbiBrb25kaXNpIGN1YWNhIGJlcmRhc2Fya2FuIHN1aHUgKDIwLTI2LjkgPSBIdWphbiwgMjctMzEuOSA9IENlcmFoLCAzMiBrZSBhdGFzID0gUGFuYXMpDQpkYXRhJEN1YWNhIDwtIGN1dCgNCiAgZGF0YSRTdWh1LA0KICBicmVha3MgPSBjKC1JbmYsIDI2LjksIDMxLjksIEluZiksICAjIGJhdGFzIG5pbGFpIHN1aHUgc2VzdWFpIGluc3RydWtzaQ0KICBsYWJlbHMgPSBjKCJIdWphbiIsICJDZXJhaCIsICJQYW5hcyIpLCANCiAgb3JkZXJlZF9yZXN1bHQgPSBUUlVFICAjIG1lbmphZGlrYW4gdmFyaWFiZWwgaW5pIG1lbmphZGkgT3JkaW5hbA0KKQ0KDQoNCiMgVGFtYmFoYW4gQmFydTogTWVtYnVhdCBLb2xvbSBEYXRhIERpc2NyZXRlIHVudHVrIEp1bWxhaCBPcmFuZyBSdW1haA0KZGF0YSRKdW1sYWhfT3JhbmdfUnVtYWggPC0gc2FtcGxlKDI6NSwgc2l6ZSA9IG5yb3coZGF0YSksIHJlcGxhY2UgPSBUUlVFKSAgIyBIYW55YSAyLCAzLCA0LCA1DQogICMgUGVuamVsYXNhbiBzZWRlcmhhbmE6IHNhbXBsZSgpIG1lbWJ1YXQgYW5na2EgYWNhayBkYXJpIDIgaGluZ2dhIDUsIHNlYmFueWFrIGJhcmlzIGRpIGRhdGEuDQoNCg0KIyBKaWthIHN1aHUgbmFpaywgbWFrYSBrb25zdW1zaSBsaXN0cmlrIG5haWsganVnYSx0YXBpIHNlYmVyYXBhIGJlc2FyIGtlbmFpa2FubnlhIHRlcmdhbnR1bmcga29uZGlzaSBjdWFjYTogICBQYW5hcyAtPiBUaW5nZ2ksIENlcmFoIC0+IHNlZGFuZywgSHVqYW4gLT4ga2VjaWwuDQojIE1lbmdoaXR1bmcgS29uc3Vtc2kgTGlzdHJpayAoQ29udGludW91cykNCmRhdGEkS29uc3Vtc2lfa1doIDwtIHJvdW5kKCANCiAgaWZlbHNlKA0KICAgIGRhdGEkQ3VhY2EgPT0gIlBhbmFzIiwgICMjIEppa2EgY3VhY2EgJ1BhbmFzJw0KICAgIDQwICsgMC43ICogZGF0YSRTdWh1ICsgcm5vcm0obnJvdyhkYXRhKSwgMCwgMS41KSwgICMga29uc3Vtc2kgdGluZ2dpLCBkaXBlbmdhcnVoaSBTdWh1DQogICAgIyBKaWthIHBlbmdndW5hYW4gbGlzdHJpayBkYXNhciBhZGFsYWggNDAga1doLCBtYWthIHVudHVrIHNldGlhcCBrZW5haWthbiBzdWh1IHNlYmVzYXIgMSDCsEMsIGtvbnN1bXNpICAgICAgICAgbGlzdHJpayBha2FuIGJlcnRhbWJhaCAwLjcga1doLiANCiAgICANCiAgICBpZmVsc2UoDQogICAgICBkYXRhJEN1YWNhID09ICJDZXJhaCIsICAjIyBKaWthICdDZXJhaCcNCiAgICAgIDMwICsgMC42ICogZGF0YSRTdWh1ICsgcm5vcm0obnJvdyhkYXRhKSwgMCwgMS41KSwgICMga29uc3Vtc2kgc2VkYW5nLCBkaXBlbmdhcnVoaSBTdWh1DQogICAgICAjIEppa2EgcGVuZ2d1bmFhbiBsaXN0cmlrIGRhc2FyIGFkYWxhaCAzMCBrV2gsIG1ha2Egc2V0aWFwIGtlbmFpa2FuIHN1aHUgMcKwQyBha2FuIG1lbmFtYmFoIGtvbnN1bXNpICAgICAgICAgICBsaXN0cmlrIHNlYmVzYXIgMC42IGtXaC4NCiAgICAgIA0KICAgICAgMjAgKyAwLjUgKiBkYXRhJFN1aHUgKyBybm9ybShucm93KGRhdGEpLCAwLCAxLjUpICAgIyMgSmlrYSAnSHVqYW4nLCBrb25zdW1zaSByZW5kYWgsIGRpcGVuZ2FydWhpIFN1aHUNCiAgICAgICNKaWthIHBlbmdndW5hYW4gbGlzdHJpayBkYXNhciBhZGFsYWggMjAga1doLCBtYWthIHNldGlhcCBrZW5haWthbiBzdWh1IDHCsEMgYWthbiBtZW5hbWJhaCBrb25zdW1zaSAgICAgICAgICBsaXN0cmlrIHNlYmVzYXIgMC41IGtXaC4NCiAgICAgIA0KICAgICMgcm5vcm0gaXR1IHVudHVrIG1lbmFtYmFoa2FuIG5pbGFpIGFjYWsuIG5yb3cgaXR1IHVudHVrIG1lbmdpc2kgYmVyYXBhIHlhbmcgZGkgcGVybHVrYW4gcGFkYSBkYXRhICgzMCkNCiAgICApDQogICksDQogIDENCikNCg0KIyBNZW1idWF0IFRpbmdrYXQgUGVuZ2d1bmFhbiAoT3JkaW5hbCkgYmVyZGFzYXJrYW4gS29uc3Vtc2lfa1doDQpkYXRhJFRpbmdrYXRfUGVuZ2d1bmFhbiA8LSBjdXQoIA0KICBkYXRhJEtvbnN1bXNpX2tXaCwgICMgR3VuYWthbiBLb25zdW1zaV9rV2ggc2ViYWdhaSBpbnB1dA0KICBicmVha3MgPSBjKC1JbmYsIDMwICwgNTAsIEluZiksICAjIEJhdGFzOiBkaSBiYXdhaCAzMCA9IFJlbmRhaCwgMzAtNTAgPSBTZWRhbmcsIDUwKyA9IFRpbmdnaQ0KICBsYWJlbHMgPSBjKCJSZW5kYWgiLCAiU2VkYW5nIiwgIlRpbmdnaSIpLCANCiAgb3JkZXJlZF9yZXN1bHQgPSBUUlVFDQopICMgUGVuamVsYXNhbiBzZWRlcmhhbmE6IHNlbXVhbnlhIGJlcmh1YnVuZ2FuIFN1aHUgLT4gQ3VhY2EgLT4gS29uc3Vtc2lfa1doIC0+IFRpbmdrYXRfUGVuZ2d1bmFhbi4NCg0KZGF0YXRhYmxlKA0KICBkYXRhLCAgIyBIYW55YSBrb2xvbSB5YW5nIGRpbWludGENCiAgcm93bmFtZXMgPSBUUlVFLCAjIGthbGF1IFRSVUUgZGlhIGphZGkgYWRhIGFuZ2thbnlhIGRpIGJhZ2lhbiBraXJpLiBqaWthIEZBTFNFIGphZGkgdGlkYWsgYWRhDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgIHBhZ2VMZW5ndGggPSAxMCwgICMgMTAgYmFyaXMgcGVyIGhhbGFtYW4NCiAgICBhdXRvV2lkdGggPSBUUlVFLCAjIHVudHVrIGlzaSB0YWJsZSBpdHUgYXV0b21hdGlzIG1lbmdhdHVyIGxlYmFybnlhDQogICAgc2Nyb2xsQ29sbGFwc2UgPSBUUlVFIA0KICApLA0KICBjYXB0aW9uID0gIlRhYmVsIDEuIERhdGFzZXQgS29uc3Vtc2kgTGlzdHJpayBSdW1haCBUYW5nZ2EgQmVyZGFzYXJrYW4gQ3VhY2EiDQopDQpgYGANCi0tLQ0KDQojIFZpc3VhbGlzYXNpDQojIyBCYXIgQ2hhcnQNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gVGFuZ2dhbCwgeSA9IEtvbnN1bXNpX2tXaCwgZmlsbCA9IEN1YWNhKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gS29uc3Vtc2lfa1doKSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKw0KICBsYWJzKHRpdGxlID0gIktvbnN1bXNpIExpc3RyaWsgSGFyaWFuIEJlcmRhc2Fya2FuIEN1YWNhIiwNCiAgICAgICB4ID0gIlRhbmdnYWwiLA0KICAgICAgIHkgPSAiS29uc3Vtc2kgKGtXaCkiLA0KICAgICAgIGZpbGwgPSAiQ3VhY2EiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCmBgYA0KDQoxLiAqKlBlbmplbGFzYW4gQ29kZSA6KioNCg0KKiAqKmdncGxvdChkYXRhLCBhZXMoeCA9IFRhbmdnYWwsIHkgPSBLb25zdW1zaV9rV2gsIGZpbGwgPSBDdWFjYSkpKiog4oaSIG1lbWFuZ2dpbCBkYXRhc2V0IGRhdGEgZGFuIG1lbmVudHVrYW4gYmFod2Egc3VtYnUgWCBiZXJpc2kgdGFuZ2dhbCwgc3VtYnUgWSBiZXJpc2kga29uc3Vtc2kgbGlzdHJpaywgc2VydGEgd2FybmEgYmF0YW5nIGRpaXNpIGJlcmRhc2Fya2FuIGthdGVnb3JpIGN1YWNhLg0KDQoqICoqZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKiog4oaSIG1lbWJ1YXQgZ3JhZmlrIGJhdGFuZyBkZW5nYW4gdGluZ2dpIGJhdGFuZyBzZXN1YWkgbmlsYWkgc2ViZW5hcm55YSBkYXJpIEtvbnN1bXNpX2tXaC4NCg0KKiAqKmdlb21fdGV4dChhZXMobGFiZWwgPSBLb25zdW1zaV9rV2gpLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSoqIOKGkiBtZW5hbWJhaGthbiBsYWJlbCBhbmdrYSBkaSBhdGFzIHRpYXAgYmF0YW5nIGFnYXIgbmlsYWkga29uc3Vtc2kgdGVybGloYXQgamVsYXMuDQoNCiogKipsYWJzKC4uLikqKiDihpIgbWVuYW1iYWhrYW4ganVkdWwgZGFuIG5hbWEgc3VtYnUgcGFkYSBncmFmaWsgYWdhciBtdWRhaCBkaWJhY2EuDQoNCiogKip0aGVtZV9taW5pbWFsKCkqKiDihpIgbWVuZ2d1bmFrYW4gdGVtYSBzZWRlcmhhbmEgYWdhciB0YW1waWxhbiBncmFmaWsgYmVyc2loLg0KDQoqICoqdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkqKiDihpIgbWVtaXJpbmdrYW4gdGVrcyB0YW5nZ2FsIGRpIHN1bWJ1IFggYWdhciB0aWRhayBzYWxpbmcgbWVudW1wdWsuDQoNCg0KMi4gKipQZW5qZWxhc2FuIFZpc3VhbGlzYXNpIDoqKiANCg0KR3JhZmlrIGJhdGFuZyBpbmkgbWVtcGVybGloYXRrYW4gcGVydWJhaGFuIGtvbnN1bXNpIGxpc3RyaWsgcnVtYWggdGFuZ2dhIHNldGlhcCBoYXJpIGJlcmRhc2Fya2FuIGtvbmRpc2kgY3VhY2EuIEJhdGFuZyBiZXJ3YXJuYSBtZW51bmp1a2thbiBrYXRlZ29yaSBjdWFjYSwgc2VkYW5na2FuIHRpbmdnaSBiYXRhbmcgbWVudW5qdWtrYW4gYmVzYXIgcGVuZ2d1bmFhbiBsaXN0cmlrLg0KRGFyaSBncmFmaWsgdGVybGloYXQgYmFod2EgY3VhY2EgcGFuYXMgbWVueWViYWJrYW4ga29uc3Vtc2kgbGlzdHJpayBtZW5pbmdrYXQsIHNlbWVudGFyYSBjdWFjYSBodWphbiBjZW5kZXJ1bmcgbWVudXJ1bmthbiBwZW5nZ3VuYWFuIGVuZXJnaS4gVmlzdWFsaXNhc2kgaW5pIG1lbWJhbnR1IG1lbmdlbmFsaSBwb2xhIGh1YnVuZ2FuIGFudGFyYSBmYWt0b3IgY3VhY2EgZGFuIHRpbmdrYXQgcGVtYWthaWFuIGxpc3RyaWsgaGFyaWFuLg0KDQoNCjMuICoqRGVmaW5pc2kgOioqIA0KDQpCYXIgY2hhcnQgYWRhbGFoIGdyYWZpayB5YW5nIG1lbmFtcGlsa2FuIGRhdGEgZGFsYW0gYmVudHVrIGJhdGFuZyB2ZXJ0aWthbCBhdGF1IGhvcml6b250YWwsDQpkaSBtYW5hIHBhbmphbmcgYmF0YW5nIG1ld2FraWxpIG5pbGFpIHN1YXR1IGthdGVnb3JpLg0KR3JhZmlrIGluaSBkaWd1bmFrYW4gdW50dWsgbWVueW9yb3RpIHBlcmJhbmRpbmdhbiBuaWxhaSBhbnRhciBrZWxvbXBvay4NCg0KNC4gKipBdHVyYW4gUGVuZ2d1bmFhbiA6KiogDQoNCkd1bmFrYW4gYmFyIGNoYXJ0IHVudHVrIG1lbWJhbmRpbmdrYW4gbmlsYWkgYW50YXIga2Vsb21wb2sgZGF0YSBrYXRlZ29yaWthbCBzZXBlcnRpIG5vbWluYWwgYXRhdSBvcmRpbmFsLA0KdGVyaGFkYXAgdmFyaWFiZWwgbnVtZXJpayB5YW5nIG1lbmdnYW1iYXJrYW4gYmVzYXJueWEgc3VhdHUgbmlsYWkuDQpWaXN1YWxpc2FzaSBpbmkgZWZla3RpZiBzYWF0IGluZ2luIG1lbm9uam9sa2FuIHBlcmJlZGFhbiBhbnRhciBrYXRlZ29yaSBzZWNhcmEgamVsYXMgZGFuIGxhbmdzdW5nLg0KDQo1LiAqKktlbGViaWhhbiA6KioNCiogTXVkYWggZGliYWNhIGRhbiBjZXBhdCBtZW51bmp1a2thbiBwZXJiZWRhYW4gYW50YXIga2F0ZWdvcmkuDQoqIENvY29rIHVudHVrIG1lbmFtcGlsa2FuIGRhdGEgcmluZ2thc2FuIGF0YXUgaGFzaWwgYWdyZWdhc2kuDQoqIFdhcm5hIGRhbiBsYWJlbCBkYXBhdCBtZW1wZXJqZWxhcyBwZXNhbiB5YW5nIGluZ2luIGRpc2FtcGFpa2FuLg0KDQo2LiAqKktla3VyYW5nYW4gOioqDQoqIEt1cmFuZyBjb2NvayB1bnR1ayBkYXRhIGtvbnRpbnUgYXRhdSBkZXJldCB3YWt0dSBwYW5qYW5nLg0KKiBUZXJsYWx1IGJhbnlhayBrYXRlZ29yaSBkYXBhdCBtZW1idWF0IGdyYWZpayBzdWxpdCBkaWJhY2EuDQoqIFRpZGFrIG1lbnVuanVra2FuIHRyZW4gYXRhdSBodWJ1bmdhbiBhbnRhcnZhcmlhYmVsIG51bWVyaWsuDQoNCi0tLQ0KDQojIyBIaXN0b2dyYW0NCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gS29uc3Vtc2lfa1doKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAsIGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1c2kgS29uc3Vtc2kgTGlzdHJpayIsIHggPSAiS29uc3Vtc2kgKGtXaCkiLCB5ID0gIkZyZWt1ZW5zaSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KMS4gKipQZW5qZWxhc2FuIENvZGUgOioqDQoNCiogKipnZ3Bsb3QoZGF0YSwgYWVzKHggPSBLb25zdW1zaV9rV2gpKSoqIOKGkiBNZW5ldGFwa2FuIGRhdGEgZGFuIHN1bWJ1IFggc2ViYWdhaSBuaWxhaSBrb25zdW1zaSBsaXN0cmlrLg0KDQoqICoqZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIpKiog4oaSIE1lbWJ1YXQgaGlzdG9ncmFtIGRlbmdhbiAxMCBiYXRhbmcgKGJpbikgYmVyd2FybmEgYmlydSBtdWRhIGRhbiBnYXJpcyB0ZXBpIGhpdGFtLg0KDQoqICoqbGFicyguLi4pKiog4oaSIE1lbmFtYmFoa2FuIGp1ZHVsIGRhbiBsYWJlbCBzdW1idSBYIHNlcnRhIFkuDQoNCiogKip0aGVtZV9taW5pbWFsKCkqKiDihpIgTWVuZ2d1bmFrYW4gdGVtYSBzZWRlcmhhbmEgYWdhciB0YW1waWxhbm55YSBiZXJzaWguDQoNCjIuICoqUGVuamVsYXNhbiBWaXN1YWxpc2FzaSA6KioNCg0KSGlzdG9ncmFtIGluaSBtZW5hbXBpbGthbiBkaXN0cmlidXNpIGtvbnN1bXNpIGxpc3RyaWsgcnVtYWggdGFuZ2dhIGRhbGFtIHJlbnRhbmcgbmlsYWkgdGVydGVudHUuDQpTZXRpYXAgYmF0YW5nIG1lbnVuanVra2FuIGp1bWxhaCBoYXJpIHlhbmcgbWVtaWxpa2kga29uc3Vtc2kgbGlzdHJpayBwYWRhIGtpc2FyYW4gdGVydGVudHUuDQpEYXJpIGdyYWZpayBpbmkgZGFwYXQgZGlsaWhhdCBhcGFrYWggZGF0YSBrb25zdW1zaSBsaXN0cmlrIGNlbmRlcnVuZyBtZXJhdGEgYXRhdSBiZXJrdW1wdWwgcGFkYSBuaWxhaSB0ZXJ0ZW50dS4NCg0KMy4gKipEZWZpbmlzaSA6KioNCg0KSGlzdG9ncmFtIGFkYWxhaCBncmFmaWsgYmF0YW5nIHlhbmcgbWVudW5qdWtrYW4gZnJla3VlbnNpIGRhdGEgbnVtZXJpayBkYWxhbSBpbnRlcnZhbCB0ZXJ0ZW50dS4NCkdyYWZpayBpbmkgZGlndW5ha2FuIHVudHVrIG1lbWFoYW1pIHNlYmFyYW4gbmlsYWkgZGF0YSBrb250aW51LCBzZXBlcnRpIGtvbnN1bXNpIGxpc3RyaWsgYXRhdSBzdWh1Lg0KDQo0LiAqKkF0dXJhbiBQZW5nZ3VuYWFuIDoqKg0KDQpHdW5ha2FuIGhpc3RvZ3JhbSB1bnR1ayBtZW5nZ2FtYmFya2FuIGRpc3RyaWJ1c2kgZGF0YSBudW1lcmlrIGtvbnRpbnUsDQphZ2FyIGRhcGF0IG1lbGloYXQgcG9sYSBzZWJhcmFuIGRhbiBrZWNlbmRlcnVuZ2FuIG5pbGFpIHBhZGEgc3VhdHUgcmVudGFuZyB0ZXJ0ZW50dS4NCg0KNS4gKipLZWxlYmloYW4gOioqDQoqIE1lbmFtcGlsa2FuIGRpc3RyaWJ1c2kgZGF0YSBkZW5nYW4gamVsYXMuDQoqIE11ZGFoIG1lbGloYXQgcG9sYSwgc2VwZXJ0aSBkYXRhIGNvbmRvbmcga2Uga2FuYW4va2lyaS4NCiogRGFwYXQgbWVuZGV0ZWtzaSBuaWxhaSBla3N0cmVtIChvdXRsaWVyKS4NCg0KNi4gKipLZWt1cmFuZ2FuIDoqKiANCiogVGlkYWsgbWVuYW1waWxrYW4gaHVidW5nYW4gYW50YXJ2YXJpYWJlbC4NCiogSGFzaWwgYmlzYSBiZXJiZWRhIHRlcmdhbnR1bmcgYmFueWFrbnlhIGludGVydmFsIChiaW4pLg0KKiBLdXJhbmcgZWZla3RpZiBqaWthIGRhdGEgdGVybGFsdSBzZWRpa2l0Lg0KDQotLS0NCg0KIyMgQm94cGxvdA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBDdWFjYSwgeSA9IEtvbnN1bXNpX2tXaCwgZmlsbCA9IEN1YWNhKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBLb25zdW1zaSBMaXN0cmlrIEJlcmRhc2Fya2FuIEN1YWNhIiwgeCA9ICJDdWFjYSIsIHkgPSAiS29uc3Vtc2kgKGtXaCkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KMS4gKipQZW5qZWxhc2FuIENvZGUgOioqDQoNCiogKipnZ3Bsb3QoZGF0YSwgYWVzKHggPSBDdWFjYSwgeSA9IEtvbnN1bXNpX2tXaCwgZmlsbCA9IEN1YWNhKSkqKiDihpIgTWVuZ2F0dXIgc3VtYnUgWCBiZXJkYXNhcmthbiBrYXRlZ29yaSBjdWFjYSBkYW4gWSBzZWJhZ2FpIG5pbGFpIGtvbnN1bXNpIGxpc3RyaWsuDQoNCiogKipnZW9tX2JveHBsb3QoKSoqIOKGkiBNZW1idWF0IGdyYWZpayBib3hwbG90IHlhbmcgbWVuYW1waWxrYW4gbWVkaWFuLCBrdWFydGlsLCBkYW4gb3V0bGllci4NCg0KKiAqKmxhYnMoLi4uKSoqIOKGkiBNZW5hbWJhaGthbiBqdWR1bCBkYW4gbGFiZWwgc3VtYnUgWCBzZXJ0YSBZLg0KDQoqICoqdGhlbWVfbWluaW1hbCgpKiog4oaSIE1lbmdndW5ha2FuIHRlbWEgc2VkZXJoYW5hIGFnYXIgdGFtcGlsYW5ueWEgYmVyc2loLg0KDQoNCjIuICoqUGVuamVsYXNhbiBWaXN1YWxpc2FzaSA6KioNCg0KQm94cGxvdCBpbmkgbWVtcGVybGloYXRrYW4gdmFyaWFzaSBrb25zdW1zaSBsaXN0cmlrIHVudHVrIHNldGlhcCBrb25kaXNpIGN1YWNhLg0KS290YWsgbWVudW5qdWtrYW4gcmVudGFuZyBuaWxhaSB0ZW5nYWggZGF0YSwgZ2FyaXMgZGFsYW0ga290YWsgYWRhbGFoIG1lZGlhbiwgZGFuIHRpdGlrIGRpIGx1YXIga290YWsgYWRhbGFoIG91dGxpZXIuDQpWaXN1YWxpc2FzaSBpbmkgbWVtdWRhaGthbiBraXRhIG1lbWJhbmRpbmdrYW4gcGVyc2ViYXJhbiBrb25zdW1zaSBsaXN0cmlrIGFudGFyIGthdGVnb3JpIGN1YWNhLg0KDQozLiAqKkRlZmluaXNpIDoqKg0KDQpCb3hwbG90IGFkYWxhaCBncmFmaWsgeWFuZyBtZW5hbXBpbGthbiByaW5na2FzYW4gc3RhdGlzdGlrIHNlcGVydGkgbWVkaWFuLCBrdWFydGlsLCBkYW4gb3V0bGllciB1bnR1ayBtZW1iYW5kaW5na2FuIGJlYmVyYXBhIGtlbG9tcG9rIGRhdGEuDQoNCjQuICoqQXR1cmFuIFBlbmdndW5hYW4gOioqDQoNCkd1bmFrYW4gYm94cGxvdCB1bnR1ayBtZW5nYW5hbGlzaXMgZGlzdHJpYnVzaSBkYXRhIG51bWVyaWsgYmVyZGFzYXJrYW4ga2F0ZWdvcmkgKG9yZGluYWwgYXRhdSBub21pbmFsKSwNCnNlcGVydGkgcGVyYmVkYWFuIGtvbnN1bXNpIGxpc3RyaWsgYmVyZGFzYXJrYW4gY3VhY2EuDQoNCjUuICoqS2VsZWJpaGFuIDoqKg0KKiBNdWRhaCBtZW5lbXVrYW4gcGVyc2ViYXJhbiBkYXRhIGRhbiBvdXRsaWVyLg0KKiBFZmVrdGlmIG1lbWJhbmRpbmdrYW4gYmViZXJhcGEga2Vsb21wb2sgZGF0YS4NCiogTWVudW5qdWtrYW4gcmVudGFuZyBkYW4gc2ltZXRyaSBkYXRhLg0KDQo2LiAqKktla3VyYW5nYW4gOioqIA0KKiBUaWRhayBtZW5hbXBpbGthbiBuaWxhaSBpbmRpdmlkdWFsIHNlY2FyYSBkZXRhaWwuDQoqIFN1bGl0IGRpcGFoYW1pIG9sZWggcGVuZ2d1bmEgYXdhbSB0YW5wYSBwZW5qZWxhc2FuLg0KKiBUaWRhayBtZW51bmp1a2thbiBkaXN0cmlidXNpIHBlbnVoIHNlcGVydGkgaGlzdG9ncmFtLg0KDQotLS0NCg0KIyMgUGllIENoYXJ0DQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgLS0tIEJ1YXQgZGF0YSByaW5na2FzYW4gdW50dWsgcGllIGNoYXJ0IC0tLQ0KcGllX2RhdGEgPC0gZGF0YSAlPiUNCiAgY291bnQoVGluZ2thdF9QZW5nZ3VuYWFuKSAlPiUNCiAgbXV0YXRlKA0KICAgIHByb3AgPSBuIC8gc3VtKG4pLA0KICAgIGxhYmVsID0gcGFzdGUwKFRpbmdrYXRfUGVuZ2d1bmFhbiwgIlxuIiwgbiwgIiBoYXJpXG4oIiwgcm91bmQocHJvcCAqIDEwMCwgMSksICIlKSIpDQogICkNCg0KIyAtLS0gV2FybmEga2F0ZWdvcmkgLS0tDQp3YXJuYV9rYXRlZ29yaSA8LSBjKA0KICAiUmVuZGFoIiA9ICJncmVlbjMiLA0KICAiU2VkYW5nIiA9ICJkb2RnZXJibHVlMyIsDQogICJUaW5nZ2kiID0gInJlZDMiDQopDQoNCiMgLS0tIFBsb3QgcGllIGNoYXJ0IHRhbnBhIGtldGVyYW5nYW4gdGFtYmFoYW4gLS0tDQpnZ3Bsb3QocGllX2RhdGEsIGFlcyh4ID0gIiIsIHkgPSBwcm9wLCBmaWxsID0gVGluZ2thdF9QZW5nZ3VuYWFuKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbCksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwNCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2FybmFfa2F0ZWdvcmkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQcm9wb3JzaSBUaW5na2F0IFBlbmdndW5hYW4gTGlzdHJpayBwZXIgSGFyaSIsDQogICAgc3VidGl0bGUgPSAiTWVudW5qdWtrYW4ganVtbGFoIGhhcmkgZGFuIHBlcnNlbnRhc2Ugc2V0aWFwIGthdGVnb3JpIHBlbmdndW5hYW4iLA0KICAgIGZpbGwgPSAiVGluZ2thdCBQZW5nZ3VuYWFuIiwNCiAgICBjYXB0aW9uID0gcGFzdGUwKA0KICAgICAgIlBlcmlvZGUgcGVuZ2FtYXRhbjogIiwNCiAgICAgIGZvcm1hdChtaW4oZGF0YSRUYW5nZ2FsKSwgIiVkICVCICVZIiksICIg4oCTICIsDQogICAgICBmb3JtYXQobWF4KGRhdGEkVGFuZ2dhbCksICIlZCAlQiAlWSIpDQogICAgKQ0KICApICsNCiAgdGhlbWVfdm9pZChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNSwgaGp1c3QgPSAwLjUpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBoanVzdCA9IDAuNSwgY29sb3IgPSAiZ3JheTMwIiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gOSwgY29sb3IgPSAiZ3JheTMwIiwgbGluZWhlaWdodCA9IDEuMykNCiAgKQ0KDQpgYGANCg0KMS4gKipQZW5qZWxhc2FuIENvZGUgOioqDQoNCiogKipjb3VudChUaW5na2F0X1BlbmdndW5hYW4pKiog4oaSIE1lbmdoaXR1bmcganVtbGFoIGRhdGEgdW50dWsgc2V0aWFwIGthdGVnb3JpIHRpbmdrYXQgcGVuZ2d1bmFhbi4NCg0KKiAqKm11dGF0ZShwcm9wID0gbiAvIHN1bShuKSwgLi4uKSoqIOKGkiBNZW5naGl0dW5nIHByb3BvcnNpIGRhbiBtZW1idWF0IGxhYmVsIHRla3MgZGVuZ2FuIGp1bWxhaCBoYXJpIGRhbiBwZXJzZW50YXNlLg0KDQoqICoqZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKiog4oaSIE1lbWJ1YXQgYmF0YW5nIHVudHVrIHNldGlhcCBrYXRlZ29yaSAoYWthbiBkaXViYWggbWVuamFkaSBsaW5na2FyYW4pLg0KDQoqICoqY29vcmRfcG9sYXIoInkiKSoqIOKGkiBNZW5ndWJhaCBncmFmaWsgYmF0YW5nIG1lbmphZGkgYmVudHVrIGxpbmdrYXJhbiAocGllKS4NCg0KKiAqKmdlb21fdGV4dCguLi4pKiog4oaSIE1lbmFtYmFoa2FuIGxhYmVsIHRla3MgcGFkYSBzZXRpYXAgaXJpc2FuLg0KDQoqICoqc2NhbGVfZmlsbF9tYW51YWwoLi4uKSoqIOKGkiBNZW5nYXR1ciB3YXJuYSB1bnR1ayB0aWFwIGthdGVnb3JpLg0KDQoqICoqdGhlbWVfdm9pZCgpKiog4oaSIE1lbmdoYXB1cyBnYXJpcyBkYW4gc3VtYnUgYWdhciBmb2t1cyBwYWRhIHBpZSBjaGFydC4NCg0KDQoyLiAqKlBlbmplbGFzYW4gVmlzdWFsaXNhc2kgOioqDQoNClBpZSBjaGFydCBpbmkgbWVtcGVybGloYXRrYW4gcHJvcG9yc2kga2F0ZWdvcmkgdGluZ2thdCBwZW5nZ3VuYWFuIGxpc3RyaWsgcnVtYWggdGFuZ2dhLg0KU2V0aWFwIGlyaXNhbiBtZXdha2lsaSBwZXJzZW50YXNlIGp1bWxhaCBoYXJpIHBhZGEgdGlhcCB0aW5na2F0IHBlbmdndW5hYW4gKHJlbmRhaCwgc2VkYW5nLCB0aW5nZ2kpLg0KR3JhZmlrIGluaSBtZW1iYW50dSBtZW1haGFtaSBwb3JzaSBrb250cmlidXNpIHNldGlhcCBrYXRlZ29yaSB0ZXJoYWRhcCB0b3RhbCBrZXNlbHVydWhhbiBoYXJpLg0KDQozLiAqKkRlZmluaXNpIDoqKg0KDQpQaWUgY2hhcnQgYWRhbGFoIGdyYWZpayBiZXJiZW50dWsgbGluZ2thcmFuIHlhbmcgZGliYWdpIG1lbmphZGkgYmViZXJhcGEgaXJpc2FuIHVudHVrIG1lbnVuanVra2FuIHByb3BvcnNpIGRhcmkgdG90YWwgZGF0YS4NCg0KNC4gKipBdHVyYW4gUGVuZ2d1bmFhbiA6KioNCg0KR3VuYWthbiBwaWUgY2hhcnQgdW50dWsgZGF0YSBrYXRlZ29yaWthbCBub21pbmFsIGF0YXUgb3JkaW5hbCwNCmtldGlrYSBpbmdpbiBtZW51bmp1a2thbiBwZXJiYW5kaW5nYW4gYmFnaWFuIHRlcmhhZGFwIHRvdGFsIGtlc2VsdXJ1aGFuLg0KDQo1LiAqKktlbGViaWhhbiA6KioNCiogTWVuYXJpayBzZWNhcmEgdmlzdWFsIGRhbiBtdWRhaCBkaXBhaGFtaS4NCiogQ29jb2sgdW50dWsgbWVudW5qdWtrYW4ga29tcG9zaXNpIGRhdGEuDQoqIEVmZWt0aWYgdW50dWsgcGVyYmFuZGluZ2FuIHNlZGVyaGFuYSBhbnRhciBrYXRlZ29yaS4NCg0KNi4gKipLZWt1cmFuZ2FuIDoqKiANCiogU3VsaXQgZGliYW5kaW5na2FuIGppa2EgdWt1cmFuIGlyaXNhbiBtaXJpcC4NCiogVGlkYWsgYWt1cmF0IHVudHVrIGFuYWxpc2lzIG51bWVyaWsgcmluY2kuDQoqIFRpZGFrIGNvY29rIGppa2EganVtbGFoIGthdGVnb3JpIHRlcmxhbHUgYmFueWFrLg0KDQoNCi0tLQ0KDQojIyBTY2F0dGVyIFBsb3QNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gU3VodSwgeSA9IEtvbnN1bXNpX2tXaCwgY29sb3IgPSBDdWFjYSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjgpICsNCiAgbGFicyh0aXRsZSA9ICJIdWJ1bmdhbiBTdWh1IGRhbiBLb25zdW1zaSBMaXN0cmlrIiwgeCA9ICJTdWh1IChcdTAwQjBDKSIsIHkgPSAiS29uc3Vtc2kgKGtXaCkiKSArDQogIHRoZW1lX21pbmltYWwoKSAjXHUwMEIwQyBpdHUgdW5pY29kZSBkYXJpICjCsEMpDQpgYGANCg0KMS4gKipQZW5qZWxhc2FuIENvZGU6KioNCg0KKiAqKmdncGxvdChkYXRhLCBhZXMoeCA9IFN1aHUsIHkgPSBLb25zdW1zaV9rV2gsIGNvbG9yID0gQ3VhY2EpKSoqIOKGkiBNZW5lbnR1a2FuIHN1aHUgc2ViYWdhaSBzdW1idSBYLCBrb25zdW1zaSBsaXN0cmlrIHNlYmFnYWkgc3VtYnUgWSwgZGFuIHdhcm5hIGJlcmRhc2Fya2FuIGN1YWNhLg0KDQoqICoqZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjgpKiog4oaSIE1lbWJ1YXQgdGl0aWstdGl0aWsgZGF0YSBkZW5nYW4gdWt1cmFuIDMgZGFuIHRyYW5zcGFyYW5zaSA4MCUuDQoNCiogKipsYWJzKC4uLikqKiDihpIgTWVtYmVyaWthbiBqdWR1bCBkYW4gbGFiZWwgcGFkYSBzdW1idS4NCg0KKiAqKnRoZW1lX21pbmltYWwoKSoqIOKGkiBNZW5qYWdhIHRhbXBpbGFuIHRldGFwIHNlZGVyaGFuYS4NCg0KMi4gKipQZW5qZWxhc2FuIFZpc3VhbGlzYXNpIDoqKg0KDQpTY2F0dGVyIHBsb3QgaW5pIG1lbnVuanVra2FuIGh1YnVuZ2FuIGFudGFyYSBzdWh1IGRhbiBrb25zdW1zaSBsaXN0cmlrIHJ1bWFoIHRhbmdnYS4NClRpdGlrLXRpdGlrIGJlcndhcm5hIG1lcmVwcmVzZW50YXNpa2FuIGtvbmRpc2kgY3VhY2EsIG1lbXBlcmxpaGF0a2FuIGJhaHdhIHNlbWFraW4gdGluZ2dpIHN1aHUsIGtvbnN1bXNpIGxpc3RyaWsganVnYSBtZW5pbmdrYXQuDQpHcmFmaWsgaW5pIG1lbWJhbnR1IG1lbmdpZGVudGlmaWthc2kgcG9sYSBrb3JlbGFzaSBhbnRhcmEgZHVhIHZhcmlhYmVsIG51bWVyaWsuDQoNCjMuICoqRGVmaW5pc2kgOioqDQoNClNjYXR0ZXIgcGxvdCBhZGFsYWggZ3JhZmlrIHlhbmcgbWVuYW1waWxrYW4gaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbCBudW1lcmlrIG1lbmdndW5ha2FuIHRpdGlrLXRpdGlrIGRhdGEuDQoNCjQuICoqQXR1cmFuIFBlbmdndW5hYW4gOioqDQoNCkd1bmFrYW4gc2NhdHRlciBwbG90IHVudHVrIGRhdGEgbnVtZXJpayBrb250aW51LA0Ka2V0aWthIGluZ2luIG1lbGloYXQgcG9sYSwgaHVidW5nYW4sIGF0YXUgdHJlbiBhbnRhcmEgZHVhIHZhcmlhYmVsIHNlcGVydGkgc3VodSBkYW4ga29uc3Vtc2kgbGlzdHJpay4NCg0KNS4gKipLZWxlYmloYW4gOioqDQoqIEVmZWt0aWYgbWVudW5qdWtrYW4gaHVidW5nYW4gYW50YXJ2YXJpYWJlbC4NCiogRGFwYXQgbWVuZ2lkZW50aWZpa2FzaSB0cmVuLCBrb3JlbGFzaSwgZGFuIG91dGxpZXIuDQoqIFZpc3VhbGlzYXNpIHNlZGVyaGFuYSBuYW11biBpbmZvcm1hdGlmLg0KDQo2LiAqKktla3VyYW5nYW4gOioqIA0KKiBTdWxpdCBkaWJhY2EgamlrYSBkYXRhIHNhbmdhdCBiYW55YWsgZGFuIHR1bXBhbmcgdGluZGloLg0KKiBUaWRhayBjb2NvayB1bnR1ayBkYXRhIGthdGVnb3Jpa2FsLg0KKiBNZW1idXR1aGthbiBpbnRlcnByZXRhc2kgc3RhdGlzdGlrIHRhbWJhaGFuIHVudHVrIGFuYWxpc2lzIG1lbmRhbGFtLg0KDQotLS0NCg0KIyMgTGluZSBQbG90DQpgYGB7cn0NCmdncGxvdChkYXRhLCBhZXMoeCA9IFRhbmdnYWwsIHkgPSBLb25zdW1zaV9rV2gsIGNvbG9yID0gQ3VhY2EsIGdyb3VwID0gMSkpICsNCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBsYWJzKHRpdGxlID0gIlRyZW4gS29uc3Vtc2kgTGlzdHJpayBIYXJpYW4iLA0KICAgICAgIHggPSAiVGFuZ2dhbCIsDQogICAgICAgeSA9ICJLb25zdW1zaSAoa1doKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KYGBgDQoNCjEuICoqUGVuamVsYXNhbiBDb2RlIDoqKg0KDQoqICoqZ2dwbG90KGRhdGEsIGFlcyh4ID0gVGFuZ2dhbCwgeSA9IEtvbnN1bXNpX2tXaCwgY29sb3IgPSBDdWFjYSwgZ3JvdXAgPSAxKSkqKiDihpIgTWVuZW50dWthbiB0YW5nZ2FsIHNlYmFnYWkgc3VtYnUgWCBkYW4ga29uc3Vtc2kgbGlzdHJpayBzZWJhZ2FpIFksIGRlbmdhbiB3YXJuYSBtZW5naWt1dGkgY3VhY2EuDQoNCiogKipnZW9tX2xpbmUobGluZXdpZHRoID0gMSkqKiDihpIgTWVuZ2h1YnVuZ2thbiB0aXRpayBkYXRhIGRlbmdhbiBnYXJpcyB1bnR1ayBtZW51bmp1a2thbiB0cmVuIHdha3R1Lg0KDQoqICoqZ2VvbV9wb2ludChzaXplID0gMikqKiDihpIgTWVuYW1iYWhrYW4gdGl0aWsgZGkgc2V0aWFwIHRhbmdnYWwgYWdhciBsZWJpaCBqZWxhcy4NCg0KKiAqKmxhYnMoLi4uKSoqIOKGkiBNZW5hbWJhaGthbiBqdWR1bCBkYW4gbGFiZWwgc3VtYnUuDQoNCiogKip0aGVtZV9taW5pbWFsKCkqKiDihpIgTWVuZ2F0dXIgdGVtYSBzZWRlcmhhbmEuDQoNCiogKip0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSoqIOKGkiBNZW1pcmluZ2thbiB0ZWtzIHRhbmdnYWwgYWdhciBsZWJpaCB0ZXJiYWNhLg0KDQoNCjIuICoqUGVuamVsYXNhbiBWaXN1YWxpc2FzaSA6KioNCg0KTGluZSBwbG90IGluaSBtZW5hbXBpbGthbiBwZXJ1YmFoYW4ga29uc3Vtc2kgbGlzdHJpayBkYXJpIHdha3R1IGtlIHdha3R1Lg0KU2V0aWFwIGdhcmlzIG1lbmdnYW1iYXJrYW4gdHJlbiBoYXJpYW4sIG1lbnVuanVra2FuIGJhZ2FpbWFuYSBrb25zdW1zaSBsaXN0cmlrIG1lbmluZ2thdCBhdGF1IG1lbnVydW4gc2VzdWFpIGtvbmRpc2kgY3VhY2EuDQpHcmFmaWsgaW5pIG1lbWJhbnR1IG1lbmdlbmFsaSBwb2xhIG11c2ltYW4gYXRhdSBwZXJ1YmFoYW4gcGVuZ2d1bmFhbiBlbmVyZ2kgc2VpcmluZyBiZXJqYWxhbm55YSB3YWt0dS4NCg0KMy4gKipEZWZpbmlzaSA6KioNCg0KTGluZSBwbG90IGFkYWxhaCBncmFmaWsgeWFuZyBtZW5naHVidW5na2FuIHRpdGlrLXRpdGlrIGRhdGEgZGFsYW0gdXJ1dGFuIHRlcnRlbnR1IHVudHVrIG1lbmFtcGlsa2FuIHBlcnViYWhhbiBhdGF1IHRyZW4gZGFyaSB3YWt0dSBrZSB3YWt0dS4NCg0KNC4gKipBdHVyYW4gUGVuZ2d1bmFhbiA6KioNCg0KR3VuYWthbiBsaW5lIHBsb3QgdW50dWsgZGF0YSBudW1lcmlrIHlhbmcgZGl1a3VyIGJlcmRhc2Fya2FuIHVydXRhbiB3YWt0dSAodGltZSBzZXJpZXMpLA0Kc2VwZXJ0aSB0YW5nZ2FsLCBqYW0sIGF0YXUgYnVsYW4sIGd1bmEgbWVtYW50YXUgdHJlbiBhdGF1IHBlcnViYWhhbiBuaWxhaSBzZWNhcmEgYmVya2VsYW5qdXRhbi4NCg0KNS4gKipLZWxlYmloYW4gOioqDQoqIEVmZWt0aWYgbWVudW5qdWtrYW4gdHJlbiBkYW4gZmx1a3R1YXNpIGRhcmkgd2FrdHUga2Ugd2FrdHUuDQoqIE11ZGFoIGRpaW50ZXJwcmV0YXNpa2FuIHVudHVrIGRhdGEgYmVydXJ1dGFuLg0KKiBEYXBhdCBtZW5hbXBpbGthbiBsZWJpaCBkYXJpIHNhdHUgc2VyaSBkYXRhIGRlbmdhbiB3YXJuYSBiZXJiZWRhLg0KDQo2LiAqKktla3VyYW5nYW4gOioqIA0KKiBUaWRhayBjb2NvayB1bnR1ayBkYXRhIGthdGVnb3JpIHRhbnBhIHVydXRhbiB3YWt0dS4NCiogU3VsaXQgZGliYWNhIGppa2EgYmFueWFrIGdhcmlzIHR1bXBhbmcgdGluZGloLg0KKiBUaWRhayBtZW51bmp1a2thbiB2YXJpYXNpIGRhbGFtIHNldGlhcCB0aXRpayBkYXRhLg0KDQotLS0NCg0KIyMgRGVuc2l0eSBQbG90DQpgYGB7cn0NCmdncGxvdChkYXRhLCBhZXMoeCA9IEtvbnN1bXNpX2tXaCwgZmlsbCA9IEN1YWNhKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjYpICsNCiAgbGFicyh0aXRsZSA9ICJLZXBhZGF0YW4gRGlzdHJpYnVzaSBLb25zdW1zaSBMaXN0cmlrIHBlciBDdWFjYSIsIHggPSAiS29uc3Vtc2kgKGtXaCkiLCB5ID0gIktlcGFkYXRhbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KMS4gKipQZW5qZWxhc2FuIENvZGUgOioqDQoNCiogKipnZ3Bsb3QoZGF0YSwgYWVzKHggPSBLb25zdW1zaV9rV2gsIGZpbGwgPSBDdWFjYSkpKiog4oaSIE1lbmV0YXBrYW4gZGF0YSBrb25zdW1zaSBsaXN0cmlrIGRlbmdhbiB3YXJuYSBiZXJkYXNhcmthbiBjdWFjYS4NCg0KKiAqKmdlb21fZGVuc2l0eShhbHBoYSA9IDAuNikqKiDihpIgTWVtYnVhdCBrdXJ2YSBrZXBhZGF0YW4gZGVuZ2FuIHRyYW5zcGFyYW5zaSA2MCUuDQoNCiogKipsYWJzKC4uLikqKiDihpIgTWVuYW1iYWhrYW4ganVkdWwgZGFuIGxhYmVsIHBhZGEgZ3JhZmlrLg0KDQoqICoqdGhlbWVfbWluaW1hbCgpKiog4oaSIE1lbmdhdHVyIHRhbXBpbGFuIGFnYXIgc2VkZXJoYW5hIGRhbiBiZXJzaWguDQoNCjIuICoqUGVuamVsYXNhbiBWaXN1YWxpc2FzaSA6KioNCg0KRGVuc2l0eSBwbG90IGluaSBtZW5hbXBpbGthbiBzZWJhcmFuIGtvbnN1bXNpIGxpc3RyaWsgdW50dWsgc2V0aWFwIGtvbmRpc2kgY3VhY2EgZGFsYW0gYmVudHVrIGt1cnZhIGhhbHVzLg0KU2V0aWFwIHdhcm5hIG1lbnVuanVra2FuIGthdGVnb3JpIGN1YWNhLCBkYW4gdGluZ2dpIGt1cnZhIG1lbnVuanVra2FuIGtlcGFkYXRhbiBkYXRhIGRpIG5pbGFpIHRlcnRlbnR1Lg0KR3JhZmlrIGluaSBiZXJndW5hIHVudHVrIG1lbWJhbmRpbmdrYW4gYmFnYWltYW5hIHBvbGEgZGlzdHJpYnVzaSBsaXN0cmlrIGJlcmJlZGEgYW50YXIgY3VhY2EuDQoNCjMuICoqRGVmaW5pc2kgOioqDQoNCkRlbnNpdHkgcGxvdCBhZGFsYWggZ3JhZmlrIGJlcmJlbnR1ayBrdXJ2YSB5YW5nIG1lbnVuanVra2FuIGRpc3RyaWJ1c2kgcHJvYmFiaWxpdGFzIGRhdGEgbnVtZXJpayBzZWNhcmEgaGFsdXMsDQptaXJpcCBoaXN0b2dyYW0gdGV0YXBpIHRhbnBhIGJhdGFuZywgc2VoaW5nZ2EgYmVudHVrIHNlYmFyYW4gZGF0YSB0ZXJsaWhhdCBsZWJpaCBtdWx1cy4NCg0KNC4gKipBdHVyYW4gUGVuZ2d1bmFhbiA6KioNCg0KR3VuYWthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YSBudW1lcmlrIGtvbnRpbnUsDQp0ZXJ1dGFtYSBzYWF0IGluZ2luIG1lbWJhbmRpbmdrYW4gYmVudHVrIGRpc3RyaWJ1c2kgYW50YXJhIGJlYmVyYXBhIGtlbG9tcG9rIGF0YXUga2F0ZWdvcmkuDQoNCjUuICoqS2VsZWJpaGFuIDoqKg0KKiBNZW5hbXBpbGthbiBiZW50dWsgZGlzdHJpYnVzaSBkYXRhIGRlbmdhbiBoYWx1cy4NCiogTXVkYWggbWVtYmFuZGluZ2thbiBwb2xhIGFudGFyYSBiZWJlcmFwYSBrZWxvbXBvay4NCiogTGViaWggcmFwaSBkaWJhbmRpbmcgaGlzdG9ncmFtIHNhYXQgZGF0YSBwYWRhdC4NCg0KNi4gKipLZWt1cmFuZ2FuIDoqKiANCiogVGlkYWsgbWVudW5qdWtrYW4ganVtbGFoIGRhdGEgc2VjYXJhIGxhbmdzdW5nLg0KKiBTdWxpdCBkaXRhZnNpcmthbiBqaWthIGRhdGEgdGVybGFsdSBzZWRpa2l0Lg0KKiBPdmVybGFwIGFudGFyIGt1cnZhIGRhcGF0IG1lbmd1cmFuZ2kga2V0ZXJiYWNhYW4uDQoNCiMjIFJpZ2dlbGluZQ0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBLb25zdW1zaV9rV2gsIHkgPSBDdWFjYSwgZmlsbCA9IEN1YWNhKSkgKw0KICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC43KSArDQogIGxhYnModGl0bGUgPSAiUmlkZ2VsaW5lIFBsb3QgS29uc3Vtc2kgTGlzdHJpayBCZXJkYXNhcmthbiBDdWFjYSIsIHggPSAiS29uc3Vtc2kgKGtXaCkiLCB5ID0gIkN1YWNhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoxLiAqKlBlbmplbGFzYW4gQ29kZSA6KioNCg0KKiAqKmdncGxvdChkYXRhLCBhZXMoeCA9IEtvbnN1bXNpX2tXaCwgeSA9IEN1YWNhLCBmaWxsID0gQ3VhY2EpKSoqIOKGkiBNZW5ldGFwa2FuIHN1bWJ1IFggdW50dWsga29uc3Vtc2kgbGlzdHJpayBkYW4gc3VtYnUgWSB1bnR1ayBrYXRlZ29yaSBjdWFjYS4NCg0KKiAqKmdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGEgPSAwLjcpKiog4oaSIE1lbWJ1YXQga3VydmEga2VwYWRhdGFuIGJlcnR1bXB1ayB1bnR1ayB0aWFwIGthdGVnb3JpLg0KDQoqICoqbGFicyguLi4pKiog4oaSIE1lbmFtYmFoa2FuIGp1ZHVsIGRhbiBsYWJlbCBzdW1idS4NCg0KKiAqKnRoZW1lX21pbmltYWwoKSoqIOKGkiBNZW5nYXR1ciB0YW1waWxhbiBhZ2FyIGJlcnNpaCBkYW4gcHJvZmVzaW9uYWwuDQoNCg0KMi4gKipQZW5qZWxhc2FuIFZpc3VhbGlzYXNpIDoqKg0KDQpSaWRnZWxpbmUgcGxvdCBpbmkgbWVuZ2dhbWJhcmthbiBwZXJiYW5kaW5nYW4gc2ViYXJhbiBrb25zdW1zaSBsaXN0cmlrIGFudGFyIGtvbmRpc2kgY3VhY2EgZGFsYW0gYmVudHVrIGt1cnZhIGJlcnR1bXB1ay4NClNldGlhcCBrdXJ2YSBtZW1wZXJsaWhhdGthbiBrZXBhZGF0YW4gZGF0YSB1bnR1ayBtYXNpbmctbWFzaW5nIGthdGVnb3JpLCBzZWhpbmdnYSBwZXJiZWRhYW4gcG9sYSBhbnRhciBjdWFjYSB0ZXJsaWhhdCBqZWxhcy4NCkdyYWZpayBpbmkgbWVtYmVyaWthbiB0YW1waWxhbiB2aXN1YWwgeWFuZyBtZW5hcmlrIHVudHVrIGFuYWxpc2lzIHBlcmJhbmRpbmdhbiBkaXN0cmlidXNpLg0KDQozLiAqKkRlZmluaXNpIDoqKg0KDQpSaWRnZWxpbmUgcGxvdCBhZGFsYWggdmFyaWFzaSBkYXJpIGRlbnNpdHkgcGxvdCB5YW5nIG1lbmFtcGlsa2FuIGJlYmVyYXBhIGt1cnZhIGRpc3RyaWJ1c2kgc2VjYXJhIGJlcnR1bXB1aw0KdW50dWsgbWVtYmFuZGluZ2thbiBiZW50dWsgc2ViYXJhbiBkYXRhIGRhcmkgYmVyYmFnYWkga2Vsb21wb2sga2F0ZWdvcmkuDQoNCjQuICoqQXR1cmFuIFBlbmdndW5hYW4gOioqDQoNCkd1bmFrYW4gcmlkZ2VsaW5lIHBsb3QgdW50dWsgZGF0YSBudW1lcmlrIGtvbnRpbnUgeWFuZyB0ZXJiYWdpIGRhbGFtIGJlYmVyYXBhIGtlbG9tcG9rIGthdGVnb3JpLA0Kc2VwZXJ0aSBrb25zdW1zaSBsaXN0cmlrIGJlcmRhc2Fya2FuIGN1YWNhLCB1bnR1ayBtZW55b3JvdGkgcGVyYmVkYWFuIHBvbGEgZGlzdHJpYnVzaSBhbnRhciBrZWxvbXBvay4NCg0KNS4gKipLZWxlYmloYW4gOioqDQoqIE1lbWJlcmlrYW4gdGFtcGlsYW4gdmlzdWFsIHlhbmcgbWVuYXJpayBkYW4gaW5mb3JtYXRpZi4NCiogTXVkYWggbWVtYmFuZGluZ2thbiBiYW55YWsga2F0ZWdvcmkgZGFsYW0gc2F0dSBncmFmaWsuDQoqIE1lbnVuanVra2FuIHBlcmJlZGFhbiBiZW50dWsgZGlzdHJpYnVzaSBkZW5nYW4gamVsYXMuDQoNCjYuICoqS2VrdXJhbmdhbiA6KiogDQoqIFN1bGl0IGRpYmFjYSBqaWthIHRlcmxhbHUgYmFueWFrIGthdGVnb3JpLg0KKiBCaXNhIG1lbWJpbmd1bmdrYW4gYmFnaSBwZW5nZ3VuYSBhd2FtLg0KKiBNZW1idXR1aGthbiBydWFuZyB2aXN1YWwgbGViaWggYmVzYXIgYWdhciB0ZXRhcCBqZWxhcy4NCg0KLS0tDQoNCiMgS2VzaW1wdWxhbg0KDQpCZXJkYXNhcmthbiBkYXRhIHlhbmcgZGloYXNpbGthbiwgZGFwYXQgZGlhbWF0aSBiYWh3YSBrb25kaXNpIGN1YWNhIGJlcnBlcmFuIHBlbnRpbmcgdGVyaGFkYXAgdGluZ2thdCBrb25zdW1zaSBsaXN0cmlrLiBTYWF0IGN1YWNhIHBhbmFzLCBrb25zdW1zaSBsaXN0cmlrIGNlbmRlcnVuZyBtZW5pbmdrYXQga2FyZW5hIHBlbmdndW5hYW4gYWxhdCBwZW5kaW5naW4gc2VwZXJ0aSBraXBhcyBhbmdpbiBkYW4gQUMgbGViaWggdGluZ2dpLiBTZWJhbGlrbnlhLCBwYWRhIHNhYXQgaHVqYW4sIGtvbnN1bXNpIGxpc3RyaWsgcmVsYXRpZiBtZW51cnVuIGthcmVuYSBzdWh1IGxpbmdrdW5nYW4gc3VkYWggY3VrdXAgc2VqdWssIEFzdW1zaWthbiBzYWphIGtldGlrYSBjdWFjYSBzZWRhbmcgcGFuYXMgcGVuZ2d1bmFhbiBhbGF0IHBlbmRpbmdpbiBydWFuZ2FuIDEwIGphbSBwZXJoYXJpLCBDZXJhaCBoYW55YSA4LDUgSmFtLCBkYW4gc2FhdCBodWphbiBtZW5qYWRpIDcgSmFtLg0KDQpTZWNhcmEga2VzZWx1cnVoYW4sIGRhdGFzZXQgaW5pIG1lbnVuanVra2FuIGtldGVya2FpdGFuIGxvZ2lzIGFudGFyYSB2YXJpYWJlbCBzdWh1LCBjdWFjYSwgZGFuIGtvbnN1bXNpIGxpc3RyaWssIHNlcnRhIGRhcGF0IG1lbmphZGkgY29udG9oIHByYWt0aXMgdW50dWsgbWVtYWhhbWkgamVuaXMgZGF0YSBkYW4gbG9naWthIHBlbmdlbG9tcG9rYW4gZGFsYW0gYW5hbGlzaXMgZGF0YSBkYXNhciBtZW5nZ3VuYWthbiBiYWhhc2EgUi4=