knitr::opts_chunk$set(echo = TRUE)
Proyeksi kebutuhan perumahan (housing demand projection)
merupakan upaya untuk mengestimasi jumlah unit hunian yang dibutuhkan
pada periode mendatang dengan mempertimbangkan dinamika rumah tangga,
kondisi stok perumahan eksisting, serta kebutuhan normatif masyarakat.
Dalam literatur perumahan, housing demand tidak hanya dipahami sebagai
permintaan pasar (effective demand), tetapi juga sebagai
kebutuhan berbasis kesejahteraan (need-based demand), khususnya
di negara berkembang di mana keterbatasan akses terhadap hunian layak
masih menjadi isu struktural (UN-Habitat, 2011; Angel, 2000).
Secara konseptual, housing demand bersumber dari tiga komponen utama.
Pertama, backlog perumahan yang mencerminkan akumulasi rumah tangga yang
belum menempati rumah milik sendiri atau rumah layak huni. Kedua,
kebutuhan penggantian hunian akibat keberadaan rumah tidak layak huni
(replacement demand), yang dipandang sebagai bagian dari upaya
menjaga keberlanjutan kualitas stok perumahan (Tipple, 2000). Ketiga,
pembentukan rumah tangga baru sebagai akibat dari pertumbuhan penduduk
dan perubahan struktur demografi, yang secara normatif diasumsikan
memerlukan tambahan unit hunian (Mankiw, Romer, & Weil, 1992).
Dalam perencanaan dan statistik, khususnya untuk proyeksi jangka
pendek, housing demand umumnya diestimasi menggunakan
pendekatan housing flow model, yaitu dengan memproyeksikan
pertumbuhan jumlah rumah tangga sebagai new demand, kemudian menambahkan
backlog dan kebutuhan penggantian stok perumahan yang ada (Meen, 2011;
Ball, 2012). Pendekatan ini banyak digunakan dalam analisis kebijakan
publik karena relatif sederhana, transparan, dan dapat dioperasionalkan
menggunakan data survei rumah tangga seperti Susenas.
Meskipun demikian, proyeksi housing demand memiliki
keterbatasan, terutama terkait asumsi stabilitas pembentukan rumah
tangga dan tidak dimasukkannya faktor migrasi, preferensi lokasi, serta
intervensi kebijakan berskala besar. Oleh karena itu, hasil proyeksi
sebaiknya diposisikan sebagai estimasi indikatif untuk mendukung
perencanaan dan penajaman prioritas wilayah, serta sebagai dasar
pemantauan pencapaian Tujuan Pembangunan Berkelanjutan, khususnya SDGs
11.1 mengenai akses terhadap hunian layak dan terjangkau.
Penyiapan Data
Data bersumber dari Susenas tahun 2024 dan 2025 yang diagregasi pada
level provinsi.
Tahap awal dilakukan:
Penyamaan tipe data.
Konsistensi struktur antar tahun
Validasi variabel kunci (jumlah rumah tangga, backlog,
RTLH)
Langkah ini penting untuk memastikan hasil proyeksi bersifat
comparable antar waktu (inter-temporal
consistency).
data <- data %>%
mutate(
tahun = as.integer(tahun),
jumlah_rt = as.numeric(jumlah_rt),
backlog = as.numeric(backlog),
rtlh_total = as.numeric(rtlh_total),
rtlh_milik = as.numeric(rtlh_milik)
)
Pemisahan Data per Tahun
Data dipisahkan berdasarkan tahun observasi untuk menghitung laju
pertumbuhan rumah tangga.
- Tahun 2024 digunakan sebagai baseline
- Tahun 2025 sebagai tahun terakhir observasi
data_2024 <- data %>% filter(tahun == 2024)
data_2025 <- data %>% filter(tahun == 2025)
Penghitungan
Growth
Pendekatan Year-on-Year Growth Rate digunakan dengan asumsi
bahwa dinamika pembentukan rumah tangga antar tahun bersifat relatif
stabil dalam jangka pendek. Laju pertumbuhan rumah tangga yang dihitung
dari perubahan jumlah rumah tangga antara tahun 2024 dan 2025
diasumsikan mampu merepresentasikan kecenderungan pertumbuhan pada
periode proyeksi 2026. Stabilitas ini mencakup pola demografis dasar
seperti pertumbuhan penduduk, struktur umur, serta kecenderungan
pembentukan rumah tangga baru yang tidak mengalami perubahan ekstrem
dalam satu tahun observasi.
Selain itu, proyeksi ini mengasumsikan tidak terjadinya
demographic shock yang signifikan pada periode 2025–2026,
seperti lonjakan migrasi antar wilayah, bencana besar, krisis ekonomi,
atau kebijakan berskala masif yang dapat mengubah perilaku rumah tangga
secara drastis. Dengan asumsi tersebut, laju pertumbuhan historis rumah
tangga dapat digunakan sebagai pendekatan yang wajar dan konservatif
untuk proyeksi jangka pendek, sehingga hasil estimasi demand perumahan
tahun 2026 bersifat indikatif dan relevan untuk keperluan perencanaan
serta penajaman kebijakan perumahan.
Pertumbuhan jumlah rumah tangga dihitung sebagai berikut:
\[
g_i = \frac{RT_{i,2025} - RT_{i,2024}}{RT_{i,2024}}
\]
dengan:
\(g_i\) = laju pertumbuhan rumah
tangga provinsi \(i\)
\(RT_{i,2024}\) = jumlah rumah
tangga tahun 2024
\(RT_{i,2025}\) = jumlah rumah
tangga tahun 2025
Proyeksi
Jumlah rumah tangga tahun 2026 diproyeksikan menggunakan metode
extrapolative growth:
\[
RT_{i,2026} = RT_{i,2025} \times (1 + g_i)
\]
Selanjutnya, jumlah rumah tangga baru dihitung
sebagai:
\[
RT^{baru}_{i,2026} = RT_{i,2026} - RT_{i,2025}
\]
Komponen ini merepresentasikan demand alami akibat
pembentukan rumah tangga baru.
Demand Housing
2026
Dalam proyeksi kebutuhan perumahan, backlog dipahami sebagai
unmet demand historis, yaitu akumulasi rumah tangga
yang hingga periode observasi belum mampu mengakses rumah layak atau
rumah milik sendiri. Backlog mencerminkan kesenjangan struktural antara
kebutuhan dan ketersediaan hunian yang tidak otomatis teratasi tanpa
intervensi kebijakan. Sementara itu, rumah tidak layak huni (RTLH) milik
sendiri merepresentasikan replacement demand, yakni
kebutuhan untuk menggantikan atau memperbaiki unit hunian yang secara
fisik tidak memenuhi standar kelayakan, sehingga peningkatan kualitas
stok perumahan menjadi bagian integral dari pemenuhan demand. Adapun
pembentukan rumah tangga baru mencerminkan new demand,
yaitu kebutuhan tambahan akan unit hunian yang muncul akibat pertumbuhan
jumlah rumah tangga seiring dinamika demografi dan sosial ekonomi.
Ketiga komponen ini secara bersama-sama menggambarkan total kebutuhan
perumahan yang bersifat kumulatif, mencakup dimensi kuantitas maupun
kualitas hunian.
Total demand perumahan tahun 2026 dihitung dengan menjumlahkan tiga
komponen utama:
\[
DH_{i,2026} =
Backlog_{i,2025}
+
RTLH^{milik}_{i,2025}
+
RT^{baru}_{i,2026}
\]
dengan:
\(DH_{i,2026}\) = demand
perumahan provinsi \(i\)
\(Backlog_{i,2025}\) = backlog
kepemilikan tahun 2025
\(RTLH^{milik}_{i,2025}\) =
rumah tidak layak huni milik sendiri
\(RT^{baru}_{i,2026}\) =
pembentukan rumah tangga baru
Share Demand
Ukuran pangsa demand (share demand) digunakan untuk melihat
bagaimana total kebutuhan perumahan nasional tahun 2026 tersebar antar
wilayah. Untuk melihat distribusi demand antar wilayah, dihitung pangsa
demand sebagai berikut:
\[
Share_i = \frac{DH_{i,2026}}{\sum_i DH_{i,2026}}
\]
Rumus ini menormalkan nilai demand absolut menjadi ukuran relatif,
sehingga setiap wilayah dapat dibandingkan secara proporsional meskipun
memiliki skala kebutuhan yang berbeda-beda.
Nilai Share ke-i menunjukkan kontribusi relatif suatu wilayah
terhadap total demand nasional. Semakin besar nilai share, semakin besar
peran wilayah tersebut dalam membentuk kebutuhan perumahan nasional.
Misalnya, share sebesar 0,08 berarti sekitar 8 persen dari total
kebutuhan perumahan nasional tahun 2026 berasal dari wilayah tersebut.
Dengan demikian, indikator ini tidak hanya mencerminkan besarnya
kebutuhan lokal, tetapi juga posisi strategis wilayah tersebut dalam
konteks nasional.
Output
demand_2026_round <- demand_2026 %>%
mutate(
backlog_2025 = round(backlog_2025, 0),
rtlh_milik_2025 = round(rtlh_milik_2025, 0),
rt_baru_2026 = round(rt_baru_2026, 0),
demand_housing_2026 = round(demand_housing_2026, 0),
share_demand = round(share_demand, 4)
)
output = demand_2026_round [,c(1,5:6)]
|
provinsi
|
demand_housing_2026
|
share_demand
|
|
Aceh
|
574360
|
0.0096
|
|
Sumatera Utara
|
1686335
|
0.0283
|
|
Sumatera Barat
|
730787
|
0.0122
|
|
Riau
|
695856
|
0.0117
|
|
Jambi
|
383660
|
0.0064
|
|
Sumatera Selatan
|
975927
|
0.0164
|
|
Bengkulu
|
256923
|
0.0043
|
|
Lampung
|
824532
|
0.0138
|
|
Kepulauan Bangka Belitung
|
289576
|
0.0049
|
|
Kepulauan Riau
|
397014
|
0.0067
|
|
DKI Jakarta
|
2073975
|
0.0348
|
|
Jawa Barat
|
7063178
|
0.1184
|
|
Jawa Tengah
|
3079715
|
0.0516
|
|
DI Yogyakarta
|
295444
|
0.0050
|
|
Jawa Timur
|
3242006
|
0.0543
|
|
Banten
|
1279544
|
0.0214
|
|
Bali
|
282439
|
0.0047
|
|
Nusa Tenggara Barat
|
527494
|
0.0088
|
|
Nusa Tenggara Timur
|
585717
|
0.0098
|
|
Kalimantan Barat
|
432669
|
0.0073
|
|
Kalimantan Tengah
|
346990
|
0.0058
|
|
Kalimantan Selatan
|
567947
|
0.0095
|
|
Kalimantan Timur
|
386654
|
0.0065
|
|
Kalimantan Utara
|
68089
|
0.0011
|
|
Sulawesi Utara
|
250687
|
0.0042
|
|
Sulawesi Tengah
|
340131
|
0.0057
|
|
Sulawesi Selatan
|
641201
|
0.0107
|
|
Sulawesi Tenggara
|
193787
|
0.0032
|
|
Gorontalo
|
105172
|
0.0018
|
|
Sulawesi Barat
|
125422
|
0.0021
|
|
Maluku
|
164707
|
0.0028
|
|
Maluku Utara
|
100394
|
0.0017
|
|
Papua Barat
|
66805
|
0.0011
|
|
Papua Barat Daya
|
71283
|
0.0012
|
|
Papua
|
117853
|
0.0020
|
|
Papua Selatan
|
90430
|
0.0015
|
|
Papua Tengah
|
225583
|
0.0038
|
|
Papua Pegunungan
|
293427
|
0.0049
|
|
INDONESIA
|
29828181
|
0.5000
|
write.xlsx(
demand_2026_round,
file = "Proyeksi_Demand_Housing_2026.xlsx",
sheetName = "Demand_2026",
overwrite = TRUE
)
References
[1] Angel, S. (2000). Housing Policy Matters: A Global
Analysis. Oxford University Press.
[2] Ball, M. (2012). Housing Supply and Planning Controls.
Routledge.
[3] Mankiw, N. G., Romer, D., & Weil, D. N. (1992). A
contribution to the empirics of economic growth. Quarterly Journal
of Economics, 107(2), 407–437.
[4] Meen, G. (2011). Modelling housing markets: Theory, evidence
and policy. Journal of Housing Economics, 20(4), 235–246.
[5] Tipple, G. (2000). Extending Themselves: User-Initiated
Transformations of Government-Built Housing in Developing
Countries. Liverpool University Press.
[6] UN-Habitat. (2011). Affordable Land and Housing in Asia.
United Nations Human Settlements Programme.
Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id
LS0tDQp0aXRsZTogIkhvdXNpbmcgRGVtYW5kIFByb2plY3Rpb24gMjAyNiINCnN1YnRpdGxlOiAiUGVuZGVrYXRhbiBCYWNrbG9nLCBfUmVwbGFjZW1lbnRfLCBkYW4gX05ldyBEZW1hbmRfIg0KYXV0aG9yOiAiU2FwdGEgSGFzdGhvIFBvbmNvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQpib2R5ew0KdGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNClByb3lla3NpIGtlYnV0dWhhbiBwZXJ1bWFoYW4gKF9ob3VzaW5nIGRlbWFuZCBwcm9qZWN0aW9uXykgbWVydXBha2FuIHVwYXlhIHVudHVrIG1lbmdlc3RpbWFzaSBqdW1sYWggdW5pdCBodW5pYW4geWFuZyBkaWJ1dHVoa2FuIHBhZGEgcGVyaW9kZSBtZW5kYXRhbmcgZGVuZ2FuIG1lbXBlcnRpbWJhbmdrYW4gZGluYW1pa2EgcnVtYWggdGFuZ2dhLCBrb25kaXNpIHN0b2sgcGVydW1haGFuIGVrc2lzdGluZywgc2VydGEga2VidXR1aGFuIG5vcm1hdGlmIG1hc3lhcmFrYXQuIERhbGFtIGxpdGVyYXR1ciBwZXJ1bWFoYW4sIGhvdXNpbmcgZGVtYW5kIHRpZGFrIGhhbnlhIGRpcGFoYW1pIHNlYmFnYWkgcGVybWludGFhbiBwYXNhciAoX2VmZmVjdGl2ZSBkZW1hbmRfKSwgdGV0YXBpIGp1Z2Egc2ViYWdhaSBrZWJ1dHVoYW4gYmVyYmFzaXMga2VzZWphaHRlcmFhbiAoX25lZWQtYmFzZWQgZGVtYW5kXyksIGtodXN1c255YSBkaSBuZWdhcmEgYmVya2VtYmFuZyBkaSBtYW5hIGtldGVyYmF0YXNhbiBha3NlcyB0ZXJoYWRhcCBodW5pYW4gbGF5YWsgbWFzaWggbWVuamFkaSBpc3Ugc3RydWt0dXJhbCAoVU4tSGFiaXRhdCwgMjAxMTsgQW5nZWwsIDIwMDApLg0KDQpTZWNhcmEga29uc2VwdHVhbCwgaG91c2luZyBkZW1hbmQgYmVyc3VtYmVyIGRhcmkgdGlnYSBrb21wb25lbiB1dGFtYS4gUGVydGFtYSwgYmFja2xvZyBwZXJ1bWFoYW4geWFuZyBtZW5jZXJtaW5rYW4gYWt1bXVsYXNpIHJ1bWFoIHRhbmdnYSB5YW5nIGJlbHVtIG1lbmVtcGF0aSBydW1haCBtaWxpayBzZW5kaXJpIGF0YXUgcnVtYWggbGF5YWsgaHVuaS4gS2VkdWEsIGtlYnV0dWhhbiBwZW5nZ2FudGlhbiBodW5pYW4gYWtpYmF0IGtlYmVyYWRhYW4gcnVtYWggdGlkYWsgbGF5YWsgaHVuaSAoX3JlcGxhY2VtZW50IGRlbWFuZF8pLCB5YW5nIGRpcGFuZGFuZyBzZWJhZ2FpIGJhZ2lhbiBkYXJpIHVwYXlhIG1lbmphZ2Ega2ViZXJsYW5qdXRhbiBrdWFsaXRhcyBzdG9rIHBlcnVtYWhhbiAoVGlwcGxlLCAyMDAwKS4gS2V0aWdhLCBwZW1iZW50dWthbiBydW1haCB0YW5nZ2EgYmFydSBzZWJhZ2FpIGFraWJhdCBkYXJpIHBlcnR1bWJ1aGFuIHBlbmR1ZHVrIGRhbiBwZXJ1YmFoYW4gc3RydWt0dXIgZGVtb2dyYWZpLCB5YW5nIHNlY2FyYSBub3JtYXRpZiBkaWFzdW1zaWthbiBtZW1lcmx1a2FuIHRhbWJhaGFuIHVuaXQgaHVuaWFuIChNYW5raXcsIFJvbWVyLCAmIFdlaWwsIDE5OTIpLg0KDQpEYWxhbSBwZXJlbmNhbmFhbiBkYW4gc3RhdGlzdGlrLCBraHVzdXNueWEgdW50dWsgcHJveWVrc2kgamFuZ2thIHBlbmRlaywgX2hvdXNpbmcgZGVtYW5kXyB1bXVtbnlhIGRpZXN0aW1hc2kgbWVuZ2d1bmFrYW4gcGVuZGVrYXRhbiBfaG91c2luZyBmbG93IG1vZGVsXywgeWFpdHUgZGVuZ2FuIG1lbXByb3lla3Npa2FuIHBlcnR1bWJ1aGFuIGp1bWxhaCBydW1haCB0YW5nZ2Egc2ViYWdhaSBuZXcgZGVtYW5kLCBrZW11ZGlhbiBtZW5hbWJhaGthbiBiYWNrbG9nIGRhbiBrZWJ1dHVoYW4gcGVuZ2dhbnRpYW4gc3RvayBwZXJ1bWFoYW4geWFuZyBhZGEgKE1lZW4sIDIwMTE7IEJhbGwsIDIwMTIpLiBQZW5kZWthdGFuIGluaSBiYW55YWsgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGtlYmlqYWthbiBwdWJsaWsga2FyZW5hIHJlbGF0aWYgc2VkZXJoYW5hLCB0cmFuc3BhcmFuLCBkYW4gZGFwYXQgZGlvcGVyYXNpb25hbGthbiBtZW5nZ3VuYWthbiBkYXRhIHN1cnZlaSBydW1haCB0YW5nZ2Egc2VwZXJ0aSBTdXNlbmFzLg0KDQpNZXNraXB1biBkZW1pa2lhbiwgcHJveWVrc2kgX2hvdXNpbmcgZGVtYW5kXyBtZW1pbGlraSBrZXRlcmJhdGFzYW4sIHRlcnV0YW1hIHRlcmthaXQgYXN1bXNpIHN0YWJpbGl0YXMgcGVtYmVudHVrYW4gcnVtYWggdGFuZ2dhIGRhbiB0aWRhayBkaW1hc3Vra2FubnlhIGZha3RvciBtaWdyYXNpLCBwcmVmZXJlbnNpIGxva2FzaSwgc2VydGEgaW50ZXJ2ZW5zaSBrZWJpamFrYW4gYmVyc2thbGEgYmVzYXIuIE9sZWgga2FyZW5hIGl0dSwgaGFzaWwgcHJveWVrc2kgc2ViYWlrbnlhIGRpcG9zaXNpa2FuIHNlYmFnYWkgZXN0aW1hc2kgaW5kaWthdGlmIHVudHVrIG1lbmR1a3VuZyBwZXJlbmNhbmFhbiBkYW4gcGVuYWphbWFuIHByaW9yaXRhcyB3aWxheWFoLCBzZXJ0YSBzZWJhZ2FpIGRhc2FyIHBlbWFudGF1YW4gcGVuY2FwYWlhbiBUdWp1YW4gUGVtYmFuZ3VuYW4gQmVya2VsYW5qdXRhbiwga2h1c3VzbnlhIFNER3MgMTEuMSBtZW5nZW5haSBha3NlcyB0ZXJoYWRhcCBodW5pYW4gbGF5YWsgZGFuIHRlcmphbmdrYXUuDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShvcGVueGxzeCkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KZGF0YSA8LSByZWFkX2V4Y2VsKA0KICAic3VzZW5hc19ob3VzaW5nXzIwMjRfMjAyNS54bHN4IiwNCiAgc2tpcCA9IDENCikNCmBgYA0KDQojIFBlbnlpYXBhbiBEYXRhDQoNCkRhdGEgYmVyc3VtYmVyIGRhcmkgU3VzZW5hcyB0YWh1biAyMDI0IGRhbiAyMDI1IHlhbmcgZGlhZ3JlZ2FzaSBwYWRhIGxldmVsIHByb3ZpbnNpLg0KDQpUYWhhcCBhd2FsIGRpbGFrdWthbjoNCg0KLSBQZW55YW1hYW4gdGlwZSBkYXRhLg0KDQotIEtvbnNpc3RlbnNpIHN0cnVrdHVyIGFudGFyIHRhaHVuDQoNCi0gVmFsaWRhc2kgdmFyaWFiZWwga3VuY2kgKGp1bWxhaCBydW1haCB0YW5nZ2EsIGJhY2tsb2csIFJUTEgpDQoNCkxhbmdrYWggaW5pIHBlbnRpbmcgdW50dWsgbWVtYXN0aWthbiBoYXNpbCBwcm95ZWtzaSBiZXJzaWZhdCAqKmNvbXBhcmFibGUgYW50YXIgd2FrdHUgKGludGVyLXRlbXBvcmFsIGNvbnNpc3RlbmN5KSoqLg0KDQoNCmBgYHtyfQ0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoDQogICAgdGFodW4gICAgICAgID0gYXMuaW50ZWdlcih0YWh1biksDQogICAganVtbGFoX3J0ICAgID0gYXMubnVtZXJpYyhqdW1sYWhfcnQpLA0KICAgIGJhY2tsb2cgICAgICA9IGFzLm51bWVyaWMoYmFja2xvZyksDQogICAgcnRsaF90b3RhbCAgID0gYXMubnVtZXJpYyhydGxoX3RvdGFsKSwNCiAgICBydGxoX21pbGlrICAgPSBhcy5udW1lcmljKHJ0bGhfbWlsaWspDQogICkNCmBgYA0KDQoqKlBlbWlzYWhhbiBEYXRhIHBlciBUYWh1bioqDQoNCkRhdGEgZGlwaXNhaGthbiBiZXJkYXNhcmthbiB0YWh1biBvYnNlcnZhc2kgdW50dWsgbWVuZ2hpdHVuZyBsYWp1IHBlcnR1bWJ1aGFuIHJ1bWFoIHRhbmdnYS4NCg0KLSBUYWh1biAyMDI0IGRpZ3VuYWthbiBzZWJhZ2FpICoqYmFzZWxpbmUqKg0KLSBUYWh1biAyMDI1IHNlYmFnYWkgKip0YWh1biB0ZXJha2hpciBvYnNlcnZhc2kqKg0KDQoNCmBgYHtyfQ0KZGF0YV8yMDI0IDwtIGRhdGEgJT4lIGZpbHRlcih0YWh1biA9PSAyMDI0KQ0KZGF0YV8yMDI1IDwtIGRhdGEgJT4lIGZpbHRlcih0YWh1biA9PSAyMDI1KQ0KYGBgDQoNCiMgUGVuZ2hpdHVuZ2FuIA0KDQojIyBHcm93dGgNCg0KUGVuZGVrYXRhbiBfWWVhci1vbi1ZZWFyIEdyb3d0aCBSYXRlXyBkaWd1bmFrYW4gZGVuZ2FuIGFzdW1zaSBiYWh3YSBkaW5hbWlrYSBwZW1iZW50dWthbiBydW1haCB0YW5nZ2EgYW50YXIgdGFodW4gYmVyc2lmYXQgcmVsYXRpZiBzdGFiaWwgZGFsYW0gamFuZ2thIHBlbmRlay4gTGFqdSBwZXJ0dW1idWhhbiBydW1haCB0YW5nZ2EgeWFuZyBkaWhpdHVuZyBkYXJpIHBlcnViYWhhbiBqdW1sYWggcnVtYWggdGFuZ2dhIGFudGFyYSB0YWh1biAyMDI0IGRhbiAyMDI1IGRpYXN1bXNpa2FuIG1hbXB1IG1lcmVwcmVzZW50YXNpa2FuIGtlY2VuZGVydW5nYW4gcGVydHVtYnVoYW4gcGFkYSBwZXJpb2RlIHByb3lla3NpIDIwMjYuIFN0YWJpbGl0YXMgaW5pIG1lbmNha3VwIHBvbGEgZGVtb2dyYWZpcyBkYXNhciBzZXBlcnRpIHBlcnR1bWJ1aGFuIHBlbmR1ZHVrLCBzdHJ1a3R1ciB1bXVyLCBzZXJ0YSBrZWNlbmRlcnVuZ2FuIHBlbWJlbnR1a2FuIHJ1bWFoIHRhbmdnYSBiYXJ1IHlhbmcgdGlkYWsgbWVuZ2FsYW1pIHBlcnViYWhhbiBla3N0cmVtIGRhbGFtIHNhdHUgdGFodW4gb2JzZXJ2YXNpLg0KDQpTZWxhaW4gaXR1LCBwcm95ZWtzaSBpbmkgbWVuZ2FzdW1zaWthbiB0aWRhayB0ZXJqYWRpbnlhIF9kZW1vZ3JhcGhpYyBzaG9ja18geWFuZyBzaWduaWZpa2FuIHBhZGEgcGVyaW9kZSAyMDI14oCTMjAyNiwgc2VwZXJ0aSBsb25qYWthbiBtaWdyYXNpIGFudGFyIHdpbGF5YWgsIGJlbmNhbmEgYmVzYXIsIGtyaXNpcyBla29ub21pLCBhdGF1IGtlYmlqYWthbiBiZXJza2FsYSBtYXNpZiB5YW5nIGRhcGF0IG1lbmd1YmFoIHBlcmlsYWt1IHJ1bWFoIHRhbmdnYSBzZWNhcmEgZHJhc3Rpcy4gRGVuZ2FuIGFzdW1zaSB0ZXJzZWJ1dCwgbGFqdSBwZXJ0dW1idWhhbiBoaXN0b3JpcyBydW1haCB0YW5nZ2EgZGFwYXQgZGlndW5ha2FuIHNlYmFnYWkgcGVuZGVrYXRhbiB5YW5nIHdhamFyIGRhbiBrb25zZXJ2YXRpZiB1bnR1ayBwcm95ZWtzaSBqYW5na2EgcGVuZGVrLCBzZWhpbmdnYSBoYXNpbCBlc3RpbWFzaSBkZW1hbmQgcGVydW1haGFuIHRhaHVuIDIwMjYgYmVyc2lmYXQgaW5kaWthdGlmIGRhbiByZWxldmFuIHVudHVrIGtlcGVybHVhbiBwZXJlbmNhbmFhbiBzZXJ0YSBwZW5hamFtYW4ga2ViaWpha2FuIHBlcnVtYWhhbi4NCg0KUGVydHVtYnVoYW4ganVtbGFoIHJ1bWFoIHRhbmdnYSBkaWhpdHVuZyBzZWJhZ2FpIGJlcmlrdXQ6DQoNClxbDQpnX2kgPSBcZnJhY3tSVF97aSwyMDI1fSAtIFJUX3tpLDIwMjR9fXtSVF97aSwyMDI0fX0NClxdDQoNCmRlbmdhbjoNCg0KLSBcKCBnX2kgXCkgPSBsYWp1IHBlcnR1bWJ1aGFuIHJ1bWFoIHRhbmdnYSBwcm92aW5zaSBcKCBpIFwpDQoNCi0gXCggUlRfe2ksMjAyNH0gXCkgPSBqdW1sYWggcnVtYWggdGFuZ2dhIHRhaHVuIDIwMjQNCg0KLSBcKCBSVF97aSwyMDI1fSBcKSA9IGp1bWxhaCBydW1haCB0YW5nZ2EgdGFodW4gMjAyNQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmdyb3d0aF9ydCA8LSBkYXRhXzIwMjQgJT4lDQogIHNlbGVjdChwcm92aW5zaSwgcnRfMjAyNCA9IGp1bWxhaF9ydCkgJT4lDQogIGxlZnRfam9pbigNCiAgICBkYXRhXzIwMjUgJT4lIA0KICAgICAgc2VsZWN0KHByb3ZpbnNpLCBydF8yMDI1ID0ganVtbGFoX3J0KSwNCiAgICBieSA9ICJwcm92aW5zaSINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGdyb3d0aF9ydCA9IChydF8yMDI1IC0gcnRfMjAyNCkgLyBydF8yMDI0DQogICkNCmBgYA0KDQojIyBQcm95ZWtzaQ0KDQpKdW1sYWggcnVtYWggdGFuZ2dhIHRhaHVuIDIwMjYgZGlwcm95ZWtzaWthbiBtZW5nZ3VuYWthbiBtZXRvZGUgKipleHRyYXBvbGF0aXZlIGdyb3d0aCoqOg0KDQpcWw0KUlRfe2ksMjAyNn0gPSBSVF97aSwyMDI1fSBcdGltZXMgKDEgKyBnX2kpDQpcXQ0KDQpTZWxhbmp1dG55YSwganVtbGFoICoqcnVtYWggdGFuZ2dhIGJhcnUqKiBkaWhpdHVuZyBzZWJhZ2FpOg0KDQpcWw0KUlRee2JhcnV9X3tpLDIwMjZ9ID0gUlRfe2ksMjAyNn0gLSBSVF97aSwyMDI1fQ0KXF0NCg0KS29tcG9uZW4gaW5pIG1lcmVwcmVzZW50YXNpa2FuICoqZGVtYW5kIGFsYW1pKiogYWtpYmF0IHBlbWJlbnR1a2FuIHJ1bWFoIHRhbmdnYSBiYXJ1Lg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnByb3lla3NpX3J0IDwtIGRhdGFfMjAyNSAlPiUNCiAgc2VsZWN0KHByb3ZpbnNpLCBydF8yMDI1ID0ganVtbGFoX3J0KSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGdyb3d0aF9ydCAlPiUgDQogICAgICBzZWxlY3QocHJvdmluc2ksIGdyb3d0aF9ydCksDQogICAgYnkgPSAicHJvdmluc2kiDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBydF8yMDI2ICAgICAgPSBydF8yMDI1ICogKDEgKyBncm93dGhfcnQpLA0KICAgIHJ0X2JhcnVfMjAyNiA9IHJ0XzIwMjYgLSBydF8yMDI1DQogICkNCmBgYA0KDQojIyBEZW1hbmQgSG91c2luZyAyMDI2DQoNCkRhbGFtIHByb3lla3NpIGtlYnV0dWhhbiBwZXJ1bWFoYW4sIGJhY2tsb2cgZGlwYWhhbWkgc2ViYWdhaSAqKnVubWV0IGRlbWFuZCBoaXN0b3JpcyoqLCB5YWl0dSBha3VtdWxhc2kgcnVtYWggdGFuZ2dhIHlhbmcgaGluZ2dhIHBlcmlvZGUgb2JzZXJ2YXNpIGJlbHVtIG1hbXB1IG1lbmdha3NlcyBydW1haCBsYXlhayBhdGF1IHJ1bWFoIG1pbGlrIHNlbmRpcmkuIEJhY2tsb2cgbWVuY2VybWlua2FuIGtlc2VuamFuZ2FuIHN0cnVrdHVyYWwgYW50YXJhIGtlYnV0dWhhbiBkYW4ga2V0ZXJzZWRpYWFuIGh1bmlhbiB5YW5nIHRpZGFrIG90b21hdGlzIHRlcmF0YXNpIHRhbnBhIGludGVydmVuc2kga2ViaWpha2FuLiBTZW1lbnRhcmEgaXR1LCBydW1haCB0aWRhayBsYXlhayBodW5pIChSVExIKSBtaWxpayBzZW5kaXJpIG1lcmVwcmVzZW50YXNpa2FuICoqcmVwbGFjZW1lbnQgZGVtYW5kKiosIHlha25pIGtlYnV0dWhhbiB1bnR1ayBtZW5nZ2FudGlrYW4gYXRhdSBtZW1wZXJiYWlraSB1bml0IGh1bmlhbiB5YW5nIHNlY2FyYSBmaXNpayB0aWRhayBtZW1lbnVoaSBzdGFuZGFyIGtlbGF5YWthbiwgc2VoaW5nZ2EgcGVuaW5na2F0YW4ga3VhbGl0YXMgc3RvayBwZXJ1bWFoYW4gbWVuamFkaSBiYWdpYW4gaW50ZWdyYWwgZGFyaSBwZW1lbnVoYW4gZGVtYW5kLiBBZGFwdW4gcGVtYmVudHVrYW4gcnVtYWggdGFuZ2dhIGJhcnUgbWVuY2VybWlua2FuICoqbmV3IGRlbWFuZCoqLCB5YWl0dSBrZWJ1dHVoYW4gdGFtYmFoYW4gYWthbiB1bml0IGh1bmlhbiB5YW5nIG11bmN1bCBha2liYXQgcGVydHVtYnVoYW4ganVtbGFoIHJ1bWFoIHRhbmdnYSBzZWlyaW5nIGRpbmFtaWthIGRlbW9ncmFmaSBkYW4gc29zaWFsIGVrb25vbWkuIEtldGlnYSBrb21wb25lbiBpbmkgc2VjYXJhIGJlcnNhbWEtc2FtYSBtZW5nZ2FtYmFya2FuIHRvdGFsIGtlYnV0dWhhbiBwZXJ1bWFoYW4geWFuZyBiZXJzaWZhdCBrdW11bGF0aWYsIG1lbmNha3VwIGRpbWVuc2kga3VhbnRpdGFzIG1hdXB1biBrdWFsaXRhcyBodW5pYW4uDQoNClRvdGFsIGRlbWFuZCBwZXJ1bWFoYW4gdGFodW4gMjAyNiBkaWhpdHVuZyBkZW5nYW4gbWVuanVtbGFoa2FuIHRpZ2Ega29tcG9uZW4gdXRhbWE6DQoNClxbDQpESF97aSwyMDI2fSA9DQpCYWNrbG9nX3tpLDIwMjV9DQorDQpSVExIXnttaWxpa31fe2ksMjAyNX0NCisNClJUXntiYXJ1fV97aSwyMDI2fQ0KXF0NCg0KZGVuZ2FuOg0KDQotIFwoIERIX3tpLDIwMjZ9IFwpID0gZGVtYW5kIHBlcnVtYWhhbiBwcm92aW5zaSBcKCBpIFwpDQoNCi0gXCggQmFja2xvZ197aSwyMDI1fSBcKSA9IGJhY2tsb2cga2VwZW1pbGlrYW4gdGFodW4gMjAyNQ0KDQotIFwoIFJUTEhee21pbGlrfV97aSwyMDI1fSBcKSA9IHJ1bWFoIHRpZGFrIGxheWFrIGh1bmkgbWlsaWsgc2VuZGlyaQ0KDQotIFwoIFJUXntiYXJ1fV97aSwyMDI2fSBcKSA9IHBlbWJlbnR1a2FuIHJ1bWFoIHRhbmdnYSBiYXJ1DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZGVtYW5kXzIwMjYgPC0gZGF0YV8yMDI1ICU+JQ0KICBzZWxlY3QoDQogICAgcHJvdmluc2ksDQogICAgYmFja2xvZ18yMDI1ICAgID0gYmFja2xvZywNCiAgICBydGxoX21pbGlrXzIwMjUgPSBydGxoX21pbGlrDQogICkgJT4lDQogIGxlZnRfam9pbigNCiAgICBwcm95ZWtzaV9ydCAlPiUgDQogICAgICBzZWxlY3QocHJvdmluc2ksIHJ0X2JhcnVfMjAyNiksDQogICAgYnkgPSAicHJvdmluc2kiDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBkZW1hbmRfaG91c2luZ18yMDI2ID0NCiAgICAgIGJhY2tsb2dfMjAyNSArDQogICAgICBydGxoX21pbGlrXzIwMjUgKw0KICAgICAgcnRfYmFydV8yMDI2DQogICkNCg0KYGBgDQoNCiMjIFNoYXJlIERlbWFuZA0KDQpVa3VyYW4gcGFuZ3NhIGRlbWFuZCAoX3NoYXJlIGRlbWFuZF8pIGRpZ3VuYWthbiB1bnR1ayBtZWxpaGF0IGJhZ2FpbWFuYSB0b3RhbCBrZWJ1dHVoYW4gcGVydW1haGFuIG5hc2lvbmFsIHRhaHVuIDIwMjYgdGVyc2ViYXIgYW50YXIgd2lsYXlhaC4gVW50dWsgbWVsaWhhdCBkaXN0cmlidXNpIGRlbWFuZCBhbnRhciB3aWxheWFoLCBkaWhpdHVuZyBwYW5nc2EgZGVtYW5kIHNlYmFnYWkgYmVyaWt1dDoNCg0KXFsNClNoYXJlX2kgPSBcZnJhY3tESF97aSwyMDI2fX17XHN1bV9pIERIX3tpLDIwMjZ9fQ0KXF0NCg0KUnVtdXMgaW5pIG1lbm9ybWFsa2FuIG5pbGFpIGRlbWFuZCBhYnNvbHV0IG1lbmphZGkgdWt1cmFuIHJlbGF0aWYsIHNlaGluZ2dhIHNldGlhcCB3aWxheWFoIGRhcGF0IGRpYmFuZGluZ2thbiBzZWNhcmEgcHJvcG9yc2lvbmFsIG1lc2tpcHVuIG1lbWlsaWtpIHNrYWxhIGtlYnV0dWhhbiB5YW5nIGJlcmJlZGEtYmVkYS4NCg0KTmlsYWkgU2hhcmUga2UtaSBtZW51bmp1a2thbiBrb250cmlidXNpIHJlbGF0aWYgc3VhdHUgd2lsYXlhaCB0ZXJoYWRhcCB0b3RhbCBkZW1hbmQgbmFzaW9uYWwuIFNlbWFraW4gYmVzYXIgbmlsYWkgc2hhcmUsIHNlbWFraW4gYmVzYXIgcGVyYW4gd2lsYXlhaCB0ZXJzZWJ1dCBkYWxhbSBtZW1iZW50dWsga2VidXR1aGFuIHBlcnVtYWhhbiBuYXNpb25hbC4gTWlzYWxueWEsIHNoYXJlIHNlYmVzYXIgMCwwOCBiZXJhcnRpIHNla2l0YXIgOCBwZXJzZW4gZGFyaSB0b3RhbCBrZWJ1dHVoYW4gcGVydW1haGFuIG5hc2lvbmFsIHRhaHVuIDIwMjYgYmVyYXNhbCBkYXJpIHdpbGF5YWggdGVyc2VidXQuIERlbmdhbiBkZW1pa2lhbiwgaW5kaWthdG9yIGluaSB0aWRhayBoYW55YSBtZW5jZXJtaW5rYW4gYmVzYXJueWEga2VidXR1aGFuIGxva2FsLCB0ZXRhcGkganVnYSBwb3Npc2kgc3RyYXRlZ2lzIHdpbGF5YWggdGVyc2VidXQgZGFsYW0ga29udGVrcyBuYXNpb25hbC4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQpkZW1hbmRfMjAyNiA8LSBkZW1hbmRfMjAyNiAlPiUNCiAgbXV0YXRlKA0KICAgIHNoYXJlX2RlbWFuZCA9DQogICAgICBkZW1hbmRfaG91c2luZ18yMDI2IC8NCiAgICAgIHN1bShkZW1hbmRfaG91c2luZ18yMDI2LCBuYS5ybSA9IFRSVUUpDQogICkgJT4lDQphcnJhbmdlKGRlc2MoZGVtYW5kX2hvdXNpbmdfMjAyNikpDQoNCg0KdXJ1dGFuX3Byb3YgPC0gZGF0YV8yMDI1ICU+JQ0KICBkaXN0aW5jdChwcm92aW5zaSkgJT4lDQogIG11dGF0ZShvcmRlcl9hc2xpID0gcm93X251bWJlcigpKQ0KDQpkZW1hbmRfMjAyNiA8LSBkZW1hbmRfMjAyNiAlPiUNCiAgbGVmdF9qb2luKHVydXRhbl9wcm92LCBieSA9ICJwcm92aW5zaSIpICU+JQ0KICBhcnJhbmdlKG9yZGVyX2FzbGkpICU+JQ0KICBzZWxlY3QoLW9yZGVyX2FzbGkpDQpgYGANCg0KIyBPdXRwdXQNCg0KYGBge3J9DQpkZW1hbmRfMjAyNl9yb3VuZCA8LSBkZW1hbmRfMjAyNiAlPiUNCiAgbXV0YXRlKA0KICAgIGJhY2tsb2dfMjAyNSAgICAgICAgICA9IHJvdW5kKGJhY2tsb2dfMjAyNSwgMCksDQogICAgcnRsaF9taWxpa18yMDI1ICAgICAgID0gcm91bmQocnRsaF9taWxpa18yMDI1LCAwKSwNCiAgICBydF9iYXJ1XzIwMjYgICAgICAgICAgPSByb3VuZChydF9iYXJ1XzIwMjYsIDApLA0KICAgIGRlbWFuZF9ob3VzaW5nXzIwMjYgICA9IHJvdW5kKGRlbWFuZF9ob3VzaW5nXzIwMjYsIDApLA0KICAgIHNoYXJlX2RlbWFuZCAgICAgICAgICA9IHJvdW5kKHNoYXJlX2RlbWFuZCwgNCkNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0Kb3V0cHV0ID0gZGVtYW5kXzIwMjZfcm91bmQgWyxjKDEsNTo2KV0NCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjprYWJsZSgNCiAgb3V0cHV0LA0KICBmb3JtYXQgPSAiaHRtbCIsDQogIHRhYmxlLmF0dHIgPSAnc3R5bGU9ImZvbnQtc2l6ZToxMnB4OyB3aWR0aDoxMDAlOyInDQopDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI0Jpc2EgZGlsYWt1a2FuIGRvd25sb2FkIGhhc2lsDQpsaWJyYXJ5KERUKQ0KZGF0YXRhYmxlKA0KICBkZW1hbmRfMjAyNl9yb3VuZCwNCiAgcm93bmFtZXMgPSBGQUxTRSwNCiAgZXh0ZW5zaW9ucyA9IGMoIkJ1dHRvbnMiKSwNCiAgb3B0aW9ucyA9IGxpc3QoDQogICAgcGFnZUxlbmd0aCA9IDEwLA0KICAgIGF1dG9XaWR0aCA9IFRSVUUsDQogICAgZG9tID0gIkJmcnRpcCIsDQogICAgYnV0dG9ucyA9IGMoImNvcHkiLCAiY3N2IiwgImV4Y2VsIiwgInBkZiIsICJwcmludCIpDQogICkNCikNCmBgYA0KDQpgYGB7cn0NCndyaXRlLnhsc3goDQogIGRlbWFuZF8yMDI2X3JvdW5kLA0KICBmaWxlID0gIlByb3lla3NpX0RlbWFuZF9Ib3VzaW5nXzIwMjYueGxzeCIsDQogIHNoZWV0TmFtZSA9ICJEZW1hbmRfMjAyNiIsDQogIG92ZXJ3cml0ZSA9IFRSVUUNCikNCmBgYA0KDQojIFJlZmVyZW5jZXMNCg0KWzFdIEFuZ2VsLCBTLiAoMjAwMCkuIF9Ib3VzaW5nIFBvbGljeSBNYXR0ZXJzOiBBIEdsb2JhbCBBbmFseXNpc18uIE94Zm9yZCBVbml2ZXJzaXR5IFByZXNzLg0KDQpbMl0gQmFsbCwgTS4gKDIwMTIpLiBfSG91c2luZyBTdXBwbHkgYW5kIFBsYW5uaW5nIENvbnRyb2xzXy4gUm91dGxlZGdlLg0KDQpbM10gTWFua2l3LCBOLiBHLiwgUm9tZXIsIEQuLCAmIFdlaWwsIEQuIE4uICgxOTkyKS4gX0EgY29udHJpYnV0aW9uIHRvIHRoZSBlbXBpcmljcyBvZiBlY29ub21pYyBncm93dGhfLiBRdWFydGVybHkgSm91cm5hbCBvZiBFY29ub21pY3MsIDEwNygyKSwgNDA34oCTNDM3Lg0KDQpbNF0gTWVlbiwgRy4gKDIwMTEpLiBfTW9kZWxsaW5nIGhvdXNpbmcgbWFya2V0czogVGhlb3J5LCBldmlkZW5jZSBhbmQgcG9saWN5Xy4gSm91cm5hbCBvZiBIb3VzaW5nIEVjb25vbWljcywgMjAoNCksIDIzNeKAkzI0Ni4NCg0KWzVdIFRpcHBsZSwgRy4gKDIwMDApLiBfRXh0ZW5kaW5nIFRoZW1zZWx2ZXM6IFVzZXItSW5pdGlhdGVkIFRyYW5zZm9ybWF0aW9ucyBvZiBHb3Zlcm5tZW50LUJ1aWx0IEhvdXNpbmcgaW4gRGV2ZWxvcGluZyBDb3VudHJpZXNfLiBMaXZlcnBvb2wgVW5pdmVyc2l0eSBQcmVzcy4NCg0KWzZdIFVOLUhhYml0YXQuICgyMDExKS4gX0FmZm9yZGFibGUgTGFuZCBhbmQgSG91c2luZyBpbiBBc2lhXy4gVW5pdGVkIE5hdGlvbnMgSHVtYW4gU2V0dGxlbWVudHMgUHJvZ3JhbW1lLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBEaXJla3RvcmF0IFN0YXRpc3RpayBLZXNlamFodGVyYWFuIFJha3lhdCwgQlBTLCBzYXB0YWhhc0BicHMuZ28uaWQNCg0KDQoNCg0K