Halo aku mau nganalsiis kemiskinan menggunakan analisis ridge, lasso dan elastic nett Provinsi Sumatera Utara Variabel Y : Persentase Kemiskinan Variabel X : UHH, HLS, Rata-rata lama sekolah, Pengeluaran per Kapita, Jumlah Total Angkatan Kerja, TPAK (%), Jumlah Penduduk 2025, UMK 2025, TPT, KRT Pertanian, APS, PE, Bahan Bakar Masak, Sanitasi Taklayak, Jenis Lantai taklayak, Keluhan Kesehatan, Laju Penduduk, Rasio JK Semua Data dari Publikasi dan Tabel Dinamis yang tersedia di web BPS Sumut

library(readxl)
Data <- read_excel("Downloads/analisis kemiskinan data sumut.xlsx")



# Load library
library(glmnet)

# 1. Siapkan Variabel Dependen (Y) -> Persentase Kemiskinan
y <- Data$`Miskin (%)`

# 2. Siapkan Variabel Independen (X) 
# Ambil kolom variabelnya saja (sesuaikan indeks kolomnya)
x <- as.matrix( Data[, c("X1", "X2", "X3", "X3", 
                             "X4", "X5", "X6", "X7", 
                             "X8", "X9", "X10", "X11", 
                             "X12", "X13", 
                             "X14", "X15", "X16")])
#Mencari lamda terbaik
set.seed(123) # Biar hasil konsisten

# alpha = 0 artinya Ridge Regression
cv_ridge <- cv.glmnet(x, y, alpha = 0, standardize = TRUE)

# Ambil lambda paling optimal
best_lambda <- cv_ridge$lambda.min
print(paste("Lambda Optimal Sumut:", best_lambda))
[1] "Lambda Optimal Sumut: 1.37779764687927"
# Plot lambda (Bagus buat ditaruh di Bab 4)
plot(cv_ridge)

Nilai Lambda (λ) 1.37 ini menunjukkan bahwa model Ridge kamu memberikan penalti yang cukup kuat untuk “meredam” multikolinieritas di antara 17 variabel yang kamu punya.

#Eksekusi Model Ridge Baru 
# Fit model final
model_ridge_final <- glmnet(x, y, alpha = 0, lambda = best_lambda, standardize = TRUE)

# Tampilkan koefisien
coef(model_ridge_final)
18 x 1 sparse Matrix of class "dgCMatrix"
                       s0
(Intercept) -6.202407e+00
X1           5.570877e-01
X2          -5.941007e-01
X3          -5.078085e-01
X3          -5.082271e-01
X4          -2.142874e-04
X5           6.625567e-07
X6           1.641477e-02
X7           3.837907e-07
X8          -2.492073e-07
X9          -5.122148e-02
X10         -1.151732e-05
X11          1.019367e-01
X12         -1.862237e+00
X13          1.824346e-02
X14          2.112308e-02
X15          5.955808e-02
X16         -4.277213e-02
#Hitung Akurasi (R-Square & MSE)
# Prediksi
y_pred <- predict(model_ridge_final, s = best_lambda, newx = x)

# Hitung R-Squared
sst <- sum((y - mean(y))^2)
sse <- sum((y_pred - y)^2)
rsq <- 1 - (sse / sst)

# Hitung MSE & RMSE
mse <- mean((y - y_pred)^2)
rmse <- sqrt(mse)

print(paste("R-Squared Sumut:", rsq))
[1] "R-Squared Sumut: 0.857382753474833"
print(paste("MSE Sumut:", mse))
[1] "MSE Sumut: 2.47979971386065"
print(paste("RMSE Sumut:", rmse))
[1] "RMSE Sumut: 1.57473798260557"

R-Squared 85,7%: “Model yang Sangat Kuat” RMSE 1.57: “Akurasi Prediksi”

Nilai RMSE 1.57 artinya rata-rata kesalahan prediksi model kamu adalah sekitar 1,57 persen Kekuatan Ridge: Ridge sukses menangani variabel-variabel yang tadi “berantem” (multikol) dan mendudukkan mereka di porsi yang tepat.

# Plot koefisien Ridge
# Kita buat dulu objek fit yang berisi seluruh jalur lambda
fit_ridge <- glmnet(x, y, alpha = 0, standardize = TRUE)

# Sekarang baru di-plot
plot(fit_ridge, xvar = "lambda", label = TRUE)

  1. Arti Angka “17” di Atas

Angka 17 yang berjejer di bagian atas itu menunjukkan jumlah variabel independen. Di Ridge Regression, angkanya tetap 17 dari ujung kiri sampai ujung kanan. Ini membuktikan bahwa Ridge tidak membuang satu pun variabel, beda sama LASSO yang nanti angkanya bakal berkurang (misal jadi 10, 5, dst).

  1. Sumbu X: −log(λ)

Sisi Kanan (Angka Positif): Ini adalah kondisi saat Lambda sangat kecil (penaltinya rendah). Di sini koefisien variabel kamu terlihat “asli” dan bebas berekspresi. Kamu bisa lihat ada garis hitam (nomor 13) yang melesat tajam ke bawah.

Sisi Kiri (Angka Negatif): Ini adalah saat Lambda semakin besar (penalti diperketat). Perhatikan bagaimana semua garis warna-warni itu “dipaksa” mengumpul menuju angka 0.

  1. Siapa Garis yang Paling “Nendang”?

Lihat garis yang paling jauh dari garis tengah (0):

Garis Nomor 13 (Hitam ke bawah): Wah, ini adalah variabel paling dominan di Sumut! Berdasarkan data kamu, ini kemungkinan besar adalah Sanitasi/Kualitas Hidup. Dia punya pengaruh negatif yang sangat kuat terhadap kemiskinan.

Garis Nomor 1 (Hitam ke atas): Ini variabel dominan kedua yang pengaruhnya positif (meningkatkan kemiskinan).

Garis Nomor 2, 3, 4: Ini adalah pasukan pendukung yang juga punya pengaruh nyata.

# Gunakan lambda optimal yang tadi (1.377)
y_pred_sumut <- predict(model_ridge_final, s = 1.37779764687927, newx = x)
# Membuat dataframe untuk plot
plot_data <- data.frame(Aktual = y, Prediksi = as.vector(y_pred_sumut))

# Plot sederhana
plot(plot_data$Aktual, plot_data$Prediksi,
     main = "Kesesuaian Data Aktual vs Prediksi Ridge (Sumut)",
     xlab = "Data Kemiskinan Aktual (%)",
     ylab = "Hasil Prediksi Ridge (%)",
     pch = 19, col = "darkblue")
abline(0, 1, col = "red", lwd = 2) # Garis ideal

  1. Garis Merah adalah “Garis Kejujuran” Garis merah itu adalah garis y=x. Artinya, kalau titik biru pas kena garis merah, prediksi Ridge kamu 100% akurat sama dengan data BPS aslinya. Karena titik-titik kamu ngumpul rapat di situ, berarti model kamu Sakti Mandraguna buat memetakan kemiskinan Sumut.

  2. Analisis Titik yang “Melenceng” Lihat ada dua atau tiga titik di pojok kanan atas yang agak menjauh dari garis merah (prediksinya lebih rendah dari aslinya)?

Itu kemungkinan besar adalah Kabupaten Nias, Nias Barat, atau Nias Utara (yang kemiskinannya di atas 20%). Analisisnya: Kamu bisa bilang, meskipun model Ridge sudah bagus banget, tapi untuk wilayah kepulauan ekstrem seperti Nias, faktor kemiskinannya mungkin dipengaruhi variabel lain yang belum masuk model (misal: biaya logistik laut atau aksesibilitas geografis yang sangat sulit).

  1. “The Power of Ridge” Di bagian tengah (kemiskinan 5-10%), titik-titiknya rapi banget. Ini membuktikan bahwa untuk mayoritas kabupaten/kota di Sumut daratan, variabel yang kamu pakai (Pendidikan, Sanitasi, Morbiditas) sudah sangat cukup untuk menjelaskan kemiskinan.

##LASSO (Least Absolute Shrinkage and Selection Operator).##

set.seed(123)

# Cross-Validation untuk LASSO (alpha = 1)
cv_lasso_sumut <- cv.glmnet(x, y, alpha = 1, standardize = TRUE)

# Ambil lambda terbaik
best_lambda_lasso <- cv_lasso_sumut$lambda.min
print(paste("Lambda Optimal LASSO Sumut:", best_lambda_lasso))
[1] "Lambda Optimal LASSO Sumut: 0.109188107254409"
# Plot Cross-Validation LASSO
plot(cv_lasso_sumut)

Nilainya cukup kecil, yang artinya LASSO tidak akan terlalu brutal menghapus variabel, tapi tetap akan melakukan filtrasi yang signifikan.

  1. Fit Model LASSO & Seleksi Variabel
# Fit model final LASSO
model_lasso_sumut <- glmnet(x, y, alpha = 1, lambda = best_lambda_lasso, standardize = TRUE)

# Lihat variabel yang TIDAK nol
coef(model_lasso_sumut)
18 x 1 sparse Matrix of class "dgCMatrix"
                       s0
(Intercept) -3.126770e+01
X1           8.838726e-01
X2           .           
X3          -1.352752e+00
X3          -1.137099e-14
X4          -2.269811e-04
X5           1.183461e-06
X6           2.757770e-02
X7           .           
X8           .           
X9           .           
X10         -1.136743e-05
X11          .           
X12         -2.442108e+00
X13          .           
X14          2.785450e-02
X15          9.326466e-02
X16         -6.017968e-02
  1. Variabel yang “Gugur” (Jadi Titik .)

