Analisis keterjangkauan perumahan berangkat dari pemahaman bahwa
pengeluaran perumahan yang terlalu besar dapat mengurangi kapasitas
rumah tangga untuk memenuhi kebutuhan dasar lainnya. Literatur ekonomi
perumahan menekankan bahwa perumahan bukan sekadar aset fisik, melainkan
komponen utama dalam struktur kesejahteraan rumah tangga (Stone, 2006).
Oleh karena itu, pengukuran keterjangkauan perumahan perlu dikaitkan
secara langsung dengan kondisi kesejahteraan non-perumahan.
Pendekatan ini relevan dalam konteks negara berkembang, termasuk
Indonesia, di mana tekanan biaya hidup tidak hanya berasal dari harga
rumah, tetapi juga dari utilitas, energi, dan biaya pemeliharaan (Angel,
2000).
knitr::opts_chunk$set(echo = TRUE)
Sumber Data
Data yang digunakan adalah Susenas Maret 2025.
susenas <- read_sav("BLOK43_2025_5.sav") %>%
clean_names()
Komponen pengeluaran perumahan
Dalam analisis ini, pengeluaran perumahan dihitung secara menyeluruh
dengan memasukkan berbagai komponen biaya yang benar-benar dikeluarkan
maupun yang bersifat imputasi. Komponen tersebut meliputi sewa rumah
(baik sewa aktual maupun perkiraan sewa untuk rumah milik sendiri),
biaya utilitas dasar seperti listrik dan air, pengeluaran untuk bahan
bakar memasak, serta biaya pemeliharaan dan kebutuhan rumah tangga
lainnya. Pendekatan yang bersifat agregatif ini mengikuti praktik umum
dalam pengukuran pengeluaran perumahan pada berbagai survei rumah
tangga, baik di tingkat nasional maupun internasional (OECD, 2011).
Sementara itu, nilai yang hilang (missing values) digantikan
dengan nol untuk menjaga konsistensi dalam perhitungan total
pengeluaran. Dalam konteks survei pengeluaran, nilai kosong umumnya
mencerminkan tidak adanya transaksi pada periode tertentu, bukan berarti
data tersebut tidak tersedia. Dengan demikian, perlakuan ini membantu
memastikan bahwa estimasi total pengeluaran tetap akurat dan tidak
terdistorsi.
susenas <- susenas %>%
mutate(
# Perumahan
perkiraan = sebulan_228,
sewa = sebulan_229 + sebulan_230,
perumahan = sebulan_228 + sebulan_229 + sebulan_230 + sebulan_231,
# Utilitas
listrik = sebulan_234,
airpam = sebulan_236,
# Energi bahan bakar memasak
bakar_masak = sebulan_253 + sebulan_255 + sebulan_257 + sebulan_259 +
sebulan_260 + sebulan_261,
# Lainnya
perbaikan = sebulan_232,
kebutuhan_lain = sebulan_262
) %>%
mutate(
across(
c(perkiraan, sewa, perumahan,
listrik, airpam, bakar_masak,
perbaikan, kebutuhan_lain),
~replace_na(., 0)
)
)
Total pengeluaran perumahan sebulan
Seluruh komponen pengeluaran perumahan kemudian dijumlahkan untuk
membentuk indikator total pengeluaran perumahan bulanan rumah tangga
(exp_housing). Variabel ini menjadi komponen utama dalam
pengukuran keterjangkauan perumahan dan tekanan ekonomi rumah
tangga.
susenas <- susenas %>%
mutate(
exp_housing = perumahan +
listrik +
airpam +
bakar_masak +
perbaikan +
kebutuhan_lain
)
Tingkat kesejahteraan (non perumahan) per kapita
sebulan
Pengeluaran non-perumahan per kapita digunakan sebagai indikator
kesejahteraan ekonomi rumah tangga. Literatur kesejahteraan menekankan
bahwa sisa pengeluaran setelah kebutuhan perumahan terpenuhi
mencerminkan residual income yang tersedia untuk konsumsi
pangan, kesehatan, pendidikan, dan kebutuhan sosial lainnya (Stone,
2006).
Pendekatan ini dinilai lebih informatif dibandingkan indikator yang
semata-mata bertumpu pada pendapatan. Hal ini terutama relevan dalam
konteks perekonomian informal dan kondisi pendapatan yang cenderung
berfluktuasi, sebagaimana banyak dijumpai di negara berkembang (Deaton
& Zaidi, 2002).
susenas <- susenas %>%
mutate(
exp_total = expend,
hhsize = jart,
exp_nonhousing_pc = if_else(
hhsize > 0,
(exp_total - exp_housing) / hhsize,
NA_real_
)
)
Housing Cost
Burden
Housing Cost Burden (HCB) dihitung sebagai perbandingan
antara pengeluaran untuk perumahan dan total pengeluaran rumah tangga.
Secara sederhana, ukuran ini menunjukkan seberapa besar porsi belanja
keluarga yang “tersedot” untuk kebutuhan tempat tinggal. Batas 30 persen
digunakan untuk menilai apakah beban tersebut sudah tergolong berat
(unaffordable), mengikuti praktik yang umum dipakai dalam
kajian kebijakan perumahan dan perencanaan kota (HUD, 2018).
Walaupun angka 30 persen ini pada dasarnya merupakan batas normatif,
berbagai penelitian menunjukkan bahwa ketika pengeluaran perumahan
melampaui ambang tersebut, rumah tangga cenderung harus mengurangi
belanja untuk kebutuhan dasar lainnya, seperti pangan, pendidikan, atau
kesehatan. Kondisi ini pada akhirnya dapat meningkatkan kerentanan
ekonomi dan mempersempit ruang gerak keuangan keluarga (Kutty,
2005).
susenas <- susenas %>%
mutate(
housing_burden = exp_housing / exp_total,
unaffordable = if_else(housing_burden >= 0.30, 1, 0)
)
Seleksi dan Pembersihan Variabel Analisis
Pada tahap ini, hanya variabel yang benar-benar relevan dengan
kebutuhan analisis yang dipertahankan agar efisien. Selanjutnya,
dilakukan proses penyaringan (filtering) untuk mengeluarkan
observasi yang memiliki nilai ekstrem atau tidak masuk akal, misalnya
rasio pengeluaran perumahan yang bernilai nol atau melebihi satu, serta
pengeluaran non-perumahan per kapita yang bernilai negatif atau nol.
Langkah ini dilakukan untuk memastikan hasil estimasi tetap stabil
dan tidak dipengaruhi oleh nilai-nilai yang secara logis sulit
dipertanggungjawabkan. Dengan demikian, kualitas analisis dapat terjaga
tanpa mengubah pola distribusi utama data secara substansial.
susenas <- susenas %>%
select(
kabu,
psu,
strata,
wert,
housing_burden,
unaffordable,
exp_nonhousing_pc
) %>%
filter(
housing_burden > 0,
housing_burden < 1,
exp_nonhousing_pc > 0
)
Survey Design
options(survey.lonely.psu = "adjust")
des <- svydesign(
ids = ~psu,
strata = ~strata,
weights = ~wert,
data = susenas,
nest = TRUE
)
Tract-Level
Aggregation
Pada tahap selanjutnya, indikator yang telah dihitung pada tingkat
rumah tangga diagregasikan ke tingkat kabupaten/kota. Agregasi ini
memungkinkan analisis spasial dan perbandingan antarwilayah secara lebih
sistematis. Dengan melihat pola pada tingkat wilayah, dapat
diidentifikasi kecenderungan struktural, misalnya konsentrasi beban
biaya perumahan di daerah tertentu yang sering kali tidak tampak ketika
analisis hanya dilakukan pada level rumah tangga. Pendekatan agregasi
wilayah seperti ini lazim digunakan dalam studi ketimpangan regional,
karena membantu menangkap dinamika spasial pembangunan dan kesenjangan
antarwilayah secara lebih komprehensif (World Bank, 2009).
tract_tradeoff <- svyby(
~housing_burden + unaffordable + exp_nonhousing_pc,
~kabu,
des,
svymean,
na.rm = TRUE
) %>%
rename(
mean_housing_burden = housing_burden,
unaffordable_rate = unaffordable,
welfare_nonhousing = exp_nonhousing_pc
) %>%
mutate(
mean_housing_burden = as.numeric(mean_housing_burden),
welfare_nonhousing = as.numeric(welfare_nonhousing)
)
Trade-off
Typology
Klasifikasi housing–welfare trade-off digunakan untuk
mengidentifikasi wilayah yang menghadapi beban biaya perumahan tinggi
sekaligus memiliki tingkat kesejahteraan non-perumahan yang relatif
rendah. Konsep trade-off ini menggambarkan kondisi ketika
peningkatan pengeluaran untuk tempat tinggal sering kali harus “dibayar”
dengan pengurangan alokasi belanja untuk kebutuhan penting lainnya,
seperti pangan, pendidikan, kesehatan, maupun kebutuhan dasar rumah
tangga lainnya (Angel, 2000).
Pengelompokkan housing–welfare trade-off dilakukan dengan
membagi wilayah ke dalam empat kategori berdasarkan posisi relatifnya
terhadap nilai median nasional dari dua indikator utama, yaitu rata-rata
beban biaya perumahan (mean housing cost burden) dan
pengeluaran non-perumahan per kapita (non-housing expenditure per
capita). Penggunaan median sebagai titik pembanding dipilih karena
lebih tahan terhadap pengaruh nilai outlier sehingga mampu memberikan
gambaran perbandingan antarwilayah yang lebih stabil dan representatif.
Pendekatan ini juga membantu menonjolkan perbedaan karakteristik
kesejahteraan wilayah secara lebih proporsional.
Wilayah yang memiliki beban biaya perumahan di atas median
nasional tetapi tingkat kesejahteraan non-perumahan di bawah median
diklasifikasikan sebagai High Housing Cost – Low
Welfare. Kelompok ini mencerminkan kondisi yang paling serius,
di mana pengeluaran perumahan menyerap porsi besar anggaran rumah tangga
sehingga menyisakan ruang yang terbatas untuk memenuhi kebutuhan dasar
lainnya. Dalam konteks kebijakan, wilayah pada kategori ini menjadi
prioritas utama intervensi perumahan, karena tekanan biaya hunian
berpotensi memperburuk kerentanan kesejahteraan rumah tangga.
Sebaliknya, wilayah dengan beban biaya perumahan tinggi tetapi
kesejahteraan non-perumahan juga tinggi diklasifikasikan sebagai
High Housing Cost – High Welfare. Kondisi ini
menunjukkan bahwa meskipun biaya perumahan relatif mahal, rumah tangga
di wilayah tersebut masih memiliki kapasitas ekonomi yang cukup untuk
mempertahankan tingkat konsumsi non-perumahan yang tinggi. Tingginya
biaya perumahan tidak selalu berimplikasi pada penurunan
kesejahteraan.
Kelompok Low Housing Cost – Low Welfare
menggambarkan wilayah dengan beban biaya perumahan relatif rendah tetapi
tingkat kesejahteraan non-perumahan juga rendah. Kondisi ini
mengindikasikan bahwa permasalahan utama kesejahteraan rumah tangga di
wilayah tersebut bukan terletak pada sektor perumahan, melainkan pada
keterbatasan kapasitas ekonomi secara umum. Oleh karena itu, kebijakan
yang hanya berfokus pada perumahan cenderung kurang efektif, dan perlu
dilengkapi dengan intervensi pembangunan ekonomi, penciptaan lapangan
kerja, serta peningkatan produktivitas.
Sementara itu, wilayah yang termasuk dalam kategori Low
Housing Cost – High Welfare merupakan kelompok dengan beban
biaya perumahan rendah dan tingkat kesejahteraan non-perumahan tinggi.
Kelompok ini mencerminkan kondisi struktural yang relatif paling
menguntungkan, di mana rumah tangga mampu memenuhi kebutuhan perumahan
tanpa mengorbankan konsumsi non-perumahan.
hb_med <- median(tract_tradeoff$mean_housing_burden, na.rm = TRUE)
wel_med <- median(tract_tradeoff$welfare_nonhousing, na.rm = TRUE)
tract_tradeoff <- tract_tradeoff %>%
mutate(
tradeoff_type = case_when(
mean_housing_burden >= hb_med & welfare_nonhousing < wel_med ~
"High Housing Cost – Low Welfare",
mean_housing_burden >= hb_med & welfare_nonhousing >= wel_med ~
"High Housing Cost – High Welfare",
mean_housing_burden < hb_med & welfare_nonhousing < wel_med ~
"Low Housing Cost – Low Welfare",
TRUE ~
"Low Housing Cost – High Welfare"
)
)
head(tract_tradeoff[,c(1:4,8)])
## kabu mean_housing_burden unaffordable_rate welfare_nonhousing
## 1101 1101 0.09414305 0.000000000 3106780
## 1102 1102 0.11328801 0.018474085 2612460
## 1103 1103 0.10628428 0.004749273 3354536
## 1104 1104 0.10938372 0.004097063 2772172
## 1105 1105 0.09656410 0.001387120 4557323
## 1106 1106 0.09277107 0.014805091 4064299
## tradeoff_type
## 1101 Low Housing Cost – Low Welfare
## 1102 Low Housing Cost – Low Welfare
## 1103 Low Housing Cost – Low Welfare
## 1104 Low Housing Cost – Low Welfare
## 1105 Low Housing Cost – High Welfare
## 1106 Low Housing Cost – High Welfare
#Export to Excel
write.xlsx(
tract_tradeoff,
file = "housing_welfare_tradeoff_kabkota.xlsx",
overwrite = TRUE
)
Visualization
ggplot(tract_tradeoff,
aes(mean_housing_burden,
welfare_nonhousing,
color = tradeoff_type)) +
geom_point(size = 3, alpha = 0.8) +
geom_vline(xintercept = hb_med, linetype = "dashed") +
geom_hline(yintercept = wel_med, linetype = "dashed") +
scale_x_continuous(labels = percent_format()) +
scale_y_continuous(labels = comma) +
labs(
title = "Housing-Welfare Trade-off Across Districts",
x = "Average Housing Cost Burden",
y = "Non-Housing Expenditure per Capita",
color = "Trade-off Type"
) +
theme_minimal()

