Skip to content
KernelIndex
Search⌘K

submission 27020

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-27020?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
33.1µs
#1 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
34.0µs
#4 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
48.1µs
#6 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
72.7µs
#24 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
80.8µs
#26 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
87.2µs
#18 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
90.0µs
#19 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
96.0µs
#18 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
105.7µs
#19 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
107.4µs
#20 of 98
2025-05-25
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
141.8µs
#9 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
148.4µs
#12 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
159.7µs
#28 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
173.4µs
#14 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
276.8µs
#25 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
375.0µs
#25 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
412.4µs
#25 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
935.9µs
#32 of 98
2025-05-25

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:a30e63a32191faf0b80ad7738e07633fc6d31f062c64e4a11090ca339823d438
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

fp8_gemm.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgojZGVmaW5lIFggY29uc3RleHByCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgQApkbyBACnsgQApoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyBACmlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpIEAKeyBACnN0ZDo6Y2VyciA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiBACjw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKPDwgJzonIDw8IF9fTElORV9fIDw8ICdAbic7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApleGl0KGVycm9yKTsgQAp9IEAKfSBACndoaWxlKGZhbHNlKQp1c2luZyBmcDggPSBfX2hpcF9mcDhfZTRtM19mbnV6Owp1c2luZyBiZjE2ID0gX19oaXBfYmZsb2F0MTY7CnVzaW5nIGZwMzIgPSBmbG9hdDsKdXNpbmcgZnAzMng0ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKdXNpbmcgaTMyeDQgPSBpbnQzMl90IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CnN0cnVjdCBjdWJlIHsKaW50IG0sIG4sIGs7Cn07ClggaW50IHdhcnBfc2l6ZSA9IDY0OwpYIGludCBjYWNoZV9saW5lX3NpemUgPSAxMjg7ClggaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpYIGludCBuX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKWCBpbnQga19ibG9ja19zaXplX211bHRpcGxlID0gMTI4Owp1c2luZyByZWdpc3Rlcl90eXBlID0gdWludDMyX3Q7CnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpYIGF1dG8gY2VpbF9kaXYoVCBhLCBVIGIpIHsKcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KWCBhdXRvIGRpdmlkZV9leGFjdCgpIHsKc3RhdGljX2Fzc2VydChhICUgYiA9PSAwLCAiZG9lcyBub3QgZGl2aWRlIGV4YWN0ISIpOwpyZXR1cm4gYSAvIGI7Cn0KdGVtcGxhdGU8aW50IGluYywgaW50IGFkZCwgdHlwZW5hbWUgc2VxPgpzdHJ1Y3QgbXVsdGlwbHlfYnlfaW5jOwp0ZW1wbGF0ZTxpbnQgaW5jLCBpbnQgYWRkLCBpbnQuLi4gSXM+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM8aW5jLCBhZGQsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxpbnQsIElzLi4uPj4gewp1c2luZyB0eXBlID0gc3RkOjppbnRlZ2VyX3NlcXVlbmNlPGludCwgKGluYyAqIElzICsgYWRkKS4uLj47Cn07CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYywgaW50Li4uIElzPgpzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXIgewp1c2luZyB0eXBlID0gdHlwZW5hbWUgbXVsdGlwbHlfYnlfaW5jPGluYywgSSwgc3RkOjptYWtlX2ludGVnZXJfc2VxdWVuY2U8aW50LCAoTiAtIEkpIC8gaW5jPj46OnR5cGU7Cn07CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYz4KdXNpbmcgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luYyA9IHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2Vfd2l0aF9pbmNfaGVscGVyPEksIE4sIGluYz46OnR5cGU7CnRlbXBsYXRlPHR5cGVuYW1lIEYsIGludC4uLiBJcz4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGxfYXBwbHkoRiBmLCBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCBJcy4uLj4pIHsKKGYudGVtcGxhdGUgb3BlcmF0b3IoKTxJcz4oKSwgLi4uKTsKfQp0ZW1wbGF0ZTxpbnQgSSwgaW50IE4sIGludCBpbmMgPSAxLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbChGIGYpIHsKdW5yb2xsX2FwcGx5KGYsIG1ha2VfaW5kZXhfc2VxdWVuY2Vfd2l0aF9pbmM8SSwgTiwgaW5jPnt9KTsKfQp0ZW1wbGF0ZTxpbnQgSSwgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwxZChGIGYpIHsKdW5yb2xsPDAsIEk+KGYpOwp9CnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewp1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CmYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwp9KTsKfSk7Cn0KdGVtcGxhdGU8aW50IEksIGludCBKLCBpbnQgSywgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwzZChGIGYpIHsKdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewp1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CnVucm9sbDwwLCBLPihbJl08aW50IGs+IHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGosIGs+KCk7Cn0pOwp9KTsKfSk7Cn0KdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIGNsZWFyKFQgKCZhcnJheSlbTl0pIHsKdW5yb2xsPDAsIE4+KFsmXTxpbnQgaT4gewphcnJheVtpXSA9IFR7MH07Cn0pOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmJmMTYgYmYxNl9mcm9tX2ZwMzIoZmxvYXQgeCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxiZjE2PigKc3RhdGljX2Nhc3Q8dWludDE2X3Q+KApzdGQ6OmJpdF9jYXN0PHVpbnQzMl90Pih4KSA+PiAxNgopCik7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KZnAzMiBmcDMyX2Zyb21fZnA4KGZwOCB4KSB7CiNpZmRlZiBfX2dmeDk0Ml9fCnJldHVybiBmbG9hdCh4KTsKI2Vsc2UKcmV0dXJuIGZsb2F0KHgpOwojZW5kaWYKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzZWxlY3QoYm9vbCBjb25kLCBGIGYpIHsKaWYgKGNvbmQpIHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KCk7Cn0gZWxzZSB7CmYudGVtcGxhdGUgb3BlcmF0b3IoKTxmYWxzZT4oKTsKfQp9CnRlbXBsYXRlPGludCBkcHBfY3RybCwgaW50IHJvd19tYXNrID0gMHhmLCBpbnQgYmFua19tYXNrID0gMHhmLCBib29sIGJvdW5kX2N0cmwgPSBmYWxzZT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KdWludDMyX3Qgc2hmbF9kcHAodWludDMyX3QgeCkgewpyZXR1cm4gX19idWlsdGluX2FtZGdjbl91cGRhdGVfZHBwKHgsIHgsIGRwcF9jdHJsLCByb3dfbWFzaywgYmFua19tYXNrLCBib3VuZF9jdHJsKTsKfQp0ZW1wbGF0ZTxpbnQgbGFuZV9zdHJpZGU+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnVpbnQzMl90IHRyYW5zcG9zZV80eDRfZjhfdjIodWludDMyX3QgaW5wdXQpIHsKc3RhdGljX2Fzc2VydChsYW5lX3N0cmlkZSA8IHdhcnBfc2l6ZSAvIDQsICJsYW5lIHN0cmlkZSBpcyB0b28gbGFyZ2UiKTsKc3RhdGljX2Fzc2VydCgobGFuZV9zdHJpZGUgJiAobGFuZV9zdHJpZGUgLSAxKSkgPT0gMCwgImxpbmUgc3RyaWRlIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIiKTsKc3RhdGljX2Fzc2VydChsYW5lX3N0cmlkZSA9PSAxLCAiRFBQIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGxhbmVfc3RyaWRlID09IDEiKTsKY29uc3QgYXV0byBsYW5lID0gX19sYW5lX2lkKCk7CmNvbnN0IGF1dG8gZ3JvdXBfbGFuZV9pbmRleCA9IGxhbmUgLyBsYW5lX3N0cmlkZSAlIDQ7CmNvbnN0IGF1dG8gdDJ4MiA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKc2hmbF9kcHA8MGIxMCcxMScwMCcwMT4oaW5wdXQpLAppbnB1dCwKZ3JvdXBfbGFuZV9pbmRleCAlIDIgPT0gMAo/IDB4MDYnMDInMDQnMDAKOiAweDAzJzA3JzAxJzA1Cik7CmNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKc2hmbF9kcHA8MGIwMScwMCcxMScxMD4odDJ4MiksCnQyeDIsCmdyb3VwX2xhbmVfaW5kZXggPCAyCj8gMHgwNScwNCcwMScwMAo6IDB4MDMnMDInMDcnMDYKKTsKcmV0dXJuIHQ0eDQ7Cn0KX19kZXZpY2VfXyB1aW50OF90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmk4Iik7Cl9fZGV2aWNlX18gdWludDE2X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxNihpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkxNiIpOwpfX2RldmljZV9fIHVpbnQzMl90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iMzIoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pMzIiKTsKX19kZXZpY2VfXyB1aW50NjRfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTY0Iik7Cl9fZGV2aWNlX18gX191aW50MTI4X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxMjgoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pMTI4Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I4KHVpbnQ4X3QgdmRhdGEsIGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLnN0b3JlLmk4Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxNih1aW50MTZfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTE2Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMih1aW50MzJfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTMyIik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I2NCh1aW50NjRfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTY0Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxMjgoX191aW50MTI4X3QgdmRhdGEsIGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLnN0b3JlLmkxMjgiKTsKZW51bSBjbGFzcyBjb2hlcmVuY3kgewpjYWNoZV9hbGwgPSAwLApjYWNoZV9nbG9iYWwgPSAxLApjYWNoZV9zdHJlYW0gPSAyLApub25fdGVtcG9yYWwgPSAzCn07CnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgYnVmZmVyIHsKc3RydWN0IGJ1ZmZlcl9yZXNvdXJjZSB7CmNvbnN0IHZvaWQqIHB0cjsKdWludDMyX3QgcmFuZ2U7CnVpbnQzMl90IGNvbmZpZzsKfTsKdXNpbmcgZWxlbV90eXBlID0gc3RkOjpyZW1vdmVfY3ZfdDxUPjsKYnVmZmVyX3Jlc291cmNlIHJzcmM7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmJ1ZmZlcihUKiBwb2ludGVyLCB1aW50MzJfdCBzaXplKSB7CnRoaXMtPnJzcmMgPSBidWZmZXJfcmVzb3VyY2V7CnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBvaW50ZXIpLApzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSAqIHNpemVvZihlbGVtX3R5cGUpKSwKMHgwMDAyMDAwMFUKfTsKfQp0ZW1wbGF0ZTxzaXplX3QgTiwgY29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbD4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+IGxvYWQoCnVpbnQzMl90IHdhdmVfb2Zmc2V0LAp1aW50MzJfdCB0aHJlYWRfb2Zmc2V0LApib29sIGluX2JvdW5kcyA9IHRydWUKKSBjb25zdCB7CnVzaW5nIHJlc3VsdF90eXBlID0gc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+OwpYIGNvbnN0IGludCBsb2FkX3NpemUgPSBzaXplb2YoZWxlbV90eXBlKSAqIE47CndhdmVfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ID0gaW5fYm91bmRzID8gdGhyZWFkX29mZnNldCA6IDB4RkZGRidGRkZGOwpjb25zdCBpbnQgY2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGMpOwppZiBYIChsb2FkX3NpemUgPT0gMSkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2I4KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgWCAobG9hZF9zaXplID09IDIpIHsKcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8cmVzdWx0X3R5cGU+KGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iMTYoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBYIChsb2FkX3NpemUgPT0gNCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMigKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIGlmIFggKGxvYWRfc2l6ZSA9PSA4KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgWCAobG9hZF9zaXplID09IDE2KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjEyOCgKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIHsKc3RhdGljX2Fzc2VydChsb2FkX3NpemUgPT0gLTEsICJsb2FkIHNpemUgbm90IGltcGxlbWVudGVkIik7Cn0KfQp0ZW1wbGF0ZTxjb2hlcmVuY3kgYyA9IGNvaGVyZW5jeTo6Y2FjaGVfYWxsLCBzaXplX3QgTj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzdG9yZSgKY29uc3Qgc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+JiBkYXRhLAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3QgewpYIGNvbnN0IGludCBzdG9yZV9zaXplID0gc2l6ZW9mKGVsZW1fdHlwZSkgKiBOOwp3YXZlX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCA9IGluX2JvdW5kcyA/IHRocmVhZF9vZmZzZXQgOiAweEZGRkYnRkZGRjsKY29uc3QgaW50IGNjID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKaWYgWCAoc3RvcmVfc2l6ZSA9PSAxKSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjgoCnN0ZDo6Yml0X2Nhc3Q8dWludDhfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gMikgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxNigKc3RkOjpiaXRfY2FzdDx1aW50MTZfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gNCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMigKc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gOCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I2NCgKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gMTYpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iMTI4KApzdGQ6OmJpdF9jYXN0PF9fdWludDEyOF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgewpzdGF0aWNfYXNzZXJ0KHN0b3JlX3NpemUgPT0gLTEsICJzdG9yZSBzaXplIG5vdCBpbXBsZW1lbnRlZCIpOwp9Cn0KdGVtcGxhdGU8Y29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbD4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzdG9yZSgKY29uc3QgZWxlbV90eXBlJiBkYXRhLAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3QgewpzdG9yZTxjPigKc3RkOjphcnJheTxlbGVtX3R5cGUsIDE+KHtkYXRhfSksCndhdmVfb2Zmc2V0LAp0aHJlYWRfb2Zmc2V0LAppbl9ib3VuZHMKKTsKfQp9Owp0ZW1wbGF0ZTwKaW50IGJsb2NrX3NpemUsCmludCBibG9ja190aWxlX20sCmludCBibG9ja190aWxlX24sCnR5cGVuYW1lIGxvYWRfdHlwZSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UKPgpzdHJ1Y3QgYmxvY2tfbG9hZGVyOwp0ZW1wbGF0ZTwKaW50IGJsb2NrX3NpemUsCmludCBibG9ja190aWxlX20sCmludCBibG9ja190aWxlX24sCnR5cGVuYW1lIGxvYWRfdHlwZQo+CnN0cnVjdCBibG9ja19sb2FkZXI8YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9tLCBibG9ja190aWxlX24sIGxvYWRfdHlwZSwgdHJ1ZT4gewpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAlIHNpemVvZihsb2FkX3R5cGUpID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IGxvYWQgdHlwZSBzaXplIik7Clggc3RhdGljIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwpzdGF0aWNfYXNzZXJ0KHRvdGFsX2xvYWRzICUgYmxvY2tfc2l6ZSA9PSAwLCAidG90YWwgYW1vdW50IG9mIGxvYWRzIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpYIHN0YXRpYyBpbnQgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGVfbSAvIHNpemVvZihsb2FkX3R5cGUpOwpYIHN0YXRpYyBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKWCBzdGF0aWMgaW50IGdyb3VwX3NpemUgPSA0OyAvLyBDb2luY2lkZXMgd2l0aCA0eDQgdHJhbnNwb3NlLgp1c2luZyBmcmdfdHlwZSA9IHN0ZDo6YXJyYXk8bG9hZF90eXBlLCBsb2Fkc19wZXJfdGhyZWFkPjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGZyZ190eXBlIGxvYWRfZnJvbV9nbG9iYWwoCmNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCmludCBtLAppbnQgbiwKaW50IGJsb2NrX29mZl9tLAppbnQgYmxvY2tfb2ZmX24KKSB7CmNvbnN0IGF1dG8gb2Zmc2V0ID0gYmxvY2tfb2ZmX24gKiBtICsgYmxvY2tfb2ZmX207CmNvbnN0IGF1dG8gYnVmID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2NrX3RpbGVfc3JjKSwgbSAqIG4pOwpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CmZyZ190eXBlIHJlc3VsdDsKdW5yb2xsPDAsIGxvYWRzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaj4gewpjb25zdCBpbnQgaSA9IGogKiBibG9ja19zaXplICsgdGlkOwpjb25zdCBpbnQgZ3JvdXBfaW5kZXggPSBpICUgZ3JvdXBfc2l6ZTsKY29uc3QgaW50IGdyb3VwX2JhbmsgPSBpIC8gZ3JvdXBfc2l6ZTsKY29uc3QgaW50IHJvdyA9IGdyb3VwX2JhbmsgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwpjb25zdCBpbnQgY29sID0gZ3JvdXBfaW5kZXggKyBncm91cF9iYW5rIC8gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSAqIGdyb3VwX3NpemU7CmNvbnN0IGludCBzcmNfb2ZmID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBjb2wgKiBtOwpjb25zdCBpbnQgc3JjX3JvdyA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgYmxvY2tfb2ZmX207CmNvbnN0IGludCBzcmNfY29sID0gY29sICsgYmxvY2tfb2ZmX247CmNvbnN0IGJvb2wgaW5fYm91bmRzID0gc3JjX3JvdyA8IG0gJiYgc3JjX2NvbCA8IG47CmNvbnN0IGF1dG8gd29yZCA9IGJ1Zi50ZW1wbGF0ZSBsb2FkPHNpemVvZihsb2FkX3R5cGUpPihvZmZzZXQsIHNyY19vZmYsIGluX2JvdW5kcyk7CnJlc3VsdFtqXSA9IHN0ZDo6Yml0X2Nhc3Q8bG9hZF90eXBlPih3b3JkKTsKfSk7CnJldHVybiByZXN1bHQ7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIHZvaWQgc3RvcmVfdG9fc21lbSgKZnA4KiBibG9ja190aWxlX2RzdCwKZnJnX3R5cGUgdGhyZWFkX3NyYywKaW50IG0sCmludCBuLAppbnQgYmxvY2tfb2ZmX20sCmludCBibG9ja19vZmZfbgopIHsKY29uc3QgaW50IHRpZCA9IHRocmVhZElkeC54Owp1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CmNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CmNvbnN0IGludCBncm91cF9pbmRleCA9IGkgJSBncm91cF9zaXplOwpjb25zdCBpbnQgZ3JvdXBfYmFuayA9IGkgLyBncm91cF9zaXplOwpjb25zdCBpbnQgcm93ID0gZ3JvdXBfYmFuayAlIGxvYWRzX3Blcl9ibG9ja190aWxlX207CmNvbnN0IGludCBjb2wgPSBncm91cF9pbmRleCArIGdyb3VwX2JhbmsgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tICogZ3JvdXBfc2l6ZTsKYXV0byogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmxvY2tfdGlsZV9kc3QpOwpjb25zdCBhdXRvIHNyYyA9IHN0ZDo6Yml0X2Nhc3Q8c3RkOjphcnJheTx1aW50MzJfdCwgND4+KHRocmVhZF9zcmNbal0pOwpYIGludCBsYW5lX3N0cmlkZSA9IDE7IC8vbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKdW5yb2xsPDAsIHNpemVvZihsb2FkX3R5cGUpLCBzaXplb2YodWludDMyX3QpPihbJl08aW50IGs+IHsKY29uc3QgaW50IGRzdF9yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGs7CmNvbnN0IGludCBkc3RfY29sID0gY29sOwphdXRvIHYgPSBzcmNbayAvIHNpemVvZih1aW50MzJfdCldOwp2ID0gdHJhbnNwb3NlXzR4NF9mOF92MjxsYW5lX3N0cmlkZT4odik7CmNvbnN0IGF1dG8gZ3JvdXBfbGFuZV9pbmRleCA9IF9fbGFuZV9pZCgpIC8gbGFuZV9zdHJpZGUgJSA0OwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZkc3RbKGRzdF9jb2wgLSBkc3RfY29sICUgNCkgKyAoZHN0X3JvdyArIGdyb3VwX2xhbmVfaW5kZXgpICogKGJsb2NrX3RpbGVfbiArIDQpXSkKPSB2Owp9KTsKfSk7Cn0KfTsKdGVtcGxhdGUgPGludCB3YXJwX3RpbGVfbV8sIGludCB3YXJwX3RpbGVfbl8sIHR5cGVuYW1lIFQ+CnN0cnVjdCBtZm1hX2ZyYWdtZW50IHsKdXNpbmcgdHlwZSA9IFQ7Clggc3RhdGljIGNvbnN0IGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZV9tXzsKWCBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9uID0gd2FycF90aWxlX25fOwpYIHN0YXRpYyBjb25zdCBpbnQgdG90YWxfaXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwpYIHN0YXRpYyBjb25zdCBpbnQgaXRlbXNfcGVyX3RocmVhZCA9IGRpdmlkZV9leGFjdDx0b3RhbF9pdGVtcywgd2FycF9zaXplPigpOwpYIHN0YXRpYyBjb25zdCBpbnQgcmVnaXN0ZXJzX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8aXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKSwgc2l6ZW9mKHJlZ2lzdGVyX3R5cGUpPigpOwpYIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNfcGVyX3RocmVhZCA9IGl0ZW1zX3Blcl90aHJlYWQgKiBzaXplb2YoVCk7CnJlZ2lzdGVyX3R5cGUgcmVnc1tyZWdpc3RlcnNfcGVyX3RocmVhZF07Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fClggc3RhdGljIG1mbWFfZnJhZ21lbnQgemVybygpIHsKcmV0dXJuIG1mbWFfZnJhZ21lbnR7e319Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSB7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSBjb25zdCB7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwp9CnRlbXBsYXRlPHR5cGVuYW1lIFU+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4mIHJlZ3NfYXMoKSB7CnN0YXRpY19hc3NlcnQoYnl0ZXNfcGVyX3RocmVhZCAlIHNpemVvZihVKSA9PSAwLCAidG90YWwgYnl0ZXMgaW4gdGhyZWFkIGZyYWdtZW50IG5vdCBkaXZpc2libGUgYnkgVSIpOwpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjphcnJheTxVLCBieXRlc19wZXJfdGhyZWFkIC8gc2l6ZW9mKFUpPio+KCZ0aGlzLT5yZWdzKTsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBVPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpjb25zdCBzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+JiByZWdzX2FzKCkgY29uc3QgewpzdGF0aWNfYXNzZXJ0KGJ5dGVzX3Blcl90aHJlYWQgJSBzaXplb2YoVSkgPT0gMCwgInRvdGFsIGJ5dGVzIGluIHRocmVhZCBmcmFnbWVudCBub3QgZGl2aXNpYmxlIGJ5IFUiKTsKcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4qPigmdGhpcy0+cmVncyk7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBjbGVhcigpIHsKdW5yb2xsPDAsIHJlZ2lzdGVyc19wZXJfdGhyZWFkPihbJl08aW50IGk+IHsKdGhpcy0+cmVnc1tpXSA9IDA7Cn0pOwp9CnN0YXRpYyBYIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CnJldHVybiByZWcgKiBzaXplb2YocmVnaXN0ZXJfdHlwZSk7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDE2LCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAowLAowLAowCikKKTsKfQp9Owp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODsKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDMyLCBmcDg+Owp1c2luZyBmcmdfYl90eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMzIsIGZwOD47CnVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBleGVjdXRlKApmcmdfY190eXBlJiBjLApjb25zdCBmcmdfYV90eXBlJiBhLApjb25zdCBmcmdfYl90eXBlJiBiCikgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwpjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCnN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCnVzaW5nIGZhbGxiYWNrX21mbWEgPSBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND47CmNvbnN0IGF1dG8mIGFfdmFsdWVzID0gYS50aHJlYWRfdmFsdWVzKCk7CmNvbnN0IGF1dG8mIGJfdmFsdWVzID0gYi50aHJlYWRfdmFsdWVzKCk7CnVucm9sbDwwLCBmcmdfYV90eXBlOjppdGVtc19wZXJfdGhyZWFkPihbJl08aW50IGs+IHsKY29uc3QgYXV0byBmYWxsYmFja19hID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYV90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYV92YWx1ZXNba10pKTsKY29uc3QgYXV0byBmYWxsYmFja19iID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYl90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYl92YWx1ZXNba10pKTsKZmFsbGJhY2tfbWZtYTo6ZXhlY3V0ZShjLCBmYWxsYmFja19hLCBmYWxsYmFja19iKTsKfSk7CiNlbmRpZgojZW5kaWYKfQp9Owp0ZW1wbGF0ZTw+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODwzMiwgMzIsIDE2PiB7CnVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDE2LCBmcDg+Owp1c2luZyBmcmdfY190eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMzIsIGZsb2F0PjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIHZvaWQgZXhlY3V0ZSgKZnJnX2NfdHlwZSYgYywKY29uc3QgZnJnX2FfdHlwZSYgYSwKY29uc3QgZnJnX2JfdHlwZSYgYgopIHsKI2lmZGVmIF9fSElQX0RFVklDRV9DT01QSUxFX18KI2lmZGVmIF9fZ2Z4OTQyX18KYyA9IHN0ZDo6Yml0X2Nhc3Q8ZnJnX2NfdHlwZT4oCl9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYSksCnN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGIpLApzdGQ6OmJpdF9jYXN0PGZwMzJ4MTY+KGMpLAowLAowLAowCikKKTsKI2Vsc2UKdXNpbmcgZmFsbGJhY2tfbWZtYSA9IG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPjsKY29uc3QgYXV0byYgYV92YWx1ZXMgPSBhLnRocmVhZF92YWx1ZXMoKTsKY29uc3QgYXV0byYgYl92YWx1ZXMgPSBiLnRocmVhZF92YWx1ZXMoKTsKdW5yb2xsPDAsIGZyZ19hX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaz4gewpjb25zdCBhdXRvIGZhbGxiYWNrX2EgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19hX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihhX3ZhbHVlc1trXSkpOwpjb25zdCBhdXRvIGZhbGxiYWNrX2IgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19iX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihiX3ZhbHVlc1trXSkpOwpmYWxsYmFja19tZm1hOjpleGVjdXRlKGMsIGZhbGxiYWNrX2EsIGZhbGxiYWNrX2IpOwp9KTsKI2VuZGlmCiNlbmRpZgp9Cn07Ci8vIFRoZSBjYWxjdWxhdGlvbnMgaGVyZSBhcmUgb2J0YWluZWQgdmlhIHRoZQovLyBBTUQgbWF0cml4IGluc3RydWN0aW9uIGNhbGN1bGF0b3IKLy8gaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vYW1kX21hdHJpeF9pbnN0cnVjdGlvbl9jYWxjdWxhdG9yCi8vIFRoZXJlIGlzIGEgY2xlYW5lciB3YXkgdG8gY29tcHV0ZSB0aGUgbWFwcGluZywgYnV0Ci8vIHRoaXMgaXMgd2hhdCB0aGUgdG9vbCByZXR1cm5zIGFuZCBJJ20gbGF6eS4gV2Ugb25seQovLyByZWFsbHkgbmVlZCB0aGVzZSB0d28gYW55d2F5IGZvciBub3cuCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+PiB7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBYIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IGl0ZW0pIHsKY29uc3QgaW50IG0gPSBsYW5lICUgMTY7CmNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMTYpICsgaXRlbTsKcmV0dXJuIHttLCBrfTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgWCBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gbGFuZSAlIDE2Owpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIGl0ZW07CnJldHVybiB7biwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIFggc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIGl0ZW07CmNvbnN0IGludCBuID0gbGFuZSAlIDE2OwpyZXR1cm4ge20sIG59Owp9Cn07CnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4+IHsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIFggc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9hKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IGxhbmUgJSAzMjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAzMikgKyBpdGVtOwpyZXR1cm4ge20sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBYIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IGl0ZW0pIHsKY29uc3QgaW50IG4gPSBsYW5lICUgMzI7CmNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgaXRlbTsKcmV0dXJuIHtuLCBrfTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgWCBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gOCAqIChpdGVtIC8gNCkgJSAzMiArIDQgKiAobGFuZSAvIDMyKSArIChpdGVtICUgNCk7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpyZXR1cm4ge24sIG19Owp9Cn07CnRlbXBsYXRlIDwKaW50IGJsb2NrX3NpemUsCmN1YmUgYmxvY2tfdGlsZSwKY3ViZSB3YXJwX3RpbGUsCnR5cGVuYW1lIGxvYWRfdHlwZSwKaW50IHBpcGVsaW5lX2RlcHRoID0gMSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlCj4KX19nbG9iYWxfXyBfX2xhdW5jaF9ib3VuZHNfXyhibG9ja19zaXplKQp2b2lkIGtlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgawopIHsKWCBpbnQgd2FycHMgPSBibG9ja19zaXplIC8gd2FycF9zaXplOwpYIGludCBibG9ja190aWxlX20gPSBibG9ja190aWxlLm07ClggaW50IGJsb2NrX3RpbGVfbiA9IGJsb2NrX3RpbGUubjsKWCBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwpYIGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZS5tOwpYIGludCB3YXJwX3RpbGVfbiA9IHdhcnBfdGlsZS5uOwpYIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwpYIGludCBjX3RvdGFsID0gYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9uOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2IpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKc3RhdGljX2Fzc2VydChjX3RvdGFsICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2MpIGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAlIHdhcnBfdGlsZV9tID09IDAsICJ3YXJwIHRpbGUgTSBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgTSIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAlIHdhcnBfdGlsZV9uID09IDAsICJ3YXJwIHRpbGUgTiBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgTiIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwpYIGludCB3YXJwX3RpbGVzX20gPSBibG9ja190aWxlX20gLyB3YXJwX3RpbGVfbTsKWCBpbnQgd2FycF90aWxlc19uID0gYmxvY2tfdGlsZV9uIC8gd2FycF90aWxlX247ClggaW50IHdhcnBfdGlsZXNfayA9IGJsb2NrX3RpbGVfayAvIHdhcnBfdGlsZV9rOwpYIGludCB3YXJwX3RpbGVzX21uID0gd2FycF90aWxlc19tICogd2FycF90aWxlc19uOwpYIGludCBpbnRyYV93YXJwX3RpbGVzX20gPSB3YXJwcyA9PSAxID8gMSA6IDI7ClggaW50IGludHJhX3dhcnBfdGlsZXNfbiA9IHdhcnBzID09IDEgfHwgd2FycHMgPT0gMiA/IDEgOiB3YXJwcyA9PSA0ID8gMiA6IDQ7ClggaW50IGludHJhX3dhcnBfdGlsZV9tID0gZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbSwgaW50cmFfd2FycF90aWxlc19tPigpOwpYIGludCBpbnRyYV93YXJwX3RpbGVfbiA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX24sIGludHJhX3dhcnBfdGlsZXNfbj4oKTsKWCBpbnQgd2FycF90aWxlc19tbl9wZXJfd2FycCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX21uLCB3YXJwcz4oKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVfbSAqIGludHJhX3dhcnBfdGlsZV9uID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsICJzYW5pdHkgY2hlY2siKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVzX20gKiBpbnRyYV93YXJwX3RpbGVzX24gPT0gd2FycHMsICJzYW5pdHkgY2hlY2siKTsKWCBpbnQgd2FycF90aWxlX21uX2l0ZW1zID0gd2FycF90aWxlX20gKiB3YXJwX3RpbGVfbjsKdXNpbmcgbWZtYSA9IG1mbWFfZjMyX2Y4X2Y4PHdhcnBfdGlsZV9tLCB3YXJwX3RpbGVfbiwgd2FycF90aWxlX2s+Owp1c2luZyBmcmdfYV90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2FfdHlwZTsKdXNpbmcgZnJnX2JfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19iX3R5cGU7CnVzaW5nIGZyZ19jX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfY190eXBlOwp1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+Owp1c2luZyBibG9ja19sb2FkZXJfYSA9IGJsb2NrX2xvYWRlcjxibG9ja19zaXplLCBibG9ja190aWxlX20sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlLCBmdXNlZF90cmFuc3Bvc2U+Owp1c2luZyBibG9ja19sb2FkZXJfYiA9IGJsb2NrX2xvYWRlcjxibG9ja19zaXplLCBibG9ja190aWxlX24sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlLCBmdXNlZF90cmFuc3Bvc2U+OwpYIGludCBjX3Blcl90aHJlYWQgPSBjX3RvdGFsIC8gYmxvY2tfc2l6ZTsKc3RhdGljX2Fzc2VydChjX3Blcl90aHJlYWQgPT0gd2FycF90aWxlc19tbl9wZXJfd2FycCAqIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQsICJzYW5pdHkgY2hlY2siKTsKY29uc3QgaW50IHRpZCA9IHRocmVhZElkeC54Owpjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKY29uc3QgaW50IGxhbmUgPSBfX2xhbmVfaWQoKTsKY29uc3QgaW50IHRpX20gPSBncmlkRGltLnggLSBibG9ja0lkeC54IC0gMTsKY29uc3QgaW50IHRpX24gPSBncmlkRGltLnkgLSBibG9ja0lkeC55IC0gMTsKY29uc3QgaW50IGludHJhX3dhcnBfdGlsZV9pbSA9IHdhcnAgJSBpbnRyYV93YXJwX3RpbGVzX207CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfaW4gPSB3YXJwIC8gaW50cmFfd2FycF90aWxlc19tOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX29tID0gaW50cmFfd2FycF90aWxlX2ltICogZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbSwgaW50cmFfd2FycF90aWxlc19tPigpOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX29uID0gaW50cmFfd2FycF90aWxlX2luICogZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbiwgaW50cmFfd2FycF90aWxlc19uPigpOwppbnQgc24gPSBjZWlsX2RpdihuLCAxMjgpOwpmcmdfY190eXBlIGJsb2NrX2NfZnJnW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewpibG9ja19jX2ZyZ1tpXVtqXS5jbGVhcigpOwp9KTsKX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07Cl9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYltibG9ja190aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwpfX3NoYXJlZF9fIGZsb2F0IGJsb2NrX3RpbGVfc2NhbGluZ1tibG9ja19zaXplXTsKY29uc3QgYXV0byBsb2FkX2lucHV0ID0gWyZdKGludCBpKSB7CmZsb2F0IGZyZ19hczsKaWYgKHRpZCA8IDEyOCkgewpmcmdfYXMgPSBhc1tpIC8gMTI4ICogbSArIHRpX20gKiBibG9ja190aWxlX20gKyB0aWRdOwp9CmZsb2F0IGZyZ19icyA9IGJzW2kgLyAxMjggKiBzbiArIHRpX24gKiBibG9ja190aWxlX24gLyAxMjhdOwpjb25zdCBhdXRvIGZyZ19hID0gYmxvY2tfbG9hZGVyX2E6OmxvYWRfZnJvbV9nbG9iYWwoCmEsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkKKTsKY29uc3QgYXV0byBmcmdfYiA9IGJsb2NrX2xvYWRlcl9iOjpsb2FkX2Zyb21fZ2xvYmFsKApiLCBuLCBrLCB0aV9uICogYmxvY2tfdGlsZV9uLCBpCik7CnJldHVybiBzdGQ6Om1ha2VfdHVwbGUoZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cn07CmNvbnN0IGF1dG8gc3RvcmVfaW5wdXQgPSBbJl0oaW50IGksIGNvbnN0IGF1dG8mIGZyZ19hLCBjb25zdCBhdXRvJiBmcmdfYiwgY29uc3QgYXV0byYgZnJnX2FzLCBjb25zdCBhdXRvJiBmcmdfYnMpIHsKYmxvY2tfbG9hZGVyX2E6OnN0b3JlX3RvX3NtZW0oYmxvY2tfdGlsZV9hLCBmcmdfYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaSk7CmJsb2NrX2xvYWRlcl9iOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYiwgZnJnX2IsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkpOwpibG9ja190aWxlX3NjYWxpbmdbdGlkXSA9IGZyZ19hcyAqIGZyZ19iczsKfTsKY29uc3QgYXV0byBtbWEgPSBbJl0oaW50IGkpIHsKZnJnX2FfdHlwZSBmcmdfYVtpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGZwOCogYmFzZSA9ICZibG9ja190aWxlX2Fbd3RtICogd2FycF90aWxlX20gKiAoYmxvY2tfdGlsZV9rICsgNCldOwp1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewpYIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbWtfcmVnPiB7CmNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaWtdID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYShsYW5lLCBmcmdfYV90eXBlOjpmaXJzdF9pdGVtX29mX3JlZyhta19yZWcpKTsKY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKY29uc3QgaW50IHNyY19pZHggPSBiaWsgKyBtZm1hX2ltICogKGJsb2NrX3RpbGVfayArIDQpOwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZmcmdfYVtpd3RtXVtpd3RuXVt3dGtdLnJlZ3NbbWtfcmVnXSkgPQoqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZiYXNlW3NyY19pZHhdKTsKfSk7Cn0pOwp9KTsKZnJnX2JfdHlwZSBmcmdfYltpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGZwOCogYmFzZSA9ICZibG9ja190aWxlX2Jbd3RuICogd2FycF90aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwp1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewpYIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwp1bnJvbGw8MCwgZnJnX2JfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbmtfcmVnPiB7CmNvbnN0IGF1dG8gW21mbWFfaW4sIG1mbWFfaWtdID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYihsYW5lLCBmcmdfYl90eXBlOjpmaXJzdF9pdGVtX29mX3JlZyhua19yZWcpKTsKY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKY29uc3QgaW50IHNyY19pZHggPSBiaWsgKyBtZm1hX2luICogKGJsb2NrX3RpbGVfayArIDQpOwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZmcmdfYltpd3RtXVtpd3RuXVt3dGtdLnJlZ3NbbmtfcmVnXSkgPQoqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZiYXNlW3NyY19pZHhdKTsKfSk7Cn0pOwp9KTsKZnJnX2NfdHlwZSB3YXJwX2ZyZ19jW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewp3YXJwX2ZyZ19jW2ldW2pdLmNsZWFyKCk7Cn0pOwppZiBYIChwaXBlbGluZV9kZXB0aCA9PSAyKSB7Cl9fYnVpbHRpbl9hbWRnY25fc2NoZWRfYmFycmllcigwKTsKX19idWlsdGluX2FtZGdjbl9zX3NldHByaW8oMSk7Cl9fYnVpbHRpbl9hbWRnY25fc2NoZWRfYmFycmllcigwKTsKfQp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIHdhcnBfdGlsZXNfaz4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IHd0az4gewptZm1hOjpleGVjdXRlKAp3YXJwX2ZyZ19jW2l3dG1dW2l3dG5dLApmcmdfYVtpd3RtXVtpd3RuXVt3dGtdLApmcmdfYltpd3RtXVtpd3RuXVt3dGtdCik7Cn0pOwp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCBtbl9pdGVtPiB7CmNvbnN0IGludCB3dG0gPSBpbnRyYV93YXJwX3RpbGVfb20gKyBpd3RtOwpjb25zdCBpbnQgd3RuID0gaW50cmFfd2FycF90aWxlX29uICsgaXd0bjsKY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwpjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwpibG9ja19jX2ZyZ1tpd3RtXVtpd3RuXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0gKz0gd2FycF9mcmdfY1tpd3RtXVtpd3RuXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0KKiBibG9ja190aWxlX3NjYWxpbmdbYmltXTsKfSk7CmlmIFggKHBpcGVsaW5lX2RlcHRoID09IDIpIHsKX19idWlsdGluX2FtZGdjbl9zY2hlZF9iYXJyaWVyKDApOwpfX2J1aWx0aW5fYW1kZ2NuX3Nfc2V0cHJpbygwKTsKX19idWlsdGluX2FtZGdjbl9zY2hlZF9iYXJyaWVyKDApOwp9Cn07CmlmIFggKHBpcGVsaW5lX2RlcHRoID09IDApIHsKZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpjb25zdCBhdXRvIFtmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzXSA9IGxvYWRfaW5wdXQoaSk7CnN0b3JlX2lucHV0KGksIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwpfX3N5bmN0aHJlYWRzKCk7Cm1tYShpKTsKX19zeW5jdGhyZWFkcygpOwp9Cn0gZWxzZSBpZiBYIChwaXBlbGluZV9kZXB0aCA9PSAxKSB7CmludCBpID0gMDsKYXV0byBbZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19ic10gPSBsb2FkX2lucHV0KGkpOwpzdG9yZV9pbnB1dChpLCBmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKTsKZm9yICg7IGkgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CnN0b3JlX2lucHV0KGkgKyBibG9ja190aWxlX2ssIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwp9Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwp9IGVsc2UgaWYgWCAocGlwZWxpbmVfZGVwdGggPT0gMikgewppbnQgaSA9IDA7CmF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKc3RvcmVfaW5wdXQoaSwgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7CmF1dG8gW2ZyZ19hMSwgZnJnX2IxLCBmcmdfYXMxLCBmcmdfYnMxXSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7CmZvcig7IGkgKyBibG9ja190aWxlX2sgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayArIGJsb2NrX3RpbGVfayk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CnN0b3JlX2lucHV0KGkgKyBibG9ja190aWxlX2ssIGZyZ19hMSwgZnJnX2IxLCBmcmdfYXMxLCBmcmdfYnMxKTsKZnJnX2ExID0gZnJnX2E7CmZyZ19iMSA9IGZyZ19iOwpmcmdfYXMxID0gZnJnX2FzOwpmcmdfYnMxID0gZnJnX2JzOwp9Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CmlmIChpICsgYmxvY2tfdGlsZV9rIDwgaykgewpzdG9yZV9pbnB1dChpICsgYmxvY2tfdGlsZV9rLCBmcmdfYTEsIGZyZ19iMSwgZnJnX2FzMSwgZnJnX2JzMSk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkgKyBibG9ja190aWxlX2spOwp9Cn0gZWxzZSB7CnN0YXRpY19hc3NlcnQocGlwZWxpbmVfZGVwdGggPj0gMCAmJiBwaXBlbGluZV9kZXB0aCA8PSAyLCAiaW52YWxpZCBwaXBlbGluZSBkZXB0aCIpOwp9CmNvbnN0IGludCBpbV9iYXNlID0gdGlfbSAqIGJsb2NrX3RpbGVfbTsKY29uc3QgaW50IGluX2Jhc2UgPSB0aV9uICogYmxvY2tfdGlsZV9uOwphdXRvIGJ1ZiA9IGJ1ZmZlcjxiZjE2PihjLCBtICogbik7CnVucm9sbDNkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbiwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IG1uX2l0ZW0+IHsKY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CmNvbnN0IGludCBpbSA9IGltX2Jhc2UgKyBiaW07CmNvbnN0IGludCBpbiA9IGluX2Jhc2UgKyBiaW47CmNvbnN0IGF1dG8gdmFsID0gYmYxNl9mcm9tX2ZwMzIoYmxvY2tfY19mcmdbaXd0bV1baXd0bl0udGhyZWFkX3ZhbHVlcygpW21uX2l0ZW1dKTsKYnVmLnN0b3JlPGNvaGVyZW5jeTo6bm9uX3RlbXBvcmFsPih2YWwsIDAsIGltICogbiArIGluLCBpbSA8IG0gJiYgaW4gPCBuKTsKfSk7Cn0KX19kZXZpY2VfXwp2b2lkIHRyYW5zcG9zZV9tYXRyaXgoCmZwOCogb3V0cHV0LApjb25zdCBmcDgqIGlucHV0LAppbnQgbSwKaW50IG4sCmludCBibG9ja194LAppbnQgYmxvY2tfeQopIHsKYXV0byBpbiA9IGJ1ZmZlcjxjb25zdCB1aW50OF90PihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpbnB1dCksIG0gKiBuKTsKYXV0byBvdXQgPSBidWZmZXI8Y29uc3QgdWludDhfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ob3V0cHV0KSwgbiAqIG0pOwpjb25zdCBhdXRvIHRpZCA9IHRocmVhZElkeC54Owpjb25zdCBpbnQgaXRlbXNfcGVyX3RocmVhZCA9IDE2OwpfX3NoYXJlZF9fIHVpbnQ4X3QgdG1wWzY4ICogNjRdOwpjb25zdCBhdXRvIGJtID0gYmxvY2tfeCAqIDY0Owpjb25zdCBhdXRvIGJuID0gYmxvY2tfeSAqIDY0Owp7CmNvbnN0IGludCBpID0gdGlkICogaXRlbXNfcGVyX3RocmVhZDsKY29uc3QgaW50IG8gPSBibSArIGJuICogbTsKY29uc3QgaW50IHggPSBpIC8gNjQ7CmNvbnN0IGludCB5ID0gaSAlIDY0Owpjb25zdCBhdXRvIGl0ZW1zID0gaW4ubG9hZDxpdGVtc19wZXJfdGhyZWFkLCBjb2hlcmVuY3k6Om5vbl90ZW1wb3JhbD4obywgeCAqIG0gKyB5KTsKKnJlaW50ZXJwcmV0X2Nhc3Q8X191aW50MTI4X3QqPigmdG1wW3ggKiA2OCArIHldKSA9IHN0ZDo6Yml0X2Nhc3Q8X191aW50MTI4X3Q+KGl0ZW1zKTsKfQpfX3N5bmN0aHJlYWRzKCk7CnsKY29uc3QgaW50IGkgPSB0aWQgKiBpdGVtc19wZXJfdGhyZWFkOwpjb25zdCBpbnQgbyA9IGJtICogbiArIGJuOwpjb25zdCBpbnQgeCA9IGkgJSA2NDsKY29uc3QgaW50IHkgPSBpIC8gNjQ7CnN0ZDo6YXJyYXk8dWludDhfdCwgaXRlbXNfcGVyX3RocmVhZD4gaXRlbXM7CmZvciAoaW50IGogPSAwOyBqIDwgaXRlbXNfcGVyX3RocmVhZDsgKytqKSB7CmNvbnN0IGludCBieCA9IChpICsgaikgLyA2NDsKY29uc3QgaW50IGJ5ID0gKGkgKyBqKSAlIDY0OwppdGVtc1tqXSA9IHRtcFtieCArIGJ5ICogNjhdOwp9Cm91dC5zdG9yZTxjb2hlcmVuY3k6OmNhY2hlX2FsbD4oCml0ZW1zLApvLAp4ICsgeSAqIG4KKTsKfQp9CnRlbXBsYXRlPAppbnQgYmxvY2tfc2l6ZSwKY3ViZSBibG9ja190aWxlLApjdWJlIHdhcnBfdGlsZSwKaW50IHBpcGVsaW5lX2RlcHRoID0gMSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlLAp0eXBlbmFtZSBsb2FkX3R5cGUgPSBfX3VpbnQxMjhfdAo+CnZvaWQgcnVuX2tlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgaywKYm9vbCBtZWFzdXJlCikgewpjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7CmhpcEV2ZW50X3Qgc3RhcnQsIHRhYiwgc3RvcDsKa2VybmVsPApibG9ja19zaXplLApibG9ja190aWxlLAp3YXJwX3RpbGUsCmxvYWRfdHlwZSwKcGlwZWxpbmVfZGVwdGgKPjw8PApkaW0zKGdyaWRfbSwgZ3JpZF9uKSwKZGltMyhibG9ja19zaXplKSwKMAo+Pj4oCmEsCmIsCmFzLApicywKYywKbSwKbiwKawopOwpISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CnZvaWQgcnVuKAp1aW50cHRyX3QgYV9wdHIsCnVpbnRwdHJfdCBiX3B0ciwKdWludHB0cl90IGFzX3B0ciwKdWludHB0cl90IGJzX3B0ciwKdWludHB0cl90IGNfcHRyLAppbnQgbSwKaW50IG4sCmludCBrLApib29sIG1lYXN1cmUKKSB7CmFzc2VydChhX3B0ciAlIDE2ID09IDApOwphc3NlcnQoYl9wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwphc3NlcnQoYnNfcHRyICUgMTYgPT0gMCk7CmFzc2VydChjX3B0ciAlIDE2ID09IDApOwpjb25zdCBhdXRvKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihhX3B0cik7CmNvbnN0IGF1dG8qIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGJfcHRyKTsKY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwpjb25zdCBhdXRvKiBicyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAzMio+KGJzX3B0cik7CmF1dG8qIGMgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihjX3B0cik7CmlmIChtID09IDEwMjQgJiYgbiA9PSAxNTM2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2KSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDU3NiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAyLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyNTYpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIzMDQpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1MTIgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgMiwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gMzA3MiAmJiBrID09IDE1MzYpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNTc2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIwNDgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0NjA4ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjMwNCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDUxMiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNDA5NiAmJiBrID09IDUxMikgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAyLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9Cn0KUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewptLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCIsICItV2Vycm9yIl0sCiAgICBidWlsZF9kaXJlY3Rvcnk9Ii93b3Jrc3BhY2UvYnVpbGQvIiBpZiBURVNUSU5HID09ICJ2c2NvZGUiIGVsc2UgIi9ncHVtb2RlL2FtZC9mcDgvYnVpbGQvIiBpZiBURVNUSU5HIGlzIG5vdCBOb25lIGVsc2UgTm9uZSwKICAgICoqKHsnbm9faW1wbGljaXRfaGVhZGVycyc6IFRydWV9IGlmIFRFU1RJTkcgIT0gInZzY29kZSIgZWxzZSB7fSksCikKCmZpcnN0ID0gVHJ1ZQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgbWVhc3VyZSA9IEZhbHNlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMK

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

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgojZGVmaW5lIEhJUF9DSEVDSyhjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKc3RkOjpjZXJyIDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKPDwgaGlwR2V0RXJyb3JTdHJpbmcoZXJyb3IpIDw8ICIgaW4gIiA8PCBfX2Z1bmNfXyA8PCAiIGF0ICIgPDwgX19GSUxFX18gQAo8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQAp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACndoaWxlKGZhbHNlKQp1c2luZyBmcDggPSBfX2hpcF9mcDhfZTRtM19mbnV6Owp1c2luZyBiZjE2ID0gX19oaXBfYmZsb2F0MTY7CnVzaW5nIGZwMzIgPSBmbG9hdDsKdXNpbmcgZnAzMng0ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKdXNpbmcgaTMyeDQgPSBpbnQzMl90IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CnN0cnVjdCBjdWJlIHsKaW50IG0sIG4sIGs7Cn07CmNvbnN0ZXhwciBpbnQgd2FycF9zaXplID0gNjQ7CmNvbnN0ZXhwciBpbnQgY2FjaGVfbGluZV9zaXplID0gMTI4Owpjb25zdGV4cHIgaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IG5fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpjb25zdGV4cHIgaW50IGtfYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDEyODsKdXNpbmcgcmVnaXN0ZXJfdHlwZSA9IHVpbnQzMl90Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIGF1dG8gY2VpbF9kaXYoVCBhLCBVIGIpIHsKcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIGF1dG8gZGl2aWRlX2V4YWN0KCkgewpzdGF0aWNfYXNzZXJ0KGEgJSBiID09IDAsICJkb2VzIG5vdCBkaXZpZGUgZXhhY3QhIik7CnJldHVybiBhIC8gYjsKfQp0ZW1wbGF0ZTxpbnQgaW5jLCBpbnQgYWRkLCB0eXBlbmFtZSBzZXE+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM7CnRlbXBsYXRlPGludCBpbmMsIGludCBhZGQsIGludC4uLiBJcz4Kc3RydWN0IG11bHRpcGx5X2J5X2luYzxpbmMsIGFkZCwgc3RkOjppbnRlZ2VyX3NlcXVlbmNlPGludCwgSXMuLi4+PiB7CnVzaW5nIHR5cGUgPSBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCAoaW5jICogSXMgKyBhZGQpLi4uPjsKfTsKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jLCBpbnQuLi4gSXM+CnN0cnVjdCBtYWtlX2luZGV4X3NlcXVlbmNlX3dpdGhfaW5jX2hlbHBlciB7CnVzaW5nIHR5cGUgPSB0eXBlbmFtZSBtdWx0aXBseV9ieV9pbmM8aW5jLCBJLCBzdGQ6Om1ha2VfaW50ZWdlcl9zZXF1ZW5jZTxpbnQsIChOIC0gSSkgLyBpbmM+Pjo6dHlwZTsKfTsKdGVtcGxhdGU8aW50IEksIGludCBOLCBpbnQgaW5jPgp1c2luZyBtYWtlX2luZGV4X3NlcXVlbmNlX3dpdGhfaW5jID0gdHlwZW5hbWUgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXI8SSwgTiwgaW5jPjo6dHlwZTsKdGVtcGxhdGU8dHlwZW5hbWUgRiwgaW50Li4uIElzPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbF9hcHBseShGIGYsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxpbnQsIElzLi4uPikgewooZi50ZW1wbGF0ZSBvcGVyYXRvcigpPElzPigpLCAuLi4pOwp9CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYyA9IDEsIHR5cGVuYW1lIEY+Cl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgdW5yb2xsKEYgZikgewp1bnJvbGxfYXBwbHkoZiwgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luYzxJLCBOLCBpbmM+e30pOwp9CnRlbXBsYXRlPGludCBJLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDFkKEYgZikgewp1bnJvbGw8MCwgST4oZik7Cn0KdGVtcGxhdGU8aW50IEksIGludCBKLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDJkKEYgZikgewp1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CnVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGo+KCk7Cn0pOwp9KTsKfQp0ZW1wbGF0ZTxpbnQgSSwgaW50IEosIGludCBLLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbDNkKEYgZikgewp1bnJvbGw8MCwgST4oWyZdPGludCBpPiB7CnVucm9sbDwwLCBKPihbJl08aW50IGo+IHsKdW5yb2xsPDAsIEs+KFsmXTxpbnQgaz4gewpmLnRlbXBsYXRlIG9wZXJhdG9yKCk8aSwgaiwgaz4oKTsKfSk7Cn0pOwp9KTsKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgY2xlYXIoVCAoJmFycmF5KVtOXSkgewp1bnJvbGw8MCwgTj4oWyZdPGludCBpPiB7CmFycmF5W2ldID0gVHswfTsKfSk7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KYmYxNiBiZjE2X2Zyb21fZnAzMihmbG9hdCB4KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PGJmMTY+KApzdGF0aWNfY2FzdDx1aW50MTZfdD4oCnN0ZDo6Yml0X2Nhc3Q8dWludDMyX3Q+KHgpID4+IDE2CikKKTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpmcDMyIGZwMzJfZnJvbV9mcDgoZnA4IHgpIHsKcmV0dXJuIGZsb2F0KHgpOwp9CnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpfX2RldmljZV9fIF9faG9zdF9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHNlbGVjdChib29sIGNvbmQsIEYgZikgewppZiAoY29uZCkgewpmLnRlbXBsYXRlIG9wZXJhdG9yKCk8dHJ1ZT4oKTsKfSBlbHNlIHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGZhbHNlPigpOwp9Cn0KdGVtcGxhdGU8aW50IGRwcF9jdHJsLCBpbnQgcm93X21hc2sgPSAweGYsIGludCBiYW5rX21hc2sgPSAweGYsIGJvb2wgYm91bmRfY3RybCA9IGZhbHNlPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp1aW50MzJfdCBzaGZsX2RwcCh1aW50MzJfdCB4KSB7CnJldHVybiBfX2J1aWx0aW5fYW1kZ2NuX3VwZGF0ZV9kcHAoeCwgeCwgZHBwX2N0cmwsIHJvd19tYXNrLCBiYW5rX21hc2ssIGJvdW5kX2N0cmwpOwp9CnRlbXBsYXRlPGludCBsYW5lX3N0cmlkZT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KdWludDMyX3QgdHJhbnNwb3NlXzR4NF9mOF92Mih1aW50MzJfdCBpbnB1dCkgewpzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlIDwgd2FycF9zaXplIC8gNCwgImxhbmUgc3RyaWRlIGlzIHRvbyBsYXJnZSIpOwpzdGF0aWNfYXNzZXJ0KChsYW5lX3N0cmlkZSAmIChsYW5lX3N0cmlkZSAtIDEpKSA9PSAwLCAibGluZSBzdHJpZGUgaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiIpOwpzdGF0aWNfYXNzZXJ0KGxhbmVfc3RyaWRlID09IDEsICJEUFAgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgbGFuZV9zdHJpZGUgPT0gMSIpOwpjb25zdCBhdXRvIGxhbmUgPSBfX2xhbmVfaWQoKTsKY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gbGFuZSAvIGxhbmVfc3RyaWRlICUgNDsKY29uc3QgYXV0byB0MngyID0gX19idWlsdGluX2FtZGdjbl9wZXJtKAoKc2hmbF9kcHA8MGIxMCcxMScwMCcwMT4oaW5wdXQpLAppbnB1dCwKZ3JvdXBfbGFuZV9pbmRleCAlIDIgPT0gMAo/IDB4MDYnMDInMDQnMDAKOiAweDAzJzA3JzAxJzA1Cik7CgoKCgoKCmNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKCnNoZmxfZHBwPDBiMDEnMDAnMTEnMTA+KHQyeDIpLAp0MngyLApncm91cF9sYW5lX2luZGV4IDwgMgo/IDB4MDUnMDQnMDEnMDAKOiAweDAzJzAyJzA3JzA2Cik7CgpyZXR1cm4gdDR4NDsKfQpfX2RldmljZV9fIHVpbnQ4X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2I4KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTgiKTsKX19kZXZpY2VfXyB1aW50MTZfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTE2Iik7Cl9fZGV2aWNlX18gdWludDMyX3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMihpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkzMiIpOwpfX2RldmljZV9fIHVpbnQ2NF90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iNjQoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pNjQiKTsKX19kZXZpY2VfXyBfX3VpbnQxMjhfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjEyOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkxMjgiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjgodWludDhfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTgiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjE2KHVpbnQxNl90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pMTYiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjMyKHVpbnQzMl90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pMzIiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjY0KHVpbnQ2NF90IHZkYXRhLCBpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5zdG9yZS5pNjQiKTsKX19kZXZpY2VfXyB2b2lkIGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjEyOChfX3VpbnQxMjhfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTEyOCIpOwplbnVtIGNsYXNzIGNvaGVyZW5jeSB7CmNhY2hlX2FsbCA9IDAsCmNhY2hlX2dsb2JhbCA9IDEsCmNhY2hlX3N0cmVhbSA9IDIsCm5vbl90ZW1wb3JhbCA9IDMKfTsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBidWZmZXIgewpzdHJ1Y3QgYnVmZmVyX3Jlc291cmNlIHsKY29uc3Qgdm9pZCogcHRyOwp1aW50MzJfdCByYW5nZTsKdWludDMyX3QgY29uZmlnOwp9Owp1c2luZyBlbGVtX3R5cGUgPSBzdGQ6OnJlbW92ZV9jdl90PFQ+OwpidWZmZXJfcmVzb3VyY2UgcnNyYzsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KYnVmZmVyKFQqIHBvaW50ZXIsIHVpbnQzMl90IHNpemUpIHsKdGhpcy0+cnNyYyA9IGJ1ZmZlcl9yZXNvdXJjZXsKcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4ocG9pbnRlciksCnN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplICogc2l6ZW9mKGVsZW1fdHlwZSkpLAoKCjB4MDAwMjAwMDBVCn07Cn0KdGVtcGxhdGU8c2l6ZV90IE4sIGNvaGVyZW5jeSBjID0gY29oZXJlbmN5OjpjYWNoZV9hbGw+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPiBsb2FkKAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3Qgewp1c2luZyByZXN1bHRfdHlwZSA9IHN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPjsKY29uc3RleHByIGNvbnN0IGludCBsb2FkX3NpemUgPSBzaXplb2YoZWxlbV90eXBlKSAqIE47CndhdmVfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ID0gaW5fYm91bmRzID8gdGhyZWFkX29mZnNldCA6IDB4RkZGRidGRkZGOwpjb25zdCBpbnQgY2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGMpOwppZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAxKSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjgoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAyKSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjE2KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgY29uc3RleHByIChsb2FkX3NpemUgPT0gNCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMigKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIGlmIGNvbnN0ZXhwciAobG9hZF9zaXplID09IDgpIHsKcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8cmVzdWx0X3R5cGU+KGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iNjQoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKGxvYWRfc2l6ZSA9PSAxNikgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxMjgoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSB7CnN0YXRpY19hc3NlcnQobG9hZF9zaXplID09IC0xLCAibG9hZCBzaXplIG5vdCBpbXBsZW1lbnRlZCIpOwp9Cn0KdGVtcGxhdGU8Y29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbCwgc2l6ZV90IE4+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgc3RvcmUoCmNvbnN0IHN0ZDo6YXJyYXk8ZWxlbV90eXBlLCBOPiYgZGF0YSwKdWludDMyX3Qgd2F2ZV9vZmZzZXQsCnVpbnQzMl90IHRocmVhZF9vZmZzZXQsCmJvb2wgaW5fYm91bmRzID0gdHJ1ZQopIGNvbnN0IHsKY29uc3RleHByIGNvbnN0IGludCBzdG9yZV9zaXplID0gc2l6ZW9mKGVsZW1fdHlwZSkgKiBOOwp3YXZlX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCA9IGluX2JvdW5kcyA/IHRocmVhZF9vZmZzZXQgOiAweEZGRkYnRkZGRjsKY29uc3QgaW50IGNjID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDEpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iOCgKc3RkOjpiaXRfY2FzdDx1aW50OF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDIpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iMTYoCnN0ZDo6Yml0X2Nhc3Q8dWludDE2X3Q+KGRhdGEpLApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCik7Cn0gZWxzZSBpZiBjb25zdGV4cHIgKHN0b3JlX3NpemUgPT0gNCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMigKc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIGNvbnN0ZXhwciAoc3RvcmVfc2l6ZSA9PSA4KSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjY0KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgaWYgY29uc3RleHByIChzdG9yZV9zaXplID09IDE2KSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjEyOCgKc3RkOjpiaXRfY2FzdDxfX3VpbnQxMjhfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIHsKc3RhdGljX2Fzc2VydChzdG9yZV9zaXplID09IC0xLCAic3RvcmUgc2l6ZSBub3QgaW1wbGVtZW50ZWQiKTsKfQp9CnRlbXBsYXRlPGNvaGVyZW5jeSBjID0gY29oZXJlbmN5OjpjYWNoZV9hbGw+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgc3RvcmUoCmNvbnN0IGVsZW1fdHlwZSYgZGF0YSwKdWludDMyX3Qgd2F2ZV9vZmZzZXQsCnVpbnQzMl90IHRocmVhZF9vZmZzZXQsCmJvb2wgaW5fYm91bmRzID0gdHJ1ZQopIGNvbnN0IHsKc3RvcmU8Yz4oCnN0ZDo6YXJyYXk8ZWxlbV90eXBlLCAxPih7ZGF0YX0pLAp3YXZlX29mZnNldCwKdGhyZWFkX29mZnNldCwKaW5fYm91bmRzCik7Cn0KfTsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLAppbnQgYmxvY2tfdGlsZV9tLAppbnQgYmxvY2tfdGlsZV9uLAp0eXBlbmFtZSBsb2FkX3R5cGUsCmJvb2wgZnVzZWRfdHJhbnNwb3NlCj4Kc3RydWN0IGJsb2NrX2xvYWRlcjsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLAppbnQgYmxvY2tfdGlsZV9tLAppbnQgYmxvY2tfdGlsZV9uLAp0eXBlbmFtZSBsb2FkX3R5cGUKPgpzdHJ1Y3QgYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbSwgYmxvY2tfdGlsZV9uLCBsb2FkX3R5cGUsIHRydWU+IHsKc3RhdGljX2Fzc2VydChibG9ja190aWxlX20gJSBzaXplb2YobG9hZF90eXBlKSA9PSAwLCAidGlsZSBpbm5lciBkaW1lbnNpb24gaGFzIHRvIGJlIGRpdmlzaWJsZSBieSBsb2FkIHR5cGUgc2l6ZSIpOwpjb25zdGV4cHIgc3RhdGljIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwpzdGF0aWNfYXNzZXJ0KHRvdGFsX2xvYWRzICUgYmxvY2tfc2l6ZSA9PSAwLCAidG90YWwgYW1vdW50IG9mIGxvYWRzIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpjb25zdGV4cHIgc3RhdGljIGludCBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tID0gYmxvY2tfdGlsZV9tIC8gc2l6ZW9mKGxvYWRfdHlwZSk7CmNvbnN0ZXhwciBzdGF0aWMgaW50IGxvYWRzX3Blcl90aHJlYWQgPSB0b3RhbF9sb2FkcyAvIGJsb2NrX3NpemU7CmNvbnN0ZXhwciBzdGF0aWMgaW50IGdyb3VwX3NpemUgPSA0Owp1c2luZyBmcmdfdHlwZSA9IHN0ZDo6YXJyYXk8bG9hZF90eXBlLCBsb2Fkc19wZXJfdGhyZWFkPjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGZyZ190eXBlIGxvYWRfZnJvbV9nbG9iYWwoCmNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCmludCBtLAppbnQgbiwKaW50IGJsb2NrX29mZl9tLAppbnQgYmxvY2tfb2ZmX24KKSB7CmNvbnN0IGF1dG8gb2Zmc2V0ID0gYmxvY2tfb2ZmX24gKiBtICsgYmxvY2tfb2ZmX207CmNvbnN0IGF1dG8gYnVmID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2NrX3RpbGVfc3JjKSwgbSAqIG4pOwpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CmZyZ190eXBlIHJlc3VsdDsKdW5yb2xsPDAsIGxvYWRzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaj4gewpjb25zdCBpbnQgaSA9IGogKiBibG9ja19zaXplICsgdGlkOwoKY29uc3QgaW50IGdyb3VwX2luZGV4ID0gaSAlIGdyb3VwX3NpemU7CmNvbnN0IGludCBncm91cF9iYW5rID0gaSAvIGdyb3VwX3NpemU7CmNvbnN0IGludCByb3cgPSBncm91cF9iYW5rICUgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKY29uc3QgaW50IGNvbCA9IGdyb3VwX2luZGV4ICsgZ3JvdXBfYmFuayAvIGxvYWRzX3Blcl9ibG9ja190aWxlX20gKiBncm91cF9zaXplOwpjb25zdCBpbnQgc3JjX29mZiA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgY29sICogbTsKY29uc3QgaW50IHNyY19yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGJsb2NrX29mZl9tOwpjb25zdCBpbnQgc3JjX2NvbCA9IGNvbCArIGJsb2NrX29mZl9uOwpjb25zdCBib29sIGluX2JvdW5kcyA9IHNyY19yb3cgPCBtICYmIHNyY19jb2wgPCBuOwoKY29uc3QgYXV0byB3b3JkID0gYnVmLnRlbXBsYXRlIGxvYWQ8c2l6ZW9mKGxvYWRfdHlwZSk+KG9mZnNldCwgc3JjX29mZiwgaW5fYm91bmRzKTsKcmVzdWx0W2pdID0gc3RkOjpiaXRfY2FzdDxsb2FkX3R5cGU+KHdvcmQpOwp9KTsKcmV0dXJuIHJlc3VsdDsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBzdG9yZV90b19zbWVtKApmcDgqIGJsb2NrX3RpbGVfZHN0LApmcmdfdHlwZSB0aHJlYWRfc3JjLAppbnQgbSwKaW50IG4sCmludCBibG9ja19vZmZfbSwKaW50IGJsb2NrX29mZl9uCikgewpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CgoKCgp1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CmNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7Cgpjb25zdCBpbnQgZ3JvdXBfaW5kZXggPSBpICUgZ3JvdXBfc2l6ZTsKY29uc3QgaW50IGdyb3VwX2JhbmsgPSBpIC8gZ3JvdXBfc2l6ZTsKY29uc3QgaW50IHJvdyA9IGdyb3VwX2JhbmsgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwpjb25zdCBpbnQgY29sID0gZ3JvdXBfaW5kZXggKyBncm91cF9iYW5rIC8gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSAqIGdyb3VwX3NpemU7CmF1dG8qIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJsb2NrX3RpbGVfZHN0KTsKCmNvbnN0IGF1dG8gc3JjID0gc3RkOjpiaXRfY2FzdDxzdGQ6OmFycmF5PHVpbnQzMl90LCA0Pj4odGhyZWFkX3NyY1tqXSk7CmNvbnN0ZXhwciBpbnQgbGFuZV9zdHJpZGUgPSAxOwp1bnJvbGw8MCwgc2l6ZW9mKGxvYWRfdHlwZSksIHNpemVvZih1aW50MzJfdCk+KFsmXTxpbnQgaz4gewpjb25zdCBpbnQgZHN0X3JvdyA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgazsKY29uc3QgaW50IGRzdF9jb2wgPSBjb2w7CmF1dG8gdiA9IHNyY1trIC8gc2l6ZW9mKHVpbnQzMl90KV07CnYgPSB0cmFuc3Bvc2VfNHg0X2Y4X3YyPGxhbmVfc3RyaWRlPih2KTsKY29uc3QgYXV0byBncm91cF9sYW5lX2luZGV4ID0gX19sYW5lX2lkKCkgLyBsYW5lX3N0cmlkZSAlIDQ7CipyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJmRzdFsoZHN0X2NvbCAtIGRzdF9jb2wgJSA0KSArIChkc3Rfcm93ICsgZ3JvdXBfbGFuZV9pbmRleCkgKiAoYmxvY2tfdGlsZV9uICsgNCldKQo9IHY7Cn0pOwp9KTsKfQp9Owp0ZW1wbGF0ZSA8aW50IHdhcnBfdGlsZV9tXywgaW50IHdhcnBfdGlsZV9uXywgdHlwZW5hbWUgVD4Kc3RydWN0IG1mbWFfZnJhZ21lbnQgewp1c2luZyB0eXBlID0gVDsKY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgd2FycF90aWxlX20gPSB3YXJwX3RpbGVfbV87CmNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9uID0gd2FycF90aWxlX25fOwpjb25zdGV4cHIgc3RhdGljIGNvbnN0IGludCB0b3RhbF9pdGVtcyA9IHdhcnBfdGlsZV9tICogd2FycF90aWxlX247CmNvbnN0ZXhwciBzdGF0aWMgY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8dG90YWxfaXRlbXMsIHdhcnBfc2l6ZT4oKTsKY29uc3RleHByIHN0YXRpYyBjb25zdCBpbnQgcmVnaXN0ZXJzX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8aXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKSwgc2l6ZW9mKHJlZ2lzdGVyX3R5cGUpPigpOwpjb25zdGV4cHIgc3RhdGljIGNvbnN0IGludCBieXRlc19wZXJfdGhyZWFkID0gaXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKTsKcmVnaXN0ZXJfdHlwZSByZWdzW3JlZ2lzdGVyc19wZXJfdGhyZWFkXTsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3RleHByIHN0YXRpYyBtZm1hX2ZyYWdtZW50IHplcm8oKSB7CnJldHVybiBtZm1hX2ZyYWdtZW50e3t9fTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgewpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjphcnJheTxULCBpdGVtc19wZXJfdGhyZWFkPio+KCZ0aGlzLT5yZWdzKTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpjb25zdCBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+JiB0aHJlYWRfdmFsdWVzKCkgY29uc3QgewpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RkOjphcnJheTxULCBpdGVtc19wZXJfdGhyZWFkPio+KCZ0aGlzLT5yZWdzKTsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBVPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+JiByZWdzX2FzKCkgewpzdGF0aWNfYXNzZXJ0KGJ5dGVzX3Blcl90aHJlYWQgJSBzaXplb2YoVSkgPT0gMCwgInRvdGFsIGJ5dGVzIGluIHRocmVhZCBmcmFnbWVudCBub3QgZGl2aXNpYmxlIGJ5IFUiKTsKcmV0dXJuICpyZWludGVycHJldF9jYXN0PHN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4qPigmdGhpcy0+cmVncyk7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgVT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KY29uc3Qgc3RkOjphcnJheTxVLCBieXRlc19wZXJfdGhyZWFkIC8gc2l6ZW9mKFUpPiYgcmVnc19hcygpIGNvbnN0IHsKc3RhdGljX2Fzc2VydChieXRlc19wZXJfdGhyZWFkICUgc2l6ZW9mKFUpID09IDAsICJ0b3RhbCBieXRlcyBpbiB0aHJlYWQgZnJhZ21lbnQgbm90IGRpdmlzaWJsZSBieSBVIik7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+Kj4oJnRoaXMtPnJlZ3MpOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnZvaWQgY2xlYXIoKSB7CnVucm9sbDwwLCByZWdpc3RlcnNfcGVyX3RocmVhZD4oWyZdPGludCBpPiB7CnRoaXMtPnJlZ3NbaV0gPSAwOwp9KTsKfQpzdGF0aWMgY29uc3RleHByIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CnJldHVybiByZWcgKiBzaXplb2YocmVnaXN0ZXJfdHlwZSk7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDE2LCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAowLAowLAowCikKKTsKfQp9Owp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODsKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDMyLCBmcDg+Owp1c2luZyBmcmdfYl90eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMzIsIGZwOD47CnVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBleGVjdXRlKApmcmdfY190eXBlJiBjLApjb25zdCBmcmdfYV90eXBlJiBhLApjb25zdCBmcmdfYl90eXBlJiBiCikgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwpjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCnN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCgp1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+Owpjb25zdCBhdXRvJiBhX3ZhbHVlcyA9IGEudGhyZWFkX3ZhbHVlcygpOwpjb25zdCBhdXRvJiBiX3ZhbHVlcyA9IGIudGhyZWFkX3ZhbHVlcygpOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYSA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2FfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFfdmFsdWVzW2tdKSk7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYiA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2JfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJfdmFsdWVzW2tdKSk7CmZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7Cn0pOwojZW5kaWYKI2VuZGlmCn0KfTsKdGVtcGxhdGU8PgpzdHJ1Y3QgbWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4gewp1c2luZyBmcmdfYV90eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMTYsIGZwOD47CnVzaW5nIGZyZ19iX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CiNpZmRlZiBfX0hJUF9ERVZJQ0VfQ09NUElMRV9fCiNpZmRlZiBfX2dmeDk0Ml9fCmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCnN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGEpLApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCgp1c2luZyBmYWxsYmFja19tZm1hID0gbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+Owpjb25zdCBhdXRvJiBhX3ZhbHVlcyA9IGEudGhyZWFkX3ZhbHVlcygpOwpjb25zdCBhdXRvJiBiX3ZhbHVlcyA9IGIudGhyZWFkX3ZhbHVlcygpOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBrPiB7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYSA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2FfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFfdmFsdWVzW2tdKSk7CmNvbnN0IGF1dG8gZmFsbGJhY2tfYiA9IHN0ZDo6Yml0X2Nhc3Q8ZmFsbGJhY2tfbWZtYTo6ZnJnX2JfdHlwZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJfdmFsdWVzW2tdKSk7CmZhbGxiYWNrX21mbWE6OmV4ZWN1dGUoYywgZmFsbGJhY2tfYSwgZmFsbGJhY2tfYik7Cn0pOwojZW5kaWYKI2VuZGlmCn0KfTsKCgoKCgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+PiB7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9hKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IGxhbmUgJSAxNjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwpyZXR1cm4ge20sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9iKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbiA9IGxhbmUgJSAxNjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAxNikgKyBpdGVtOwpyZXR1cm4ge24sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIGl0ZW07CmNvbnN0IGludCBuID0gbGFuZSAlIDE2OwpyZXR1cm4ge20sIG59Owp9Cn07CnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4+IHsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2EoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CnJldHVybiB7bSwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gbGFuZSAlIDMyOwpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDMyKSArIGl0ZW07CnJldHVybiB7biwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gOCAqIChpdGVtIC8gNCkgJSAzMiArIDQgKiAobGFuZSAvIDMyKSArIChpdGVtICUgNCk7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpyZXR1cm4ge24sIG19Owp9Cn07CnRlbXBsYXRlIDwKaW50IGJsb2NrX3NpemUsCmN1YmUgYmxvY2tfdGlsZSwKY3ViZSB3YXJwX3RpbGUsCnR5cGVuYW1lIGxvYWRfdHlwZSwKYm9vbCBwaXBlbGluZWRfbWFpbl9sb29wID0gZmFsc2UsCmJvb2wgZnVzZWRfdHJhbnNwb3NlID0gdHJ1ZQo+Cl9fZ2xvYmFsX18gX19sYXVuY2hfYm91bmRzX18oYmxvY2tfc2l6ZSkKdm9pZCBrZXJuZWwoCmNvbnN0IGZwOCogYSwKY29uc3QgZnA4KiBiLApjb25zdCBmcDMyKiBhcywKY29uc3QgZnAzMiogYnMsCmJmMTYqIGMsCmludCBtLAppbnQgbiwKaW50IGsKKSB7CmNvbnN0ZXhwciBpbnQgd2FycHMgPSBibG9ja19zaXplIC8gd2FycF9zaXplOwpjb25zdGV4cHIgaW50IGJsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGUubTsKY29uc3RleHByIGludCBibG9ja190aWxlX24gPSBibG9ja190aWxlLm47CmNvbnN0ZXhwciBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwoKCgpjb25zdGV4cHIgaW50IHdhcnBfdGlsZV9tID0gd2FycF90aWxlLm07CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlX24gPSB3YXJwX3RpbGUubjsKY29uc3RleHByIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwpjb25zdGV4cHIgaW50IGNfdG90YWwgPSBibG9ja190aWxlX20gKiBibG9ja190aWxlX247CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2EpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKc3RhdGljX2Fzc2VydChibG9ja190aWxlX24gKiBibG9ja190aWxlX2sgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYikgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpzdGF0aWNfYXNzZXJ0KGNfdG90YWwgJSBibG9ja19zaXplID09IDAsICJzaXplKGJsb2NrX3RpbGVfYykgYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9tICUgd2FycF90aWxlX20gPT0gMCwgIndhcnAgdGlsZSBNIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBNIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICUgd2FycF90aWxlX24gPT0gMCwgIndhcnAgdGlsZSBOIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBOIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9rICUgd2FycF90aWxlX2sgPT0gMCwgIndhcnAgdGlsZSBLIGhhcyB0byBkaXZpZGUgYmxvY2sgdGlsZSBLIik7CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tID0gYmxvY2tfdGlsZV9tIC8gd2FycF90aWxlX207CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19uID0gYmxvY2tfdGlsZV9uIC8gd2FycF90aWxlX247CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19rID0gYmxvY2tfdGlsZV9rIC8gd2FycF90aWxlX2s7CmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbiA9IHdhcnBfdGlsZXNfbSAqIHdhcnBfdGlsZXNfbjsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVzX20gPSB3YXJwcyA9PSAxID8gMSA6IDI7CmNvbnN0ZXhwciBpbnQgaW50cmFfd2FycF90aWxlc19uID0gd2FycHMgPT0gMSB8fCB3YXJwcyA9PSAyID8gMSA6IHdhcnBzID09IDQgPyAyIDogNDsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVfbSA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX20sIGludHJhX3dhcnBfdGlsZXNfbT4oKTsKY29uc3RleHByIGludCBpbnRyYV93YXJwX3RpbGVfbiA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX24sIGludHJhX3dhcnBfdGlsZXNfbj4oKTsKCmNvbnN0ZXhwciBpbnQgd2FycF90aWxlc19tbl9wZXJfd2FycCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX21uLCB3YXJwcz4oKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVfbSAqIGludHJhX3dhcnBfdGlsZV9uID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsICJzYW5pdHkgY2hlY2siKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVzX20gKiBpbnRyYV93YXJwX3RpbGVzX24gPT0gd2FycHMsICJzYW5pdHkgY2hlY2siKTsKY29uc3RleHByIGludCB3YXJwX3RpbGVfbW5faXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwp1c2luZyBtZm1hID0gbWZtYV9mMzJfZjhfZjg8d2FycF90aWxlX20sIHdhcnBfdGlsZV9uLCB3YXJwX3RpbGVfaz47CnVzaW5nIGZyZ19hX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfYV90eXBlOwp1c2luZyBmcmdfYl90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2JfdHlwZTsKdXNpbmcgZnJnX2NfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19jX3R5cGU7CnVzaW5nIGluZGV4ZXIgPSBtZm1hX2luZGV4ZXI8bWZtYT47CnVzaW5nIGJsb2NrX2xvYWRlcl9hID0gYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbSwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGUsIGZ1c2VkX3RyYW5zcG9zZT47CnVzaW5nIGJsb2NrX2xvYWRlcl9iID0gYmxvY2tfbG9hZGVyPGJsb2NrX3NpemUsIGJsb2NrX3RpbGVfbiwgYmxvY2tfdGlsZV9rLCBsb2FkX3R5cGUsIGZ1c2VkX3RyYW5zcG9zZT47CmNvbnN0ZXhwciBpbnQgY19wZXJfdGhyZWFkID0gY190b3RhbCAvIGJsb2NrX3NpemU7CnN0YXRpY19hc3NlcnQoY19wZXJfdGhyZWFkID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAgKiBmcmdfY190eXBlOjppdGVtc19wZXJfdGhyZWFkLCAic2FuaXR5IGNoZWNrIik7CmNvbnN0IGludCB0aWQgPSB0aHJlYWRJZHgueDsKY29uc3QgaW50IHdhcnAgPSB0aWQgLyB3YXJwX3NpemU7CmNvbnN0IGludCBsYW5lID0gX19sYW5lX2lkKCk7Cgpjb25zdCBpbnQgdGlfbSA9IGdyaWREaW0ueCAtIGJsb2NrSWR4LnggLSAxOwpjb25zdCBpbnQgdGlfbiA9IGdyaWREaW0ueSAtIGJsb2NrSWR4LnkgLSAxOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX2ltID0gd2FycCAlIGludHJhX3dhcnBfdGlsZXNfbTsKY29uc3QgaW50IGludHJhX3dhcnBfdGlsZV9pbiA9IHdhcnAgLyBpbnRyYV93YXJwX3RpbGVzX207CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfb20gPSBpbnRyYV93YXJwX3RpbGVfaW0gKiBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19tLCBpbnRyYV93YXJwX3RpbGVzX20+KCk7CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfb24gPSBpbnRyYV93YXJwX3RpbGVfaW4gKiBkaXZpZGVfZXhhY3Q8d2FycF90aWxlc19uLCBpbnRyYV93YXJwX3RpbGVzX24+KCk7CmludCBzbiA9IGNlaWxfZGl2KG4sIDEyOCk7CgpmcmdfY190eXBlIGJsb2NrX2NfZnJnW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewpibG9ja19jX2ZyZ1tpXVtqXS5jbGVhcigpOwp9KTsKX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07Cl9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYltibG9ja190aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwpfX3NoYXJlZF9fIGZsb2F0IGJsb2NrX3RpbGVfc2NhbGluZ1tibG9ja19zaXplXTsKY29uc3QgYXV0byBsb2FkX2lucHV0ID0gWyZdKGludCBpKSB7CmZsb2F0IGZyZ19hczsKaWYgKHRpZCA8IDEyOCkgewpmcmdfYXMgPSBhc1tpIC8gMTI4ICogbSArIHRpX20gKiBibG9ja190aWxlX20gKyB0aWRdOwp9CmZsb2F0IGZyZ19icyA9IGJzW2kgLyAxMjggKiBzbiArIHRpX24gKiBibG9ja190aWxlX24gLyAxMjhdOwpjb25zdCBhdXRvIGZyZ19hID0gYmxvY2tfbG9hZGVyX2E6OmxvYWRfZnJvbV9nbG9iYWwoCmEsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkKKTsKY29uc3QgYXV0byBmcmdfYiA9IGJsb2NrX2xvYWRlcl9iOjpsb2FkX2Zyb21fZ2xvYmFsKApiLCBuLCBrLCB0aV9uICogYmxvY2tfdGlsZV9uLCBpCik7CnJldHVybiBzdGQ6Om1ha2VfdHVwbGUoZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cn07CmNvbnN0IGF1dG8gc3RvcmVfaW5wdXQgPSBbJl0oaW50IGksIGNvbnN0IGF1dG8mIGZyZ19hLCBjb25zdCBhdXRvJiBmcmdfYiwgY29uc3QgYXV0byYgZnJnX2FzLCBjb25zdCBhdXRvJiBmcmdfYnMpIHsKYmxvY2tfbG9hZGVyX2E6OnN0b3JlX3RvX3NtZW0oYmxvY2tfdGlsZV9hLCBmcmdfYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaSk7CmJsb2NrX2xvYWRlcl9iOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYiwgZnJnX2IsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkpOwpibG9ja190aWxlX3NjYWxpbmdbdGlkXSA9IGZyZ19hcyAqIGZyZ19iczsKfTsKY29uc3QgYXV0byBtbWEgPSBbJl0oaW50IGkpIHsKZnJnX2FfdHlwZSBmcmdfYVtpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CnVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CmNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKdW5yb2xsPDAsIGZyZ19hX3R5cGU6OnJlZ2lzdGVyc19wZXJfdGhyZWFkLCAyPihbJl08aW50IG1rX3JlZz4gewpjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2EobGFuZSwgZnJnX2FfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobWtfcmVnKSk7CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CipyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4oJmZyZ19hW2l3dG1dW2l3dG5dW3d0a10ucmVnc1tta19yZWddKSA9CipyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJmJsb2NrX3RpbGVfYVtiaWsgKyBiaW0gKiAoYmxvY2tfdGlsZV9rICsgNCldKTsKfSk7Cn0pOwp9KTsKZnJnX2JfdHlwZSBmcmdfYltpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CnVucm9sbDwwLCBibG9ja190aWxlX2ssIHdhcnBfdGlsZV9rPihbJl08aW50IHd0a19iYXNlPiB7CmNvbnN0ZXhwciBpbnQgd3RrID0gd3RrX2Jhc2UgLyB3YXJwX3RpbGVfazsKdW5yb2xsPDAsIGZyZ19iX3R5cGU6OnJlZ2lzdGVyc19wZXJfdGhyZWFkLCAyPihbJl08aW50IG5rX3JlZz4gewpjb25zdCBhdXRvIFttZm1hX2luLCBtZm1hX2lrXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2IobGFuZSwgZnJnX2JfdHlwZTo6Zmlyc3RfaXRlbV9vZl9yZWcobmtfcmVnKSk7CmNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CmNvbnN0IGludCBiaWsgPSB3dGtfYmFzZSArIG1mbWFfaWs7CipyZWludGVycHJldF9jYXN0PHVpbnQ2NF90Kj4oJmZyZ19iW2l3dG1dW2l3dG5dW3d0a10ucmVnc1tua19yZWddKSA9CipyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJmJsb2NrX3RpbGVfYltiaWsgKyBiaW4gKiAoYmxvY2tfdGlsZV9rICsgNCldKTsKfSk7Cn0pOwp9KTsKZnJnX2NfdHlwZSB3YXJwX2ZyZ19jW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewp3YXJwX2ZyZ19jW2ldW2pdLmNsZWFyKCk7Cn0pOwoKdW5yb2xsM2Q8aW50cmFfd2FycF90aWxlX20sIGludHJhX3dhcnBfdGlsZV9uLCB3YXJwX3RpbGVzX2s+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCB3dGs+IHsKbWZtYTo6ZXhlY3V0ZSgKd2FycF9mcmdfY1tpd3RtXVtpd3RuXSwKZnJnX2FbaXd0bV1baXd0bl1bd3RrXSwKZnJnX2JbaXd0bV1baXd0bl1bd3RrXQopOwp9KTsKCnVucm9sbDNkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbiwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IG1uX2l0ZW0+IHsKY29uc3QgaW50IHd0bSA9IGludHJhX3dhcnBfdGlsZV9vbSArIGl3dG07CmNvbnN0IGludCB3dG4gPSBpbnRyYV93YXJwX3RpbGVfb24gKyBpd3RuOwpjb25zdCBhdXRvIFttZm1hX2ltLCBtZm1hX2luXSA9IGluZGV4ZXI6Oml0ZW1fdG9fbWF0cml4X2MobGFuZSwgbW5faXRlbSk7CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmJsb2NrX2NfZnJnW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXSArPSB3YXJwX2ZyZ19jW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXQoqIGJsb2NrX3RpbGVfc2NhbGluZ1tiaW1dOwp9KTsKfTsKaWYgY29uc3RleHByICghcGlwZWxpbmVkX21haW5fbG9vcCkgewoKZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpjb25zdCBhdXRvIFtmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzXSA9IGxvYWRfaW5wdXQoaSk7CnN0b3JlX2lucHV0KGksIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwpfX3N5bmN0aHJlYWRzKCk7Cm1tYShpKTsKX19zeW5jdGhyZWFkcygpOwp9Cn0gZWxzZSB7CgppbnQgaSA9IDA7CmF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKc3RvcmVfaW5wdXQoaSwgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cl9fc3luY3RocmVhZHMoKTsKZm9yICg7IGkgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7CgptbWEoaSk7Cl9fc3luY3RocmVhZHMoKTsKc3RvcmVfaW5wdXQoaSArIGJsb2NrX3RpbGVfaywgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cl9fc3luY3RocmVhZHMoKTsKfQptbWEoaSk7Cn0KCgpjb25zdCBpbnQgaW1fYmFzZSA9IHRpX20gKiBibG9ja190aWxlX207CmNvbnN0IGludCBpbl9iYXNlID0gdGlfbiAqIGJsb2NrX3RpbGVfbjsKYXV0byBidWYgPSBidWZmZXI8YmYxNj4oYywgbSAqIG4pOwp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCBtbl9pdGVtPiB7CmNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaW5dID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYyhsYW5lLCBtbl9pdGVtKTsKY29uc3QgaW50IHd0bSA9IGludHJhX3dhcnBfdGlsZV9vbSArIGl3dG07CmNvbnN0IGludCB3dG4gPSBpbnRyYV93YXJwX3RpbGVfb24gKyBpd3RuOwpjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwpjb25zdCBpbnQgYmluID0gd3RuICogd2FycF90aWxlX24gKyBtZm1hX2luOwpjb25zdCBpbnQgaW0gPSBpbV9iYXNlICsgYmltOwpjb25zdCBpbnQgaW4gPSBpbl9iYXNlICsgYmluOwpjb25zdCBhdXRvIHZhbCA9IGJmMTZfZnJvbV9mcDMyKGJsb2NrX2NfZnJnW2l3dG1dW2l3dG5dLnRocmVhZF92YWx1ZXMoKVttbl9pdGVtXSk7CmJ1Zi5zdG9yZTxjb2hlcmVuY3k6Om5vbl90ZW1wb3JhbD4odmFsLCAwLCBpbSAqIG4gKyBpbiwgaW0gPCBtICYmIGluIDwgbik7Cn0pOwp9Cl9fZGV2aWNlX18Kdm9pZCB0cmFuc3Bvc2VfbWF0cml4KApmcDgqIG91dHB1dCwKY29uc3QgZnA4KiBpbnB1dCwKaW50IG0sCmludCBuLAppbnQgYmxvY2tfeCwKaW50IGJsb2NrX3kKKSB7CmF1dG8gaW4gPSBidWZmZXI8Y29uc3QgdWludDhfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oaW5wdXQpLCBtICogbik7CmF1dG8gb3V0ID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KG91dHB1dCksIG4gKiBtKTsKY29uc3QgYXV0byB0aWQgPSB0aHJlYWRJZHgueDsKY29uc3QgaW50IGl0ZW1zX3Blcl90aHJlYWQgPSAxNjsKX19zaGFyZWRfXyB1aW50OF90IHRtcFs2OCAqIDY0XTsKY29uc3QgYXV0byBibSA9IGJsb2NrX3ggKiA2NDsKY29uc3QgYXV0byBibiA9IGJsb2NrX3kgKiA2NDsKewpjb25zdCBpbnQgaSA9IHRpZCAqIGl0ZW1zX3Blcl90aHJlYWQ7CmNvbnN0IGludCBvID0gYm0gKyBibiAqIG07CmNvbnN0IGludCB4ID0gaSAvIDY0Owpjb25zdCBpbnQgeSA9IGkgJSA2NDsKY29uc3QgYXV0byBpdGVtcyA9IGluLmxvYWQ8aXRlbXNfcGVyX3RocmVhZCwgY29oZXJlbmN5Ojpub25fdGVtcG9yYWw+KG8sIHggKiBtICsgeSk7CipyZWludGVycHJldF9jYXN0PF9fdWludDEyOF90Kj4oJnRtcFt4ICogNjggKyB5XSkgPSBzdGQ6OmJpdF9jYXN0PF9fdWludDEyOF90PihpdGVtcyk7Cn0KX19zeW5jdGhyZWFkcygpOwp7CmNvbnN0IGludCBpID0gdGlkICogaXRlbXNfcGVyX3RocmVhZDsKY29uc3QgaW50IG8gPSBibSAqIG4gKyBibjsKY29uc3QgaW50IHggPSBpICUgNjQ7CmNvbnN0IGludCB5ID0gaSAvIDY0OwpzdGQ6OmFycmF5PHVpbnQ4X3QsIGl0ZW1zX3Blcl90aHJlYWQ+IGl0ZW1zOwpmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1zX3Blcl90aHJlYWQ7ICsraikgewpjb25zdCBpbnQgYnggPSAoaSArIGopIC8gNjQ7CmNvbnN0IGludCBieSA9IChpICsgaikgJSA2NDsKaXRlbXNbal0gPSB0bXBbYnggKyBieSAqIDY4XTsKfQpvdXQuc3RvcmU8Y29oZXJlbmN5OjpjYWNoZV9hbGw+KAppdGVtcywKbywKeCArIHkgKiBuCik7Cn0KfQpfX2dsb2JhbF9fIF9fbGF1bmNoX2JvdW5kc19fKDI1NikKdm9pZCB0cmFuc3Bvc2VfZmFzdGVyX2Z1c2VkKApmcDgqIG91dHB1dF9hLApmcDgqIG91dHB1dF9iLApjb25zdCBmcDgqIGlucHV0X2EsCmNvbnN0IGZwOCogaW5wdXRfYiwKaW50IG0sCmludCBuLAppbnQgaywKaW50IG1fYmxvY2tzCikgewpjb25zdCBpbnQgeCA9IGJsb2NrSWR4Lng7CmNvbnN0IGludCB5ID0gYmxvY2tJZHgueTsKaWYgKHggPCBtX2Jsb2Nrcykgewp0cmFuc3Bvc2VfbWF0cml4KApvdXRwdXRfYSwKaW5wdXRfYSwKbSwKaywKeCwKeQopOwp9IGVsc2Ugewp0cmFuc3Bvc2VfbWF0cml4KApvdXRwdXRfYiwKaW5wdXRfYiwKbiwKaywKeCAtIG1fYmxvY2tzLAp5Cik7Cn0KfQpmcDgqIHRtcF9hVCA9IG51bGxwdHI7CmZwOCogdG1wX2JUID0gbnVsbHB0cjsKaW50IHByZXZfbSA9IDA7CmludCBwcmV2X24gPSAwOwppbnQgcHJldl9rID0gMDsKdGVtcGxhdGU8CmludCBibG9ja19zaXplLApjdWJlIGJsb2NrX3RpbGUsCmN1YmUgd2FycF90aWxlLApib29sIHBpcGVsaW5lZF9tYWluX2xvb3AgPSBmYWxzZSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlLAp0eXBlbmFtZSBsb2FkX3R5cGUgPSBfX3VpbnQxMjhfdAo+CnZvaWQgcnVuX2tlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgaywKYm9vbCBtZWFzdXJlCikgewpjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7Cmtlcm5lbDwKYmxvY2tfc2l6ZSwKYmxvY2tfdGlsZSwKd2FycF90aWxlLApsb2FkX3R5cGUsCnBpcGVsaW5lZF9tYWluX2xvb3AKPjw8PApkaW0zKGdyaWRfbSwgZ3JpZF9uKSwKZGltMyhibG9ja19zaXplKSwKMAo+Pj4oCmZ1c2VkX3RyYW5zcG9zZSA/IGEgOiB0bXBfYVQsCmZ1c2VkX3RyYW5zcG9zZSA/IGIgOiB0bXBfYlQsCmFzLApicywKYywKbSwKbiwKawopOwpISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CnZvaWQgcnVuKAp1aW50cHRyX3QgYV9wdHIsCnVpbnRwdHJfdCBiX3B0ciwKdWludHB0cl90IGFzX3B0ciwKdWludHB0cl90IGJzX3B0ciwKdWludHB0cl90IGNfcHRyLAppbnQgbSwKaW50IG4sCmludCBrLApib29sIG1lYXN1cmUKKSB7Cgphc3NlcnQoYV9wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGJfcHRyICUgMTYgPT0gMCk7CmFzc2VydChhc19wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGJzX3B0ciAlIDE2ID09IDApOwphc3NlcnQoY19wdHIgJSAxNiA9PSAwKTsKY29uc3QgYXV0byogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwpjb25zdCBhdXRvKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihiX3B0cik7CmNvbnN0IGF1dG8qIGFzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDMyKj4oYXNfcHRyKTsKY29uc3QgYXV0byogYnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihic19wdHIpOwphdXRvKiBjID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oY19wdHIpOwppZiAobSA9PSAxMDI0ICYmIG4gPT0gMTUzNiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2KSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1NzYgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgNjQsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MTYsIDE2LCAzMn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIzMDQpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1MTIgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCBmYWxzZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSAxNTM2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSAzMDcyICYmIGsgPT0gMTUzNikgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDU3NiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDI1NikgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgZmFsc2UsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIwNDgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0NjA4ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezE2LCAxNiwgMzJ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDcxNjggJiYgayA9PSAyMzA0KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIHRydWUsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0KZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNTEyICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgdHJ1ZSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfQplbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIGZhbHNlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9CmVsc2UgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCB0cnVlLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9Cn0KUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewptLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCIsICItV2Vycm9yIl0sCiAgICBidWlsZF9kaXJlY3Rvcnk9Ii93b3Jrc3BhY2UvYnVpbGQvIiBpZiBURVNUSU5HID09ICJ2c2NvZGUiIGVsc2UgIi9ncHVtb2RlL2FtZC9mcDgvYnVpbGQvIiBpZiBURVNUSU5HIGlzIG5vdCBOb25lIGVsc2UgTm9uZSwKICAgICoqKHsnbm9faW1wbGljaXRfaGVhZGVycyc6IFRydWV9IGlmIFRFU1RJTkcgIT0gInZzY29kZSIgZWxzZSB7fSksCikKCmZpcnN0ID0gVHJ1ZQoKY2FjaGVfbSA9IDAKY2FjaGVfbiA9IDAKY2FjaGVfayA9IDAKY2FjaGVfaSA9IDAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgZ2xvYmFsIGZpcnN0CiAgICBpZiBmaXJzdDoKICAgICAgICBwcmludCgiZXhlY3V0aW5nIG9uIiwgdG9yY2guY3VkYS5nZXRfZGV2aWNlX25hbWUoKSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpcnN0ID0gRmFsc2UKCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQoKICAgICMgYSA9IGEuY29udGlndW91cygpCiAgICAjIGIgPSBiLmNvbnRpZ3VvdXMoKQoKICAgIG0sIG4gPSBjLnNoYXBlCiAgICBrID0gYS5zaGFwZVsxXQoKICAgIGdsb2JhbCBjYWNoZV9tCiAgICBnbG9iYWwgY2FjaGVfbgogICAgZ2xvYmFsIGNhY2hlX2sKICAgIGdsb2JhbCBjYWNoZV9pCgogICAgaWYgY2FjaGVfbSAhPSBtIG9yIGNhY2hlX24gIT0gbiBvciBjYWNoZV9rICE9IGs6CiAgICAgICAgY2FjaGVfbSA9IG0KICAgICAgICBjYWNoZV9uID0gbgogICAgICAgIGNhY2hlX2sgPSBrCiAgICAgICAgY2FjaGVfaSA9IDAKICAgIGVsc2U6CiAgICAgICAgY2FjaGVfaSArPSAxCgogICAgIyBEb24ndCBjaGVjayB0aGUgcGVyZm9ybWFuY2Ugb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiB0byBhbGxvdyBmb3Igc29tZSB3YXJtdXAKICAgIG1lYXN1cmUgPSBGYWxzZQogICAgaWYgY2FjaGVfaSA9PSAxOgogICAgICAgIG1lYXN1cmUgPSBUcnVlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMK
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdSBNSTMwMApmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0b3JjaApmcm9tIHRvcmNoLnV0aWxzLmNwcF9leHRlbnNpb24gaW1wb3J0IGxvYWRfaW5saW5lCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKVEVTVElORyA9IG9zLmVudmlyb24uZ2V0KCJHUFVNT0RFX1RFU1RJTkciLCBOb25lKQoKa2VybmVsX2NwcCA9IHIiIiIKI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8Yml0PgojZGVmaW5lIFggY29uc3RleHByCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgQApkbyBACnsgQApoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyBACmlmKGVycm9yICE9IGhpcFN1Y2Nlc3MpIEAKeyBACnN0ZDo6Y2VyciA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiBACjw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKPDwgJzonIDw8IF9fTElORV9fIDw8ICdAbic7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApleGl0KGVycm9yKTsgQAp9IEAKfSBACndoaWxlKGZhbHNlKQp1c2luZyBmcDggPSBfX2hpcF9mcDhfZTRtM19mbnV6Owp1c2luZyBiZjE2ID0gX19oaXBfYmZsb2F0MTY7CnVzaW5nIGZwMzIgPSBmbG9hdDsKdXNpbmcgZnAzMng0ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKdXNpbmcgaTMyeDQgPSBpbnQzMl90IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwp1c2luZyBmcDMyeDE2ID0gZnAzMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CnN0cnVjdCBjdWJlIHsKaW50IG0sIG4sIGs7Cn07ClggaW50IHdhcnBfc2l6ZSA9IDY0OwpYIGludCBjYWNoZV9saW5lX3NpemUgPSAxMjg7ClggaW50IG1fYmxvY2tfc2l6ZV9tdWx0aXBsZSA9IDMyOwpYIGludCBuX2Jsb2NrX3NpemVfbXVsdGlwbGUgPSAzMjsKWCBpbnQga19ibG9ja19zaXplX211bHRpcGxlID0gMTI4Owp1c2luZyByZWdpc3Rlcl90eXBlID0gdWludDMyX3Q7CnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpYIGF1dG8gY2VpbF9kaXYoVCBhLCBVIGIpIHsKcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKfQp0ZW1wbGF0ZTxhdXRvIGEsIGF1dG8gYj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KWCBhdXRvIGRpdmlkZV9leGFjdCgpIHsKc3RhdGljX2Fzc2VydChhICUgYiA9PSAwLCAiZG9lcyBub3QgZGl2aWRlIGV4YWN0ISIpOwpyZXR1cm4gYSAvIGI7Cn0KdGVtcGxhdGU8aW50IGluYywgaW50IGFkZCwgdHlwZW5hbWUgc2VxPgpzdHJ1Y3QgbXVsdGlwbHlfYnlfaW5jOwp0ZW1wbGF0ZTxpbnQgaW5jLCBpbnQgYWRkLCBpbnQuLi4gSXM+CnN0cnVjdCBtdWx0aXBseV9ieV9pbmM8aW5jLCBhZGQsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxpbnQsIElzLi4uPj4gewp1c2luZyB0eXBlID0gc3RkOjppbnRlZ2VyX3NlcXVlbmNlPGludCwgKGluYyAqIElzICsgYWRkKS4uLj47Cn07CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYywgaW50Li4uIElzPgpzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luY19oZWxwZXIgewp1c2luZyB0eXBlID0gdHlwZW5hbWUgbXVsdGlwbHlfYnlfaW5jPGluYywgSSwgc3RkOjptYWtlX2ludGVnZXJfc2VxdWVuY2U8aW50LCAoTiAtIEkpIC8gaW5jPj46OnR5cGU7Cn07CnRlbXBsYXRlPGludCBJLCBpbnQgTiwgaW50IGluYz4KdXNpbmcgbWFrZV9pbmRleF9zZXF1ZW5jZV93aXRoX2luYyA9IHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2Vfd2l0aF9pbmNfaGVscGVyPEksIE4sIGluYz46OnR5cGU7CnRlbXBsYXRlPHR5cGVuYW1lIEYsIGludC4uLiBJcz4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGxfYXBwbHkoRiBmLCBzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCBJcy4uLj4pIHsKKGYudGVtcGxhdGUgb3BlcmF0b3IoKTxJcz4oKSwgLi4uKTsKfQp0ZW1wbGF0ZTxpbnQgSSwgaW50IE4sIGludCBpbmMgPSAxLCB0eXBlbmFtZSBGPgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIHVucm9sbChGIGYpIHsKdW5yb2xsX2FwcGx5KGYsIG1ha2VfaW5kZXhfc2VxdWVuY2Vfd2l0aF9pbmM8SSwgTiwgaW5jPnt9KTsKfQp0ZW1wbGF0ZTxpbnQgSSwgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwxZChGIGYpIHsKdW5yb2xsPDAsIEk+KGYpOwp9CnRlbXBsYXRlPGludCBJLCBpbnQgSiwgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwyZChGIGYpIHsKdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewp1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CmYudGVtcGxhdGUgb3BlcmF0b3IoKTxpLCBqPigpOwp9KTsKfSk7Cn0KdGVtcGxhdGU8aW50IEksIGludCBKLCBpbnQgSywgdHlwZW5hbWUgRj4KX19ob3N0X18gX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCB1bnJvbGwzZChGIGYpIHsKdW5yb2xsPDAsIEk+KFsmXTxpbnQgaT4gewp1bnJvbGw8MCwgSj4oWyZdPGludCBqPiB7CnVucm9sbDwwLCBLPihbJl08aW50IGs+IHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPGksIGosIGs+KCk7Cn0pOwp9KTsKfSk7Cn0KdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwp2b2lkIGNsZWFyKFQgKCZhcnJheSlbTl0pIHsKdW5yb2xsPDAsIE4+KFsmXTxpbnQgaT4gewphcnJheVtpXSA9IFR7MH07Cn0pOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmJmMTYgYmYxNl9mcm9tX2ZwMzIoZmxvYXQgeCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxiZjE2PigKc3RhdGljX2Nhc3Q8dWludDE2X3Q+KApzdGQ6OmJpdF9jYXN0PHVpbnQzMl90Pih4KSA+PiAxNgopCik7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KZnAzMiBmcDMyX2Zyb21fZnA4KGZwOCB4KSB7CiNpZmRlZiBfX2dmeDk0Ml9fCnJldHVybiBmbG9hdCh4KTsKI2Vsc2UKcmV0dXJuIGZsb2F0KHgpOwojZW5kaWYKfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KX19kZXZpY2VfXyBfX2hvc3RfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzZWxlY3QoYm9vbCBjb25kLCBGIGYpIHsKaWYgKGNvbmQpIHsKZi50ZW1wbGF0ZSBvcGVyYXRvcigpPHRydWU+KCk7Cn0gZWxzZSB7CmYudGVtcGxhdGUgb3BlcmF0b3IoKTxmYWxzZT4oKTsKfQp9CnRlbXBsYXRlPGludCBkcHBfY3RybCwgaW50IHJvd19tYXNrID0gMHhmLCBpbnQgYmFua19tYXNrID0gMHhmLCBib29sIGJvdW5kX2N0cmwgPSBmYWxzZT4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18KdWludDMyX3Qgc2hmbF9kcHAodWludDMyX3QgeCkgewpyZXR1cm4gX19idWlsdGluX2FtZGdjbl91cGRhdGVfZHBwKHgsIHgsIGRwcF9jdHJsLCByb3dfbWFzaywgYmFua19tYXNrLCBib3VuZF9jdHJsKTsKfQp0ZW1wbGF0ZTxpbnQgbGFuZV9zdHJpZGU+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnVpbnQzMl90IHRyYW5zcG9zZV80eDRfZjhfdjIodWludDMyX3QgaW5wdXQpIHsKc3RhdGljX2Fzc2VydChsYW5lX3N0cmlkZSA8IHdhcnBfc2l6ZSAvIDQsICJsYW5lIHN0cmlkZSBpcyB0b28gbGFyZ2UiKTsKc3RhdGljX2Fzc2VydCgobGFuZV9zdHJpZGUgJiAobGFuZV9zdHJpZGUgLSAxKSkgPT0gMCwgImxpbmUgc3RyaWRlIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIiKTsKc3RhdGljX2Fzc2VydChsYW5lX3N0cmlkZSA9PSAxLCAiRFBQIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGxhbmVfc3RyaWRlID09IDEiKTsKY29uc3QgYXV0byBsYW5lID0gX19sYW5lX2lkKCk7CmNvbnN0IGF1dG8gZ3JvdXBfbGFuZV9pbmRleCA9IGxhbmUgLyBsYW5lX3N0cmlkZSAlIDQ7CmNvbnN0IGF1dG8gdDJ4MiA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKc2hmbF9kcHA8MGIxMCcxMScwMCcwMT4oaW5wdXQpLAppbnB1dCwKZ3JvdXBfbGFuZV9pbmRleCAlIDIgPT0gMAo/IDB4MDYnMDInMDQnMDAKOiAweDAzJzA3JzAxJzA1Cik7CmNvbnN0IGF1dG8gdDR4NCA9IF9fYnVpbHRpbl9hbWRnY25fcGVybSgKc2hmbF9kcHA8MGIwMScwMCcxMScxMD4odDJ4MiksCnQyeDIsCmdyb3VwX2xhbmVfaW5kZXggPCAyCj8gMHgwNScwNCcwMScwMAo6IDB4MDMnMDInMDcnMDYKKTsKcmV0dXJuIHQ0eDQ7Cn0KX19kZXZpY2VfXyB1aW50OF90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iOChpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmk4Iik7Cl9fZGV2aWNlX18gdWludDE2X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxNihpMzJ4NCBzcnNyYywgdWludDMyX3Qgdm9mZnNldCwgdWludDMyX3Qgc29mZnNldCwgdWludDMyX3QgY29oZXJlbmN5KQpfX2FzbSgibGx2bS5hbWRnY24ucmF3LmJ1ZmZlci5sb2FkLmkxNiIpOwpfX2RldmljZV9fIHVpbnQzMl90IGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iMzIoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pMzIiKTsKX19kZXZpY2VfXyB1aW50NjRfdCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLmxvYWQuaTY0Iik7Cl9fZGV2aWNlX18gX191aW50MTI4X3QgbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IxMjgoaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIubG9hZC5pMTI4Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I4KHVpbnQ4X3QgdmRhdGEsIGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLnN0b3JlLmk4Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxNih1aW50MTZfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTE2Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMih1aW50MzJfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTMyIik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I2NCh1aW50NjRfdCB2ZGF0YSwgaTMyeDQgc3JzcmMsIHVpbnQzMl90IHZvZmZzZXQsIHVpbnQzMl90IHNvZmZzZXQsIHVpbnQzMl90IGNvaGVyZW5jeSkKX19hc20oImxsdm0uYW1kZ2NuLnJhdy5idWZmZXIuc3RvcmUuaTY0Iik7Cl9fZGV2aWNlX18gdm9pZCBsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxMjgoX191aW50MTI4X3QgdmRhdGEsIGkzMng0IHNyc3JjLCB1aW50MzJfdCB2b2Zmc2V0LCB1aW50MzJfdCBzb2Zmc2V0LCB1aW50MzJfdCBjb2hlcmVuY3kpCl9fYXNtKCJsbHZtLmFtZGdjbi5yYXcuYnVmZmVyLnN0b3JlLmkxMjgiKTsKZW51bSBjbGFzcyBjb2hlcmVuY3kgewpjYWNoZV9hbGwgPSAwLApjYWNoZV9nbG9iYWwgPSAxLApjYWNoZV9zdHJlYW0gPSAyLApub25fdGVtcG9yYWwgPSAzCn07CnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgYnVmZmVyIHsKc3RydWN0IGJ1ZmZlcl9yZXNvdXJjZSB7CmNvbnN0IHZvaWQqIHB0cjsKdWludDMyX3QgcmFuZ2U7CnVpbnQzMl90IGNvbmZpZzsKfTsKdXNpbmcgZWxlbV90eXBlID0gc3RkOjpyZW1vdmVfY3ZfdDxUPjsKYnVmZmVyX3Jlc291cmNlIHJzcmM7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmJ1ZmZlcihUKiBwb2ludGVyLCB1aW50MzJfdCBzaXplKSB7CnRoaXMtPnJzcmMgPSBidWZmZXJfcmVzb3VyY2V7CnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBvaW50ZXIpLApzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSAqIHNpemVvZihlbGVtX3R5cGUpKSwKMHgwMDAyMDAwMFUKfTsKfQp0ZW1wbGF0ZTxzaXplX3QgTiwgY29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbD4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+IGxvYWQoCnVpbnQzMl90IHdhdmVfb2Zmc2V0LAp1aW50MzJfdCB0aHJlYWRfb2Zmc2V0LApib29sIGluX2JvdW5kcyA9IHRydWUKKSBjb25zdCB7CnVzaW5nIHJlc3VsdF90eXBlID0gc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+OwpYIGNvbnN0IGludCBsb2FkX3NpemUgPSBzaXplb2YoZWxlbV90eXBlKSAqIE47CndhdmVfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ICo9IHNpemVvZihlbGVtX3R5cGUpOwp0aHJlYWRfb2Zmc2V0ID0gaW5fYm91bmRzID8gdGhyZWFkX29mZnNldCA6IDB4RkZGRidGRkZGOwpjb25zdCBpbnQgY2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGMpOwppZiBYIChsb2FkX3NpemUgPT0gMSkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2I4KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgWCAobG9hZF9zaXplID09IDIpIHsKcmV0dXJuIHN0ZDo6Yml0X2Nhc3Q8cmVzdWx0X3R5cGU+KGxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfbG9hZF9iMTYoCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKSk7Cn0gZWxzZSBpZiBYIChsb2FkX3NpemUgPT0gNCkgewpyZXR1cm4gc3RkOjpiaXRfY2FzdDxyZXN1bHRfdHlwZT4obGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9sb2FkX2IzMigKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIGlmIFggKGxvYWRfc2l6ZSA9PSA4KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjY0KApzdGQ6OmJpdF9jYXN0PGkzMng0Pih0aGlzLT5yc3JjKSwKdGhyZWFkX29mZnNldCwKd2F2ZV9vZmZzZXQsCmNjCikpOwp9IGVsc2UgaWYgWCAobG9hZF9zaXplID09IDE2KSB7CnJldHVybiBzdGQ6OmJpdF9jYXN0PHJlc3VsdF90eXBlPihsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX2xvYWRfYjEyOCgKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopKTsKfSBlbHNlIHsKc3RhdGljX2Fzc2VydChsb2FkX3NpemUgPT0gLTEsICJsb2FkIHNpemUgbm90IGltcGxlbWVudGVkIik7Cn0KfQp0ZW1wbGF0ZTxjb2hlcmVuY3kgYyA9IGNvaGVyZW5jeTo6Y2FjaGVfYWxsLCBzaXplX3QgTj4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzdG9yZSgKY29uc3Qgc3RkOjphcnJheTxlbGVtX3R5cGUsIE4+JiBkYXRhLAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3QgewpYIGNvbnN0IGludCBzdG9yZV9zaXplID0gc2l6ZW9mKGVsZW1fdHlwZSkgKiBOOwp3YXZlX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCAqPSBzaXplb2YoZWxlbV90eXBlKTsKdGhyZWFkX29mZnNldCA9IGluX2JvdW5kcyA/IHRocmVhZF9vZmZzZXQgOiAweEZGRkYnRkZGRjsKY29uc3QgaW50IGNjID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKaWYgWCAoc3RvcmVfc2l6ZSA9PSAxKSB7Cmxsdm1fYW1kZ2NuX3Jhd19idWZmZXJfc3RvcmVfYjgoCnN0ZDo6Yml0X2Nhc3Q8dWludDhfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gMikgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IxNigKc3RkOjpiaXRfY2FzdDx1aW50MTZfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gNCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2IzMigKc3RkOjpiaXRfY2FzdDx1aW50MzJfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gOCkgewpsbHZtX2FtZGdjbl9yYXdfYnVmZmVyX3N0b3JlX2I2NCgKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oZGF0YSksCnN0ZDo6Yml0X2Nhc3Q8aTMyeDQ+KHRoaXMtPnJzcmMpLAp0aHJlYWRfb2Zmc2V0LAp3YXZlX29mZnNldCwKY2MKKTsKfSBlbHNlIGlmIFggKHN0b3JlX3NpemUgPT0gMTYpIHsKbGx2bV9hbWRnY25fcmF3X2J1ZmZlcl9zdG9yZV9iMTI4KApzdGQ6OmJpdF9jYXN0PF9fdWludDEyOF90PihkYXRhKSwKc3RkOjpiaXRfY2FzdDxpMzJ4ND4odGhpcy0+cnNyYyksCnRocmVhZF9vZmZzZXQsCndhdmVfb2Zmc2V0LApjYwopOwp9IGVsc2UgewpzdGF0aWNfYXNzZXJ0KHN0b3JlX3NpemUgPT0gLTEsICJzdG9yZSBzaXplIG5vdCBpbXBsZW1lbnRlZCIpOwp9Cn0KdGVtcGxhdGU8Y29oZXJlbmN5IGMgPSBjb2hlcmVuY3k6OmNhY2hlX2FsbD4KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBzdG9yZSgKY29uc3QgZWxlbV90eXBlJiBkYXRhLAp1aW50MzJfdCB3YXZlX29mZnNldCwKdWludDMyX3QgdGhyZWFkX29mZnNldCwKYm9vbCBpbl9ib3VuZHMgPSB0cnVlCikgY29uc3QgewpzdG9yZTxjPigKc3RkOjphcnJheTxlbGVtX3R5cGUsIDE+KHtkYXRhfSksCndhdmVfb2Zmc2V0LAp0aHJlYWRfb2Zmc2V0LAppbl9ib3VuZHMKKTsKfQp9Owp0ZW1wbGF0ZTwKaW50IGJsb2NrX3NpemUsCmludCBibG9ja190aWxlX20sCmludCBibG9ja190aWxlX24sCnR5cGVuYW1lIGxvYWRfdHlwZSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UKPgpzdHJ1Y3QgYmxvY2tfbG9hZGVyOwp0ZW1wbGF0ZTwKaW50IGJsb2NrX3NpemUsCmludCBibG9ja190aWxlX20sCmludCBibG9ja190aWxlX24sCnR5cGVuYW1lIGxvYWRfdHlwZQo+CnN0cnVjdCBibG9ja19sb2FkZXI8YmxvY2tfc2l6ZSwgYmxvY2tfdGlsZV9tLCBibG9ja190aWxlX24sIGxvYWRfdHlwZSwgdHJ1ZT4gewpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAlIHNpemVvZihsb2FkX3R5cGUpID09IDAsICJ0aWxlIGlubmVyIGRpbWVuc2lvbiBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IGxvYWQgdHlwZSBzaXplIik7Clggc3RhdGljIGludCB0b3RhbF9sb2FkcyA9IGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfbiAvIHNpemVvZihsb2FkX3R5cGUpOwpzdGF0aWNfYXNzZXJ0KHRvdGFsX2xvYWRzICUgYmxvY2tfc2l6ZSA9PSAwLCAidG90YWwgYW1vdW50IG9mIGxvYWRzIG5lZWRzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpYIHN0YXRpYyBpbnQgbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSA9IGJsb2NrX3RpbGVfbSAvIHNpemVvZihsb2FkX3R5cGUpOwpYIHN0YXRpYyBpbnQgbG9hZHNfcGVyX3RocmVhZCA9IHRvdGFsX2xvYWRzIC8gYmxvY2tfc2l6ZTsKWCBzdGF0aWMgaW50IGdyb3VwX3NpemUgPSA0OyAvLyBDb2luY2lkZXMgd2l0aCA0eDQgdHJhbnNwb3NlLgp1c2luZyBmcmdfdHlwZSA9IHN0ZDo6YXJyYXk8bG9hZF90eXBlLCBsb2Fkc19wZXJfdGhyZWFkPjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIGZyZ190eXBlIGxvYWRfZnJvbV9nbG9iYWwoCmNvbnN0IGZwOCogYmxvY2tfdGlsZV9zcmMsCmludCBtLAppbnQgbiwKaW50IGJsb2NrX29mZl9tLAppbnQgYmxvY2tfb2ZmX24KKSB7CmNvbnN0IGF1dG8gb2Zmc2V0ID0gYmxvY2tfb2ZmX24gKiBtICsgYmxvY2tfb2ZmX207CmNvbnN0IGF1dG8gYnVmID0gYnVmZmVyPGNvbnN0IHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJsb2NrX3RpbGVfc3JjKSwgbSAqIG4pOwpjb25zdCBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CmZyZ190eXBlIHJlc3VsdDsKdW5yb2xsPDAsIGxvYWRzX3Blcl90aHJlYWQ+KFsmXTxpbnQgaj4gewpjb25zdCBpbnQgaSA9IGogKiBibG9ja19zaXplICsgdGlkOwpjb25zdCBpbnQgZ3JvdXBfaW5kZXggPSBpICUgZ3JvdXBfc2l6ZTsKY29uc3QgaW50IGdyb3VwX2JhbmsgPSBpIC8gZ3JvdXBfc2l6ZTsKY29uc3QgaW50IHJvdyA9IGdyb3VwX2JhbmsgJSBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tOwpjb25zdCBpbnQgY29sID0gZ3JvdXBfaW5kZXggKyBncm91cF9iYW5rIC8gbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbSAqIGdyb3VwX3NpemU7CmNvbnN0IGludCBzcmNfb2ZmID0gcm93ICogc2l6ZW9mKGxvYWRfdHlwZSkgKyBjb2wgKiBtOwpjb25zdCBpbnQgc3JjX3JvdyA9IHJvdyAqIHNpemVvZihsb2FkX3R5cGUpICsgYmxvY2tfb2ZmX207CmNvbnN0IGludCBzcmNfY29sID0gY29sICsgYmxvY2tfb2ZmX247CmNvbnN0IGJvb2wgaW5fYm91bmRzID0gc3JjX3JvdyA8IG0gJiYgc3JjX2NvbCA8IG47CmNvbnN0IGF1dG8gd29yZCA9IGJ1Zi50ZW1wbGF0ZSBsb2FkPHNpemVvZihsb2FkX3R5cGUpPihvZmZzZXQsIHNyY19vZmYsIGluX2JvdW5kcyk7CnJlc3VsdFtqXSA9IHN0ZDo6Yml0X2Nhc3Q8bG9hZF90eXBlPih3b3JkKTsKfSk7CnJldHVybiByZXN1bHQ7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIHZvaWQgc3RvcmVfdG9fc21lbSgKZnA4KiBibG9ja190aWxlX2RzdCwKZnJnX3R5cGUgdGhyZWFkX3NyYywKaW50IG0sCmludCBuLAppbnQgYmxvY2tfb2ZmX20sCmludCBibG9ja19vZmZfbgopIHsKY29uc3QgaW50IHRpZCA9IHRocmVhZElkeC54Owp1bnJvbGw8MCwgbG9hZHNfcGVyX3RocmVhZD4oWyZdPGludCBqPiB7CmNvbnN0IGludCBpID0gaiAqIGJsb2NrX3NpemUgKyB0aWQ7CmNvbnN0IGludCBncm91cF9pbmRleCA9IGkgJSBncm91cF9zaXplOwpjb25zdCBpbnQgZ3JvdXBfYmFuayA9IGkgLyBncm91cF9zaXplOwpjb25zdCBpbnQgcm93ID0gZ3JvdXBfYmFuayAlIGxvYWRzX3Blcl9ibG9ja190aWxlX207CmNvbnN0IGludCBjb2wgPSBncm91cF9pbmRleCArIGdyb3VwX2JhbmsgLyBsb2Fkc19wZXJfYmxvY2tfdGlsZV9tICogZ3JvdXBfc2l6ZTsKYXV0byogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmxvY2tfdGlsZV9kc3QpOwpjb25zdCBhdXRvIHNyYyA9IHN0ZDo6Yml0X2Nhc3Q8c3RkOjphcnJheTx1aW50MzJfdCwgND4+KHRocmVhZF9zcmNbal0pOwpYIGludCBsYW5lX3N0cmlkZSA9IDE7IC8vbG9hZHNfcGVyX2Jsb2NrX3RpbGVfbTsKdW5yb2xsPDAsIHNpemVvZihsb2FkX3R5cGUpLCBzaXplb2YodWludDMyX3QpPihbJl08aW50IGs+IHsKY29uc3QgaW50IGRzdF9yb3cgPSByb3cgKiBzaXplb2YobG9hZF90eXBlKSArIGs7CmNvbnN0IGludCBkc3RfY29sID0gY29sOwphdXRvIHYgPSBzcmNbayAvIHNpemVvZih1aW50MzJfdCldOwp2ID0gdHJhbnNwb3NlXzR4NF9mOF92MjxsYW5lX3N0cmlkZT4odik7CmNvbnN0IGF1dG8gZ3JvdXBfbGFuZV9pbmRleCA9IF9fbGFuZV9pZCgpIC8gbGFuZV9zdHJpZGUgJSA0OwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZkc3RbKGRzdF9jb2wgLSBkc3RfY29sICUgNCkgKyAoZHN0X3JvdyArIGdyb3VwX2xhbmVfaW5kZXgpICogKGJsb2NrX3RpbGVfbiArIDQpXSkKPSB2Owp9KTsKfSk7Cn0KfTsKdGVtcGxhdGUgPGludCB3YXJwX3RpbGVfbV8sIGludCB3YXJwX3RpbGVfbl8sIHR5cGVuYW1lIFQ+CnN0cnVjdCBtZm1hX2ZyYWdtZW50IHsKdXNpbmcgdHlwZSA9IFQ7Clggc3RhdGljIGNvbnN0IGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZV9tXzsKWCBzdGF0aWMgY29uc3QgaW50IHdhcnBfdGlsZV9uID0gd2FycF90aWxlX25fOwpYIHN0YXRpYyBjb25zdCBpbnQgdG90YWxfaXRlbXMgPSB3YXJwX3RpbGVfbSAqIHdhcnBfdGlsZV9uOwpYIHN0YXRpYyBjb25zdCBpbnQgaXRlbXNfcGVyX3RocmVhZCA9IGRpdmlkZV9leGFjdDx0b3RhbF9pdGVtcywgd2FycF9zaXplPigpOwpYIHN0YXRpYyBjb25zdCBpbnQgcmVnaXN0ZXJzX3Blcl90aHJlYWQgPSBkaXZpZGVfZXhhY3Q8aXRlbXNfcGVyX3RocmVhZCAqIHNpemVvZihUKSwgc2l6ZW9mKHJlZ2lzdGVyX3R5cGUpPigpOwpYIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNfcGVyX3RocmVhZCA9IGl0ZW1zX3Blcl90aHJlYWQgKiBzaXplb2YoVCk7CnJlZ2lzdGVyX3R5cGUgcmVnc1tyZWdpc3RlcnNfcGVyX3RocmVhZF07Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fClggc3RhdGljIG1mbWFfZnJhZ21lbnQgemVybygpIHsKcmV0dXJuIG1mbWFfZnJhZ21lbnR7e319Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSB7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCmNvbnN0IHN0ZDo6YXJyYXk8VCwgaXRlbXNfcGVyX3RocmVhZD4mIHRocmVhZF92YWx1ZXMoKSBjb25zdCB7CnJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdGQ6OmFycmF5PFQsIGl0ZW1zX3Blcl90aHJlYWQ+Kj4oJnRoaXMtPnJlZ3MpOwp9CnRlbXBsYXRlPHR5cGVuYW1lIFU+Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4mIHJlZ3NfYXMoKSB7CnN0YXRpY19hc3NlcnQoYnl0ZXNfcGVyX3RocmVhZCAlIHNpemVvZihVKSA9PSAwLCAidG90YWwgYnl0ZXMgaW4gdGhyZWFkIGZyYWdtZW50IG5vdCBkaXZpc2libGUgYnkgVSIpOwpyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjphcnJheTxVLCBieXRlc19wZXJfdGhyZWFkIC8gc2l6ZW9mKFUpPio+KCZ0aGlzLT5yZWdzKTsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBVPgpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpjb25zdCBzdGQ6OmFycmF5PFUsIGJ5dGVzX3Blcl90aHJlYWQgLyBzaXplb2YoVSk+JiByZWdzX2FzKCkgY29uc3QgewpzdGF0aWNfYXNzZXJ0KGJ5dGVzX3Blcl90aHJlYWQgJSBzaXplb2YoVSkgPT0gMCwgInRvdGFsIGJ5dGVzIGluIHRocmVhZCBmcmFnbWVudCBub3QgZGl2aXNpYmxlIGJ5IFUiKTsKcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN0ZDo6YXJyYXk8VSwgYnl0ZXNfcGVyX3RocmVhZCAvIHNpemVvZihVKT4qPigmdGhpcy0+cmVncyk7Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kdm9pZCBjbGVhcigpIHsKdW5yb2xsPDAsIHJlZ2lzdGVyc19wZXJfdGhyZWFkPihbJl08aW50IGk+IHsKdGhpcy0+cmVnc1tpXSA9IDA7Cn0pOwp9CnN0YXRpYyBYIGludCBmaXJzdF9pdGVtX29mX3JlZyhpbnQgcmVnKSB7CnJldHVybiByZWcgKiBzaXplb2YocmVnaXN0ZXJfdHlwZSk7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mMzJfZjMyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwxNiwgMTYsIDQ+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDQsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDE2LCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDRmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDQ+KGMpLAowLAowLAowCikKKTsKfQp9Owp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9mMzJfZjMyX2YzMjwzMiwgMzIsIDI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDIsIGZsb2F0PjsKdXNpbmcgZnJnX2NfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDMyLCBmbG9hdD47Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyB2b2lkIGV4ZWN1dGUoCmZyZ19jX3R5cGUmIGMsCmNvbnN0IGZyZ19hX3R5cGUmIGEsCmNvbnN0IGZyZ19iX3R5cGUmIGIKKSB7CmMgPSBzdGQ6OmJpdF9jYXN0PGZyZ19jX3R5cGU+KApfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDJmMzIoCnN0ZDo6Yml0X2Nhc3Q8ZmxvYXQ+KGEpLApzdGQ6OmJpdF9jYXN0PGZsb2F0PihiKSwKc3RkOjpiaXRfY2FzdDxmcDMyeDE2PihjKSwKMCwKMCwKMAopCik7Cn0KfTsKdGVtcGxhdGUgPGludCBtLCBpbnQgbiwgaW50IGs+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODsKdGVtcGxhdGUgPD4Kc3RydWN0IG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+IHsKdXNpbmcgZnJnX2FfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MTYsIDMyLCBmcDg+Owp1c2luZyBmcmdfYl90eXBlID0gbWZtYV9mcmFnbWVudDwxNiwgMzIsIGZwOD47CnVzaW5nIGZyZ19jX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDE2LCAxNiwgZmxvYXQ+OwpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgdm9pZCBleGVjdXRlKApmcmdfY190eXBlJiBjLApjb25zdCBmcmdfYV90eXBlJiBhLApjb25zdCBmcmdfYl90eXBlJiBiCikgewojaWZkZWYgX19ISVBfREVWSUNFX0NPTVBJTEVfXwojaWZkZWYgX19nZng5NDJfXwpjID0gc3RkOjpiaXRfY2FzdDxmcmdfY190eXBlPigKX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KApzdGQ6OmJpdF9jYXN0PHVpbnQ2NF90PihhKSwKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYiksCnN0ZDo6Yml0X2Nhc3Q8ZnAzMng0PihjKSwKMCwKMCwKMAopCik7CiNlbHNlCnVzaW5nIGZhbGxiYWNrX21mbWEgPSBtZm1hX2YzMl9mMzJfZjMyPDE2LCAxNiwgND47CmNvbnN0IGF1dG8mIGFfdmFsdWVzID0gYS50aHJlYWRfdmFsdWVzKCk7CmNvbnN0IGF1dG8mIGJfdmFsdWVzID0gYi50aHJlYWRfdmFsdWVzKCk7CnVucm9sbDwwLCBmcmdfYV90eXBlOjppdGVtc19wZXJfdGhyZWFkPihbJl08aW50IGs+IHsKY29uc3QgYXV0byBmYWxsYmFja19hID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYV90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYV92YWx1ZXNba10pKTsKY29uc3QgYXV0byBmYWxsYmFja19iID0gc3RkOjpiaXRfY2FzdDxmYWxsYmFja19tZm1hOjpmcmdfYl90eXBlPihzdGF0aWNfY2FzdDxmbG9hdD4oYl92YWx1ZXNba10pKTsKZmFsbGJhY2tfbWZtYTo6ZXhlY3V0ZShjLCBmYWxsYmFja19hLCBmYWxsYmFja19iKTsKfSk7CiNlbmRpZgojZW5kaWYKfQp9Owp0ZW1wbGF0ZTw+CnN0cnVjdCBtZm1hX2YzMl9mOF9mODwzMiwgMzIsIDE2PiB7CnVzaW5nIGZyZ19hX3R5cGUgPSBtZm1hX2ZyYWdtZW50PDMyLCAxNiwgZnA4PjsKdXNpbmcgZnJnX2JfdHlwZSA9IG1mbWFfZnJhZ21lbnQ8MzIsIDE2LCBmcDg+Owp1c2luZyBmcmdfY190eXBlID0gbWZtYV9mcmFnbWVudDwzMiwgMzIsIGZsb2F0PjsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIHZvaWQgZXhlY3V0ZSgKZnJnX2NfdHlwZSYgYywKY29uc3QgZnJnX2FfdHlwZSYgYSwKY29uc3QgZnJnX2JfdHlwZSYgYgopIHsKI2lmZGVmIF9fSElQX0RFVklDRV9DT01QSUxFX18KI2lmZGVmIF9fZ2Z4OTQyX18KYyA9IHN0ZDo6Yml0X2Nhc3Q8ZnJnX2NfdHlwZT4oCl9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKc3RkOjpiaXRfY2FzdDx1aW50NjRfdD4oYSksCnN0ZDo6Yml0X2Nhc3Q8dWludDY0X3Q+KGIpLApzdGQ6OmJpdF9jYXN0PGZwMzJ4MTY+KGMpLAowLAowLAowCikKKTsKI2Vsc2UKdXNpbmcgZmFsbGJhY2tfbWZtYSA9IG1mbWFfZjMyX2YzMl9mMzI8MzIsIDMyLCAyPjsKY29uc3QgYXV0byYgYV92YWx1ZXMgPSBhLnRocmVhZF92YWx1ZXMoKTsKY29uc3QgYXV0byYgYl92YWx1ZXMgPSBiLnRocmVhZF92YWx1ZXMoKTsKdW5yb2xsPDAsIGZyZ19hX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaz4gewpjb25zdCBhdXRvIGZhbGxiYWNrX2EgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19hX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihhX3ZhbHVlc1trXSkpOwpjb25zdCBhdXRvIGZhbGxiYWNrX2IgPSBzdGQ6OmJpdF9jYXN0PGZhbGxiYWNrX21mbWE6OmZyZ19iX3R5cGU+KHN0YXRpY19jYXN0PGZsb2F0PihiX3ZhbHVlc1trXSkpOwpmYWxsYmFja19tZm1hOjpleGVjdXRlKGMsIGZhbGxiYWNrX2EsIGZhbGxiYWNrX2IpOwp9KTsKI2VuZGlmCiNlbmRpZgp9Cn07Ci8vIFRoZSBjYWxjdWxhdGlvbnMgaGVyZSBhcmUgb2J0YWluZWQgdmlhIHRoZQovLyBBTUQgbWF0cml4IGluc3RydWN0aW9uIGNhbGN1bGF0b3IKLy8gaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vYW1kX21hdHJpeF9pbnN0cnVjdGlvbl9jYWxjdWxhdG9yCi8vIFRoZXJlIGlzIGEgY2xlYW5lciB3YXkgdG8gY29tcHV0ZSB0aGUgbWFwcGluZywgYnV0Ci8vIHRoaXMgaXMgd2hhdCB0aGUgdG9vbCByZXR1cm5zIGFuZCBJJ20gbGF6eS4gV2Ugb25seQovLyByZWFsbHkgbmVlZCB0aGVzZSB0d28gYW55d2F5IGZvciBub3cuCnRlbXBsYXRlIDx0eXBlbmFtZSBtZm1hPgpzdHJ1Y3QgbWZtYV9pbmRleGVyOwp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWZtYV9pbmRleGVyPG1mbWFfZjMyX2Y4X2Y4PDE2LCAxNiwgMzI+PiB7Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBYIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYShpbnQgbGFuZSwgaW50IGl0ZW0pIHsKY29uc3QgaW50IG0gPSBsYW5lICUgMTY7CmNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMTYpICsgaXRlbTsKcmV0dXJuIHttLCBrfTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgWCBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2IoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gbGFuZSAlIDE2Owpjb25zdCBpbnQgayA9IDggKiAobGFuZSAvIDE2KSArIGl0ZW07CnJldHVybiB7biwga307Cn0KX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIFggc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9jKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IDQgKiAobGFuZSAvIDE2KSArIGl0ZW07CmNvbnN0IGludCBuID0gbGFuZSAlIDE2OwpyZXR1cm4ge20sIG59Owp9Cn07CnRlbXBsYXRlIDw+CnN0cnVjdCBtZm1hX2luZGV4ZXI8bWZtYV9mMzJfZjhfZjg8MzIsIDMyLCAxNj4+IHsKX19kZXZpY2VfXyBfX2ZvcmNlaW5saW5lX18Kc3RhdGljIFggc3RkOjpwYWlyPGludCwgaW50PiBpdGVtX3RvX21hdHJpeF9hKGludCBsYW5lLCBpbnQgaXRlbSkgewpjb25zdCBpbnQgbSA9IGxhbmUgJSAzMjsKY29uc3QgaW50IGsgPSA4ICogKGxhbmUgLyAzMikgKyBpdGVtOwpyZXR1cm4ge20sIGt9Owp9Cl9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fCnN0YXRpYyBYIHN0ZDo6cGFpcjxpbnQsIGludD4gaXRlbV90b19tYXRyaXhfYihpbnQgbGFuZSwgaW50IGl0ZW0pIHsKY29uc3QgaW50IG4gPSBsYW5lICUgMzI7CmNvbnN0IGludCBrID0gOCAqIChsYW5lIC8gMzIpICsgaXRlbTsKcmV0dXJuIHtuLCBrfTsKfQpfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXwpzdGF0aWMgWCBzdGQ6OnBhaXI8aW50LCBpbnQ+IGl0ZW1fdG9fbWF0cml4X2MoaW50IGxhbmUsIGludCBpdGVtKSB7CmNvbnN0IGludCBuID0gOCAqIChpdGVtIC8gNCkgJSAzMiArIDQgKiAobGFuZSAvIDMyKSArIChpdGVtICUgNCk7CmNvbnN0IGludCBtID0gbGFuZSAlIDMyOwpyZXR1cm4ge24sIG19Owp9Cn07CnRlbXBsYXRlIDwKaW50IGJsb2NrX3NpemUsCmN1YmUgYmxvY2tfdGlsZSwKY3ViZSB3YXJwX3RpbGUsCnR5cGVuYW1lIGxvYWRfdHlwZSwKaW50IHBpcGVsaW5lX2RlcHRoID0gMSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlCj4KX19nbG9iYWxfXyBfX2xhdW5jaF9ib3VuZHNfXyhibG9ja19zaXplKQp2b2lkIGtlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgawopIHsKWCBpbnQgd2FycHMgPSBibG9ja19zaXplIC8gd2FycF9zaXplOwpYIGludCBibG9ja190aWxlX20gPSBibG9ja190aWxlLm07ClggaW50IGJsb2NrX3RpbGVfbiA9IGJsb2NrX3RpbGUubjsKWCBpbnQgYmxvY2tfdGlsZV9rID0gYmxvY2tfdGlsZS5rOwpYIGludCB3YXJwX3RpbGVfbSA9IHdhcnBfdGlsZS5tOwpYIGludCB3YXJwX3RpbGVfbiA9IHdhcnBfdGlsZS5uOwpYIGludCB3YXJwX3RpbGVfayA9IHdhcnBfdGlsZS5rOwpYIGludCBjX3RvdGFsID0gYmxvY2tfdGlsZV9tICogYmxvY2tfdGlsZV9uOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAqIGJsb2NrX3RpbGVfayAlIGJsb2NrX3NpemUgPT0gMCwgInNpemUoYmxvY2tfdGlsZV9hKSBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IHRoZSBibG9jayBzaXplIik7CnN0YXRpY19hc3NlcnQoYmxvY2tfdGlsZV9uICogYmxvY2tfdGlsZV9rICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2IpIGhhcyB0byBiZSBkaXZpc2libGUgYnkgdGhlIGJsb2NrIHNpemUiKTsKc3RhdGljX2Fzc2VydChjX3RvdGFsICUgYmxvY2tfc2l6ZSA9PSAwLCAic2l6ZShibG9ja190aWxlX2MpIGFzIHRvIGJlIGRpdmlzaWJsZSBieSB0aGUgYmxvY2sgc2l6ZSIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbSAlIHdhcnBfdGlsZV9tID09IDAsICJ3YXJwIHRpbGUgTSBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgTSIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfbiAlIHdhcnBfdGlsZV9uID09IDAsICJ3YXJwIHRpbGUgTiBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgTiIpOwpzdGF0aWNfYXNzZXJ0KGJsb2NrX3RpbGVfayAlIHdhcnBfdGlsZV9rID09IDAsICJ3YXJwIHRpbGUgSyBoYXMgdG8gZGl2aWRlIGJsb2NrIHRpbGUgSyIpOwpYIGludCB3YXJwX3RpbGVzX20gPSBibG9ja190aWxlX20gLyB3YXJwX3RpbGVfbTsKWCBpbnQgd2FycF90aWxlc19uID0gYmxvY2tfdGlsZV9uIC8gd2FycF90aWxlX247ClggaW50IHdhcnBfdGlsZXNfayA9IGJsb2NrX3RpbGVfayAvIHdhcnBfdGlsZV9rOwpYIGludCB3YXJwX3RpbGVzX21uID0gd2FycF90aWxlc19tICogd2FycF90aWxlc19uOwpYIGludCBpbnRyYV93YXJwX3RpbGVzX20gPSB3YXJwcyA9PSAxID8gMSA6IDI7ClggaW50IGludHJhX3dhcnBfdGlsZXNfbiA9IHdhcnBzID09IDEgfHwgd2FycHMgPT0gMiA/IDEgOiB3YXJwcyA9PSA0ID8gMiA6IDQ7ClggaW50IGludHJhX3dhcnBfdGlsZV9tID0gZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbSwgaW50cmFfd2FycF90aWxlc19tPigpOwpYIGludCBpbnRyYV93YXJwX3RpbGVfbiA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX24sIGludHJhX3dhcnBfdGlsZXNfbj4oKTsKWCBpbnQgd2FycF90aWxlc19tbl9wZXJfd2FycCA9IGRpdmlkZV9leGFjdDx3YXJwX3RpbGVzX21uLCB3YXJwcz4oKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVfbSAqIGludHJhX3dhcnBfdGlsZV9uID09IHdhcnBfdGlsZXNfbW5fcGVyX3dhcnAsICJzYW5pdHkgY2hlY2siKTsKc3RhdGljX2Fzc2VydChpbnRyYV93YXJwX3RpbGVzX20gKiBpbnRyYV93YXJwX3RpbGVzX24gPT0gd2FycHMsICJzYW5pdHkgY2hlY2siKTsKWCBpbnQgd2FycF90aWxlX21uX2l0ZW1zID0gd2FycF90aWxlX20gKiB3YXJwX3RpbGVfbjsKdXNpbmcgbWZtYSA9IG1mbWFfZjMyX2Y4X2Y4PHdhcnBfdGlsZV9tLCB3YXJwX3RpbGVfbiwgd2FycF90aWxlX2s+Owp1c2luZyBmcmdfYV90eXBlID0gdHlwZW5hbWUgbWZtYTo6ZnJnX2FfdHlwZTsKdXNpbmcgZnJnX2JfdHlwZSA9IHR5cGVuYW1lIG1mbWE6OmZyZ19iX3R5cGU7CnVzaW5nIGZyZ19jX3R5cGUgPSB0eXBlbmFtZSBtZm1hOjpmcmdfY190eXBlOwp1c2luZyBpbmRleGVyID0gbWZtYV9pbmRleGVyPG1mbWE+Owp1c2luZyBibG9ja19sb2FkZXJfYSA9IGJsb2NrX2xvYWRlcjxibG9ja19zaXplLCBibG9ja190aWxlX20sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlLCBmdXNlZF90cmFuc3Bvc2U+Owp1c2luZyBibG9ja19sb2FkZXJfYiA9IGJsb2NrX2xvYWRlcjxibG9ja19zaXplLCBibG9ja190aWxlX24sIGJsb2NrX3RpbGVfaywgbG9hZF90eXBlLCBmdXNlZF90cmFuc3Bvc2U+OwpYIGludCBjX3Blcl90aHJlYWQgPSBjX3RvdGFsIC8gYmxvY2tfc2l6ZTsKc3RhdGljX2Fzc2VydChjX3Blcl90aHJlYWQgPT0gd2FycF90aWxlc19tbl9wZXJfd2FycCAqIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQsICJzYW5pdHkgY2hlY2siKTsKY29uc3QgaW50IHRpZCA9IHRocmVhZElkeC54Owpjb25zdCBpbnQgd2FycCA9IHRpZCAvIHdhcnBfc2l6ZTsKY29uc3QgaW50IGxhbmUgPSBfX2xhbmVfaWQoKTsKY29uc3QgaW50IHRpX20gPSBncmlkRGltLnggLSBibG9ja0lkeC54IC0gMTsKY29uc3QgaW50IHRpX24gPSBncmlkRGltLnkgLSBibG9ja0lkeC55IC0gMTsKY29uc3QgaW50IGludHJhX3dhcnBfdGlsZV9pbSA9IHdhcnAgJSBpbnRyYV93YXJwX3RpbGVzX207CmNvbnN0IGludCBpbnRyYV93YXJwX3RpbGVfaW4gPSB3YXJwIC8gaW50cmFfd2FycF90aWxlc19tOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX29tID0gaW50cmFfd2FycF90aWxlX2ltICogZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbSwgaW50cmFfd2FycF90aWxlc19tPigpOwpjb25zdCBpbnQgaW50cmFfd2FycF90aWxlX29uID0gaW50cmFfd2FycF90aWxlX2luICogZGl2aWRlX2V4YWN0PHdhcnBfdGlsZXNfbiwgaW50cmFfd2FycF90aWxlc19uPigpOwppbnQgc24gPSBjZWlsX2RpdihuLCAxMjgpOwpmcmdfY190eXBlIGJsb2NrX2NfZnJnW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewpibG9ja19jX2ZyZ1tpXVtqXS5jbGVhcigpOwp9KTsKX19zaGFyZWRfXyBmcDggYmxvY2tfdGlsZV9hW2Jsb2NrX3RpbGVfbSAqIChibG9ja190aWxlX2sgKyA0KV07Cl9fc2hhcmVkX18gZnA4IGJsb2NrX3RpbGVfYltibG9ja190aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwpfX3NoYXJlZF9fIGZsb2F0IGJsb2NrX3RpbGVfc2NhbGluZ1tibG9ja19zaXplXTsKY29uc3QgYXV0byBsb2FkX2lucHV0ID0gWyZdKGludCBpKSB7CmZsb2F0IGZyZ19hczsKaWYgKHRpZCA8IDEyOCkgewpmcmdfYXMgPSBhc1tpIC8gMTI4ICogbSArIHRpX20gKiBibG9ja190aWxlX20gKyB0aWRdOwp9CmZsb2F0IGZyZ19icyA9IGJzW2kgLyAxMjggKiBzbiArIHRpX24gKiBibG9ja190aWxlX24gLyAxMjhdOwpjb25zdCBhdXRvIGZyZ19hID0gYmxvY2tfbG9hZGVyX2E6OmxvYWRfZnJvbV9nbG9iYWwoCmEsIG0sIGssIHRpX20gKiBibG9ja190aWxlX20sIGkKKTsKY29uc3QgYXV0byBmcmdfYiA9IGJsb2NrX2xvYWRlcl9iOjpsb2FkX2Zyb21fZ2xvYmFsKApiLCBuLCBrLCB0aV9uICogYmxvY2tfdGlsZV9uLCBpCik7CnJldHVybiBzdGQ6Om1ha2VfdHVwbGUoZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7Cn07CmNvbnN0IGF1dG8gc3RvcmVfaW5wdXQgPSBbJl0oaW50IGksIGNvbnN0IGF1dG8mIGZyZ19hLCBjb25zdCBhdXRvJiBmcmdfYiwgY29uc3QgYXV0byYgZnJnX2FzLCBjb25zdCBhdXRvJiBmcmdfYnMpIHsKYmxvY2tfbG9hZGVyX2E6OnN0b3JlX3RvX3NtZW0oYmxvY2tfdGlsZV9hLCBmcmdfYSwgbSwgaywgdGlfbSAqIGJsb2NrX3RpbGVfbSwgaSk7CmJsb2NrX2xvYWRlcl9iOjpzdG9yZV90b19zbWVtKGJsb2NrX3RpbGVfYiwgZnJnX2IsIG4sIGssIHRpX24gKiBibG9ja190aWxlX24sIGkpOwpibG9ja190aWxlX3NjYWxpbmdbdGlkXSA9IGZyZ19hcyAqIGZyZ19iczsKfTsKY29uc3QgYXV0byBtbWEgPSBbJl0oaW50IGkpIHsKZnJnX2FfdHlwZSBmcmdfYVtpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGZwOCogYmFzZSA9ICZibG9ja190aWxlX2Fbd3RtICogd2FycF90aWxlX20gKiAoYmxvY2tfdGlsZV9rICsgNCldOwp1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewpYIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwp1bnJvbGw8MCwgZnJnX2FfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbWtfcmVnPiB7CmNvbnN0IGF1dG8gW21mbWFfaW0sIG1mbWFfaWtdID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYShsYW5lLCBmcmdfYV90eXBlOjpmaXJzdF9pdGVtX29mX3JlZyhta19yZWcpKTsKY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKY29uc3QgaW50IHNyY19pZHggPSBiaWsgKyBtZm1hX2ltICogKGJsb2NrX3RpbGVfayArIDQpOwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZmcmdfYVtpd3RtXVtpd3RuXVt3dGtdLnJlZ3NbbWtfcmVnXSkgPQoqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZiYXNlW3NyY19pZHhdKTsKfSk7Cn0pOwp9KTsKZnJnX2JfdHlwZSBmcmdfYltpbnRyYV93YXJwX3RpbGVfbV1baW50cmFfd2FycF90aWxlX25dW3dhcnBfdGlsZXNfa107CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpd3RtLCBpbnQgaXd0bj4gewpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGZwOCogYmFzZSA9ICZibG9ja190aWxlX2Jbd3RuICogd2FycF90aWxlX24gKiAoYmxvY2tfdGlsZV9rICsgNCldOwp1bnJvbGw8MCwgYmxvY2tfdGlsZV9rLCB3YXJwX3RpbGVfaz4oWyZdPGludCB3dGtfYmFzZT4gewpYIGludCB3dGsgPSB3dGtfYmFzZSAvIHdhcnBfdGlsZV9rOwp1bnJvbGw8MCwgZnJnX2JfdHlwZTo6cmVnaXN0ZXJzX3Blcl90aHJlYWQ+KFsmXTxpbnQgbmtfcmVnPiB7CmNvbnN0IGF1dG8gW21mbWFfaW4sIG1mbWFfaWtdID0gaW5kZXhlcjo6aXRlbV90b19tYXRyaXhfYihsYW5lLCBmcmdfYl90eXBlOjpmaXJzdF9pdGVtX29mX3JlZyhua19yZWcpKTsKY29uc3QgaW50IGJpayA9IHd0a19iYXNlICsgbWZtYV9pazsKY29uc3QgaW50IHNyY19pZHggPSBiaWsgKyBtZm1hX2luICogKGJsb2NrX3RpbGVfayArIDQpOwoqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZmcmdfYltpd3RtXVtpd3RuXVt3dGtdLnJlZ3NbbmtfcmVnXSkgPQoqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZiYXNlW3NyY19pZHhdKTsKfSk7Cn0pOwp9KTsKZnJnX2NfdHlwZSB3YXJwX2ZyZ19jW2ludHJhX3dhcnBfdGlsZV9tXVtpbnRyYV93YXJwX3RpbGVfbl07CnVucm9sbDJkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbj4oWyZdPGludCBpLCBpbnQgaj4gewp3YXJwX2ZyZ19jW2ldW2pdLmNsZWFyKCk7Cn0pOwppZiBYIChwaXBlbGluZV9kZXB0aCA9PSAyKSB7Cl9fYnVpbHRpbl9hbWRnY25fc2NoZWRfYmFycmllcigwKTsKX19idWlsdGluX2FtZGdjbl9zX3NldHByaW8oMSk7Cl9fYnVpbHRpbl9hbWRnY25fc2NoZWRfYmFycmllcigwKTsKfQp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIHdhcnBfdGlsZXNfaz4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IHd0az4gewptZm1hOjpleGVjdXRlKAp3YXJwX2ZyZ19jW2l3dG1dW2l3dG5dLApmcmdfYVtpd3RtXVtpd3RuXVt3dGtdLApmcmdfYltpd3RtXVtpd3RuXVt3dGtdCik7Cn0pOwp1bnJvbGwzZDxpbnRyYV93YXJwX3RpbGVfbSwgaW50cmFfd2FycF90aWxlX24sIGZyZ19jX3R5cGU6Oml0ZW1zX3Blcl90aHJlYWQ+KFsmXTxpbnQgaXd0bSwgaW50IGl3dG4sIGludCBtbl9pdGVtPiB7CmNvbnN0IGludCB3dG0gPSBpbnRyYV93YXJwX3RpbGVfb20gKyBpd3RtOwpjb25zdCBpbnQgd3RuID0gaW50cmFfd2FycF90aWxlX29uICsgaXd0bjsKY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwpjb25zdCBpbnQgYmltID0gd3RtICogd2FycF90aWxlX20gKyBtZm1hX2ltOwpibG9ja19jX2ZyZ1tpd3RtXVtpd3RuXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0gKz0gd2FycF9mcmdfY1tpd3RtXVtpd3RuXS50aHJlYWRfdmFsdWVzKClbbW5faXRlbV0KKiBibG9ja190aWxlX3NjYWxpbmdbYmltXTsKfSk7CmlmIFggKHBpcGVsaW5lX2RlcHRoID09IDIpIHsKX19idWlsdGluX2FtZGdjbl9zY2hlZF9iYXJyaWVyKDApOwpfX2J1aWx0aW5fYW1kZ2NuX3Nfc2V0cHJpbygwKTsKX19idWlsdGluX2FtZGdjbl9zY2hlZF9iYXJyaWVyKDApOwp9Cn07CmlmIFggKHBpcGVsaW5lX2RlcHRoID09IDApIHsKZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpjb25zdCBhdXRvIFtmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzXSA9IGxvYWRfaW5wdXQoaSk7CnN0b3JlX2lucHV0KGksIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwpfX3N5bmN0aHJlYWRzKCk7Cm1tYShpKTsKX19zeW5jdGhyZWFkcygpOwp9Cn0gZWxzZSBpZiBYIChwaXBlbGluZV9kZXB0aCA9PSAxKSB7CmludCBpID0gMDsKYXV0byBbZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19ic10gPSBsb2FkX2lucHV0KGkpOwpzdG9yZV9pbnB1dChpLCBmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKTsKZm9yICg7IGkgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CnN0b3JlX2lucHV0KGkgKyBibG9ja190aWxlX2ssIGZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnMpOwp9Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwp9IGVsc2UgaWYgWCAocGlwZWxpbmVfZGVwdGggPT0gMikgewppbnQgaSA9IDA7CmF1dG8gW2ZyZ19hLCBmcmdfYiwgZnJnX2FzLCBmcmdfYnNdID0gbG9hZF9pbnB1dChpKTsKc3RvcmVfaW5wdXQoaSwgZnJnX2EsIGZyZ19iLCBmcmdfYXMsIGZyZ19icyk7CmF1dG8gW2ZyZ19hMSwgZnJnX2IxLCBmcmdfYXMxLCBmcmdfYnMxXSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayk7CmZvcig7IGkgKyBibG9ja190aWxlX2sgKyBibG9ja190aWxlX2sgPCBrOyBpICs9IGJsb2NrX3RpbGVfaykgewpzdGQ6OnRpZShmcmdfYSwgZnJnX2IsIGZyZ19hcywgZnJnX2JzKSA9IGxvYWRfaW5wdXQoaSArIGJsb2NrX3RpbGVfayArIGJsb2NrX3RpbGVfayk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CnN0b3JlX2lucHV0KGkgKyBibG9ja190aWxlX2ssIGZyZ19hMSwgZnJnX2IxLCBmcmdfYXMxLCBmcmdfYnMxKTsKZnJnX2ExID0gZnJnX2E7CmZyZ19iMSA9IGZyZ19iOwpmcmdfYXMxID0gZnJnX2FzOwpmcmdfYnMxID0gZnJnX2JzOwp9Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkpOwpfX3N5bmN0aHJlYWRzKCk7CmlmIChpICsgYmxvY2tfdGlsZV9rIDwgaykgewpzdG9yZV9pbnB1dChpICsgYmxvY2tfdGlsZV9rLCBmcmdfYTEsIGZyZ19iMSwgZnJnX2FzMSwgZnJnX2JzMSk7Cl9fc3luY3RocmVhZHMoKTsKbW1hKGkgKyBibG9ja190aWxlX2spOwp9Cn0gZWxzZSB7CnN0YXRpY19hc3NlcnQocGlwZWxpbmVfZGVwdGggPj0gMCAmJiBwaXBlbGluZV9kZXB0aCA8PSAyLCAiaW52YWxpZCBwaXBlbGluZSBkZXB0aCIpOwp9CmNvbnN0IGludCBpbV9iYXNlID0gdGlfbSAqIGJsb2NrX3RpbGVfbTsKY29uc3QgaW50IGluX2Jhc2UgPSB0aV9uICogYmxvY2tfdGlsZV9uOwphdXRvIGJ1ZiA9IGJ1ZmZlcjxiZjE2PihjLCBtICogbik7CnVucm9sbDNkPGludHJhX3dhcnBfdGlsZV9tLCBpbnRyYV93YXJwX3RpbGVfbiwgZnJnX2NfdHlwZTo6aXRlbXNfcGVyX3RocmVhZD4oWyZdPGludCBpd3RtLCBpbnQgaXd0biwgaW50IG1uX2l0ZW0+IHsKY29uc3QgYXV0byBbbWZtYV9pbSwgbWZtYV9pbl0gPSBpbmRleGVyOjppdGVtX3RvX21hdHJpeF9jKGxhbmUsIG1uX2l0ZW0pOwpjb25zdCBpbnQgd3RtID0gaW50cmFfd2FycF90aWxlX29tICsgaXd0bTsKY29uc3QgaW50IHd0biA9IGludHJhX3dhcnBfdGlsZV9vbiArIGl3dG47CmNvbnN0IGludCBiaW0gPSB3dG0gKiB3YXJwX3RpbGVfbSArIG1mbWFfaW07CmNvbnN0IGludCBiaW4gPSB3dG4gKiB3YXJwX3RpbGVfbiArIG1mbWFfaW47CmNvbnN0IGludCBpbSA9IGltX2Jhc2UgKyBiaW07CmNvbnN0IGludCBpbiA9IGluX2Jhc2UgKyBiaW47CmNvbnN0IGF1dG8gdmFsID0gYmYxNl9mcm9tX2ZwMzIoYmxvY2tfY19mcmdbaXd0bV1baXd0bl0udGhyZWFkX3ZhbHVlcygpW21uX2l0ZW1dKTsKYnVmLnN0b3JlPGNvaGVyZW5jeTo6bm9uX3RlbXBvcmFsPih2YWwsIDAsIGltICogbiArIGluLCBpbSA8IG0gJiYgaW4gPCBuKTsKfSk7Cn0KX19kZXZpY2VfXwp2b2lkIHRyYW5zcG9zZV9tYXRyaXgoCmZwOCogb3V0cHV0LApjb25zdCBmcDgqIGlucHV0LAppbnQgbSwKaW50IG4sCmludCBibG9ja194LAppbnQgYmxvY2tfeQopIHsKYXV0byBpbiA9IGJ1ZmZlcjxjb25zdCB1aW50OF90PihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpbnB1dCksIG0gKiBuKTsKYXV0byBvdXQgPSBidWZmZXI8Y29uc3QgdWludDhfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ob3V0cHV0KSwgbiAqIG0pOwpjb25zdCBhdXRvIHRpZCA9IHRocmVhZElkeC54Owpjb25zdCBpbnQgaXRlbXNfcGVyX3RocmVhZCA9IDE2OwpfX3NoYXJlZF9fIHVpbnQ4X3QgdG1wWzY4ICogNjRdOwpjb25zdCBhdXRvIGJtID0gYmxvY2tfeCAqIDY0Owpjb25zdCBhdXRvIGJuID0gYmxvY2tfeSAqIDY0Owp7CmNvbnN0IGludCBpID0gdGlkICogaXRlbXNfcGVyX3RocmVhZDsKY29uc3QgaW50IG8gPSBibSArIGJuICogbTsKY29uc3QgaW50IHggPSBpIC8gNjQ7CmNvbnN0IGludCB5ID0gaSAlIDY0Owpjb25zdCBhdXRvIGl0ZW1zID0gaW4ubG9hZDxpdGVtc19wZXJfdGhyZWFkLCBjb2hlcmVuY3k6Om5vbl90ZW1wb3JhbD4obywgeCAqIG0gKyB5KTsKKnJlaW50ZXJwcmV0X2Nhc3Q8X191aW50MTI4X3QqPigmdG1wW3ggKiA2OCArIHldKSA9IHN0ZDo6Yml0X2Nhc3Q8X191aW50MTI4X3Q+KGl0ZW1zKTsKfQpfX3N5bmN0aHJlYWRzKCk7CnsKY29uc3QgaW50IGkgPSB0aWQgKiBpdGVtc19wZXJfdGhyZWFkOwpjb25zdCBpbnQgbyA9IGJtICogbiArIGJuOwpjb25zdCBpbnQgeCA9IGkgJSA2NDsKY29uc3QgaW50IHkgPSBpIC8gNjQ7CnN0ZDo6YXJyYXk8dWludDhfdCwgaXRlbXNfcGVyX3RocmVhZD4gaXRlbXM7CmZvciAoaW50IGogPSAwOyBqIDwgaXRlbXNfcGVyX3RocmVhZDsgKytqKSB7CmNvbnN0IGludCBieCA9IChpICsgaikgLyA2NDsKY29uc3QgaW50IGJ5ID0gKGkgKyBqKSAlIDY0OwppdGVtc1tqXSA9IHRtcFtieCArIGJ5ICogNjhdOwp9Cm91dC5zdG9yZTxjb2hlcmVuY3k6OmNhY2hlX2FsbD4oCml0ZW1zLApvLAp4ICsgeSAqIG4KKTsKfQp9CnRlbXBsYXRlPAppbnQgYmxvY2tfc2l6ZSwKY3ViZSBibG9ja190aWxlLApjdWJlIHdhcnBfdGlsZSwKaW50IHBpcGVsaW5lX2RlcHRoID0gMSwKYm9vbCBmdXNlZF90cmFuc3Bvc2UgPSB0cnVlLAp0eXBlbmFtZSBsb2FkX3R5cGUgPSBfX3VpbnQxMjhfdAo+CnZvaWQgcnVuX2tlcm5lbCgKY29uc3QgZnA4KiBhLApjb25zdCBmcDgqIGIsCmNvbnN0IGZwMzIqIGFzLApjb25zdCBmcDMyKiBicywKYmYxNiogYywKaW50IG0sCmludCBuLAppbnQgaywKYm9vbCBtZWFzdXJlCikgewpjb25zdCBpbnQgZ3JpZF9tID0gY2VpbF9kaXYobSwgYmxvY2tfdGlsZS5tKTsKY29uc3QgaW50IGdyaWRfbiA9IGNlaWxfZGl2KG4sIGJsb2NrX3RpbGUubik7CmhpcEV2ZW50X3Qgc3RhcnQsIHRhYiwgc3RvcDsKa2VybmVsPApibG9ja19zaXplLApibG9ja190aWxlLAp3YXJwX3RpbGUsCmxvYWRfdHlwZSwKcGlwZWxpbmVfZGVwdGgKPjw8PApkaW0zKGdyaWRfbSwgZ3JpZF9uKSwKZGltMyhibG9ja19zaXplKSwKMAo+Pj4oCmEsCmIsCmFzLApicywKYywKbSwKbiwKawopOwpISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CnZvaWQgcnVuKAp1aW50cHRyX3QgYV9wdHIsCnVpbnRwdHJfdCBiX3B0ciwKdWludHB0cl90IGFzX3B0ciwKdWludHB0cl90IGJzX3B0ciwKdWludHB0cl90IGNfcHRyLAppbnQgbSwKaW50IG4sCmludCBrLApib29sIG1lYXN1cmUKKSB7CmFzc2VydChhX3B0ciAlIDE2ID09IDApOwphc3NlcnQoYl9wdHIgJSAxNiA9PSAwKTsKYXNzZXJ0KGFzX3B0ciAlIDE2ID09IDApOwphc3NlcnQoYnNfcHRyICUgMTYgPT0gMCk7CmFzc2VydChjX3B0ciAlIDE2ID09IDApOwpjb25zdCBhdXRvKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihhX3B0cik7CmNvbnN0IGF1dG8qIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGJfcHRyKTsKY29uc3QgYXV0byogYXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMzIqPihhc19wdHIpOwpjb25zdCBhdXRvKiBicyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAzMio+KGJzX3B0cik7CmF1dG8qIGMgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihjX3B0cik7CmlmIChtID09IDEwMjQgJiYgbiA9PSAxNTM2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2KSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezE2LCAxNiwgMzJ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDU3NiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAyLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyNTYpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7NjQsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIzMDQpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA1MTIgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezY0LCA2NCwgMTI4fSwgY3ViZXsxNiwgMTYsIDMyfSwgMiwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA0MDk2ICYmIGsgPT0gNTEyKSB7CnJ1bl9rZXJuZWw8NTEyLCBjdWJlezEyOCwgMTI4LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gMzA3MiAmJiBrID09IDE1MzYpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNTc2ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2KSB7CnJ1bl9rZXJuZWw8MjU2LCBjdWJlezEyOCwgMTI4LCA2NH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNzE2OCAmJiBrID09IDIwNDgpIHsKcnVuX2tlcm5lbDwyNTYsIGN1YmV7MTI4LCAxMjgsIDY0fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA0NjA4ICYmIGsgPT0gNzE2OCkgewpydW5fa2VybmVsPDUxMiwgY3ViZXsxMjgsIDEyOCwgMTI4fSwgY3ViZXszMiwgMzIsIDE2fSwgMSwgdHJ1ZT4oYSwgYiwgYXMsIGJzLCBjLCBtLCBuLCBrLCBtZWFzdXJlKTsKfSBlbHNlIGlmIChtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjMwNCkgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgaWYgKG0gPT0gNjE0NCAmJiBuID09IDUxMiAmJiBrID09IDcxNjgpIHsKcnVuX2tlcm5lbDw1MTIsIGN1YmV7MTI4LCAxMjgsIDEyOH0sIGN1YmV7MzIsIDMyLCAxNn0sIDEsIHRydWU+KGEsIGIsIGFzLCBicywgYywgbSwgbiwgaywgbWVhc3VyZSk7Cn0gZWxzZSBpZiAobSA9PSA2MTQ0ICYmIG4gPT0gNDA5NiAmJiBrID09IDUxMikgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDEyOCwgNjR9LCBjdWJlezMyLCAzMiwgMTZ9LCAxLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9IGVsc2UgewpydW5fa2VybmVsPDI1NiwgY3ViZXsxMjgsIDY0LCAxMjh9LCBjdWJlezMyLCAzMiwgMTZ9LCAyLCB0cnVlPihhLCBiLCBhcywgYnMsIGMsIG0sIG4sIGssIG1lYXN1cmUpOwp9Cn0KUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewptLmRlZigiZnA4IiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9ImZwOCIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPShbIi1zYXZlLXRlbXBzIl0gaWYgVEVTVElORyBpcyBub3QgTm9uZSBlbHNlIFtdKSArIFsiLXN0ZD1jKysyMCIsICItV2Vycm9yIl0sCiAgICBidWlsZF9kaXJlY3Rvcnk9Ii93b3Jrc3BhY2UvYnVpbGQvIiBpZiBURVNUSU5HID09ICJ2c2NvZGUiIGVsc2UgIi9ncHVtb2RlL2FtZC9mcDgvYnVpbGQvIiBpZiBURVNUSU5HIGlzIG5vdCBOb25lIGVsc2UgTm9uZSwKICAgICoqKHsnbm9faW1wbGljaXRfaGVhZGVycyc6IFRydWV9IGlmIFRFU1RJTkcgIT0gInZzY29kZSIgZWxzZSB7fSksCikKCmZpcnN0ID0gVHJ1ZQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgbWVhc3VyZSA9IEZhbHNlCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgaywKICAgICAgICBtZWFzdXJlCiAgICApCgogICAgcmV0dXJuIGMK
No newline at end of file

Best evidence level for this revision: reported

JSON