Variabel X2, X7, X8, X9, X11, dan X13 resmi dieliminasi.

Artinya: LASSO merasa variabel-variabel ini (mungkin TPT, UMK, atau beberapa indikator rumah tinggal) sudah terwakili oleh variabel lain yang lebih kuat. Ini bagus banget, San! Skripsi kamu jadi nggak “obesitas” variabel.

  1. Para “Juara Bertahan” (The Key Drivers)

X12 (-2.442): Lagi-lagi variabel Sanitasi/Fasilitas Rumah ini jadi pemenang mutlak. Koefisiennya makin kuat dibanding Ridge tadi. Ini variabel paling krusial buat nurunin kemiskinan di Sumut menurut model LASSO.

X3 (-1.352): Pendidikan (RLS/HLS) terbukti sangat tangguh. LASSO mempertahankan ini dengan koefisien negatif yang besar. Artinya, investasi di pendidikan itu “harga mati” buat Sumut.

X1 (0.883): Dimensi Kesehatan (Morbiditas/Angka Keluhan) tetap bertahan sebagai faktor yang meningkatkan kemiskinan.

  1. Fenomena X3 Dua Kali

Nah, di sini kelihatan jelas:

X3 yang pertama punya koefisien -1.35.

X3 yang kedua dapet koefisien -1.13e-14 (alias hampir NOL). Ini membuktikan kalau ada duplikasi data atau variabel yang sangat mirip di kolom X3 kamu. LASSO secara cerdas “mematikan” salah satunya agar tidak terjadi gangguan multikolinieritas.

#Hitung Akurasi LASSO (Bandingkan dengan Ridge)

# Prediksi
y_pred_lasso <- predict(model_lasso_sumut, s = best_lambda_lasso, newx = x)

# R-Squared LASSO
sst <- sum((y - mean(y))^2)
sse_lasso <- sum((y_pred_lasso - y)^2)
rsq_lasso <- 1 - (sse_lasso / sst)

# RMSE LASSO
rmse_lasso <- sqrt(mean((y - y_pred_lasso)^2))

print(paste("R-Squared LASSO:", rsq_lasso))
[1] "R-Squared LASSO: 0.886441059368236"
print(paste("RMSE LASSO:", rmse_lasso))
[1] "RMSE LASSO: 1.40518318854559"

R-Squared LASSO (88,6%) ternyata LEBIH TINGGI daripada Ridge (85,7%). Padahal LASSO sudah membuang beberapa variabel, tapi akurasinya justru makin tajam. Ini namanya model yang lean, mean, and powerful.

  1. Kenapa LASSO Menang dari Ridge? Biasanya Ridge lebih unggul kalau semua variabel punya pengaruh kecil yang merata. Tapi di data Sumut kamu, LASSO menang karena: Efek Pembersihan: Dengan membuang variabel “sampah” atau yang duplikat (seperti X3 kedua yang hampir nol), LASSO menghilangkan gangguan (noise) dalam model. Fokus pada Core Drivers: LASSO berhasil menemukan “sinyal” yang paling kuat dari variabel Sanitasi (X12) dan Pendidikan (X3).

  2. Akurasi Luar Biasa (RMSE 1.40) Nilai RMSE kamu turun dari 1.57 (Ridge) ke 1.40 (LASSO). Artinya, rata-rata melesetnya prediksi kamu cuma 1,4 persen poin. Untuk data kemiskinan yang variasinya lebar banget (Nias vs Deli Serdang), ini akurasi yang “sangat ngeri” bagusnya.

#Plot Perjalanan Seleksi (Coefficient Path)

fit_lasso <- glmnet(x, y, alpha = 1, standardize = TRUE)
plot(fit_lasso, xvar = "lambda", label = TRUE)

  1. Proses Seleksi Otomatis (Garis yang “Mati”) Perhatikan sisi kiri grafik (saat −log(λ) mendekati 0 atau angka negatif). Banyak garis yang tadinya warna-warni tiba-tiba menghilang dan menyatu ke garis nol. Itu adalah variabel-variabel “lemah” yang dipangkas oleh LASSO. atau bisa bilang: “Grafik ini membuktikan bahwa LASSO berhasil menyederhanakan model dari 17 prediktor menjadi hanya sekitar 11 prediktor utama tanpa kehilangan akurasi.”

  2. Tiga Naga Utama (Garis yang Bertahan Paling Lama)

Lihat tiga garis yang paling lebar jaraknya dari nol: Garis Nomor 13 (Hitam paling bawah): Ini variabel paling “sakti” (Sanitasi). Lihat betapa dia bertahan paling ujung, nggak mau menyerah ke angka nol. Artinya, sanitasi adalah akar masalah kemiskinan paling nyata di Sumut. Garis Nomor 3 (Hijau/Biru muda di bawah): Ini Pendidikan (RLS). Dia juga sangat dominan dan konsisten. Garis Nomor 1 (Hitam paling atas): Ini faktor kesehatan/morbiditas yang terus memperparah kemiskinan.

  1. “The Sweet Spot”

Lambda optimal ada di sekitar angka 6 (pada skala atas), di mana model menyisakan sekitar 11 variabel. Di situlah R-Squared kamu mencapai 88,6%.

##Elastic Nett 1. Mencari Alpha dan Lambda Terbaik Di Elastic Net, nggak cuma cari Lambda (λ), tapi juga cari Alpha (α). Alpha = 0 (Ridge) Alpha = 1 (LASSO) 0 < Alpha < 1 (Elastic Net) -> Biasanya kita pakai 0.5 sebagai titik tengah.

set.seed(123)

# Kita coba Alpha = 0.5 (Kombinasi 50-50 Ridge & LASSO)
cv_en_sumut <- cv.glmnet(x, y, alpha = 0.5, standardize = TRUE)

# Ambil Best Lambda
best_lambda_en <- cv_en_sumut$lambda.min
print(paste("Lambda Optimal Elastic Net:", best_lambda_en))
[1] "Lambda Optimal Elastic Net: 0.198976273481921"
# Plot Cross-Validation
plot(cv_en_sumut)

Nilainya 0.198, sedikit lebih tinggi dari lambda LASSO tadi (0.109). Ini menunjukkan Elastic Net memberikan penalti yang sedikit lebih “tegas” untuk menyeimbangkan antara seleksi variabel (seperti LASSO) dan stabilitas koefisien (seperti Ridge).

Fit Model Final & Cek Koefisien

# Fit model final
model_en_sumut <- glmnet(x, y, alpha = 0.5, lambda = best_lambda_en, standardize = TRUE)

# Tampilkan koefisien
coef(model_en_sumut)
18 x 1 sparse Matrix of class "dgCMatrix"
                       s0
(Intercept) -2.846282e+01
X1           8.422472e-01
X2           .           
X3          -6.539484e-01
X3          -6.920269e-01
X4          -2.347585e-04
X5           1.167630e-06
X6           2.864076e-02
X7           .           
X8           .           
X9           .           
X10         -1.151518e-05
X11          .           
X12         -2.390109e+00
X13          .           
X14          2.690348e-02
X15          8.998041e-02
X16         -5.841641e-02

Ada fenomena menarik yang terjadi di variabel X3 kamu:

  1. Pembuktian Grouping Effect (X3)

Ingat kan di LASSO tadi salah satu X3 “dimatikan” (jadi hampir nol)? Di Elastic Net, keduanya “dihidupkan” kembali dengan nilai yang hampir mirip (-0.65 dan -0.69). Interpretasinya: Elastic Net mendeteksi bahwa kedua variabel X3 ini (mungkin RLS dan HLS atau data duplikat) memiliki korelasi yang sangat kuat. Alih-alih memilih salah satu secara paksa seperti LASSO, Elastic Net membagi koefisiennya secara adil. Ini membuat model kamu jauh lebih stabil.

  1. Konsistensi Sang Juara (X12) Lagi dan lagi, X12 tetap menjadi pemegang koefisien negatif terbesar (-2.39). Ini membuktikan bahwa apa pun metodenya—Ridge, LASSO, atau Elastic Net—Sanitasi adalah faktor paling dominan dalam menjelaskan kemiskinan di Sumatera Utara. Hasil penelitian kamu sangat robust (tangguh)!

  2. Seleksi Variabel yang Bijak Meskipun tidak segalak LASSO, Elastic Net tetap berhasil membuang variabel yang tidak perlu (X2, X7, X8, X9, X11, X13 tetap jadi titik). Model tetap ringkas tapi tetap menjaga informasi dari variabel yang saling berkaitan.

Hitung Akurasi (The Moment of Truth)

# Prediksi
y_pred_en <- predict(model_en_sumut, s = best_lambda_en, newx = x)

# R-Squared Elastic Net
sst <- sum((y - mean(y))^2)
sse_en <- sum((y_pred_en - y)^2)
rsq_en <- 1 - (sse_en / sst)

# RMSE Elastic Net
rmse_en <- sqrt(mean((y - y_pred_en)^2))

print(paste("R-Squared Elastic Net:", rsq_en))
[1] "R-Squared Elastic Net: 0.884656277578749"
print(paste("RMSE Elastic Net:", rmse_en))
[1] "RMSE Elastic Net: 1.41618262120324"

Wah, hasilnya tipis banget ya! R-Squared Elastic Net kamu (88,46%) hampir setara dengan LASSO (88,64%). Meskipun secara angka LASSO unggul sedikit sekali di digit kedua belakang koma, Elastic Net memberikan stabilitas model yang lebih baik untuk data Sumut.

Plot Koefisien Path Elastic Net