Sebaran titik yang relatif merata di keempat kuadran menunjukkan
adanya heterogenitas antarwilayah. Kuadran kanan bawah (High Housing
Cost – Low Welfare) mencerminkan wilayah dengan tekanan perumahan
paling berat karena tingginya biaya hunian tidak diimbangi kapasitas
konsumsi lain. Kuadran kanan atas (High Housing Cost – High
Welfare) menunjukkan daerah dengan ekonomi kuat, di mana biaya
hunian tinggi tidak selalu berarti kerentanan. Di sisi lain, kuadran
kiri bawah (Low Housing Cost – Low Welfare) menandakan wilayah
dengan daya beli rendah, sehingga isu utamanya lebih terkait kemiskinan
struktural. Sementara itu, kuadran kiri atas (Low Housing Cost –
High Welfare) menggambarkan kondisi paling ideal, dengan beban
perumahan rendah dan kesejahteraan relatif tinggi.
Secara keseluruhan, pola ini menegaskan bahwa hubungan antara biaya
perumahan dan kesejahteraan tidak bersifat linier. Karena itu,
pendekatan berbasis trade-off penting untuk merumuskan
kebijakan yang lebih kontekstual dan tidak satu dimensi.
Mean Housing Burden per Kab/Kota
ggplot(
tract_tradeoff %>%
arrange(mean_housing_burden) %>%
mutate(kabu = factor(kabu, levels = kabu)),
aes(x = kabu, y = mean_housing_burden)
) +
geom_col(fill = "#2C7FB8") +
coord_flip() +
geom_hline(yintercept = 0.30,
linetype = "dashed",
color = "red") +
scale_y_continuous(labels = percent_format()) +
labs(
title = "Average Housing Cost Burden by District",
subtitle = "Red line indicates 30% affordability threshold",
x = "District (Kab/Kota)",
y = "Mean Housing Cost Burden"
) +
theme_minimal()

