Skip to content
KernelIndex
Search⌘K

submission 9306

KernelBot user 3 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.

fp8_gemm.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-9306?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz

Benchmark evidence

18 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 512]
AMD Instinct MI300X
40.4µs
#27 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
40.8µs
#29 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
59.6µs
#37 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
113.7µs
#44 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
119.9µs
#43 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
134.9µs
#48 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
148.5µs
#49 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
167.8µs
#66 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
172.1µs
#67 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
176.3µs
#57 of 98
2025-04-26
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
182.3µs
#38 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
188.4µs
#36 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
201.0µs
#48 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
220.5µs
#41 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
425.5µs
#52 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
546.8µs
#59 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
612.6µs
#56 of 98
2025-04-26
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.22ms
#54 of 98
2025-04-26

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:04c6b704cb27eed20abe9798e28d4991c08c6d727a921e9615e7aa16b7836940
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

fp8_gemm.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgoKI2RlZmluZSBISVBfQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBpZihlcnJvciAhPSBoaXBTdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKICAgICAgICAgICAgICAgICAgICAgIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKICAgICAgICAgICAgICAgICAgICAgIDw8ICc6JyA8PCBfX0xJTkVfXyA8PCAnQG4nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgZXhpdChlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHdoaWxlKGZhbHNlKQoKdXNpbmcgZnA4ID0gX19oaXBfZnA4X2U0bTNfZm51ejsKdXNpbmcgYmYxNiA9IF9faGlwX2JmbG9hdDE2Owp1c2luZyBmcDMyID0gZmxvYXQ7CnVzaW5nIGZwMzJ4NCA9IGZwMzIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7CnVzaW5nIGZwMzJ4MTYgPSBmcDMyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKCnN0cnVjdCBjdWJlIHsKICAgIGludCBtLCBuLCBrOwp9OwoKY29uc3RleHByIGludCB3YXJwX3NpemUgPSA2NDsKY29uc3RleHByIGludCBjYWNoZV9saW5lX3NpemUgPSAxMjg7Cgpjb25zdGV4cHIgaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IG5fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IGtfYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDEyODsKCnVzaW5nIHJlZ2lzdGVyX3R5cGUgPSB1aW50MzJfdDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgpfX2hvc3RfXyBfX2RldmljZV9fCmNvbnN0ZXhwciBhdXRvIGNlaWxfZGl2KFQgYSwgVSBiKSB7CiAgICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9Cgp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXwpjb25zdGV4cHIgYXV0byBkaXZpZGVfZXhhY3QoKSB7CiAgICBzdGF0aWNfYXNzZXJ0KGEgJSBiID09IDAsICJkb2VzIG5vdCBkaXZpZGUgZXhhY3QhIik7CiAgICByZXR1cm4gYSAvIGI7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYyA9IDEsIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsKEYgZikgewogICAgaWYgY29uc3RleHByIChJIDwgTikgewogICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxJPigpOwogICAgICAgIHVucm9sbDxJICsgaW5jLCBOLCBpbmM+KGYpOwogICAgfQp9Cgp0ZW1wbGF0ZTxpbnQgSSwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwxZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihmKTsKfQoKdGVtcGxhdGU8aW50IEksIGludCBKLCB0eXBlbmFtZSBGPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDJkKEYgZikgewogICAgdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewogICAgICAgIHVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKICAgICAgICAgICAgZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGo+KCk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGU8aW50IEksIGludCBKLCBpbnQgSywgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwzZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihbJl08aW50IGk+IHsKICAgICAgICB1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIHVucm9sbDwwLCBLPihbJl08aW50IGs+IHsKICAgICAgICAgICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqLCBrPigpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0pOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18Kdm9pZCBjbGVhcihUICgmYXJyYXkpW05dKSB7CiAgICB1bnJvbGw8MCwgTj4oWyZdPGludCBpPiB7CiAgICAgICAgYXJyYXlbaV0gPSBUezB9OwogICAgfSk7Cn0KCl9fZGV2aWNlX18KYmYxNiBiZjE2X2Zyb21fZnAzMihmbG9hdCB4KSB7CiAgICAvLyBISVAncyBjb252ZXJzaW9uIGZ1bmN0aW9uIGRvZXMgYWxsIGtpbmRzIG9mIGNoZWNrcwogICAgLy8gZm9yIG9kZCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQuCiAgICAvLyBUaGlzIGdlbmVyYXRlcyBhYnNvbHV0ZWx5IGFieXNtYWwgY29kZSwgc28ganVzdCB0cnVuY2F0ZQogICAgLy8gdGhlIHVwcGVyIGJpdHMgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZSBsaWtlIHRoZQogICAgLy8gT3BwZXJweXRob24gaW50ZW5kZWQuCgogICAgcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8YmYxNj4oCiAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQzMl90Pih4KSA+PiAxNgogICAgICAgICkKICAgICk7Cn0KCl9fZGV2aWNlX18KZnAzMiBmcDMyX2Zyb21fZnA4KGZwOCB4KSB7CiAgICAvLyBISVAncyBjb252ZXJzaW9uIGZyb20gZnA4IHRvIGZwMzIgaXMgc2xvdyBvbiBhbnl0aGluZyB0aGF0CiAgICAvLyBkb2Vzbid0IGhhdmUgdGhlIGhhcmR3YXJlIGluc3RydWN0aW9ucyB0byBkbyBpdC4gVGhlIHNvZnR3YXJlCiAgICAvLyBtZXRob2QgZGVhbHMgd2l0aCBzcGVjaWFsIGNhc2VzIChOYU4sIHN1Ym5vcm1hbHMpLCBidXQgd2UKICAgIC8vIGRvbid0IGNhcmUgYWJvdXQgdGhhdCBoZXJlIHNpbmNlIHdlIGRvbid0IGV4cGVjdCB0aG9zZSBpbgogICAgLy8gdGhlIGlucHV0LiBUaGVyZWZvcmUsIHdlIGNhbiBvcHRpbWl6ZSB0aGUgc29mdHdhcmUgaW1wbGVtZW50YXRpb24KICAgIC8vIGJ5IGp1c3Qgc2h1ZmZsaW5nIHRoZSBiaXRzLgojaWZkZWYgX19nZng5NDJfXwogICAgLy8gTUkzMDAgaGFzIGFuIGluc3RydWN0aW9uIGZvciB0aGlzLgogICAgcmV0dXJuIGZsb2F0KHgpOwojZWxzZQogICAgLy8gRmFsbGJhY2sgY2FzZQogICAgLy8gVE9ETzogRmluZCBhIGZhc3RlciBvcHRpb24KICAgIHJldHVybiBmbG9hdCh4KTsKI2VuZGlmCn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpfX2RldmljZV9fIF9faG9zdF9fCnZvaWQgc2VsZWN0KGJvb2wgY29uZCwgRiBmKSB7CiAgICBpZiAoY29uZCkgewogICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTx0cnVlPigpOwogICAgfSBlbHNlIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8ZmFsc2U+KCk7CiAgICB9Cn0KCnRlbXBsYXRlPGludCBsYW5lX3N0cmlkZT4KX19kZXZpY2VfXwp1aW50MzJfdCB0cmFuc3Bvc2VfNHg0X2Y4X3YyKHVpbnQzMl90IGlucHV0KSB7CiAgICBzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlIDwgd2FycF9zaXplIC8gNCwgImxhbmUgc3RyaWRlIGlzIHRvbyBsYXJnZSIpOwogICAgc3RhdGljX2Fzc2VydCgobGFuZV9zdHJpZGUgJiAobGFuZV9zdHJpZGUgLSAxKSkgPT0gMCwgImxpbmUgc3RyaWRlIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIiKTsKICAgIC8vIGlucHV0OgogICAgLy8gYnl0ZSAwIDEgMiAzCiAgICAvLyAgICAgIDAgMSAyIDMgbGFuZSBYCiAgICAvLyAgICAgIDQgNSA2IDcgbGFuZSBYK2xhbmVfc3RyaWRlCiAgICAvLyAgICAgIDggOSBBIEIgbGFuZSBYK2xhbmVfc3RyaWRlCiAgICAvLyAgICAgIEMgRCBFIEYgbGFuZSBYK2xhbmVfc3RyaWRlCiAgICAvLyBzd2FwIHBhaXJzIG9mIGxhbmVzIHRvIGdldAogICAgLy8gMCAxIDIgMwogICAgLy8gNCA1IDYgNwogICAgLy8gQyBEIEUgRgogICAgLy8gOCA5IEEgQgogICAgLy8gdGhlbiB1c2UgYnl0ZXBlcm0gdG8gc3dhcCBwYWlycyBob3Jpem9udGFsbHkgKyBtZXJnZSB0aGUKICAgIC8vIHR3byByZXN1bHRzIHRvIGdldCAyeDIgdHJhbnNwb3NlZAogICAgLy8gMCA0IDIgNgogICAgLy8gMSA1IDMgNwogICAgLy8gOCBDIEEgRQogICAgLy8gOSBEIEIgRgogICAgY29uc3QgYXV0byBsYW5lID0gX19sYW5lX2lkKCk7CiAgICBjb25zdCBhdXRvIGdyb3VwX2xhbmVfaW5kZXggPSBsYW5lIC8gbGFuZV9zdHJpZGUgJSA0OwogICAgY29uc3QgYXV0byB0MngyID0gX19idWlsdGluX2FtZGdjbl9wZXJtKAogICAgICAgIF9fc2hmbF94b3IoaW5wdXQsIGxhbmVfc3RyaWRlKSwgLy8gU3dhcCBwYWlycwogICAgICAgIGlucHV0LAogICAgICAgIGdyb3VwX2xhbmVfaW5kZXggJSAyID09IDAKICAgICAgICAgICAgPyAweDA2JzAyJzA0JzAwCiAgICAgICAgICAgIDogMHgwMycwNycwMScwNQogICAgKTsKICAgIC8vIE5vdyBzd2FwIGdyb3VwcyBvZiAyIGhvcml6b250YWxseSwgYW5kIGRvIHRoZQogICAgLy8gc2FtZSBieXRlcGVybSBvcGVyYXRpb24gZXhjZXB0IHdpdGggZ3JvdXBzIG9mIDJ4Mi4KICAgIC8vIDAgMCAxIDEgICAgIDAgMCAyIDIKICAgIC8vIDAgMCAxIDEgLS0+IDAgMCAyIDIKICAgIC8vIDIgMiAzIDMgICAgIDEgMSAzIDMKICAgIC8vIDIgMiAzIDMgICAgIDEgMSAzIDMKICAgIGNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKICAgICAgICBfX3NoZmxfeG9yKHQyeDIsIGxhbmVfc3RyaWRlICogMiksIC8vIFN3YXAgZ3JvdXBzCiAgICAgICAgdDJ4MiwKICAgICAgICBncm91cF9sYW5lX2luZGV4IDwgMgogICAgICAgICAgICA/IDB4MDUnMDQnMDEnMDAKICAgICAgICAgICAgOiAweDAzJzAyJzA3JzA2CiAgICApOwoKICAgIC8vIGlucHV0ID0gKGxhbmUgPDwgMjQpIHwgKGxhbmUgPDwgMTYpIHwgKGxhbmUgPDwgOCkgfCBsYW5lOwogICAgcmV0dXJuIHQ0eDQ7Cn0KdGVtcGxhdGU8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGludCBibG9ja190aWxlX20sCiAgICBpbnQgYmxvY2tfdGlsZV9uLAogICAgdHlwZW5hbWUgbG9hZF90eXBlLAogICAgYm9vbCBtX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wgbl9hbGlnbmVkID0gZmFsc2UKPgpfX2RldmljZV9fCl9fZm9yY2VpbmxpbmVfXwphdXRvIGJsb2NrX3RpbGVfbG9hZF9mYXN0X2xpbmVhcigKICAgIC8vIEdsb2JhbCBtZW1vcnkgc291cmNlCiAgICBjb25zdCBmcDgqIGJsb2NrX3RpbGVfc3JjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBibG9ja19vZmZfbSwKICAgIGludCBibG9ja19vZmZfbgopIHsKICAgIGJsb2NrX3RpbGVfc3JjICs9IGJsb2NrX29mZl9uICogbSArIGJsb2NrX29mZl9tOwoKICAgIGNvbnN0IGJvb2wgY29tcGxldGVseV9pbl9ib3VuZHMgPSAobV9hbGlnbmVkICYmIG5fYWxpZ25lZCkgfHwKICAgICAgICAoYmxvY2tfb2ZmX20gKyBibG9ja190aWxlX20gPD0gbSAmJgogICAgICAgIGJsb2NrX29mZl9uICsgYmxvY2tfdGlsZV9uIDw9IG4pOwoKICAgIC8vIEEgZ2VuZXJhbCBmYXN0IGdsb2JhbCBtZW1vcnkgbmVlZHMgdG8gYmUgYXMgZm9sbG93czoKICAgIC8vIC0gR3JvdXAgb2YgMTYgYnl0ZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGEgMTI4LWJpdCBsb2FkCiAgICAvLyAtIFRoZSBmYXN0IHBhdGggcmVxdWlyZXMgZW50aXJlIGNhY2hlIGxpbmVzIHRvIGJlIGxvYWRlZCBhdCBvbmNlLiBDRE5BMwogICAgLy8gICBjYWNoZSBsaW5lIHNpemUgaXMgMTI4IGJ5dGVzLCBzbyB0aGUgaWRlYWwgbWF0cml4IHNpemUgaGFzIGFuIGlubmVyCiAgICAvLyAgIGRpbWVuc2lvbiAoYmxvY2tfdGlsZV9tOyBzb3VyY2UgaXMgY29sdW1uIG1ham9yKSBvZiBhdCBsZWFzdCAxMjguCiAgICAvLyAtIFdlIHdhbnQgZXZlcnkgdGhyZWFkIHRvIHBhcnRpY2lwYXRlLCBzbyB3ZSBuZWVkIGF0IGxlYXN0CiAgICAvLyAgIGJsb2NrX3NpemUgLyAoMTI4IC8gMTYpIGVsZW1lbnRzIGluIHRoZSBOIGRpcmVjdGlvbi4KICAgIC8vICAgYmxvY2tfc2l6ZSA9PSA2NCA9PiA4CiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMjU2ID0+IDMyCiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMTAyNCA9PiAxMjgKICAgIC8vIC0gV2UgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGFscmVhZHkgYWxpZ25lZCB0byAxMjggYml0cywgYW5kIHRoYXQgdGhlIG0gc3RyaWRlCiAgICAvLyAgIGlzIGFsc28gYWxpZ25lZCBzdWNoLiBtLCBuLCBrIGFyZSBhbGwgZGl2aXNpYmxlIGJ5IDY0LCBzbyB0aGlzIHNob3VsZCBiZSBmaW5lLgogICAgLy8KICAgIC8vICAg4pSM4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUkAogICAgLy8gICDilIIwICDilII0ICDilII4ICDilIIxMiDilIIg4pSCICAg4pSCID0gMTYgYnl0ZXMKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkIOKUlOKUgOKUgOKUgOKUmAogICAgLy8gICDilIIxICDilII1ICDilII5ICDilIIxMyDilIIKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkCiAgICAvLyAgIOKUgjIgIOKUgjYgIOKUgjEwIOKUgjE0IOKUggogICAgLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQKICAgIC8vICAg4pSCMyAg4pSCNyAg4pSCMTEg4pSCMTUg4pSCCiAgICAvLyAgIOKUlOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUmAoKICAgIC8vIHVzaW5nIGxvYWRfdHlwZSA9IHVpbnQzMl90OwoKICAgIC8vIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgY2FjaGVfbGluZV9zaXplID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGNhY2hlIGxpbmUgc2l6ZSIpOwoKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgc2l6ZW9mKGxvYWRfdHlwZSkgPT0gMCwgInRpbGUgaW5uZXIgZGltZW5zaW9uIGhhcyB0byBiZSBkaXZpc2libGUgYnkgbG9hZCB0eXBlIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgdG90YWxfbG9hZHMgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX24gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIHN0YXRpY19hc3NlcnQodG90YWxfbG9hZHMgJSBibG9ja19zaXplID09IDAsICJ0b3RhbCBhbW91bnQgb2YgbG9hZHMgbmVlZHMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBjb25zdGV4cHIgaW50IGxvYWRzX3Blcl9ibG9ja190aWxlX20gPSBibG9ja190aWxlX20gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKCiAgICBjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgogICAgc3RkOjphcnJheTxsb2FkX3R5cGUsIGxvYWRzX3Blcl90aHJlYWQ+IHJlc3VsdDsKCiAgICBzZWxlY3QoY29tcGxldGVseV9pbl9ib3VuZHMsIFsmXTxib29sIGluX2JvdW5kcz4gewogICAgICAgIHVucm9sbDwwLCBsb2Fkc19wZXJfdGhyZWFkPihbJl08aW50IGo+IHsKICAgICAgICAgICAgY29uc3QgaW50IGkgPSBqICogYmxvY2tfc2l6ZSArIHRpZDsKICAgICAgICAgICAgY29uc3QgaW50IHJvdyA9IGkgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgY29sID0gaSAvIGxvYWRzX3Blcl9ibG9ja190aWxlX207CgogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKICAgICAgICAgICAgY29uc3QgaW50IHNyY19yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGJsb2NrX29mZl9tOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX2NvbCA9IGNvbCArIGJsb2NrX29mZl9uOwoKICAgICAgICAgICAgLy8gTm90ZTogTSwgTiwgSyBpcyBndWFyYW50ZWVkIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbG9hZAogICAgICAgICAgICAvLyBzaXplLCBzbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIG91dGVyIGJvdW5kcy4KICAgICAgICAgICAgLy8gbG9hZF90eXBlIHNyY19wYWNrZWQ7CiAgICAgICAgICAgIGlmIChpbl9ib3VuZHMgfHwgKChtX2FsaWduZWQgfHwgc3JjX3JvdyA8IG0pICYmIChuX2FsaWduZWQgfHwgc3JjX2NvbCA8IG4pKSkgewogICAgICAgICAgICAgICAgcmVzdWx0W2pdID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbG9hZF90eXBlKj4oYmxvY2tfdGlsZV9zcmMgKyBzcmNfb2ZmKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc3VsdFtqXSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC8vIGNvbnN0IGludCBkc3Rfb2ZmID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBjb2wgKiBibG9ja190aWxlX207CiAgICAgICAgICAgIC8vIGF1dG8qIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJsb2NrX3RpbGVfZHN0KTsKICAgICAgICAgICAgLy8gY29uc3QgYXV0byogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJnNyY19wYWNrZWQpOwoKICAgICAgICAgICAgLy8gLy8gU3RvcmUgdHJhbnNwb3NlZAogICAgICAgICAgICAvLyB1bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSk+KFsmXTxpbnQgaz4gewogICAgICAgICAgICAvLyAgICAgY29uc3QgaW50IGRzdF9yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGs7CiAgICAgICAgICAgIC8vICAgICBjb25zdCBpbnQgZHN0X2NvbCA9IGNvbDsKICAgICAgICAgICAgLy8gICAgIGRzdFtkc3RfY29sICsgZHN0X3JvdyAqIChibG9ja190aWxlX24gKyA0KV0gPSBzcmNba107CiAgICAgICAgICAgIC8vIH0pOwoKICAgICAgICAgICAgLy8gU3RvcmUgdHJhbnNwb3NlZCB1c2luZyA0eDQgZ3JvdXBzLgogICAgICAgICAgICAvLyBjb25zdGV4cHIgaW50IGxhbmVfc3RyaWRlID0gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgLy8gdW5yb2xsPDAsIHNpemVvZihsb2FkX3R5cGUpLCBzaXplb2YodWludDMyX3QpPihbJl08aW50IGs+IHsKICAgICAgICAgICAgLy8gICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgICAgICAvLyAgICAgY29uc3QgaW50IGRzdF9jb2wgPSBjb2w7CiAgICAgICAgICAgIC8vICAgICBhdXRvIHYgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZzcmNba10pOwogICAgICAgICAgICAvLyAgICAgdiA9IHRyYW5zcG9zZV80eDRfZjhfdjI8bGFuZV9zdHJpZGU+KHYpOwogICAgICAgICAgICAvLyAgICAgY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gX19sYW5lX2lkKCkgLyBsYW5lX3N0cmlkZSAlIDQ7CiAgICAgICAgICAgIC8vICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZkc3RbKGRzdF9jb2wgLSBkc3RfY29sICUgNCkgKyAoZHN0X3JvdyArIGdyb3VwX2xhbmVfaW5kZXgpICogKGJsb2NrX3RpbGVfbiArIDQpXSkKICAgICAgICAgICAgLy8gICAgICAgICA9IHY7CiAgICAgICAgICAgIC8vIH0pOwogICAgICAgIH0pOwogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKdGVtcGxhdGU8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGludCBibG9ja190aWxlX20sCiAgICBpbnQgYmxvY2tfdGlsZV9uLAogICAgdHlwZW5hbWUgbG9hZF90eXBlCj4KX19kZXZpY2VfXwp2b2lkIHdyaXRlX3RvX3NtZW0oCiAgICBmcDgqIGJsb2NrX3RpbGVfZHN0LAogICAgY29uc3QgbG9hZF90eXBlKiB0aHJlYWRfc3JjCikgewogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBzaXplb2YobG9hZF90eXBlKSA9PSAwLCAidGlsZSBpbm5lciBkaW1lbnNpb24gaGFzIHRvIGJlIGRpdmlzaWJsZSBieSBsb2FkIHR5cGUgc2l6ZSIpOwogICAgY29uc3RleHByIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwogICAgc3RhdGljX2Fzc2VydCh0b3RhbF9sb2FkcyAlIGJsb2NrX3NpemUgPT0gMCwgInRvdGFsIGFtb3VudCBvZiBsb2FkcyBuZWVkcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGVfbSAvIHNpemVvZihsb2FkX3R5cGUpOwogICAgY29uc3RleHByIGludCBsb2Fkc19wZXJfdGhyZWFkID0gdG90YWxfbG9hZHMgLyBibG9ja19zaXplOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICB1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CiAgICAgICAgY29uc3QgaW50IGkgPSBqICogYmxvY2tfc2l6ZSArIHRpZDsKICAgICAgICBjb25zdCBpbnQgcm93ID0gaSAlIGxvYWRzX3Blcl9ibG9ja190aWxlX207CiAgICAgICAgY29uc3QgaW50IGNvbCA9IGkgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwoKICAgICAgICBhdXRvKiBkc3QgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihibG9ja190aWxlX2RzdCk7CiAgICAgICAgY29uc3QgYXV0byogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJnRocmVhZF9zcmNbal0pOwoKICAgICAgICAvLyBTdG9yZSB0cmFuc3Bvc2VkCiAgICAgICAgLy91bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSk+KFsmXTxpbnQgaz4gewogICAgICAgIC8vICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgIC8vICAgIGNvbnN0IGludCBkc3RfY29sID0gY29sOwogICAgICAgIC8vICAgIGRzdFtkc3RfY29sICsgZHN0X3JvdyAqIChibG9ja190aWxlX24gKyA0KV0gPSBzcmNba107CiAgICAgICAgLy99KTsKCiAgICAgICAgLy8gU3RvcmUgdHJhbnNwb3NlZCB1c2luZyA0eDQgZ3JvdXBzLgogICAgICAgIGNvbnN0ZXhwciBpbnQgbGFuZV9zdHJpZGUgPSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgIHVucm9sbDwwLCBzaXplb2YobG9hZF90eXBlKSwgc2l6ZW9mKHVpbnQzMl90KT4oWyZdPGludCBrPiB7CiAgICAgICAgICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgICAgICBjb25zdCBpbnQgZHN0X2NvbCA9IGNvbDsKICAgICAgICAgICAgYXV0byB2ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmc3JjW2tdKTsKICAgICAgICAgICAgdiA9IHRyYW5zcG9zZV80eDRfZjhfdjI8bGFuZV9zdHJpZGU+KHYpOwogICAgICAgICAgICBjb25zdCBhdXRvIGdyb3VwX2xhbmVfaW5kZXggPSBfX2xhbmVfaWQoKSAvIGxhbmVfc3RyaWRlICUgNDsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmZHN0Wyhkc3RfY29sIC0gZHN0X2NvbCAlIDQpICsgKGRzdF9yb3cgKyBncm91cF9sYW5lX2luZGV4KSAqIChibG9ja190aWxlX24gKyA0KV0pCiAgICAgICAgICAgICAgICA9IHY7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPGludCB3YXJwX3RpbGVfbV8sIGludCB3YXJwX3RpbGVfbl8sIHR5cGVuYW1lIFQ+CnN0cnVjdCBtZm1hX2ZyYWdtZW50IHsKICAgIHVzaW5nIHR5cGUgPSBUOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9tID0gd2FycF90aWxlX21fOwogICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGVfbl87CgogICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgdG90YWxfaXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8dG90YWxfaXRlbXMsIHdhcnBfc2l6ZT4oKTsKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHJlZ2lzdGVyc19wZXJfdGhyZWFkID0gZGl2aWRlX2V4YWN0PGl0ZW1zX3Blcl90aHJlYWQgKiBzaXplb2YoVCksIHNpemVvZihyZWdpc3Rlcl90eXBlKT4oKTsKCiAgICByZWdpc3Rlcl90eXBlIHJlZ3NbcmVnaXN0ZXJzX3Blcl90aHJlYWRdOwoKICAgIF9fZGV2aWNlX18KICAgIGNvbnN0ZXhwciBzdGF0aWMgbWZtYV9mcmFnbWVudCB6ZXJvKCkgewogICAgICAgIHJldHVybiBtZm1hX2ZyYWdtZW50e3t9fTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgewogICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIGNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4qPigmdGhpcy0+cmVncyk7CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgdm9pZCBjbGVhcigpIHsKICAgICAgICB1bnJvbGw8MCwgcmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaT4gewogICAgICAgICAgICB0aGlzLT5yZWdzW2ldID0gMDsKICAgICAgICB9KTsKICAgIH0KCiAgICBzdGF0aWMgY29uc3RleHByIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CiAgICAgICAgcmV0dXJuIHJlZyAqIHNpemVvZihyZWdpc3Rlcl90eXBlKTsKICAgIH0KfTsKCnRlbXBsYXRlIDxpbnQgbSwgaW50IG4sIGludCBrPgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND4gewogICAgdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCA0LCBmbG9hdD47CiAgICB1c2luZyBmcmdfY190eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMTYsIGZsb2F0PjsKCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZyZ19jX3R5cGUmIGMsCiAgICAgICAgY29uc3QgZnJnX2FfdHlwZSYgYSwKICAgICAgICBjb25zdCBmcmdfYl90eXBlJiBiCiAgICApIHsKICAgICAgICBjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKICAgICAgICAgICAgX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNng0ZjMyKAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmbG9hdD4oYSksCiAgICAgICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKICAgICAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMAogICAgICAgICAgICApCiAgICAgICAgKTsKICAgIH0KfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyPDMyLCAzMiwgMj4gewogICAgdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAyLCBmbG9hdD47CiAgICB1c2luZyBmcmdfY190eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMzIsIGZsb2F0PjsKCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZyZ19jX3R5cGUmIGMsCiAgICAgICAgY29uc3QgZnJnX2FfdHlwZSYgYSwKICAgICAgICBjb25zdCBmcmdfYl90eXBlJiBiCiAgICApIHsKICAgICAgICBjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKICAgICAgICAgICAgX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngyZjMyKAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmbG9hdD4oYSksCiAgICAgICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKICAgICAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMngxNj4oYyksCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKICAgIHVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAzMiwgZnA4PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAzMiwgZnA4PjsKICAgIHVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUoCiAgICAgICAgZnJnX2NfdHlwZSYgYywKICAgICAgICBjb25zdCBmcmdfYV90eXBlJiBhLAogICAgICAgIGNvbnN0IGZyZ19iX3R5cGUmIGIKICAgICkgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwogICAgYyA9IHN0ZDo6Yml0X2Nhc3Q8ZnJnX2NfdHlwZT4oCiAgICAgICAgX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICkKICAgICk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBjb3BpZWQgZnJvbSBDSywgdGhpcyB3YXkgd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICB1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+OwogICAgY29uc3QgYXV0byYgYV92YWx1ZXMgPSBhLnRocmVhZF92YWx1ZXMoKTsKICAgIGNvbnN0IGF1dG8mIGJfdmFsdWVzID0gYi50aHJlYWRfdmFsdWVzKCk7CiAgICB1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CiAgICAgICAgY29uc3QgYXV0byBmYWxsYmFja19hID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYV90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYV92YWx1ZXNba10pKTsKICAgICAgICBjb25zdCBhdXRvIGZhbGxiYWNrX2IgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19iX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihiX3ZhbHVlc1trXSkpOwogICAgICAgIGZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewogICAgdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDE2LCBmcDg+OwogICAgdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDE2LCBmcDg+OwogICAgdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmcmdfY190eXBlJiBjLAogICAgICAgIGNvbnN0IGZyZ19hX3R5cGUmIGEsCiAgICAgICAgY29uc3QgZnJnX2JfdHlwZSYgYgogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKICAgICAgICBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGEpLAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICkKICAgICk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBjb3BpZWQgZnJvbSBDSywgdGhpcyB3YXkgd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICB1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+OwogICAgY29uc3QgYXV0byYgYV92YWx1ZXMgPSBhLnRocmVhZF92YWx1ZXMoKTsKICAgIGNvbnN0IGF1dG8mIGJfdmFsdWVzID0gYi50aHJlYWRfdmFsdWVzKCk7CiAgICB1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CiAgICAgICAgY29uc3QgYXV0byBmYWxsYmFja19hID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYV90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYV92YWx1ZXNba10pKTsKICAgICAgICBjb25zdCBhdXRvIGZhbGxiYWNrX2IgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19iX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihiX3ZhbHVlc1trXSkpOwogICAgICAgIGZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKLy8gU2VlIENETkEzIG1hbnVhbCwgNy4xLjQuMS4gSW5wdXQgbGF5b3V0Ci8vIFRoZSBjYWxjdWxhdGlvbnMgaGVyZSBhcmUgb2J0YWluZWQgdmlhIHRoZQovLyBBTUQgbWF0cml4IGluc3RydWN0aW9uIGNhbGN1bGF0b3IKLy8gaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vYW1kX21hdHJpeF9pbnN0cnVjdGlvbl9jYWxjdWxhdG9yCi8vIFRoZXJlIGlzIGEgY2xlYW5lciB3YXkgdG8gY29tcHV0ZSB0aGUgbWFwcGluZywgYnV0Ci8vIHRoaXMgaXMgd2hhdCB0aGUgdG9vbCByZXR1cm5zIGFuZCBJJ20gbGF6eS4gV2Ugb25seQovLyByZWFsbHkgbmVlZCB0aGVzZSB0d28gYW55d2F5IGZvciBub3cuCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfaW5kZXhlcjxtZm1hX2YzMl9mOF9mODwxNiwgMTYsIDMyPj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG0gPSBsYW5lICUgMTY7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwogICAgICAgIHJldHVybiB7bSwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG4gPSBsYW5lICUgMTY7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwogICAgICAgIHJldHVybiB7biwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG0gPSA0ICogKGxhbmUgLyAxNikgKyBpdGVtOwogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDE2OwogICAgICAgIHJldHVybiB7bSwgbn07CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDMyLCAzMiwgMTY+PiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbSA9IGxhbmUgJSAzMjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CiAgICAgICAgcmV0dXJuIHttLCBrfTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAzMjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CiAgICAgICAgcmV0dXJuIHtuLCBrfTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYyhpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbiA9IDggKiAoaXRlbSAvIDQpICUgMzIgKyA0ICogKGxhbmUgLyAzMikgKyAoaXRlbSAlIDQpOwogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIHJldHVybiB7biwgbX07CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGN1YmUgYmxvY2tfdGlsZSwKICAgIGN1YmUgd2FycF90aWxlLAogICAgdHlwZW5hbWUgbG9hZF90eXBlLAogICAgYm9vbCBwaXBlbGluZWRfbWFpbl9sb29wID0gZmFsc2UsCiAgICBib29sIG1fYWxpZ25lZCA9IGZhbHNlLAogICAgYm9vbCBuX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wga19hbGlnbmVkID0gZmFsc2UKPgpfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKGJsb2NrX3NpemUpCnZvaWQga2VybmVsKAogICAgY29uc3QgZnA4KiBhLAogICAgY29uc3QgZnA4KiBiLAogICAgY29uc3QgZnAzMiogYXMsCiAgICBjb25zdCBmcDMyKiBicywKICAgIGJmMTYqIGMsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGsKKSB7CiAgICBjb25zdGV4cHIgaW50IHdhcnBzID0gYmxvY2tfc2l6ZSAvIHdhcnBfc2l6ZTsKCiAgICBjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9uID0gYmxvY2tfdGlsZS5uOwogICAgY29uc3RleHByIGludCBibG9ja190aWxlX2sgPSBibG9ja190aWxlLms7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gPD0gMTI4LCAiYmxvY2sgdGlsZSBNIG11c3QgYmUgc21hbGxlciB0aGFuIGJsb2Nrd2lzZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiA8PSAxMjgsICJibG9jayB0aWxlIE4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmxvY2t3aXNlIGJsb2NrIHNpemUiKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9rIDw9IDEyOCwgImJsb2NrIHRpbGUgSyBtdXN0IGJlIHNtYWxsZXIgdGhhbiBibG9ja3dpc2UgYmxvY2sgc2l6ZSIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX2sgPSB3YXJwX3RpbGUuazsKCiAgICB1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CiAgICB1c2luZyBmcmdfYV90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2FfdHlwZTsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfYl90eXBlOwogICAgdXNpbmcgZnJnX2NfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19jX3R5cGU7CiAgICB1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+OwoKICAgIGNvbnN0ZXhwciBpbnQgY190b3RhbCA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbjsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9iKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSB3YXJwX3RpbGVfbSA9PSAwLCAid2FycCB0aWxlIE0gaGFzIHRvIGRpdmlkZSBibG9jayB0aWxlIE0iKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbiA9IGJsb2NrX3RpbGVfbiAvIHdhcnBfdGlsZV9uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVzX2sgPSBibG9ja190aWxlX2sgLyB3YXJwX3RpbGVfazsKCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW4gPSB3YXJwX3RpbGVzX20gKiB3YXJwX3RpbGVzX247CgogICAgLy8gbnVtYmVyIG9mIHdhcnAgdGlsZXMgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHdhcnBzCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tbiwgd2FycHM+KCk7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIGNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CiAgICBzdGF0aWNfYXNzZXJ0KGNfcGVyX3RocmVhZCA9PSB3YXJwX3RpbGVzX21uX3Blcl93YXJwICogZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZCwgInNhbml0eSBjaGVjayIpOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICBjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKICAgIGNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7CgogICAgLy8gU3dhcCBkaXJlY3Rpb24gdG8gbWFrZSBib3VuZHMgY2hlY2tpbmcgYmUgZmlyc3QKICAgIGNvbnN0IGludCB0aV9tID0gZ3JpZERpbS54IC0gYmxvY2tJZHgueCAtIDE7CiAgICBjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwoKICAgIGludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgogICAgZnJnX2NfdHlwZSBibG9ja19jX2ZyZ1t3YXJwX3RpbGVzX21uX3Blcl93YXJwXTsKICAgIHVucm9sbDwwLCB3YXJwX3RpbGVzX21uX3Blcl93YXJwPihbJl08aW50IGk+IHsKICAgICAgICBibG9ja19jX2ZyZ1tpXS5jbGVhcigpOwogICAgfSk7CgogICAgX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07CiAgICBfX3NoYXJlZF9fIGZwOCBibG9ja190aWxlX2JbYmxvY2tfdGlsZV9uICogKGJsb2NrX3RpbGVfayArIDQpXTsKCiAgICBjb25zdCBhdXRvIGxvYWRfaW5wdXQgPSBbJl08Ym9vbCBjaGVja19ib3VuZHNfaz4oaW50IGkpIHsKICAgICAgICBjb25zdCBhdXRvIHJlZ3NfYSA9IGJsb2NrX3RpbGVfbG9hZF9mYXN0X2xpbmVhcjwKICAgICAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICAgICAgYmxvY2tfdGlsZV9tLAogICAgICAgICAgICBibG9ja190aWxlX2ssCiAgICAgICAgICAgIGxvYWRfdHlwZSwKICAgICAgICAgICAgbV9hbGlnbmVkLAogICAgICAgICAgICBrX2FsaWduZWQgJiYgIWNoZWNrX2JvdW5kc19rCiAgICAgICAgPigKICAgICAgICAgICAgYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaQogICAgICAgICk7CiAgICAgICAgY29uc3QgYXV0byByZWdzX2IgPSBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXI8CiAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgIGJsb2NrX3RpbGVfbiwKICAgICAgICAgICAgYmxvY2tfdGlsZV9rLAogICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgIG5fYWxpZ25lZCwKICAgICAgICAgICAga19hbGlnbmVkICYmICFjaGVja19ib3VuZHNfawogICAgICAgID4oCiAgICAgICAgICAgIGIsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkKICAgICAgICApOwogICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihyZWdzX2EsIHJlZ3NfYik7CiAgICB9OwoKICAgIGNvbnN0IGF1dG8gbW1hID0gWyZdKGludCBpKSB7CiAgICAgICAgZnJnX2FfdHlwZSBmcmdfYVt3YXJwX3RpbGVzX21uX3Blcl93YXJwICogd2FycF90aWxlc19rXTsKICAgICAgICB1bnJvbGwxZDx3YXJwX3RpbGVzX21uX3Blcl93YXJwPihbJl08aW50IGl3dGk+IHsKICAgICAgICAgICAgY29uc3QgaW50IHd0aSA9IHdhcnAgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aTsKICAgICAgICAgICAgY29uc3QgaW50IHd0bSA9IHd0aSAlIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IHd0biA9IHd0aSAvIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgdW5yb2xsPDAsIGJsb2NrX3RpbGVfaywgd2FycF90aWxlX2s+KFsmXTxpbnQgd3RrX2Jhc2U+IHsKICAgICAgICAgICAgICAgIGNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKCiAgICAgICAgICAgICAgICB1bnJvbGw8MCwgZnJnX2FfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbWtfcmVnPiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pa10gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9hKGxhbmUsIGZyZ19hX3R5cGU6OmZpcnN0X2l0ZW1fb2ZfcmVnKG1rX3JlZykpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKICAgICAgICAgICAgICAgICAgICBmcmdfYVt3dGsgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aV0ucmVnc1tta19yZWddID0KICAgICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmYmxvY2tfdGlsZV9hW2JpayArIGJpbSAqIChibG9ja190aWxlX2sgKyA0KV0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBmcmdfYl90eXBlIGZyZ19iW3dhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiB3YXJwX3RpbGVzX2tdOwogICAgICAgIHVucm9sbDFkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnA+KFsmXTxpbnQgaXd0aT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICB1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewogICAgICAgICAgICAgICAgY29uc3RleHByIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwoKICAgICAgICAgICAgICAgIHVucm9sbDwwLCBmcmdfYl90eXBlOjpyZWdpc3RlcnNfcGVyX3RocmVhZD4oWyZdPGludCBua19yZWc+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2luLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2IobGFuZSwgZnJnX2JfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobmtfcmVnKSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpbiA9IHd0biAqIHdhcnBfdGlsZV9uICsgbWZtYV9pbjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmlrID0gd3RrX2Jhc2UgKyBtZm1hX2lrOwogICAgICAgICAgICAgICAgICAgIGZyZ19iW3d0ayAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpXS5yZWdzW25rX3JlZ10gPQogICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZibG9ja190aWxlX2JbYmlrICsgYmluICogKGJsb2NrX3RpbGVfayArIDQpXSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIGZyZ19jX3R5cGUgd2FycF9mcmdfY1t3YXJwX3RpbGVzX21uX3Blcl93YXJwXTsKICAgICAgICB1bnJvbGw8MCwgd2FycF90aWxlc19tbl9wZXJfd2FycD4oWyZdPGludCBpPiB7CiAgICAgICAgICAgIHdhcnBfZnJnX2NbaV0uY2xlYXIoKTsKICAgICAgICB9KTsKCiAgICAgICAgdW5yb2xsMmQ8d2FycF90aWxlc19tbl9wZXJfd2FycCwgd2FycF90aWxlc19rPihbJl08aW50IGl3dGksIGludCB3dGs+IHsKICAgICAgICAgICAgbWZtYTo6ZXhlY3V0ZSgKICAgICAgICAgICAgICAgIHdhcnBfZnJnX2NbaXd0aV0sCiAgICAgICAgICAgICAgICBmcmdfYVt3dGsgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aV0sCiAgICAgICAgICAgICAgICBmcmdfYlt3dGsgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aV0KICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgdW5yb2xsMmQ8d2FycF90aWxlc19tbl9wZXJfd2FycCwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RpLCBpbnQgbW5faXRlbT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwoKICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwogICAgICAgICAgICBjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwogICAgICAgICAgICBjb25zdCBpbnQgaW0gPSB0aV9tICogYmxvY2tfdGlsZV9tICsgYmltOwogICAgICAgICAgICBjb25zdCBpbnQgaW4gPSB0aV9uICogYmxvY2tfdGlsZV9uOyAvLyB0aWxlIG9mZnNldCBkb2Vzbid0IG1hdHRlciBoZXJlLCBvbWl0dGluZyBpdCBoZWxwcyB0aGUgb3B0aW1pemVyLgoKICAgICAgICAgICAgYmxvY2tfY19mcmdbaXd0aV0udGhyZWFkX3ZhbHVlcygpW21uX2l0ZW1dICs9IHdhcnBfZnJnX2NbaXd0aV0udGhyZWFkX3ZhbHVlcygpW21uX2l0ZW1dCiAgICAgICAgICAgICAgICAqIGFzW2kgLyAxMjggKiBtICsgaW1dCiAgICAgICAgICAgICAgICAqIGJzW2kgLyAxMjggKiBzbiArIGluIC8gMTI4XTsKICAgICAgICB9KTsKICAgIH07CgogICAgaWYgY29uc3RleHByICghcGlwZWxpbmVkX21haW5fbG9vcCkgewogICAgICAgIC8vIFJlZ3VsYXIgbWFpbiBsb29wCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewogICAgICAgICAgICBjb25zdCBhdXRvIFtyZWdzX2EsIHJlZ3NfYl0gPSBsb2FkX2lucHV0LnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oaSk7CiAgICAgICAgICAgIHdyaXRlX3RvX3NtZW08YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9tLCBibG9ja190aWxlX2ssIGxvYWRfdHlwZT4oYmxvY2tfdGlsZV9hLCByZWdzX2EuZGF0YSgpKTsKICAgICAgICAgICAgd3JpdGVfdG9fc21lbTxibG9ja19zaXplLCBibG9ja190aWxlX24sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlPihibG9ja190aWxlX2IsIHJlZ3NfYi5kYXRhKCkpOwogICAgICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAgICAgICAgIG1tYShpKTsKICAgICAgICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUGlwZWxpbmVkIG1haW4gbG9vcAogICAgICAgIGludCBpID0gMDsKICAgICAgICBhdXRvIFtyZWdzX2EsIHJlZ3NfYl0gPSBsb2FkX2lucHV0LnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oaSk7CiAgICAgICAgd3JpdGVfdG9fc21lbTxibG9ja19zaXplLCBibG9ja190aWxlX20sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlPihibG9ja190aWxlX2EsIHJlZ3NfYS5kYXRhKCkpOwogICAgICAgIHdyaXRlX3RvX3NtZW08YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9uLCBibG9ja190aWxlX2ssIGxvYWRfdHlwZT4oYmxvY2tfdGlsZV9iLCByZWdzX2IuZGF0YSgpKTsKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICAgIGZvciAoOyBpICsgYmxvY2tfdGlsZV9rIDwgazsgaSArPSBibG9ja190aWxlX2spIHsKICAgICAgICAgICAgc3RkOjp0aWUocmVnc19hLCByZWdzX2IpID0gbG9hZF9pbnB1dC50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KGkgKyBibG9ja190aWxlX2spOwogICAgICAgICAgICBtbWEoaSk7CiAgICAgICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICAgICAgd3JpdGVfdG9fc21lbTxibG9ja19zaXplLCBibG9ja190aWxlX20sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlPihibG9ja190aWxlX2EsIHJlZ3NfYS5kYXRhKCkpOwogICAgICAgICAgICB3cml0ZV90b19zbWVtPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbiwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGU+KGJsb2NrX3RpbGVfYiwgcmVnc19iLmRhdGEoKSk7CiAgICAgICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICB9CiAgICAgICAgbW1hKGkpOwogICAgfQoKICAgIC8vIFdyaXRlIG91dCBDCiAgICAvLyBUaGlzIHNob3VsZCBhY2Nlc3MgdGlsZSBDIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBtYXRtdWwgbG9vcCEKCiAgICBjb25zdCBpbnQgaW1fYmFzZSA9IHRpX20gKiBibG9ja190aWxlX207CiAgICBjb25zdCBpbnQgaW5fYmFzZSA9IHRpX24gKiBibG9ja190aWxlX247CgogICAgY29uc3QgYm9vbCBjX2luX2JvdW5kcyA9CiAgICAgICAgKG1fYWxpZ25lZCB8fCBtICUgYmxvY2tfdGlsZV9tID09IDAgfHwgaW1fYmFzZSArIGJsb2NrX3RpbGVfbSA8PSBtKSAmJgogICAgICAgIChuX2FsaWduZWQgfHwgbiAlIGJsb2NrX3RpbGVfbiA9PSAwIHx8IGluX2Jhc2UgKyBibG9ja190aWxlX24gPD0gbik7CgogICAgc2VsZWN0KGNfaW5fYm91bmRzLCBbJl08Ym9vbCBjX2luX2JvdW5kcz4gewogICAgICAgIHVucm9sbDJkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0aSwgaW50IG1uX2l0ZW0+IHsKICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwoKICAgICAgICAgICAgY29uc3QgaW50IHd0aSA9IHdhcnAgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aTsKICAgICAgICAgICAgY29uc3QgaW50IHd0bSA9IHd0aSAlIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IHd0biA9IHd0aSAvIHdhcnBfdGlsZXNfbTsKCiAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgIGNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CgogICAgICAgICAgICBjb25zdCBpbnQgaW0gPSBpbV9iYXNlICsgYmltOwogICAgICAgICAgICBjb25zdCBpbnQgaW4gPSBpbl9iYXNlICsgYmluOwoKICAgICAgICAgICAgY29uc3QgYXV0byB2YWwgPSBiZjE2X2Zyb21fZnAzMihibG9ja19jX2ZyZ1tpd3RpXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0pOwoKICAgICAgICAgICAgaWYgKGNfaW5fYm91bmRzIHx8IGltIDwgbSAmJiBpbiA8IG4pIHsKICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZShzdGQ6OmJpdF9jYXN0PHVpbnQxNl90Pih2YWwpLCByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oJmNbaW0gKiBuICsgaW5dKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgY3ViZSBibG9ja190aWxlLAogICAgY3ViZSB3YXJwX3RpbGUsCiAgICBib29sIHBpcGVsaW5lZF9tYWluX2xvb3AgPSBmYWxzZSwKICAgIHR5cGVuYW1lIGxvYWRfdHlwZSA9IF9fdWludDEyOF90Cj4Kdm9pZCBydW5fa2VybmVsKAogICAgY29uc3QgZnA4KiBhLAogICAgY29uc3QgZnA4KiBiLAogICAgY29uc3QgZnAzMiogYXMsCiAgICBjb25zdCBmcDMyKiBicywKICAgIGJmMTYqIGMsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICBjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKICAgIGNvbnN0IGludCBncmlkX24gPSBjZWlsX2RpdihuLCBibG9ja190aWxlLm4pOwoKICAgIGhpcEV2ZW50X3Qgc3RhcnQsIHN0b3A7CiAgICBpZiAobWVhc3VyZSkgewogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudENyZWF0ZSgmc3RhcnQpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRDcmVhdGUoJnN0b3ApKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RhcnQsIDApKTsKICAgIH0KCiAgICAvLyBzZWxlY3QobSAlIGJsb2NrX3RpbGUubSA9PSAwLCBbJl08Ym9vbCBtX2FsaWduZWQ+IHsKICAgIC8vICAgICBzZWxlY3QobiAlIGJsb2NrX3RpbGUubiA9PSAwLCBbJl08Ym9vbCBuX2FsaWduZWQ+IHsKICAgIC8vICAgICAgICAgc2VsZWN0KGsgJSBibG9ja190aWxlLmsgPT0gMCwgWyZdPGJvb2wga19hbGlnbmVkPiB7CiAgICAgICAgICAgICAgICBrZXJuZWw8CiAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlLAogICAgICAgICAgICAgICAgICAgIHdhcnBfdGlsZSwKICAgICAgICAgICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVkX21haW5fbG9vcCwKICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gbV9hbGlnbmVkLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBuX2FsaWduZWQsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UgIC8vIGtfYWxpZ25lZAogICAgICAgICAgICAgICAgPjw8PAogICAgICAgICAgICAgICAgICAgIGRpbTMoZ3JpZF9tLCBncmlkX24pLAogICAgICAgICAgICAgICAgICAgIGRpbTMoYmxvY2tfc2l6ZSksCiAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgPj4+KAogICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgICAgICBhcywKICAgICAgICAgICAgICAgICAgICBicywKICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgIG0sCiAgICAgICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICAgICBrCiAgICAgICAgICAgICAgICApOwogICAgLy8gICAgICAgICB9KTsKICAgIC8vICAgICB9KTsKICAgIC8vIH0pOwoKICAgIEhJUF9DSEVDSyhoaXBHZXRMYXN0RXJyb3IoKSk7CgogICAgaWYgKG1lYXN1cmUpIHsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RvcCwgMCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBEZXZpY2VTeW5jaHJvbml6ZSgpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRTeW5jaHJvbml6ZShzdG9wKSk7CgogICAgICAgIGZsb2F0IG1zID0gMDsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRFbGFwc2VkVGltZSgmbXMsIHN0YXJ0LCBzdG9wKSk7CiAgICAgICAgY29uc3QgZG91YmxlIHRpbWUgPSBtcyAvIDEnMDAwLjA7CgogICAgICAgIGNvbnN0IGRvdWJsZSBtZW1vcnkgPSBtICogayAqIHNpemVvZihmcDgpICsgbiAqIGsgKiBzaXplb2YoZnA4KSArIG0gKiBuICogc2l6ZW9mKGJmMTYpOwogICAgICAgIGNvbnN0IGRvdWJsZSBvcHMgPQogICAgICAgICAgICBkb3VibGUobSkgKiBuICogayAqIDIgLy8gTXVsdGlwbHkgKyBhZGQgZm9yIGVhY2ggcGFpcgogICAgICAgICAgICArIChkb3VibGUobSkgKiBuICogMikgKiBjZWlsX2RpdihrLCB3YXJwX3RpbGUuayk7IC8vIHNjYWxpbmcKCiAgICAgICAgY29uc3QgZG91YmxlIG1lbW9yeV90cHV0ID0gbWVtb3J5IC8gdGltZSAvICgxMDAwLjAgKiAxMDAwICogMTAwMCk7CiAgICAgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfdHB1dCA9IG9wcyAvIHRpbWUgLyAoMTAwMC4wICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKCiAgICAgICAgc3RkOjpjZXJyCiAgICAgICAgICAgIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikKICAgICAgICAgICAgPDwgIigiIDw8IG0gPDwgIiAiIDw8IG4gPDwgIiAiIDw8IGsgPDwgIikgIgogICAgICAgICAgICA8PCAiKCIgPDwgYmxvY2tfdGlsZS5tIDw8ICIgIiA8PCBibG9ja190aWxlLm4gPDwgIiAiIDw8IGJsb2NrX3RpbGUuayA8PCAiKSAiCiAgICAgICAgICAgIDw8ICIoIiA8PCB3YXJwX3RpbGUubSA8PCAiICIgPDwgd2FycF90aWxlLm4gPDwgIiAiIDw8IHdhcnBfdGlsZS5rIDw8ICIpICIKICAgICAgICAgICAgPDwgcGlwZWxpbmVkX21haW5fbG9vcCA8PCAiICIKICAgICAgICAgICAgPDwgYmxvY2tfc2l6ZSA8PCAiOiAiCiAgICAgICAgICAgIDw8IG1zIDw8ICIgbXMgIgogICAgICAgICAgICA8PCAodGltZSAqIDEnMDAwJzAwMCkgPDwgIiB1cyAiCiAgICAgICAgICAgIDw8IG1lbW9yeV90cHV0IDw8ICIgR0IvcyAiCiAgICAgICAgICAgIDw8IGNvbXB1dGVfdHB1dCA8PCAiIFRGTE9QUyIKICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnREZXN0cm95KHN0YXJ0KSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50RGVzdHJveShzdG9wKSk7CiAgICB9Cn0KCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICAvLyBJbiB0aGUga2VybmVscyB3ZSBhc3N1bWUgMTI4LWJpdCBhbGlnbm1lbnQuCiAgICBhc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChiX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGNfcHRyICUgMTYgPT0gMCk7CgogICAgY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwogICAgYXV0byogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGNfcHRyKTsKCiAgICAvKgogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCA2NH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCA2NCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCA2NH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgZmFsc2U+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwoKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgZmFsc2U+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgKi8KCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgZmFsc2U+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KClBZQklORDExX01PRFVMRShmcDgsIG0pIHsKICBtLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCJdLAogICAgYnVpbGRfZGlyZWN0b3J5PSIvd29ya3NwYWNlL2J1aWxkLyIgaWYgVEVTVElORyA9PSAidnNjb2RlIiBlbHNlICIvZ3B1bW9kZS9hbWQvZnA4L2J1aWxkLyIgaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIE5vbmUsCiAgICAjbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgpmaXJzdCA9IFRydWUKCmNhY2hlX20gPSAwCmNhY2hlX24gPSAwCmNhY2hlX2sgPSAwCmNhY2hlX2kgPSAwCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgZ2xvYmFsIGNhY2hlX20KICAgIGdsb2JhbCBjYWNoZV9uCiAgICBnbG9iYWwgY2FjaGVfawogICAgZ2xvYmFsIGNhY2hlX2kKCiAgICBpZiBjYWNoZV9tICE9IG0gb3IgY2FjaGVfbiAhPSBuIG9yIGNhY2hlX2sgIT0gazoKICAgICAgICBjYWNoZV9tID0gbQogICAgICAgIGNhY2hlX24gPSBuCiAgICAgICAgY2FjaGVfayA9IGsKICAgICAgICBjYWNoZV9pID0gMAogICAgZWxzZToKICAgICAgICBjYWNoZV9pICs9IDEKCiAgICAjIERvbid0IGNoZWNrIHRoZSBwZXJmb3JtYW5jZSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHRvIGFsbG93IGZvciBzb21lIHdhcm11cAogICAgbWVhc3VyZSA9IEZhbHNlCiAgICBpZiBjYWNoZV9pID09IDE6CiAgICAgICAgbWVhc3VyZSA9IFRydWUKCiAgICBoaXBfbW9kdWxlLmZwOCgKICAgICAgICBhLmRhdGFfcHRyKCksCiAgICAgICAgYi5kYXRhX3B0cigpLAogICAgICAgIGFfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBiX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYy5kYXRhX3B0cigpLAogICAgICAgIG0sCiAgICAgICAgbiwKICAgICAgICBrLAogICAgICAgIG1lYXN1cmUKICAgICkKCiAgICByZXR1cm4gYwo=

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Changes from previous submission

