submission 19003
KernelBot user 376 · 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.
baguette_3.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-19003?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, 7168] · n=512 · seed=6563
AMD Instinct MI300X
61.6µs
#18 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
66.2µs
#18 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
97.3µs
#13 of 98
2025-05-09
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
158.5µs
#22 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
170.7µs
#26 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
184.9µs
#22 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
259.1µs
#21 of 98
2025-05-09
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
751.1µs
#22 of 98
2025-05-09
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:effe77cde9b05ae9e85075a0bade087f01c42e81e8ca4baef44e49ea015a07a6
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
baguette_3.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+Cgp0eXBlZGVmIF9faGlwX2ZwOF9lNG0zX2ZudXogZnA4Owp1c2luZyB2ZWM0ZiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDIKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDEyOAoKY29uc3RleHByIGludCBUSUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZX0RFRjsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRjsKY29uc3RleHByIGludCBLX0RJTSA9IFRJTEVfS19ESU1fREVGOwpjb25zdGV4cHIgaW50IE5CV0FSUFNfWSA9IE5fV0FSUF9ZX0RFRjsgLy8gNApjb25zdGV4cHIgaW50IE5CV0FSUFNfWCA9IE5fV0FSUF9YX0RFRjsgLy8gMgovLyBpbnRyaW5zaWMgY29uZmlnCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMzI7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2Owpjb25zdGV4cHIgaW50IEJMT0NLX0RJTSA9IE5CV0FSUFNfWCAqIE5CV0FSUFNfWSAqIFdBUlBfU0laRTsgLy8gNTEyCgp1c2luZyB2ZWM0dSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJzaG9ydCA9CiAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MTZfdCkpKSkgdWludDE2X3Q7CgpfX2RldmljZV9fIHZvaWQgbWF0bXVsMTZ4MTYoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmIsIGludCBrLCBpbnQgYV9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9jb2wsIHZlYzRmICZjLCBpbnQgbSwgaW50IG4pIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CiAgaW50IHJvdyA9IGsgKyB0aWQgJSA4ICsgKHRpZCAvIDE2KSAqIDg7CiAgaW50IGNvbCA9ICgodGlkICUgMTYpIC8gOCk7CiAgaW50IGFfY29sX3MgPSAoYV9jb2wgLyA4ICsgY29sKTsKICBpbnQgYl9jb2xfcyA9IChiX2NvbCAvIDggKyBjb2wpOwogIGludCBjb2xfYV9zd2l6emxlZCA9ICgoYV9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBhX2NvbF9zICUgMjsKICBpbnQgY29sX2Jfc3dpenpsZWQgPSAoKGJfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYl9jb2xfcyAlIDI7CgogIGF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYSArIHJvdyAqIG0pW2NvbF9hX3N3aXp6bGVkXTsKICBhdXRvIHBhY2tlZEIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGIgKyByb3cgKiBtKVtjb2xfYl9zd2l6emxlZF07CgogIGMgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgYm91bmRDaGVjaz4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnA4ICpzX2EsIGZwOCAqc19iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgaW50IE0sIGludCBOKSB7CiAgCiAgY29uc3QgZnA4ICpwdHIgPSBhOwogIGZwOCAqZHN0ID0gc19hOwogIGludCB3YXJwSWRMb2NhbCA9IHdhcnBJZCU0OwogIGludCBzdHJpZGUgPSBNOwogIAogIHVpbnQzMl90IGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWCAqIGJsb2NrSWR4Lng7CiAgaWYgKHdhcnBJZD49NCl7CiAgICBwdHI9YjsKICAgIGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWSAqIGJsb2NrSWR4Lnk7CiAgICBkc3Q9c19iOwogICAgc3RyaWRlPSBOOwogIH0KICBib29sIGJfY2hlY2sgPSB0cnVlOwogIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICBiX2NoZWNrID0gY29sX29mZnNldCA8IHN0cmlkZTsKICB9CiAgCiAgICBjb25zdGV4cHIgaW50IERJTVkgPSBUSUxFX1NJWkVfWSAvIDg7CiAgICB2ZWMydSBiX3ZhbHVlWzhdID0gezB9OwogICAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICAKICAKICAgICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIH0KICAgIHZlYzJ1IHJlc3VsdF9iWzhdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpCiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZyZXN1bHRfYltpXSlbal0gPQogICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJmJfdmFsdWVbal0pW2ldOwogICAgICB9CgogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKCiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBpbnQgY29sX3N3aXp6bGVkID0gMiAqICgoY29sIC8gMikgXiAocm93ICUgOCkpICsgY29sICUgMjsKCiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgCn0KCl9fZGV2aWNlX18gZmxvYXQgbW92ZV9kcHAoZmxvYXQgdiwgaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKICBmbG9hdCByZXN1bHQ7CiAgYXNtIHZvbGF0aWxlKCJ2X21vdl9iMzIgJTAsICUxIHF1YWRfcGVybTpbJTIsJTMsJTQsJTVdIgogICAgICAgICAgICAgICA6ICI9diIocmVzdWx0KSAvLyAlMDogb3V0cHV0IHJlZ2lzdGVyCiAgICAgICAgICAgICAgIDogInYiKHYpLCAiaSIoYSksICJpIihiKSwgImkiKGMpLCAiaSIoZCkpOwogIHJldHVybiByZXN1bHQ7Cn0KX19nbG9iYWxfXyB2b2lkIGNhc3Rfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpjX2JmMTYsIGNvbnN0IGZsb2F0ICpjX2ZwMzIsIGludCBNLCBpbnQgTikgewoKICAgIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLngrdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkPE0qTil7CiAgICAgIGNfYmYxNlt0aWRdID0gKF9faGlwX2JmbG9hdDE2KWNfZnAzMlt0aWRdOwogICAgfQp9CgoKdGVtcGxhdGUgPGludCBLX1NQTElULGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKQogICAgY3VzdG9tX2tlcm5lbChjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgY29uc3QgZmxvYXQgKmFzLCBjb25zdCBmbG9hdCAqYnMsCiAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpjLGZsb2F0ICpjX2F0b21pYywgaW50IE0sIGludCBOLCBpbnQgSykgewogIGludCB0aWQgPSB0aHJlYWRJZHgueDsKICBpbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwoKICBpbnQgc3BsaXRLID0gSyAvIEtfU1BMSVQ7CiAgaW50IGtJZFN0YXJ0ID0gYmxvY2tJZHgueiAqIHNwbGl0SzsKICBpbnQga0lkU3RvcCA9IHNwbGl0SyArIGJsb2NrSWR4LnogKiBzcGxpdEs7CgogIGludCBTTiA9IChOICsgMTI4IC0gMSkgLyAxMjg7CgogIGludCB3YXJwSWQgPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsKICBpbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCiAgaW50IHdhcnBJZHkgPSB3YXJwSWQgJSBOQldBUlBTX1k7CgogIF9fc2hhcmVkX18gZnA4IHNfYVtLX0RJTV1bVElMRV9TSVpFX1hdOwogIF9fc2hhcmVkX18gZnA4IHNfYltLX0RJTV1bVElMRV9TSVpFX1ldOwoKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKICB2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CgogIGZvciAoaW50IGtJZCA9IGtJZFN0YXJ0OyBrSWQgPCBrSWRTdG9wOyBrSWQgKz0gS19ESU0pIHsKCiAgICBsb2FkTERTPGJvdW5kQ2hlY2s+KHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4pOwogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHZlYzRmIGNfdG1wW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwojcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBYID0gVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YOwogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7CgogICAgICAgIHZlYzRmIGNfdG1wID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwojcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgS19ESU07ayArPSBNQVRNVUxfRElNX0spIC8vIE1BVE1VTF9ESU1fSyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgS19ESU0KICAgICAgICB7CiAgICAgICAgICBpbnQgYV9jb2wgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBpbnQgYl9jb2wgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBtYXRtdWwxNngxNigmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBrLCBhX2NvbCwgYl9jb2wsIGNfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUSUxFX1NJWkVfWCwgVElMRV9TSVpFX1kpOwogICAgICAgIH0KCiAgICAgICAgaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgIC8vIEFwcGx5IHNjYWxpbmcKICAgICAgICBpbnQgYXNfY29sID0ga0lkIC8gMTI4OwogICAgICAgIGludCBhc19yb3cgPSBhX3JvdyArIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWDsKICAgICAgICBpbnQgYnNfY29sID0gYmxvY2tJZHgueTsKICAgICAgICBpbnQgYnNfcm93ID0ga0lkIC8gMTI4OwogICAgICAgIGZsb2F0IGJzX3ZhbCA9IGJzW2JzX3JvdyAqIFNOICsgYnNfY29sXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaW50IHJvdyA9IGFzX3JvdyArIGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgIGZsb2F0IGFzX3ZhbCA9IGFzW2FzX2NvbCAqIE0gKyByb3ddOwogICAgICAgICAgY19zW3Rfd0lkeF1bdF93SWR5XVtpXSArPSBjX3RtcFtpXSAqIGFzX3ZhbCAqIGJzX3ZhbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQogIAoKICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgLy8gb2Zmc2V0IHBvaW50aW5nIHRvIHRoZSBhY2N1bXVsYXRlZCAxNngxNiBibG9jawogICAgICBpbnQgY29sX29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC55ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR5ICogKFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWSk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGludCByb3dfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwoKICAgICAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICAgICAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgICAgICBiX2NoZWNrID0gKHJvd19vZmZzZXQpIDwgTSAmJiAoY29sX29mZnNldCkgPCBOOwogICAgICB9CiAgICAgIGlmIChiX2NoZWNrKSB7CiAgICAgICAgICAvLyBDIGlzIHN0b3JlZCBvbiA0IFZHUFJzCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBpbnQgY29sID0gbGFuZUlkICUgMTY7CiAgICAgICAgICAgICAgaW50IHJvdyA9IGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKHVzZUF0b21pYyl7CiAgICAgICAgICAgICAgICBhdG9taWNBZGQoICZjX2F0b21pY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSxyZXNbaV0pOwogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdHJ1Y3QgTGF1bmNoQ29uZmlnIHsKICBpbnQgS19TUExJVDsKICBib29sIHVzZUF0b21pYzsKICBib29sIGJvdW5kQ2hlY2s7Cn07Cgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsIGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+CmlubGluZSB2b2lkIGxhdW5jaF9rZXJuZWxfdmFyaWFudChjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc0Nhc3QoMjU2KTsKICBkaW0zIGJsb2NrQ2FzdCgoTSpOICsgKE4qTS0xKSkvMjU2KTsKCiAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPEtfU1BMSVQsIGJvdW5kQ2hlY2ssIHVzZUF0b21pYz4pLCBibG9ja3MsIHRocmVhZHMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIGNfYXRvbWljLE0sIE4sIEspOwogIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgIGhpcExhdW5jaEtlcm5lbEdHTChjYXN0X2tlcm5lbCwgYmxvY2tDYXN0LHRocmVhZHNDYXN0LDAsMCxkX0MsY19hdG9taWMsTSxOKTsKICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQ+CmlubGluZSB2b2lkIGRpc3BhdGNoX2JvdW5kX2F0b21pYyhib29sIGJvdW5kQ2hlY2ssIGJvb2wgdXNlQXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGltMyYgYmxvY2tzLCBjb25zdCBkaW0zJiB0aHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQXMsIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLGZsb2F0KmNfYXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE0sIGludCBOLCBpbnQgSykgewogIGlmIChib3VuZENoZWNrKSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgdHJ1ZSwgdHJ1ZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIGVsc2UKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIHRydWUsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0gZWxzZSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgZmFsc2UsIHRydWU+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgICBlbHNlCiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCBmYWxzZSwgZmFsc2U+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgfQp9Cgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLktfU1BMSVQpOwoKICBzd2l0Y2ggKGNvbmZpZy5LX1NQTElUKSB7CiAgICBjYXNlIDE6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwxPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDI6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwyPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDQ6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw0Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlVuc3VwcG9ydGVkIEtfU1BMSVQgdmFsdWUiKTsKICB9Cn0KCgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLCBjb25zdCBmbG9hdCAqZF9BcywKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLCBmbG9hdCpjX2F0b21pYyxpbnQgTSwgaW50IE4sCiAgICAgICAgICAgICAgICAgICBpbnQgSykgewogIExhdW5jaENvbmZpZyBjb25maWc7CiAgY29uZmlnLnVzZUF0b21pYz1mYWxzZTsKICBjb25maWcuS19TUExJVD0xOwogIGlmIChNICUgMTI4ID09MCAmJiBOICUxMjggPT0wKQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSBmYWxzZTsKICBlbHNlCiAgICBjb25maWcuYm91bmRDaGVjayA9IHRydWU7CgogIC8vU1BMSVQgSyBmb3IgdGhlc2UgOgogIGlmICgoTSA9PSAxMDI0ICYmICBOPT0xNTM2ICYmIEsgPT03MTY4ICl8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01MTIgJiYgSyA9PTcxNjggKSB8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01NzYgJiYgSyA9PTcxNjggKSl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSA0OwogICAgICB9ICAKICBsYXVuY2hfa2VybmVsKGNvbmZpZywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7Cn0KCgoKI2RlZmluZSBISVBfQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBpZihlcnJvciAhPSBoaXBTdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKICAgICAgICAgICAgICAgICAgICAgIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKICAgICAgICAgICAgICAgICAgICAgIDw8ICc6JyA8PCBfX0xJTkVfXyA8PCAnQG4nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgZXhpdChlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHdoaWxlKGZhbHNlKQoKdm9pZCBydW4oCiAgICB1aW50cHRyX3QgYV9wdHIsCiAgICB1aW50cHRyX3QgYl9wdHIsCiAgICB1aW50cHRyX3QgYXNfcHRyLAogICAgdWludHB0cl90IGJzX3B0ciwKICAgIHVpbnRwdHJfdCBjX3B0ciwKICAgIGludCBNLAogICAgaW50IE4sCiAgICBpbnQgSwopIHsKICAgIGNvbnN0IGF1dG8qIGRfQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogZF9CID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihiX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0FzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGFzX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0JzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGJzX3B0cik7CiAgICBhdXRvKiBkX0MgPSByZWludGVycHJldF9jYXN0PF9faGlwX2JmbG9hdDE2Kj4oY19wdHIpOwoKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CiAgICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRik7CiAgICAKICAgIHN0YXRpYyBmbG9hdCogZF9hcnJheSA9IG51bGxwdHI7CiAgICBzdGF0aWMgaW50IG49LTE7CiAgICBzdGF0aWMgaW50IG09LTE7CiAgICBpZiAoIWRfYXJyYXkpCiAgICB7CiAgICAgICAgc2l6ZV90IHNpemUgPSA2MTQ0KjcxNjggKiBzaXplb2YoZmxvYXQpOwogICAgICAgIGhpcEVycm9yX3QgZXJyID0gaGlwTWFsbG9jKCZkX2FycmF5LCBzaXplKTsKICAgIH0KICAgIGhpcE1lbXNldChkX2FycmF5LCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgIGxhdW5jaF9rZXJuZWwoZF9BLCBkX0IsIGRfQXMsCiAgICAgICAgICAgICAgICAgICBkX0JzLGRfQywgZF9hcnJheSwgTSwgTiwKICAgICAgICAgICAgICAgIEspOyAKCiAgICAvL2hpcEZyZWUoZF9hcnJheSk7CiAgICBISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CgpQWUJJTkQxMV9NT0RVTEUoZnA4LCBtKSB7CiAgbS5kZWYoImZwOCIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCgpoaXBfbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDgiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1nIC0tc2F2ZS10ZW1wcyAtUnBhc3MtYW5hbHlzaXM9a2VybmVsLXJlc291cmNlLXVzYWdlIC1zdGQ9YysrMjAiXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKZmlyc3QgPSBUcnVlCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgawogICAgKQoKICAgIHJldHVybiBjCg==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 18889.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnR5cGVkZWYgX19oaXBfZnA4X2U0bTNfZm51eiBmcDg7CnVzaW5nIHZlYzRmID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKI2RlZmluZSBXQVJQX1NJWkUgNjQKI2RlZmluZSBOX1dBUlBfWV9ERUYgMgojZGVmaW5lIE5fV0FSUF9YX0RFRiA0Ci8vIE91dHB1dCBUaWxlIGNvbmZpZwojZGVmaW5lIFRJTEVfU0laRV9ZX0RFRiAxMjgKI2RlZmluZSBUSUxFX1NJWkVfWF9ERUYgMTI4CiNkZWZpbmUgVElMRV9LX0RJTV9ERUYgMTI4CiNkZWZpbmUgS19TUExJVCAxCgpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9ZID0gVElMRV9TSVpFX1lfREVGOwpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9YID0gVElMRV9TSVpFX1hfREVGOwpjb25zdGV4cHIgaW50IEtfRElNID0gVElMRV9LX0RJTV9ERUY7CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19ZID0gTl9XQVJQX1lfREVGOyAvLyA0CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19YID0gTl9XQVJQX1hfREVGOyAvLyAyCi8vIGludHJpbnNpYyBjb25maWcKY29uc3RleHByIGludCBNQVRNVUxfRElNX0sgPSAzMjsKY29uc3RleHByIGludCBNQVRNVUxfRElNX05NID0gMTY7CmNvbnN0ZXhwciBpbnQgQkxPQ0tfRElNID0gTkJXQVJQU19YICogTkJXQVJQU19ZICogV0FSUF9TSVpFOyAvLyA1MTIKCnVzaW5nIHZlYzR1ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YodWludDMyX3QpKSkpIHVpbnQzMl90Owp1c2luZyB2ZWMydSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnNob3J0ID0KICAgIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQxNl90KSkpKSB1aW50MTZfdDsKCl9fZGV2aWNlX18gdm9pZCBtYXRtdWwxNngxNihjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYiwgaW50IGssIGludCBhX2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX2NvbCwgdmVjNGYgJmMsIGludCBtLCBpbnQgbikgewogIGludCB0aWQgPSB0aHJlYWRJZHgueCAlIFdBUlBfU0laRTsKICBpbnQgcm93ID0gayArIHRpZCAlIDggKyAodGlkIC8gMTYpICogODsKICBpbnQgY29sID0gKCh0aWQgJSAxNikgLyA4KTsKICBpbnQgYV9jb2xfcyA9IChhX2NvbCAvIDggKyBjb2wpOwogIGludCBiX2NvbF9zID0gKGJfY29sIC8gOCArIGNvbCk7CiAgaW50IGNvbF9hX3N3aXp6bGVkID0gKChhX2NvbF9zIC8gMikgXiAocm93ICUgOCkpICogMiArIGFfY29sX3MgJSAyOwogIGludCBjb2xfYl9zd2l6emxlZCA9ICgoYl9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBiX2NvbF9zICUgMjsKCiAgYXV0byBwYWNrZWRBID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPihhICsgcm93ICogbSlbY29sX2Ffc3dpenpsZWRdOwogIGF1dG8gcGFja2VkQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYiArIHJvdyAqIG0pW2NvbF9iX3N3aXp6bGVkXTsKCiAgYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOChwYWNrZWRBLCBwYWNrZWRCLCBjLCAwLCAwLCAwKTsKfQoKdGVtcGxhdGU8Ym9vbCBib3VuZENoZWNrPgpfX2RldmljZV9fIHZvaWQgbG9hZExEUyhpbnQgd2FycElkLCBpbnQgbGFuZUlkLCBpbnQga0lkLCBmcDggKnNfYSwgZnA4ICpzX2IsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBpbnQgTSwgaW50IE4pIHsKICAKICBjb25zdCBmcDggKnB0ciA9IGE7CiAgZnA4ICpkc3QgPSBzX2E7CiAgaW50IHdhcnBJZExvY2FsID0gd2FycElkJTQ7CiAgaW50IHN0cmlkZSA9IE07CiAgCiAgdWludDMyX3QgY29sX29mZnNldCA9IFRJTEVfU0laRV9YICogYmxvY2tJZHgueDsKICBpZiAod2FycElkPj00KXsKICAgIHB0cj1iOwogICAgY29sX29mZnNldCA9IFRJTEVfU0laRV9ZICogYmxvY2tJZHgueTsKICAgIGRzdD1zX2I7CiAgICBzdHJpZGU9IE47CiAgfQogIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgIGJfY2hlY2sgPSBjb2xfb2Zmc2V0IDwgc3RyaWRlOwogIH0KICAKICAgIGNvbnN0ZXhwciBpbnQgRElNWSA9IFRJTEVfU0laRV9ZIC8gODsKICAgIHZlYzJ1IGJfdmFsdWVbOF0gPSB7MH07CiAgICBpZiAoYl9jaGVjayl7CiAgICB1aW50MzJfdCByb3dfb2Zmc2V0ID0ga0lkOwogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIERJTVk7CiAgICAgIGludCByb3cgPSByICsgMzIgKiB3YXJwSWRMb2NhbCArIDggKiAobGFuZUlkIC8gRElNWSk7CiAgICAgIAogIAogICAgICAgIGJfdmFsdWVbcl0gPSAocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWMydSAqPihwdHIgKyAocm93X29mZnNldCArIHJvdykgKiBzdHJpZGUgKyAoY29sX29mZnNldCArIGNvbCAqIDgpKSlbMF07CiAgICB9CiAgfQogICAgdmVjMnUgcmVzdWx0X2JbOF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyArK2opIHsKICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmYl92YWx1ZVtqXSlbaV07CiAgICAgIH0KCiAgICBmb3IgKGludCByID0gMDsgciA8IDg7IHIrKykgewoKICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIERJTVk7CiAgICAgIGludCByb3cgPSByICsgMzIgKiB3YXJwSWRMb2NhbCArIDggKiAobGFuZUlkIC8gRElNWSk7CiAgICAgIGludCBjb2xfc3dpenpsZWQgPSAyICogKChjb2wgLyAyKSBeIChyb3cgJSA4KSkgKyBjb2wgJSAyOwoKICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjMnUgKj4oZHN0KSlbKERJTVkpKnJvdyArIGNvbF9zd2l6emxlZF0gPSByZXN1bHRfYltyXTsKICAgIH0KICAKfQoKX19kZXZpY2VfXyBmbG9hdCBtb3ZlX2RwcChmbG9hdCB2LCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgewogIGZsb2F0IHJlc3VsdDsKICBhc20gdm9sYXRpbGUoInZfbW92X2IzMiAlMCwgJTEgcXVhZF9wZXJtOlslMiwlMywlNCwlNV0iCiAgICAgICAgICAgICAgIDogIj12IihyZXN1bHQpIC8vICUwOiBvdXRwdXQgcmVnaXN0ZXIKICAgICAgICAgICAgICAgOiAidiIodiksICJpIihhKSwgImkiKGIpLCAiaSIoYyksICJpIihkKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKdGVtcGxhdGUgPGJvb2wgYm91bmRDaGVjaz4KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKE5fV0FSUF9YX0RFRiAqTl9XQVJQX1lfREVGICpXQVJQX1NJWkUpCiAgICBjdXN0b21fa2VybmVsKGNvbnN0IGZwOCAqYSwgY29uc3QgZnA4ICpiLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicywKICAgICAgICAgICAgICAgICAgX19oaXBfYmZsb2F0MTYgKmMsIGludCBNLCBpbnQgTiwgaW50IEspIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4Lng7CiAgaW50IGxhbmVJZCA9IHRpZCAlIFdBUlBfU0laRTsKCiAgaW50IHNwbGl0SyA9IEsgLyBLX1NQTElUOwogIGludCBrSWRTdGFydCA9IGJsb2NrSWR4LnogKiBzcGxpdEs7CiAgaW50IGtJZFN0b3AgPSBzcGxpdEsgKyBibG9ja0lkeC56ICogc3BsaXRLOwoKICBpbnQgU04gPSAoTiArIDEyOCAtIDEpIC8gMTI4OwoKICBpbnQgd2FycElkID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7CiAgaW50IHdhcnBJZHggPSB3YXJwSWQgLyBOQldBUlBTX1k7IAogIGludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKICBfX3NoYXJlZF9fIGZwOCBzX2FbS19ESU1dW1RJTEVfU0laRV9YXTsKICBfX3NoYXJlZF9fIGZwOCBzX2JbS19ESU1dW1RJTEVfU0laRV9ZXTsKCiAgY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9ZID0gVElMRV9TSVpFX1kgLyBOQldBUlBTX1kgLyBNQVRNVUxfRElNX05NOyAvLyAyCiAgY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9YID0gVElMRV9TSVpFX1ggLyBOQldBUlBTX1ggLyBNQVRNVUxfRElNX05NOyAvLyA0CiAgdmVjNGYgY19zW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwoKICBmb3IgKGludCBrSWQgPSBrSWRTdGFydDsga0lkIDwga0lkU3RvcDsga0lkICs9IEtfRElNKSB7CgogICAgbG9hZExEUzxib3VuZENoZWNrPih3YXJwSWQsIGxhbmVJZCwga0lkLCAmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBhLCBiLCBNLCBOKTsKICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICB2ZWM0ZiBjX3RtcFtXQVJQX1RJTEVfU0laRV9YXVtXQVJQX1RJTEVfU0laRV9ZXSA9IHswfTsKI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CiAgICAgIGZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CiAgICAgICAgY29uc3RleHByIGludCBzdGVwWCA9IFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWDsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBZID0gVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZOwoKICAgICAgICB2ZWM0ZiBjX3RtcCA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IEtfRElNO2sgKz0gTUFUTVVMX0RJTV9LKSAvLyBNQVRNVUxfRElNX0sgbXVzdCBiZSBhIG11bHRpcGxlIG9mIEtfRElNCiAgICAgICAgewogICAgICAgICAgaW50IGFfY29sID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgICAgaW50IGJfY29sID0gKHRfd0lkeSAqIHN0ZXBZKSArIHdhcnBJZHkgKiBNQVRNVUxfRElNX05NOwogICAgICAgICAgbWF0bXVsMTZ4MTYoJnNfYVswXVswXSwgJnNfYlswXVswXSwgaywgYV9jb2wsIGJfY29sLCBjX3RtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVElMRV9TSVpFX1gsIFRJTEVfU0laRV9ZKTsKICAgICAgICB9CgogICAgICAgIGludCBhX3JvdyA9ICh0X3dJZHggKiBzdGVwWCkgKyB3YXJwSWR4ICogTUFUTVVMX0RJTV9OTTsKICAgICAgICAvLyBBcHBseSBzY2FsaW5nCiAgICAgICAgaW50IGFzX2NvbCA9IGtJZCAvIDEyODsKICAgICAgICBpbnQgYXNfcm93ID0gYV9yb3cgKyBibG9ja0lkeC54ICogVElMRV9TSVpFX1g7CiAgICAgICAgaW50IGJzX2NvbCA9IGJsb2NrSWR4Lnk7CiAgICAgICAgaW50IGJzX3JvdyA9IGtJZCAvIDEyODsKICAgICAgICBmbG9hdCBic192YWwgPSBic1tic19yb3cgKiBTTiArIGJzX2NvbF07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIGludCByb3cgPSBhc19yb3cgKyBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CiAgICAgICAgICBmbG9hdCBhc192YWwgPSBhc1thc19jb2wgKiBNICsgcm93XTsKICAgICAgICAgIGNfc1t0X3dJZHhdW3Rfd0lkeV1baV0gKz0gY190bXBbaV0gKiBhc192YWwgKiBic192YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgX19zeW5jdGhyZWFkcygpOwogIH0KICAKCiAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgIGZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CiAgICAgIC8vIG9mZnNldCBwb2ludGluZyB0byB0aGUgYWNjdW11bGF0ZWQgMTZ4MTYgYmxvY2sKICAgICAgaW50IGNvbF9vZmZzZXQgPQogICAgICAgICAgYmxvY2tJZHgueSAqIFRJTEVfU0laRV9ZICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0CiAgICAgICAgICAod2FycElkeSAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgICAgICAgIHRfd0lkeSAqIChUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1kpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgogICAgICBpbnQgcm93X29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC54ICogVElMRV9TSVpFX1ggKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR4ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR4ICogKFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWCk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGF1dG8gcmVzID0gY19zW3Rfd0lkeF1bdF93SWR5XTsKCiAgICAgIGJvb2wgYl9jaGVjayA9IHRydWU7CiAgICAgIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICAgICAgYl9jaGVjayA9IChyb3dfb2Zmc2V0KSA8IE0gJiYgKGNvbF9vZmZzZXQpIDwgTjsKICAgICAgfQogICAgICBpZiAoYl9jaGVjaykgewogICAgICAgICAgLy8gQyBpcyBzdG9yZWQgb24gNCBWR1BScwogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICAgICAgaW50IGNvbCA9IGxhbmVJZCAlIDE2OwogICAgICAgICAgICAgIGludCByb3cgPSBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CiAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgIH0KICAgICAgICAKICAgICAgfQogICAgfQogIH0KfQoKCnN0cnVjdCBMYXVuY2hDb25maWcgewogIGJvb2wgYm91bmRDaGVjazsKfTsKCgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgS19TUExJVCk7CgogIGlmIChjb25maWcuYm91bmRDaGVjaykgewogICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLCBNLCBOLCBLKTsKICB9IGVsc2UgewogICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPGZhbHNlPiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwKICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwogIH0KfQoKCnZvaWQgbGF1bmNoX2tlcm5lbChjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsIGNvbnN0IGZsb2F0ICpkX0FzLAogICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsIGludCBNLCBpbnQgTiwKICAgICAgICAgICAgICAgICAgIGludCBLKSB7CiAgTGF1bmNoQ29uZmlnIGNvbmZpZzsKICAgIAogIGlmIChNICUgMTI4ID09MCAmJiBOICUxMjggPT0wKQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSBmYWxzZTsKICBlbHNlCiAgICBjb25maWcuYm91bmRDaGVjayA9IHRydWU7CiAgCiAgbGF1bmNoX2tlcm5lbChjb25maWcsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwp9CgoKCiNkZWZpbmUgSElQX0NIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaGlwRXJyb3JfdCBlcnJvciA9IGNvbmRpdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgaWYoZXJyb3IgIT0gaGlwU3VjY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRXJyb3IgIiA8PCBoaXBHZXRFcnJvck5hbWUoZXJyb3IpIDw8ICcoJyA8PCBlcnJvciA8PCAnKScgPDwgIjogIiAgICBACiAgICAgICAgICAgICAgICAgICAgICA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnJvcikgPDwgIiBpbiAiIDw8IF9fZnVuY19fIDw8ICIgYXQgIiA8PCBfX0ZJTEVfXyBACiAgICAgICAgICAgICAgICAgICAgICA8PCAnOicgPDwgX19MSU5FX18gPDwgJ0BuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgICAgIGV4aXQoZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB3aGlsZShmYWxzZSkKCnZvaWQgcnVuKAogICAgdWludHB0cl90IGFfcHRyLAogICAgdWludHB0cl90IGJfcHRyLAogICAgdWludHB0cl90IGFzX3B0ciwKICAgIHVpbnRwdHJfdCBic19wdHIsCiAgICB1aW50cHRyX3QgY19wdHIsCiAgICBpbnQgTSwKICAgIGludCBOLAogICAgaW50IEsKKSB7CiAgICBjb25zdCBhdXRvKiBkX0EgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwOCo+KGFfcHRyKTsKICAgIGNvbnN0IGF1dG8qIGRfQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYl9wdHIpOwogICAgY29uc3QgYXV0byogZF9BcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihhc19wdHIpOwogICAgY29uc3QgYXV0byogZF9CcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQqPihic19wdHIpOwogICAgYXV0byogZF9DID0gcmVpbnRlcnByZXRfY2FzdDxfX2hpcF9iZmxvYXQxNio+KGNfcHRyKTsKCiAgICBkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKChNICsgVElMRV9TSVpFX1hfREVGIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUYsCiAgICAgICAgICAgICAgICAgICAgIChOICsgVElMRV9TSVpFX1lfREVGIC0gMSkgLyBUSUxFX1NJWkVfWV9ERUYpOwogICAgCiAgICBpZiAoTSUxMjg9PTAgJiYgTiUxMjg9PTApewogICAgICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoY3VzdG9tX2tlcm5lbDxmYWxzZT4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIE0sIE4sIEspOwogICAgfWVsc2V7CiAgICAgICAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLCBNLCBOLCBLKTt9CgogICAgSElQX0NIRUNLKGhpcEdldExhc3RFcnJvcigpKTsKfQoKUFlCSU5EMTFfTU9EVUxFKGZwOCwgbSkgewogIG0uZGVmKCJmcDgiLCAmcnVuLCAiSElQIGtlcm5lbCIpOwp9CiIiIgoKaGlwX21vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4IiwKICAgIGNwcF9zb3VyY2VzPSIiLAogICAgY3VkYV9zb3VyY2VzPWtlcm5lbF9jcHAucmVwbGFjZSgnQCcsIGNocig5MikpLAogICAgd2l0aF9jdWRhPVRydWUsCiAgICB2ZXJib3NlPUZhbHNlLAogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItZyAtLXNhdmUtdGVtcHMgLVJwYXNzLWFuYWx5c2lzPWtlcm5lbC1yZXNvdXJjZS11c2FnZSAtc3RkPWMrKzIwIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCmZpcnN0ID0gVHJ1ZQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBibG9jay1zY2FsZSBmcDggZ2VtbQogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSB0aGF0IGV4cGFuZHMgdG86CiAgICAgICAgICAgIGE6IHRvcmNoLlRlbnNvcltmbG9hdDhfZTRtM2ZudXpdIG9mIHNoYXBlIFttLCBrXSwKICAgICAgICAgICAgYjogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW24sIGtdLAogICAgICAgICAgICBhX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW20sIGsgLy8gMTI4XSwKICAgICAgICAgICAgYl9zY2FsZTogdG9yY2guVGVuc29yW2Zsb2F0MzJdIG9mIHNoYXBlIFtuIC8vIDEyOCwgayAvLyAxMjhdLAogICAgICAgICAgICBjOiB0b3JjaC5UZW5zb3JbYmZsb2F0MTZdIG9mIHNoYXBlIFttLCBuXQogICAgUmV0dXJuczoKICAgICAgICBUZW5zb3IgY29udGFpbmluZyBvdXRwdXQgaW4gYmYxNgogICAgIiIiCgogICAgZ2xvYmFsIGZpcnN0CiAgICBpZiBmaXJzdDoKICAgICAgICBwcmludCgiZXhlY3V0aW5nIG9uIiwgdG9yY2guY3VkYS5nZXRfZGV2aWNlX25hbWUoKSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpcnN0ID0gRmFsc2UKCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQoKICAgIG0sIG4gPSBjLnNoYXBlCiAgICBrID0gYS5zaGFwZVsxXQoKICAgIGhpcF9tb2R1bGUuZnA4KAogICAgICAgIGEuZGF0YV9wdHIoKSwKICAgICAgICBiLmRhdGFfcHRyKCksCiAgICAgICAgYV9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGJfc2NhbGUuZGF0YV9wdHIoKSwKICAgICAgICBjLmRhdGFfcHRyKCksCiAgICAgICAgbSwKICAgICAgICBuLAogICAgICAgIGssCiAgICApCgogICAgcmV0dXJuIGMKNo newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDguaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+Cgp0eXBlZGVmIF9faGlwX2ZwOF9lNG0zX2ZudXogZnA4Owp1c2luZyB2ZWM0ZiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDIKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDEyOAoKY29uc3RleHByIGludCBUSUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZX0RFRjsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRjsKY29uc3RleHByIGludCBLX0RJTSA9IFRJTEVfS19ESU1fREVGOwpjb25zdGV4cHIgaW50IE5CV0FSUFNfWSA9IE5fV0FSUF9ZX0RFRjsgLy8gNApjb25zdGV4cHIgaW50IE5CV0FSUFNfWCA9IE5fV0FSUF9YX0RFRjsgLy8gMgovLyBpbnRyaW5zaWMgY29uZmlnCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMzI7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2Owpjb25zdGV4cHIgaW50IEJMT0NLX0RJTSA9IE5CV0FSUFNfWCAqIE5CV0FSUFNfWSAqIFdBUlBfU0laRTsgLy8gNTEyCgp1c2luZyB2ZWM0dSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKdXNpbmcgdmVjMnUgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MzJfdCkpKSkgdWludDMyX3Q7CnVzaW5nIHZlYzJzaG9ydCA9CiAgICBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMiAqIHNpemVvZih1aW50MTZfdCkpKSkgdWludDE2X3Q7CgpfX2RldmljZV9fIHZvaWQgbWF0bXVsMTZ4MTYoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKmIsIGludCBrLCBpbnQgYV9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9jb2wsIHZlYzRmICZjLCBpbnQgbSwgaW50IG4pIHsKICBpbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CiAgaW50IHJvdyA9IGsgKyB0aWQgJSA4ICsgKHRpZCAvIDE2KSAqIDg7CiAgaW50IGNvbCA9ICgodGlkICUgMTYpIC8gOCk7CiAgaW50IGFfY29sX3MgPSAoYV9jb2wgLyA4ICsgY29sKTsKICBpbnQgYl9jb2xfcyA9IChiX2NvbCAvIDggKyBjb2wpOwogIGludCBjb2xfYV9zd2l6emxlZCA9ICgoYV9jb2xfcyAvIDIpIF4gKHJvdyAlIDgpKSAqIDIgKyBhX2NvbF9zICUgMjsKICBpbnQgY29sX2Jfc3dpenpsZWQgPSAoKGJfY29sX3MgLyAyKSBeIChyb3cgJSA4KSkgKiAyICsgYl9jb2xfcyAlIDI7CgogIGF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oYSArIHJvdyAqIG0pW2NvbF9hX3N3aXp6bGVkXTsKICBhdXRvIHBhY2tlZEIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KGIgKyByb3cgKiBtKVtjb2xfYl9zd2l6emxlZF07CgogIGMgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgYm91bmRDaGVjaz4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnA4ICpzX2EsIGZwOCAqc19iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgaW50IE0sIGludCBOKSB7CiAgCiAgY29uc3QgZnA4ICpwdHIgPSBhOwogIGZwOCAqZHN0ID0gc19hOwogIGludCB3YXJwSWRMb2NhbCA9IHdhcnBJZCU0OwogIGludCBzdHJpZGUgPSBNOwogIAogIHVpbnQzMl90IGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWCAqIGJsb2NrSWR4Lng7CiAgaWYgKHdhcnBJZD49NCl7CiAgICBwdHI9YjsKICAgIGNvbF9vZmZzZXQgPSBUSUxFX1NJWkVfWSAqIGJsb2NrSWR4Lnk7CiAgICBkc3Q9c19iOwogICAgc3RyaWRlPSBOOwogIH0KICBib29sIGJfY2hlY2sgPSB0cnVlOwogIGlmIGNvbnN0ZXhwciAoYm91bmRDaGVjayl7CiAgICBiX2NoZWNrID0gY29sX29mZnNldCA8IHN0cmlkZTsKICB9CiAgCiAgICBjb25zdGV4cHIgaW50IERJTVkgPSBUSUxFX1NJWkVfWSAvIDg7CiAgICB2ZWMydSBiX3ZhbHVlWzhdID0gezB9OwogICAgaWYgKGJfY2hlY2spewogICAgdWludDMyX3Qgcm93X29mZnNldCA9IGtJZDsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgODsgcisrKSB7CiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICAKICAKICAgICAgICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiA4KSkpWzBdOwogICAgfQogIH0KICAgIHZlYzJ1IHJlc3VsdF9iWzhdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpCiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZyZXN1bHRfYltpXSlbal0gPQogICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJmJfdmFsdWVbal0pW2ldOwogICAgICB9CgogICAgZm9yIChpbnQgciA9IDA7IHIgPCA4OyByKyspIHsKCiAgICAgIGludCBjb2wgPSBsYW5lSWQgJSBESU1ZOwogICAgICBpbnQgcm93ID0gciArIDMyICogd2FycElkTG9jYWwgKyA4ICogKGxhbmVJZCAvIERJTVkpOwogICAgICBpbnQgY29sX3N3aXp6bGVkID0gMiAqICgoY29sIC8gMikgXiAocm93ICUgOCkpICsgY29sICUgMjsKCiAgICAgIChyZWludGVycHJldF9jYXN0PHZlYzJ1ICo+KGRzdCkpWyhESU1ZKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07CiAgICB9CiAgCn0KCl9fZGV2aWNlX18gZmxvYXQgbW92ZV9kcHAoZmxvYXQgdiwgaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKICBmbG9hdCByZXN1bHQ7CiAgYXNtIHZvbGF0aWxlKCJ2X21vdl9iMzIgJTAsICUxIHF1YWRfcGVybTpbJTIsJTMsJTQsJTVdIgogICAgICAgICAgICAgICA6ICI9diIocmVzdWx0KSAvLyAlMDogb3V0cHV0IHJlZ2lzdGVyCiAgICAgICAgICAgICAgIDogInYiKHYpLCAiaSIoYSksICJpIihiKSwgImkiKGMpLCAiaSIoZCkpOwogIHJldHVybiByZXN1bHQ7Cn0KX19nbG9iYWxfXyB2b2lkIGNhc3Rfa2VybmVsKF9faGlwX2JmbG9hdDE2ICpjX2JmMTYsIGNvbnN0IGZsb2F0ICpjX2ZwMzIsIGludCBNLCBpbnQgTikgewoKICAgIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLngrdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkPE0qTil7CiAgICAgIGNfYmYxNlt0aWRdID0gKF9faGlwX2JmbG9hdDE2KWNfZnAzMlt0aWRdOwogICAgfQp9CgoKdGVtcGxhdGUgPGludCBLX1NQTElULGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKQogICAgY3VzdG9tX2tlcm5lbChjb25zdCBmcDggKmEsIGNvbnN0IGZwOCAqYiwgY29uc3QgZmxvYXQgKmFzLCBjb25zdCBmbG9hdCAqYnMsCiAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpjLGZsb2F0ICpjX2F0b21pYywgaW50IE0sIGludCBOLCBpbnQgSykgewogIGludCB0aWQgPSB0aHJlYWRJZHgueDsKICBpbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwoKICBpbnQgc3BsaXRLID0gSyAvIEtfU1BMSVQ7CiAgaW50IGtJZFN0YXJ0ID0gYmxvY2tJZHgueiAqIHNwbGl0SzsKICBpbnQga0lkU3RvcCA9IHNwbGl0SyArIGJsb2NrSWR4LnogKiBzcGxpdEs7CgogIGludCBTTiA9IChOICsgMTI4IC0gMSkgLyAxMjg7CgogIGludCB3YXJwSWQgPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsKICBpbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCiAgaW50IHdhcnBJZHkgPSB3YXJwSWQgJSBOQldBUlBTX1k7CgogIF9fc2hhcmVkX18gZnA4IHNfYVtLX0RJTV1bVElMRV9TSVpFX1hdOwogIF9fc2hhcmVkX18gZnA4IHNfYltLX0RJTV1bVElMRV9TSVpFX1ldOwoKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKICBjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKICB2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07CgogIGZvciAoaW50IGtJZCA9IGtJZFN0YXJ0OyBrSWQgPCBrSWRTdG9wOyBrSWQgKz0gS19ESU0pIHsKCiAgICBsb2FkTERTPGJvdW5kQ2hlY2s+KHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4pOwogICAgX19zeW5jdGhyZWFkcygpOwoKICAgIHZlYzRmIGNfdG1wW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwojcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKICAgICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgICBjb25zdGV4cHIgaW50IHN0ZXBYID0gVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YOwogICAgICAgIGNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7CgogICAgICAgIHZlYzRmIGNfdG1wID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwojcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgS19ESU07ayArPSBNQVRNVUxfRElNX0spIC8vIE1BVE1VTF9ESU1fSyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgS19ESU0KICAgICAgICB7CiAgICAgICAgICBpbnQgYV9jb2wgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBpbnQgYl9jb2wgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07CiAgICAgICAgICBtYXRtdWwxNngxNigmc19hWzBdWzBdLCAmc19iWzBdWzBdLCBrLCBhX2NvbCwgYl9jb2wsIGNfdG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUSUxFX1NJWkVfWCwgVElMRV9TSVpFX1kpOwogICAgICAgIH0KCiAgICAgICAgaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwogICAgICAgIC8vIEFwcGx5IHNjYWxpbmcKICAgICAgICBpbnQgYXNfY29sID0ga0lkIC8gMTI4OwogICAgICAgIGludCBhc19yb3cgPSBhX3JvdyArIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWDsKICAgICAgICBpbnQgYnNfY29sID0gYmxvY2tJZHgueTsKICAgICAgICBpbnQgYnNfcm93ID0ga0lkIC8gMTI4OwogICAgICAgIGZsb2F0IGJzX3ZhbCA9IGJzW2JzX3JvdyAqIFNOICsgYnNfY29sXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgaW50IHJvdyA9IGFzX3JvdyArIGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgIGZsb2F0IGFzX3ZhbCA9IGFzW2FzX2NvbCAqIE0gKyByb3ddOwogICAgICAgICAgY19zW3Rfd0lkeF1bdF93SWR5XVtpXSArPSBjX3RtcFtpXSAqIGFzX3ZhbCAqIGJzX3ZhbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQogIAoKICBmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewogICAgZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICAgICAgLy8gb2Zmc2V0IHBvaW50aW5nIHRvIHRoZSBhY2N1bXVsYXRlZCAxNngxNiBibG9jawogICAgICBpbnQgY29sX29mZnNldCA9CiAgICAgICAgICBibG9ja0lkeC55ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICAgICAgICh3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgICAgICAgdF93SWR5ICogKFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWSk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCiAgICAgIGludCByb3dfb2Zmc2V0ID0KICAgICAgICAgIGJsb2NrSWR4LnggKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgICAgICAgKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICAgICAgICB0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKICAgICAgYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwoKICAgICAgYm9vbCBiX2NoZWNrID0gdHJ1ZTsKICAgICAgaWYgY29uc3RleHByIChib3VuZENoZWNrKXsKICAgICAgICBiX2NoZWNrID0gKHJvd19vZmZzZXQpIDwgTSAmJiAoY29sX29mZnNldCkgPCBOOwogICAgICB9CiAgICAgIGlmIChiX2NoZWNrKSB7CiAgICAgICAgICAvLyBDIGlzIHN0b3JlZCBvbiA0IFZHUFJzCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBpbnQgY29sID0gbGFuZUlkICUgMTY7CiAgICAgICAgICAgICAgaW50IHJvdyA9IGkgKyAobGFuZUlkIC8gMTYpICogNDsKICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKHVzZUF0b21pYyl7CiAgICAgICAgICAgICAgICBhdG9taWNBZGQoICZjX2F0b21pY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSxyZXNbaV0pOwogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IChfX2hpcF9iZmxvYXQxNikocmVzW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdHJ1Y3QgTGF1bmNoQ29uZmlnIHsKICBpbnQgS19TUExJVDsKICBib29sIHVzZUF0b21pYzsKICBib29sIGJvdW5kQ2hlY2s7Cn07Cgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQsIGJvb2wgYm91bmRDaGVjaywgYm9vbCB1c2VBdG9taWM+CmlubGluZSB2b2lkIGxhdW5jaF9rZXJuZWxfdmFyaWFudChjb25zdCBkaW0zJiBibG9ja3MsIGNvbnN0IGRpbTMmIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcDggKmRfQSwgY29uc3QgZnA4ICpkX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZF9BcywgY29uc3QgZmxvYXQgKmRfQnMsIF9faGlwX2JmbG9hdDE2ICpkX0MsZmxvYXQqY19hdG9taWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwgaW50IE4sIGludCBLKSB7CgogIGRpbTMgdGhyZWFkc0Nhc3QoMjU2KTsKICBkaW0zIGJsb2NrQ2FzdCgoTSpOICsgKE4qTS0xKSkvMjU2KTsKCiAgaGlwTGF1bmNoS2VybmVsR0dMKChjdXN0b21fa2VybmVsPEtfU1BMSVQsIGJvdW5kQ2hlY2ssIHVzZUF0b21pYz4pLCBibG9ja3MsIHRocmVhZHMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsIGNfYXRvbWljLE0sIE4sIEspOwogIGlmIGNvbnN0ZXhwciAodXNlQXRvbWljKXsKICAgIGhpcExhdW5jaEtlcm5lbEdHTChjYXN0X2tlcm5lbCwgYmxvY2tDYXN0LHRocmVhZHNDYXN0LDAsMCxkX0MsY19hdG9taWMsTSxOKTsKICB9Cn0KCgp0ZW1wbGF0ZSA8aW50IEtfU1BMSVQ+CmlubGluZSB2b2lkIGRpc3BhdGNoX2JvdW5kX2F0b21pYyhib29sIGJvdW5kQ2hlY2ssIGJvb2wgdXNlQXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGltMyYgYmxvY2tzLCBjb25zdCBkaW0zJiB0aHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmRfQXMsIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLGZsb2F0KmNfYXRvbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE0sIGludCBOLCBpbnQgSykgewogIGlmIChib3VuZENoZWNrKSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgdHJ1ZSwgdHJ1ZT4oYmxvY2tzLCB0aHJlYWRzLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsKICAgIGVsc2UKICAgICAgbGF1bmNoX2tlcm5lbF92YXJpYW50PEtfU1BMSVQsIHRydWUsIGZhbHNlPihibG9ja3MsIHRocmVhZHMsIGRfQSwgZF9CLCBkX0FzLCBkX0JzLCBkX0MsY19hdG9taWMsIE0sIE4sIEspOwogIH0gZWxzZSB7CiAgICBpZiAodXNlQXRvbWljKQogICAgICBsYXVuY2hfa2VybmVsX3ZhcmlhbnQ8S19TUExJVCwgZmFsc2UsIHRydWU+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgICBlbHNlCiAgICAgIGxhdW5jaF9rZXJuZWxfdmFyaWFudDxLX1NQTElULCBmYWxzZSwgZmFsc2U+KGJsb2NrcywgdGhyZWFkcywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7CiAgfQp9Cgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgTGF1bmNoQ29uZmlnICZjb25maWcsIGNvbnN0IGZwOCAqZF9BLCBjb25zdCBmcDggKmRfQiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0FzLCBjb25zdCBmbG9hdCAqZF9CcywgX19oaXBfYmZsb2F0MTYgKmRfQyxmbG9hdCpjX2F0b21pYywKICAgICAgICAgICAgICAgICAgIGludCBNLCBpbnQgTiwgaW50IEspIHsKCiAgZGltMyB0aHJlYWRzUGVyQmxvY2soTl9XQVJQX1hfREVGICogTl9XQVJQX1lfREVGICogV0FSUF9TSVpFKTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLktfU1BMSVQpOwoKICBzd2l0Y2ggKGNvbmZpZy5LX1NQTElUKSB7CiAgICBjYXNlIDE6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwxPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDI6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzwyPihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBjYXNlIDQ6IGRpc3BhdGNoX2JvdW5kX2F0b21pYzw0Pihjb25maWcuYm91bmRDaGVjaywgY29uZmlnLnVzZUF0b21pYywgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCBkX0EsIGRfQiwgZF9BcywgZF9CcywgZF9DLGNfYXRvbWljLCBNLCBOLCBLKTsgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlVuc3VwcG9ydGVkIEtfU1BMSVQgdmFsdWUiKTsKICB9Cn0KCgp2b2lkIGxhdW5jaF9rZXJuZWwoY29uc3QgZnA4ICpkX0EsIGNvbnN0IGZwOCAqZF9CLCBjb25zdCBmbG9hdCAqZF9BcywKICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpkX0JzLCBfX2hpcF9iZmxvYXQxNiAqZF9DLCBmbG9hdCpjX2F0b21pYyxpbnQgTSwgaW50IE4sCiAgICAgICAgICAgICAgICAgICBpbnQgSykgewogIExhdW5jaENvbmZpZyBjb25maWc7CiAgY29uZmlnLnVzZUF0b21pYz1mYWxzZTsKICBjb25maWcuS19TUExJVD0xOwogIGlmIChNICUgMTI4ID09MCAmJiBOICUxMjggPT0wKQogICAgY29uZmlnLmJvdW5kQ2hlY2sgPSBmYWxzZTsKICBlbHNlCiAgICBjb25maWcuYm91bmRDaGVjayA9IHRydWU7CgogIC8vU1BMSVQgSyBmb3IgdGhlc2UgOgogIGlmICgoTSA9PSAxMDI0ICYmICBOPT0xNTM2ICYmIEsgPT03MTY4ICl8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01MTIgJiYgSyA9PTcxNjggKSB8fAogICAgICAoTSA9PSAxMDI0ICYmICBOPT01NzYgJiYgSyA9PTcxNjggKSl7CiAgICAgICAgY29uZmlnLnVzZUF0b21pYyA9IHRydWU7CiAgICAgICAgY29uZmlnLktfU1BMSVQgPSA0OwogICAgICB9ICAKICBsYXVuY2hfa2VybmVsKGNvbmZpZywgZF9BLCBkX0IsIGRfQXMsIGRfQnMsIGRfQyxjX2F0b21pYywgTSwgTiwgSyk7Cn0KCgoKI2RlZmluZSBISVBfQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBoaXBFcnJvcl90IGVycm9yID0gY29uZGl0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICBpZihlcnJvciAhPSBoaXBTdWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFcnJvciAiIDw8IGhpcEdldEVycm9yTmFtZShlcnJvcikgPDwgJygnIDw8IGVycm9yIDw8ICcpJyA8PCAiOiAiICAgIEAKICAgICAgICAgICAgICAgICAgICAgIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycm9yKSA8PCAiIGluICIgPDwgX19mdW5jX18gPDwgIiBhdCAiIDw8IF9fRklMRV9fIEAKICAgICAgICAgICAgICAgICAgICAgIDw8ICc6JyA8PCBfX0xJTkVfXyA8PCAnQG4nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICAgICAgZXhpdChlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKICAgIHdoaWxlKGZhbHNlKQoKdm9pZCBydW4oCiAgICB1aW50cHRyX3QgYV9wdHIsCiAgICB1aW50cHRyX3QgYl9wdHIsCiAgICB1aW50cHRyX3QgYXNfcHRyLAogICAgdWludHB0cl90IGJzX3B0ciwKICAgIHVpbnRwdHJfdCBjX3B0ciwKICAgIGludCBNLAogICAgaW50IE4sCiAgICBpbnQgSwopIHsKICAgIGNvbnN0IGF1dG8qIGRfQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnA4Kj4oYV9wdHIpOwogICAgY29uc3QgYXV0byogZF9CID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDgqPihiX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0FzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGFzX3B0cik7CiAgICBjb25zdCBhdXRvKiBkX0JzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGJzX3B0cik7CiAgICBhdXRvKiBkX0MgPSByZWludGVycHJldF9jYXN0PF9faGlwX2JmbG9hdDE2Kj4oY19wdHIpOwoKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CiAgICBkaW0zIGJsb2Nrc1BlckdyaWQoKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRiwKICAgICAgICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRik7CiAgICAKICAgIHN0YXRpYyBmbG9hdCogZF9hcnJheSA9IG51bGxwdHI7CiAgICBzdGF0aWMgaW50IG49LTE7CiAgICBzdGF0aWMgaW50IG09LTE7CiAgICBpZiAoIWRfYXJyYXkpCiAgICB7CiAgICAgICAgc2l6ZV90IHNpemUgPSA2MTQ0KjcxNjggKiBzaXplb2YoZmxvYXQpOwogICAgICAgIGhpcEVycm9yX3QgZXJyID0gaGlwTWFsbG9jKCZkX2FycmF5LCBzaXplKTsKICAgIH0KICAgIGhpcE1lbXNldChkX2FycmF5LCAwLCBOKk0gKiBzaXplb2YoZmxvYXQpKTsKICAgIGxhdW5jaF9rZXJuZWwoZF9BLCBkX0IsIGRfQXMsCiAgICAgICAgICAgICAgICAgICBkX0JzLGRfQywgZF9hcnJheSwgTSwgTiwKICAgICAgICAgICAgICAgIEspOyAKCiAgICAvL2hpcEZyZWUoZF9hcnJheSk7CiAgICBISVBfQ0hFQ0soaGlwR2V0TGFzdEVycm9yKCkpOwp9CgpQWUJJTkQxMV9NT0RVTEUoZnA4LCBtKSB7CiAgbS5kZWYoImZwOCIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCgpoaXBfbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDgiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1nIC0tc2F2ZS10ZW1wcyAtUnBhc3MtYW5hbHlzaXM9a2VybmVsLXJlc291cmNlLXVzYWdlIC1zdGQ9YysrMjAiXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKZmlyc3QgPSBUcnVlCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGJsb2NrLXNjYWxlIGZwOCBnZW1tCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIHRoYXQgZXhwYW5kcyB0bzoKICAgICAgICAgICAgYTogdG9yY2guVGVuc29yW2Zsb2F0OF9lNG0zZm51el0gb2Ygc2hhcGUgW20sIGtdLAogICAgICAgICAgICBiOiB0b3JjaC5UZW5zb3JbZmxvYXQ4X2U0bTNmbnV6XSBvZiBzaGFwZSBbbiwga10sCiAgICAgICAgICAgIGFfc2NhbGU6IHRvcmNoLlRlbnNvcltmbG9hdDMyXSBvZiBzaGFwZSBbbSwgayAvLyAxMjhdLAogICAgICAgICAgICBiX3NjYWxlOiB0b3JjaC5UZW5zb3JbZmxvYXQzMl0gb2Ygc2hhcGUgW24gLy8gMTI4LCBrIC8vIDEyOF0sCiAgICAgICAgICAgIGM6IHRvcmNoLlRlbnNvcltiZmxvYXQxNl0gb2Ygc2hhcGUgW20sIG5dCiAgICBSZXR1cm5zOgogICAgICAgIFRlbnNvciBjb250YWluaW5nIG91dHB1dCBpbiBiZjE2CiAgICAiIiIKCiAgICBnbG9iYWwgZmlyc3QKICAgIGlmIGZpcnN0OgogICAgICAgIHByaW50KCJleGVjdXRpbmcgb24iLCB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgZmlyc3QgPSBGYWxzZQoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCgogICAgbSwgbiA9IGMuc2hhcGUKICAgIGsgPSBhLnNoYXBlWzFdCgogICAgaGlwX21vZHVsZS5mcDgoCiAgICAgICAgYS5kYXRhX3B0cigpLAogICAgICAgIGIuZGF0YV9wdHIoKSwKICAgICAgICBhX3NjYWxlLmRhdGFfcHRyKCksCiAgICAgICAgYl9zY2FsZS5kYXRhX3B0cigpLAogICAgICAgIGMuZGF0YV9wdHIoKSwKICAgICAgICBtLAogICAgICAgIG4sCiAgICAgICAgawogICAgKQoKICAgIHJldHVybiBjCg==No newline at end of file
Best evidence level for this revision: reported
JSON