Grafik Average Housing Cost Burden by District menampilkan rata-rata
beban biaya perumahan (HCB) seluruh kabupaten/kota yang diurutkan dari
terendah hingga tertinggi. Setiap batang merepresentasikan satu wilayah,
dan sumbu horizontal menunjukkan proporsi pengeluaran perumahan terhadap
total pengeluaran rumah tangga. Grafik ini ditujukan untuk melihat pola
distribusi secara umum, bukan membandingkan wilayah satu per satu.
Garis merah putus-putus pada angka 30% menunjukkan ambang
keterjangkauan yang lazim digunakan. Wilayah di kanan garis tersebut
memiliki rata-rata HCB di atas 30% dan menghadapi tekanan biaya
perumahan yang relatif tinggi, sedangkan wilayah di kiri masih tergolong
lebih terjangkau.
Secara keseluruhan, grafik ini memperlihatkan seberapa luas dan
seberapa serius isu keterjangkauan perumahan tersebar antarwilayah,
menegaskan bahwa persoalan ini bersifat struktural dengan tingkat
keparahan yang bervariasi.
HCB vs Unaffordable
Rate
Tahapan ini digunakan untuk mengecek apakah beban biaya perumahan
yang tinggi benar-benar sejalan dengan meningkatnya proporsi rumah
tangga tidak terjangkau (unaffordable) di tingkat
kabupaten/kota.
ggplot(tract_tradeoff,
aes(mean_housing_burden,
unaffordable_rate)) +
geom_point(size = 3, alpha = 0.8, color = "#D95F02") +
geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
scale_x_continuous(labels = percent_format()) +
scale_y_continuous(labels = percent_format()) +
labs(
title = "Housing Cost Burden vs Unaffordability Rate",
x = "Average Housing Cost Burden",
y = "Share of Unaffordable Households"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Setiap titik pada grafik mewakili satu kabupaten/kota. Sumbu
horizontal menunjukkan rata-rata Housing Cost Burden (HCB),
sedangkan sumbu vertikal menunjukkan persentase rumah tangga yang
mengeluarkan ≥30% dari total belanja untuk perumahan. Dengan menampilkan
keduanya dalam satu bidang, grafik ini membantu melihat apakah wilayah
dengan beban rata-rata lebih tinggi memang juga memiliki lebih banyak
rumah tangga yang merasa “tertekan” oleh biaya hunian.
Garis putus-putus dari regresi linier menunjukkan arah hubungan
tersebut. Jika garisnya menanjak, artinya semakin tinggi rata-rata HCB
suatu wilayah, semakin besar pula proporsi rumah tangga yang tidak
terjangkau. Secara sederhana, grafik ini menguji apakah angka rata-rata
benar-benar mencerminkan kenyataan di lapangan. Jika hubungan keduanya
kuat dan positif, maka HCB dapat dianggap sebagai indikator yang cukup
andal untuk membaca tekanan biaya perumahan dan menjadi dasar perumusan
kebijakan.
Housing Stress
Index
Housing Stress Index dikembangkan sebagai indikator komposit
untuk menangkap tingkat tekanan perumahan secara relatif antarwilayah.
Dengan menstandarkan beban biaya perumahan dan tingkat kesejahteraan
non-perumahan, indeks ini memungkinkan perbandingan yang lebih adil
antar daerah, tanpa terdistorsi oleh perbedaan skala atau besaran
absolut masing-masing wilayah (OECD, 2011).
Pendekatan ini mengikuti praktik umum dalam penyusunan indeks
sosial-ekonomi berbasis z-score, yang banyak digunakan untuk mengukur
kerentanan dan kesejahteraan wilayah secara komparatif (Nardo et al.,
2005). Dengan cara ini, posisi suatu daerah dapat dibaca secara lebih
proporsional dalam konteks nasional.
tract_tradeoff <- tract_tradeoff %>%
mutate(
z_housing = as.numeric(scale(mean_housing_burden)),
z_welfare = as.numeric(scale(welfare_nonhousing)),
housing_stress_index = (z_housing - z_welfare) / 2
)
Stress Classification
tract_tradeoff <- tract_tradeoff %>%
mutate(
stress_category = case_when(
housing_stress_index >= 0.75 ~ "Severe Stress",
housing_stress_index >= 0.25 ~ "Moderate Stress",
housing_stress_index >= -0.25 ~ "Neutral",
TRUE ~ "Low Stress"
)
)
Export to Excel
write.xlsx(
tract_tradeoff,
"housing_stress_index_kabkota.xlsx",
overwrite = TRUE
)
Visualization
ggplot(tract_tradeoff,
aes(mean_housing_burden,
welfare_nonhousing,
color = stress_category)) +
geom_point(size = 3, alpha = 0.8) +
scale_x_continuous(labels = percent_format()) +
scale_y_continuous(labels = comma) +
labs(
title = "Housing Stress Index Across Districts",
x = "Average Housing Cost Burden",
y = "Non-Housing Expenditure per Capita",
color = "Stress Level"
) +
theme_minimal()

HSI Ranking
ggplot(
tract_tradeoff %>%
arrange(housing_stress_index) %>%
mutate(kabu = factor(kabu, levels = kabu)),
aes(x = kabu, y = housing_stress_index,
color = stress_category)
) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey40") +
geom_point(size = 3) +
coord_flip() +
labs(
title = "Housing Stress Index (HSI) by District",
subtitle = "Positive values indicate higher housing stress",
x = "District (Kab/Kota)",
y = "Housing Stress Index",
color = "Stress Category"
) +
theme_minimal()

Wilayah dengan nilai Housing Stress Index (HSI) yang tinggi
menggambarkan kondisi di mana rumah tangga harus menanggung beban biaya
perumahan yang relatif besar, sementara kemampuan mereka untuk memenuhi
kebutuhan non-perumahan masih terbatas. Situasi ini menunjukkan tekanan
ganda: biaya hunian yang berat di satu sisi, dan ruang fiskal rumah
tangga yang sempit di sisi lain. Temuan seperti ini menjadi penting
dalam merancang kebijakan perumahan, skema subsidi, maupun penargetan
bantuan sosial yang lebih tepat sasaran berbasis wilayah (World Bank,
2009). Dengan demikian, analisis ini tidak berhenti pada pemaparan angka
semata, tetapi juga berfungsi sebagai alat diagnostik untuk
mengidentifikasi daerah-daerah yang paling rentan terhadap tekanan
perumahan dan membutuhkan perhatian kebijakan lebih lanjut.
Distribusi HSI
ggplot(tract_tradeoff,
aes(x = housing_stress_index, fill = stress_category)) +
geom_histogram(bins = 20, alpha = 0.8) +
geom_vline(xintercept = 0, linetype = "dashed") +
labs(
title = "Distribution of Housing Stress Index",
x = "Housing Stress Index",
y = "Number of Districts",
fill = "Stress Category"
) +
theme_minimal()

Dari gambar terlihat bahwa sebagian besar wilayah terkonsentrasi di
sekitar nilai nol, yang berarti mayoritas kabupaten/kota berada pada
kategori netral atau tekanan sedang. Namun, terdapat sejumlah wilayah di
sisi kanan dengan kategori moderate hingga severe stress, menunjukkan
adanya kelompok daerah yang menghadapi tekanan perumahan cukup berat. Di
sisi kiri, wilayah dengan low stress relatif lebih banyak, mencerminkan
kondisi di mana beban perumahan masih lebih terkendali dibanding
rata-rata nasional.
Distribusi yang cenderung menyerupai kurva lonceng ini
mengindikasikan bahwa tekanan perumahan merupakan fenomena yang tersebar
luas, tetapi tingkat keparahannya berbeda-beda. Hanya sebagian kecil
wilayah yang berada pada kondisi sangat berat (severe stress), namun
kelompok ini penting menjadi perhatian kebijakan karena
merepresentasikan konsentrasi tekanan paling tinggi.
Referensi
[1] Angel, S. (2000). Housing policy matters: A global
analysis. Oxford University Press.
[2] Deaton, A., & Zaidi, S. (2002). Guidelines for
constructing consumption aggregates for welfare analysis. World
Bank Publications.
[3] HUD. (2018). Affordable housing. U.S. Department of
Housing and Urban Development.
[4] Kutty, N. K. (2005). A new measure of housing affordability:
Estimates and analytical results. Housing Policy Debate, 16(1),
113–142.
[5] Lumley, T. (2010). Complex surveys: A guide to analysis using
R. John Wiley & Sons.
[6] Nardo, M., Saisana, M., Saltelli, A., & Tarantola, S. (2005).
Tools for composite indicators building. European
Commission.
[7] OECD. (2011). How’s life? Measuring well-being. OECD
Publishing.
[8] Stone, M. E. (2006). What is housing affordability? The case
for the residual income approach. Housing Policy Debate, 17(1),
151–184.
[9] World Bank. (2009). Reshaping economic geography. World
Bank Publications.
Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id
LS0tDQp0aXRsZTogIkFuYWxpc2lzIFNwYXNpYWwgS2V0ZXJqYW5na2F1YW4gUGVydW1haGFuIDxicj4gZGFuIFRla2FuYW4gS2VzZWphaHRlcmFhbiBkaSBJbmRvbmVzaWEiDQpzdWJ0aXRsZTogIl9TcGF0aWFsIEhvdXNpbmcgQWZmb3JkYWJpbGl0eSBhbmQgV2VsZmFyZSBUcmFkZS1vZmYgQW5hbHlzaXMgaW4gSW5kb25lc2lhXyINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCkFuYWxpc2lzIGtldGVyamFuZ2thdWFuIHBlcnVtYWhhbiBiZXJhbmdrYXQgZGFyaSBwZW1haGFtYW4gYmFod2EgcGVuZ2VsdWFyYW4gcGVydW1haGFuIHlhbmcgdGVybGFsdSBiZXNhciBkYXBhdCBtZW5ndXJhbmdpIGthcGFzaXRhcyBydW1haCB0YW5nZ2EgdW50dWsgbWVtZW51aGkga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEuIExpdGVyYXR1ciBla29ub21pIHBlcnVtYWhhbiBtZW5la2Fua2FuIGJhaHdhIHBlcnVtYWhhbiBidWthbiBzZWthZGFyIGFzZXQgZmlzaWssIG1lbGFpbmthbiBrb21wb25lbiB1dGFtYSBkYWxhbSBzdHJ1a3R1ciBrZXNlamFodGVyYWFuIHJ1bWFoIHRhbmdnYSAoU3RvbmUsIDIwMDYpLiBPbGVoIGthcmVuYSBpdHUsIHBlbmd1a3VyYW4ga2V0ZXJqYW5na2F1YW4gcGVydW1haGFuIHBlcmx1IGRpa2FpdGthbiBzZWNhcmEgbGFuZ3N1bmcgZGVuZ2FuIGtvbmRpc2kga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuLg0KDQpQZW5kZWthdGFuIGluaSByZWxldmFuIGRhbGFtIGtvbnRla3MgbmVnYXJhIGJlcmtlbWJhbmcsIHRlcm1hc3VrIEluZG9uZXNpYSwgZGkgbWFuYSB0ZWthbmFuIGJpYXlhIGhpZHVwIHRpZGFrIGhhbnlhIGJlcmFzYWwgZGFyaSBoYXJnYSBydW1haCwgdGV0YXBpIGp1Z2EgZGFyaSB1dGlsaXRhcywgZW5lcmdpLCBkYW4gYmlheWEgcGVtZWxpaGFyYWFuIChBbmdlbCwgMjAwMCkuDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KG9wZW54bHN4KQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0Kc2V0d2QoIkQ6XFwyLiBQZW5nZW1iYW5nYW4gZGlyaVxcMSBFeGVyY2lzZSBCYWd1c1xcSG91c2luZyBBbmFseXNpcyIpDQpgYGANCg0KIyBTdW1iZXIgRGF0YQ0KDQpEYXRhIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBTdXNlbmFzIE1hcmV0IDIwMjUuDQoNCmBgYHtyfQ0Kc3VzZW5hcyA8LSByZWFkX3NhdigiQkxPSzQzXzIwMjVfNS5zYXYiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCioqS29tcG9uZW4gcGVuZ2VsdWFyYW4gcGVydW1haGFuKioNCg0KRGFsYW0gYW5hbGlzaXMgaW5pLCBwZW5nZWx1YXJhbiBwZXJ1bWFoYW4gZGloaXR1bmcgc2VjYXJhIG1lbnllbHVydWggZGVuZ2FuIG1lbWFzdWtrYW4gYmVyYmFnYWkga29tcG9uZW4gYmlheWEgeWFuZyBiZW5hci1iZW5hciBkaWtlbHVhcmthbiBtYXVwdW4geWFuZyBiZXJzaWZhdCBpbXB1dGFzaS4gS29tcG9uZW4gdGVyc2VidXQgbWVsaXB1dGkgc2V3YSBydW1haCAoYmFpayBzZXdhIGFrdHVhbCBtYXVwdW4gcGVya2lyYWFuIHNld2EgdW50dWsgcnVtYWggbWlsaWsgc2VuZGlyaSksIGJpYXlhIHV0aWxpdGFzIGRhc2FyIHNlcGVydGkgbGlzdHJpayBkYW4gYWlyLCBwZW5nZWx1YXJhbiB1bnR1ayBiYWhhbiBiYWthciBtZW1hc2FrLCBzZXJ0YSBiaWF5YSBwZW1lbGloYXJhYW4gZGFuIGtlYnV0dWhhbiBydW1haCB0YW5nZ2EgbGFpbm55YS4gUGVuZGVrYXRhbiB5YW5nIGJlcnNpZmF0IGFncmVnYXRpZiBpbmkgbWVuZ2lrdXRpIHByYWt0aWsgdW11bSBkYWxhbSBwZW5ndWt1cmFuIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBwYWRhIGJlcmJhZ2FpIHN1cnZlaSBydW1haCB0YW5nZ2EsIGJhaWsgZGkgdGluZ2thdCBuYXNpb25hbCBtYXVwdW4gaW50ZXJuYXNpb25hbCAoT0VDRCwgMjAxMSkuDQoNClNlbWVudGFyYSBpdHUsIG5pbGFpIHlhbmcgaGlsYW5nIChfbWlzc2luZyB2YWx1ZXNfKSBkaWdhbnRpa2FuIGRlbmdhbiBub2wgdW50dWsgbWVuamFnYSBrb25zaXN0ZW5zaSBkYWxhbSBwZXJoaXR1bmdhbiB0b3RhbCBwZW5nZWx1YXJhbi4gRGFsYW0ga29udGVrcyBzdXJ2ZWkgcGVuZ2VsdWFyYW4sIG5pbGFpIGtvc29uZyB1bXVtbnlhIG1lbmNlcm1pbmthbiB0aWRhayBhZGFueWEgdHJhbnNha3NpIHBhZGEgcGVyaW9kZSB0ZXJ0ZW50dSwgYnVrYW4gYmVyYXJ0aSBkYXRhIHRlcnNlYnV0IHRpZGFrIHRlcnNlZGlhLiBEZW5nYW4gZGVtaWtpYW4sIHBlcmxha3VhbiBpbmkgbWVtYmFudHUgbWVtYXN0aWthbiBiYWh3YSBlc3RpbWFzaSB0b3RhbCBwZW5nZWx1YXJhbiB0ZXRhcCBha3VyYXQgZGFuIHRpZGFrIHRlcmRpc3RvcnNpLg0KDQpgYGB7cn0NCnN1c2VuYXMgPC0gc3VzZW5hcyAlPiUNCiAgbXV0YXRlKA0KICAgICMgUGVydW1haGFuDQogICAgcGVya2lyYWFuICA9IHNlYnVsYW5fMjI4LA0KICAgIHNld2EgICAgICAgPSBzZWJ1bGFuXzIyOSArIHNlYnVsYW5fMjMwLA0KICAgIHBlcnVtYWhhbiAgPSBzZWJ1bGFuXzIyOCArIHNlYnVsYW5fMjI5ICsgc2VidWxhbl8yMzAgKyBzZWJ1bGFuXzIzMSwNCiAgICAjIFV0aWxpdGFzDQogICAgbGlzdHJpayAgICA9IHNlYnVsYW5fMjM0LA0KICAgIGFpcnBhbSAgICAgPSBzZWJ1bGFuXzIzNiwNCiAgICAjIEVuZXJnaSBiYWhhbiBiYWthciBtZW1hc2FrDQogICAgYmFrYXJfbWFzYWsgPSBzZWJ1bGFuXzI1MyArIHNlYnVsYW5fMjU1ICsgc2VidWxhbl8yNTcgKyBzZWJ1bGFuXzI1OSArDQogICAgc2VidWxhbl8yNjAgKyBzZWJ1bGFuXzI2MSwNCiAgICAjIExhaW5ueWENCiAgICBwZXJiYWlrYW4gICAgICA9IHNlYnVsYW5fMjMyLA0KICAgIGtlYnV0dWhhbl9sYWluID0gc2VidWxhbl8yNjINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcygNCiAgICAgIGMocGVya2lyYWFuLCBzZXdhLCBwZXJ1bWFoYW4sDQogICAgICAgIGxpc3RyaWssIGFpcnBhbSwgYmFrYXJfbWFzYWssDQogICAgICAgIHBlcmJhaWthbiwga2VidXR1aGFuX2xhaW4pLA0KICAgICAgfnJlcGxhY2VfbmEoLiwgMCkNCiAgICApDQogICkNCmBgYA0KDQoNCioqVG90YWwgcGVuZ2VsdWFyYW4gcGVydW1haGFuIHNlYnVsYW4qKg0KDQpTZWx1cnVoIGtvbXBvbmVuIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBrZW11ZGlhbiBkaWp1bWxhaGthbiB1bnR1ayBtZW1iZW50dWsgaW5kaWthdG9yIHRvdGFsIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBidWxhbmFuIHJ1bWFoIHRhbmdnYSAoYGV4cF9ob3VzaW5nYCkuIFZhcmlhYmVsIGluaSBtZW5qYWRpIGtvbXBvbmVuIHV0YW1hIGRhbGFtIHBlbmd1a3VyYW4ga2V0ZXJqYW5na2F1YW4gcGVydW1haGFuIGRhbiB0ZWthbmFuIGVrb25vbWkgcnVtYWggdGFuZ2dhLg0KDQpgYGB7cn0NCnN1c2VuYXMgPC0gc3VzZW5hcyAlPiUNCiAgbXV0YXRlKA0KICAgIGV4cF9ob3VzaW5nID0gcGVydW1haGFuICsNCiAgICAgIGxpc3RyaWsgKw0KICAgICAgYWlycGFtICsNCiAgICAgIGJha2FyX21hc2FrICsNCiAgICAgIHBlcmJhaWthbiArDQogICAgICBrZWJ1dHVoYW5fbGFpbg0KICApDQpgYGANCg0KKipUaW5na2F0IGtlc2VqYWh0ZXJhYW4gKG5vbiBwZXJ1bWFoYW4pIHBlciBrYXBpdGEgc2VidWxhbioqDQoNClBlbmdlbHVhcmFuIG5vbi1wZXJ1bWFoYW4gcGVyIGthcGl0YSBkaWd1bmFrYW4gc2ViYWdhaSBpbmRpa2F0b3Iga2VzZWphaHRlcmFhbiBla29ub21pIHJ1bWFoIHRhbmdnYS4gTGl0ZXJhdHVyIGtlc2VqYWh0ZXJhYW4gbWVuZWthbmthbiBiYWh3YSBzaXNhIHBlbmdlbHVhcmFuIHNldGVsYWgga2VidXR1aGFuIHBlcnVtYWhhbiB0ZXJwZW51aGkgbWVuY2VybWlua2FuIF9yZXNpZHVhbCBpbmNvbWVfIHlhbmcgdGVyc2VkaWEgdW50dWsga29uc3Vtc2kgcGFuZ2FuLCBrZXNlaGF0YW4sIHBlbmRpZGlrYW4sIGRhbiBrZWJ1dHVoYW4gc29zaWFsIGxhaW5ueWEgKFN0b25lLCAyMDA2KS4NCg0KUGVuZGVrYXRhbiBpbmkgZGluaWxhaSBsZWJpaCBpbmZvcm1hdGlmIGRpYmFuZGluZ2thbiBpbmRpa2F0b3IgeWFuZyBzZW1hdGEtbWF0YSBiZXJ0dW1wdSBwYWRhIHBlbmRhcGF0YW4uIEhhbCBpbmkgdGVydXRhbWEgcmVsZXZhbiBkYWxhbSBrb250ZWtzIHBlcmVrb25vbWlhbiBpbmZvcm1hbCBkYW4ga29uZGlzaSBwZW5kYXBhdGFuIHlhbmcgY2VuZGVydW5nIGJlcmZsdWt0dWFzaSwgc2ViYWdhaW1hbmEgYmFueWFrIGRpanVtcGFpIGRpIG5lZ2FyYSBiZXJrZW1iYW5nIChEZWF0b24gJiBaYWlkaSwgMjAwMikuDQoNCmBgYHtyfQ0Kc3VzZW5hcyA8LSBzdXNlbmFzICU+JQ0KICBtdXRhdGUoDQogICAgZXhwX3RvdGFsID0gZXhwZW5kLA0KICAgIGhoc2l6ZSAgICA9IGphcnQsDQogICAgZXhwX25vbmhvdXNpbmdfcGMgPSBpZl9lbHNlKA0KICAgICAgaGhzaXplID4gMCwNCiAgICAgIChleHBfdG90YWwgLSBleHBfaG91c2luZykgLyBoaHNpemUsDQogICAgICBOQV9yZWFsXw0KICAgICkNCiAgKQ0KYGBgDQoNCiMgSG91c2luZyBDb3N0IEJ1cmRlbg0KDQpfSG91c2luZyBDb3N0IEJ1cmRlbl8gKEhDQikgZGloaXR1bmcgc2ViYWdhaSBwZXJiYW5kaW5nYW4gYW50YXJhIHBlbmdlbHVhcmFuIHVudHVrIHBlcnVtYWhhbiBkYW4gdG90YWwgcGVuZ2VsdWFyYW4gcnVtYWggdGFuZ2dhLiBTZWNhcmEgc2VkZXJoYW5hLCB1a3VyYW4gaW5pIG1lbnVuanVra2FuIHNlYmVyYXBhIGJlc2FyIHBvcnNpIGJlbGFuamEga2VsdWFyZ2EgeWFuZyDigJx0ZXJzZWRvdOKAnSB1bnR1ayBrZWJ1dHVoYW4gdGVtcGF0IHRpbmdnYWwuIEJhdGFzIDMwIHBlcnNlbiBkaWd1bmFrYW4gdW50dWsgbWVuaWxhaSBhcGFrYWggYmViYW4gdGVyc2VidXQgc3VkYWggdGVyZ29sb25nIGJlcmF0IChfdW5hZmZvcmRhYmxlXyksIG1lbmdpa3V0aSBwcmFrdGlrIHlhbmcgdW11bSBkaXBha2FpIGRhbGFtIGthamlhbiBrZWJpamFrYW4gcGVydW1haGFuIGRhbiBwZXJlbmNhbmFhbiBrb3RhIChIVUQsIDIwMTgpLg0KDQpXYWxhdXB1biBhbmdrYSAzMCBwZXJzZW4gaW5pIHBhZGEgZGFzYXJueWEgbWVydXBha2FuIGJhdGFzIG5vcm1hdGlmLCBiZXJiYWdhaSBwZW5lbGl0aWFuIG1lbnVuanVra2FuIGJhaHdhIGtldGlrYSBwZW5nZWx1YXJhbiBwZXJ1bWFoYW4gbWVsYW1wYXVpIGFtYmFuZyB0ZXJzZWJ1dCwgcnVtYWggdGFuZ2dhIGNlbmRlcnVuZyBoYXJ1cyBtZW5ndXJhbmdpIGJlbGFuamEgdW50dWsga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEsIHNlcGVydGkgcGFuZ2FuLCBwZW5kaWRpa2FuLCBhdGF1IGtlc2VoYXRhbi4gS29uZGlzaSBpbmkgcGFkYSBha2hpcm55YSBkYXBhdCBtZW5pbmdrYXRrYW4ga2VyZW50YW5hbiBla29ub21pIGRhbiBtZW1wZXJzZW1waXQgcnVhbmcgZ2VyYWsga2V1YW5nYW4ga2VsdWFyZ2EgKEt1dHR5LCAyMDA1KS4NCg0KYGBge3J9DQpzdXNlbmFzIDwtIHN1c2VuYXMgJT4lDQogIG11dGF0ZSgNCiAgICBob3VzaW5nX2J1cmRlbiA9IGV4cF9ob3VzaW5nIC8gZXhwX3RvdGFsLA0KICAgIHVuYWZmb3JkYWJsZSAgID0gaWZfZWxzZShob3VzaW5nX2J1cmRlbiA+PSAwLjMwLCAxLCAwKQ0KICApDQpgYGANCg0KKipTZWxla3NpIGRhbiBQZW1iZXJzaWhhbiBWYXJpYWJlbCBBbmFsaXNpcyoqDQoNClBhZGEgdGFoYXAgaW5pLCBoYW55YSB2YXJpYWJlbCB5YW5nIGJlbmFyLWJlbmFyIHJlbGV2YW4gZGVuZ2FuIGtlYnV0dWhhbiBhbmFsaXNpcyB5YW5nIGRpcGVydGFoYW5rYW4gYWdhciBlZmlzaWVuLiBTZWxhbmp1dG55YSwgZGlsYWt1a2FuIHByb3NlcyBwZW55YXJpbmdhbiAoX2ZpbHRlcmluZ18pIHVudHVrIG1lbmdlbHVhcmthbiBvYnNlcnZhc2kgeWFuZyBtZW1pbGlraSBuaWxhaSBla3N0cmVtIGF0YXUgdGlkYWsgbWFzdWsgYWthbCwgbWlzYWxueWEgcmFzaW8gcGVuZ2VsdWFyYW4gcGVydW1haGFuIHlhbmcgYmVybmlsYWkgbm9sIGF0YXUgbWVsZWJpaGkgc2F0dSwgc2VydGEgcGVuZ2VsdWFyYW4gbm9uLXBlcnVtYWhhbiBwZXIga2FwaXRhIHlhbmcgYmVybmlsYWkgbmVnYXRpZiBhdGF1IG5vbC4NCg0KTGFuZ2thaCBpbmkgZGlsYWt1a2FuIHVudHVrIG1lbWFzdGlrYW4gaGFzaWwgZXN0aW1hc2kgdGV0YXAgc3RhYmlsIGRhbiB0aWRhayBkaXBlbmdhcnVoaSBvbGVoIG5pbGFpLW5pbGFpIHlhbmcgc2VjYXJhIGxvZ2lzIHN1bGl0IGRpcGVydGFuZ2d1bmdqYXdhYmthbi4gRGVuZ2FuIGRlbWlraWFuLCBrdWFsaXRhcyBhbmFsaXNpcyBkYXBhdCB0ZXJqYWdhIHRhbnBhIG1lbmd1YmFoIHBvbGEgZGlzdHJpYnVzaSB1dGFtYSBkYXRhIHNlY2FyYSBzdWJzdGFuc2lhbC4NCg0KDQpgYGB7cn0NCnN1c2VuYXMgPC0gc3VzZW5hcyAlPiUNCiAgc2VsZWN0KA0KICAgIGthYnUsDQogICAgcHN1LA0KICAgIHN0cmF0YSwNCiAgICB3ZXJ0LA0KICAgIGhvdXNpbmdfYnVyZGVuLA0KICAgIHVuYWZmb3JkYWJsZSwNCiAgICBleHBfbm9uaG91c2luZ19wYw0KICApICU+JQ0KICBmaWx0ZXIoDQogICAgaG91c2luZ19idXJkZW4gPiAwLA0KICAgIGhvdXNpbmdfYnVyZGVuIDwgMSwNCiAgICBleHBfbm9uaG91c2luZ19wYyA+IDANCiAgKQ0KYGBgDQoNCioqU3VydmV5IERlc2lnbioqDQoNCmBgYHtyfQ0Kb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQ0KDQpkZXMgPC0gc3Z5ZGVzaWduKA0KICBpZHMgICAgID0gfnBzdSwNCiAgc3RyYXRhICA9IH5zdHJhdGEsDQogIHdlaWdodHMgPSB+d2VydCwNCiAgZGF0YSAgICA9IHN1c2VuYXMsDQogIG5lc3QgICAgPSBUUlVFDQopDQpgYGANCg0KDQojIyBUcmFjdC1MZXZlbCBBZ2dyZWdhdGlvbg0KDQpQYWRhIHRhaGFwIHNlbGFuanV0bnlhLCBpbmRpa2F0b3IgeWFuZyB0ZWxhaCBkaWhpdHVuZyBwYWRhIHRpbmdrYXQgcnVtYWggdGFuZ2dhIGRpYWdyZWdhc2lrYW4ga2UgdGluZ2thdCBrYWJ1cGF0ZW4va290YS4gQWdyZWdhc2kgaW5pIG1lbXVuZ2tpbmthbiBhbmFsaXNpcyBzcGFzaWFsIGRhbiBwZXJiYW5kaW5nYW4gYW50YXJ3aWxheWFoIHNlY2FyYSBsZWJpaCBzaXN0ZW1hdGlzLiBEZW5nYW4gbWVsaWhhdCBwb2xhIHBhZGEgdGluZ2thdCB3aWxheWFoLCBkYXBhdCBkaWlkZW50aWZpa2FzaSBrZWNlbmRlcnVuZ2FuIHN0cnVrdHVyYWwsIG1pc2FsbnlhIGtvbnNlbnRyYXNpIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiBkaSBkYWVyYWggdGVydGVudHUgeWFuZyBzZXJpbmcga2FsaSB0aWRhayB0YW1wYWsga2V0aWthIGFuYWxpc2lzIGhhbnlhIGRpbGFrdWthbiBwYWRhIGxldmVsIHJ1bWFoIHRhbmdnYS4gUGVuZGVrYXRhbiBhZ3JlZ2FzaSB3aWxheWFoIHNlcGVydGkgaW5pIGxhemltIGRpZ3VuYWthbiBkYWxhbSBzdHVkaSBrZXRpbXBhbmdhbiByZWdpb25hbCwga2FyZW5hIG1lbWJhbnR1IG1lbmFuZ2thcCBkaW5hbWlrYSBzcGFzaWFsIHBlbWJhbmd1bmFuIGRhbiBrZXNlbmphbmdhbiBhbnRhcndpbGF5YWggc2VjYXJhIGxlYmloIGtvbXByZWhlbnNpZiAoV29ybGQgQmFuaywgMjAwOSkuDQoNCmBgYHtyfQ0KdHJhY3RfdHJhZGVvZmYgPC0gc3Z5YnkoDQogIH5ob3VzaW5nX2J1cmRlbiArIHVuYWZmb3JkYWJsZSArIGV4cF9ub25ob3VzaW5nX3BjLA0KICB+a2FidSwNCiAgZGVzLA0KICBzdnltZWFuLA0KICBuYS5ybSA9IFRSVUUNCikgJT4lDQogIHJlbmFtZSgNCiAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID0gaG91c2luZ19idXJkZW4sDQogICAgdW5hZmZvcmRhYmxlX3JhdGUgID0gdW5hZmZvcmRhYmxlLA0KICAgIHdlbGZhcmVfbm9uaG91c2luZyA9IGV4cF9ub25ob3VzaW5nX3BjDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID0gYXMubnVtZXJpYyhtZWFuX2hvdXNpbmdfYnVyZGVuKSwNCiAgICB3ZWxmYXJlX25vbmhvdXNpbmcgPSBhcy5udW1lcmljKHdlbGZhcmVfbm9uaG91c2luZykNCiAgKQ0KYGBgDQoNCg0KIyMgVHJhZGUtb2ZmIFR5cG9sb2d5DQoNCktsYXNpZmlrYXNpIF9ob3VzaW5n4oCTd2VsZmFyZSB0cmFkZS1vZmZfIGRpZ3VuYWthbiB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIHdpbGF5YWggeWFuZyBtZW5naGFkYXBpIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiB0aW5nZ2kgc2VrYWxpZ3VzIG1lbWlsaWtpIHRpbmdrYXQga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuIHlhbmcgcmVsYXRpZiByZW5kYWguIEtvbnNlcCBfdHJhZGUtb2ZmXyBpbmkgbWVuZ2dhbWJhcmthbiBrb25kaXNpIGtldGlrYSBwZW5pbmdrYXRhbiBwZW5nZWx1YXJhbiB1bnR1ayB0ZW1wYXQgdGluZ2dhbCBzZXJpbmcga2FsaSBoYXJ1cyDigJxkaWJheWFy4oCdIGRlbmdhbiBwZW5ndXJhbmdhbiBhbG9rYXNpIGJlbGFuamEgdW50dWsga2VidXR1aGFuIHBlbnRpbmcgbGFpbm55YSwgc2VwZXJ0aSBwYW5nYW4sIHBlbmRpZGlrYW4sIGtlc2VoYXRhbiwgbWF1cHVuIGtlYnV0dWhhbiBkYXNhciBydW1haCB0YW5nZ2EgbGFpbm55YSAoQW5nZWwsIDIwMDApLg0KDQpQZW5nZWxvbXBva2thbiBfaG91c2luZ+KAk3dlbGZhcmUgdHJhZGUtb2ZmXyBkaWxha3VrYW4gZGVuZ2FuIG1lbWJhZ2kgd2lsYXlhaCBrZSBkYWxhbSBlbXBhdCBrYXRlZ29yaSBiZXJkYXNhcmthbiBwb3Npc2kgcmVsYXRpZm55YSB0ZXJoYWRhcCBuaWxhaSBtZWRpYW4gbmFzaW9uYWwgZGFyaSBkdWEgaW5kaWthdG9yIHV0YW1hLCB5YWl0dSByYXRhLXJhdGEgYmViYW4gYmlheWEgcGVydW1haGFuIChfbWVhbiBob3VzaW5nIGNvc3QgYnVyZGVuXykgZGFuIHBlbmdlbHVhcmFuIG5vbi1wZXJ1bWFoYW4gcGVyIGthcGl0YSAoX25vbi1ob3VzaW5nIGV4cGVuZGl0dXJlIHBlciBjYXBpdGFfKS4gUGVuZ2d1bmFhbiBtZWRpYW4gc2ViYWdhaSB0aXRpayBwZW1iYW5kaW5nIGRpcGlsaWgga2FyZW5hIGxlYmloIHRhaGFuIHRlcmhhZGFwIHBlbmdhcnVoIG5pbGFpIG91dGxpZXIgc2VoaW5nZ2EgbWFtcHUgbWVtYmVyaWthbiBnYW1iYXJhbiBwZXJiYW5kaW5nYW4gYW50YXJ3aWxheWFoIHlhbmcgbGViaWggc3RhYmlsIGRhbiByZXByZXNlbnRhdGlmLiBQZW5kZWthdGFuIGluaSBqdWdhIG1lbWJhbnR1IG1lbm9uam9sa2FuIHBlcmJlZGFhbiBrYXJha3RlcmlzdGlrIGtlc2VqYWh0ZXJhYW4gd2lsYXlhaCBzZWNhcmEgbGViaWggcHJvcG9yc2lvbmFsLg0KDQoxLiBXaWxheWFoIHlhbmcgbWVtaWxpa2kgYmViYW4gYmlheWEgcGVydW1haGFuIGRpIGF0YXMgbWVkaWFuIG5hc2lvbmFsIHRldGFwaSB0aW5na2F0IGtlc2VqYWh0ZXJhYW4gbm9uLXBlcnVtYWhhbiBkaSBiYXdhaCBtZWRpYW4gZGlrbGFzaWZpa2FzaWthbiBzZWJhZ2FpICoqSGlnaCBIb3VzaW5nIENvc3Qg4oCTIExvdyBXZWxmYXJlKiouIEtlbG9tcG9rIGluaSBtZW5jZXJtaW5rYW4ga29uZGlzaSB5YW5nIHBhbGluZyBzZXJpdXMsIGRpIG1hbmEgcGVuZ2VsdWFyYW4gcGVydW1haGFuIG1lbnllcmFwIHBvcnNpIGJlc2FyIGFuZ2dhcmFuIHJ1bWFoIHRhbmdnYSBzZWhpbmdnYSBtZW55aXNha2FuIHJ1YW5nIHlhbmcgdGVyYmF0YXMgdW50dWsgbWVtZW51aGkga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEuIERhbGFtIGtvbnRla3Mga2ViaWpha2FuLCB3aWxheWFoIHBhZGEga2F0ZWdvcmkgaW5pIG1lbmphZGkgcHJpb3JpdGFzIHV0YW1hIGludGVydmVuc2kgcGVydW1haGFuLCBrYXJlbmEgdGVrYW5hbiBiaWF5YSBodW5pYW4gYmVycG90ZW5zaSBtZW1wZXJidXJ1ayBrZXJlbnRhbmFuIGtlc2VqYWh0ZXJhYW4gcnVtYWggdGFuZ2dhLg0KDQoyLiBTZWJhbGlrbnlhLCB3aWxheWFoIGRlbmdhbiBiZWJhbiBiaWF5YSBwZXJ1bWFoYW4gdGluZ2dpIHRldGFwaSBrZXNlamFodGVyYWFuIG5vbi1wZXJ1bWFoYW4ganVnYSB0aW5nZ2kgZGlrbGFzaWZpa2FzaWthbiBzZWJhZ2FpICoqSGlnaCBIb3VzaW5nIENvc3Qg4oCTIEhpZ2ggV2VsZmFyZSoqLiBLb25kaXNpIGluaSBtZW51bmp1a2thbiBiYWh3YSBtZXNraXB1biBiaWF5YSBwZXJ1bWFoYW4gcmVsYXRpZiBtYWhhbCwgcnVtYWggdGFuZ2dhIGRpIHdpbGF5YWggdGVyc2VidXQgbWFzaWggbWVtaWxpa2kga2FwYXNpdGFzIGVrb25vbWkgeWFuZyBjdWt1cCB1bnR1ayBtZW1wZXJ0YWhhbmthbiB0aW5na2F0IGtvbnN1bXNpIG5vbi1wZXJ1bWFoYW4geWFuZyB0aW5nZ2kuIFRpbmdnaW55YSBiaWF5YSBwZXJ1bWFoYW4gdGlkYWsgc2VsYWx1IGJlcmltcGxpa2FzaSBwYWRhIHBlbnVydW5hbiBrZXNlamFodGVyYWFuLg0KDQozLiBLZWxvbXBvayAqKkxvdyBIb3VzaW5nIENvc3Qg4oCTIExvdyBXZWxmYXJlKiogbWVuZ2dhbWJhcmthbiB3aWxheWFoIGRlbmdhbiBiZWJhbiBiaWF5YSBwZXJ1bWFoYW4gcmVsYXRpZiByZW5kYWggdGV0YXBpIHRpbmdrYXQga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuIGp1Z2EgcmVuZGFoLiBLb25kaXNpIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgcGVybWFzYWxhaGFuIHV0YW1hIGtlc2VqYWh0ZXJhYW4gcnVtYWggdGFuZ2dhIGRpIHdpbGF5YWggdGVyc2VidXQgYnVrYW4gdGVybGV0YWsgcGFkYSBzZWt0b3IgcGVydW1haGFuLCBtZWxhaW5rYW4gcGFkYSBrZXRlcmJhdGFzYW4ga2FwYXNpdGFzIGVrb25vbWkgc2VjYXJhIHVtdW0uIE9sZWgga2FyZW5hIGl0dSwga2ViaWpha2FuIHlhbmcgaGFueWEgYmVyZm9rdXMgcGFkYSBwZXJ1bWFoYW4gY2VuZGVydW5nIGt1cmFuZyBlZmVrdGlmLCBkYW4gcGVybHUgZGlsZW5na2FwaSBkZW5nYW4gaW50ZXJ2ZW5zaSBwZW1iYW5ndW5hbiBla29ub21pLCBwZW5jaXB0YWFuIGxhcGFuZ2FuIGtlcmphLCBzZXJ0YSBwZW5pbmdrYXRhbiBwcm9kdWt0aXZpdGFzLg0KDQo0LiBTZW1lbnRhcmEgaXR1LCB3aWxheWFoIHlhbmcgdGVybWFzdWsgZGFsYW0ga2F0ZWdvcmkgKipMb3cgSG91c2luZyBDb3N0IOKAkyBIaWdoIFdlbGZhcmUqKiBtZXJ1cGFrYW4ga2Vsb21wb2sgZGVuZ2FuIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiByZW5kYWggZGFuIHRpbmdrYXQga2VzZWphaHRlcmFhbiBub24tcGVydW1haGFuIHRpbmdnaS4gS2Vsb21wb2sgaW5pIG1lbmNlcm1pbmthbiBrb25kaXNpIHN0cnVrdHVyYWwgeWFuZyByZWxhdGlmIHBhbGluZyBtZW5ndW50dW5na2FuLCBkaSBtYW5hIHJ1bWFoIHRhbmdnYSBtYW1wdSBtZW1lbnVoaSBrZWJ1dHVoYW4gcGVydW1haGFuIHRhbnBhIG1lbmdvcmJhbmthbiBrb25zdW1zaSBub24tcGVydW1haGFuLg0KDQpgYGB7cn0NCmhiX21lZCAgPC0gbWVkaWFuKHRyYWN0X3RyYWRlb2ZmJG1lYW5faG91c2luZ19idXJkZW4sIG5hLnJtID0gVFJVRSkNCndlbF9tZWQgPC0gbWVkaWFuKHRyYWN0X3RyYWRlb2ZmJHdlbGZhcmVfbm9uaG91c2luZywgbmEucm0gPSBUUlVFKQ0KDQp0cmFjdF90cmFkZW9mZiA8LSB0cmFjdF90cmFkZW9mZiAlPiUNCiAgbXV0YXRlKA0KICAgIHRyYWRlb2ZmX3R5cGUgPSBjYXNlX3doZW4oDQogICAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID49IGhiX21lZCAmIHdlbGZhcmVfbm9uaG91c2luZyA8IHdlbF9tZWQgIH4NCiAgICAgICAgIkhpZ2ggSG91c2luZyBDb3N0IOKAkyBMb3cgV2VsZmFyZSIsDQogICAgICBtZWFuX2hvdXNpbmdfYnVyZGVuID49IGhiX21lZCAmIHdlbGZhcmVfbm9uaG91c2luZyA+PSB3ZWxfbWVkIH4NCiAgICAgICAgIkhpZ2ggSG91c2luZyBDb3N0IOKAkyBIaWdoIFdlbGZhcmUiLA0KICAgICAgbWVhbl9ob3VzaW5nX2J1cmRlbiA8IGhiX21lZCAgJiB3ZWxmYXJlX25vbmhvdXNpbmcgPCB3ZWxfbWVkICB+DQogICAgICAgICJMb3cgSG91c2luZyBDb3N0IOKAkyBMb3cgV2VsZmFyZSIsDQogICAgICBUUlVFIH4NCiAgICAgICAgIkxvdyBIb3VzaW5nIENvc3Qg4oCTIEhpZ2ggV2VsZmFyZSINCiAgICApDQogICkNCmhlYWQodHJhY3RfdHJhZGVvZmZbLGMoMTo0LDgpXSkNCmBgYA0KDQpgYGB7cn0NCiNFeHBvcnQgdG8gRXhjZWwNCndyaXRlLnhsc3goDQogIHRyYWN0X3RyYWRlb2ZmLA0KICBmaWxlID0gImhvdXNpbmdfd2VsZmFyZV90cmFkZW9mZl9rYWJrb3RhLnhsc3giLA0KICBvdmVyd3JpdGUgPSBUUlVFDQopDQpgYGANCg0KDQoqKlZpc3VhbGl6YXRpb24qKg0KDQpgYGB7cn0NCmdncGxvdCh0cmFjdF90cmFkZW9mZiwNCiAgICAgICBhZXMobWVhbl9ob3VzaW5nX2J1cmRlbiwNCiAgICAgICAgICAgd2VsZmFyZV9ub25ob3VzaW5nLA0KICAgICAgICAgICBjb2xvciA9IHRyYWRlb2ZmX3R5cGUpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC44KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGhiX21lZCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB3ZWxfbWVkLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhvdXNpbmctV2VsZmFyZSBUcmFkZS1vZmYgQWNyb3NzIERpc3RyaWN0cyIsDQogICAgeCA9ICJBdmVyYWdlIEhvdXNpbmcgQ29zdCBCdXJkZW4iLA0KICAgIHkgPSAiTm9uLUhvdXNpbmcgRXhwZW5kaXR1cmUgcGVyIENhcGl0YSIsDQogICAgY29sb3IgPSAiVHJhZGUtb2ZmIFR5cGUiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpTZWJhcmFuIHRpdGlrIHlhbmcgcmVsYXRpZiBtZXJhdGEgZGkga2VlbXBhdCBrdWFkcmFuIG1lbnVuanVra2FuIGFkYW55YSBoZXRlcm9nZW5pdGFzIGFudGFyd2lsYXlhaC4gS3VhZHJhbiBrYW5hbiBiYXdhaCAoX0hpZ2ggSG91c2luZyBDb3N0IOKAkyBMb3cgV2VsZmFyZV8pIG1lbmNlcm1pbmthbiB3aWxheWFoIGRlbmdhbiB0ZWthbmFuIHBlcnVtYWhhbiBwYWxpbmcgYmVyYXQga2FyZW5hIHRpbmdnaW55YSBiaWF5YSBodW5pYW4gdGlkYWsgZGlpbWJhbmdpIGthcGFzaXRhcyBrb25zdW1zaSBsYWluLiBLdWFkcmFuIGthbmFuIGF0YXMgKF9IaWdoIEhvdXNpbmcgQ29zdCDigJMgSGlnaCBXZWxmYXJlXykgbWVudW5qdWtrYW4gZGFlcmFoIGRlbmdhbiBla29ub21pIGt1YXQsIGRpIG1hbmEgYmlheWEgaHVuaWFuIHRpbmdnaSB0aWRhayBzZWxhbHUgYmVyYXJ0aSBrZXJlbnRhbmFuLiBEaSBzaXNpIGxhaW4sIGt1YWRyYW4ga2lyaSBiYXdhaCAoX0xvdyBIb3VzaW5nIENvc3Qg4oCTIExvdyBXZWxmYXJlXykgbWVuYW5kYWthbiB3aWxheWFoIGRlbmdhbiBkYXlhIGJlbGkgcmVuZGFoLCBzZWhpbmdnYSBpc3UgdXRhbWFueWEgbGViaWggdGVya2FpdCBrZW1pc2tpbmFuIHN0cnVrdHVyYWwuIFNlbWVudGFyYSBpdHUsIGt1YWRyYW4ga2lyaSBhdGFzIChfTG93IEhvdXNpbmcgQ29zdCDigJMgSGlnaCBXZWxmYXJlXykgbWVuZ2dhbWJhcmthbiBrb25kaXNpIHBhbGluZyBpZGVhbCwgZGVuZ2FuIGJlYmFuIHBlcnVtYWhhbiByZW5kYWggZGFuIGtlc2VqYWh0ZXJhYW4gcmVsYXRpZiB0aW5nZ2kuDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgcG9sYSBpbmkgbWVuZWdhc2thbiBiYWh3YSBodWJ1bmdhbiBhbnRhcmEgYmlheWEgcGVydW1haGFuIGRhbiBrZXNlamFodGVyYWFuIHRpZGFrIGJlcnNpZmF0IGxpbmllci4gS2FyZW5hIGl0dSwgcGVuZGVrYXRhbiBiZXJiYXNpcyBfdHJhZGUtb2ZmXyBwZW50aW5nIHVudHVrIG1lcnVtdXNrYW4ga2ViaWpha2FuIHlhbmcgbGViaWgga29udGVrc3R1YWwgZGFuIHRpZGFrIHNhdHUgZGltZW5zaS4NCg0KKipNZWFuIEhvdXNpbmcgQnVyZGVuIHBlciBLYWIvS290YSoqDQoNCmBgYHtyfQ0KZ2dwbG90KA0KICB0cmFjdF90cmFkZW9mZiAlPiUNCiAgICBhcnJhbmdlKG1lYW5faG91c2luZ19idXJkZW4pICU+JQ0KICAgIG11dGF0ZShrYWJ1ID0gZmFjdG9yKGthYnUsIGxldmVscyA9IGthYnUpKSwNCiAgYWVzKHggPSBrYWJ1LCB5ID0gbWVhbl9ob3VzaW5nX2J1cmRlbikNCikgKw0KICBnZW9tX2NvbChmaWxsID0gIiMyQzdGQjgiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMzAsDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwNCiAgICAgICAgICAgICBjb2xvciA9ICJyZWQiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQXZlcmFnZSBIb3VzaW5nIENvc3QgQnVyZGVuIGJ5IERpc3RyaWN0IiwNCiAgICBzdWJ0aXRsZSA9ICJSZWQgbGluZSBpbmRpY2F0ZXMgMzAlIGFmZm9yZGFiaWxpdHkgdGhyZXNob2xkIiwNCiAgICB4ID0gIkRpc3RyaWN0IChLYWIvS290YSkiLA0KICAgIHkgPSAiTWVhbiBIb3VzaW5nIENvc3QgQnVyZGVuIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KR3JhZmlrIEF2ZXJhZ2UgSG91c2luZyBDb3N0IEJ1cmRlbiBieSBEaXN0cmljdCBtZW5hbXBpbGthbiByYXRhLXJhdGEgYmViYW4gYmlheWEgcGVydW1haGFuIChIQ0IpIHNlbHVydWgga2FidXBhdGVuL2tvdGEgeWFuZyBkaXVydXRrYW4gZGFyaSB0ZXJlbmRhaCBoaW5nZ2EgdGVydGluZ2dpLiBTZXRpYXAgYmF0YW5nIG1lcmVwcmVzZW50YXNpa2FuIHNhdHUgd2lsYXlhaCwgZGFuIHN1bWJ1IGhvcml6b250YWwgbWVudW5qdWtrYW4gcHJvcG9yc2kgcGVuZ2VsdWFyYW4gcGVydW1haGFuIHRlcmhhZGFwIHRvdGFsIHBlbmdlbHVhcmFuIHJ1bWFoIHRhbmdnYS4gR3JhZmlrIGluaSBkaXR1anVrYW4gdW50dWsgbWVsaWhhdCBwb2xhIGRpc3RyaWJ1c2kgc2VjYXJhIHVtdW0sIGJ1a2FuIG1lbWJhbmRpbmdrYW4gd2lsYXlhaCBzYXR1IHBlciBzYXR1Lg0KDQpHYXJpcyBtZXJhaCBwdXR1cy1wdXR1cyBwYWRhIGFuZ2thIDMwJSBtZW51bmp1a2thbiBhbWJhbmcga2V0ZXJqYW5na2F1YW4geWFuZyBsYXppbSBkaWd1bmFrYW4uIFdpbGF5YWggZGkga2FuYW4gZ2FyaXMgdGVyc2VidXQgbWVtaWxpa2kgcmF0YS1yYXRhIEhDQiBkaSBhdGFzIDMwJSBkYW4gbWVuZ2hhZGFwaSB0ZWthbmFuIGJpYXlhIHBlcnVtYWhhbiB5YW5nIHJlbGF0aWYgdGluZ2dpLCBzZWRhbmdrYW4gd2lsYXlhaCBkaSBraXJpIG1hc2loIHRlcmdvbG9uZyBsZWJpaCB0ZXJqYW5na2F1Lg0KDQpTZWNhcmEga2VzZWx1cnVoYW4sIGdyYWZpayBpbmkgbWVtcGVybGloYXRrYW4gc2ViZXJhcGEgbHVhcyBkYW4gc2ViZXJhcGEgc2VyaXVzIGlzdSBrZXRlcmphbmdrYXVhbiBwZXJ1bWFoYW4gdGVyc2ViYXIgYW50YXJ3aWxheWFoLCBtZW5lZ2Fza2FuIGJhaHdhIHBlcnNvYWxhbiBpbmkgYmVyc2lmYXQgc3RydWt0dXJhbCBkZW5nYW4gdGluZ2thdCBrZXBhcmFoYW4geWFuZyBiZXJ2YXJpYXNpLg0KDQoNCiMgSENCIHZzIFVuYWZmb3JkYWJsZSBSYXRlDQoNClRhaGFwYW4gaW5pIGRpZ3VuYWthbiB1bnR1ayBtZW5nZWNlayBhcGFrYWggYmViYW4gYmlheWEgcGVydW1haGFuIHlhbmcgdGluZ2dpIGJlbmFyLWJlbmFyIHNlamFsYW4gZGVuZ2FuIG1lbmluZ2thdG55YSBwcm9wb3JzaSBydW1haCB0YW5nZ2EgdGlkYWsgdGVyamFuZ2thdSAoX3VuYWZmb3JkYWJsZV8pIGRpIHRpbmdrYXQga2FidXBhdGVuL2tvdGEuDQoNCg0KYGBge3J9DQpnZ3Bsb3QodHJhY3RfdHJhZGVvZmYsDQogICAgICAgYWVzKG1lYW5faG91c2luZ19idXJkZW4sDQogICAgICAgICAgIHVuYWZmb3JkYWJsZV9yYXRlKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiI0Q5NUYwMiIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhvdXNpbmcgQ29zdCBCdXJkZW4gdnMgVW5hZmZvcmRhYmlsaXR5IFJhdGUiLA0KICAgIHggPSAiQXZlcmFnZSBIb3VzaW5nIENvc3QgQnVyZGVuIiwNCiAgICB5ID0gIlNoYXJlIG9mIFVuYWZmb3JkYWJsZSBIb3VzZWhvbGRzIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KU2V0aWFwIHRpdGlrIHBhZGEgZ3JhZmlrIG1ld2FraWxpIHNhdHUga2FidXBhdGVuL2tvdGEuIFN1bWJ1IGhvcml6b250YWwgbWVudW5qdWtrYW4gcmF0YS1yYXRhIF9Ib3VzaW5nIENvc3QgQnVyZGVuXyAoSENCKSwgc2VkYW5na2FuIHN1bWJ1IHZlcnRpa2FsIG1lbnVuanVra2FuIHBlcnNlbnRhc2UgcnVtYWggdGFuZ2dhIHlhbmcgbWVuZ2VsdWFya2FuIOKJpTMwJSBkYXJpIHRvdGFsIGJlbGFuamEgdW50dWsgcGVydW1haGFuLiBEZW5nYW4gbWVuYW1waWxrYW4ga2VkdWFueWEgZGFsYW0gc2F0dSBiaWRhbmcsIGdyYWZpayBpbmkgbWVtYmFudHUgbWVsaWhhdCBhcGFrYWggd2lsYXlhaCBkZW5nYW4gYmViYW4gcmF0YS1yYXRhIGxlYmloIHRpbmdnaSBtZW1hbmcganVnYSBtZW1pbGlraSBsZWJpaCBiYW55YWsgcnVtYWggdGFuZ2dhIHlhbmcgbWVyYXNhIOKAnHRlcnRla2Fu4oCdIG9sZWggYmlheWEgaHVuaWFuLg0KDQpHYXJpcyBwdXR1cy1wdXR1cyBkYXJpIHJlZ3Jlc2kgbGluaWVyIG1lbnVuanVra2FuIGFyYWggaHVidW5nYW4gdGVyc2VidXQuIEppa2EgZ2FyaXNueWEgbWVuYW5qYWssIGFydGlueWEgc2VtYWtpbiB0aW5nZ2kgcmF0YS1yYXRhIEhDQiBzdWF0dSB3aWxheWFoLCBzZW1ha2luIGJlc2FyIHB1bGEgcHJvcG9yc2kgcnVtYWggdGFuZ2dhIHlhbmcgdGlkYWsgdGVyamFuZ2thdS4gU2VjYXJhIHNlZGVyaGFuYSwgZ3JhZmlrIGluaSBtZW5ndWppIGFwYWthaCBhbmdrYSByYXRhLXJhdGEgYmVuYXItYmVuYXIgbWVuY2VybWlua2FuIGtlbnlhdGFhbiBkaSBsYXBhbmdhbi4gSmlrYSBodWJ1bmdhbiBrZWR1YW55YSBrdWF0IGRhbiBwb3NpdGlmLCBtYWthIEhDQiBkYXBhdCBkaWFuZ2dhcCBzZWJhZ2FpIGluZGlrYXRvciB5YW5nIGN1a3VwIGFuZGFsIHVudHVrIG1lbWJhY2EgdGVrYW5hbiBiaWF5YSBwZXJ1bWFoYW4gZGFuIG1lbmphZGkgZGFzYXIgcGVydW11c2FuIGtlYmlqYWthbi4NCg0KDQojIEhvdXNpbmcgU3RyZXNzIEluZGV4DQoNCl9Ib3VzaW5nIFN0cmVzcyBJbmRleF8gZGlrZW1iYW5na2FuIHNlYmFnYWkgaW5kaWthdG9yIGtvbXBvc2l0IHVudHVrIG1lbmFuZ2thcCB0aW5na2F0IHRla2FuYW4gcGVydW1haGFuIHNlY2FyYSByZWxhdGlmIGFudGFyd2lsYXlhaC4gRGVuZ2FuIG1lbnN0YW5kYXJrYW4gYmViYW4gYmlheWEgcGVydW1haGFuIGRhbiB0aW5na2F0IGtlc2VqYWh0ZXJhYW4gbm9uLXBlcnVtYWhhbiwgaW5kZWtzIGluaSBtZW11bmdraW5rYW4gcGVyYmFuZGluZ2FuIHlhbmcgbGViaWggYWRpbCBhbnRhciBkYWVyYWgsIHRhbnBhIHRlcmRpc3RvcnNpIG9sZWggcGVyYmVkYWFuIHNrYWxhIGF0YXUgYmVzYXJhbiBhYnNvbHV0IG1hc2luZy1tYXNpbmcgd2lsYXlhaCAoT0VDRCwgMjAxMSkuDQoNClBlbmRla2F0YW4gaW5pIG1lbmdpa3V0aSBwcmFrdGlrIHVtdW0gZGFsYW0gcGVueXVzdW5hbiBpbmRla3Mgc29zaWFsLWVrb25vbWkgYmVyYmFzaXMgei1zY29yZSwgeWFuZyBiYW55YWsgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGtlcmVudGFuYW4gZGFuIGtlc2VqYWh0ZXJhYW4gd2lsYXlhaCBzZWNhcmEga29tcGFyYXRpZiAoTmFyZG8gZXQgYWwuLCAyMDA1KS4gRGVuZ2FuIGNhcmEgaW5pLCBwb3Npc2kgc3VhdHUgZGFlcmFoIGRhcGF0IGRpYmFjYSBzZWNhcmEgbGViaWggcHJvcG9yc2lvbmFsIGRhbGFtIGtvbnRla3MgbmFzaW9uYWwuDQoNCg0KYGBge3J9DQp0cmFjdF90cmFkZW9mZiA8LSB0cmFjdF90cmFkZW9mZiAlPiUNCiAgbXV0YXRlKA0KICAgIHpfaG91c2luZyA9IGFzLm51bWVyaWMoc2NhbGUobWVhbl9ob3VzaW5nX2J1cmRlbikpLA0KICAgIHpfd2VsZmFyZSA9IGFzLm51bWVyaWMoc2NhbGUod2VsZmFyZV9ub25ob3VzaW5nKSksDQogICAgaG91c2luZ19zdHJlc3NfaW5kZXggPSAoel9ob3VzaW5nIC0gel93ZWxmYXJlKSAvIDINCiAgKQ0KYGBgDQoNCg0KKipTdHJlc3MgQ2xhc3NpZmljYXRpb24qKg0KDQpgYGB7cn0NCnRyYWN0X3RyYWRlb2ZmIDwtIHRyYWN0X3RyYWRlb2ZmICU+JQ0KICBtdXRhdGUoDQogICAgc3RyZXNzX2NhdGVnb3J5ID0gY2FzZV93aGVuKA0KICAgICAgaG91c2luZ19zdHJlc3NfaW5kZXggPj0gIDAuNzUgfiAiU2V2ZXJlIFN0cmVzcyIsDQogICAgICBob3VzaW5nX3N0cmVzc19pbmRleCA+PSAgMC4yNSB+ICJNb2RlcmF0ZSBTdHJlc3MiLA0KICAgICAgaG91c2luZ19zdHJlc3NfaW5kZXggPj0gLTAuMjUgfiAiTmV1dHJhbCIsDQogICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgICB+ICJMb3cgU3RyZXNzIg0KICAgICkNCiAgKQ0KYGBgDQoNCg0KRXhwb3J0IHRvIEV4Y2VsDQoNCmBgYHtyfQ0Kd3JpdGUueGxzeCgNCiAgdHJhY3RfdHJhZGVvZmYsDQogICJob3VzaW5nX3N0cmVzc19pbmRleF9rYWJrb3RhLnhsc3giLA0KICBvdmVyd3JpdGUgPSBUUlVFDQopDQpgYGANCg0KKipWaXN1YWxpemF0aW9uKioNCg0KYGBge3J9DQpnZ3Bsb3QodHJhY3RfdHJhZGVvZmYsDQogICAgICAgYWVzKG1lYW5faG91c2luZ19idXJkZW4sDQogICAgICAgICAgIHdlbGZhcmVfbm9uaG91c2luZywNCiAgICAgICAgICAgY29sb3IgPSBzdHJlc3NfY2F0ZWdvcnkpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gMC44KSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkhvdXNpbmcgU3RyZXNzIEluZGV4IEFjcm9zcyBEaXN0cmljdHMiLA0KICAgIHggPSAiQXZlcmFnZSBIb3VzaW5nIENvc3QgQnVyZGVuIiwNCiAgICB5ID0gIk5vbi1Ib3VzaW5nIEV4cGVuZGl0dXJlIHBlciBDYXBpdGEiLA0KICAgIGNvbG9yID0gIlN0cmVzcyBMZXZlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIEhTSSBSYW5raW5nDQoNCmBgYHtyfQ0KZ2dwbG90KA0KICB0cmFjdF90cmFkZW9mZiAlPiUNCiAgICBhcnJhbmdlKGhvdXNpbmdfc3RyZXNzX2luZGV4KSAlPiUNCiAgICBtdXRhdGUoa2FidSA9IGZhY3RvcihrYWJ1LCBsZXZlbHMgPSBrYWJ1KSksDQogIGFlcyh4ID0ga2FidSwgeSA9IGhvdXNpbmdfc3RyZXNzX2luZGV4LA0KICAgICAgY29sb3IgPSBzdHJlc3NfY2F0ZWdvcnkpDQopICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZ3JleTQwIikgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSG91c2luZyBTdHJlc3MgSW5kZXggKEhTSSkgYnkgRGlzdHJpY3QiLA0KICAgIHN1YnRpdGxlID0gIlBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgaG91c2luZyBzdHJlc3MiLA0KICAgIHggPSAiRGlzdHJpY3QgKEthYi9Lb3RhKSIsDQogICAgeSA9ICJIb3VzaW5nIFN0cmVzcyBJbmRleCIsDQogICAgY29sb3IgPSAiU3RyZXNzIENhdGVnb3J5Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpXaWxheWFoIGRlbmdhbiBuaWxhaSBfSG91c2luZyBTdHJlc3MgSW5kZXhfIChIU0kpIHlhbmcgdGluZ2dpIG1lbmdnYW1iYXJrYW4ga29uZGlzaSBkaSBtYW5hIHJ1bWFoIHRhbmdnYSBoYXJ1cyBtZW5hbmdndW5nIGJlYmFuIGJpYXlhIHBlcnVtYWhhbiB5YW5nIHJlbGF0aWYgYmVzYXIsIHNlbWVudGFyYSBrZW1hbXB1YW4gbWVyZWthIHVudHVrIG1lbWVudWhpIGtlYnV0dWhhbiBub24tcGVydW1haGFuIG1hc2loIHRlcmJhdGFzLiBTaXR1YXNpIGluaSBtZW51bmp1a2thbiB0ZWthbmFuIGdhbmRhOiBiaWF5YSBodW5pYW4geWFuZyBiZXJhdCBkaSBzYXR1IHNpc2ksIGRhbiBydWFuZyBmaXNrYWwgcnVtYWggdGFuZ2dhIHlhbmcgc2VtcGl0IGRpIHNpc2kgbGFpbi4gVGVtdWFuIHNlcGVydGkgaW5pIG1lbmphZGkgcGVudGluZyBkYWxhbSBtZXJhbmNhbmcga2ViaWpha2FuIHBlcnVtYWhhbiwgc2tlbWEgc3Vic2lkaSwgbWF1cHVuIHBlbmFyZ2V0YW4gYmFudHVhbiBzb3NpYWwgeWFuZyBsZWJpaCB0ZXBhdCBzYXNhcmFuIGJlcmJhc2lzIHdpbGF5YWggKFdvcmxkIEJhbmssIDIwMDkpLiBEZW5nYW4gZGVtaWtpYW4sIGFuYWxpc2lzIGluaSB0aWRhayBiZXJoZW50aSBwYWRhIHBlbWFwYXJhbiBhbmdrYSBzZW1hdGEsIHRldGFwaSBqdWdhIGJlcmZ1bmdzaSBzZWJhZ2FpIGFsYXQgZGlhZ25vc3RpayB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIGRhZXJhaC1kYWVyYWggeWFuZyBwYWxpbmcgcmVudGFuIHRlcmhhZGFwIHRla2FuYW4gcGVydW1haGFuIGRhbiBtZW1idXR1aGthbiBwZXJoYXRpYW4ga2ViaWpha2FuIGxlYmloIGxhbmp1dC4NCg0KDQojIyBEaXN0cmlidXNpIEhTSQ0KDQpgYGB7cn0NCmdncGxvdCh0cmFjdF90cmFkZW9mZiwNCiAgICAgICBhZXMoeCA9IGhvdXNpbmdfc3RyZXNzX2luZGV4LCBmaWxsID0gc3RyZXNzX2NhdGVnb3J5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjAsIGFscGhhID0gMC44KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgSG91c2luZyBTdHJlc3MgSW5kZXgiLA0KICAgIHggPSAiSG91c2luZyBTdHJlc3MgSW5kZXgiLA0KICAgIHkgPSAiTnVtYmVyIG9mIERpc3RyaWN0cyIsDQogICAgZmlsbCA9ICJTdHJlc3MgQ2F0ZWdvcnkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCkRhcmkgZ2FtYmFyIHRlcmxpaGF0IGJhaHdhIHNlYmFnaWFuIGJlc2FyIHdpbGF5YWggdGVya29uc2VudHJhc2kgZGkgc2VraXRhciBuaWxhaSBub2wsIHlhbmcgYmVyYXJ0aSBtYXlvcml0YXMga2FidXBhdGVuL2tvdGEgYmVyYWRhIHBhZGEga2F0ZWdvcmkgbmV0cmFsIGF0YXUgdGVrYW5hbiBzZWRhbmcuIE5hbXVuLCB0ZXJkYXBhdCBzZWp1bWxhaCB3aWxheWFoIGRpIHNpc2kga2FuYW4gZGVuZ2FuIGthdGVnb3JpIG1vZGVyYXRlIGhpbmdnYSBzZXZlcmUgc3RyZXNzLCBtZW51bmp1a2thbiBhZGFueWEga2Vsb21wb2sgZGFlcmFoIHlhbmcgbWVuZ2hhZGFwaSB0ZWthbmFuIHBlcnVtYWhhbiBjdWt1cCBiZXJhdC4gRGkgc2lzaSBraXJpLCB3aWxheWFoIGRlbmdhbiBsb3cgc3RyZXNzIHJlbGF0aWYgbGViaWggYmFueWFrLCBtZW5jZXJtaW5rYW4ga29uZGlzaSBkaSBtYW5hIGJlYmFuIHBlcnVtYWhhbiBtYXNpaCBsZWJpaCB0ZXJrZW5kYWxpIGRpYmFuZGluZyByYXRhLXJhdGEgbmFzaW9uYWwuDQoNCkRpc3RyaWJ1c2kgeWFuZyBjZW5kZXJ1bmcgbWVueWVydXBhaSBrdXJ2YSBsb25jZW5nIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgdGVrYW5hbiBwZXJ1bWFoYW4gbWVydXBha2FuIGZlbm9tZW5hIHlhbmcgdGVyc2ViYXIgbHVhcywgdGV0YXBpIHRpbmdrYXQga2VwYXJhaGFubnlhIGJlcmJlZGEtYmVkYS4gSGFueWEgc2ViYWdpYW4ga2VjaWwgd2lsYXlhaCB5YW5nIGJlcmFkYSBwYWRhIGtvbmRpc2kgc2FuZ2F0IGJlcmF0IChzZXZlcmUgc3RyZXNzKSwgbmFtdW4ga2Vsb21wb2sgaW5pIHBlbnRpbmcgbWVuamFkaSBwZXJoYXRpYW4ga2ViaWpha2FuIGthcmVuYSBtZXJlcHJlc2VudGFzaWthbiBrb25zZW50cmFzaSB0ZWthbmFuIHBhbGluZyB0aW5nZ2kuDQoNCg0KIyBSZWZlcmVuc2kNCg0KWzFdIEFuZ2VsLCBTLiAoMjAwMCkuIF9Ib3VzaW5nIHBvbGljeSBtYXR0ZXJzOiBBIGdsb2JhbCBhbmFseXNpc18uIE94Zm9yZCBVbml2ZXJzaXR5IFByZXNzLg0KDQpbMl0gRGVhdG9uLCBBLiwgJiBaYWlkaSwgUy4gKDIwMDIpLiBfR3VpZGVsaW5lcyBmb3IgY29uc3RydWN0aW5nIGNvbnN1bXB0aW9uIGFnZ3JlZ2F0ZXMgZm9yIHdlbGZhcmUgYW5hbHlzaXNfLiBXb3JsZCBCYW5rIFB1YmxpY2F0aW9ucy4NCg0KWzNdIEhVRC4gKDIwMTgpLiBfQWZmb3JkYWJsZSBob3VzaW5nXy4gVS5TLiBEZXBhcnRtZW50IG9mIEhvdXNpbmcgYW5kIFVyYmFuIERldmVsb3BtZW50Lg0KDQpbNF0gS3V0dHksIE4uIEsuICgyMDA1KS4gX0EgbmV3IG1lYXN1cmUgb2YgaG91c2luZyBhZmZvcmRhYmlsaXR5OiBFc3RpbWF0ZXMgYW5kIGFuYWx5dGljYWwgcmVzdWx0c18uIEhvdXNpbmcgUG9saWN5IERlYmF0ZSwgMTYoMSksIDExM+KAkzE0Mi4NCg0KWzVdIEx1bWxleSwgVC4gKDIwMTApLiBfQ29tcGxleCBzdXJ2ZXlzOiBBIGd1aWRlIHRvIGFuYWx5c2lzIHVzaW5nIFJfLiBKb2huIFdpbGV5ICYgU29ucy4NCg0KWzZdIE5hcmRvLCBNLiwgU2Fpc2FuYSwgTS4sIFNhbHRlbGxpLCBBLiwgJiBUYXJhbnRvbGEsIFMuICgyMDA1KS4gX1Rvb2xzIGZvciBjb21wb3NpdGUgaW5kaWNhdG9ycyBidWlsZGluZ18uIEV1cm9wZWFuIENvbW1pc3Npb24uDQoNCls3XSBPRUNELiAoMjAxMSkuIF9Ib3figJlzIGxpZmU/IE1lYXN1cmluZyB3ZWxsLWJlaW5nXy4gT0VDRCBQdWJsaXNoaW5nLg0KDQpbOF0gU3RvbmUsIE0uIEUuICgyMDA2KS4gX1doYXQgaXMgaG91c2luZyBhZmZvcmRhYmlsaXR5PyBUaGUgY2FzZSBmb3IgdGhlIHJlc2lkdWFsIGluY29tZSBhcHByb2FjaF8uIEhvdXNpbmcgUG9saWN5IERlYmF0ZSwgMTcoMSksIDE1MeKAkzE4NC4NCg0KWzldIFdvcmxkIEJhbmsuICgyMDA5KS4gX1Jlc2hhcGluZyBlY29ub21pYyBnZW9ncmFwaHlfLiBXb3JsZCBCYW5rIFB1YmxpY2F0aW9ucy4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gRGlyZWt0b3JhdCBTdGF0aXN0aWsgS2VzZWphaHRlcmFhbiBSYWt5YXQsIEJQUywgc2FwdGFoYXNAYnBzLmdvLmlkDQoNCg0KDQoNCg==