knitr::opts_chunk$set(echo = TRUE)
Data yang digunakan adalah Susenas Maret 2025.
Backlog
Kepemilikan
Backlog kepemilikan merupakan indikator yang menggambarkan kondisi
rumah tangga yang menempati bangunan tempat tinggal yang bukan milik
sendiri dan tidak memiliki rumah di tempat lain. Dalam penghitungan ini,
rumah tangga dikategorikan sebagai backlog kepemilikan meskipun
menempati rumah yang layak huni, sepanjang status penguasaan bangunannya
bukan milik sendiri dan rumah tangga tersebut tidak memiliki kepemilikan
rumah alternatif.
Dengan demikian, indikator ini berfokus pada aspek kepemilikan
hunian, bukan pada kualitas fisik atau kelayakan bangunan tempat
tinggal. Informasi backlog kepemilikan digunakan sebagai dasar dalam
perencanaan, penentuan sasaran, dan evaluasi kebijakan penyediaan serta
fasilitasi kepemilikan rumah bagi rumah tangga yang belum memiliki rumah
sendiri.
Set Design
Sampling
Design sampling yang digunakan mengikuti design sampling yang
dilakukan pada SPSS yaitu Cluster Sampling design with replacement.
susenas.design<- svydesign(id=~psu, strata=~strata, data = dataku, weights=~fwt)
susenas.design
## Stratified 1 - level Cluster Sampling design (with replacement)
## With (34473) clusters.
## svydesign(id = ~psu, strata = ~strata, data = dataku, weights = ~fwt)
summary(susenas.design$prob)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000201 0.003795 0.008842 0.029646 0.025600 0.968267
Set Output
Statistics
Kualitas presisi hasil estimasi suatu survei bisa diamati dari nilai
RSE yang dihasilkan. Kesalahan sampling dari beberapa estimasi harus
digunakan secara hati-hati. Untuk estimasi yang berdasarkan jumlah kasus
yang kecil, kesalahan relatif cenderung besar.
Batasan nilai RSE ( Australian Bureau Statistics):
Jika \(RSE \le 25\%\), estimasi
bersifat presisi.
Jika \(25\% < RSE \le 50\%\),
estimasi perlu dilakukan dengan hati-hati.
Jika \(RSE > 50\%\), estimasi
dianggap sangat tidak presisi.
Provinsi
options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasilP = svyby(formula = ~BACK_LOG, denom= ~denom, ~prov, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasilP[is.na(hasilP)] <- 0
hasilP$theta = round(hasilP$`BACK_LOG/denom`*100,2)
hasilP$SE = round(hasilP$`se.BACK_LOG/denom`*100,2)
hasilP$VAR = round(hasilP$SE*hasilP$SE,2)
hasilP$CI_LOWER = round(hasilP$`ci_l`*100,2)
hasilP$CI_LOWER[hasilP$CI_LOWER<0] <- 0
hasilP$CI_UPPER = round(hasilP$`ci_u`*100,2)
hasilP$RSE = round(hasilP$`cv%`,2)
hasilP$DEFF = round(hasilP$DEff,2)
Kabupaten/kota
options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasil = svyby(formula = ~BACK_LOG, denom= ~denom, ~kabu, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasil[is.na(hasil)] <- 0
hasil$theta = round(hasil$`BACK_LOG/denom`*100,2)
hasil$SE = round(hasil$`se.BACK_LOG/denom`*100,2)
hasil$VAR = round(hasil$SE*hasil$SE,2)
hasil$CI_LOWER = round(hasil$`ci_l`*100,2)
hasil$CI_LOWER[hasil$CI_LOWER<0] <- 0
hasil$CI_UPPER = round(hasil$`ci_u`*100,2)
hasil$RSE = round(hasil$`cv%`,2)
hasil$DEFF = round(hasil$DEff,2)
Level Estimate
Estimation by
province
outputP = as.data.frame(cbind(hasilP$prov, hasilP$theta, hasilP$SE, hasilP$VAR, hasilP$CI_LOWER, hasilP$CI_UPPER, hasilP$RSE, hasilP$DEFF))
names(outputP) = c("Prov","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
(outputP[order(outputP$Prov, decreasing = FALSE), ] )
## Prov Estimasi SE VAR CI LOWER CI UPPER RSE DEFF
## 1 11 13.00 0.45 0.20 12.11 13.88 3.48 2.50
## 2 12 24.46 0.70 0.49 23.08 25.84 2.88 5.76
## 3 13 24.28 0.78 0.61 22.75 25.80 3.20 3.84
## 4 14 19.04 0.84 0.71 17.40 20.68 4.40 3.91
## 5 15 8.94 0.54 0.29 7.88 10.01 6.06 2.61
## 6 16 12.71 0.61 0.37 11.52 13.91 4.79 3.97
## 7 17 8.24 0.55 0.30 7.16 9.33 6.71 2.43
## 8 18 6.34 0.39 0.15 5.57 7.11 6.20 2.82
## 9 19 7.90 0.73 0.53 6.48 9.32 9.20 3.11
## 10 21 22.28 2.39 5.71 17.59 26.97 10.74 13.83
## 11 31 40.59 1.25 1.56 38.14 43.04 3.08 3.30
## 12 32 14.80 0.40 0.16 14.02 15.58 2.70 3.12
## 13 33 8.04 0.25 0.06 7.55 8.52 3.08 2.43
## 14 34 13.92 0.95 0.90 12.06 15.78 6.81 2.97
## 15 35 7.48 0.26 0.07 6.96 7.99 3.51 3.15
## 16 36 11.44 0.72 0.52 10.02 12.85 6.33 3.66
## 17 51 11.67 0.95 0.90 9.80 13.54 8.16 5.52
## 18 52 6.71 0.42 0.18 5.88 7.54 6.32 2.05
## 19 53 7.22 0.53 0.28 6.17 8.26 7.39 5.61
## 20 61 6.53 0.44 0.19 5.65 7.40 6.81 3.04
## 21 62 12.50 0.84 0.71 10.85 14.15 6.73 5.42
## 22 63 12.98 0.72 0.52 11.58 14.39 5.53 3.99
## 23 64 18.25 0.86 0.74 16.56 19.94 4.72 3.24
## 24 65 16.96 1.19 1.42 14.62 19.29 7.02 2.70
## 25 71 15.58 0.73 0.53 14.16 17.01 4.67 3.46
## 26 72 9.04 0.56 0.31 7.94 10.15 6.24 3.06
## 27 73 9.65 0.51 0.26 8.65 10.64 5.26 4.71
## 28 74 7.09 0.56 0.31 5.99 8.19 7.90 4.50
## 29 75 12.28 0.71 0.50 10.90 13.66 5.74 1.67
## 30 76 4.07 0.56 0.31 2.97 5.17 13.79 2.92
## 31 81 11.07 0.74 0.55 9.61 12.52 6.71 3.41
## 32 82 6.19 0.62 0.38 4.97 7.41 10.07 3.53
## 33 91 12.19 0.90 0.81 10.42 13.96 7.42 2.61
## 34 92 12.55 1.23 1.51 10.14 14.97 9.82 4.07
## 35 94 17.40 1.40 1.96 14.65 20.15 8.07 6.09
## 36 95 15.89 1.47 2.16 13.02 18.77 9.24 3.34
## 37 96 8.71 0.86 0.74 7.02 10.40 9.93 4.12
## 38 97 1.64 0.48 0.23 0.69 2.59 29.51 6.04
Kelompok RSE Provinsi
hasilP <- hasilP %>%
mutate(
RSE = if_else(RSE == 0, NA_real_, RSE)
) %>%
arrange(RSE) %>%
mutate(
Urut = row_number(),
RSEP_kat = case_when(
is.na(RSE) ~ NA_character_,
RSE < 25.99 ~ "< 25%",
RSE <= 50.99 ~ "26–50%",
RSE > 50 ~ "> 50%"
)
)
table(hasilP$RSEP_kat, useNA = "ifany")
##
## < 25% 26–50%
## 37 1
Visualisasi Provinsi
ggplot(hasilP, aes(x = Urut, y = RSE, group = 1, color = RSEP_kat)) +
geom_point(size = 3) +
geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +
scale_color_manual(
name = "Kategori RSE",
limits = c("< 25%", "26–50%", "> 50%"),
values = c(
"< 25%" = "#1B9E77",
"26–50%" = "#FF8C00",
"> 50%" = "#7570B3"
),
na.value = "#D73027",
drop = FALSE
) +
labs(
title = "RSE BACK_LOG per Provinsi",
subtitle = "dengan garis batas RSE 25% dan 50%",
x = "Provinsi",
y = "Nilai RSE (%)"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 15),
legend.position = "bottom",
axis.text.x = element_text(angle = 40, vjust = 1, hjust = 1)
)

Estimation by
district
output = as.data.frame(cbind(hasil$kabu, hasil$theta, hasil$SE, hasil$VAR, hasil$CI_LOWER, hasil$CI_UPPER, hasil$RSE, hasil$DEFF))
names(output) = c("Kako","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
head((output[order(output$Kako, decreasing = FALSE), ] ))
## Kako Estimasi SE VAR CI LOWER CI UPPER RSE DEFF
## 1 1101 6.46 1.35 1.82 3.80 9.11 20.97 1.57
## 2 1102 9.17 1.79 3.20 5.67 12.67 19.48 2.04
## 3 1103 7.79 1.49 2.22 4.86 10.71 19.15 1.93
## 4 1104 20.64 2.54 6.45 15.66 25.63 12.32 2.43
## 5 1105 9.44 1.88 3.53 5.75 13.13 19.97 2.88
## 6 1106 16.00 1.91 3.65 12.25 19.75 11.95 1.63
Kelompok RSE Kabupaten/kota
hasil <- hasil %>%
mutate(
RSE = if_else(RSE == 0, NA_real_, RSE)
) %>%
arrange(RSE) %>%
mutate(
Urut = row_number(),
RSE_kat = case_when(
is.na(RSE) ~ NA_character_,
RSE < 25.99 ~ "< 25%",
RSE <= 50.99 ~ "26–50%",
RSE > 50 ~ "> 50%"
)
)
table(hasil$RSE_kat, useNA = "ifany")
##
## < 25% > 50% 26–50% <NA>
## 374 14 120 6
hasil_plot <- hasil %>%
mutate(
RSE_plot = if_else(is.na(RSE), -2, RSE) # taruh NA di bawah sumbu
)
ggplot(hasil_plot, aes(x = Urut, y = RSE_plot, color = RSE_kat)) +
geom_jitter(width = 0.35, height = 0, size = 1.8, alpha = 0.85) +
geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +
scale_y_continuous(
name = "Nilai RSE (%)",
breaks = c(0, 25, 50),
limits = c(-5, NA)
) +
scale_color_manual(
name = "Kategori RSE",
limits = c("< 25%", "26–50%", "> 50%"),
values = c(
"< 25%" = "#1B9E77",
"26–50%" = "#FF8C00",
"> 50%" = "#7570B3"
),
na.value = "#D73027",
drop = FALSE
) +
theme_minimal()

Satu kabupaten/kota memiliki nilai RSE = 0 sehingga diperlakukan
sebagai data tidak tersedia (NA) dan ditampilkan dalam visualisasi
sebagai titik berwarna merah.
write.xlsx(outputP,"BACKLOG1 2025_Prov.xlsx")
write.xlsx(output,"BACKLOG1 2025_Kako.xlsx")
Peta
library(sf)
petaku <- st_read("PetaSHP514_38.shp")
## Reading layer `PetaSHP514_38' from data source
## `D:\2. Pengembangan diri\1 Exercise Bagus\Housing Analysis\PetaSHP514_38.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 514 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 95.00971 ymin: -11.00766 xmax: 141.02 ymax: 6.076809
## Geodetic CRS: WGS 84
petaku <- petaku %>%
mutate(idkab = as.character(idkab))
hasil <- hasil %>%
mutate(kabu = as.character(kabu))
names(petaku)
## [1] "fid" "idkab" "nmprov" "nmkab" "kdprov" "kdkab" "sumber"
## [8] "periode" "geometry"
kab_map <- petaku %>%
left_join(
hasil %>% select(kabu, RSE, RSE_kat),
by = c("idkab" = "kabu")
)
kab_map$RSE_kat <- factor(
kab_map$RSE_kat,
levels = c("< 25%", "26–50%", "> 50%")
)

Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id
LS0tDQp0aXRsZTogIkJhY2tsb2cgS2VwZW1pbGlrYW4gMjAyNSINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShzZikNCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIFN1c2VuYXMgTWFyZXQgMjAyNS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpkYXRha3UgPC0gcmVhZF9zYXYoIktPUjI1R0FCXzAzMDlfSE9VU0lORy5zYXYiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCiMgQmFja2xvZyBLZXBlbWlsaWthbg0KDQpCYWNrbG9nIGtlcGVtaWxpa2FuIG1lcnVwYWthbiBpbmRpa2F0b3IgeWFuZyBtZW5nZ2FtYmFya2FuIGtvbmRpc2kgcnVtYWggdGFuZ2dhIHlhbmcgbWVuZW1wYXRpIGJhbmd1bmFuIHRlbXBhdCB0aW5nZ2FsIHlhbmcgYnVrYW4gbWlsaWsgc2VuZGlyaSBkYW4gdGlkYWsgbWVtaWxpa2kgcnVtYWggZGkgdGVtcGF0IGxhaW4uIERhbGFtIHBlbmdoaXR1bmdhbiBpbmksIHJ1bWFoIHRhbmdnYSBkaWthdGVnb3Jpa2FuIHNlYmFnYWkgYmFja2xvZyBrZXBlbWlsaWthbiBtZXNraXB1biBtZW5lbXBhdGkgcnVtYWggeWFuZyBsYXlhayBodW5pLCBzZXBhbmphbmcgc3RhdHVzIHBlbmd1YXNhYW4gYmFuZ3VuYW5ueWEgYnVrYW4gbWlsaWsgc2VuZGlyaSBkYW4gcnVtYWggdGFuZ2dhIHRlcnNlYnV0IHRpZGFrIG1lbWlsaWtpIGtlcGVtaWxpa2FuIHJ1bWFoIGFsdGVybmF0aWYuIA0KDQpEZW5nYW4gZGVtaWtpYW4sIGluZGlrYXRvciBpbmkgYmVyZm9rdXMgcGFkYSBhc3BlayBrZXBlbWlsaWthbiBodW5pYW4sIGJ1a2FuIHBhZGEga3VhbGl0YXMgZmlzaWsgYXRhdSBrZWxheWFrYW4gYmFuZ3VuYW4gdGVtcGF0IHRpbmdnYWwuIEluZm9ybWFzaSBiYWNrbG9nIGtlcGVtaWxpa2FuIGRpZ3VuYWthbiBzZWJhZ2FpIGRhc2FyIGRhbGFtIHBlcmVuY2FuYWFuLCBwZW5lbnR1YW4gc2FzYXJhbiwgZGFuIGV2YWx1YXNpIGtlYmlqYWthbiBwZW55ZWRpYWFuIHNlcnRhIGZhc2lsaXRhc2kga2VwZW1pbGlrYW4gcnVtYWggYmFnaSBydW1haCB0YW5nZ2EgeWFuZyBiZWx1bSBtZW1pbGlraSBydW1haCBzZW5kaXJpLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmRhdGFrdSA8LSBkYXRha3UgJT4lDQogIG11dGF0ZShrYWJ1ID0gcjEwMSoxMDAgKyByMTAyKSAlPiUNCiAgcmVuYW1lKHByb3Y9InIxMDEiLCBrYWI9InIxMDIiKSAlPiUNCiAgbXV0YXRlKGRlbm9tPTEwMCkgJT4lDQogIG11dGF0ZSgNCiAgICBCQUNLX0xPRyA9IGlmZWxzZShyMTYwMiA+IDEgJiByMTYwNSA9PSA1LCAxMDAsIDApLA0KICAgIEJBQ0tfTE9HX0xBQkVMID0gZmFjdG9yKA0KICAgICAgQkFDS19MT0csDQogICAgICBsZXZlbHMgPSBjKDAsIDEwMCksDQogICAgICBsYWJlbHMgPSBjKCJUaWRhayIsICJCYWNrbG9nIikNCiAgICApDQogICkNCmBgYA0KICANCiMgU2V0IERlc2lnbiBTYW1wbGluZw0KDQpEZXNpZ24gc2FtcGxpbmcgeWFuZyBkaWd1bmFrYW4gbWVuZ2lrdXRpIGRlc2lnbiBzYW1wbGluZyB5YW5nIGRpbGFrdWthbiBwYWRhIFNQU1MgeWFpdHUgQ2x1c3RlciBTYW1wbGluZyBkZXNpZ24gd2l0aCByZXBsYWNlbWVudC4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpzdXNlbmFzLmRlc2lnbjwtIHN2eWRlc2lnbihpZD1+cHN1LCBzdHJhdGE9fnN0cmF0YSwgZGF0YSA9IGRhdGFrdSwgd2VpZ2h0cz1+Znd0KQ0Kc3VzZW5hcy5kZXNpZ24NCnN1bW1hcnkoc3VzZW5hcy5kZXNpZ24kcHJvYikNCmBgYA0KDQojIFNldCBPdXRwdXQgU3RhdGlzdGljcw0KDQpLdWFsaXRhcyBwcmVzaXNpIGhhc2lsIGVzdGltYXNpIHN1YXR1IHN1cnZlaSBiaXNhIGRpYW1hdGkgZGFyaSBuaWxhaSBSU0UgeWFuZyBkaWhhc2lsa2FuLiBLZXNhbGFoYW4gc2FtcGxpbmcgZGFyaSBiZWJlcmFwYSBlc3RpbWFzaSBoYXJ1cyBkaWd1bmFrYW4gc2VjYXJhIGhhdGktaGF0aS4gVW50dWsgZXN0aW1hc2kgeWFuZyBiZXJkYXNhcmthbiBqdW1sYWgga2FzdXMgeWFuZyBrZWNpbCwga2VzYWxhaGFuIHJlbGF0aWYgY2VuZGVydW5nIGJlc2FyLg0KDQpCYXRhc2FuIG5pbGFpIFJTRSAoIF9BdXN0cmFsaWFuIEJ1cmVhdSBTdGF0aXN0aWNzXyk6DQoNCjEuICBKaWthICRSU0UgXGxlIDI1XCUkLCBlc3RpbWFzaSBiZXJzaWZhdCBwcmVzaXNpLg0KDQoyLiAgSmlrYSAkMjVcJSA8IFJTRSBcbGUgNTBcJSQsIGVzdGltYXNpIHBlcmx1IGRpbGFrdWthbiBkZW5nYW4gaGF0aS1oYXRpLg0KDQozLiAgSmlrYSAkUlNFID4gNTBcJSQsIGVzdGltYXNpIGRpYW5nZ2FwIHNhbmdhdCB0aWRhayBwcmVzaXNpLg0KDQoNCioqUHJvdmluc2kqKg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm9wdGlvbnMoc3VydmV5LmFkanVzdC5kb21haW4ubG9uZWx5PVRSVUUpDQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1PSJhZGp1c3QiKQ0KaGFzaWxQID0gc3Z5YnkoZm9ybXVsYSA9IH5CQUNLX0xPRywgZGVub209IH5kZW5vbSwgfnByb3YsIGRlc2lnbiA9IHN1c2VuYXMuZGVzaWduLCBkYXRhID0gZGF0YWt1LCBkZWZmPVRSVUUsIHN2eXJhdGlvLCB2YXJ0eXBlPWMoInNlIiwiY2kiLCJjaSIsImN2IiwiY3ZwY3QiLCJ2YXIiKSkNCmhhc2lsUFtpcy5uYShoYXNpbFApXSA8LSAwDQpoYXNpbFAkdGhldGEgPSByb3VuZChoYXNpbFAkYEJBQ0tfTE9HL2Rlbm9tYCoxMDAsMikNCmhhc2lsUCRTRSA9IHJvdW5kKGhhc2lsUCRgc2UuQkFDS19MT0cvZGVub21gKjEwMCwyKQ0KaGFzaWxQJFZBUiA9IHJvdW5kKGhhc2lsUCRTRSpoYXNpbFAkU0UsMikNCmhhc2lsUCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsUCRgY2lfbGAqMTAwLDIpDQpoYXNpbFAkQ0lfTE9XRVJbaGFzaWxQJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsUCRDSV9VUFBFUiA9IHJvdW5kKGhhc2lsUCRgY2lfdWAqMTAwLDIpDQpoYXNpbFAkUlNFID0gcm91bmQoaGFzaWxQJGBjdiVgLDIpDQpoYXNpbFAkREVGRiA9IHJvdW5kKGhhc2lsUCRERWZmLDIpDQpgYGANCg0KKipLYWJ1cGF0ZW4va290YSoqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0Kb3B0aW9ucyhzdXJ2ZXkuYWRqdXN0LmRvbWFpbi5sb25lbHk9VFJVRSkNCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3U9ImFkanVzdCIpDQpoYXNpbCA9IHN2eWJ5KGZvcm11bGEgPSB+QkFDS19MT0csIGRlbm9tPSB+ZGVub20sIH5rYWJ1LCBkZXNpZ24gPSBzdXNlbmFzLmRlc2lnbiwgZGF0YSA9IGRhdGFrdSwgZGVmZj1UUlVFLCBzdnlyYXRpbywgdmFydHlwZT1jKCJzZSIsImNpIiwiY2kiLCJjdiIsImN2cGN0IiwidmFyIikpDQpoYXNpbFtpcy5uYShoYXNpbCldIDwtIDANCmhhc2lsJHRoZXRhID0gcm91bmQoaGFzaWwkYEJBQ0tfTE9HL2Rlbm9tYCoxMDAsMikNCmhhc2lsJFNFID0gcm91bmQoaGFzaWwkYHNlLkJBQ0tfTE9HL2Rlbm9tYCoxMDAsMikNCmhhc2lsJFZBUiA9IHJvdW5kKGhhc2lsJFNFKmhhc2lsJFNFLDIpDQpoYXNpbCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsJGBjaV9sYCoxMDAsMikNCmhhc2lsJENJX0xPV0VSW2hhc2lsJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsJENJX1VQUEVSID0gcm91bmQoaGFzaWwkYGNpX3VgKjEwMCwyKQ0KaGFzaWwkUlNFID0gcm91bmQoaGFzaWwkYGN2JWAsMikNCmhhc2lsJERFRkYgPSByb3VuZChoYXNpbCRERWZmLDIpDQpgYGANCg0KIyBMZXZlbCBFc3RpbWF0ZQ0KDQojIyBFc3RpbWF0aW9uIGJ5IHByb3ZpbmNlDQoNCmBgYHtyfQ0Kb3V0cHV0UCA9IGFzLmRhdGEuZnJhbWUoY2JpbmQoaGFzaWxQJHByb3YsIGhhc2lsUCR0aGV0YSwgaGFzaWxQJFNFLCBoYXNpbFAkVkFSLCBoYXNpbFAkQ0lfTE9XRVIsIGhhc2lsUCRDSV9VUFBFUiwgaGFzaWxQJFJTRSwgaGFzaWxQJERFRkYpKQ0KbmFtZXMob3V0cHV0UCkgPSBjKCJQcm92IiwiRXN0aW1hc2kiLCJTRSIsIlZBUiIsIkNJIExPV0VSIiwiQ0kgVVBQRVIiLCJSU0UiLCJERUZGIikNCihvdXRwdXRQW29yZGVyKG91dHB1dFAkUHJvdiwgZGVjcmVhc2luZyA9IEZBTFNFKSwgXSAgICkNCmBgYA0KDQoqKktlbG9tcG9rIFJTRSBQcm92aW5zaSoqDQoNCmBgYHtyfQ0KaGFzaWxQIDwtIGhhc2lsUCAlPiUNCiAgbXV0YXRlKA0KICAgIFJTRSA9IGlmX2Vsc2UoUlNFID09IDAsIE5BX3JlYWxfLCBSU0UpDQogICkgJT4lDQogIGFycmFuZ2UoUlNFKSAlPiUNCiAgbXV0YXRlKA0KICAgIFVydXQgPSByb3dfbnVtYmVyKCksDQogICAgUlNFUF9rYXQgPSBjYXNlX3doZW4oDQogICAgICBpcy5uYShSU0UpICAgICAgICAgICAgICAgICB+IE5BX2NoYXJhY3Rlcl8sDQogICAgICBSU0UgPCAyNS45OSAgICAgICAgICAgICAgICB+ICI8IDI1JSIsDQogICAgICBSU0UgPD0gNTAuOTkgICAgICAgICAgICAgICB+ICIyNuKAkzUwJSIsDQogICAgICBSU0UgPiA1MCAgICAgICAgICAgICAgICAgICB+ICI+IDUwJSINCiAgICApDQogICkNCg0KdGFibGUoaGFzaWxQJFJTRVBfa2F0LCB1c2VOQSA9ICJpZmFueSIpDQpgYGANCg0KDQoqKlZpc3VhbGlzYXNpIFByb3ZpbnNpKioNCg0KYGBge3J9DQpnZ3Bsb3QoaGFzaWxQLCBhZXMoeCA9IFVydXQsIHkgPSBSU0UsIGdyb3VwID0gMSwgY29sb3IgPSBSU0VQX2thdCkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKw0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQogIA0Kc2NhbGVfY29sb3JfbWFudWFsKA0KICBuYW1lID0gIkthdGVnb3JpIFJTRSIsDQogIGxpbWl0cyA9IGMoIjwgMjUlIiwgIjI24oCTNTAlIiwgIj4gNTAlIiksDQogIHZhbHVlcyA9IGMoDQogICAgIjwgMjUlIiAgPSAiIzFCOUU3NyIsDQogICAgIjI24oCTNTAlIiA9ICIjRkY4QzAwIiwNCiAgICAiPiA1MCUiICA9ICIjNzU3MEIzIg0KICApLA0KICBuYS52YWx1ZSA9ICIjRDczMDI3IiwNCiAgZHJvcCA9IEZBTFNFDQopICsNCiAgICBsYWJzKA0KICAgIHRpdGxlID0gIlJTRSBCQUNLX0xPRyBwZXIgUHJvdmluc2kiLA0KICAgIHN1YnRpdGxlID0gImRlbmdhbiBnYXJpcyBiYXRhcyBSU0UgMjUlIGRhbiA1MCUiLA0KICAgIHggPSAiUHJvdmluc2kiLA0KICAgIHkgPSAiTmlsYWkgUlNFICglKSINCiAgKSArDQogIA0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCB2anVzdCA9IDEsIGhqdXN0ID0gMSkNCiAgKQ0KYGBgDQoNCiMjIEVzdGltYXRpb24gYnkgZGlzdHJpY3QNCg0KYGBge3J9DQpvdXRwdXQgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKGhhc2lsJGthYnUsIGhhc2lsJHRoZXRhLCBoYXNpbCRTRSwgaGFzaWwkVkFSLCBoYXNpbCRDSV9MT1dFUiwgaGFzaWwkQ0lfVVBQRVIsIGhhc2lsJFJTRSwgaGFzaWwkREVGRikpDQpuYW1lcyhvdXRwdXQpID0gYygiS2FrbyIsIkVzdGltYXNpIiwiU0UiLCJWQVIiLCJDSSBMT1dFUiIsIkNJIFVQUEVSIiwiUlNFIiwiREVGRiIpDQpoZWFkKChvdXRwdXRbb3JkZXIob3V0cHV0JEtha28sIGRlY3JlYXNpbmcgPSBGQUxTRSksIF0gICApKQ0KYGBgDQoNCioqS2Vsb21wb2sgUlNFIEthYnVwYXRlbi9rb3RhKioNCg0KYGBge3J9DQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKA0KICAgIFJTRSA9IGlmX2Vsc2UoUlNFID09IDAsIE5BX3JlYWxfLCBSU0UpDQogICkgJT4lDQogIGFycmFuZ2UoUlNFKSAlPiUNCiAgbXV0YXRlKA0KICAgIFVydXQgPSByb3dfbnVtYmVyKCksDQogICAgUlNFX2thdCA9IGNhc2Vfd2hlbigNCiAgICAgIGlzLm5hKFJTRSkgICAgICAgICAgICAgICAgIH4gTkFfY2hhcmFjdGVyXywNCiAgICAgIFJTRSA8IDI1Ljk5ICAgICAgICAgICAgICAgIH4gIjwgMjUlIiwNCiAgICAgIFJTRSA8PSA1MC45OSAgICAgICAgICAgICAgIH4gIjI24oCTNTAlIiwNCiAgICAgIFJTRSA+IDUwICAgICAgICAgICAgICAgICAgIH4gIj4gNTAlIg0KICAgICkNCiAgKQ0KDQp0YWJsZShoYXNpbCRSU0Vfa2F0LCB1c2VOQSA9ICJpZmFueSIpDQpgYGANCg0KDQpgYGB7cn0NCmhhc2lsX3Bsb3QgPC0gaGFzaWwgJT4lDQogIG11dGF0ZSgNCiAgICBSU0VfcGxvdCA9IGlmX2Vsc2UoaXMubmEoUlNFKSwgLTIsIFJTRSkgICMgdGFydWggTkEgZGkgYmF3YWggc3VtYnUNCiAgKQ0KDQpnZ3Bsb3QoaGFzaWxfcGxvdCwgYWVzKHggPSBVcnV0LCB5ID0gUlNFX3Bsb3QsIGNvbG9yID0gUlNFX2thdCkpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjM1LCBoZWlnaHQgPSAwLCBzaXplID0gMS44LCBhbHBoYSA9IDAuODUpICsNCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyNSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA1MCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmx1ZSIpICsNCg0KICBzY2FsZV95X2NvbnRpbnVvdXMoDQogICAgbmFtZSA9ICJOaWxhaSBSU0UgKCUpIiwNCiAgICBicmVha3MgPSBjKDAsIDI1LCA1MCksDQogICAgbGltaXRzID0gYygtNSwgTkEpDQogICkgKw0KDQogIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICBuYW1lID0gIkthdGVnb3JpIFJTRSIsDQogICAgbGltaXRzID0gYygiPCAyNSUiLCAiMjbigJM1MCUiLCAiPiA1MCUiKSwNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIjwgMjUlIiAgPSAiIzFCOUU3NyIsDQogICAgICAiMjbigJM1MCUiID0gIiNGRjhDMDAiLA0KICAgICAgIj4gNTAlIiAgPSAiIzc1NzBCMyINCiAgICApLA0KICAgIG5hLnZhbHVlID0gIiNENzMwMjciLA0KICAgIGRyb3AgPSBGQUxTRQ0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KU2F0dSBrYWJ1cGF0ZW4va290YSBtZW1pbGlraSBuaWxhaSBSU0UgPSAwIHNlaGluZ2dhIGRpcGVybGFrdWthbiBzZWJhZ2FpIGRhdGEgdGlkYWsgdGVyc2VkaWEgKE5BKSBkYW4gZGl0YW1waWxrYW4gZGFsYW0gdmlzdWFsaXNhc2kgc2ViYWdhaSB0aXRpayBiZXJ3YXJuYSBtZXJhaC4NCg0KYGBge3J9DQp3cml0ZS54bHN4KG91dHB1dFAsIkJBQ0tMT0cxIDIwMjVfUHJvdi54bHN4IikNCndyaXRlLnhsc3gob3V0cHV0LCJCQUNLTE9HMSAyMDI1X0tha28ueGxzeCIpDQpgYGANCg0KIyBQZXRhDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCnBldGFrdSA8LSBzdF9yZWFkKCJQZXRhU0hQNTE0XzM4LnNocCIpDQoNCnBldGFrdSA8LSBwZXRha3UgJT4lDQogIG11dGF0ZShpZGthYiA9IGFzLmNoYXJhY3RlcihpZGthYikpDQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKGthYnUgPSBhcy5jaGFyYWN0ZXIoa2FidSkpDQpuYW1lcyhwZXRha3UpDQpgYGANCg0KYGBge3J9DQprYWJfbWFwIDwtIHBldGFrdSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGhhc2lsICU+JSBzZWxlY3Qoa2FidSwgUlNFLCBSU0Vfa2F0KSwNCiAgICBieSA9IGMoImlka2FiIiA9ICJrYWJ1IikNCiAgKQ0Ka2FiX21hcCRSU0Vfa2F0IDwtIGZhY3RvcigNCiAga2FiX21hcCRSU0Vfa2F0LA0KICBsZXZlbHMgPSBjKCI8IDI1JSIsICIyNuKAkzUwJSIsICI+IDUwJSIpDQopDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpnZ3Bsb3Qoa2FiX21hcCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gUlNFX2thdCksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIjwgMjUlIiAgID0gIiMxYTk4NTAiLCAgIyBzYW5nYXQgYmFpaw0KICAgICAgIjI24oCTNTAlIiAgPSAiI2ZlZTA4YiIsICAjIGhhdGktaGF0aQ0KICAgICAgIj4gNTAlIiAgID0gIiNkNzMwMjciICAgIyB0aWRhayByZWxpYWJlbA0KICAgICksDQogICAgbmEudmFsdWUgPSAiZGFya2JsdWUiLA0KICAgIGRyb3AgPSBGQUxTRQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSU0UgQmFja2xvZyBwZXIgS2FidXBhdGVuL2tvdGEiLA0KICAgIGZpbGwgID0gIkthdGVnb3JpIFJTRSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+IERpcmVrdG9yYXQgU3RhdGlzdGlrIEtlc2VqYWh0ZXJhYW4gUmFreWF0LCBCUFMsIHNhcHRhaGFzQGJwcy5nby5pZA0KDQoNCg0KDQo=