Against this author's previous submission submission 6008.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9ICJHUFVNT0RFX1RFU1RJTkciIGluIG9zLmVudmlyb24KCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGJpdD4KCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnVzaW5nIGZwOCA9IF9faGlwX2ZwOF9lNG0zX2ZudXo7CnVzaW5nIGJmMTYgPSBfX2hpcF9iZmxvYXQxNjsKdXNpbmcgZnAzMiA9IGZsb2F0Owp1c2luZyBmcDMyeDQgPSBmcDMyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CgpzdHJ1Y3QgY3ViZSB7CiAgICBpbnQgbSwgbiwgazsKfTsKCmNvbnN0ZXhwciBpbnQgd2FycF9zaXplID0gNjQ7CmNvbnN0ZXhwciBpbnQgY2FjaGVfbGluZV9zaXplID0gMTI4OwoKY29uc3RleHByIGludCBtX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBuX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKY29uc3RleHByIGludCBrX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAxMjg7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KX19ob3N0X18gX19kZXZpY2VfXwpjb25zdGV4cHIgYXV0byBjZWlsX2RpdihUIGEsIFUgYikgewogICAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQoKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jID0gMSwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwoRiBmKSB7CiAgICBpZiBjb25zdGV4cHIoSSA8IE4pIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8ST4oKTsKICAgICAgICB1bnJvbGw8SSArIGluYywgTiwgaW5jPihmKTsKICAgIH0KfQoKdGVtcGxhdGU8aW50IEksIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsMWQoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oZik7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihbJl08aW50IGk+IHsKICAgICAgICB1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwogICAgICAgIH0pOwogICAgfSk7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgSiwgaW50IEssIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsM2QoRiBmKSB7CiAgICB1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CiAgICAgICAgdW5yb2xsPDAsIEo+KFsmXTxpbnQgaj4gewogICAgICAgICAgICB1bnJvbGw8MCwgSz4oWyZdPGludCBrPiB7CiAgICAgICAgICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fCnZvaWQgY2xlYXIoVCAoJmFycmF5KVtOXSkgewogICAgdW5yb2xsPDAsIE4+KFsmXTxpbnQgaT4gewogICAgICAgIGFycmF5W2ldID0gVHswfTsKICAgIH0pOwp9CgpfX2RldmljZV9fCmJmMTYgYmYxNl9mcm9tX2ZwMzIoZmxvYXQgeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmdW5jdGlvbiBkb2VzIGFsbCBraW5kcyBvZiBjaGVja3MKICAgIC8vIGZvciBvZGQgY2FzZXMgKE5hTiwgc3Vibm9ybWFscykgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0LgogICAgLy8gVGhpcyBnZW5lcmF0ZXMgYWJzb2x1dGVseSBhYnlzbWFsIGNvZGUsIHNvIGp1c3QgdHJ1bmNhdGUKICAgIC8vIHRoZSB1cHBlciBiaXRzIHRvIGdldCB0aGUgcmlnaHQgdmFsdWUgbGlrZSB0aGUKICAgIC8vIE9wcGVycHl0aG9uIGludGVuZGVkLgoKICAgIHJldHVybiBzdGQ6OmJpdF9jYXN0PGJmMTY+KAogICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oeCkgPj4gMTYKICAgICAgICApCiAgICApOwp9CgpfX2RldmljZV9fCmZwMzIgZnAzMl9mcm9tX2ZwOChmcDggeCkgewogICAgLy8gSElQJ3MgY29udmVyc2lvbiBmcm9tIGZwOCB0byBmcDMyIGlzIHNsb3cgb24gYW55dGhpbmcgdGhhdAogICAgLy8gZG9lc24ndCBoYXZlIHRoZSBoYXJkd2FyZSBpbnN0cnVjdGlvbnMgdG8gZG8gaXQuIFRoZSBzb2Z0d2FyZQogICAgLy8gbWV0aG9kIGRlYWxzIHdpdGggc3BlY2lhbCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSwgYnV0IHdlCiAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSBzaW5jZSB3ZSBkb24ndCBleHBlY3QgdGhvc2UgaW4KICAgIC8vIHRoZSBpbnB1dC4gVGhlcmVmb3JlLCB3ZSBjYW4gb3B0aW1pemUgdGhlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCiAgICAvLyBieSBqdXN0IHNodWZmbGluZyB0aGUgYml0cy4KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIC8vIE1JMzAwIGhhcyBhbiBpbnN0cnVjdGlvbiBmb3IgdGhpcy4KICAgIHJldHVybiBmbG9hdCh4KTsKI2Vsc2UKICAgIC8vIEZhbGxiYWNrIGNhc2UKICAgIC8vIFRPRE86IEZpbmQgYSBmYXN0ZXIgb3B0aW9uCiAgICByZXR1cm4gZmxvYXQoeCk7CiNlbmRpZgp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXwp2b2lkIHNlbGVjdChib29sIGNvbmQsIEYgZikgewogICAgaWYgKGNvbmQpIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGZhbHNlPigpOwogICAgfQp9Cgp0ZW1wbGF0ZTxpbnQgY3RybD4KX19kZXZpY2VfXwp1aW50MzJfdCBkcHBfc2h1ZmZsZSh1aW50MzJfdCB4KSB7CiAgICByZXR1cm4gX19idWlsdGluX2FtZGdjbl91cGRhdGVfZHBwKHgsIHgsIGN0cmwsIDB4RiAvKiByb3cgbWFzayAqLywgMHhGIC8qIGJhbmsgbWFzayAqLywgZmFsc2UgLyogYm91bmQgY3RybCAqLyk7Cn0KCl9fZGV2aWNlX18KdWludDMyX3QgdHJhbnNwb3NlXzR4NF9mOCh1aW50MzJfdCBpbnB1dCkgewogICAgY29uc3QgaW50IGxhbmUgPSBfX2xhbmVfaWQoKTsKCiAgICAvLyBpbnB1dDoKICAgIC8vIGJ5dGUgMCAxIDIgMwogICAgLy8gICAgICAwIDEgMiAzIGxhbmUgMAogICAgLy8gICAgICA0IDUgNiA3IGxhbmUgMQogICAgLy8gICAgICA4IDkgQSBCIGxhbmUgMgogICAgLy8gICAgICBDIEQgRSBGIGxhbmUgMwogICAgLy8gc3dhcCBwYWlycyBvZiBsYW5lcyB0byBnZXQKICAgIC8vIDAgMSAyIDMKICAgIC8vIDQgNSA2IDcKICAgIC8vIEMgRCBFIEYKICAgIC8vIDggOSBBIEIKICAgIC8vIHRoZW4gdXNlIGJ5dGVwZXJtIHRvIHN3YXAgcGFpcnMgaG9yaXpvbnRhbGx5ICsgbWVyZ2UgdGhlCiAgICAvLyB0d28gcmVzdWx0cyB0byBnZXQgMngyIHRyYW5zcG9zZWQKICAgIC8vIDAgNCAyIDYKICAgIC8vIDEgNSAzIDcKICAgIC8vIDggQyBBIEUKICAgIC8vIDkgRCBCIEYKICAgIGNvbnN0IGF1dG8gdDJ4MiA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKICAgICAgICBpbnB1dCwKICAgICAgICBkcHBfc2h1ZmZsZTwwYjEwJzExJzAwJzAxPihpbnB1dCksCiAgICAgICAgbGFuZSAlIDIgPT0gMAogICAgICAgICAgICA/IDB4MDYnMDInMDQnMDAKICAgICAgICAgICAgOiAweDAzJzA3JzAxJzA1CiAgICApOwogICAgcmV0dXJuIHQyeDI7Cn0KCnRlbXBsYXRlPAogICAgaW50IGJsb2NrX3NpemUsCiAgICBpbnQgYmxvY2tfdGlsZV9tLAogICAgaW50IGJsb2NrX3RpbGVfbiwKICAgIHR5cGVuYW1lIGxvYWRfdHlwZSwKICAgIGJvb2wgbV9hbGlnbmVkID0gZmFsc2UsCiAgICBib29sIG5fYWxpZ25lZCA9IGZhbHNlCj4KX19kZXZpY2VfXwpfX2ZvcmNlaW5saW5lX18Kdm9pZCBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXIoCiAgICAvLyBTaGFyZWQgbWVtb3J5IGRlc3RpbmF0aW9uCiAgICBmcDgqIGJsb2NrX3RpbGVfZHN0LAogICAgLy8gR2xvYmFsIG1lbW9yeSBzb3VyY2UKICAgIGNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGJsb2NrX29mZl9tLAogICAgaW50IGJsb2NrX29mZl9uCikgewogICAgYmxvY2tfdGlsZV9zcmMgKz0gYmxvY2tfb2ZmX24gKiBtICsgYmxvY2tfb2ZmX207CgogICAgY29uc3QgYm9vbCBjb21wbGV0ZWx5X2luX2JvdW5kcyA9IChtX2FsaWduZWQgJiYgbl9hbGlnbmVkKSB8fAogICAgICAgIChibG9ja19vZmZfbSArIGJsb2NrX3RpbGVfbSA8PSBtICYmCiAgICAgICAgYmxvY2tfb2ZmX24gKyBibG9ja190aWxlX24gPD0gbik7CgogICAgLy8gQSBnZW5lcmFsIGZhc3QgZ2xvYmFsIG1lbW9yeSBuZWVkcyB0byBiZSBhcyBmb2xsb3dzOgogICAgLy8gLSBHcm91cCBvZiAxNiBieXRlcyBzbyB0aGF0IHdlIGNhbiB1c2UgYSAxMjgtYml0IGxvYWQKICAgIC8vIC0gVGhlIGZhc3QgcGF0aCByZXF1aXJlcyBlbnRpcmUgY2FjaGUgbGluZXMgdG8gYmUgbG9hZGVkIGF0IG9uY2UuIENETkEzCiAgICAvLyAgIGNhY2hlIGxpbmUgc2l6ZSBpcyAxMjggYnl0ZXMsIHNvIHRoZSBpZGVhbCBtYXRyaXggc2l6ZSBoYXMgYW4gaW5uZXIKICAgIC8vICAgZGltZW5zaW9uIChibG9ja190aWxlX207IHNvdXJjZSBpcyBjb2x1bW4gbWFqb3IpIG9mIGF0IGxlYXN0IDEyOC4KICAgIC8vIC0gV2Ugd2FudCBldmVyeSB0aHJlYWQgdG8gcGFydGljaXBhdGUsIHNvIHdlIG5lZWQgYXQgbGVhc3QKICAgIC8vICAgYmxvY2tfc2l6ZSAvICgxMjggLyAxNikgZWxlbWVudHMgaW4gdGhlIE4gZGlyZWN0aW9uLgogICAgLy8gICBibG9ja19zaXplID09IDY0ID0+IDgKICAgIC8vICAgYmxvY2tfc2l6ZSA9PSAyNTYgPT4gMzIKICAgIC8vICAgYmxvY2tfc2l6ZSA9PSAxMDI0ID0+IDEyOAogICAgLy8gLSBXZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgaXMgYWxyZWFkeSBhbGlnbmVkIHRvIDEyOCBiaXRzLCBhbmQgdGhhdCB0aGUgbSBzdHJpZGUKICAgIC8vICAgaXMgYWxzbyBhbGlnbmVkIHN1Y2guIG0sIG4sIGsgYXJlIGFsbCBkaXZpc2libGUgYnkgNjQsIHNvIHRoaXMgc2hvdWxkIGJlIGZpbmUuCiAgICAvLwogICAgLy8gICDilIzilIDilIDilIDilKzilIDilIDilIDilKzilIDilIDilIDilKzilIDilIDilIDilJAg4pSM4pSA4pSA4pSA4pSQCiAgICAvLyAgIOKUgjAgIOKUgjQgIOKUgjggIOKUgjEyIOKUgiDilIIgICDilIIgPSAxNiBieXRlcwogICAgLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQg4pSU4pSA4pSA4pSA4pSYCiAgICAvLyAgIOKUgjEgIOKUgjUgIOKUgjkgIOKUgjEzIOKUggogICAgLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQKICAgIC8vICAg4pSCMiAg4pSCNiAg4pSCMTAg4pSCMTQg4pSCCiAgICAvLyAgIOKUnOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUpAogICAgLy8gICDilIIzICDilII3ICDilIIxMSDilIIxNSDilIIKICAgIC8vICAg4pSU4pSA4pSA4pSA4pS04pSA4pSA4pSA4pS04pSA4pSA4pSA4pS04pSA4pSA4pSA4pSYCgogICAgLy8gdXNpbmcgbG9hZF90eXBlID0gdWludDMyX3Q7CgogICAgLy8gc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBjYWNoZV9saW5lX3NpemUgPT0gMCwgInRpbGUgaW5uZXIgZGltZW5zaW9uIHNob3VsZCBiZSBkaXZpc2libGUgYnkgY2FjaGUgbGluZSBzaXplIik7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBzaXplb2YobG9hZF90eXBlKSA9PSAwLCAidGlsZSBpbm5lciBkaW1lbnNpb24gaGFzIHRvIGJlIGRpdmlzaWJsZSBieSBsb2FkIHR5cGUgc2l6ZSIpOwogICAgY29uc3RleHByIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwogICAgc3RhdGljX2Fzc2VydCh0b3RhbF9sb2FkcyAlIGJsb2NrX3NpemUgPT0gMCwgInRvdGFsIGFtb3VudCBvZiBsb2FkcyBuZWVkcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGVfbSAvIHNpemVvZihsb2FkX3R5cGUpOwogICAgY29uc3RleHByIGludCBsb2Fkc19wZXJfdGhyZWFkID0gdG90YWxfbG9hZHMgLyBibG9ja19zaXplOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICBzZWxlY3QoY29tcGxldGVseV9pbl9ib3VuZHMsIFsmXTxib29sIGluX2JvdW5kcz4gewogICAgICAgIHVucm9sbDwwLCBsb2Fkc19wZXJfdGhyZWFkPihbJl08aW50IGo+IHsKICAgICAgICAgICAgY29uc3QgaW50IGkgPSBqICogYmxvY2tfc2l6ZSArIHRpZDsKICAgICAgICAgICAgY29uc3QgaW50IHJvdyA9IGkgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgY29sID0gaSAvIGxvYWRzX3Blcl9ibG9ja190aWxlX207CgogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKICAgICAgICAgICAgY29uc3QgaW50IHNyY19yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGJsb2NrX29mZl9tOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX2NvbCA9IGNvbCArIGJsb2NrX29mZl9uOwoKICAgICAgICAgICAgLy8gTm90ZTogTSwgTiwgSyBpcyBndWFyYW50ZWVkIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbG9hZAogICAgICAgICAgICAvLyBzaXplLCBzbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIG91dGVyIGJvdW5kcy4KICAgICAgICAgICAgbG9hZF90eXBlIHNyY19wYWNrZWQ7CiAgICAgICAgICAgIGlmIChpbl9ib3VuZHMgfHwgKG1fYWxpZ25lZCB8fCBzcmNfcm93IDwgbSkgJiYgKG5fYWxpZ25lZCB8fCBzcmNfY29sIDwgbikpIHsKICAgICAgICAgICAgICAgIHNyY19wYWNrZWQgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBsb2FkX3R5cGUqPihibG9ja190aWxlX3NyYyArIHNyY19vZmYpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3JjX3BhY2tlZCA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnN0IGludCBkc3Rfb2ZmID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBjb2wgKiBibG9ja190aWxlX207CiAgICAgICAgICAgIGF1dG8qIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJsb2NrX3RpbGVfZHN0KTsKICAgICAgICAgICAgY29uc3QgYXV0byogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJnNyY19wYWNrZWQpOwoKICAgICAgICAgICAgLy8gU3RvcmUgdHJhbnNwb3NlZAogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVvZihsb2FkX3R5cGUpOyArK2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgICAgICAgICAgY29uc3QgaW50IGRzdF9jb2wgPSBjb2w7CiAgICAgICAgICAgICAgICBkc3RbZHN0X2NvbCArIGRzdF9yb3cgKiAoYmxvY2tfdGlsZV9uICsgNCldID0gc3JjW2tdOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyOwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2YzMl9mMzI8MTYsIDE2LCA0PiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZsb2F0ICgmYylbNF0sCiAgICAgICAgZmxvYXQgYSwKICAgICAgICBmbG9hdCBiCiAgICApIHsKICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4NGYzMigKICAgICAgICAgICAgYSwKICAgICAgICAgICAgYiwKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwCiAgICAgICAgKTsKICAgICAgICB1bnJvbGw8MCwgND4oWyZdPGludCBpPiB7CiAgICAgICAgICAgIGNbaV0gPSByZXN1bHRbaV07CiAgICAgICAgfSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+IHsKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUoCiAgICAgICAgZmxvYXQgKCZjKVsxNl0sCiAgICAgICAgZmxvYXQgYSwKICAgICAgICBmbG9hdCBiCiAgICApIHsKICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MmYzMigKICAgICAgICAgICAgYSwKICAgICAgICAgICAgYiwKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICk7CiAgICAgICAgdW5yb2xsPDAsIDE2PihbJl08aW50IGk+IHsKICAgICAgICAgICAgY1tpXSA9IHJlc3VsdFtpXTsKICAgICAgICB9KTsKICAgIH0KfTsKCnRlbXBsYXRlIDxpbnQgbSwgaW50IG4sIGludCBrPgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg7Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MTYsIDE2LCAzMj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmbG9hdCAoJmMpWzRdLAogICAgICAgIGNvbnN0IGZwOCAoJmEpWzhdLAogICAgICAgIGNvbnN0IGZwOCAoJmIpWzhdCiAgICApIHsKI2lmZGVmIF9fSElQX0RFVklDRV9DT01QSUxFX18KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KAogICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGEpLAogICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGIpLAogICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMAogICAgKTsKICAgIHVucm9sbDwwLCA0PihbJl08aW50IGk+IHsKICAgICAgICBjW2ldID0gcmVzdWx0W2ldOwogICAgfSk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBzbyB3ZSBjYW4gdGVzdCBvbiBNSTIxMC4KICAgIC8vIEFwcGFyZW50bHkgdGhlIGxheW91dHMgYXJlIHN1Y2ggdGhhdCB3ZSBjYW4ganVzdCBkbyB0aGlzLgogICAgdW5yb2xsPDAsIDg+KFsmXTxpbnQgaz4gewogICAgICAgIGNvbnN0IGF1dG8gYV9mMzIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYVtrXSk7CiAgICAgICAgY29uc3QgYXV0byBiX2YzMiA9IHN0YXRpY19jYXN0PGZsb2F0PihiW2tdKTsKICAgICAgICBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND46OmV4ZWN1dGUoYywgYV9mMzIsIGJfZjMyKTsKICAgIH0pOwojZW5kaWYKI2VuZGlmCiAgICB9Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODwzMiwgMzIsIDE2PiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZsb2F0ICgmYylbMTZdLAogICAgICAgIGNvbnN0IGZwOCAoJmEpWzhdLAogICAgICAgIGNvbnN0IGZwOCAoJmIpWzhdCiAgICApIHsKI2lmZGVmIF9fSElQX0RFVklDRV9DT01QSUxFX18KI2lmZGVmIF9fZ2Z4OTQyX18KICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngxNl9mcDhfZnA4KAogICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGEpLAogICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGIpLAogICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMngxNj4oYyksCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAKICAgICk7CiAgICB1bnJvbGw8MCwgMTY+KFsmXTxpbnQgaT4gewogICAgICAgIGNbaV0gPSByZXN1bHRbaV07CiAgICB9KTsKI2Vsc2UKICAgIC8vIEZhbGxiYWNrIGNvcGllZCBmcm9tIENLLCB0aGlzIHdheSB3ZSBjYW4gdGVzdCBvbiBNSTIxMC4KICAgIHVucm9sbDwwLCA4PihbJl08aW50IGs+IHsKICAgICAgICBjb25zdCBhdXRvIGFfZjMyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFba10pOwogICAgICAgIGNvbnN0IGF1dG8gYl9mMzIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYltrXSk7CiAgICAgICAgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+OjpleGVjdXRlKGMsIGFfZjMyLCBiX2YzMik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKLy8gU2VlIENETkEzIG1hbnVhbCwgNy4xLjQuMS4gSW5wdXQgbGF5b3V0Ci8vIFRoZSBjYWxjdWxhdGlvbnMgaGVyZSBhcmUgb2J0YWluZWQgdmlhIHRoZQovLyBBTUQgbWF0cml4IGluc3RydWN0aW9uIGNhbGN1bGF0b3IKLy8gaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vYW1kX21hdHJpeF9pbnN0cnVjdGlvbl9jYWxjdWxhdG9yCi8vIFRoZXJlIGlzIGEgY2xlYW5lciB3YXkgdG8gY29tcHV0ZSB0aGUgbWFwcGluZywgYnV0Ci8vIHRoaXMgaXMgd2hhdCB0aGUgdG9vbCByZXR1cm5zIGFuZCBJJ20gbGF6eS4gV2Ugb25seQovLyByZWFsbHkgbmVlZCB0aGVzZSB0d28gYW55d2F5IGZvciBub3cuCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfaW5kZXhlcjxtZm1hX2YzMl9mOF9mODwxNiwgMTYsIDMyPj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIC8vIE5vdGU6IHJlZyBpcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4KICAgICAgICAvLyB0aGUgdGhyZWFkJ3MgcmVnaXN0ZXJzLiBUaGUgbWF0cml4IGluc3RydWN0aW9uCiAgICAgICAgLy8gY2FsY3VsYXRvciBjb25zaWRlcnMgdGhlIHJlZ2lzdGVyIHRoZSBWR1JQLCBzbwogICAgICAgIC8vIDQgZWxlbWVudHMuIEFsbCBvZiB0aGUgZWxlbWVudHMgc2hvdWxkIGJlIHBhY2tlZAogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDE2OwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMTYpICsgcmVnOwogICAgICAgIHJldHVybiB7bSwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDE2OwogICAgICAgIGNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMTYpICsgcmVnOwogICAgICAgIHJldHVybiB7biwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IHJlZ190b19tYXRyaXhfYyhpbnQgbGFuZSwgaW50IHJlZykgewogICAgICAgIGNvbnN0IGludCBtID0gNCAqIChsYW5lIC8gMTYpICsgcmVnOwogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDE2OwogICAgICAgIHJldHVybiB7bSwgbn07CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDMyLCAzMiwgMTY+PiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gcmVnX3RvX21hdHJpeF9hKGludCBsYW5lLCBpbnQgcmVnKSB7CiAgICAgICAgLy8gTm90ZTogcmVnIGlzIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbgogICAgICAgIC8vIHRoZSB0aHJlYWQncyByZWdpc3RlcnMuIFRoZSBtYXRyaXggaW5zdHJ1Y3Rpb24KICAgICAgICAvLyBjYWxjdWxhdG9yIGNvbnNpZGVycyB0aGUgcmVnaXN0ZXIgdGhlIFZHUlAsIHNvCiAgICAgICAgLy8gNCBlbGVtZW50cy4gQWxsIG9mIHRoZSBlbGVtZW50cyBzaG91bGQgYmUgcGFja2VkCiAgICAgICAgY29uc3QgaW50IG0gPSBsYW5lICUgMzI7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAzMikgKyByZWc7CiAgICAgICAgcmV0dXJuIHttLCBrfTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gcmVnX3RvX21hdHJpeF9iKGludCBsYW5lLCBpbnQgcmVnKSB7CiAgICAgICAgY29uc3QgaW50IG4gPSBsYW5lICUgMzI7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAzMikgKyByZWc7CiAgICAgICAgcmV0dXJuIHtuLCBrfTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gcmVnX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgcmVnKSB7CiAgICAgICAgY29uc3QgaW50IG4gPSA4ICogKHJlZyAvIDQpICUgMzIgKyA0ICogKGxhbmUgLyAzMikgKyAocmVnICUgNCk7CiAgICAgICAgY29uc3QgaW50IG0gPSBsYW5lICUgMzI7CiAgICAgICAgcmV0dXJuIHtuLCBtfTsKICAgIH0KfTsKCnRlbXBsYXRlPGF1dG8gYSwgYXV0byBiPgpjb25zdGV4cHIgYXV0byBkaXZpZGVfZXhhY3QoKSB7CiAgICBzdGF0aWNfYXNzZXJ0KGEgJSBiID09IDAsICJkb2VzIG5vdCBkaXZpZGUgZXhhY3QhIik7CiAgICByZXR1cm4gYSAvIGI7Cn0KCnRlbXBsYXRlIDwKICAgIGludCBibG9ja19zaXplLAogICAgY3ViZSBibG9ja190aWxlLAogICAgY3ViZSB3YXJwX3RpbGUsCiAgICB0eXBlbmFtZSBsb2FkX3R5cGUsCiAgICBib29sIG1fYWxpZ25lZCA9IGZhbHNlLAogICAgYm9vbCBuX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wga19hbGlnbmVkID0gZmFsc2UKPgpfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKGJsb2NrX3NpemUpCnZvaWQga2VybmVsKAogICAgY29uc3QgZnA4KiBhLAogICAgY29uc3QgZnA4KiBiLAogICAgY29uc3QgZnAzMiogYXMsCiAgICBjb25zdCBmcDMyKiBicywKICAgIGJmMTYqIGMsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGsKKSB7CiAgICBjb25zdGV4cHIgaW50IHdhcnBzID0gYmxvY2tfc2l6ZSAvIHdhcnBfc2l6ZTsKCiAgICBjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9uID0gYmxvY2tfdGlsZS5uOwogICAgY29uc3RleHByIGludCBibG9ja190aWxlX2sgPSBibG9ja190aWxlLms7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZS5tOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbiA9IHdhcnBfdGlsZS5uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwoKICAgIHVzaW5nIG1mbWEgPSBtZm1hX2YzMl9mOF9mODx3YXJwX3RpbGVfbSwgd2FycF90aWxlX24sIHdhcnBfdGlsZV9rPjsKICAgIHVzaW5nIGluZGV4ZXIgPSBtZm1hX2luZGV4ZXI8bWZtYT47CgogICAgY29uc3RleHByIGludCBjX3RvdGFsID0gYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9uOwoKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2EpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2IpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKICAgIHN0YXRpY19hc3NlcnQoY190b3RhbCAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9jKSBhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAlIHdhcnBfdGlsZV9tID09IDAsICJ3YXJwIHRpbGUgTSBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgTSIpOwogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX24gJSB3YXJwX3RpbGVfbiA9PSAwLCAid2FycCB0aWxlIE4gaGFzIHRvIGRpdmlkZSBibG9jayB0aWxlIE4iKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9rICUgd2FycF90aWxlX2sgPT0gMCwgIndhcnAgdGlsZSBLIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBLIik7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVzX20gPSBibG9ja190aWxlX20gLyB3YXJwX3RpbGVfbTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19uID0gYmxvY2tfdGlsZV9uIC8gd2FycF90aWxlX247CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfayA9IGJsb2NrX3RpbGVfayAvIHdhcnBfdGlsZV9rOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbiA9IHdhcnBfdGlsZXNfbSAqIHdhcnBfdGlsZXNfbjsKCiAgICAvLyBudW1iZXIgb2Ygd2FycCB0aWxlcyBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBudW1iZXIgb2Ygd2FycHMKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbl9wZXJfd2FycCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX21uLCB3YXJwcz4oKTsKCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZV9tbl9pdGVtcyA9IHdhcnBfdGlsZV9tICogd2FycF90aWxlX247CgogICAgLy8gc2l6ZSh3YXJwX3RpbGVfbW4pIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIHdhcnAgc2l6ZQogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXB0ID0gZGl2aWRlX2V4YWN0PHdhcnBfdGlsZV9tbl9pdGVtcywgd2FycF9zaXplPigpOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbWtfaXB0ID0gZGl2aWRlX2V4YWN0PHdhcnBfdGlsZV9tICogd2FycF90aWxlX2ssIHdhcnBfc2l6ZT4oKTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX25rX2lwdCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVfbiAqIHdhcnBfdGlsZV9rLCB3YXJwX3NpemU+KCk7CgogICAgY29uc3RleHByIGludCBjX3Blcl90aHJlYWQgPSBjX3RvdGFsIC8gYmxvY2tfc2l6ZTsKICAgIHN0YXRpY19hc3NlcnQoY19wZXJfdGhyZWFkID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiB3YXJwX3RpbGVfbW5faXB0LCAic2FuaXR5IGNoZWNrIik7CgogICAgY29uc3QgaW50IHRpZCA9IHRocmVhZElkeC54OwoKICAgIGNvbnN0IGludCB3YXJwID0gdGlkIC8gd2FycF9zaXplOwogICAgY29uc3QgaW50IGxhbmUgPSBfX2xhbmVfaWQoKTsKCiAgICAvLyBTd2FwIGRpcmVjdGlvbiB0byBtYWtlIGJvdW5kcyBjaGVja2luZyBiZSBmaXJzdAogICAgY29uc3QgaW50IHRpX20gPSBncmlkRGltLnggLSBibG9ja0lkeC54IC0gMTsKICAgIGNvbnN0IGludCB0aV9uID0gZ3JpZERpbS55IC0gYmxvY2tJZHgueSAtIDE7CgogICAgaW50IHNuID0gY2VpbF9kaXYobiwgMTI4KTsKCiAgICBmbG9hdCBjX3JlZ3Nbd2FycF90aWxlc19tbl9wZXJfd2FycCAqIHdhcnBfdGlsZV9tbl9pcHRdOwogICAgY2xlYXIoY19yZWdzKTsKCiAgICBfX3NoYXJlZF9fIGZwOCBibG9ja190aWxlX2FbYmxvY2tfdGlsZV9tICogKGJsb2NrX3RpbGVfayArIDQpXTsKICAgIF9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYltibG9ja190aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwoKICAgIGNvbnN0IGF1dG8gbG9hZF9pbnB1dCA9IFsmXTxib29sIGNoZWNrX2JvdW5kc19rPihpbnQgaSkgewogICAgICAgIGJsb2NrX3RpbGVfbG9hZF9mYXN0X2xpbmVhcjwKICAgICAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICAgICAgYmxvY2tfdGlsZV9tLAogICAgICAgICAgICBibG9ja190aWxlX2ssCiAgICAgICAgICAgIGxvYWRfdHlwZSwKICAgICAgICAgICAgbV9hbGlnbmVkLAogICAgICAgICAgICBrX2FsaWduZWQgJiYgIWNoZWNrX2JvdW5kc19rCiAgICAgICAgPigKICAgICAgICAgICAgYmxvY2tfdGlsZV9hLCBhLCBtLCBrLCB0aV9tICogYmxvY2tfdGlsZV9tLCBpCiAgICAgICAgKTsKICAgICAgICBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXI8CiAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgIGJsb2NrX3RpbGVfbiwKICAgICAgICAgICAgYmxvY2tfdGlsZV9rLAogICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgIG5fYWxpZ25lZCwKICAgICAgICAgICAga19hbGlnbmVkICYmICFjaGVja19ib3VuZHNfawogICAgICAgID4oCiAgICAgICAgICAgIGJsb2NrX3RpbGVfYiwgYiwgbiwgaywgdGlfbiAqIGJsb2NrX3RpbGVfbiwgaQogICAgICAgICk7CiAgICB9OwoKICAgIGNvbnN0IGF1dG8gbW1hID0gWyZdKGludCBpKSB7CiAgICAgICAgdW5yb2xsMWQ8d2FycF90aWxlc19tbl9wZXJfd2FycD4oWyZdPGludCBpd3RpPiB7CiAgICAgICAgICAgIGNvbnN0IGludCB3dGkgPSB3YXJwICogd2FycF90aWxlc19tbl9wZXJfd2FycCArIGl3dGk7CiAgICAgICAgICAgIGNvbnN0IGludCB3dG0gPSB3dGkgJSB3YXJwX3RpbGVzX207CiAgICAgICAgICAgIGNvbnN0IGludCB3dG4gPSB3dGkgLyB3YXJwX3RpbGVzX207CiAgICAgICAgICAgIGNvbnN0IGludCBmbGF0X3d0X2Jhc2UgPSBpd3RpICogd2FycF90aWxlX21uX2lwdDsKCiAgICAgICAgICAgIGZsb2F0IHdhcnBfZnJnX2Nbd2FycF90aWxlX21uX2lwdF07CiAgICAgICAgICAgIGNsZWFyKHdhcnBfZnJnX2MpOwoKICAgICAgICAgICAgdW5yb2xsPDAsIGJsb2NrX3RpbGVfaywgd2FycF90aWxlX2s+KFsmXTxpbnQgd3RrX2Jhc2U+IHsKICAgICAgICAgICAgICAgIC8vIExvYWQgZnJhZ21lbnQgQQogICAgICAgICAgICAgICAgZnA4IGZyZ19hW3dhcnBfdGlsZV9ta19pcHRdOwogICAgICAgICAgICAgICAgdW5yb2xsPDAsIHdhcnBfdGlsZV9ta19pcHQsIHNpemVvZih1aW50MzJfdCk+KFsmXTxpbnQgbWtfcmVnPiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pa10gPSBpbmRleGVyOjpyZWdfdG9fbWF0cml4X2EobGFuZSwgbWtfcmVnKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogYmxvY2tfdGlsZV9sb2FkX2Zhc3RfbGluZWFyIHN0b3JlcyB0aGUgbWF0cml4IHRyYW5zcG9zZWQuCiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZHVlIHRvIHRyYW5zcG9zaXRpb24gZWxlbWVudHMgb2YgSyBhcmUgbm93IGNvbnNlY3V0aXZlLgogICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJmZyZ19hW21rX3JlZ10pID0KICAgICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmYmxvY2tfdGlsZV9hW2JpayArIGJpbSAqIChibG9ja190aWxlX2sgKyA0KV0pOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gTG9hZCBmcmFnbWVudCBCCiAgICAgICAgICAgICAgICBmcDggZnJnX2Jbd2FycF90aWxlX25rX2lwdF07CiAgICAgICAgICAgICAgICB1bnJvbGw8MCwgd2FycF90aWxlX25rX2lwdCwgc2l6ZW9mKHVpbnQzMl90KT4oWyZdPGludCBua19yZWc+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2luLCBtZm1hX2lrXSA9IGluZGV4ZXI6OnJlZ190b19tYXRyaXhfYihsYW5lLCBua19yZWcpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXIgc3RvcmVzIHRoZSBtYXRyaXggdHJhbnNwb3NlZC4KICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBkdWUgdG8gdHJhbnNwb3NpdGlvbiBlbGVtZW50cyBvZiBLIGFyZSBub3cgY29uc2VjdXRpdmUuCiAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmZnJnX2JbbmtfcmVnXSkgPQogICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZibG9ja190aWxlX2JbYmlrICsgYmluICogKGJsb2NrX3RpbGVfayArIDQpXSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBOb3cgcGVyZm9ybSB0aGUgTUZNQSBiYXNlZCBvbiB0aGUgd2FycCB0aWxlIHNpemUuCiAgICAgICAgICAgICAgICBtZm1hOjpleGVjdXRlKAogICAgICAgICAgICAgICAgICAgIHdhcnBfZnJnX2MsCiAgICAgICAgICAgICAgICAgICAgZnJnX2EsCiAgICAgICAgICAgICAgICAgICAgZnJnX2IKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdW5yb2xsPDAsIHdhcnBfdGlsZV9tbl9pcHQ+KFsmXTxpbnQgbW5fcmVnPiB7CiAgICAgICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2luXSA9IGluZGV4ZXI6OnJlZ190b19tYXRyaXhfYyhsYW5lLCBtbl9yZWcpOwogICAgICAgICAgICAgICAgY29uc3QgaW50IGJpbSA9IHd0bSAqIHdhcnBfdGlsZV9tICsgbWZtYV9pbTsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW0gPSB0aV9tICogYmxvY2tfdGlsZV9tICsgYmltOwogICAgICAgICAgICAgICAgY29uc3QgaW50IGluID0gdGlfbiAqIGJsb2NrX3RpbGVfbiArIGJpbjsKCiAgICAgICAgICAgICAgICBjX3JlZ3NbZmxhdF93dF9iYXNlICsgbW5fcmVnXSArPSB3YXJwX2ZyZ19jW21uX3JlZ10gKiBhc1tpIC8gMTI4ICogbSArIGltXSAqIGJzW2kgLyAxMjggKiBzbiArIGluIC8gMTI4XTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgaSArPSBibG9ja190aWxlX2spIHsKICAgICAgICBsb2FkX2lucHV0LnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oaSk7CiAgICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgICAgIG1tYShpKTsKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgLy8gV3JpdGUgb3V0IEMKICAgIC8vIFRoaXMgc2hvdWxkIGFjY2VzcyB0aWxlIEMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gdGhlIG1hdG11bCBsb29wIQoKICAgIGNvbnN0IGludCBpbV9iYXNlID0gdGlfbSAqIGJsb2NrX3RpbGVfbTsKICAgIGNvbnN0IGludCBpbl9iYXNlID0gdGlfbiAqIGJsb2NrX3RpbGVfbjsKCiAgICBjb25zdCBib29sIGNfaW5fYm91bmRzID0KICAgICAgICAobV9hbGlnbmVkIHx8IG0gJSBibG9ja190aWxlX20gPT0gMCB8fCBpbV9iYXNlICsgYmxvY2tfdGlsZV9tIDw9IG0pICYmCiAgICAgICAgKG5fYWxpZ25lZCB8fCBuICUgYmxvY2tfdGlsZV9uID09IDAgfHwgaW5fYmFzZSArIGJsb2NrX3RpbGVfbiA8PSBuKTsKCiAgICBzZWxlY3QoY19pbl9ib3VuZHMsIFsmXTxib29sIGNfaW5fYm91bmRzPiB7CiAgICAgICAgdW5yb2xsMmQ8d2FycF90aWxlc19tbl9wZXJfd2FycCwgd2FycF90aWxlX21uX2lwdD4oWyZdPGludCBpd3RpLCBpbnQgbW5fcmVnPiB7CiAgICAgICAgICAgIGNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaW5dID0gaW5kZXhlcjo6cmVnX3RvX21hdHJpeF9jKGxhbmUsIG1uX3JlZyk7CgogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgZmxhdF93dF9iYXNlID0gaXd0aSAqIHdhcnBfdGlsZV9tbl9pcHQ7CgogICAgICAgICAgICBjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwogICAgICAgICAgICBjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwoKICAgICAgICAgICAgY29uc3QgaW50IGltID0gaW1fYmFzZSArIGJpbTsKICAgICAgICAgICAgY29uc3QgaW50IGluID0gaW5fYmFzZSArIGJpbjsKCiAgICAgICAgICAgIGNvbnN0IGF1dG8gdmFsID0gYmYxNl9mcm9tX2ZwMzIoY19yZWdzW2ZsYXRfd3RfYmFzZSArIG1uX3JlZ10pOwoKICAgICAgICAgICAgaWYgKGNfaW5fYm91bmRzIHx8IGltIDwgbSAmJiBpbiA8IG4pIHsKICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZShzdGQ6OmJpdF9jYXN0PHVpbnQxNl90Pih2YWwpLCByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oJmNbaW0gKiBuICsgaW5dKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgY3ViZSBibG9ja190aWxlLAogICAgY3ViZSB3YXJwX3RpbGUsCiAgICB0eXBlbmFtZSBsb2FkX3R5cGUgPSB1aW50MzJfdAo+CnZvaWQgcnVuX2tlcm5lbCgKICAgIGNvbnN0IGZwOCogYSwKICAgIGNvbnN0IGZwOCogYiwKICAgIGNvbnN0IGZwMzIqIGFzLAogICAgY29uc3QgZnAzMiogYnMsCiAgICBiZjE2KiBjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBrLAogICAgYm9vbCBtZWFzdXJlCikgewogICAgY29uc3QgaW50IGdyaWRfbSA9IGNlaWxfZGl2KG0sIGJsb2NrX3RpbGUubSk7CiAgICBjb25zdCBpbnQgZ3JpZF9uID0gY2VpbF9kaXYobiwgYmxvY2tfdGlsZS5uKTsKCiAgICBoaXBFdmVudF90IHN0YXJ0LCBzdG9wOwogICAgaWYgKG1lYXN1cmUpIHsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRDcmVhdGUoJnN0YXJ0KSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50Q3JlYXRlKCZzdG9wKSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50UmVjb3JkKHN0YXJ0LCAwKSk7CiAgICB9CgogICAgLy8gc2VsZWN0KG0gJSBibG9ja190aWxlLm0gPT0gMCwgWyZdPGJvb2wgbV9hbGlnbmVkPiB7CiAgICAvLyAgICAgc2VsZWN0KG4gJSBibG9ja190aWxlLm4gPT0gMCwgWyZdPGJvb2wgbl9hbGlnbmVkPiB7CiAgICAvLyAgICAgICAgIHNlbGVjdChrICUgYmxvY2tfdGlsZS5rID09IDAsIFsmXTxib29sIGtfYWxpZ25lZD4gewogICAgICAgICAgICAgICAga2VybmVsPAogICAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZSwKICAgICAgICAgICAgICAgICAgICB3YXJwX3RpbGUsCiAgICAgICAgICAgICAgICAgICAgbG9hZF90eXBlLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBtX2FsaWduZWQsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIG5fYWxpZ25lZCwKICAgICAgICAgICAgICAgICAgICBmYWxzZSAgLy8ga19hbGlnbmVkCiAgICAgICAgICAgICAgICA+PDw8CiAgICAgICAgICAgICAgICAgICAgZGltMyhncmlkX20sIGdyaWRfbiksCiAgICAgICAgICAgICAgICAgICAgZGltMyhibG9ja19zaXplKSwKICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICA+Pj4oCiAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgICAgIGFzLAogICAgICAgICAgICAgICAgICAgIGJzLAogICAgICAgICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICAgICAgbSwKICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgIGsKICAgICAgICAgICAgICAgICk7CiAgICAvLyAgICAgICAgIH0pOwogICAgLy8gICAgIH0pOwogICAgLy8gfSk7CgogICAgSElQX0NIRUNLKGhpcEdldExhc3RFcnJvcigpKTsKCiAgICBpZiAobWVhc3VyZSkgewogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudFJlY29yZChzdG9wLCAwKSk7CiAgICAgICAgSElQX0NIRUNLKGhpcERldmljZVN5bmNocm9uaXplKCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudFN5bmNocm9uaXplKHN0b3ApKTsKCiAgICAgICAgZmxvYXQgbXMgPSAwOwogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudEVsYXBzZWRUaW1lKCZtcywgc3RhcnQsIHN0b3ApKTsKICAgICAgICBjb25zdCBkb3VibGUgdGltZSA9IG1zIC8gMScwMDAuMDsKCiAgICAgICAgY29uc3QgZG91YmxlIG1lbW9yeSA9IG0gKiBrICogc2l6ZW9mKGZwOCkgKyBuICogayAqIHNpemVvZihmcDgpICsgbSAqIG4gKiBzaXplb2YoYmYxNik7CiAgICAgICAgY29uc3QgZG91YmxlIG9wcyA9CiAgICAgICAgICAgIGRvdWJsZShtKSAqIG4gKiBrICogMiAvLyBNdWx0aXBseSArIGFkZCBmb3IgZWFjaCBwYWlyCiAgICAgICAgICAgICsgKGRvdWJsZShtKSAqIG4gKiAyKSAqIGNlaWxfZGl2KGssIHdhcnBfdGlsZS5rKTsgLy8gc2NhbGluZwoKICAgICAgICBjb25zdCBkb3VibGUgbWVtb3J5X3RwdXQgPSBtZW1vcnkgLyB0aW1lIC8gKDEwMDAuMCAqIDEwMDAgKiAxMDAwKTsKICAgICAgICBjb25zdCBkb3VibGUgY29tcHV0ZV90cHV0ID0gb3BzIC8gdGltZSAvICgxMDAwLjAgKiAxMDAwICogMTAwMCAqIDEwMDApOwoKICAgICAgICBzdGQ6OmNlcnIKICAgICAgICAgICAgPDwgc3RkOjpmaXhlZAogICAgICAgICAgICA8PCBzdGQ6OnNldHByZWNpc2lvbigyKQogICAgICAgICAgICA8PCAiKCIgPDwgbSA8PCAiICIgPDwgbiA8PCAiICIgPDwgayA8PCAiKSAiCiAgICAgICAgICAgIDw8ICIoIiA8PCBibG9ja190aWxlLm0gPDwgIiAiIDw8IGJsb2NrX3RpbGUubiA8PCAiICIgPDwgYmxvY2tfdGlsZS5rIDw8ICIpICIKICAgICAgICAgICAgPDwgIigiIDw8IHdhcnBfdGlsZS5tIDw8ICIgIiA8PCB3YXJwX3RpbGUubiA8PCAiICIgPDwgd2FycF90aWxlLmsgPDwgIikgIgogICAgICAgICAgICA8PCBibG9ja19zaXplIDw8ICI6ICIKICAgICAgICAgICAgPDwgbXMgPDwgIiBtcyAiCiAgICAgICAgICAgIDw8ICh0aW1lICogMScwMDAnMDAwKSA8PCAiIHVzICIKICAgICAgICAgICAgPDwgbWVtb3J5X3RwdXQgPDwgIiBHQi9zICIKICAgICAgICAgICAgPDwgY29tcHV0ZV90cHV0IDw8ICIgVEZMT1BTIgogICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CgogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudERlc3Ryb3koc3RhcnQpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnREZXN0cm95KHN0b3ApKTsKICAgIH0KCn0KCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICAvLyBJbiB0aGUga2VybmVscyB3ZSBhc3N1bWUgMTI4LWJpdCBhbGlnbm1lbnQuCiAgICBhc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChiX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGNfcHRyICUgMTYgPT0gMCk7CgogICAgY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwogICAgYXV0byogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGNfcHRyKTsKCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDEyOH0sIGN1YmV7MiwgMiwgOH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDEyOH0sIGN1YmV7MiwgMiwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDEyOH0sIGN1YmV7MiwgMiwgMn0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXszMiwgMzIsIDY0fSwgY3ViZXsyLCAyLCA0fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezMyLCAzMiwgNjR9LCBjdWJlezIsIDIsIDJ9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MzIsIDMyLCAzMn0sIGN1YmV7MiwgMiwgMn0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezQsIDIsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDQsIDh9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwxMjgsIGN1YmV7MzIsIDMyLCAxMjh9LCBjdWJlezIsIDIsIDE2fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXs0LCA0LCA0fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCBfX3VpbnQxMjhfdD4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBfX3VpbnQxMjhfdD4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIC8vIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezQsIDQsIDR9PihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgLy8gcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7NCwgNCwgNH0+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXs4LCA4LCA4fT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgLy8gcnVuX2tlcm5lbDw2NCwgY3ViZXszMiwgMzIsIDMyfSwgY3ViZXszMiwgMzIsIDE2fSwgX191aW50MTI4X3Q+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KClBZQklORDExX01PRFVMRShmcDgsIG0pIHsKICBtLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCJdLAogICAgYnVpbGRfZGlyZWN0b3J5PSIvZ3B1bW9kZS9hbWQvZnA4L2J1aWxkLyIgaWYgVEVTVElORyBlbHNlIE5vbmUsCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmZpcnN0ID0gVHJ1ZQoKY2FjaGVfbSA9IDAKY2FjaGVfbiA9IDAKY2FjaGVfayA9IDAKY2FjaGVfaSA9IDAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYmxvY2stc2NhbGUgZnA4IGdlbW0KICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgdGhhdCBleHBhbmRzIHRvOgogICAgICAgICAgICBhOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbSwga10sCiAgICAgICAgICAgIGI6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFtuLCBrXSwKICAgICAgICAgICAgYV9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFttLCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGJfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbiAvLyAxMjgsIGsgLy8gMTI4XSwKICAgICAgICAgICAgYzogdG9yY2guVGVuc29yW2JmbG9hdDE2XSBvZiBzaGFwZSBbbSwgbl0KICAgIFJldHVybnM6CiAgICAgICAgVGVuc29yIGNvbnRhaW5pbmcgb3V0cHV0IGluIGJmMTYKICAgICIiIgoKICAgIGdsb2JhbCBmaXJzdAogICAgaWYgZmlyc3Q6CiAgICAgICAgcHJpbnQoImV4ZWN1dGluZyBvbiIsIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9uYW1lKCksIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBmaXJzdCA9IEZhbHNlCgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKCiAgICBtLCBuID0gYy5zaGFwZQogICAgayA9IGEuc2hhcGVbMV0KCiAgICBnbG9iYWwgY2FjaGVfbQogICAgZ2xvYmFsIGNhY2hlX24KICAgIGdsb2JhbCBjYWNoZV9rCiAgICBnbG9iYWwgY2FjaGVfaQoKICAgIGlmIGNhY2hlX20gIT0gbSBvciBjYWNoZV9uICE9IG4gb3IgY2FjaGVfayAhPSBrOgogICAgICAgIGNhY2hlX20gPSBtCiAgICAgICAgY2FjaGVfbiA9IG4KICAgICAgICBjYWNoZV9rID0gawogICAgICAgIGNhY2hlX2kgPSAwCiAgICBlbHNlOgogICAgICAgIGNhY2hlX2kgKz0gMQoKICAgICMgRG9uJ3QgY2hlY2sgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gdG8gYWxsb3cgZm9yIHNvbWUgd2FybXVwCiAgICBtZWFzdXJlID0gRmFsc2UKICAgIGlmIGNhY2hlX2kgPT0gMToKICAgICAgICBtZWFzdXJlID0gRmFsc2UKCiAgICBoaXBfbW9kdWxlLmZwOCgKICAgICAgICBhLmRhdGFfcHRyKCksCiAgICAgICAgYi5kYXRhX3B0cigpLAogICAgICAgIGFfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBiX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYy5kYXRhX3B0cigpLAogICAgICAgIG0sCiAgICAgICAgbiwKICAgICAgICBrLAogICAgICAgIG1lYXN1cmUKICAgICkKCiAgICByZXR1cm4gYwo=
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgoKI2RlZmluZSBISVBfQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBpZihlcnJvciAhPSBoaXBTdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKICAgICAgICAgICAgICAgICAgICAgIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKICAgICAgICAgICAgICAgICAgICAgIDw8ICc6JyA8PCBfX0xJTkVfXyA8PCAnQG4nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgZXhpdChlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHdoaWxlKGZhbHNlKQoKdXNpbmcgZnA4ID0gX19oaXBfZnA4X2U0bTNfZm51ejsKdXNpbmcgYmYxNiA9IF9faGlwX2JmbG9hdDE2Owp1c2luZyBmcDMyID0gZmxvYXQ7CnVzaW5nIGZwMzJ4NCA9IGZwMzIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7CnVzaW5nIGZwMzJ4MTYgPSBmcDMyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKCnN0cnVjdCBjdWJlIHsKICAgIGludCBtLCBuLCBrOwp9OwoKY29uc3RleHByIGludCB3YXJwX3NpemUgPSA2NDsKY29uc3RleHByIGludCBjYWNoZV9saW5lX3NpemUgPSAxMjg7Cgpjb25zdGV4cHIgaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IG5fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IGtfYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDEyODsKCnVzaW5nIHJlZ2lzdGVyX3R5cGUgPSB1aW50MzJfdDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgpfX2hvc3RfXyBfX2RldmljZV9fCmNvbnN0ZXhwciBhdXRvIGNlaWxfZGl2KFQgYSwgVSBiKSB7CiAgICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9Cgp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXwpjb25zdGV4cHIgYXV0byBkaXZpZGVfZXhhY3QoKSB7CiAgICBzdGF0aWNfYXNzZXJ0KGEgJSBiID09IDAsICJkb2VzIG5vdCBkaXZpZGUgZXhhY3QhIik7CiAgICByZXR1cm4gYSAvIGI7Cn0KCnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYyA9IDEsIHR5cGVuYW1lIEY+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsKEYgZikgewogICAgaWYgY29uc3RleHByIChJIDwgTikgewogICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxJPigpOwogICAgICAgIHVucm9sbDxJICsgaW5jLCBOLCBpbmM+KGYpOwogICAgfQp9Cgp0ZW1wbGF0ZTxpbnQgSSwgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwxZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihmKTsKfQoKdGVtcGxhdGU8aW50IEksIGludCBKLCB0eXBlbmFtZSBGPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDJkKEYgZikgewogICAgdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewogICAgICAgIHVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKICAgICAgICAgICAgZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGo+KCk7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGU8aW50IEksIGludCBKLCBpbnQgSywgdHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwzZChGIGYpIHsKICAgIHVucm9sbDwwLCBJPihbJl08aW50IGk+IHsKICAgICAgICB1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CiAgICAgICAgICAgIHVucm9sbDwwLCBLPihbJl08aW50IGs+IHsKICAgICAgICAgICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqLCBrPigpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0pOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18Kdm9pZCBjbGVhcihUICgmYXJyYXkpW05dKSB7CiAgICB1bnJvbGw8MCwgTj4oWyZdPGludCBpPiB7CiAgICAgICAgYXJyYXlbaV0gPSBUezB9OwogICAgfSk7Cn0KCl9fZGV2aWNlX18KYmYxNiBiZjE2X2Zyb21fZnAzMihmbG9hdCB4KSB7CiAgICAvLyBISVAncyBjb252ZXJzaW9uIGZ1bmN0aW9uIGRvZXMgYWxsIGtpbmRzIG9mIGNoZWNrcwogICAgLy8gZm9yIG9kZCBjYXNlcyAoTmFOLCBzdWJub3JtYWxzKSB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQuCiAgICAvLyBUaGlzIGdlbmVyYXRlcyBhYnNvbHV0ZWx5IGFieXNtYWwgY29kZSwgc28ganVzdCB0cnVuY2F0ZQogICAgLy8gdGhlIHVwcGVyIGJpdHMgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZSBsaWtlIHRoZQogICAgLy8gT3BwZXJweXRob24gaW50ZW5kZWQuCgogICAgcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8YmYxNj4oCiAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQzMl90Pih4KSA+PiAxNgogICAgICAgICkKICAgICk7Cn0KCl9fZGV2aWNlX18KZnAzMiBmcDMyX2Zyb21fZnA4KGZwOCB4KSB7CiAgICAvLyBISVAncyBjb252ZXJzaW9uIGZyb20gZnA4IHRvIGZwMzIgaXMgc2xvdyBvbiBhbnl0aGluZyB0aGF0CiAgICAvLyBkb2Vzbid0IGhhdmUgdGhlIGhhcmR3YXJlIGluc3RydWN0aW9ucyB0byBkbyBpdC4gVGhlIHNvZnR3YXJlCiAgICAvLyBtZXRob2QgZGVhbHMgd2l0aCBzcGVjaWFsIGNhc2VzIChOYU4sIHN1Ym5vcm1hbHMpLCBidXQgd2UKICAgIC8vIGRvbid0IGNhcmUgYWJvdXQgdGhhdCBoZXJlIHNpbmNlIHdlIGRvbid0IGV4cGVjdCB0aG9zZSBpbgogICAgLy8gdGhlIGlucHV0LiBUaGVyZWZvcmUsIHdlIGNhbiBvcHRpbWl6ZSB0aGUgc29mdHdhcmUgaW1wbGVtZW50YXRpb24KICAgIC8vIGJ5IGp1c3Qgc2h1ZmZsaW5nIHRoZSBiaXRzLgojaWZkZWYgX19nZng5NDJfXwogICAgLy8gTUkzMDAgaGFzIGFuIGluc3RydWN0aW9uIGZvciB0aGlzLgogICAgcmV0dXJuIGZsb2F0KHgpOwojZWxzZQogICAgLy8gRmFsbGJhY2sgY2FzZQogICAgLy8gVE9ETzogRmluZCBhIGZhc3RlciBvcHRpb24KICAgIHJldHVybiBmbG9hdCh4KTsKI2VuZGlmCn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpfX2RldmljZV9fIF9faG9zdF9fCnZvaWQgc2VsZWN0KGJvb2wgY29uZCwgRiBmKSB7CiAgICBpZiAoY29uZCkgewogICAgICAgIGYudGVtcGxhdGUgb3BlcmF0b3IoKTx0cnVlPigpOwogICAgfSBlbHNlIHsKICAgICAgICBmLnRlbXBsYXRlIG9wZXJhdG9yKCk8ZmFsc2U+KCk7CiAgICB9Cn0KCnRlbXBsYXRlPGludCBsYW5lX3N0cmlkZT4KX19kZXZpY2VfXwp1aW50MzJfdCB0cmFuc3Bvc2VfNHg0X2Y4X3YyKHVpbnQzMl90IGlucHV0KSB7CiAgICBzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlIDwgd2FycF9zaXplIC8gNCwgImxhbmUgc3RyaWRlIGlzIHRvbyBsYXJnZSIpOwogICAgc3RhdGljX2Fzc2VydCgobGFuZV9zdHJpZGUgJiAobGFuZV9zdHJpZGUgLSAxKSkgPT0gMCwgImxpbmUgc3RyaWRlIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIiKTsKICAgIC8vIGlucHV0OgogICAgLy8gYnl0ZSAwIDEgMiAzCiAgICAvLyAgICAgIDAgMSAyIDMgbGFuZSBYCiAgICAvLyAgICAgIDQgNSA2IDcgbGFuZSBYK2xhbmVfc3RyaWRlCiAgICAvLyAgICAgIDggOSBBIEIgbGFuZSBYK2xhbmVfc3RyaWRlCiAgICAvLyAgICAgIEMgRCBFIEYgbGFuZSBYK2xhbmVfc3RyaWRlCiAgICAvLyBzd2FwIHBhaXJzIG9mIGxhbmVzIHRvIGdldAogICAgLy8gMCAxIDIgMwogICAgLy8gNCA1IDYgNwogICAgLy8gQyBEIEUgRgogICAgLy8gOCA5IEEgQgogICAgLy8gdGhlbiB1c2UgYnl0ZXBlcm0gdG8gc3dhcCBwYWlycyBob3Jpem9udGFsbHkgKyBtZXJnZSB0aGUKICAgIC8vIHR3byByZXN1bHRzIHRvIGdldCAyeDIgdHJhbnNwb3NlZAogICAgLy8gMCA0IDIgNgogICAgLy8gMSA1IDMgNwogICAgLy8gOCBDIEEgRQogICAgLy8gOSBEIEIgRgogICAgY29uc3QgYXV0byBsYW5lID0gX19sYW5lX2lkKCk7CiAgICBjb25zdCBhdXRvIGdyb3VwX2xhbmVfaW5kZXggPSBsYW5lIC8gbGFuZV9zdHJpZGUgJSA0OwogICAgY29uc3QgYXV0byB0MngyID0gX19idWlsdGluX2FtZGdjbl9wZXJtKAogICAgICAgIF9fc2hmbF94b3IoaW5wdXQsIGxhbmVfc3RyaWRlKSwgLy8gU3dhcCBwYWlycwogICAgICAgIGlucHV0LAogICAgICAgIGdyb3VwX2xhbmVfaW5kZXggJSAyID09IDAKICAgICAgICAgICAgPyAweDA2JzAyJzA0JzAwCiAgICAgICAgICAgIDogMHgwMycwNycwMScwNQogICAgKTsKICAgIC8vIE5vdyBzd2FwIGdyb3VwcyBvZiAyIGhvcml6b250YWxseSwgYW5kIGRvIHRoZQogICAgLy8gc2FtZSBieXRlcGVybSBvcGVyYXRpb24gZXhjZXB0IHdpdGggZ3JvdXBzIG9mIDJ4Mi4KICAgIC8vIDAgMCAxIDEgICAgIDAgMCAyIDIKICAgIC8vIDAgMCAxIDEgLS0+IDAgMCAyIDIKICAgIC8vIDIgMiAzIDMgICAgIDEgMSAzIDMKICAgIC8vIDIgMiAzIDMgICAgIDEgMSAzIDMKICAgIGNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKICAgICAgICBfX3NoZmxfeG9yKHQyeDIsIGxhbmVfc3RyaWRlICogMiksIC8vIFN3YXAgZ3JvdXBzCiAgICAgICAgdDJ4MiwKICAgICAgICBncm91cF9sYW5lX2luZGV4IDwgMgogICAgICAgICAgICA/IDB4MDUnMDQnMDEnMDAKICAgICAgICAgICAgOiAweDAzJzAyJzA3JzA2CiAgICApOwoKICAgIC8vIGlucHV0ID0gKGxhbmUgPDwgMjQpIHwgKGxhbmUgPDwgMTYpIHwgKGxhbmUgPDwgOCkgfCBsYW5lOwogICAgcmV0dXJuIHQ0eDQ7Cn0KdGVtcGxhdGU8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGludCBibG9ja190aWxlX20sCiAgICBpbnQgYmxvY2tfdGlsZV9uLAogICAgdHlwZW5hbWUgbG9hZF90eXBlLAogICAgYm9vbCBtX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wgbl9hbGlnbmVkID0gZmFsc2UKPgpfX2RldmljZV9fCl9fZm9yY2VpbmxpbmVfXwphdXRvIGJsb2NrX3RpbGVfbG9hZF9mYXN0X2xpbmVhcigKICAgIC8vIEdsb2JhbCBtZW1vcnkgc291cmNlCiAgICBjb25zdCBmcDgqIGJsb2NrX3RpbGVfc3JjLAogICAgaW50IG0sCiAgICBpbnQgbiwKICAgIGludCBibG9ja19vZmZfbSwKICAgIGludCBibG9ja19vZmZfbgopIHsKICAgIGJsb2NrX3RpbGVfc3JjICs9IGJsb2NrX29mZl9uICogbSArIGJsb2NrX29mZl9tOwoKICAgIGNvbnN0IGJvb2wgY29tcGxldGVseV9pbl9ib3VuZHMgPSAobV9hbGlnbmVkICYmIG5fYWxpZ25lZCkgfHwKICAgICAgICAoYmxvY2tfb2ZmX20gKyBibG9ja190aWxlX20gPD0gbSAmJgogICAgICAgIGJsb2NrX29mZl9uICsgYmxvY2tfdGlsZV9uIDw9IG4pOwoKICAgIC8vIEEgZ2VuZXJhbCBmYXN0IGdsb2JhbCBtZW1vcnkgbmVlZHMgdG8gYmUgYXMgZm9sbG93czoKICAgIC8vIC0gR3JvdXAgb2YgMTYgYnl0ZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGEgMTI4LWJpdCBsb2FkCiAgICAvLyAtIFRoZSBmYXN0IHBhdGggcmVxdWlyZXMgZW50aXJlIGNhY2hlIGxpbmVzIHRvIGJlIGxvYWRlZCBhdCBvbmNlLiBDRE5BMwogICAgLy8gICBjYWNoZSBsaW5lIHNpemUgaXMgMTI4IGJ5dGVzLCBzbyB0aGUgaWRlYWwgbWF0cml4IHNpemUgaGFzIGFuIGlubmVyCiAgICAvLyAgIGRpbWVuc2lvbiAoYmxvY2tfdGlsZV9tOyBzb3VyY2UgaXMgY29sdW1uIG1ham9yKSBvZiBhdCBsZWFzdCAxMjguCiAgICAvLyAtIFdlIHdhbnQgZXZlcnkgdGhyZWFkIHRvIHBhcnRpY2lwYXRlLCBzbyB3ZSBuZWVkIGF0IGxlYXN0CiAgICAvLyAgIGJsb2NrX3NpemUgLyAoMTI4IC8gMTYpIGVsZW1lbnRzIGluIHRoZSBOIGRpcmVjdGlvbi4KICAgIC8vICAgYmxvY2tfc2l6ZSA9PSA2NCA9PiA4CiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMjU2ID0+IDMyCiAgICAvLyAgIGJsb2NrX3NpemUgPT0gMTAyNCA9PiAxMjgKICAgIC8vIC0gV2UgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGFscmVhZHkgYWxpZ25lZCB0byAxMjggYml0cywgYW5kIHRoYXQgdGhlIG0gc3RyaWRlCiAgICAvLyAgIGlzIGFsc28gYWxpZ25lZCBzdWNoLiBtLCBuLCBrIGFyZSBhbGwgZGl2aXNpYmxlIGJ5IDY0LCBzbyB0aGlzIHNob3VsZCBiZSBmaW5lLgogICAgLy8KICAgIC8vICAg4pSM4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSQIOKUjOKUgOKUgOKUgOKUkAogICAgLy8gICDilIIwICDilII0ICDilII4ICDilIIxMiDilIIg4pSCICAg4pSCID0gMTYgYnl0ZXMKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkIOKUlOKUgOKUgOKUgOKUmAogICAgLy8gICDilIIxICDilII1ICDilII5ICDilIIxMyDilIIKICAgIC8vICAg4pSc4pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pS84pSA4pSA4pSA4pSkCiAgICAvLyAgIOKUgjIgIOKUgjYgIOKUgjEwIOKUgjE0IOKUggogICAgLy8gICDilJzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilLzilIDilIDilIDilKQKICAgIC8vICAg4pSCMyAg4pSCNyAg4pSCMTEg4pSCMTUg4pSCCiAgICAvLyAgIOKUlOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUmAoKICAgIC8vIHVzaW5nIGxvYWRfdHlwZSA9IHVpbnQzMl90OwoKICAgIC8vIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgY2FjaGVfbGluZV9zaXplID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGNhY2hlIGxpbmUgc2l6ZSIpOwoKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgc2l6ZW9mKGxvYWRfdHlwZSkgPT0gMCwgInRpbGUgaW5uZXIgZGltZW5zaW9uIGhhcyB0byBiZSBkaXZpc2libGUgYnkgbG9hZCB0eXBlIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgdG90YWxfbG9hZHMgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX24gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIHN0YXRpY19hc3NlcnQodG90YWxfbG9hZHMgJSBibG9ja19zaXplID09IDAsICJ0b3RhbCBhbW91bnQgb2YgbG9hZHMgbmVlZHMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBjb25zdGV4cHIgaW50IGxvYWRzX3Blcl9ibG9ja190aWxlX20gPSBibG9ja190aWxlX20gLyBzaXplb2YobG9hZF90eXBlKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKCiAgICBjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgogICAgc3RkOjphcnJheTxsb2FkX3R5cGUsIGxvYWRzX3Blcl90aHJlYWQ+IHJlc3VsdDsKCiAgICBzZWxlY3QoY29tcGxldGVseV9pbl9ib3VuZHMsIFsmXTxib29sIGluX2JvdW5kcz4gewogICAgICAgIHVucm9sbDwwLCBsb2Fkc19wZXJfdGhyZWFkPihbJl08aW50IGo+IHsKICAgICAgICAgICAgY29uc3QgaW50IGkgPSBqICogYmxvY2tfc2l6ZSArIHRpZDsKICAgICAgICAgICAgY29uc3QgaW50IHJvdyA9IGkgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgICAgICBjb25zdCBpbnQgY29sID0gaSAvIGxvYWRzX3Blcl9ibG9ja190aWxlX207CgogICAgICAgICAgICBjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKICAgICAgICAgICAgY29uc3QgaW50IHNyY19yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGJsb2NrX29mZl9tOwogICAgICAgICAgICBjb25zdCBpbnQgc3JjX2NvbCA9IGNvbCArIGJsb2NrX29mZl9uOwoKICAgICAgICAgICAgLy8gTm90ZTogTSwgTiwgSyBpcyBndWFyYW50ZWVkIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbG9hZAogICAgICAgICAgICAvLyBzaXplLCBzbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIG91dGVyIGJvdW5kcy4KICAgICAgICAgICAgLy8gbG9hZF90eXBlIHNyY19wYWNrZWQ7CiAgICAgICAgICAgIGlmIChpbl9ib3VuZHMgfHwgKChtX2FsaWduZWQgfHwgc3JjX3JvdyA8IG0pICYmIChuX2FsaWduZWQgfHwgc3JjX2NvbCA8IG4pKSkgewogICAgICAgICAgICAgICAgcmVzdWx0W2pdID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbG9hZF90eXBlKj4oYmxvY2tfdGlsZV9zcmMgKyBzcmNfb2ZmKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc3VsdFtqXSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC8vIGNvbnN0IGludCBkc3Rfb2ZmID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBjb2wgKiBibG9ja190aWxlX207CiAgICAgICAgICAgIC8vIGF1dG8qIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJsb2NrX3RpbGVfZHN0KTsKICAgICAgICAgICAgLy8gY29uc3QgYXV0byogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJnNyY19wYWNrZWQpOwoKICAgICAgICAgICAgLy8gLy8gU3RvcmUgdHJhbnNwb3NlZAogICAgICAgICAgICAvLyB1bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSk+KFsmXTxpbnQgaz4gewogICAgICAgICAgICAvLyAgICAgY29uc3QgaW50IGRzdF9yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGs7CiAgICAgICAgICAgIC8vICAgICBjb25zdCBpbnQgZHN0X2NvbCA9IGNvbDsKICAgICAgICAgICAgLy8gICAgIGRzdFtkc3RfY29sICsgZHN0X3JvdyAqIChibG9ja190aWxlX24gKyA0KV0gPSBzcmNba107CiAgICAgICAgICAgIC8vIH0pOwoKICAgICAgICAgICAgLy8gU3RvcmUgdHJhbnNwb3NlZCB1c2luZyA0eDQgZ3JvdXBzLgogICAgICAgICAgICAvLyBjb25zdGV4cHIgaW50IGxhbmVfc3RyaWRlID0gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKICAgICAgICAgICAgLy8gdW5yb2xsPDAsIHNpemVvZihsb2FkX3R5cGUpLCBzaXplb2YodWludDMyX3QpPihbJl08aW50IGs+IHsKICAgICAgICAgICAgLy8gICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgICAgICAvLyAgICAgY29uc3QgaW50IGRzdF9jb2wgPSBjb2w7CiAgICAgICAgICAgIC8vICAgICBhdXRvIHYgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZzcmNba10pOwogICAgICAgICAgICAvLyAgICAgdiA9IHRyYW5zcG9zZV80eDRfZjhfdjI8bGFuZV9zdHJpZGU+KHYpOwogICAgICAgICAgICAvLyAgICAgY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gX19sYW5lX2lkKCkgLyBsYW5lX3N0cmlkZSAlIDQ7CiAgICAgICAgICAgIC8vICAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZkc3RbKGRzdF9jb2wgLSBkc3RfY29sICUgNCkgKyAoZHN0X3JvdyArIGdyb3VwX2xhbmVfaW5kZXgpICogKGJsb2NrX3RpbGVfbiArIDQpXSkKICAgICAgICAgICAgLy8gICAgICAgICA9IHY7CiAgICAgICAgICAgIC8vIH0pOwogICAgICAgIH0pOwogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKdGVtcGxhdGU8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGludCBibG9ja190aWxlX20sCiAgICBpbnQgYmxvY2tfdGlsZV9uLAogICAgdHlwZW5hbWUgbG9hZF90eXBlCj4KX19kZXZpY2VfXwp2b2lkIHdyaXRlX3RvX3NtZW0oCiAgICBmcDgqIGJsb2NrX3RpbGVfZHN0LAogICAgY29uc3QgbG9hZF90eXBlKiB0aHJlYWRfc3JjCikgewogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBzaXplb2YobG9hZF90eXBlKSA9PSAwLCAidGlsZSBpbm5lciBkaW1lbnNpb24gaGFzIHRvIGJlIGRpdmlzaWJsZSBieSBsb2FkIHR5cGUgc2l6ZSIpOwogICAgY29uc3RleHByIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwogICAgc3RhdGljX2Fzc2VydCh0b3RhbF9sb2FkcyAlIGJsb2NrX3NpemUgPT0gMCwgInRvdGFsIGFtb3VudCBvZiBsb2FkcyBuZWVkcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKICAgIGNvbnN0ZXhwciBpbnQgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGVfbSAvIHNpemVvZihsb2FkX3R5cGUpOwogICAgY29uc3RleHByIGludCBsb2Fkc19wZXJfdGhyZWFkID0gdG90YWxfbG9hZHMgLyBibG9ja19zaXplOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICB1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CiAgICAgICAgY29uc3QgaW50IGkgPSBqICogYmxvY2tfc2l6ZSArIHRpZDsKICAgICAgICBjb25zdCBpbnQgcm93ID0gaSAlIGxvYWRzX3Blcl9ibG9ja190aWxlX207CiAgICAgICAgY29uc3QgaW50IGNvbCA9IGkgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwoKICAgICAgICBhdXRvKiBkc3QgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihibG9ja190aWxlX2RzdCk7CiAgICAgICAgY29uc3QgYXV0byogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJnRocmVhZF9zcmNbal0pOwoKICAgICAgICAvLyBTdG9yZSB0cmFuc3Bvc2VkCiAgICAgICAgLy91bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSk+KFsmXTxpbnQgaz4gewogICAgICAgIC8vICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgIC8vICAgIGNvbnN0IGludCBkc3RfY29sID0gY29sOwogICAgICAgIC8vICAgIGRzdFtkc3RfY29sICsgZHN0X3JvdyAqIChibG9ja190aWxlX24gKyA0KV0gPSBzcmNba107CiAgICAgICAgLy99KTsKCiAgICAgICAgLy8gU3RvcmUgdHJhbnNwb3NlZCB1c2luZyA0eDQgZ3JvdXBzLgogICAgICAgIGNvbnN0ZXhwciBpbnQgbGFuZV9zdHJpZGUgPSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwogICAgICAgIHVucm9sbDwwLCBzaXplb2YobG9hZF90eXBlKSwgc2l6ZW9mKHVpbnQzMl90KT4oWyZdPGludCBrPiB7CiAgICAgICAgICAgIGNvbnN0IGludCBkc3Rfcm93ID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBrOwogICAgICAgICAgICBjb25zdCBpbnQgZHN0X2NvbCA9IGNvbDsKICAgICAgICAgICAgYXV0byB2ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmc3JjW2tdKTsKICAgICAgICAgICAgdiA9IHRyYW5zcG9zZV80eDRfZjhfdjI8bGFuZV9zdHJpZGU+KHYpOwogICAgICAgICAgICBjb25zdCBhdXRvIGdyb3VwX2xhbmVfaW5kZXggPSBfX2xhbmVfaWQoKSAvIGxhbmVfc3RyaWRlICUgNDsKICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmZHN0Wyhkc3RfY29sIC0gZHN0X2NvbCAlIDQpICsgKGRzdF9yb3cgKyBncm91cF9sYW5lX2luZGV4KSAqIChibG9ja190aWxlX24gKyA0KV0pCiAgICAgICAgICAgICAgICA9IHY7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKdGVtcGxhdGUgPGludCB3YXJwX3RpbGVfbV8sIGludCB3YXJwX3RpbGVfbl8sIHR5cGVuYW1lIFQ+CnN0cnVjdCBtZm1hX2ZyYWdtZW50IHsKICAgIHVzaW5nIHR5cGUgPSBUOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9tID0gd2FycF90aWxlX21fOwogICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGVfbl87CgogICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgdG90YWxfaXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8dG90YWxfaXRlbXMsIHdhcnBfc2l6ZT4oKTsKICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHJlZ2lzdGVyc19wZXJfdGhyZWFkID0gZGl2aWRlX2V4YWN0PGl0ZW1zX3Blcl90aHJlYWQgKiBzaXplb2YoVCksIHNpemVvZihyZWdpc3Rlcl90eXBlKT4oKTsKCiAgICByZWdpc3Rlcl90eXBlIHJlZ3NbcmVnaXN0ZXJzX3Blcl90aHJlYWRdOwoKICAgIF9fZGV2aWNlX18KICAgIGNvbnN0ZXhwciBzdGF0aWMgbWZtYV9mcmFnbWVudCB6ZXJvKCkgewogICAgICAgIHJldHVybiBtZm1hX2ZyYWdtZW50e3t9fTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgewogICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwogICAgfQoKICAgIF9fZGV2aWNlX18KICAgIGNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4qPigmdGhpcy0+cmVncyk7CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgdm9pZCBjbGVhcigpIHsKICAgICAgICB1bnJvbGw8MCwgcmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaT4gewogICAgICAgICAgICB0aGlzLT5yZWdzW2ldID0gMDsKICAgICAgICB9KTsKICAgIH0KCiAgICBzdGF0aWMgY29uc3RleHByIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CiAgICAgICAgcmV0dXJuIHJlZyAqIHNpemVvZihyZWdpc3Rlcl90eXBlKTsKICAgIH0KfTsKCnRlbXBsYXRlIDxpbnQgbSwgaW50IG4sIGludCBrPgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND4gewogICAgdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCA0LCBmbG9hdD47CiAgICB1c2luZyBmcmdfY190eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMTYsIGZsb2F0PjsKCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZyZ19jX3R5cGUmIGMsCiAgICAgICAgY29uc3QgZnJnX2FfdHlwZSYgYSwKICAgICAgICBjb25zdCBmcmdfYl90eXBlJiBiCiAgICApIHsKICAgICAgICBjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKICAgICAgICAgICAgX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNng0ZjMyKAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmbG9hdD4oYSksCiAgICAgICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKICAgICAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMAogICAgICAgICAgICApCiAgICAgICAgKTsKICAgIH0KfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyPDMyLCAzMiwgMj4gewogICAgdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAyLCBmbG9hdD47CiAgICB1c2luZyBmcmdfY190eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMzIsIGZsb2F0PjsKCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgdm9pZCBleGVjdXRlKAogICAgICAgIGZyZ19jX3R5cGUmIGMsCiAgICAgICAgY29uc3QgZnJnX2FfdHlwZSYgYSwKICAgICAgICBjb25zdCBmcmdfYl90eXBlJiBiCiAgICApIHsKICAgICAgICBjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKICAgICAgICAgICAgX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngyZjMyKAogICAgICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmbG9hdD4oYSksCiAgICAgICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKICAgICAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMngxNj4oYyksCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4OwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKICAgIHVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAzMiwgZnA4PjsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAzMiwgZnA4PjsKICAgIHVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwoKICAgIF9fZGV2aWNlX18KICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUoCiAgICAgICAgZnJnX2NfdHlwZSYgYywKICAgICAgICBjb25zdCBmcmdfYV90eXBlJiBhLAogICAgICAgIGNvbnN0IGZyZ19iX3R5cGUmIGIKICAgICkgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwogICAgYyA9IHN0ZDo6Yml0X2Nhc3Q8ZnJnX2NfdHlwZT4oCiAgICAgICAgX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICkKICAgICk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBjb3BpZWQgZnJvbSBDSywgdGhpcyB3YXkgd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICB1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+OwogICAgY29uc3QgYXV0byYgYV92YWx1ZXMgPSBhLnRocmVhZF92YWx1ZXMoKTsKICAgIGNvbnN0IGF1dG8mIGJfdmFsdWVzID0gYi50aHJlYWRfdmFsdWVzKCk7CiAgICB1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CiAgICAgICAgY29uc3QgYXV0byBmYWxsYmFja19hID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYV90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYV92YWx1ZXNba10pKTsKICAgICAgICBjb25zdCBhdXRvIGZhbGxiYWNrX2IgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19iX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihiX3ZhbHVlc1trXSkpOwogICAgICAgIGZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewogICAgdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDE2LCBmcDg+OwogICAgdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDE2LCBmcDg+OwogICAgdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIHZvaWQgZXhlY3V0ZSgKICAgICAgICBmcmdfY190eXBlJiBjLAogICAgICAgIGNvbnN0IGZyZ19hX3R5cGUmIGEsCiAgICAgICAgY29uc3QgZnJnX2JfdHlwZSYgYgogICAgKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCiAgICBjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKICAgICAgICBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgIHN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGEpLAogICAgICAgICAgICBzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKICAgICAgICAgICAgc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMAogICAgICAgICkKICAgICk7CiNlbHNlCiAgICAvLyBGYWxsYmFjayBjb3BpZWQgZnJvbSBDSywgdGhpcyB3YXkgd2UgY2FuIHRlc3Qgb24gTUkyMTAuCiAgICB1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+OwogICAgY29uc3QgYXV0byYgYV92YWx1ZXMgPSBhLnRocmVhZF92YWx1ZXMoKTsKICAgIGNvbnN0IGF1dG8mIGJfdmFsdWVzID0gYi50aHJlYWRfdmFsdWVzKCk7CiAgICB1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CiAgICAgICAgY29uc3QgYXV0byBmYWxsYmFja19hID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYV90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYV92YWx1ZXNba10pKTsKICAgICAgICBjb25zdCBhdXRvIGZhbGxiYWNrX2IgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19iX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihiX3ZhbHVlc1trXSkpOwogICAgICAgIGZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7CiAgICB9KTsKI2VuZGlmCiNlbmRpZgogICAgfQp9OwoKLy8gU2VlIENETkEzIG1hbnVhbCwgNy4xLjQuMS4gSW5wdXQgbGF5b3V0Ci8vIFRoZSBjYWxjdWxhdGlvbnMgaGVyZSBhcmUgb2J0YWluZWQgdmlhIHRoZQovLyBBTUQgbWF0cml4IGluc3RydWN0aW9uIGNhbGN1bGF0b3IKLy8gaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vYW1kX21hdHJpeF9pbnN0cnVjdGlvbl9jYWxjdWxhdG9yCi8vIFRoZXJlIGlzIGEgY2xlYW5lciB3YXkgdG8gY29tcHV0ZSB0aGUgbWFwcGluZywgYnV0Ci8vIHRoaXMgaXMgd2hhdCB0aGUgdG9vbCByZXR1cm5zIGFuZCBJJ20gbGF6eS4gV2Ugb25seQovLyByZWFsbHkgbmVlZCB0aGVzZSB0d28gYW55d2F5IGZvciBub3cuCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwoKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfaW5kZXhlcjxtZm1hX2YzMl9mOF9mODwxNiwgMTYsIDMyPj4gewogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG0gPSBsYW5lICUgMTY7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwogICAgICAgIHJldHVybiB7bSwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG4gPSBsYW5lICUgMTY7CiAgICAgICAgY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwogICAgICAgIHJldHVybiB7biwga307CiAgICB9CgogICAgX19kZXZpY2VfXwogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CiAgICAgICAgY29uc3QgaW50IG0gPSA0ICogKGxhbmUgLyAxNikgKyBpdGVtOwogICAgICAgIGNvbnN0IGludCBuID0gbGFuZSAlIDE2OwogICAgICAgIHJldHVybiB7bSwgbn07CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDMyLCAzMiwgMTY+PiB7CiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbSA9IGxhbmUgJSAzMjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CiAgICAgICAgcmV0dXJuIHttLCBrfTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbiA9IGxhbmUgJSAzMjsKICAgICAgICBjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CiAgICAgICAgcmV0dXJuIHtuLCBrfTsKICAgIH0KCiAgICBfX2RldmljZV9fCiAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYyhpbnQgbGFuZSwgaW50IGl0ZW0pIHsKICAgICAgICBjb25zdCBpbnQgbiA9IDggKiAoaXRlbSAvIDQpICUgMzIgKyA0ICogKGxhbmUgLyAzMikgKyAoaXRlbSAlIDQpOwogICAgICAgIGNvbnN0IGludCBtID0gbGFuZSAlIDMyOwogICAgICAgIHJldHVybiB7biwgbX07CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8CiAgICBpbnQgYmxvY2tfc2l6ZSwKICAgIGN1YmUgYmxvY2tfdGlsZSwKICAgIGN1YmUgd2FycF90aWxlLAogICAgdHlwZW5hbWUgbG9hZF90eXBlLAogICAgYm9vbCBwaXBlbGluZWRfbWFpbl9sb29wID0gZmFsc2UsCiAgICBib29sIG1fYWxpZ25lZCA9IGZhbHNlLAogICAgYm9vbCBuX2FsaWduZWQgPSBmYWxzZSwKICAgIGJvb2wga19hbGlnbmVkID0gZmFsc2UKPgpfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKGJsb2NrX3NpemUpCnZvaWQga2VybmVsKAogICAgY29uc3QgZnA4KiBhLAogICAgY29uc3QgZnA4KiBiLAogICAgY29uc3QgZnAzMiogYXMsCiAgICBjb25zdCBmcDMyKiBicywKICAgIGJmMTYqIGMsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGsKKSB7CiAgICBjb25zdGV4cHIgaW50IHdhcnBzID0gYmxvY2tfc2l6ZSAvIHdhcnBfc2l6ZTsKCiAgICBjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9uID0gYmxvY2tfdGlsZS5uOwogICAgY29uc3RleHByIGludCBibG9ja190aWxlX2sgPSBibG9ja190aWxlLms7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gPD0gMTI4LCAiYmxvY2sgdGlsZSBNIG11c3QgYmUgc21hbGxlciB0aGFuIGJsb2Nrd2lzZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiA8PSAxMjgsICJibG9jayB0aWxlIE4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmxvY2t3aXNlIGJsb2NrIHNpemUiKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9rIDw9IDEyOCwgImJsb2NrIHRpbGUgSyBtdXN0IGJlIHNtYWxsZXIgdGhhbiBibG9ja3dpc2UgYmxvY2sgc2l6ZSIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGUubTsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlX2sgPSB3YXJwX3RpbGUuazsKCiAgICB1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CiAgICB1c2luZyBmcmdfYV90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2FfdHlwZTsKICAgIHVzaW5nIGZyZ19iX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfYl90eXBlOwogICAgdXNpbmcgZnJnX2NfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19jX3R5cGU7CiAgICB1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+OwoKICAgIGNvbnN0ZXhwciBpbnQgY190b3RhbCA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbjsKCiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9iKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CiAgICBzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CgogICAgc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSB3YXJwX3RpbGVfbSA9PSAwLCAid2FycCB0aWxlIE0gaGFzIHRvIGRpdmlkZSBibG9jayB0aWxlIE0iKTsKICAgIHN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CiAgICBzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwoKICAgIGNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbiA9IGJsb2NrX3RpbGVfbiAvIHdhcnBfdGlsZV9uOwogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVzX2sgPSBibG9ja190aWxlX2sgLyB3YXJwX3RpbGVfazsKCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW4gPSB3YXJwX3RpbGVzX20gKiB3YXJwX3RpbGVzX247CgogICAgLy8gbnVtYmVyIG9mIHdhcnAgdGlsZXMgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHdhcnBzCiAgICBjb25zdGV4cHIgaW50IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgPSBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tbiwgd2FycHM+KCk7CgogICAgY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwoKICAgIGNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CiAgICBzdGF0aWNfYXNzZXJ0KGNfcGVyX3RocmVhZCA9PSB3YXJwX3RpbGVzX21uX3Blcl93YXJwICogZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZCwgInNhbml0eSBjaGVjayIpOwoKICAgIGNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKCiAgICBjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKICAgIGNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7CgogICAgLy8gU3dhcCBkaXJlY3Rpb24gdG8gbWFrZSBib3VuZHMgY2hlY2tpbmcgYmUgZmlyc3QKICAgIGNvbnN0IGludCB0aV9tID0gZ3JpZERpbS54IC0gYmxvY2tJZHgueCAtIDE7CiAgICBjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwoKICAgIGludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgogICAgZnJnX2NfdHlwZSBibG9ja19jX2ZyZ1t3YXJwX3RpbGVzX21uX3Blcl93YXJwXTsKICAgIHVucm9sbDwwLCB3YXJwX3RpbGVzX21uX3Blcl93YXJwPihbJl08aW50IGk+IHsKICAgICAgICBibG9ja19jX2ZyZ1tpXS5jbGVhcigpOwogICAgfSk7CgogICAgX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07CiAgICBfX3NoYXJlZF9fIGZwOCBibG9ja190aWxlX2JbYmxvY2tfdGlsZV9uICogKGJsb2NrX3RpbGVfayArIDQpXTsKCiAgICBjb25zdCBhdXRvIGxvYWRfaW5wdXQgPSBbJl08Ym9vbCBjaGVja19ib3VuZHNfaz4oaW50IGkpIHsKICAgICAgICBjb25zdCBhdXRvIHJlZ3NfYSA9IGJsb2NrX3RpbGVfbG9hZF9mYXN0X2xpbmVhcjwKICAgICAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICAgICAgYmxvY2tfdGlsZV9tLAogICAgICAgICAgICBibG9ja190aWxlX2ssCiAgICAgICAgICAgIGxvYWRfdHlwZSwKICAgICAgICAgICAgbV9hbGlnbmVkLAogICAgICAgICAgICBrX2FsaWduZWQgJiYgIWNoZWNrX2JvdW5kc19rCiAgICAgICAgPigKICAgICAgICAgICAgYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaQogICAgICAgICk7CiAgICAgICAgY29uc3QgYXV0byByZWdzX2IgPSBibG9ja190aWxlX2xvYWRfZmFzdF9saW5lYXI8CiAgICAgICAgICAgIGJsb2NrX3NpemUsCiAgICAgICAgICAgIGJsb2NrX3RpbGVfbiwKICAgICAgICAgICAgYmxvY2tfdGlsZV9rLAogICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgIG5fYWxpZ25lZCwKICAgICAgICAgICAga19hbGlnbmVkICYmICFjaGVja19ib3VuZHNfawogICAgICAgID4oCiAgICAgICAgICAgIGIsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkKICAgICAgICApOwogICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihyZWdzX2EsIHJlZ3NfYik7CiAgICB9OwoKICAgIGNvbnN0IGF1dG8gbW1hID0gWyZdKGludCBpKSB7CiAgICAgICAgZnJnX2FfdHlwZSBmcmdfYVt3YXJwX3RpbGVzX21uX3Blcl93YXJwICogd2FycF90aWxlc19rXTsKICAgICAgICB1bnJvbGwxZDx3YXJwX3RpbGVzX21uX3Blcl93YXJwPihbJl08aW50IGl3dGk+IHsKICAgICAgICAgICAgY29uc3QgaW50IHd0aSA9IHdhcnAgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aTsKICAgICAgICAgICAgY29uc3QgaW50IHd0bSA9IHd0aSAlIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IHd0biA9IHd0aSAvIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgdW5yb2xsPDAsIGJsb2NrX3RpbGVfaywgd2FycF90aWxlX2s+KFsmXTxpbnQgd3RrX2Jhc2U+IHsKICAgICAgICAgICAgICAgIGNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKCiAgICAgICAgICAgICAgICB1bnJvbGw8MCwgZnJnX2FfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbWtfcmVnPiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pa10gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9hKGxhbmUsIGZyZ19hX3R5cGU6OmZpcnN0X2l0ZW1fb2ZfcmVnKG1rX3JlZykpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKICAgICAgICAgICAgICAgICAgICBmcmdfYVt3dGsgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aV0ucmVnc1tta19yZWddID0KICAgICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmYmxvY2tfdGlsZV9hW2JpayArIGJpbSAqIChibG9ja190aWxlX2sgKyA0KV0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBmcmdfYl90eXBlIGZyZ19iW3dhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiB3YXJwX3RpbGVzX2tdOwogICAgICAgIHVucm9sbDFkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnA+KFsmXTxpbnQgaXd0aT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwogICAgICAgICAgICBjb25zdCBpbnQgd3RuID0gd3RpIC8gd2FycF90aWxlc19tOwogICAgICAgICAgICB1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewogICAgICAgICAgICAgICAgY29uc3RleHByIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwoKICAgICAgICAgICAgICAgIHVucm9sbDwwLCBmcmdfYl90eXBlOjpyZWdpc3RlcnNfcGVyX3RocmVhZD4oWyZdPGludCBua19yZWc+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIFttZm1hX2luLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2IobGFuZSwgZnJnX2JfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobmtfcmVnKSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpbiA9IHd0biAqIHdhcnBfdGlsZV9uICsgbWZtYV9pbjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmlrID0gd3RrX2Jhc2UgKyBtZm1hX2lrOwogICAgICAgICAgICAgICAgICAgIGZyZ19iW3d0ayAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpXS5yZWdzW25rX3JlZ10gPQogICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZibG9ja190aWxlX2JbYmlrICsgYmluICogKGJsb2NrX3RpbGVfayArIDQpXSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIGZyZ19jX3R5cGUgd2FycF9mcmdfY1t3YXJwX3RpbGVzX21uX3Blcl93YXJwXTsKICAgICAgICB1bnJvbGw8MCwgd2FycF90aWxlc19tbl9wZXJfd2FycD4oWyZdPGludCBpPiB7CiAgICAgICAgICAgIHdhcnBfZnJnX2NbaV0uY2xlYXIoKTsKICAgICAgICB9KTsKCiAgICAgICAgdW5yb2xsMmQ8d2FycF90aWxlc19tbl9wZXJfd2FycCwgd2FycF90aWxlc19rPihbJl08aW50IGl3dGksIGludCB3dGs+IHsKICAgICAgICAgICAgbWZtYTo6ZXhlY3V0ZSgKICAgICAgICAgICAgICAgIHdhcnBfZnJnX2NbaXd0aV0sCiAgICAgICAgICAgICAgICBmcmdfYVt3dGsgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aV0sCiAgICAgICAgICAgICAgICBmcmdfYlt3dGsgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aV0KICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgdW5yb2xsMmQ8d2FycF90aWxlc19tbl9wZXJfd2FycCwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RpLCBpbnQgbW5faXRlbT4gewogICAgICAgICAgICBjb25zdCBpbnQgd3RpID0gd2FycCAqIHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKyBpd3RpOwogICAgICAgICAgICBjb25zdCBpbnQgd3RtID0gd3RpICUgd2FycF90aWxlc19tOwoKICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwogICAgICAgICAgICBjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwogICAgICAgICAgICBjb25zdCBpbnQgaW0gPSB0aV9tICogYmxvY2tfdGlsZV9tICsgYmltOwogICAgICAgICAgICBjb25zdCBpbnQgaW4gPSB0aV9uICogYmxvY2tfdGlsZV9uOyAvLyB0aWxlIG9mZnNldCBkb2Vzbid0IG1hdHRlciBoZXJlLCBvbWl0dGluZyBpdCBoZWxwcyB0aGUgb3B0aW1pemVyLgoKICAgICAgICAgICAgYmxvY2tfY19mcmdbaXd0aV0udGhyZWFkX3ZhbHVlcygpW21uX2l0ZW1dICs9IHdhcnBfZnJnX2NbaXd0aV0udGhyZWFkX3ZhbHVlcygpW21uX2l0ZW1dCiAgICAgICAgICAgICAgICAqIGFzW2kgLyAxMjggKiBtICsgaW1dCiAgICAgICAgICAgICAgICAqIGJzW2kgLyAxMjggKiBzbiArIGluIC8gMTI4XTsKICAgICAgICB9KTsKICAgIH07CgogICAgaWYgY29uc3RleHByICghcGlwZWxpbmVkX21haW5fbG9vcCkgewogICAgICAgIC8vIFJlZ3VsYXIgbWFpbiBsb29wCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewogICAgICAgICAgICBjb25zdCBhdXRvIFtyZWdzX2EsIHJlZ3NfYl0gPSBsb2FkX2lucHV0LnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oaSk7CiAgICAgICAgICAgIHdyaXRlX3RvX3NtZW08YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9tLCBibG9ja190aWxlX2ssIGxvYWRfdHlwZT4oYmxvY2tfdGlsZV9hLCByZWdzX2EuZGF0YSgpKTsKICAgICAgICAgICAgd3JpdGVfdG9fc21lbTxibG9ja19zaXplLCBibG9ja190aWxlX24sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlPihibG9ja190aWxlX2IsIHJlZ3NfYi5kYXRhKCkpOwogICAgICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICAgICAgICAgIG1tYShpKTsKICAgICAgICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUGlwZWxpbmVkIG1haW4gbG9vcAogICAgICAgIGludCBpID0gMDsKICAgICAgICBhdXRvIFtyZWdzX2EsIHJlZ3NfYl0gPSBsb2FkX2lucHV0LnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oaSk7CiAgICAgICAgd3JpdGVfdG9fc21lbTxibG9ja19zaXplLCBibG9ja190aWxlX20sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlPihibG9ja190aWxlX2EsIHJlZ3NfYS5kYXRhKCkpOwogICAgICAgIHdyaXRlX3RvX3NtZW08YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9uLCBibG9ja190aWxlX2ssIGxvYWRfdHlwZT4oYmxvY2tfdGlsZV9iLCByZWdzX2IuZGF0YSgpKTsKICAgICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICAgIGZvciAoOyBpICsgYmxvY2tfdGlsZV9rIDwgazsgaSArPSBibG9ja190aWxlX2spIHsKICAgICAgICAgICAgc3RkOjp0aWUocmVnc19hLCByZWdzX2IpID0gbG9hZF9pbnB1dC50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KGkgKyBibG9ja190aWxlX2spOwogICAgICAgICAgICBtbWEoaSk7CiAgICAgICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICAgICAgd3JpdGVfdG9fc21lbTxibG9ja19zaXplLCBibG9ja190aWxlX20sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlPihibG9ja190aWxlX2EsIHJlZ3NfYS5kYXRhKCkpOwogICAgICAgICAgICB3cml0ZV90b19zbWVtPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbiwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGU+KGJsb2NrX3RpbGVfYiwgcmVnc19iLmRhdGEoKSk7CiAgICAgICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICB9CiAgICAgICAgbW1hKGkpOwogICAgfQoKICAgIC8vIFdyaXRlIG91dCBDCiAgICAvLyBUaGlzIHNob3VsZCBhY2Nlc3MgdGlsZSBDIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBtYXRtdWwgbG9vcCEKCiAgICBjb25zdCBpbnQgaW1fYmFzZSA9IHRpX20gKiBibG9ja190aWxlX207CiAgICBjb25zdCBpbnQgaW5fYmFzZSA9IHRpX24gKiBibG9ja190aWxlX247CgogICAgY29uc3QgYm9vbCBjX2luX2JvdW5kcyA9CiAgICAgICAgKG1fYWxpZ25lZCB8fCBtICUgYmxvY2tfdGlsZV9tID09IDAgfHwgaW1fYmFzZSArIGJsb2NrX3RpbGVfbSA8PSBtKSAmJgogICAgICAgIChuX2FsaWduZWQgfHwgbiAlIGJsb2NrX3RpbGVfbiA9PSAwIHx8IGluX2Jhc2UgKyBibG9ja190aWxlX24gPD0gbik7CgogICAgc2VsZWN0KGNfaW5fYm91bmRzLCBbJl08Ym9vbCBjX2luX2JvdW5kcz4gewogICAgICAgIHVucm9sbDJkPHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0aSwgaW50IG1uX2l0ZW0+IHsKICAgICAgICAgICAgY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwoKICAgICAgICAgICAgY29uc3QgaW50IHd0aSA9IHdhcnAgKiB3YXJwX3RpbGVzX21uX3Blcl93YXJwICsgaXd0aTsKICAgICAgICAgICAgY29uc3QgaW50IHd0bSA9IHd0aSAlIHdhcnBfdGlsZXNfbTsKICAgICAgICAgICAgY29uc3QgaW50IHd0biA9IHd0aSAvIHdhcnBfdGlsZXNfbTsKCiAgICAgICAgICAgIGNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CiAgICAgICAgICAgIGNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CgogICAgICAgICAgICBjb25zdCBpbnQgaW0gPSBpbV9iYXNlICsgYmltOwogICAgICAgICAgICBjb25zdCBpbnQgaW4gPSBpbl9iYXNlICsgYmluOwoKICAgICAgICAgICAgY29uc3QgYXV0byB2YWwgPSBiZjE2X2Zyb21fZnAzMihibG9ja19jX2ZyZ1tpd3RpXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0pOwoKICAgICAgICAgICAgaWYgKGNfaW5fYm91bmRzIHx8IGltIDwgbSAmJiBpbiA8IG4pIHsKICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9ub250ZW1wb3JhbF9zdG9yZShzdGQ6OmJpdF9jYXN0PHVpbnQxNl90Pih2YWwpLCByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4oJmNbaW0gKiBuICsgaW5dKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9Cgp0ZW1wbGF0ZTwKICAgIGludCBibG9ja19zaXplLAogICAgY3ViZSBibG9ja190aWxlLAogICAgY3ViZSB3YXJwX3RpbGUsCiAgICBib29sIHBpcGVsaW5lZF9tYWluX2xvb3AgPSBmYWxzZSwKICAgIHR5cGVuYW1lIGxvYWRfdHlwZSA9IF9fdWludDEyOF90Cj4Kdm9pZCBydW5fa2VybmVsKAogICAgY29uc3QgZnA4KiBhLAogICAgY29uc3QgZnA4KiBiLAogICAgY29uc3QgZnAzMiogYXMsCiAgICBjb25zdCBmcDMyKiBicywKICAgIGJmMTYqIGMsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICBjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKICAgIGNvbnN0IGludCBncmlkX24gPSBjZWlsX2RpdihuLCBibG9ja190aWxlLm4pOwoKICAgIGhpcEV2ZW50X3Qgc3RhcnQsIHN0b3A7CiAgICBpZiAobWVhc3VyZSkgewogICAgICAgIEhJUF9DSEVDSyhoaXBFdmVudENyZWF0ZSgmc3RhcnQpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRDcmVhdGUoJnN0b3ApKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RhcnQsIDApKTsKICAgIH0KCiAgICAvLyBzZWxlY3QobSAlIGJsb2NrX3RpbGUubSA9PSAwLCBbJl08Ym9vbCBtX2FsaWduZWQ+IHsKICAgIC8vICAgICBzZWxlY3QobiAlIGJsb2NrX3RpbGUubiA9PSAwLCBbJl08Ym9vbCBuX2FsaWduZWQ+IHsKICAgIC8vICAgICAgICAgc2VsZWN0KGsgJSBibG9ja190aWxlLmsgPT0gMCwgWyZdPGJvb2wga19hbGlnbmVkPiB7CiAgICAgICAgICAgICAgICBrZXJuZWw8CiAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlLAogICAgICAgICAgICAgICAgICAgIHdhcnBfdGlsZSwKICAgICAgICAgICAgICAgICAgICBsb2FkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmVkX21haW5fbG9vcCwKICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gbV9hbGlnbmVkLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBuX2FsaWduZWQsCiAgICAgICAgICAgICAgICAgICAgZmFsc2UgIC8vIGtfYWxpZ25lZAogICAgICAgICAgICAgICAgPjw8PAogICAgICAgICAgICAgICAgICAgIGRpbTMoZ3JpZF9tLCBncmlkX24pLAogICAgICAgICAgICAgICAgICAgIGRpbTMoYmxvY2tfc2l6ZSksCiAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgPj4+KAogICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgICAgICBhcywKICAgICAgICAgICAgICAgICAgICBicywKICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgIG0sCiAgICAgICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICAgICBrCiAgICAgICAgICAgICAgICApOwogICAgLy8gICAgICAgICB9KTsKICAgIC8vICAgICB9KTsKICAgIC8vIH0pOwoKICAgIEhJUF9DSEVDSyhoaXBHZXRMYXN0RXJyb3IoKSk7CgogICAgaWYgKG1lYXN1cmUpIHsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRSZWNvcmQoc3RvcCwgMCkpOwogICAgICAgIEhJUF9DSEVDSyhoaXBEZXZpY2VTeW5jaHJvbml6ZSgpKTsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRTeW5jaHJvbml6ZShzdG9wKSk7CgogICAgICAgIGZsb2F0IG1zID0gMDsKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnRFbGFwc2VkVGltZSgmbXMsIHN0YXJ0LCBzdG9wKSk7CiAgICAgICAgY29uc3QgZG91YmxlIHRpbWUgPSBtcyAvIDEnMDAwLjA7CgogICAgICAgIGNvbnN0IGRvdWJsZSBtZW1vcnkgPSBtICogayAqIHNpemVvZihmcDgpICsgbiAqIGsgKiBzaXplb2YoZnA4KSArIG0gKiBuICogc2l6ZW9mKGJmMTYpOwogICAgICAgIGNvbnN0IGRvdWJsZSBvcHMgPQogICAgICAgICAgICBkb3VibGUobSkgKiBuICogayAqIDIgLy8gTXVsdGlwbHkgKyBhZGQgZm9yIGVhY2ggcGFpcgogICAgICAgICAgICArIChkb3VibGUobSkgKiBuICogMikgKiBjZWlsX2RpdihrLCB3YXJwX3RpbGUuayk7IC8vIHNjYWxpbmcKCiAgICAgICAgY29uc3QgZG91YmxlIG1lbW9yeV90cHV0ID0gbWVtb3J5IC8gdGltZSAvICgxMDAwLjAgKiAxMDAwICogMTAwMCk7CiAgICAgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfdHB1dCA9IG9wcyAvIHRpbWUgLyAoMTAwMC4wICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKCiAgICAgICAgc3RkOjpjZXJyCiAgICAgICAgICAgIDw8IHN0ZDo6Zml4ZWQKICAgICAgICAgICAgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikKICAgICAgICAgICAgPDwgIigiIDw8IG0gPDwgIiAiIDw8IG4gPDwgIiAiIDw8IGsgPDwgIikgIgogICAgICAgICAgICA8PCAiKCIgPDwgYmxvY2tfdGlsZS5tIDw8ICIgIiA8PCBibG9ja190aWxlLm4gPDwgIiAiIDw8IGJsb2NrX3RpbGUuayA8PCAiKSAiCiAgICAgICAgICAgIDw8ICIoIiA8PCB3YXJwX3RpbGUubSA8PCAiICIgPDwgd2FycF90aWxlLm4gPDwgIiAiIDw8IHdhcnBfdGlsZS5rIDw8ICIpICIKICAgICAgICAgICAgPDwgcGlwZWxpbmVkX21haW5fbG9vcCA8PCAiICIKICAgICAgICAgICAgPDwgYmxvY2tfc2l6ZSA8PCAiOiAiCiAgICAgICAgICAgIDw8IG1zIDw8ICIgbXMgIgogICAgICAgICAgICA8PCAodGltZSAqIDEnMDAwJzAwMCkgPDwgIiB1cyAiCiAgICAgICAgICAgIDw8IG1lbW9yeV90cHV0IDw8ICIgR0IvcyAiCiAgICAgICAgICAgIDw8IGNvbXB1dGVfdHB1dCA8PCAiIFRGTE9QUyIKICAgICAgICAgICAgPDwgc3RkOjplbmRsOwoKICAgICAgICBISVBfQ0hFQ0soaGlwRXZlbnREZXN0cm95KHN0YXJ0KSk7CiAgICAgICAgSElQX0NIRUNLKGhpcEV2ZW50RGVzdHJveShzdG9wKSk7CiAgICB9Cn0KCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgbSwKICAgIGludCBuLAogICAgaW50IGssCiAgICBib29sIG1lYXN1cmUKKSB7CiAgICAvLyBJbiB0aGUga2VybmVscyB3ZSBhc3N1bWUgMTI4LWJpdCBhbGlnbm1lbnQuCiAgICBhc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKICAgIGFzc2VydChiX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwogICAgYXNzZXJ0KGNfcHRyICUgMTYgPT0gMCk7CgogICAgY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwogICAgYXV0byogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGNfcHRyKTsKCiAgICAvKgogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCA2NH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCA2NCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCA2NH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXsxNiwgMTYsIDMyfSwgZmFsc2U+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CgogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwoKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgZmFsc2U+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7CiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCBmYWxzZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKCiAgICBydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKICAgIHJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgKi8KCiAgICAvLyBydW5fa2VybmVsPDI1NiwgY3ViZXs2NCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwogICAgcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgZmFsc2U+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KClBZQklORDExX01PRFVMRShmcDgsIG0pIHsKICBtLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCJdLAogICAgYnVpbGRfZGlyZWN0b3J5PSIvd29ya3NwYWNlL2J1aWxkLyIgaWYgVEVTVElORyA9PSAidnNjb2RlIiBlbHNlICIvZ3B1bW9kZS9hbWQvZnA4L2J1aWxkLyIgaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIE5vbmUsCiAgICAjbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgpmaXJzdCA9IFRydWUKCmNhY2hlX20gPSAwCmNhY2hlX24gPSAwCmNhY2hlX2sgPSAwCmNhY2hlX2kgPSAwCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgZ2xvYmFsIGNhY2hlX20KICAgIGdsb2JhbCBjYWNoZV9uCiAgICBnbG9iYWwgY2FjaGVfawogICAgZ2xvYmFsIGNhY2hlX2kKCiAgICBpZiBjYWNoZV9tICE9IG0gb3IgY2FjaGVfbiAhPSBuIG9yIGNhY2hlX2sgIT0gazoKICAgICAgICBjYWNoZV9tID0gbQogICAgICAgIGNhY2hlX24gPSBuCiAgICAgICAgY2FjaGVfayA9IGsKICAgICAgICBjYWNoZV9pID0gMAogICAgZWxzZToKICAgICAgICBjYWNoZV9pICs9IDEKCiAgICAjIERvbid0IGNoZWNrIHRoZSBwZXJmb3JtYW5jZSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHRvIGFsbG93IGZvciBzb21lIHdhcm11cAogICAgbWVhc3VyZSA9IEZhbHNlCiAgICBpZiBjYWNoZV9pID09IDE6CiAgICAgICAgbWVhc3VyZSA9IFRydWUKCiAgICBoaXBfbW9kdWxlLmZwOCgKICAgICAgICBhLmRhdGFfcHRyKCksCiAgICAgICAgYi5kYXRhX3B0cigpLAogICAgICAgIGFfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBiX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYy5kYXRhX3B0cigpLAogICAgICAgIG0sCiAgICAgICAgbiwKICAgICAgICBrLAogICAgICAgIG1lYXN1cmUKICAgICkKCiAgICByZXR1cm4gYwo=
No newline at end of file

Best evidence level for this revision: reported

JSON