fit_en <- glmnet(x, y, alpha = 0.5, standardize = TRUE)
plot(fit_en, xvar = "lambda", label = TRUE)

  1. Karakteristik “Grouping Effect”

Coba kamu perhatikan garis nomor 3 (hijau/biru muda di bawah). Di grafik ini, garisnya terlihat “berhimpitan” atau berjalan barengan. Inilah Grouping Effect. Di LASSO tadi, salah satunya dipaksa mati, tapi di Elastic Net, karena mereka dianggap satu kelompok (misal variabel pendidikan), mereka diperbolehkan masuk bareng dengan koefisien yang saling menyesuaikan. Ini bikin model kamu lebih stabil dan interpretasinya lebih adil secara ekonomi.

  1. Angka di Atas (0 → 17) Lihat pergerakan angka di atas plot: 0 → 9 → 13 → 17. Ini menunjukkan bahwa Elastic Net tetap melakukan seleksi variabel (seperti LASSO), tapi lebih lambat dan hati-hati. Saat −log(λ) makin ke kanan, variabel mulai masuk satu per satu sampai lengkap 17. Namun, saat penalti diperketat (makin ke kiri), dia menyisakan variabel-variabel yang benar-benar solid.

  2. Tiga Penguasa Sumatera Utara Sama seperti dua model sebelumnya, ada tiga garis yang paling “berani” menjauh dari nol: Garis 13 (Hitam Bawah): Tetap konsisten sebagai variabel paling dominan (Sanitasi). Pengaruhnya terhadap penurunan kemiskinan sangat masif. Garis 1 (Hitam Atas): Variabel kesehatan/morbiditas yang jadi faktor pendorong kemiskinan. Garis 3: Dimensi pendidikan yang stabil mendukung penurunan kemiskinan.

#PEMBAHASAN# Perbandingan Interpretasi Visual : Ridge: Menunjukkan bahwa semua variabel punya peran, meski kecil. LASSO: Menunjukkan efisiensi model dengan membuang variabel yang redundan. Elastic Net : Menunjukkan stabilitas model dengan tetap menjaga variabel yang berkorelasi (grouping) tanpa mengorbankan akurasi.

Syntax Gabungan

# 1. Ambil koefisien dari ketiga model (Pastikan nama modelnya sesuai)
coef_ridge <- as.matrix(coef(model_ridge_final, s = 1.37779764687927))
coef_lasso <- as.matrix(coef(model_lasso_sumut, s = 0.109188107254409))
coef_en    <- as.matrix(coef(model_en_sumut, s = 0.198976273481921))

# 2. Gabungkan menjadi satu tabel
tabel_perbandingan <- data.frame(
  Variabel = rownames(coef_ridge),
  Ridge = as.vector(coef_ridge),
  LASSO = as.vector(coef_lasso),
  Elastic_Net = as.vector(coef_en)
)

# 3. Bulatkan angka biar cantik (4 angka di belakang koma)
tabel_perbandingan[, 2:4] <- round(tabel_perbandingan[, 2:4], 4)

# 4. Tampilkan di Konsol
print(tabel_perbandingan)
      Variabel   Ridge    LASSO Elastic_Net
1  (Intercept) -6.2024 -31.2677    -28.4628
2           X1  0.5571   0.8839      0.8422
3           X2 -0.5941   0.0000      0.0000
4           X3 -0.5078  -1.3528     -0.6539
5           X3 -0.5082   0.0000     -0.6920
6           X4 -0.0002  -0.0002     -0.0002
7           X5  0.0000   0.0000      0.0000
8           X6  0.0164   0.0276      0.0286
9           X7  0.0000   0.0000      0.0000
10          X8  0.0000   0.0000      0.0000
11          X9 -0.0512   0.0000      0.0000
12         X10  0.0000   0.0000      0.0000
13         X11  0.1019   0.0000      0.0000
14         X12 -1.8622  -2.4421     -2.3901
15         X13  0.0182   0.0000      0.0000
16         X14  0.0211   0.0279      0.0269
17         X15  0.0596   0.0933      0.0900
18         X16 -0.0428  -0.0602     -0.0584
# 5. Ekspor ke CSV (Buka pakai Excel nanti)
write.csv(tabel_perbandingan, "Perbandingan_Koefisien_Sumut.csv", row.names = FALSE)

Syntax Tabel Performa Model (R-Square & RMSE)

# Buat tabel performa
tabel_performa <- data.frame(
  Metode = c("Ridge", "LASSO", "Elastic Net"),
  Alpha = c(0, 1, 0.5),
  R_Squared = c(0.8574, 0.8864, 0.8847),
  RMSE = c(1.5747, 1.4052, 1.4162)
)

print(tabel_performa)
       Metode Alpha R_Squared   RMSE
1       Ridge   0.0    0.8574 1.5747
2       LASSO   1.0    0.8864 1.4052
3 Elastic Net   0.5    0.8847 1.4162
# Ekspor
write.csv(tabel_performa, "Performa_Model_Sumut.csv", row.names = FALSE)

Konsistensi Variabel: Sebutkan bahwa variabel X12 (Sanitasi) dan X3 (Pendidikan) secara konsisten menjadi prediktor utama di ketiga metode dengan koefisien negatif yang kuat. Ini menunjukkan hasil yang Robust (Sangat Kuat).

Efisiensi LASSO: LASSO berhasil memberikan akurasi tertinggi (R 2 =88,6%) meskipun telah mereduksi jumlah variabel. Ini membuktikan bahwa tidak semua indikator kemiskinan memiliki pengaruh unik yang signifikan secara statistik di Sumut.

