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.

1 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)

2 Penghitungan

2.1 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

2.2 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.

2.3 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

2.4 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.

3 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
)

4 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,

LS0tDQp0aXRsZTogIkhvdXNpbmcgRGVtYW5kIFByb2plY3Rpb24gMjAyNiINCnN1YnRpdGxlOiAiUGVuZGVrYXRhbiBCYWNrbG9nLCBfUmVwbGFjZW1lbnRfLCBkYW4gX05ldyBEZW1hbmRfIg0KYXV0aG9yOiAiU2FwdGEgSGFzdGhvIFBvbmNvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQpib2R5ew0KdGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNClByb3lla3NpIGtlYnV0dWhhbiBwZXJ1bWFoYW4gKF9ob3VzaW5nIGRlbWFuZCBwcm9qZWN0aW9uXykgbWVydXBha2FuIHVwYXlhIHVudHVrIG1lbmdlc3RpbWFzaSBqdW1sYWggdW5pdCBodW5pYW4geWFuZyBkaWJ1dHVoa2FuIHBhZGEgcGVyaW9kZSBtZW5kYXRhbmcgZGVuZ2FuIG1lbXBlcnRpbWJhbmdrYW4gZGluYW1pa2EgcnVtYWggdGFuZ2dhLCBrb25kaXNpIHN0b2sgcGVydW1haGFuIGVrc2lzdGluZywgc2VydGEga2VidXR1aGFuIG5vcm1hdGlmIG1hc3lhcmFrYXQuIERhbGFtIGxpdGVyYXR1ciBwZXJ1bWFoYW4sIGhvdXNpbmcgZGVtYW5kIHRpZGFrIGhhbnlhIGRpcGFoYW1pIHNlYmFnYWkgcGVybWludGFhbiBwYXNhciAoX2VmZmVjdGl2ZSBkZW1hbmRfKSwgdGV0YXBpIGp1Z2Egc2ViYWdhaSBrZWJ1dHVoYW4gYmVyYmFzaXMga2VzZWphaHRlcmFhbiAoX25lZWQtYmFzZWQgZGVtYW5kXyksIGtodXN1c255YSBkaSBuZWdhcmEgYmVya2VtYmFuZyBkaSBtYW5hIGtldGVyYmF0YXNhbiBha3NlcyB0ZXJoYWRhcCBodW5pYW4gbGF5YWsgbWFzaWggbWVuamFkaSBpc3Ugc3RydWt0dXJhbCAoVU4tSGFiaXRhdCwgMjAxMTsgQW5nZWwsIDIwMDApLg0KDQpTZWNhcmEga29uc2VwdHVhbCwgaG91c2luZyBkZW1hbmQgYmVyc3VtYmVyIGRhcmkgdGlnYSBrb21wb25lbiB1dGFtYS4gUGVydGFtYSwgYmFja2xvZyBwZXJ1bWFoYW4geWFuZyBtZW5jZXJtaW5rYW4gYWt1bXVsYXNpIHJ1bWFoIHRhbmdnYSB5YW5nIGJlbHVtIG1lbmVtcGF0aSBydW1haCBtaWxpayBzZW5kaXJpIGF0YXUgcnVtYWggbGF5YWsgaHVuaS4gS2VkdWEsIGtlYnV0dWhhbiBwZW5nZ2FudGlhbiBodW5pYW4gYWtpYmF0IGtlYmVyYWRhYW4gcnVtYWggdGlkYWsgbGF5YWsgaHVuaSAoX3JlcGxhY2VtZW50IGRlbWFuZF8pLCB5YW5nIGRpcGFuZGFuZyBzZWJhZ2FpIGJhZ2lhbiBkYXJpIHVwYXlhIG1lbmphZ2Ega2ViZXJsYW5qdXRhbiBrdWFsaXRhcyBzdG9rIHBlcnVtYWhhbiAoVGlwcGxlLCAyMDAwKS4gS2V0aWdhLCBwZW1iZW50dWthbiBydW1haCB0YW5nZ2EgYmFydSBzZWJhZ2FpIGFraWJhdCBkYXJpIHBlcnR1bWJ1aGFuIHBlbmR1ZHVrIGRhbiBwZXJ1YmFoYW4gc3RydWt0dXIgZGVtb2dyYWZpLCB5YW5nIHNlY2FyYSBub3JtYXRpZiBkaWFzdW1zaWthbiBtZW1lcmx1a2FuIHRhbWJhaGFuIHVuaXQgaHVuaWFuIChNYW5raXcsIFJvbWVyLCAmIFdlaWwsIDE5OTIpLg0KDQpEYWxhbSBwZXJlbmNhbmFhbiBkYW4gc3RhdGlzdGlrLCBraHVzdXNueWEgdW50dWsgcHJveWVrc2kgamFuZ2thIHBlbmRlaywgX2hvdXNpbmcgZGVtYW5kXyB1bXVtbnlhIGRpZXN0aW1hc2kgbWVuZ2d1bmFrYW4gcGVuZGVrYXRhbiBfaG91c2luZyBmbG93IG1vZGVsXywgeWFpdHUgZGVuZ2FuIG1lbXByb3lla3Npa2FuIHBlcnR1bWJ1aGFuIGp1bWxhaCBydW1haCB0YW5nZ2Egc2ViYWdhaSBuZXcgZGVtYW5kLCBrZW11ZGlhbiBtZW5hbWJhaGthbiBiYWNrbG9nIGRhbiBrZWJ1dHVoYW4gcGVuZ2dhbnRpYW4gc3RvayBwZXJ1bWFoYW4geWFuZyBhZGEgKE1lZW4sIDIwMTE7IEJhbGwsIDIwMTIpLiBQZW5kZWthdGFuIGluaSBiYW55YWsgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGtlYmlqYWthbiBwdWJsaWsga2FyZW5hIHJlbGF0aWYgc2VkZXJoYW5hLCB0cmFuc3BhcmFuLCBkYW4gZGFwYXQgZGlvcGVyYXNpb25hbGthbiBtZW5nZ3VuYWthbiBkYXRhIHN1cnZlaSBydW1haCB0YW5nZ2Egc2VwZXJ0aSBTdXNlbmFzLg0KDQpNZXNraXB1biBkZW1pa2lhbiwgcHJveWVrc2kgX2hvdXNpbmcgZGVtYW5kXyBtZW1pbGlraSBrZXRlcmJhdGFzYW4sIHRlcnV0YW1hIHRlcmthaXQgYXN1bXNpIHN0YWJpbGl0YXMgcGVtYmVudHVrYW4gcnVtYWggdGFuZ2dhIGRhbiB0aWRhayBkaW1hc3Vra2FubnlhIGZha3RvciBtaWdyYXNpLCBwcmVmZXJlbnNpIGxva2FzaSwgc2VydGEgaW50ZXJ2ZW5zaSBrZWJpamFrYW4gYmVyc2thbGEgYmVzYXIuIE9sZWgga2FyZW5hIGl0dSwgaGFzaWwgcHJveWVrc2kgc2ViYWlrbnlhIGRpcG9zaXNpa2FuIHNlYmFnYWkgZXN0aW1hc2kgaW5kaWthdGlmIHVudHVrIG1lbmR1a3VuZyBwZXJlbmNhbmFhbiBkYW4gcGVuYWphbWFuIHByaW9yaXRhcyB3aWxheWFoLCBzZXJ0YSBzZWJhZ2FpIGRhc2FyIHBlbWFudGF1YW4gcGVuY2FwYWlhbiBUdWp1YW4gUGVtYmFuZ3VuYW4gQmVya2VsYW5qdXRhbiwga2h1c3VzbnlhIFNER3MgMTEuMSBtZW5nZW5haSBha3NlcyB0ZXJoYWRhcCBodW5pYW4gbGF5YWsgZGFuIHRlcmphbmdrYXUuDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShvcGVueGxzeCkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KZGF0YSA8LSByZWFkX2V4Y2VsKA0KICAic3VzZW5hc19ob3VzaW5nXzIwMjRfMjAyNS54bHN4IiwNCiAgc2tpcCA9IDENCikNCmBgYA0KDQojIFBlbnlpYXBhbiBEYXRhDQoNCkRhdGEgYmVyc3VtYmVyIGRhcmkgU3VzZW5hcyB0YWh1biAyMDI0IGRhbiAyMDI1IHlhbmcgZGlhZ3JlZ2FzaSBwYWRhIGxldmVsIHByb3ZpbnNpLg0KDQpUYWhhcCBhd2FsIGRpbGFrdWthbjoNCg0KLSBQZW55YW1hYW4gdGlwZSBkYXRhLg0KDQotIEtvbnNpc3RlbnNpIHN0cnVrdHVyIGFudGFyIHRhaHVuDQoNCi0gVmFsaWRhc2kgdmFyaWFiZWwga3VuY2kgKGp1bWxhaCBydW1haCB0YW5nZ2EsIGJhY2tsb2csIFJUTEgpDQoNCkxhbmdrYWggaW5pIHBlbnRpbmcgdW50dWsgbWVtYXN0aWthbiBoYXNpbCBwcm95ZWtzaSBiZXJzaWZhdCAqKmNvbXBhcmFibGUgYW50YXIgd2FrdHUgKGludGVyLXRlbXBvcmFsIGNvbnNpc3RlbmN5KSoqLg0KDQoNCmBgYHtyfQ0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoDQogICAgdGFodW4gICAgICAgID0gYXMuaW50ZWdlcih0YWh1biksDQogICAganVtbGFoX3J0ICAgID0gYXMubnVtZXJpYyhqdW1sYWhfcnQpLA0KICAgIGJhY2tsb2cgICAgICA9IGFzLm51bWVyaWMoYmFja2xvZyksDQogICAgcnRsaF90b3RhbCAgID0gYXMubnVtZXJpYyhydGxoX3RvdGFsKSwNCiAgICBydGxoX21pbGlrICAgPSBhcy5udW1lcmljKHJ0bGhfbWlsaWspDQogICkNCmBgYA0KDQoqKlBlbWlzYWhhbiBEYXRhIHBlciBUYWh1bioqDQoNCkRhdGEgZGlwaXNhaGthbiBiZXJkYXNhcmthbiB0YWh1biBvYnNlcnZhc2kgdW50dWsgbWVuZ2hpdHVuZyBsYWp1IHBlcnR1bWJ1aGFuIHJ1bWFoIHRhbmdnYS4NCg0KLSBUYWh1biAyMDI0IGRpZ3VuYWthbiBzZWJhZ2FpICoqYmFzZWxpbmUqKg0KLSBUYWh1biAyMDI1IHNlYmFnYWkgKip0YWh1biB0ZXJha2hpciBvYnNlcnZhc2kqKg0KDQoNCmBgYHtyfQ0KZGF0YV8yMDI0IDwtIGRhdGEgJT4lIGZpbHRlcih0YWh1biA9PSAyMDI0KQ0KZGF0YV8yMDI1IDwtIGRhdGEgJT4lIGZpbHRlcih0YWh1biA9PSAyMDI1KQ0KYGBgDQoNCiMgUGVuZ2hpdHVuZ2FuIA0KDQojIyBHcm93dGgNCg0KUGVuZGVrYXRhbiBfWWVhci1vbi1ZZWFyIEdyb3d0aCBSYXRlXyBkaWd1bmFrYW4gZGVuZ2FuIGFzdW1zaSBiYWh3YSBkaW5hbWlrYSBwZW1iZW50dWthbiBydW1haCB0YW5nZ2EgYW50YXIgdGFodW4gYmVyc2lmYXQgcmVsYXRpZiBzdGFiaWwgZGFsYW0gamFuZ2thIHBlbmRlay4gTGFqdSBwZXJ0dW1idWhhbiBydW1haCB0YW5nZ2EgeWFuZyBkaWhpdHVuZyBkYXJpIHBlcnViYWhhbiBqdW1sYWggcnVtYWggdGFuZ2dhIGFudGFyYSB0YWh1biAyMDI0IGRhbiAyMDI1IGRpYXN1bXNpa2FuIG1hbXB1IG1lcmVwcmVzZW50YXNpa2FuIGtlY2VuZGVydW5nYW4gcGVydHVtYnVoYW4gcGFkYSBwZXJpb2RlIHByb3lla3NpIDIwMjYuIFN0YWJpbGl0YXMgaW5pIG1lbmNha3VwIHBvbGEgZGVtb2dyYWZpcyBkYXNhciBzZXBlcnRpIHBlcnR1bWJ1aGFuIHBlbmR1ZHVrLCBzdHJ1a3R1ciB1bXVyLCBzZXJ0YSBrZWNlbmRlcnVuZ2FuIHBlbWJlbnR1a2FuIHJ1bWFoIHRhbmdnYSBiYXJ1IHlhbmcgdGlkYWsgbWVuZ2FsYW1pIHBlcnViYWhhbiBla3N0cmVtIGRhbGFtIHNhdHUgdGFodW4gb2JzZXJ2YXNpLg0KDQpTZWxhaW4gaXR1LCBwcm95ZWtzaSBpbmkgbWVuZ2FzdW1zaWthbiB0aWRhayB0ZXJqYWRpbnlhIF9kZW1vZ3JhcGhpYyBzaG9ja18geWFuZyBzaWduaWZpa2FuIHBhZGEgcGVyaW9kZSAyMDI14oCTMjAyNiwgc2VwZXJ0aSBsb25qYWthbiBtaWdyYXNpIGFudGFyIHdpbGF5YWgsIGJlbmNhbmEgYmVzYXIsIGtyaXNpcyBla29ub21pLCBhdGF1IGtlYmlqYWthbiBiZXJza2FsYSBtYXNpZiB5YW5nIGRhcGF0IG1lbmd1YmFoIHBlcmlsYWt1IHJ1bWFoIHRhbmdnYSBzZWNhcmEgZHJhc3Rpcy4gRGVuZ2FuIGFzdW1zaSB0ZXJzZWJ1dCwgbGFqdSBwZXJ0dW1idWhhbiBoaXN0b3JpcyBydW1haCB0YW5nZ2EgZGFwYXQgZGlndW5ha2FuIHNlYmFnYWkgcGVuZGVrYXRhbiB5YW5nIHdhamFyIGRhbiBrb25zZXJ2YXRpZiB1bnR1ayBwcm95ZWtzaSBqYW5na2EgcGVuZGVrLCBzZWhpbmdnYSBoYXNpbCBlc3RpbWFzaSBkZW1hbmQgcGVydW1haGFuIHRhaHVuIDIwMjYgYmVyc2lmYXQgaW5kaWthdGlmIGRhbiByZWxldmFuIHVudHVrIGtlcGVybHVhbiBwZXJlbmNhbmFhbiBzZXJ0YSBwZW5hamFtYW4ga2ViaWpha2FuIHBlcnVtYWhhbi4NCg0KUGVydHVtYnVoYW4ganVtbGFoIHJ1bWFoIHRhbmdnYSBkaWhpdHVuZyBzZWJhZ2FpIGJlcmlrdXQ6DQoNClxbDQpnX2kgPSBcZnJhY3tSVF97aSwyMDI1fSAtIFJUX3tpLDIwMjR9fXtSVF97aSwyMDI0fX0NClxdDQoNCmRlbmdhbjoNCg0KLSBcKCBnX2kgXCkgPSBsYWp1IHBlcnR1bWJ1aGFuIHJ1bWFoIHRhbmdnYSBwcm92aW5zaSBcKCBpIFwpDQoNCi0gXCggUlRfe2ksMjAyNH0gXCkgPSBqdW1sYWggcnVtYWggdGFuZ2dhIHRhaHVuIDIwMjQNCg0KLSBcKCBSVF97aSwyMDI1fSBcKSA9IGp1bWxhaCBydW1haCB0YW5nZ2EgdGFodW4gMjAyNQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmdyb3d0aF9ydCA8LSBkYXRhXzIwMjQgJT4lDQogIHNlbGVjdChwcm92aW5zaSwgcnRfMjAyNCA9IGp1bWxhaF9ydCkgJT4lDQogIGxlZnRfam9pbigNCiAgICBkYXRhXzIwMjUgJT4lIA0KICAgICAgc2VsZWN0KHByb3ZpbnNpLCBydF8yMDI1ID0ganVtbGFoX3J0KSwNCiAgICBieSA9ICJwcm92aW5zaSINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGdyb3d0aF9ydCA9IChydF8yMDI1IC0gcnRfMjAyNCkgLyBydF8yMDI0DQogICkNCmBgYA0KDQojIyBQcm95ZWtzaQ0KDQpKdW1sYWggcnVtYWggdGFuZ2dhIHRhaHVuIDIwMjYgZGlwcm95ZWtzaWthbiBtZW5nZ3VuYWthbiBtZXRvZGUgKipleHRyYXBvbGF0aXZlIGdyb3d0aCoqOg0KDQpcWw0KUlRfe2ksMjAyNn0gPSBSVF97aSwyMDI1fSBcdGltZXMgKDEgKyBnX2kpDQpcXQ0KDQpTZWxhbmp1dG55YSwganVtbGFoICoqcnVtYWggdGFuZ2dhIGJhcnUqKiBkaWhpdHVuZyBzZWJhZ2FpOg0KDQpcWw0KUlRee2JhcnV9X3tpLDIwMjZ9ID0gUlRfe2ksMjAyNn0gLSBSVF97aSwyMDI1fQ0KXF0NCg0KS29tcG9uZW4gaW5pIG1lcmVwcmVzZW50YXNpa2FuICoqZGVtYW5kIGFsYW1pKiogYWtpYmF0IHBlbWJlbnR1a2FuIHJ1bWFoIHRhbmdnYSBiYXJ1Lg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnByb3lla3NpX3J0IDwtIGRhdGFfMjAyNSAlPiUNCiAgc2VsZWN0KHByb3ZpbnNpLCBydF8yMDI1ID0ganVtbGFoX3J0KSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGdyb3d0aF9ydCAlPiUgDQogICAgICBzZWxlY3QocHJvdmluc2ksIGdyb3d0aF9ydCksDQogICAgYnkgPSAicHJvdmluc2kiDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBydF8yMDI2ICAgICAgPSBydF8yMDI1ICogKDEgKyBncm93dGhfcnQpLA0KICAgIHJ0X2JhcnVfMjAyNiA9IHJ0XzIwMjYgLSBydF8yMDI1DQogICkNCmBgYA0KDQojIyBEZW1hbmQgSG91c2luZyAyMDI2DQoNCkRhbGFtIHByb3lla3NpIGtlYnV0dWhhbiBwZXJ1bWFoYW4sIGJhY2tsb2cgZGlwYWhhbWkgc2ViYWdhaSAqKnVubWV0IGRlbWFuZCBoaXN0b3JpcyoqLCB5YWl0dSBha3VtdWxhc2kgcnVtYWggdGFuZ2dhIHlhbmcgaGluZ2dhIHBlcmlvZGUgb2JzZXJ2YXNpIGJlbHVtIG1hbXB1IG1lbmdha3NlcyBydW1haCBsYXlhayBhdGF1IHJ1bWFoIG1pbGlrIHNlbmRpcmkuIEJhY2tsb2cgbWVuY2VybWlua2FuIGtlc2VuamFuZ2FuIHN0cnVrdHVyYWwgYW50YXJhIGtlYnV0dWhhbiBkYW4ga2V0ZXJzZWRpYWFuIGh1bmlhbiB5YW5nIHRpZGFrIG90b21hdGlzIHRlcmF0YXNpIHRhbnBhIGludGVydmVuc2kga2ViaWpha2FuLiBTZW1lbnRhcmEgaXR1LCBydW1haCB0aWRhayBsYXlhayBodW5pIChSVExIKSBtaWxpayBzZW5kaXJpIG1lcmVwcmVzZW50YXNpa2FuICoqcmVwbGFjZW1lbnQgZGVtYW5kKiosIHlha25pIGtlYnV0dWhhbiB1bnR1ayBtZW5nZ2FudGlrYW4gYXRhdSBtZW1wZXJiYWlraSB1bml0IGh1bmlhbiB5YW5nIHNlY2FyYSBmaXNpayB0aWRhayBtZW1lbnVoaSBzdGFuZGFyIGtlbGF5YWthbiwgc2VoaW5nZ2EgcGVuaW5na2F0YW4ga3VhbGl0YXMgc3RvayBwZXJ1bWFoYW4gbWVuamFkaSBiYWdpYW4gaW50ZWdyYWwgZGFyaSBwZW1lbnVoYW4gZGVtYW5kLiBBZGFwdW4gcGVtYmVudHVrYW4gcnVtYWggdGFuZ2dhIGJhcnUgbWVuY2VybWlua2FuICoqbmV3IGRlbWFuZCoqLCB5YWl0dSBrZWJ1dHVoYW4gdGFtYmFoYW4gYWthbiB1bml0IGh1bmlhbiB5YW5nIG11bmN1bCBha2liYXQgcGVydHVtYnVoYW4ganVtbGFoIHJ1bWFoIHRhbmdnYSBzZWlyaW5nIGRpbmFtaWthIGRlbW9ncmFmaSBkYW4gc29zaWFsIGVrb25vbWkuIEtldGlnYSBrb21wb25lbiBpbmkgc2VjYXJhIGJlcnNhbWEtc2FtYSBtZW5nZ2FtYmFya2FuIHRvdGFsIGtlYnV0dWhhbiBwZXJ1bWFoYW4geWFuZyBiZXJzaWZhdCBrdW11bGF0aWYsIG1lbmNha3VwIGRpbWVuc2kga3VhbnRpdGFzIG1hdXB1biBrdWFsaXRhcyBodW5pYW4uDQoNClRvdGFsIGRlbWFuZCBwZXJ1bWFoYW4gdGFodW4gMjAyNiBkaWhpdHVuZyBkZW5nYW4gbWVuanVtbGFoa2FuIHRpZ2Ega29tcG9uZW4gdXRhbWE6DQoNClxbDQpESF97aSwyMDI2fSA9DQpCYWNrbG9nX3tpLDIwMjV9DQorDQpSVExIXnttaWxpa31fe2ksMjAyNX0NCisNClJUXntiYXJ1fV97aSwyMDI2fQ0KXF0NCg0KZGVuZ2FuOg0KDQotIFwoIERIX3tpLDIwMjZ9IFwpID0gZGVtYW5kIHBlcnVtYWhhbiBwcm92aW5zaSBcKCBpIFwpDQoNCi0gXCggQmFja2xvZ197aSwyMDI1fSBcKSA9IGJhY2tsb2cga2VwZW1pbGlrYW4gdGFodW4gMjAyNQ0KDQotIFwoIFJUTEhee21pbGlrfV97aSwyMDI1fSBcKSA9IHJ1bWFoIHRpZGFrIGxheWFrIGh1bmkgbWlsaWsgc2VuZGlyaQ0KDQotIFwoIFJUXntiYXJ1fV97aSwyMDI2fSBcKSA9IHBlbWJlbnR1a2FuIHJ1bWFoIHRhbmdnYSBiYXJ1DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZGVtYW5kXzIwMjYgPC0gZGF0YV8yMDI1ICU+JQ0KICBzZWxlY3QoDQogICAgcHJvdmluc2ksDQogICAgYmFja2xvZ18yMDI1ICAgID0gYmFja2xvZywNCiAgICBydGxoX21pbGlrXzIwMjUgPSBydGxoX21pbGlrDQogICkgJT4lDQogIGxlZnRfam9pbigNCiAgICBwcm95ZWtzaV9ydCAlPiUgDQogICAgICBzZWxlY3QocHJvdmluc2ksIHJ0X2JhcnVfMjAyNiksDQogICAgYnkgPSAicHJvdmluc2kiDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBkZW1hbmRfaG91c2luZ18yMDI2ID0NCiAgICAgIGJhY2tsb2dfMjAyNSArDQogICAgICBydGxoX21pbGlrXzIwMjUgKw0KICAgICAgcnRfYmFydV8yMDI2DQogICkNCg0KYGBgDQoNCiMjIFNoYXJlIERlbWFuZA0KDQpVa3VyYW4gcGFuZ3NhIGRlbWFuZCAoX3NoYXJlIGRlbWFuZF8pIGRpZ3VuYWthbiB1bnR1ayBtZWxpaGF0IGJhZ2FpbWFuYSB0b3RhbCBrZWJ1dHVoYW4gcGVydW1haGFuIG5hc2lvbmFsIHRhaHVuIDIwMjYgdGVyc2ViYXIgYW50YXIgd2lsYXlhaC4gVW50dWsgbWVsaWhhdCBkaXN0cmlidXNpIGRlbWFuZCBhbnRhciB3aWxheWFoLCBkaWhpdHVuZyBwYW5nc2EgZGVtYW5kIHNlYmFnYWkgYmVyaWt1dDoNCg0KXFsNClNoYXJlX2kgPSBcZnJhY3tESF97aSwyMDI2fX17XHN1bV9pIERIX3tpLDIwMjZ9fQ0KXF0NCg0KUnVtdXMgaW5pIG1lbm9ybWFsa2FuIG5pbGFpIGRlbWFuZCBhYnNvbHV0IG1lbmphZGkgdWt1cmFuIHJlbGF0aWYsIHNlaGluZ2dhIHNldGlhcCB3aWxheWFoIGRhcGF0IGRpYmFuZGluZ2thbiBzZWNhcmEgcHJvcG9yc2lvbmFsIG1lc2tpcHVuIG1lbWlsaWtpIHNrYWxhIGtlYnV0dWhhbiB5YW5nIGJlcmJlZGEtYmVkYS4NCg0KTmlsYWkgU2hhcmUga2UtaSBtZW51bmp1a2thbiBrb250cmlidXNpIHJlbGF0aWYgc3VhdHUgd2lsYXlhaCB0ZXJoYWRhcCB0b3RhbCBkZW1hbmQgbmFzaW9uYWwuIFNlbWFraW4gYmVzYXIgbmlsYWkgc2hhcmUsIHNlbWFraW4gYmVzYXIgcGVyYW4gd2lsYXlhaCB0ZXJzZWJ1dCBkYWxhbSBtZW1iZW50dWsga2VidXR1aGFuIHBlcnVtYWhhbiBuYXNpb25hbC4gTWlzYWxueWEsIHNoYXJlIHNlYmVzYXIgMCwwOCBiZXJhcnRpIHNla2l0YXIgOCBwZXJzZW4gZGFyaSB0b3RhbCBrZWJ1dHVoYW4gcGVydW1haGFuIG5hc2lvbmFsIHRhaHVuIDIwMjYgYmVyYXNhbCBkYXJpIHdpbGF5YWggdGVyc2VidXQuIERlbmdhbiBkZW1pa2lhbiwgaW5kaWthdG9yIGluaSB0aWRhayBoYW55YSBtZW5jZXJtaW5rYW4gYmVzYXJueWEga2VidXR1aGFuIGxva2FsLCB0ZXRhcGkganVnYSBwb3Npc2kgc3RyYXRlZ2lzIHdpbGF5YWggdGVyc2VidXQgZGFsYW0ga29udGVrcyBuYXNpb25hbC4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQpkZW1hbmRfMjAyNiA8LSBkZW1hbmRfMjAyNiAlPiUNCiAgbXV0YXRlKA0KICAgIHNoYXJlX2RlbWFuZCA9DQogICAgICBkZW1hbmRfaG91c2luZ18yMDI2IC8NCiAgICAgIHN1bShkZW1hbmRfaG91c2luZ18yMDI2LCBuYS5ybSA9IFRSVUUpDQogICkgJT4lDQphcnJhbmdlKGRlc2MoZGVtYW5kX2hvdXNpbmdfMjAyNikpDQoNCg0KdXJ1dGFuX3Byb3YgPC0gZGF0YV8yMDI1ICU+JQ0KICBkaXN0aW5jdChwcm92aW5zaSkgJT4lDQogIG11dGF0ZShvcmRlcl9hc2xpID0gcm93X251bWJlcigpKQ0KDQpkZW1hbmRfMjAyNiA8LSBkZW1hbmRfMjAyNiAlPiUNCiAgbGVmdF9qb2luKHVydXRhbl9wcm92LCBieSA9ICJwcm92aW5zaSIpICU+JQ0KICBhcnJhbmdlKG9yZGVyX2FzbGkpICU+JQ0KICBzZWxlY3QoLW9yZGVyX2FzbGkpDQpgYGANCg0KIyBPdXRwdXQNCg0KYGBge3J9DQpkZW1hbmRfMjAyNl9yb3VuZCA8LSBkZW1hbmRfMjAyNiAlPiUNCiAgbXV0YXRlKA0KICAgIGJhY2tsb2dfMjAyNSAgICAgICAgICA9IHJvdW5kKGJhY2tsb2dfMjAyNSwgMCksDQogICAgcnRsaF9taWxpa18yMDI1ICAgICAgID0gcm91bmQocnRsaF9taWxpa18yMDI1LCAwKSwNCiAgICBydF9iYXJ1XzIwMjYgICAgICAgICAgPSByb3VuZChydF9iYXJ1XzIwMjYsIDApLA0KICAgIGRlbWFuZF9ob3VzaW5nXzIwMjYgICA9IHJvdW5kKGRlbWFuZF9ob3VzaW5nXzIwMjYsIDApLA0KICAgIHNoYXJlX2RlbWFuZCAgICAgICAgICA9IHJvdW5kKHNoYXJlX2RlbWFuZCwgNCkNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0Kb3V0cHV0ID0gZGVtYW5kXzIwMjZfcm91bmQgWyxjKDEsNTo2KV0NCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjprYWJsZSgNCiAgb3V0cHV0LA0KICBmb3JtYXQgPSAiaHRtbCIsDQogIHRhYmxlLmF0dHIgPSAnc3R5bGU9ImZvbnQtc2l6ZToxMnB4OyB3aWR0aDoxMDAlOyInDQopDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI0Jpc2EgZGlsYWt1a2FuIGRvd25sb2FkIGhhc2lsDQpsaWJyYXJ5KERUKQ0KZGF0YXRhYmxlKA0KICBkZW1hbmRfMjAyNl9yb3VuZCwNCiAgcm93bmFtZXMgPSBGQUxTRSwNCiAgZXh0ZW5zaW9ucyA9IGMoIkJ1dHRvbnMiKSwNCiAgb3B0aW9ucyA9IGxpc3QoDQogICAgcGFnZUxlbmd0aCA9IDEwLA0KICAgIGF1dG9XaWR0aCA9IFRSVUUsDQogICAgZG9tID0gIkJmcnRpcCIsDQogICAgYnV0dG9ucyA9IGMoImNvcHkiLCAiY3N2IiwgImV4Y2VsIiwgInBkZiIsICJwcmludCIpDQogICkNCikNCmBgYA0KDQpgYGB7cn0NCndyaXRlLnhsc3goDQogIGRlbWFuZF8yMDI2X3JvdW5kLA0KICBmaWxlID0gIlByb3lla3NpX0RlbWFuZF9Ib3VzaW5nXzIwMjYueGxzeCIsDQogIHNoZWV0TmFtZSA9ICJEZW1hbmRfMjAyNiIsDQogIG92ZXJ3cml0ZSA9IFRSVUUNCikNCmBgYA0KDQojIFJlZmVyZW5jZXMNCg0KWzFdIEFuZ2VsLCBTLiAoMjAwMCkuIF9Ib3VzaW5nIFBvbGljeSBNYXR0ZXJzOiBBIEdsb2JhbCBBbmFseXNpc18uIE94Zm9yZCBVbml2ZXJzaXR5IFByZXNzLg0KDQpbMl0gQmFsbCwgTS4gKDIwMTIpLiBfSG91c2luZyBTdXBwbHkgYW5kIFBsYW5uaW5nIENvbnRyb2xzXy4gUm91dGxlZGdlLg0KDQpbM10gTWFua2l3LCBOLiBHLiwgUm9tZXIsIEQuLCAmIFdlaWwsIEQuIE4uICgxOTkyKS4gX0EgY29udHJpYnV0aW9uIHRvIHRoZSBlbXBpcmljcyBvZiBlY29ub21pYyBncm93dGhfLiBRdWFydGVybHkgSm91cm5hbCBvZiBFY29ub21pY3MsIDEwNygyKSwgNDA34oCTNDM3Lg0KDQpbNF0gTWVlbiwgRy4gKDIwMTEpLiBfTW9kZWxsaW5nIGhvdXNpbmcgbWFya2V0czogVGhlb3J5LCBldmlkZW5jZSBhbmQgcG9saWN5Xy4gSm91cm5hbCBvZiBIb3VzaW5nIEVjb25vbWljcywgMjAoNCksIDIzNeKAkzI0Ni4NCg0KWzVdIFRpcHBsZSwgRy4gKDIwMDApLiBfRXh0ZW5kaW5nIFRoZW1zZWx2ZXM6IFVzZXItSW5pdGlhdGVkIFRyYW5zZm9ybWF0aW9ucyBvZiBHb3Zlcm5tZW50LUJ1aWx0IEhvdXNpbmcgaW4gRGV2ZWxvcGluZyBDb3VudHJpZXNfLiBMaXZlcnBvb2wgVW5pdmVyc2l0eSBQcmVzcy4NCg0KWzZdIFVOLUhhYml0YXQuICgyMDExKS4gX0FmZm9yZGFibGUgTGFuZCBhbmQgSG91c2luZyBpbiBBc2lhXy4gVW5pdGVkIE5hdGlvbnMgSHVtYW4gU2V0dGxlbWVudHMgUHJvZ3JhbW1lLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBEaXJla3RvcmF0IFN0YXRpc3RpayBLZXNlamFodGVyYWFuIFJha3lhdCwgQlBTLCBzYXB0YWhhc0BicHMuZ28uaWQNCg0KDQoNCg0K