Stabilitas Elastic Net: Elastic Net memberikan hasil yang hampir sama dengan LASSO namun lebih stabil dalam menangani variabel yang saling berkorelasi (seperti dua variabel X3 kamu).

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpIYWxvIGFrdSBtYXUgbmdhbmFsc2lpcyBrZW1pc2tpbmFuIG1lbmdndW5ha2FuIGFuYWxpc2lzIHJpZGdlLCBsYXNzbyBkYW4gZWxhc3RpYyBuZXR0IFByb3ZpbnNpIFN1bWF0ZXJhIFV0YXJhIApWYXJpYWJlbCBZIDogUGVyc2VudGFzZSBLZW1pc2tpbmFuClZhcmlhYmVsIFggOiBVSEgsIEhMUywgUmF0YS1yYXRhIGxhbWEgc2Vrb2xhaCwgUGVuZ2VsdWFyYW4gcGVyIEthcGl0YSwgSnVtbGFoIFRvdGFsIEFuZ2thdGFuIEtlcmphLCBUUEFLICglKSwgSnVtbGFoIFBlbmR1ZHVrIDIwMjUsIFVNSyAyMDI1LCBUUFQsIEtSVCBQZXJ0YW5pYW4sIEFQUywgUEUsIEJhaGFuIEJha2FyIE1hc2FrLCBTYW5pdGFzaSBUYWtsYXlhaywgSmVuaXMgTGFudGFpIHRha2xheWFrLCBLZWx1aGFuIEtlc2VoYXRhbiwgTGFqdSBQZW5kdWR1aywgUmFzaW8gSksKU2VtdWEgRGF0YSBkYXJpIFB1Ymxpa2FzaSBkYW4gVGFiZWwgRGluYW1pcyB5YW5nIHRlcnNlZGlhIGRpIHdlYiBCUFMgU3VtdXQgCgoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpEYXRhIDwtIHJlYWRfZXhjZWwoIkRvd25sb2Fkcy9hbmFsaXNpcyBrZW1pc2tpbmFuIGRhdGEgc3VtdXQueGxzeCIpCgoKCiMgTG9hZCBsaWJyYXJ5CmxpYnJhcnkoZ2xtbmV0KQoKIyAxLiBTaWFwa2FuIFZhcmlhYmVsIERlcGVuZGVuIChZKSAtPiBQZXJzZW50YXNlIEtlbWlza2luYW4KeSA8LSBEYXRhJGBNaXNraW4gKCUpYAoKIyAyLiBTaWFwa2FuIFZhcmlhYmVsIEluZGVwZW5kZW4gKFgpIAojIEFtYmlsIGtvbG9tIHZhcmlhYmVsbnlhIHNhamEgKHNlc3VhaWthbiBpbmRla3Mga29sb21ueWEpCnggPC0gYXMubWF0cml4KCBEYXRhWywgYygiWDEiLCAiWDIiLCAiWDMiLCAiWDMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDQiLCAiWDUiLCAiWDYiLCAiWDciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDgiLCAiWDkiLCAiWDEwIiwgIlgxMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYMTIiLCAiWDEzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgxNCIsICJYMTUiLCAiWDE2IildKQpgYGAKYGBge1J9CiNNZW5jYXJpIGxhbWRhIHRlcmJhaWsKc2V0LnNlZWQoMTIzKSAjIEJpYXIgaGFzaWwga29uc2lzdGVuCgojIGFscGhhID0gMCBhcnRpbnlhIFJpZGdlIFJlZ3Jlc3Npb24KY3ZfcmlkZ2UgPC0gY3YuZ2xtbmV0KHgsIHksIGFscGhhID0gMCwgc3RhbmRhcmRpemUgPSBUUlVFKQoKIyBBbWJpbCBsYW1iZGEgcGFsaW5nIG9wdGltYWwKYmVzdF9sYW1iZGEgPC0gY3ZfcmlkZ2UkbGFtYmRhLm1pbgpwcmludChwYXN0ZSgiTGFtYmRhIE9wdGltYWwgU3VtdXQ6IiwgYmVzdF9sYW1iZGEpKQoKIyBQbG90IGxhbWJkYSAoQmFndXMgYnVhdCBkaXRhcnVoIGRpIEJhYiA0KQpwbG90KGN2X3JpZGdlKQoKYGBgCk5pbGFpIExhbWJkYSAozrspIDEuMzcgaW5pIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIFJpZGdlIGthbXUgbWVtYmVyaWthbiBwZW5hbHRpIHlhbmcgY3VrdXAga3VhdCB1bnR1ayAibWVyZWRhbSIgbXVsdGlrb2xpbmllcml0YXMgZGkgYW50YXJhIDE3IHZhcmlhYmVsIHlhbmcga2FtdSBwdW55YS4KCmBgYHtyfQojRWtzZWt1c2kgTW9kZWwgUmlkZ2UgQmFydSAKIyBGaXQgbW9kZWwgZmluYWwKbW9kZWxfcmlkZ2VfZmluYWwgPC0gZ2xtbmV0KHgsIHksIGFscGhhID0gMCwgbGFtYmRhID0gYmVzdF9sYW1iZGEsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgVGFtcGlsa2FuIGtvZWZpc2llbgpjb2VmKG1vZGVsX3JpZGdlX2ZpbmFsKQpgYGAKYGBge3J9CiNIaXR1bmcgQWt1cmFzaSAoUi1TcXVhcmUgJiBNU0UpCiMgUHJlZGlrc2kKeV9wcmVkIDwtIHByZWRpY3QobW9kZWxfcmlkZ2VfZmluYWwsIHMgPSBiZXN0X2xhbWJkYSwgbmV3eCA9IHgpCgojIEhpdHVuZyBSLVNxdWFyZWQKc3N0IDwtIHN1bSgoeSAtIG1lYW4oeSkpXjIpCnNzZSA8LSBzdW0oKHlfcHJlZCAtIHkpXjIpCnJzcSA8LSAxIC0gKHNzZSAvIHNzdCkKCiMgSGl0dW5nIE1TRSAmIFJNU0UKbXNlIDwtIG1lYW4oKHkgLSB5X3ByZWQpXjIpCnJtc2UgPC0gc3FydChtc2UpCgpwcmludChwYXN0ZSgiUi1TcXVhcmVkIFN1bXV0OiIsIHJzcSkpCnByaW50KHBhc3RlKCJNU0UgU3VtdXQ6IiwgbXNlKSkKcHJpbnQocGFzdGUoIlJNU0UgU3VtdXQ6Iiwgcm1zZSkpCmBgYApSLVNxdWFyZWQgODUsNyU6ICJNb2RlbCB5YW5nIFNhbmdhdCBLdWF0IgpSTVNFIDEuNTc6ICJBa3VyYXNpIFByZWRpa3NpIgoKTmlsYWkgUk1TRSAxLjU3IGFydGlueWEgcmF0YS1yYXRhIGtlc2FsYWhhbiBwcmVkaWtzaSBtb2RlbCBrYW11IGFkYWxhaCBzZWtpdGFyIDEsNTcgcGVyc2VuCktla3VhdGFuIFJpZGdlOiBSaWRnZSBzdWtzZXMgbWVuYW5nYW5pIHZhcmlhYmVsLXZhcmlhYmVsIHlhbmcgdGFkaSAiYmVyYW50ZW0iIChtdWx0aWtvbCkgZGFuIG1lbmR1ZHVra2FuIG1lcmVrYSBkaSBwb3JzaSB5YW5nIHRlcGF0LgoKYGBge3J9CiMgUGxvdCBrb2VmaXNpZW4gUmlkZ2UKIyBLaXRhIGJ1YXQgZHVsdSBvYmplayBmaXQgeWFuZyBiZXJpc2kgc2VsdXJ1aCBqYWx1ciBsYW1iZGEKZml0X3JpZGdlIDwtIGdsbW5ldCh4LCB5LCBhbHBoYSA9IDAsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgU2VrYXJhbmcgYmFydSBkaS1wbG90CnBsb3QoZml0X3JpZGdlLCB4dmFyID0gImxhbWJkYSIsIGxhYmVsID0gVFJVRSkKYGBgCjEuIEFydGkgQW5na2EgIjE3IiBkaSBBdGFzCgpBbmdrYSAxNyB5YW5nIGJlcmplamVyIGRpIGJhZ2lhbiBhdGFzIGl0dSBtZW51bmp1a2thbiBqdW1sYWggdmFyaWFiZWwgaW5kZXBlbmRlbi4gRGkgUmlkZ2UgUmVncmVzc2lvbiwgYW5na2FueWEgdGV0YXAgMTcgZGFyaSB1anVuZyBraXJpIHNhbXBhaSB1anVuZyBrYW5hbi4gSW5pIG1lbWJ1a3Rpa2FuIGJhaHdhIFJpZGdlIHRpZGFrIG1lbWJ1YW5nIHNhdHUgcHVuIHZhcmlhYmVsLCBiZWRhIHNhbWEgTEFTU08geWFuZyBuYW50aSBhbmdrYW55YSBiYWthbCBiZXJrdXJhbmcgKG1pc2FsIGphZGkgMTAsIDUsIGRzdCkuCgoyLiBTdW1idSBYOiDiiJJsb2cozrspCgpTaXNpIEthbmFuIChBbmdrYSBQb3NpdGlmKTogSW5pIGFkYWxhaCBrb25kaXNpIHNhYXQgTGFtYmRhIHNhbmdhdCBrZWNpbCAocGVuYWx0aW55YSByZW5kYWgpLiBEaSBzaW5pIGtvZWZpc2llbiB2YXJpYWJlbCBrYW11IHRlcmxpaGF0ICJhc2xpIiBkYW4gYmViYXMgYmVyZWtzcHJlc2kuIEthbXUgYmlzYSBsaWhhdCBhZGEgZ2FyaXMgaGl0YW0gKG5vbW9yIDEzKSB5YW5nIG1lbGVzYXQgdGFqYW0ga2UgYmF3YWguCgpTaXNpIEtpcmkgKEFuZ2thIE5lZ2F0aWYpOiBJbmkgYWRhbGFoIHNhYXQgTGFtYmRhIHNlbWFraW4gYmVzYXIgKHBlbmFsdGkgZGlwZXJrZXRhdCkuIFBlcmhhdGlrYW4gYmFnYWltYW5hIHNlbXVhIGdhcmlzIHdhcm5hLXdhcm5pIGl0dSAiZGlwYWtzYSIgbWVuZ3VtcHVsIG1lbnVqdSBhbmdrYSAwLgoKMy4gU2lhcGEgR2FyaXMgeWFuZyBQYWxpbmcgIk5lbmRhbmciPwoKTGloYXQgZ2FyaXMgeWFuZyBwYWxpbmcgamF1aCBkYXJpIGdhcmlzIHRlbmdhaCAoMCk6CgpHYXJpcyBOb21vciAxMyAoSGl0YW0ga2UgYmF3YWgpOiBXYWgsIGluaSBhZGFsYWggdmFyaWFiZWwgcGFsaW5nIGRvbWluYW4gZGkgU3VtdXQhIEJlcmRhc2Fya2FuIGRhdGEga2FtdSwgaW5pIGtlbXVuZ2tpbmFuIGJlc2FyIGFkYWxhaCBTYW5pdGFzaS9LdWFsaXRhcyBIaWR1cC4gRGlhIHB1bnlhIHBlbmdhcnVoIG5lZ2F0aWYgeWFuZyBzYW5nYXQga3VhdCB0ZXJoYWRhcCBrZW1pc2tpbmFuLgoKR2FyaXMgTm9tb3IgMSAoSGl0YW0ga2UgYXRhcyk6IEluaSB2YXJpYWJlbCBkb21pbmFuIGtlZHVhIHlhbmcgcGVuZ2FydWhueWEgcG9zaXRpZiAobWVuaW5na2F0a2FuIGtlbWlza2luYW4pLgoKR2FyaXMgTm9tb3IgMiwgMywgNDogSW5pIGFkYWxhaCBwYXN1a2FuIHBlbmR1a3VuZyB5YW5nIGp1Z2EgcHVueWEgcGVuZ2FydWggbnlhdGEuCgoKYGBge3J9CiMgR3VuYWthbiBsYW1iZGEgb3B0aW1hbCB5YW5nIHRhZGkgKDEuMzc3KQp5X3ByZWRfc3VtdXQgPC0gcHJlZGljdChtb2RlbF9yaWRnZV9maW5hbCwgcyA9IDEuMzc3Nzk3NjQ2ODc5MjcsIG5ld3ggPSB4KQojIE1lbWJ1YXQgZGF0YWZyYW1lIHVudHVrIHBsb3QKcGxvdF9kYXRhIDwtIGRhdGEuZnJhbWUoQWt0dWFsID0geSwgUHJlZGlrc2kgPSBhcy52ZWN0b3IoeV9wcmVkX3N1bXV0KSkKCiMgUGxvdCBzZWRlcmhhbmEKcGxvdChwbG90X2RhdGEkQWt0dWFsLCBwbG90X2RhdGEkUHJlZGlrc2ksCiAgICAgbWFpbiA9ICJLZXNlc3VhaWFuIERhdGEgQWt0dWFsIHZzIFByZWRpa3NpIFJpZGdlIChTdW11dCkiLAogICAgIHhsYWIgPSAiRGF0YSBLZW1pc2tpbmFuIEFrdHVhbCAoJSkiLAogICAgIHlsYWIgPSAiSGFzaWwgUHJlZGlrc2kgUmlkZ2UgKCUpIiwKICAgICBwY2ggPSAxOSwgY29sID0gImRhcmtibHVlIikKYWJsaW5lKDAsIDEsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKSAjIEdhcmlzIGlkZWFsCgpgYGAKMS4gR2FyaXMgTWVyYWggYWRhbGFoICJHYXJpcyBLZWp1anVyYW4iCkdhcmlzIG1lcmFoIGl0dSBhZGFsYWggZ2FyaXMgeT14LiBBcnRpbnlhLCBrYWxhdSB0aXRpayBiaXJ1IHBhcyBrZW5hIGdhcmlzIG1lcmFoLCBwcmVkaWtzaSBSaWRnZSBrYW11IDEwMCUgYWt1cmF0IHNhbWEgZGVuZ2FuIGRhdGEgQlBTIGFzbGlueWEuIEthcmVuYSB0aXRpay10aXRpayBrYW11IG5ndW1wdWwgcmFwYXQgZGkgc2l0dSwgYmVyYXJ0aSBtb2RlbCBrYW11IFNha3RpIE1hbmRyYWd1bmEgYnVhdCBtZW1ldGFrYW4ga2VtaXNraW5hbiBTdW11dC4KCjIuIEFuYWxpc2lzIFRpdGlrIHlhbmcgIk1lbGVuY2VuZyIKTGloYXQgYWRhIGR1YSBhdGF1IHRpZ2EgdGl0aWsgZGkgcG9qb2sga2FuYW4gYXRhcyB5YW5nIGFnYWsgbWVuamF1aCBkYXJpIGdhcmlzIG1lcmFoIChwcmVkaWtzaW55YSBsZWJpaCByZW5kYWggZGFyaSBhc2xpbnlhKT8KCkl0dSBrZW11bmdraW5hbiBiZXNhciBhZGFsYWggS2FidXBhdGVuIE5pYXMsIE5pYXMgQmFyYXQsIGF0YXUgTmlhcyBVdGFyYSAoeWFuZyBrZW1pc2tpbmFubnlhIGRpIGF0YXMgMjAlKS4KQW5hbGlzaXNueWE6IEthbXUgYmlzYSBiaWxhbmcsIG1lc2tpcHVuIG1vZGVsIFJpZGdlIHN1ZGFoIGJhZ3VzIGJhbmdldCwgdGFwaSB1bnR1ayB3aWxheWFoIGtlcHVsYXVhbiBla3N0cmVtIHNlcGVydGkgTmlhcywgZmFrdG9yIGtlbWlza2luYW5ueWEgbXVuZ2tpbiBkaXBlbmdhcnVoaSB2YXJpYWJlbCBsYWluIHlhbmcgYmVsdW0gbWFzdWsgbW9kZWwgKG1pc2FsOiBiaWF5YSBsb2dpc3RpayBsYXV0IGF0YXUgYWtzZXNpYmlsaXRhcyBnZW9ncmFmaXMgeWFuZyBzYW5nYXQgc3VsaXQpLgoKMy4gIlRoZSBQb3dlciBvZiBSaWRnZSIKRGkgYmFnaWFuIHRlbmdhaCAoa2VtaXNraW5hbiA1LTEwJSksIHRpdGlrLXRpdGlrbnlhIHJhcGkgYmFuZ2V0LiBJbmkgbWVtYnVrdGlrYW4gYmFod2EgdW50dWsgbWF5b3JpdGFzIGthYnVwYXRlbi9rb3RhIGRpIFN1bXV0IGRhcmF0YW4sIHZhcmlhYmVsIHlhbmcga2FtdSBwYWthaSAoUGVuZGlkaWthbiwgU2FuaXRhc2ksIE1vcmJpZGl0YXMpIHN1ZGFoIHNhbmdhdCBjdWt1cCB1bnR1ayBtZW5qZWxhc2thbiBrZW1pc2tpbmFuLgoKCiMjTEFTU08gKExlYXN0IEFic29sdXRlIFNocmlua2FnZSBhbmQgU2VsZWN0aW9uIE9wZXJhdG9yKS4jIwpgYGB7cn0Kc2V0LnNlZWQoMTIzKQoKIyBDcm9zcy1WYWxpZGF0aW9uIHVudHVrIExBU1NPIChhbHBoYSA9IDEpCmN2X2xhc3NvX3N1bXV0IDwtIGN2LmdsbW5ldCh4LCB5LCBhbHBoYSA9IDEsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgQW1iaWwgbGFtYmRhIHRlcmJhaWsKYmVzdF9sYW1iZGFfbGFzc28gPC0gY3ZfbGFzc29fc3VtdXQkbGFtYmRhLm1pbgpwcmludChwYXN0ZSgiTGFtYmRhIE9wdGltYWwgTEFTU08gU3VtdXQ6IiwgYmVzdF9sYW1iZGFfbGFzc28pKQoKIyBQbG90IENyb3NzLVZhbGlkYXRpb24gTEFTU08KcGxvdChjdl9sYXNzb19zdW11dCkKYGBgCk5pbGFpbnlhIGN1a3VwIGtlY2lsLCB5YW5nIGFydGlueWEgTEFTU08gdGlkYWsgYWthbiB0ZXJsYWx1IGJydXRhbCBtZW5naGFwdXMgdmFyaWFiZWwsIHRhcGkgdGV0YXAgYWthbiBtZWxha3VrYW4gZmlsdHJhc2kgeWFuZyBzaWduaWZpa2FuLgoKCjIuIEZpdCBNb2RlbCBMQVNTTyAmIFNlbGVrc2kgVmFyaWFiZWwKCmBgYHtyfQojIEZpdCBtb2RlbCBmaW5hbCBMQVNTTwptb2RlbF9sYXNzb19zdW11dCA8LSBnbG1uZXQoeCwgeSwgYWxwaGEgPSAxLCBsYW1iZGEgPSBiZXN0X2xhbWJkYV9sYXNzbywgc3RhbmRhcmRpemUgPSBUUlVFKQoKIyBMaWhhdCB2YXJpYWJlbCB5YW5nIFRJREFLIG5vbApjb2VmKG1vZGVsX2xhc3NvX3N1bXV0KQpgYGAKMS4gVmFyaWFiZWwgeWFuZyAiR3VndXIiIChKYWRpIFRpdGlrIC4pCgpWYXJpYWJlbCBYMiwgWDcsIFg4LCBYOSwgWDExLCBkYW4gWDEzIHJlc21pIGRpZWxpbWluYXNpLgoKQXJ0aW55YTogTEFTU08gbWVyYXNhIHZhcmlhYmVsLXZhcmlhYmVsIGluaSAobXVuZ2tpbiBUUFQsIFVNSywgYXRhdSBiZWJlcmFwYSBpbmRpa2F0b3IgcnVtYWggdGluZ2dhbCkgc3VkYWggdGVyd2FraWxpIG9sZWggdmFyaWFiZWwgbGFpbiB5YW5nIGxlYmloIGt1YXQuIEluaSBiYWd1cyBiYW5nZXQsIFNhbiEgU2tyaXBzaSBrYW11IGphZGkgbmdnYWsgIm9iZXNpdGFzIiB2YXJpYWJlbC4KCjIuIFBhcmEgIkp1YXJhIEJlcnRhaGFuIiAoVGhlIEtleSBEcml2ZXJzKQoKWDEyICgtMi40NDIpOiBMYWdpLWxhZ2kgdmFyaWFiZWwgU2FuaXRhc2kvRmFzaWxpdGFzIFJ1bWFoIGluaSBqYWRpIHBlbWVuYW5nIG11dGxhay4gS29lZmlzaWVubnlhIG1ha2luIGt1YXQgZGliYW5kaW5nIFJpZGdlIHRhZGkuIEluaSB2YXJpYWJlbCBwYWxpbmcga3J1c2lhbCBidWF0IG51cnVuaW4ga2VtaXNraW5hbiBkaSBTdW11dCBtZW51cnV0IG1vZGVsIExBU1NPLgoKWDMgKC0xLjM1Mik6IFBlbmRpZGlrYW4gKFJMUy9ITFMpIHRlcmJ1a3RpIHNhbmdhdCB0YW5nZ3VoLiBMQVNTTyBtZW1wZXJ0YWhhbmthbiBpbmkgZGVuZ2FuIGtvZWZpc2llbiBuZWdhdGlmIHlhbmcgYmVzYXIuIEFydGlueWEsIGludmVzdGFzaSBkaSBwZW5kaWRpa2FuIGl0dSAiaGFyZ2EgbWF0aSIgYnVhdCBTdW11dC4KClgxICgwLjg4Myk6IERpbWVuc2kgS2VzZWhhdGFuIChNb3JiaWRpdGFzL0FuZ2thIEtlbHVoYW4pIHRldGFwIGJlcnRhaGFuIHNlYmFnYWkgZmFrdG9yIHlhbmcgbWVuaW5na2F0a2FuIGtlbWlza2luYW4uCgozLiBGZW5vbWVuYSBYMyBEdWEgS2FsaQoKTmFoLCBkaSBzaW5pIGtlbGloYXRhbiBqZWxhczoKClgzIHlhbmcgcGVydGFtYSBwdW55YSBrb2VmaXNpZW4gLTEuMzUuCgpYMyB5YW5nIGtlZHVhIGRhcGV0IGtvZWZpc2llbiAtMS4xM2UtMTQgKGFsaWFzIGhhbXBpciBOT0wpLgpJbmkgbWVtYnVrdGlrYW4ga2FsYXUgYWRhIGR1cGxpa2FzaSBkYXRhIGF0YXUgdmFyaWFiZWwgeWFuZyBzYW5nYXQgbWlyaXAgZGkga29sb20gWDMga2FtdS4gTEFTU08gc2VjYXJhIGNlcmRhcyAibWVtYXRpa2FuIiBzYWxhaCBzYXR1bnlhIGFnYXIgdGlkYWsgdGVyamFkaSBnYW5nZ3VhbiBtdWx0aWtvbGluaWVyaXRhcy4KCgojSGl0dW5nIEFrdXJhc2kgTEFTU08gKEJhbmRpbmdrYW4gZGVuZ2FuIFJpZGdlKQpgYGB7cn0KIyBQcmVkaWtzaQp5X3ByZWRfbGFzc28gPC0gcHJlZGljdChtb2RlbF9sYXNzb19zdW11dCwgcyA9IGJlc3RfbGFtYmRhX2xhc3NvLCBuZXd4ID0geCkKCiMgUi1TcXVhcmVkIExBU1NPCnNzdCA8LSBzdW0oKHkgLSBtZWFuKHkpKV4yKQpzc2VfbGFzc28gPC0gc3VtKCh5X3ByZWRfbGFzc28gLSB5KV4yKQpyc3FfbGFzc28gPC0gMSAtIChzc2VfbGFzc28gLyBzc3QpCgojIFJNU0UgTEFTU08Kcm1zZV9sYXNzbyA8LSBzcXJ0KG1lYW4oKHkgLSB5X3ByZWRfbGFzc28pXjIpKQoKcHJpbnQocGFzdGUoIlItU3F1YXJlZCBMQVNTTzoiLCByc3FfbGFzc28pKQpwcmludChwYXN0ZSgiUk1TRSBMQVNTTzoiLCBybXNlX2xhc3NvKSkKYGBgClItU3F1YXJlZCBMQVNTTyAoODgsNiUpIHRlcm55YXRhIExFQklIIFRJTkdHSSBkYXJpcGFkYSBSaWRnZSAoODUsNyUpLiBQYWRhaGFsIExBU1NPIHN1ZGFoIG1lbWJ1YW5nIGJlYmVyYXBhIHZhcmlhYmVsLCB0YXBpIGFrdXJhc2lueWEganVzdHJ1IG1ha2luIHRhamFtLiBJbmkgbmFtYW55YSBtb2RlbCB5YW5nIGxlYW4sIG1lYW4sIGFuZCBwb3dlcmZ1bC4KCjEuIEtlbmFwYSBMQVNTTyBNZW5hbmcgZGFyaSBSaWRnZT8KQmlhc2FueWEgUmlkZ2UgbGViaWggdW5nZ3VsIGthbGF1IHNlbXVhIHZhcmlhYmVsIHB1bnlhIHBlbmdhcnVoIGtlY2lsIHlhbmcgbWVyYXRhLiBUYXBpIGRpIGRhdGEgU3VtdXQga2FtdSwgTEFTU08gbWVuYW5nIGthcmVuYToKRWZlayBQZW1iZXJzaWhhbjogRGVuZ2FuIG1lbWJ1YW5nIHZhcmlhYmVsICJzYW1wYWgiIGF0YXUgeWFuZyBkdXBsaWthdCAoc2VwZXJ0aSBYMyBrZWR1YSB5YW5nIGhhbXBpciBub2wpLCBMQVNTTyBtZW5naGlsYW5na2FuIGdhbmdndWFuIChub2lzZSkgZGFsYW0gbW9kZWwuCkZva3VzIHBhZGEgQ29yZSBEcml2ZXJzOiBMQVNTTyBiZXJoYXNpbCBtZW5lbXVrYW4gInNpbnlhbCIgeWFuZyBwYWxpbmcga3VhdCBkYXJpIHZhcmlhYmVsIFNhbml0YXNpIChYMTIpIGRhbiBQZW5kaWRpa2FuIChYMykuCgoyLiBBa3VyYXNpIEx1YXIgQmlhc2EgKFJNU0UgMS40MCkKTmlsYWkgUk1TRSBrYW11IHR1cnVuIGRhcmkgMS41NyAoUmlkZ2UpIGtlIDEuNDAgKExBU1NPKS4gQXJ0aW55YSwgcmF0YS1yYXRhIG1lbGVzZXRueWEgcHJlZGlrc2kga2FtdSBjdW1hIDEsNCBwZXJzZW4gcG9pbi4gVW50dWsgZGF0YSBrZW1pc2tpbmFuIHlhbmcgdmFyaWFzaW55YSBsZWJhciBiYW5nZXQgKE5pYXMgdnMgRGVsaSBTZXJkYW5nKSwgaW5pIGFrdXJhc2kgeWFuZyAic2FuZ2F0IG5nZXJpIiBiYWd1c255YS4KCiNQbG90IFBlcmphbGFuYW4gU2VsZWtzaSAoQ29lZmZpY2llbnQgUGF0aCkKYGBge3J9CmZpdF9sYXNzbyA8LSBnbG1uZXQoeCwgeSwgYWxwaGEgPSAxLCBzdGFuZGFyZGl6ZSA9IFRSVUUpCnBsb3QoZml0X2xhc3NvLCB4dmFyID0gImxhbWJkYSIsIGxhYmVsID0gVFJVRSkKYGBgCjEuIFByb3NlcyBTZWxla3NpIE90b21hdGlzIChHYXJpcyB5YW5nICJNYXRpIikKUGVyaGF0aWthbiBzaXNpIGtpcmkgZ3JhZmlrIChzYWF0IOKIkmxvZyjOuykgbWVuZGVrYXRpIDAgYXRhdSBhbmdrYSBuZWdhdGlmKS4gQmFueWFrIGdhcmlzIHlhbmcgdGFkaW55YSB3YXJuYS13YXJuaSB0aWJhLXRpYmEgbWVuZ2hpbGFuZyBkYW4gbWVueWF0dSBrZSBnYXJpcyBub2wuIEl0dSBhZGFsYWggdmFyaWFiZWwtdmFyaWFiZWwgImxlbWFoIiB5YW5nIGRpcGFuZ2thcyBvbGVoIExBU1NPLiBhdGF1IGJpc2EgYmlsYW5nOiAiR3JhZmlrIGluaSBtZW1idWt0aWthbiBiYWh3YSBMQVNTTyBiZXJoYXNpbCBtZW55ZWRlcmhhbmFrYW4gbW9kZWwgZGFyaSAxNyBwcmVkaWt0b3IgbWVuamFkaSBoYW55YSBzZWtpdGFyIDExIHByZWRpa3RvciB1dGFtYSB0YW5wYSBrZWhpbGFuZ2FuIGFrdXJhc2kuIgoKMi4gVGlnYSBOYWdhIFV0YW1hIChHYXJpcyB5YW5nIEJlcnRhaGFuIFBhbGluZyBMYW1hKQoKTGloYXQgdGlnYSBnYXJpcyB5YW5nIHBhbGluZyBsZWJhciBqYXJha255YSBkYXJpIG5vbDoKR2FyaXMgTm9tb3IgMTMgKEhpdGFtIHBhbGluZyBiYXdhaCk6IEluaSB2YXJpYWJlbCBwYWxpbmcgInNha3RpIiAgKFNhbml0YXNpKS4gTGloYXQgYmV0YXBhIGRpYSBiZXJ0YWhhbiBwYWxpbmcgdWp1bmcsIG5nZ2FrIG1hdSBtZW55ZXJhaCBrZSBhbmdrYSBub2wuIEFydGlueWEsIHNhbml0YXNpIGFkYWxhaCBha2FyIG1hc2FsYWgga2VtaXNraW5hbiBwYWxpbmcgbnlhdGEgZGkgU3VtdXQuCkdhcmlzIE5vbW9yIDMgKEhpamF1L0JpcnUgbXVkYSBkaSBiYXdhaCk6IEluaSBQZW5kaWRpa2FuIChSTFMpLiBEaWEganVnYSBzYW5nYXQgZG9taW5hbiBkYW4ga29uc2lzdGVuLgpHYXJpcyBOb21vciAxIChIaXRhbSBwYWxpbmcgYXRhcyk6IEluaSBmYWt0b3Iga2VzZWhhdGFuL21vcmJpZGl0YXMgeWFuZyB0ZXJ1cyBtZW1wZXJwYXJhaCBrZW1pc2tpbmFuLgoKMy4gIlRoZSBTd2VldCBTcG90IgoKTGFtYmRhIG9wdGltYWwgIGFkYSBkaSBzZWtpdGFyIGFuZ2thIDYgKHBhZGEgc2thbGEgYXRhcyksIGRpIG1hbmEgbW9kZWwgIG1lbnlpc2FrYW4gc2VraXRhciAxMSB2YXJpYWJlbC4gRGkgc2l0dWxhaCBSLVNxdWFyZWQga2FtdSBtZW5jYXBhaSA4OCw2JS4KCgojI0VsYXN0aWMgTmV0dAoxLiBNZW5jYXJpIEFscGhhIGRhbiBMYW1iZGEgVGVyYmFpawpEaSBFbGFzdGljIE5ldCwgbmdnYWsgY3VtYSBjYXJpIExhbWJkYSAozrspLCB0YXBpIGp1Z2EgY2FyaSBBbHBoYSAozrEpLgpBbHBoYSA9IDAgKFJpZGdlKQpBbHBoYSA9IDEgKExBU1NPKQowIDwgQWxwaGEgPCAxIChFbGFzdGljIE5ldCkgLT4gQmlhc2FueWEga2l0YSBwYWthaSAwLjUgc2ViYWdhaSB0aXRpayB0ZW5nYWguCgpgYGB7cn0Kc2V0LnNlZWQoMTIzKQoKIyBLaXRhIGNvYmEgQWxwaGEgPSAwLjUgKEtvbWJpbmFzaSA1MC01MCBSaWRnZSAmIExBU1NPKQpjdl9lbl9zdW11dCA8LSBjdi5nbG1uZXQoeCwgeSwgYWxwaGEgPSAwLjUsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgQW1iaWwgQmVzdCBMYW1iZGEKYmVzdF9sYW1iZGFfZW4gPC0gY3ZfZW5fc3VtdXQkbGFtYmRhLm1pbgpwcmludChwYXN0ZSgiTGFtYmRhIE9wdGltYWwgRWxhc3RpYyBOZXQ6IiwgYmVzdF9sYW1iZGFfZW4pKQoKIyBQbG90IENyb3NzLVZhbGlkYXRpb24KcGxvdChjdl9lbl9zdW11dCkKCmBgYApOaWxhaW55YSAwLjE5OCwgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBsYW1iZGEgTEFTU08gdGFkaSAoMC4xMDkpLiBJbmkgbWVudW5qdWtrYW4gRWxhc3RpYyBOZXQgbWVtYmVyaWthbiBwZW5hbHRpIHlhbmcgc2VkaWtpdCBsZWJpaCAidGVnYXMiIHVudHVrIG1lbnllaW1iYW5na2FuIGFudGFyYSBzZWxla3NpIHZhcmlhYmVsIChzZXBlcnRpIExBU1NPKSBkYW4gc3RhYmlsaXRhcyBrb2VmaXNpZW4gKHNlcGVydGkgUmlkZ2UpLgoKRml0IE1vZGVsIEZpbmFsICYgQ2VrIEtvZWZpc2llbgpgYGB7cn0KIyBGaXQgbW9kZWwgZmluYWwKbW9kZWxfZW5fc3VtdXQgPC0gZ2xtbmV0KHgsIHksIGFscGhhID0gMC41LCBsYW1iZGEgPSBiZXN0X2xhbWJkYV9lbiwgc3RhbmRhcmRpemUgPSBUUlVFKQoKIyBUYW1waWxrYW4ga29lZmlzaWVuCmNvZWYobW9kZWxfZW5fc3VtdXQpCmBgYApBZGEgZmVub21lbmEgbWVuYXJpayB5YW5nIHRlcmphZGkgZGkgdmFyaWFiZWwgWDMga2FtdToKCjEuIFBlbWJ1a3RpYW4gR3JvdXBpbmcgRWZmZWN0IChYMykKCkluZ2F0IGthbiBkaSBMQVNTTyB0YWRpIHNhbGFoIHNhdHUgWDMgImRpbWF0aWthbiIgKGphZGkgaGFtcGlyIG5vbCk/IERpIEVsYXN0aWMgTmV0LCBrZWR1YW55YSAiZGloaWR1cGthbiIga2VtYmFsaSBkZW5nYW4gbmlsYWkgeWFuZyBoYW1waXIgbWlyaXAgKC0wLjY1IGRhbiAtMC42OSkuCkludGVycHJldGFzaW55YTogRWxhc3RpYyBOZXQgbWVuZGV0ZWtzaSBiYWh3YSBrZWR1YSB2YXJpYWJlbCBYMyBpbmkgKG11bmdraW4gUkxTIGRhbiBITFMgYXRhdSBkYXRhIGR1cGxpa2F0KSBtZW1pbGlraSBrb3JlbGFzaSB5YW5nIHNhbmdhdCBrdWF0LiBBbGloLWFsaWggbWVtaWxpaCBzYWxhaCBzYXR1IHNlY2FyYSBwYWtzYSBzZXBlcnRpIExBU1NPLCBFbGFzdGljIE5ldCBtZW1iYWdpIGtvZWZpc2llbm55YSBzZWNhcmEgYWRpbC4gSW5pIG1lbWJ1YXQgbW9kZWwga2FtdSBqYXVoIGxlYmloIHN0YWJpbC4KCjIuIEtvbnNpc3RlbnNpIFNhbmcgSnVhcmEgKFgxMikKTGFnaSBkYW4gbGFnaSwgWDEyIHRldGFwIG1lbmphZGkgcGVtZWdhbmcga29lZmlzaWVuIG5lZ2F0aWYgdGVyYmVzYXIgKC0yLjM5KS4gSW5pIG1lbWJ1a3Rpa2FuIGJhaHdhIGFwYSBwdW4gbWV0b2Rlbnlh4oCUUmlkZ2UsIExBU1NPLCBhdGF1IEVsYXN0aWMgTmV04oCUU2FuaXRhc2kgYWRhbGFoIGZha3RvciBwYWxpbmcgZG9taW5hbiBkYWxhbSBtZW5qZWxhc2thbiBrZW1pc2tpbmFuIGRpIFN1bWF0ZXJhIFV0YXJhLiBIYXNpbCBwZW5lbGl0aWFuIGthbXUgc2FuZ2F0IHJvYnVzdCAodGFuZ2d1aCkhCgozLiBTZWxla3NpIFZhcmlhYmVsIHlhbmcgQmlqYWsKTWVza2lwdW4gdGlkYWsgc2VnYWxhayBMQVNTTywgRWxhc3RpYyBOZXQgdGV0YXAgYmVyaGFzaWwgbWVtYnVhbmcgdmFyaWFiZWwgeWFuZyB0aWRhayBwZXJsdSAoWDIsIFg3LCBYOCwgWDksIFgxMSwgWDEzIHRldGFwIGphZGkgdGl0aWspLiBNb2RlbCAgdGV0YXAgcmluZ2thcyB0YXBpIHRldGFwIG1lbmphZ2EgaW5mb3JtYXNpIGRhcmkgdmFyaWFiZWwgeWFuZyBzYWxpbmcgYmVya2FpdGFuLgoKCkhpdHVuZyBBa3VyYXNpIChUaGUgTW9tZW50IG9mIFRydXRoKQpgYGB7cn0KIyBQcmVkaWtzaQp5X3ByZWRfZW4gPC0gcHJlZGljdChtb2RlbF9lbl9zdW11dCwgcyA9IGJlc3RfbGFtYmRhX2VuLCBuZXd4ID0geCkKCiMgUi1TcXVhcmVkIEVsYXN0aWMgTmV0CnNzdCA8LSBzdW0oKHkgLSBtZWFuKHkpKV4yKQpzc2VfZW4gPC0gc3VtKCh5X3ByZWRfZW4gLSB5KV4yKQpyc3FfZW4gPC0gMSAtIChzc2VfZW4gLyBzc3QpCgojIFJNU0UgRWxhc3RpYyBOZXQKcm1zZV9lbiA8LSBzcXJ0KG1lYW4oKHkgLSB5X3ByZWRfZW4pXjIpKQoKcHJpbnQocGFzdGUoIlItU3F1YXJlZCBFbGFzdGljIE5ldDoiLCByc3FfZW4pKQpwcmludChwYXN0ZSgiUk1TRSBFbGFzdGljIE5ldDoiLCBybXNlX2VuKSkKYGBgCldhaCwgaGFzaWxueWEgdGlwaXMgYmFuZ2V0IHlhISBSLVNxdWFyZWQgRWxhc3RpYyBOZXQga2FtdSAoODgsNDYlKSBoYW1waXIgc2V0YXJhIGRlbmdhbiBMQVNTTyAoODgsNjQlKS4gTWVza2lwdW4gc2VjYXJhIGFuZ2thIExBU1NPIHVuZ2d1bCBzZWRpa2l0IHNla2FsaSBkaSBkaWdpdCBrZWR1YSBiZWxha2FuZyBrb21hLCBFbGFzdGljIE5ldCBtZW1iZXJpa2FuIHN0YWJpbGl0YXMgbW9kZWwgeWFuZyBsZWJpaCBiYWlrIHVudHVrIGRhdGEgU3VtdXQuIAoKClBsb3QgS29lZmlzaWVuIFBhdGggRWxhc3RpYyBOZXQKYGBge3J9CmZpdF9lbiA8LSBnbG1uZXQoeCwgeSwgYWxwaGEgPSAwLjUsIHN0YW5kYXJkaXplID0gVFJVRSkKcGxvdChmaXRfZW4sIHh2YXIgPSAibGFtYmRhIiwgbGFiZWwgPSBUUlVFKQpgYGAKMS4gS2FyYWt0ZXJpc3RpayAiR3JvdXBpbmcgRWZmZWN0IgoKQ29iYSBrYW11IHBlcmhhdGlrYW4gZ2FyaXMgbm9tb3IgMyAoaGlqYXUvYmlydSBtdWRhIGRpIGJhd2FoKS4gRGkgZ3JhZmlrIGluaSwgZ2FyaXNueWEgdGVybGloYXQgImJlcmhpbXBpdGFuIiBhdGF1IGJlcmphbGFuIGJhcmVuZ2FuLgpJbmlsYWggR3JvdXBpbmcgRWZmZWN0LiBEaSBMQVNTTyB0YWRpLCBzYWxhaCBzYXR1bnlhIGRpcGFrc2EgbWF0aSwgdGFwaSBkaSBFbGFzdGljIE5ldCwga2FyZW5hIG1lcmVrYSBkaWFuZ2dhcCBzYXR1IGtlbG9tcG9rIChtaXNhbCB2YXJpYWJlbCBwZW5kaWRpa2FuKSwgbWVyZWthIGRpcGVyYm9sZWhrYW4gbWFzdWsgYmFyZW5nIGRlbmdhbiBrb2VmaXNpZW4geWFuZyBzYWxpbmcgbWVueWVzdWFpa2FuLgpJbmkgYmlraW4gbW9kZWwga2FtdSBsZWJpaCBzdGFiaWwgZGFuIGludGVycHJldGFzaW55YSBsZWJpaCBhZGlsIHNlY2FyYSBla29ub21pLgoKMi4gQW5na2EgZGkgQXRhcyAoMCDihpIgMTcpCkxpaGF0IHBlcmdlcmFrYW4gYW5na2EgZGkgYXRhcyBwbG90OgowIOKGkiA5IOKGkiAxMyDihpIgMTcuCkluaSBtZW51bmp1a2thbiBiYWh3YSBFbGFzdGljIE5ldCB0ZXRhcCBtZWxha3VrYW4gc2VsZWtzaSB2YXJpYWJlbCAoc2VwZXJ0aSBMQVNTTyksIHRhcGkgbGViaWggbGFtYmF0IGRhbiBoYXRpLWhhdGkuClNhYXQg4oiSbG9nKM67KSBtYWtpbiBrZSBrYW5hbiwgdmFyaWFiZWwgbXVsYWkgbWFzdWsgc2F0dSBwZXIgc2F0dSBzYW1wYWkgbGVuZ2thcCAxNy4gTmFtdW4sIHNhYXQgcGVuYWx0aSBkaXBlcmtldGF0IChtYWtpbiBrZSBraXJpKSwgZGlhIG1lbnlpc2FrYW4gdmFyaWFiZWwtdmFyaWFiZWwgeWFuZyBiZW5hci1iZW5hciBzb2xpZC4KCjMuIFRpZ2EgUGVuZ3Vhc2EgU3VtYXRlcmEgVXRhcmEKU2FtYSBzZXBlcnRpIGR1YSBtb2RlbCBzZWJlbHVtbnlhLCBhZGEgdGlnYSBnYXJpcyB5YW5nIHBhbGluZyAiYmVyYW5pIiBtZW5qYXVoIGRhcmkgbm9sOgpHYXJpcyAxMyAoSGl0YW0gQmF3YWgpOiBUZXRhcCBrb25zaXN0ZW4gc2ViYWdhaSB2YXJpYWJlbCBwYWxpbmcgZG9taW5hbiAoU2FuaXRhc2kpLiBQZW5nYXJ1aG55YSB0ZXJoYWRhcCBwZW51cnVuYW4ga2VtaXNraW5hbiBzYW5nYXQgbWFzaWYuCkdhcmlzIDEgKEhpdGFtIEF0YXMpOiBWYXJpYWJlbCBrZXNlaGF0YW4vbW9yYmlkaXRhcyB5YW5nIGphZGkgZmFrdG9yIHBlbmRvcm9uZyBrZW1pc2tpbmFuLgpHYXJpcyAzOiBEaW1lbnNpIHBlbmRpZGlrYW4geWFuZyBzdGFiaWwgbWVuZHVrdW5nIHBlbnVydW5hbiBrZW1pc2tpbmFuLgoKCgojUEVNQkFIQVNBTiMKUGVyYmFuZGluZ2FuIEludGVycHJldGFzaSBWaXN1YWwgOgpSaWRnZTogTWVudW5qdWtrYW4gYmFod2Egc2VtdWEgdmFyaWFiZWwgcHVueWEgcGVyYW4sIG1lc2tpIGtlY2lsLgpMQVNTTzogTWVudW5qdWtrYW4gZWZpc2llbnNpIG1vZGVsIGRlbmdhbiBtZW1idWFuZyB2YXJpYWJlbCB5YW5nIHJlZHVuZGFuLgpFbGFzdGljIE5ldCA6IE1lbnVuanVra2FuIHN0YWJpbGl0YXMgbW9kZWwgZGVuZ2FuIHRldGFwIG1lbmphZ2EgdmFyaWFiZWwgeWFuZyBiZXJrb3JlbGFzaSAoZ3JvdXBpbmcpIHRhbnBhIG1lbmdvcmJhbmthbiBha3VyYXNpLgoKU3ludGF4IEdhYnVuZ2FuIApgYGB7cn0KIyAxLiBBbWJpbCBrb2VmaXNpZW4gZGFyaSBrZXRpZ2EgbW9kZWwgKFBhc3Rpa2FuIG5hbWEgbW9kZWxueWEgc2VzdWFpKQpjb2VmX3JpZGdlIDwtIGFzLm1hdHJpeChjb2VmKG1vZGVsX3JpZGdlX2ZpbmFsLCBzID0gMS4zNzc3OTc2NDY4NzkyNykpCmNvZWZfbGFzc28gPC0gYXMubWF0cml4KGNvZWYobW9kZWxfbGFzc29fc3VtdXQsIHMgPSAwLjEwOTE4ODEwNzI1NDQwOSkpCmNvZWZfZW4gICAgPC0gYXMubWF0cml4KGNvZWYobW9kZWxfZW5fc3VtdXQsIHMgPSAwLjE5ODk3NjI3MzQ4MTkyMSkpCgojIDIuIEdhYnVuZ2thbiBtZW5qYWRpIHNhdHUgdGFiZWwKdGFiZWxfcGVyYmFuZGluZ2FuIDwtIGRhdGEuZnJhbWUoCiAgVmFyaWFiZWwgPSByb3duYW1lcyhjb2VmX3JpZGdlKSwKICBSaWRnZSA9IGFzLnZlY3Rvcihjb2VmX3JpZGdlKSwKICBMQVNTTyA9IGFzLnZlY3Rvcihjb2VmX2xhc3NvKSwKICBFbGFzdGljX05ldCA9IGFzLnZlY3Rvcihjb2VmX2VuKQopCgojIDMuIEJ1bGF0a2FuIGFuZ2thIGJpYXIgY2FudGlrICg0IGFuZ2thIGRpIGJlbGFrYW5nIGtvbWEpCnRhYmVsX3BlcmJhbmRpbmdhblssIDI6NF0gPC0gcm91bmQodGFiZWxfcGVyYmFuZGluZ2FuWywgMjo0XSwgNCkKCiMgNC4gVGFtcGlsa2FuIGRpIEtvbnNvbApwcmludCh0YWJlbF9wZXJiYW5kaW5nYW4pCgojIDUuIEVrc3BvciBrZSBDU1YgKEJ1a2EgcGFrYWkgRXhjZWwgbmFudGkpCndyaXRlLmNzdih0YWJlbF9wZXJiYW5kaW5nYW4sICJQZXJiYW5kaW5nYW5fS29lZmlzaWVuX1N1bXV0LmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKClN5bnRheCBUYWJlbCBQZXJmb3JtYSBNb2RlbCAoUi1TcXVhcmUgJiBSTVNFKQpgYGB7cn0KIyBCdWF0IHRhYmVsIHBlcmZvcm1hCnRhYmVsX3BlcmZvcm1hIDwtIGRhdGEuZnJhbWUoCiAgTWV0b2RlID0gYygiUmlkZ2UiLCAiTEFTU08iLCAiRWxhc3RpYyBOZXQiKSwKICBBbHBoYSA9IGMoMCwgMSwgMC41KSwKICBSX1NxdWFyZWQgPSBjKDAuODU3NCwgMC44ODY0LCAwLjg4NDcpLAogIFJNU0UgPSBjKDEuNTc0NywgMS40MDUyLCAxLjQxNjIpCikKCnByaW50KHRhYmVsX3BlcmZvcm1hKQoKIyBFa3Nwb3IKd3JpdGUuY3N2KHRhYmVsX3BlcmZvcm1hLCAiUGVyZm9ybWFfTW9kZWxfU3VtdXQuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKS29uc2lzdGVuc2kgVmFyaWFiZWw6IFNlYnV0a2FuIGJhaHdhIHZhcmlhYmVsIFgxMiAoU2FuaXRhc2kpIGRhbiBYMyAoUGVuZGlkaWthbikgc2VjYXJhIGtvbnNpc3RlbiBtZW5qYWRpIHByZWRpa3RvciB1dGFtYSBkaSBrZXRpZ2EgbWV0b2RlIGRlbmdhbiBrb2VmaXNpZW4gbmVnYXRpZiB5YW5nIGt1YXQuIEluaSBtZW51bmp1a2thbiBoYXNpbCB5YW5nIFJvYnVzdCAoU2FuZ2F0IEt1YXQpLgoKRWZpc2llbnNpIExBU1NPOiBMQVNTTyBiZXJoYXNpbCBtZW1iZXJpa2FuIGFrdXJhc2kgdGVydGluZ2dpIChSIDIgPTg4LDYlKSBtZXNraXB1biB0ZWxhaCBtZXJlZHVrc2kganVtbGFoIHZhcmlhYmVsLiBJbmkgbWVtYnVrdGlrYW4gYmFod2EgdGlkYWsgc2VtdWEgaW5kaWthdG9yIGtlbWlza2luYW4gbWVtaWxpa2kgcGVuZ2FydWggdW5payB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBkaSBTdW11dC4KClN0YWJpbGl0YXMgRWxhc3RpYyBOZXQ6IEVsYXN0aWMgTmV0IG1lbWJlcmlrYW4gaGFzaWwgeWFuZyBoYW1waXIgc2FtYSBkZW5nYW4gTEFTU08gbmFtdW4gbGViaWggc3RhYmlsIGRhbGFtIG1lbmFuZ2FuaSB2YXJpYWJlbCB5YW5nIHNhbGluZyBiZXJrb3JlbGFzaSAoc2VwZXJ0aSBkdWEgdmFyaWFiZWwgWDMga2FtdSkuCgoKCgoKCgoK