submission 19189
KernelBot user 44 · 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.
submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-19189?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
86.9µs
#34 of 98
2025-05-10
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
91.7µs
#40 of 98
2025-05-10
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
231.6µs
#55 of 98
2025-05-10
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
235.9µs
#69 of 98
2025-05-10
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
278.9µs
#59 of 98
2025-05-10
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
477.4µs
#73 of 98
2025-05-10
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
534.6µs
#62 of 98
2025-05-10
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.24ms
#56 of 98
2025-05-10
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:4da83a8fa0f317b859bcafab22756de1631e302f064a97045eaec674eeb074ad
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
submission.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkICBhbWQtZnA4LW1tCiMgVGhpcyBzY3JpcHQgcHJvdmlkZXMgYSB0ZW1wbGF0ZSBmb3IgdXNpbmcgbG9hZF9pbmxpbmUgdG8gcnVuIGEgSElQIGtlcm5lbCBmb3IKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CkNQUF9XUkFQUEVSID0gIiIiCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOwoiIiIKQ1VEQV9TUkMgPSAiIiIKI3ByYWdtYSBvbmNlCiNpbmNsdWRlIDxzdGRpby5oPiAgICAgICAgIAojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNkZWZpbmUgUEFSQU1FVEVSSVpFX0xJQlJBUlkKI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfY29vcGVyYXRpdmVfZ3JvdXBzLmg+CiNpbmNsdWRlIDxyb2N3bW1hL3JvY3dtbWEuaHBwPgpuYW1lc3BhY2Ugd21tYSA9IHJvY3dtbWE7CiNpZmRlZiBURVNUX09OX0NVREEKbmFtZXNwYWNlIHdtbWEgPSBudmN1ZGE6OndtbWE7CiNkZWZpbmUgTElCX0NBTEwoY2FsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VkYUVycm9yX3QgZXJyID0gY2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gY3VkYVN1Y2Nlc3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQojZGVmaW5lIEhPU1RfVFlQRSh4KSBjdWRhIyN4CiNlbHNlCiNpZm5kZWYgSElQX0hFQURFUlNfXwojZGVmaW5lIEhJUF9IRUFERVJTX18KI2VuZGlmCm5hbWVzcGFjZSB3bW1hID0gcm9jd21tYTsKI2RlZmluZSBMSUJfQ0FMTChjYWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXBFcnJvcl90IGVyciA9IGNhbGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBoaXBTdWNjZXNzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCiNkZWZpbmUgSE9TVF9UWVBFKHgpIGhpcCMjeAojZW5kaWYKI3ByYWdtYSBvbmNlCiNpZmRlZiBURVNUX09OX0NVREEKI2RlZmluZSBfX0ZQOF9UWVBFIF9fbnZfZnA4X2U0bTMKI2RlZmluZSBfX0ZQOHg0X1RZUEUgX19udl9mcDh4NF9lNG0zCiNkZWZpbmUgX19CRjE2X1RZUEUgX19udl9iZmxvYXQxNgojZGVmaW5lIF9fQkYxNngyX1RZUEUgX19udl9iZmxvYXQxNjIKI2Vsc2UKI2lmZGVmIFRFU1RfT05fUkROQTQKI2RlZmluZSBfX0ZQOF9UWVBFIF9faGlwX2ZwOF9lNG0zCiNkZWZpbmUgX19GUDh4NF9UWVBFIF9faGlwX2ZwOHg0X2U0bTMKY29uc3RleHByIGNvbnN0IGlubGluZSBpbnQgV0FWRV9TSVpFID0gMzI7CiNlbHNlCiNkZWZpbmUgX19GUDhfVFlQRSBfX2hpcF9mcDhfZTRtM19mbnV6CiNkZWZpbmUgX19GUDh4NF9UWVBFIF9faGlwX2ZwOHg0X2U0bTNfZm51egpjb25zdGV4cHIgY29uc3QgaW5saW5lIGludCBXQVZFX1NJWkUgPSA2NDsKI2VuZGlmCiNkZWZpbmUgX19CRjE2X1RZUEUgX19oaXBfYmZsb2F0MTYKI2RlZmluZSBfX0JGMTZ4Ml9UWVBFIF9faGlwX2JmbG9hdDE2MgojZGVmaW5lIF9fRlAxNl9UWVBFIF9faGFsZgojZGVmaW5lIF9fSU5UMTZfVFlQRSBpbnQxNl90CiNlbmRpZgojZGVmaW5lIF9fRlAzMl9UWVBFIGZsb2F0CiNpZm5kZWYgR0VNTV9LRVJORUwKI2RlZmluZSBHRU1NX0tFUk5FTAojcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAp0ZW1wbGF0ZSA8aW50IHgsIGludCB5PiAKY29uc3RleHByIF9fZGV2aWNlX18gX19ob3N0X18gaW5saW5lIGludCBleGFjdF9kaXYoKSB7CiAgICBzdGF0aWNfYXNzZXJ0KHggJSB5ID09IDApOwogICAgc3RhdGljX2Fzc2VydCh4ID49IHkpOwogICAgcmV0dXJuIHggLyB5OwogIH0KICAKY29uc3RleHByIF9fZGV2aWNlX18gX19ob3N0X18gaW5saW5lIGludCBjZWlsX2RpdihpbnQgeCwgaW50IHkpIHsgCiAgICByZXR1cm4gKHggKyB5IC0gMSkgLyB5Owp9CiAgCm5hbWVzcGFjZSBnZW1tX2tlcm5lbCB7CnRlbXBsYXRlIDx0eXBlbmFtZSBkYXRhX3R5cGUsIGludCBCQVRDSF9TSVpFPiAKX19kZXZpY2VfXyBpbmxpbmUgdm9pZCByZWFkX2JhdGNoKGRhdGFfdHlwZSAqZHN0LCBjb25zdCBkYXRhX3R5cGUgKnNyYykgewogICAgaWYgY29uc3RleHByICgoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFKSA9PSAyICogc2l6ZW9mKHVsb25nNCkpIHsKICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmc0ICo+KGRzdCkgKyAwKSA9ICoocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bG9uZzQgKj4oc3JjKSArIDApOwogICAgICAgICoocmVpbnRlcnByZXRfY2FzdDx1bG9uZzQgKj4oZHN0KSArIDEpID0gKihyZWludGVycHJldF9jYXN0PGNvbnN0IHVsb25nNCAqPihzcmMpICsgMSk7CiAgICB9IGVsc2UgaWYgY29uc3RleHByICgoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFKSA9PSBzaXplb2YodWxvbmc0KSkgewogICAgICAgICpyZWludGVycHJldF9jYXN0PHVsb25nNCAqPihkc3QpID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWxvbmc0ICo+KHNyYyk7CiAgICB9IGVsc2UgaWYgY29uc3RleHByIChzaXplb2YoZGF0YV90eXBlKSAqIEJBVENIX1NJWkUgPT0gc2l6ZW9mKHVsb25nMikpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bG9uZzIgKj4oZHN0KSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVsb25nMiAqPihzcmMpOwogICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFID09IHNpemVvZih1bG9uZzEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmcxICo+KGRzdCkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bG9uZzEgKj4oc3JjKTsKICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihkYXRhX3R5cGUpICogQkFUQ0hfU0laRSA9PSBzaXplb2YodWludDEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDEgKj4oZHN0KSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxICo+KHNyYyk7CiAgICB9IGVsc2UgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBCQVRDSF9TSVpFOyArK2IpIHsKICAgICAgICAgICAgZHN0W2JdID0gc3JjW2JdOwogICAgICAgIH0KICAgIH0KfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgZGF0YV90eXBlLCBpbnQgQkFUQ0hfU0laRT4gCl9fZGV2aWNlX18gaW5saW5lIHZvaWQgemVyb19iYXRjaChkYXRhX3R5cGUgKmRzdCkgewogICAgaWYgY29uc3RleHByICgoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFKSA9PSBzaXplb2YodWxvbmc0KSkgewogICAgICAgICpyZWludGVycHJldF9jYXN0PHVsb25nNCAqPihkc3QpID0gdWxvbmc0e307CiAgICB9IGVsc2UgaWYgY29uc3RleHByIChzaXplb2YoZGF0YV90eXBlKSAqIEJBVENIX1NJWkUgPT0gc2l6ZW9mKHVsb25nMikpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bG9uZzIgKj4oZHN0KSA9IHVsb25nMnt9OwogICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGRhdGFfdHlwZSkgKiBCQVRDSF9TSVpFID09IHNpemVvZih1bG9uZzEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmcxICo+KGRzdCkgPSB1bG9uZzF7fTsKICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihkYXRhX3R5cGUpICogQkFUQ0hfU0laRSA9PSBzaXplb2YodWludDEpKSB7CiAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludCAqPihkc3QpID0gdWludHt9OwogICAgfSBlbHNlIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgQkFUQ0hfU0laRTsgKytiKSB7CiAgICAgICAgICAgIGRzdFtiXSA9IDA7CiAgICAgICAgfQogICAgfQp9CnRlbXBsYXRlIDx0eXBlbmFtZSBkYXRhX3R5cGUsIGludCBEU1RfWSwgaW50IERTVF9YLCBpbnQgU1JDX1ksIGludCBTUkNfWCwgaW50IEJMT0NLX0RJTSwgaW50IEJBVENIX1NJWkU+Cl9fZGV2aWNlX18gaW5saW5lIHZvaWQgbG9hZF9pbnB1dChkYXRhX3R5cGUgZHN0W0RTVF9ZXVtEU1RfWF0sIGNvbnN0IGRhdGFfdHlwZSBzcmNbU1JDX1ldW1NSQ19YXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmVnaW5feCwgY29uc3QgaW50IGJlZ2luX3kpIHsKICBzdGF0aWNfYXNzZXJ0KEJBVENIX1NJWkUgPiAwKTsKICAKICBzdGF0aWNfYXNzZXJ0KChTUkNfWCAlIEJBVENIX1NJWkUgPT0gMCkgJiYgKFNSQ19ZICUgQkFUQ0hfU0laRSA9PSAwKSk7CiAgc3RhdGljX2Fzc2VydCgoRFNUX1ggJSBCQVRDSF9TSVpFID09IDApICYmIChEU1RfWSAlIEJBVENIX1NJWkUgPT0gMCkpOwogIHN0YXRpY19hc3NlcnQoQkFUQ0hfU0laRSA8PSBEU1RfWCAmJiBEU1RfWCAlIEJBVENIX1NJWkUgPT0gMCk7CiAgY29uc3QgaW50IGJlZ2luX2lkeCA9IHRocmVhZElkeC54ICogQkFUQ0hfU0laRTsKICBjb25zdCBjb25zdGV4cHIgaW50IHRvdGFsX2VsZW1lbnRzID0gRFNUX1ggKiBEU1RfWTsKICBjb25zdCBjb25zdGV4cHIgaW50IGVsZW1lbnRzX3Blcl9zdGVwID0gQkxPQ0tfRElNICogQkFUQ0hfU0laRTsKICAKICAjcHJhZ21hIHVucm9sbAogIGZvciAoaW50IGsgPSBiZWdpbl9pZHg7IGsgPCB0b3RhbF9lbGVtZW50czsgayArPSBlbGVtZW50c19wZXJfc3RlcCkgewogICAgaW50IGxfa3ggPSBrICUgRFNUX1g7CiAgICBpbnQgbF9reSA9IGsgLyBEU1RfWDsKICAgIGludCBnX2t4ID0gbF9reCArIGJlZ2luX3g7CiAgICBpbnQgZ19reSA9IGxfa3kgKyBiZWdpbl95OwogICAgYXV0byAqZHN0X2ZsYXR0ZW4gPSAmZHN0W2xfa3ldW2xfa3hdOwogICAgCiAgICAKICAgIGlmICgoKFNSQ19YICUgRFNUX1ggPT0gMCkgfHwgKGdfa3ggPCBTUkNfWCkpICYmICgoU1JDX1kgJSBEU1RfWSA9PSAwKSB8fCAoZ19reSA8IFNSQ19ZKSkpIHsKICAgICAgY29uc3QgYXV0byAqc3JjX2ZsYXR0ZW4gPSAmc3JjW2dfa3ldW2dfa3hdOwogICAgICByZWFkX2JhdGNoPGRhdGFfdHlwZSwgQkFUQ0hfU0laRT4oZHN0X2ZsYXR0ZW4sIHNyY19mbGF0dGVuKTsKICAgIH0gZWxzZSB7CiAgICAgIHplcm9fYmF0Y2g8ZGF0YV90eXBlLCBCQVRDSF9TSVpFPihkc3RfZmxhdHRlbik7CiAgICB9CiAgfQp9CnRlbXBsYXRlIDxpbnQgUE0sIGludCBQTiwgaW50IFFNLCBpbnQgUU4sIGludCBRSywgaW50IFFVQU5UX1NJWkUsIGludCBCTE9DS19TSVpFLCBpbnQgQkFUQ0hfU0laRT4KX19kZXZpY2VfXyB2b2lkIGxvYWRfc2NhbGUoZmxvYXQgc19zW1BNXVtQTl0sIGNvbnN0IGZsb2F0IHNhW1FLXVtRTV0sIGNvbnN0IGZsb2F0IHNiW1FLXVtRTl0sIAogICAgICAgICAgICAgICAgY29uc3QgaW50IG0sIGNvbnN0IGludCBuLCBjb25zdCBpbnQgaykgewogICAgY29uc3RleHByIGludCB0b3RhbF9lbGVtZW50cyA9IFBNICogUE47CiAgICBjb25zdGV4cHIgaW50IGVsZW1lbnRzX3Blcl9zdGVwID0gQkxPQ0tfU0laRSAqIEJBVENIX1NJWkU7CiAgICAKICAgIAogICAgY29uc3QgaW50IGJlZ2luX2lkeCA9IHRocmVhZElkeC54ICogQkFUQ0hfU0laRTsKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBpZHggPSBiZWdpbl9pZHg7IGlkeCA8IHRvdGFsX2VsZW1lbnRzOyBpZHggKz0gZWxlbWVudHNfcGVyX3N0ZXApIHsKICAgICAgICBzdGF0aWNfYXNzZXJ0KEJBVENIX1NJWkUgPT0gMSk7CiAgICAgICAgaW50IGkgPSBpZHggLyBQTjsKICAgICAgICBpbnQgaiA9IGlkeCAlIFBOOwogICAgICAgIGlmICgoKFFNICUgUE0gPT0gMCkgfHwgKG0gKyBpIDwgUU0pKSAmJiAoKFFOICUgUE4gPT0gMCkgfHwgKChuICsgaikgLyBRVUFOVF9TSVpFIDwgUU4pKSkgewogICAgICAgICAgICBzX3NbaV1bal0gPSBzYVtrIC8gUVVBTlRfU0laRV1bKG0gKyBpKV0gKiBzYltrIC8gUVVBTlRfU0laRV1bKG4pIC8gUVVBTlRfU0laRSArIGpdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNfc1tpXVtqXSA9IDEuMGY7CiAgICAgICAgfQogICAgfQogICAgCn0KdGVtcGxhdGUgPHR5cGVuYW1lIGluX2RhdGFfdHlwZSwgdHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwKICAgIHR5cGVuYW1lIEZyYWdDLCB0eXBlbmFtZSBGcmFnQSwgdHlwZW5hbWUgRnJhZ0IsIAogICAgaW50IFBNLCBpbnQgUE4sCiAgICBpbnQgQk0sIGludCBCTiwgaW50IEJLLCAKICAgIGludCBGUkFHX00sIGludCBGUkFHX04sIGludCBGUkFHX0ssIAogICAgaW50IFdNTUFfTSwgaW50IFdNTUFfTiwgaW50IFdNTUFfSywKICAgIGludCBXQVJQX00sIGludCBXQVJQX04sCiAgICBpbnQgQkxPQ0tfU0laRSwgaW50IEJBVENIX1NJWkUsIGludCBRVUFOVF9TSVpFPgpfX2RldmljZV9fIHZvaWQgd21tYV9jb21wdXRlKAogICAgY29uc3QgaW5fZGF0YV90eXBlIHNfYVtCS11bQk1dLAogICAgY29uc3QgaW5fZGF0YV90eXBlIHNfYltCS11bQk5dLAogICAgY29uc3QgZmxvYXQgc19zW1BNXVtQTl0sCiAgICBGcmFnQyBmcmFnX3JbRlJBR19NXVtGUkFHX05dLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sCiAgICBjb25zdCBpbnQgY29tcF9jX2ZyYWdfbgopIHsKICAgIEZyYWdBIGZyYWdfYVtGUkFHX0tdW0ZSQUdfTV07IAogICAgRnJhZ0IgZnJhZ19iW0ZSQUdfS11bRlJBR19OXTsgCiAgICBGcmFnQyBmcmFnX2NbRlJBR19NXVtGUkFHX05dOwogICAgCiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICB3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfY1tpXVtqXSwgMC4wRik7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmb3IgKGludCBrID0gMDsgayA8IEZSQUdfSzsgKytrKSB7CiAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZSQUdfTTsgKytpKSB7CiAgICAgICAgICAgIGludCBzX2Ffcm93ID0gayAqIFdNTUFfSzsKICAgICAgICAgICAgaW50IHNfYV9jb2wgPSAoY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGkpICogV01NQV9NOwogICAgICAgICAgICB3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYVtrXVtpXSwgJnNfYVtzX2Ffcm93XVtzX2FfY29sXSwgQk0pOwogICAgICAgIH0KICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OOyArK2opIHsKICAgICAgICAgICAgaW50IHNfYl9yb3cgPSBrICogV01NQV9LOwogICAgICAgICAgICBpbnQgc19iX2NvbCA9IChjb21wX2NfZnJhZ19uICogRlJBR19OICsgaikgKiBXTU1BX047CiAgICAgICAgICAgIHdtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iW2tdW2pdLCAmc19iW3NfYl9yb3ddW3NfYl9jb2xdLCBCTik7CiAgICAgICAgfQogICAgfQogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NOyBpKyspIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OOyBqKyspIHsKICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBGUkFHX0s7ICsraykgewogICAgICAgICAgICAgICAgd21tYTo6bW1hX3N5bmMoZnJhZ19jW2ldW2pdLCBmcmFnX2Fba11baV0sIGZyYWdfYltrXVtqXSwgZnJhZ19jW2ldW2pdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBrID0gMDsgayA8IEZyYWdDOjpudW1fZWxlbWVudHM7IGsrKykgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NOyBpKyspIHsKI2lmZGVmIFRFU1RfT05fUkROQTQgCiAgICAgICAgICAgIGludCBtID0gKCh0aHJlYWRJZHgueCAmIDE2KSA+PiAxKSB8IChrICYgNykgfCAoY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGkpICogV01NQV9NOwojZWxzZSAKICAgICAgICAgICAgaW50IG0gPSAoKHRocmVhZElkeC54ICYgNDgpID4+IDIpIHwgKGsgJiAzKSB8IChjb21wX2NfZnJhZ19tICogRlJBR19NICsgaSkgKiBXTU1BX007CiNlbmRpZgogICAgICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEZSQUdfTjsgaisrKSB7CiAgICAgICAgICAgICAgICBpbnQgbiA9ICgodGhyZWFkSWR4LnggJiAxNSkgfCAoY29tcF9jX2ZyYWdfbiAqIEZSQUdfTiArIGopICogV01NQV9OKSAvIFFVQU5UX1NJWkU7CiAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IHNfc1ttXVtuXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZnJhZ19yW2ldW2pdLnhba10gKz0gKGFjY19kYXRhX3R5cGUpc2NhbGUgKiAoYWNjX2RhdGFfdHlwZSlmcmFnX2NbaV1bal0ueFtrXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwgdHlwZW5hbWUgb3V0X2RhdGFfdHlwZSwgCnR5cGVuYW1lIEZyYWdDLCB0eXBlbmFtZSBGcmFnT3V0LCBpbnQgV01NQV9NLCBpbnQgV01NQV9OLCAKaW50IEJNLCBpbnQgQk4sIGludCBNLCBpbnQgTiwgaW50IEZSQUdfTSwgaW50IEZSQUdfTj4KX19kZXZpY2VfXyBpbmxpbmUgdm9pZCBzdG9yZV9yZXN1bHQoCiAgICBvdXRfZGF0YV90eXBlIGNbTV1bTl0sIAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV1bRlJBR19OXSwgCiAgICBjb25zdCBpbnQgbSwKICAgIGNvbnN0IGludCBuLAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX20sIAogICAgY29uc3QgaW50IGNvbXBfY19mcmFnX24KKSB7CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUkFHX007IGkrKykgewogICAgICAgICNwcmFnbWEgdW5yb2xsCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBGUkFHX047IGorKykgewogICAgICAgICAgICBpbnQgZnJhZ19tID0gY29tcF9jX2ZyYWdfbSAqIEZSQUdfTSArIGk7CiAgICAgICAgICAgIGludCBmcmFnX24gPSBjb21wX2NfZnJhZ19uICogRlJBR19OICsgajsKICAgICAgICAgICAgaW50IHJvdyA9IG0gKyBmcmFnX20gKiBXTU1BX007CiAgICAgICAgICAgIGludCBjb2wgPSBuICsgZnJhZ19uICogV01NQV9OOwogICAgICAgICAgICBpZiAoKChNICUgQk0gPT0gMCkgfHwgKHJvdyA8IE0pKSAmJiAoKE4gJSBCTiA9PSAwKSB8fCAoY29sIDwgTikpKSB7CiAgICAgICAgICAgICAgICBvdXRfZGF0YV90eXBlICpjX3B0ciA9ICZjW3Jvd11bY29sXTsKICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoc2l6ZW9mKGFjY19kYXRhX3R5cGUpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSkgewogICAgICAgICAgICAgICAgICAgIHdtbWE6OnN0b3JlX21hdHJpeF9zeW5jKHJlaW50ZXJwcmV0X2Nhc3Q8b3V0X2RhdGFfdHlwZSo+KGNfcHRyKSwgZnJhZ19yW2ldW2pdLCBOLCB3bW1hOjptZW1fcm93X21ham9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKHNpemVvZihvdXRfZGF0YV90eXBlKSA9PSBzaXplb2YoaGFsZikpIHsKICAgICAgICAgICAgICAgICAgICBGcmFnT3V0IGZyYWdfb3V0OwogICAgICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGhhbGYpID09IHNpemVvZihvdXRfZGF0YV90eXBlKSk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChGcmFnT3V0OjpudW1fZWxlbWVudHMgPT0gRnJhZ0M6Om51bV9lbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wO2s8RnJhZ091dDo6bnVtX2VsZW1lbnRzOysraykgewogICAgICAgICAgICAgICAgICAgICAgICBfX2hpcF9iZmxvYXQxNiByZWcgPSBmcmFnX3JbaV1bal0ueFtrXTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ19vdXQueFtrXSA9ICpyZWludGVycHJldF9jYXN0PGhhbGYqPigmcmVnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd21tYTo6c3RvcmVfbWF0cml4X3N5bmMocmVpbnRlcnByZXRfY2FzdDxoYWxmKj4oY19wdHIpLCBmcmFnX291dCwgTiwgd21tYTo6bWVtX3Jvd19tYWpvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CnRlbXBsYXRlPGludCBEdW1teT0wPgpfX2dsb2JhbF9fIHZvaWQgcmVkdWNlKHVpbnQzMl90IG0sIHVpbnQzMl90IG4sIHVpbnQzMl90IHNwbGl0aywgY29uc3QgZmxvYXQgKmNfc3BsaXRrLCBfX2hpcF9iZmxvYXQxNiAqYykgewogICAgYXV0byB0aWQgPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54OwogICAgaWYgKHRpZCA+PSBtICogbikgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZsb2F0IHN1bSA9IDA7CiAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBzcGxpdGs7ICsraSkgewogICAgICAgIHN1bSArPSBjX3NwbGl0a1tpICogKG0gKiBuKSArIHRpZF07CiAgICB9CiAgICBjW3RpZF0gPSBzdW07Cn0KICAgIAojaWZkZWYgUEFSQU1FVEVSSVpFX0xJQlJBUlkKdGVtcGxhdGUgPAogICAgdHlwZW5hbWUgaW5fZGF0YV90eXBlLAogICAgdHlwZW5hbWUgYWNjX2RhdGFfdHlwZSwgCiAgICB0eXBlbmFtZSBvdXRfZGF0YV90eXBlLCAKICAgIGludCBNLCBpbnQgTiwgaW50IEssICAgIAogICAgaW50IEJNLCBpbnQgQk4sIGludCBCSywgCiAgICBpbnQgUVVBTlRfU0laRSwgICAgICAgICAKICAgIGludCBCTE9DS19TSVpFLCAgICAgICAgIAogICAgaW50IFdBUlBfTSwgaW50IFdBUlBfTiAKPgojZWxzZQp1c2luZyBpbl9kYXRhX3R5cGUgPSBfX0ZQOF9UWVBFOwp1c2luZyBvdXRfZGF0YV90eXBlID0gX19CRjE2X1RZUEU7CnVzaW5nIGFjY19kYXRhX3R5cGUgPSBmbG9hdDsKY29uc3RleHByIGludCBNID0gOTYsIE4gPSAxMDI0LCBLID0gMTAyNDsKY29uc3RleHByIGludCBCTSA9IDY0LCBCTiA9IDI1NiwgQksgPSAzMjsKY29uc3RleHByIGludCBRVUFOVF9TSVpFID0gMTI4LCBCTE9DS19TSVpFID0gMjU2OwojaWZkZWYgVEVTVF9PTl9SRE5BNCAKY29uc3RleHByIGludCBXQVJQX00gPSA0LCBXQVJQX04gPSAyOwojZWxzZSAKY29uc3RleHByIGludCBXQVJQX00gPSAyLCBXQVJQX04gPSAyOwojZW5kaWYKI2VuZGlmIApfX2dsb2JhbF9fIHZvaWQgZ2VtbV9rZXJuZWwoCiAgICBjb25zdCBpbl9kYXRhX3R5cGUgYVtLXVtNXSwKICAgIGNvbnN0IGluX2RhdGFfdHlwZSBiW0tdW05dLAogICAgb3V0X2RhdGFfdHlwZSBjW01dW05dLAogICAgY29uc3QgZmxvYXQgc2FbY2VpbF9kaXYoSywgUVVBTlRfU0laRSldW00gLyAxICAgICAgICBdLCAKICAgIGNvbnN0IGZsb2F0IHNiW2NlaWxfZGl2KEssIFFVQU5UX1NJWkUpXVtjZWlsX2RpdihOLCBRVUFOVF9TSVpFKV0KKSB7CiAgICAKICAgIGNvbnN0ZXhwciBpbnQgV01NQV9NID0gMTY7IAogICAgY29uc3RleHByIGludCBXTU1BX04gPSAxNjsgCiAgICBjb25zdGV4cHIgaW50IFdNTUFfSyA9IDMyOyAKICAgIAogICAgCiAgICAKICAgIAogICAgY29uc3RleHByIGludCBXQVJQX05VTSA9IFdBUlBfTSAqIFdBUlBfTjsgCiAgICAKICAgIAogICAgY29uc3RleHByIGludCBGUkFHX01fUEVSX1dBUlAgPSBCTSAvIFdNTUFfTSAvIFdBUlBfTTsKICAgIGNvbnN0ZXhwciBpbnQgRlJBR19OX1BFUl9XQVJQID0gQk4gLyBXTU1BX04gLyBXQVJQX047CiAgICBjb25zdGV4cHIgaW50IEZSQUdfSyA9IEJLIC8gV01NQV9LOyAKICAgIAogICAgY29uc3RleHByIGludCBRTSA9IE07IAogICAgY29uc3RleHByIGludCBRTiA9IGNlaWxfZGl2KE4sIFFVQU5UX1NJWkUpOyAKICAgIGNvbnN0ZXhwciBpbnQgUUsgPSBjZWlsX2RpdihLLCBRVUFOVF9TSVpFKTsgCiAgICBjb25zdGV4cHIgaW50IFBNID0gQk07IAogICAgY29uc3RleHByIGludCBQTiA9IGNlaWxfZGl2KEJOLCBRVUFOVF9TSVpFKTsgCiAgICAKICAgIHVzaW5nIEZyYWdBID0gd21tYTo6ZnJhZ21lbnQ8d21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGluX2RhdGFfdHlwZSwgd21tYTo6Y29sX21ham9yPjsKICAgIHVzaW5nIEZyYWdCID0gd21tYTo6ZnJhZ21lbnQ8d21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGluX2RhdGFfdHlwZSwgd21tYTo6cm93X21ham9yPjsKICAgIHVzaW5nIEZyYWdDID0gd21tYTo6ZnJhZ21lbnQ8d21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGFjY19kYXRhX3R5cGU+OwogICAgdXNpbmcgRnJhZ091dCA9IHdtbWE6OmZyYWdtZW50PHdtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBoYWxmPjsgCiAgICBfX3NoYXJlZF9fIGluX2RhdGFfdHlwZSAgc19hW0JLXVtCTV07CiAgICBfX3NoYXJlZF9fIGluX2RhdGFfdHlwZSAgc19iW0JLXVtCTl07CiAgICBfX3NoYXJlZF9fIGFjY19kYXRhX3R5cGUgc19zW1BNXVtQTl07IAogICAgRnJhZ0MgZnJhZ19yW0ZSQUdfTV9QRVJfV0FSUF1bRlJBR19OX1BFUl9XQVJQXTsgCiAgICAKICAgIGEgKz0gYmxvY2tJZHgueiAqIEs7CiAgICBiICs9IGJsb2NrSWR4LnogKiBLOwogICAgYyArPSBibG9ja0lkeC56ICogTTsKICAgIHNhICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIHNiICs9IGJsb2NrSWR4LnogKiBRSzsKICAgIGludCB0aWQgPSB0aHJlYWRJZHgueDsgCiAgICBpbnQgd2lkID0gdGlkIC8gV0FWRV9TSVpFOyAKICAgIAogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlJBR19NX1BFUl9XQVJQOyBpKyspIHsKICAgICAgICAjcHJhZ21hIHVucm9sbAogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRlJBR19OX1BFUl9XQVJQOyBqKyspIHsKICAgICAgICAgICAgd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX3JbaV1bal0sIDAuMGYpOyAKICAgICAgICB9CiAgICB9CiAgICAKICAgIGNvbnN0ZXhwciBpbnQgaXRlcmF0aW9uX292ZXJfayA9IGNlaWxfZGl2KEssIEJLKTsgCiAgICBjb25zdGV4cHIgaW50IExPQURfQkFUQ0hfU0laRSA9ICgyICogc2l6ZW9mKGZsb2F0NCkgLyBzaXplb2YoaW5fZGF0YV90eXBlKSkgPiAwID8gKDIgKiBzaXplb2YoZmxvYXQ0KSAvIHNpemVvZihpbl9kYXRhX3R5cGUpKSA6IDE7IAogICAgZm9yIChpbnQgYmsgPSAwOyBiayA8IGl0ZXJhdGlvbl9vdmVyX2s7IGJrKyspIHsKICAgICAgICBjb25zdCBpbnQgbSA9IGJsb2NrSWR4LnkgKiBCTTsKICAgICAgICBjb25zdCBpbnQgbiA9IGJsb2NrSWR4LnggKiBCTjsKICAgICAgICBjb25zdCBpbnQgayA9IGJrICogQks7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgbG9hZF9pbnB1dDxpbl9kYXRhX3R5cGUsIEJLLCBCTSwgSywgTSwgQkxPQ0tfU0laRSwgTE9BRF9CQVRDSF9TSVpFPigKICAgICAgICAgICAgc19hLCBhLCBtLCBrKTsKICAgICAgICBsb2FkX2lucHV0PGluX2RhdGFfdHlwZSwgQkssIEJOLCBLLCBOLCBCTE9DS19TSVpFLCBMT0FEX0JBVENIX1NJWkU+KAogICAgICAgICAgICBzX2IsIGIsIG4sIGspOwogICAgICAgIAogICAgICAgIGxvYWRfc2NhbGU8UE0sIFBOLCBRTSwgUU4sIFFLLCBRVUFOVF9TSVpFLCBCTE9DS19TSVpFLCAxPigKICAgICAgICAgICAgc19zLCBzYSwgc2IsIG0sIG4sIGspOwogICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgICAgICAKICAgICAgICB3bW1hX2NvbXB1dGU8aW5fZGF0YV90eXBlLCBhY2NfZGF0YV90eXBlLCBGcmFnQywgRnJhZ0EsIEZyYWdCLAogICAgICAgICAgICBQTSwgUE4sIEJNLCBCTiwgQkssIEZSQUdfTV9QRVJfV0FSUCwgRlJBR19OX1BFUl9XQVJQLCBGUkFHX0ssCiAgICAgICAgICAgIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssCiAgICAgICAgICAgIFdBUlBfTSwgV0FSUF9OLAogICAgICAgICAgICBCTE9DS19TSVpFLCBMT0FEX0JBVENIX1NJWkUsIFFVQU5UX1NJWkU+KCAKICAgICAgICAgICAgICAgIHNfYSwgc19iLCBzX3MsIGZyYWdfciwgd2lkIC8gV0FSUF9OLCB3aWQgJSBXQVJQX04pOwogICAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgIH0KICAgIAogICAgc3RvcmVfcmVzdWx0PGFjY19kYXRhX3R5cGUsIG91dF9kYXRhX3R5cGUsIEZyYWdDLCBGcmFnT3V0LAogICAgICAgIFdNTUFfTSwgV01NQV9OLCBCTSwgQk4sIE0sIE4sIEZSQUdfTV9QRVJfV0FSUCwgRlJBR19OX1BFUl9XQVJQPigKICAgICAgICAgICAgYywgZnJhZ19yLCBibG9ja0lkeC55ICogQk0sIGJsb2NrSWR4LnggKiBCTiwKICAgICAgICAgICAgd2lkIC8gV0FSUF9OLCB3aWQgJSBXQVJQX04pOwp9Owp9OyAKI2lmbmRlZiAgUEFSQU1FVEVSSVpFX0xJQlJBUlkKdXNpbmcgZnA4X3R5cGUgPSBnZW1tX2tlcm5lbDo6aW5fZGF0YV90eXBlOyAgICAKdXNpbmcgZnAxNl90eXBlID0gZ2VtbV9rZXJuZWw6Om91dF9kYXRhX3R5cGU7ICAKdXNpbmcgYWNjX2RhdGFfdHlwZSA9IGdlbW1fa2VybmVsOjphY2NfZGF0YV90eXBlOyAgCmNvbnN0ZXhwciBpbnQgTSA9IGdlbW1fa2VybmVsOjpNOyAgCmNvbnN0ZXhwciBpbnQgTiA9IGdlbW1fa2VybmVsOjpOOyAgCmNvbnN0ZXhwciBpbnQgSyA9IGdlbW1fa2VybmVsOjpLOyAgCmNvbnN0ZXhwciBpbnQgQk0gPSBnZW1tX2tlcm5lbDo6Qk07ICAKY29uc3RleHByIGludCBCTiA9IGdlbW1fa2VybmVsOjpCTjsgIApjb25zdGV4cHIgaW50IEJLID0gZ2VtbV9rZXJuZWw6OkJLOyAgCmNvbnN0ZXhwciBpbnQgQkxPQ0tfU0laRSA9IGdlbW1fa2VybmVsOjpCTE9DS19TSVpFOwpjb25zdGV4cHIgaW50IFFVQU5UX1NJWkUgPSBnZW1tX2tlcm5lbDo6UVVBTlRfU0laRTsgIApjb25zdGV4cHIgaW50IFFLID0gSyAvIFFVQU5UX1NJWkU7CmNvbnN0ZXhwciBpbnQgUU0gPSBNOwpjb25zdGV4cHIgaW50IFFOID0gTiAvIFFVQU5UX1NJWkU7CiNkZWZpbmUgQ0hFQ0tfSElQX0VSUk9SKHZhbCkgY2hlY2soKHZhbCksICN2YWwsIF9fRklMRV9fLCBfX0xJTkVfXykKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgY2hlY2soVCBlcnIsIGNvbnN0IGNoYXIqIGNvbnN0IGZ1bmMsIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGUsIGNvbnN0IGludCBsaW5lKSB7CiAgICBpZiAoZXJyICE9IGhpcFN1Y2Nlc3MpIHsKICAgICAgICBleGl0KDEpOwogICAgfQp9CnZvaWQgY3B1X2dlbW0oY29uc3QgZnA4X3R5cGUgYVtLXVtNXSwgY29uc3QgZnA4X3R5cGUgYltLXVtOXSwgZnAxNl90eXBlIGNbTV1bTl0sIAogICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhW1FLXVtRTV0sIGNvbnN0IGZsb2F0IHNiW1FLXVtRTl0pIHsKICAgIGZsb2F0ICgqcmMpW05dID0gbmV3IGZsb2F0W01dW05dOwogICAgZm9yIChpbnQgbSA9IDA7IG0gPCBNOyArK20pIHsKICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IE47ICsrbikgewogICAgICAgICAgICByY1ttXVtuXSA9IDAuMGY7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgayA9IDA7IGsgPCBLOyArK2spIHsKICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IE07ICsrbSkgewogICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IE47ICsrbikgewogICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBzYVtrL1FVQU5UX1NJWkVdW21dICogc2Jbay9RVUFOVF9TSVpFXVtuL1FVQU5UX1NJWkVdOwogICAgICAgICAgICAgICAgcmNbbV1bbl0gKz0gKHNjYWxlICogKGZsb2F0KWFba11bbV0gKiAoZmxvYXQpYltrXVtuXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmb3IgKGludCBtID0gMDsgbSA8IE07ICsrbSkgewogICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgTjsgKytuKSB7CiAgICAgICAgICAgIGNbbV1bbl0gPSAoZnAxNl90eXBlKXJjW21dW25dOwogICAgICAgIH0KICAgIH0KICAgIGRlbGV0ZVtdIHJjOwp9CmludCBtYWluKCkgewogICAgCiAgICBmcDhfdHlwZSAoKmhfYSlbTV0gPSBuZXcgZnA4X3R5cGVbS11bTV07CiAgICBmcDhfdHlwZSAoKmhfYilbTl0gPSBuZXcgZnA4X3R5cGVbS11bTl07CiAgICBmcDE2X3R5cGUgKCpoX2MpW05dID0gbmV3IGZwMTZfdHlwZVtNXVtOXTsKICAgIGZwMTZfdHlwZSAoKmhfY19yZWYpW05dID0gbmV3IGZwMTZfdHlwZVtNXVtOXTsKICAgIAogICAgCiAgICBmbG9hdCAoKmhfc2EpW1FNXSA9IG5ldyBmbG9hdFtRS11bUU1dOwogICAgZmxvYXQgKCpoX3NiKVtRTl0gPSBuZXcgZmxvYXRbUUtdW1FOXTsKICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBLOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE07ICsraikgewogICAgICAgICAgICBoX2FbaV1bal0gPSAoZnA4X3R5cGUpKChyYW5kKCkgJSAxMDAwMCkgLyAxMDAwMC4wZik7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBLOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47ICsraikgewogICAgICAgICAgICBoX2JbaV1bal0gPSAoZnA4X3R5cGUpKChyYW5kKCkgJSAxMDAwMCkgLyAxMDAwMC4wZik7CiAgICAgICAgfQogICAgfQogICAgCiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUUs7ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgUU07ICsraikgewogICAgICAgICAgICBoX3NhW2ldW2pdID0gMS4wZjsgCiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBRSzsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBRTjsgKytqKSB7CiAgICAgICAgICAgIGhfc2JbaV1bal0gPSAxLjBmOyAKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZwOF90eXBlICgqZF9hKVtNXTsKICAgIGZwOF90eXBlICgqZF9iKVtOXTsKICAgIGZwMTZfdHlwZSAoKmRfYylbTl07CiAgICBmbG9hdCAoKmRfc2EpW1FNXTsKICAgIGZsb2F0ICgqZF9zYilbUU5dOwogICAgCiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWFsbG9jKCZkX2EsIEsgKiBNICogc2l6ZW9mKGZwOF90eXBlKSkpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1hbGxvYygmZF9iLCBLICogTiAqIHNpemVvZihmcDhfdHlwZSkpKTsKICAgIENIRUNLX0hJUF9FUlJPUihoaXBNYWxsb2MoJmRfYywgTSAqIE4gKiBzaXplb2YoZnAxNl90eXBlKSkpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1hbGxvYygmZF9zYSwgUUsgKiBRTSAqIHNpemVvZihmbG9hdCkpKTsKICAgIENIRUNLX0hJUF9FUlJPUihoaXBNYWxsb2MoJmRfc2IsIFFLICogUU4gKiBzaXplb2YoZmxvYXQpKSk7CiAgICAKICAgIENIRUNLX0hJUF9FUlJPUihoaXBNZW1jcHkoZF9hLCBoX2EsIEsgKiBNICogc2l6ZW9mKGZwOF90eXBlKSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWVtY3B5KGRfYiwgaF9iLCBLICogTiAqIHNpemVvZihmcDhfdHlwZSksIGhpcE1lbWNweUhvc3RUb0RldmljZSkpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1lbWNweShkX3NhLCBoX3NhLCBRSyAqIFFNICogc2l6ZW9mKGZsb2F0KSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWVtY3B5KGRfc2IsIGhfc2IsIFFLICogUU4gKiBzaXplb2YoZmxvYXQpLCBoaXBNZW1jcHlIb3N0VG9EZXZpY2UpKTsKICAgIAogICAgZGltMyBncmlkKChOICsgQk4gLSAxKSAvIEJOLCAoTSArIEJNIC0gMSkgLyBCTSk7CiAgICBkaW0zIGJsb2NrKEJMT0NLX1NJWkUpOwogICAgCiAgICAKICAgIGlmIChCTE9DS19TSVpFICUgMzIgIT0gMCkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgCiAgICAKICAgIGludCBkZXZpY2VJZDsKICAgIEhJUF9DQUxMKGhpcEdldERldmljZSgmZGV2aWNlSWQpKTsKICAgIGhpcERldmljZVByb3BfdCBkZXZpY2VQcm9wOwogICAgSElQX0NBTEwoaGlwR2V0RGV2aWNlUHJvcGVydGllcygmZGV2aWNlUHJvcCwgZGV2aWNlSWQpKTsKICAgIAogICAgaWYgKGRldmljZVByb3AubWFqb3IgPCA3KSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgICAgICAgICBncmlkLngsIGdyaWQueSwgYmxvY2sueCk7CiAgICAKICAgIAogICAgCiAgICBISVBfQ0FMTChoaXBHZXREZXZpY2VQcm9wZXJ0aWVzKCZkZXZpY2VQcm9wLCBkZXZpY2VJZCkpOwogICAgCiAgICBoaXBGdW5jQXR0cmlidXRlcyBmdW5jQXR0cjsKICAgIEhJUF9DQUxMKGhpcEZ1bmNHZXRBdHRyaWJ1dGVzKCZmdW5jQXR0ciwgKGNvbnN0IHZvaWQqKWdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbCkpOwogICAgCiAgICBDSEVDS19ISVBfRVJST1IoaGlwTWVtc2V0KGRfYywgMCwgTSAqIE4gKiBzaXplb2YoZnAxNl90eXBlKSkpOwogICAgCiAgICAKICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDw8PGdyaWQsIGJsb2NrPj4+KGRfYSwgZF9iLCBkX2MsIGRfc2EsIGRfc2IpOwogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcERldmljZVN5bmNocm9uaXplKCkpOwogICAgZ2VtbV9rZXJuZWw6OmdlbW1fa2VybmVsPDw8Z3JpZCwgYmxvY2s+Pj4oZF9hLCBkX2IsIGRfYywgZF9zYSwgZF9zYik7CiAgICBDSEVDS19ISVBfRVJST1IoaGlwRGV2aWNlU3luY2hyb25pemUoKSk7CiAgICAKICAgIAogICAgaGlwRXZlbnRfdCBzdGFydCwgc3RvcDsKICAgIEhJUF9DQUxMKGhpcEV2ZW50Q3JlYXRlKCZzdGFydCkpOwogICAgSElQX0NBTEwoaGlwRXZlbnRDcmVhdGUoJnN0b3ApKTsKICAgIAogICAgCiAgICBDSEVDS19ISVBfRVJST1IoaGlwRGV2aWNlU3luY2hyb25pemUoKSk7CiAgICBISVBfQ0FMTChoaXBFdmVudFJlY29yZChzdGFydCkpOwogICAgCiAgICAKICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDw8PGdyaWQsIGJsb2NrPj4+KGRfYSwgZF9iLCBkX2MsIGRfc2EsIGRfc2IpOwogICAgCiAgICAKICAgIEhJUF9DQUxMKGhpcEV2ZW50UmVjb3JkKHN0b3ApKTsKICAgIAogICAgCiAgICBISVBfQ0FMTChoaXBFdmVudFN5bmNocm9uaXplKHN0b3ApKTsKICAgIGZsb2F0IG1pbGxpc2Vjb25kcyA9IDA7CiAgICBISVBfQ0FMTChoaXBFdmVudEVsYXBzZWRUaW1lKCZtaWxsaXNlY29uZHMsIHN0YXJ0LCBzdG9wKSk7CiAgICAKICAgIAogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcEdldExhc3RFcnJvcigpKTsKICAgIAogICAgCiAgICBkb3VibGUgb3BlcmF0aW9ucyA9IDIuMCAqIE0gKiBOICogSzsgIAogICAgZG91YmxlIHNlY29uZHMgPSBtaWxsaXNlY29uZHMgLyAxMDAwLjA7CiAgICBkb3VibGUgdGZsb3BzID0gKG9wZXJhdGlvbnMgLyBzZWNvbmRzKSAvIDFlMTI7CiAgICAKICAgIAogICAgQ0hFQ0tfSElQX0VSUk9SKGhpcE1lbWNweShoX2MsIGRfYywgTSAqIE4gKiBzaXplb2YoZnAxNl90eXBlKSwgaGlwTWVtY3B5RGV2aWNlVG9Ib3N0KSk7CiAgICAKICAgIGNwdV9nZW1tKGhfYSwgaF9iLCBoX2NfcmVmLCBoX3NhLCBoX3NiKTsKICAgIAogICAgaW50IHByaW50X2NvdW50ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTSAmJiBwcmludF9jb3VudCA8IDEwOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE4gJiYgcHJpbnRfY291bnQgPCAxMDsgKytqKSB7CiAgICAgICAgICAgIHByaW50X2NvdW50Kys7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpbnQgZXJyb3JzID0gMDsKICAgIGZsb2F0IG1heF9hYnNfZGlmZiA9IDAuMGY7CiAgICBmbG9hdCBtYXhfcmVsX2RpZmYgPSAwLjBmOwogICAgc3RydWN0IEVycm9ySW5mbyB7CiAgICAgICAgaW50IHJvdywgY29sOwogICAgICAgIGZsb2F0IGdwdV92YWwsIGNwdV92YWwsIGFic19kaWZmLCByZWxfZGlmZjsKICAgIH07CiAgICBFcnJvckluZm8gZmlyc3RfMTBfZXJyb3JzWzEwXTsKICAgIEVycm9ySW5mbyBtYXhfMTBfZXJyb3JzWzEwXSA9IHt9OwogICAgCiAgICBpbnQgbWF4X2Vycm9yc190b19vdXRwdXQgPSAxMDsgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IE07ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgKytqKSB7CiAgICAgICAgICAgIGZsb2F0IGdwdV92YWwgPSAoZmxvYXQpaF9jW2ldW2pdOwogICAgICAgICAgICBmbG9hdCBjcHVfdmFsID0gKGZsb2F0KWhfY19yZWZbaV1bal07CiAgICAgICAgICAgIGZsb2F0IGFic19kaWZmOwogICAgICAgICAgICBmbG9hdCByZWxfZGlmZjsKICAgICAgICAgICAgaWYgKHN0ZDo6aXNuYW4oZ3B1X3ZhbCkgfHwgc3RkOjppc25hbihjcHVfdmFsKSkgewogICAgICAgICAgICAgICAgYWJzX2RpZmYgPSBJTkZJTklUWTsKICAgICAgICAgICAgICAgIHJlbF9kaWZmID0gSU5GSU5JVFk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhYnNfZGlmZiA9IGFicyhncHVfdmFsIC0gY3B1X3ZhbCk7CiAgICAgICAgICAgICAgICByZWxfZGlmZiA9IGFic19kaWZmIC8gKGFicyhjcHVfdmFsKSArIEZMVF9FUFNJTE9OKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgbWF4X2Fic19kaWZmID0gZm1heGYobWF4X2Fic19kaWZmLCBhYnNfZGlmZik7CiAgICAgICAgICAgIG1heF9yZWxfZGlmZiA9IGZtYXhmKG1heF9yZWxfZGlmZiwgcmVsX2RpZmYpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGVycm9ycyA8IG1heF9lcnJvcnNfdG9fb3V0cHV0ICYmIChyZWxfZGlmZiA+IDFlLTIgfHwgYWJzX2RpZmYgPiAxZS0zKSkgewogICAgICAgICAgICAgICAgZmlyc3RfMTBfZXJyb3JzW2Vycm9yc10gPSB7aSwgaiwgZ3B1X3ZhbCwgY3B1X3ZhbCwgYWJzX2RpZmYsIHJlbF9kaWZmfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHJlbF9kaWZmID4gMWUtMiB8fCBhYnNfZGlmZiA+IDFlLTMpIHsKICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBtYXhfZXJyb3JzX3RvX291dHB1dDsgKytrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFic19kaWZmID4gbWF4XzEwX2Vycm9yc1trXS5hYnNfZGlmZikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gbWF4X2Vycm9yc190b19vdXRwdXQgLSAxOyBsID4gazsgLS1sKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfMTBfZXJyb3JzW2xdID0gbWF4XzEwX2Vycm9yc1tsIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4XzEwX2Vycm9yc1trXSA9IHtpLCBqLCBncHVfdmFsLCBjcHVfdmFsLCBhYnNfZGlmZiwgcmVsX2RpZmZ9OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm1pbihlcnJvcnMsIG1heF9lcnJvcnNfdG9fb3V0cHV0KTsgKytpKSB7CiAgICAgICAgICAgICAgIGZpcnN0XzEwX2Vycm9yc1tpXS5yb3csIGZpcnN0XzEwX2Vycm9yc1tpXS5jb2wsCiAgICAgICAgICAgICAgIGZpcnN0XzEwX2Vycm9yc1tpXS5ncHVfdmFsLCBmaXJzdF8xMF9lcnJvcnNbaV0uY3B1X3ZhbCwKICAgICAgICAgICAgICAgZmlyc3RfMTBfZXJyb3JzW2ldLmFic19kaWZmLCBmaXJzdF8xMF9lcnJvcnNbaV0ucmVsX2RpZmYpOwogICAgfQogICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9lcnJvcnNfdG9fb3V0cHV0ICYmIG1heF8xMF9lcnJvcnNbaV0uYWJzX2RpZmYgPiAwOyArK2kpIHsKICAgICAgICAgICAgICAgbWF4XzEwX2Vycm9yc1tpXS5yb3csIG1heF8xMF9lcnJvcnNbaV0uY29sLAogICAgICAgICAgICAgICBtYXhfMTBfZXJyb3JzW2ldLmdwdV92YWwsIG1heF8xMF9lcnJvcnNbaV0uY3B1X3ZhbCwKICAgICAgICAgICAgICAgbWF4XzEwX2Vycm9yc1tpXS5hYnNfZGlmZiwgbWF4XzEwX2Vycm9yc1tpXS5yZWxfZGlmZik7CiAgICB9CiAgICBpZiAoZXJyb3JzID09IDApIHsKICAgIH0gZWxzZSB7CiAgICB9CiAgICAKICAgIGRvdWJsZSBmbG9wcyA9IDIuMCAqIE0gKiBOICogSzsKICAgIGRvdWJsZSBnZmxvcHMgPSAoZmxvcHMgKiAxZS05KSAvIChtaWxsaXNlY29uZHMgKiAxZS0zKTsKICAgIAogICAgCiAgICBkZWxldGVbXSBoX2E7CiAgICBkZWxldGVbXSBoX2I7CiAgICBkZWxldGVbXSBoX2M7CiAgICBkZWxldGVbXSBoX2NfcmVmOwogICAgZGVsZXRlW10gaF9zYTsKICAgIGRlbGV0ZVtdIGhfc2I7CiAgICBISVBfQ0FMTChoaXBGcmVlKGRfYSkpOwogICAgSElQX0NBTEwoaGlwRnJlZShkX2IpKTsKICAgIEhJUF9DQUxMKGhpcEZyZWUoZF9jKSk7CiAgICBISVBfQ0FMTChoaXBGcmVlKGRfc2EpKTsKICAgIEhJUF9DQUxMKGhpcEZyZWUoZF9zYikpOwogICAgSElQX0NBTEwoaGlwRXZlbnREZXN0cm95KHN0YXJ0KSk7CiAgICBISVBfQ0FMTChoaXBFdmVudERlc3Ryb3koc3RvcCkpOwogICAgcmV0dXJuIDA7Cn0KI2VuZGlmCiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKI2VuZGlmCiNkZWZpbmUgUEFSQU1FVEVSSVpFX0xJQlJBUlkKI3VuZGVmIFBBUkFNRVRFUklaRV9MSUJSQVJZCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmZsb2F0ICpjX3NwbGl0a3tudWxscHRyfTsKc2l6ZV90IGNfc3BsaXRrX3NpemV7MH07CnRlbXBsYXRlIDxpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgQk0sIGludCBCTiwgaW50IEJLLCBpbnQgV0FSUF9NLCBpbnQgV0FSUF9OLCBpbnQgQkxPQ0tfU0laRSwgaW50IFFVQU5UX0JMT0NLX1NJWkUsIGludCBTUExJVEtfRkFDVE9SPgp2b2lkIGxhdW5jaF9nZW1tKGNvbnN0IF9fRlA4X1RZUEUgKmEsIGNvbnN0IF9fRlA4X1RZUEUgKmIsIF9fQkYxNl9UWVBFICpjLCBjb25zdCBmbG9hdCAqYXMsIGNvbnN0IGZsb2F0ICpicykgewogICAgZGltMyBncmlkKGNlaWxfZGl2KE4sIEJOKSwgY2VpbF9kaXYoTSwgQk0pLCBTUExJVEtfRkFDVE9SKTsKICAgIGRpbTMgYmxvY2soQkxPQ0tfU0laRSk7CiAgICBpZiBjb25zdGV4cHIgKFNQTElUS19GQUNUT1IgPT0gMSkgewogICAgICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDxfX0ZQOF9UWVBFLCBmbG9hdCwgX19CRjE2X1RZUEUsIE0sIE4sIEssIEJNLCBCTiwgQkssIFFVQU5UX0JMT0NLX1NJWkUsIEJMT0NLX1NJWkUsIFdBUlBfTSwgV0FSUF9OPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8PGdyaWQsIGJsb2NrPj4+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtNXT4oYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IF9fRlA4X1RZUEUgKCopW05dPihiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8X19CRjE2X1RZUEUgKCopW05dPihjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKCopW01dPihhcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICgqKVtjZWlsX2RpdihOLCBRVUFOVF9CTE9DS19TSVpFKV0+KGJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIGlmKGNfc3BsaXRrX3NpemUgPCBTUExJVEtfRkFDVE9SICogTSAqIE4gKiBzaXplb2YoZmxvYXQpKSB7CiAgICAgICAgICAgIGNfc3BsaXRrX3NpemUgPSBTUExJVEtfRkFDVE9SICogTSAqIE4gKiBzaXplb2YoZmxvYXQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGNfc3BsaXRrKSB7CiAgICAgICAgICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRnJlZUFzeW5jKShjX3NwbGl0aywgMCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShNYWxsb2NBc3luYykoJmNfc3BsaXRrLCBjX3NwbGl0a19zaXplLCAwKSk7CiAgICAgICAgfQogICAgICAgIGdlbW1fa2VybmVsOjpnZW1tX2tlcm5lbDxfX0ZQOF9UWVBFLCBmbG9hdCwgZmxvYXQsIE0sIE4sIEsgLyBTUExJVEtfRkFDVE9SLCBCTSwgQk4sIEJLLCBRVUFOVF9CTE9DS19TSVpFLCBCTE9DS19TSVpFLCBXQVJQX00sIFdBUlBfTj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PDxncmlkLCBibG9jaz4+PigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19GUDhfVFlQRSAoKilbTV0+KGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX0ZQOF9UWVBFICgqKVtOXT4oYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGZsb2F0ICgqKVtOXT4oY19zcGxpdGspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAoKilbTV0+KGFzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKCopW2NlaWxfZGl2KE4sIFFVQU5UX0JMT0NLX1NJWkUpXT4oYnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICBjb25zdGV4cHIgdWludDMyX3QgUkVEVUNFX0JMT0NLID0gMjU2OwogICAgICAgIGdlbW1fa2VybmVsOjpyZWR1Y2U8PDxjZWlsX2RpdihNICogTiwgUkVEVUNFX0JMT0NLKSwgUkVEVUNFX0JMT0NLPj4+KE0sIE4sIFNQTElUS19GQUNUT1IsIGNfc3BsaXRrLCAoX19CRjE2X1RZUEUgKiljKTsKICAgIH0KICAgIGF1dG8gZXJyID0gSE9TVF9UWVBFKEdldExhc3RFcnJvcikoKTsKICAgIGlmIChlcnIgIT0gSE9TVF9UWVBFKFN1Y2Nlc3MpKSB7CiAgICAgICAgYWJvcnQoKTsKICAgIH0KfQpjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IHBhY2tfc2hhcGUoaW50IG0sIGludCBuLCBpbnQgaykgewogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIHJldHVybiAoKG0gLyAzMikgPDwgMTYpIHwgKChuIC8gMzIpIDw8IDgpIHwgKGsgLyAzMik7Cn0KI2RlZmluZSBESVNQQVRDSF9HRU1NKE0sIE4sIEssIEJNLCBCTiwgQkssIFdBUlBfTSwgV0FSUF9OLCBCTE9DS19TSVpFLCBTUExJVEtfRkFDVE9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhY2tfc2hhcGVfY2hlY2tlZDxNLCBOLCBLPigpOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aW1lICYmIGdmbG9wcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0X3RpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoX2dlbW08TSwgTiwgSywgQk0sIEJOLCBCSywgV0FSUF9NLCBXQVJQX04sIEJMT0NLX1NJWkUsIDEyOCwgU1BMSVRLX0ZBQ1RPUj4oYV9wdHIsIGJfcHRyLCBjX3B0ciwgYXNfcHRyLCBic19wdHIpOyB0aW1lci5zdG9wX3RpbWVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hfZ2VtbTxNLCBOLCBLLCBCTSwgQk4sIEJLLCBXQVJQX00sIFdBUlBfTiwgQkxPQ0tfU0laRSwgMTI4LCBTUExJVEtfRkFDVE9SPihhX3B0ciwgYl9wdHIsIGNfcHRyLCBhc19wdHIsIGJzX3B0cik7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CnRlbXBsYXRlIDxpbnQgTSwgaW50IE4sIGludCBLPgpjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IHBhY2tfc2hhcGVfY2hlY2tlZCgpIHsKICAgIHJldHVybiBwYWNrX3NoYXBlKE0sIE4sIEspOwp9CmNsYXNzIEtlcm5lbFRpbWVyIHsKcHJpdmF0ZToKICAgIGludCBtLCBuLCBrOwogICAgSE9TVF9UWVBFKEV2ZW50X3QpIHN0YXJ0LCBzdG9wOwogICAgZmxvYXQgKnRpbWVfcHRyOwogICAgZmxvYXQgKmdmbG9wc19wdHI7CnB1YmxpYzoKICAgIEtlcm5lbFRpbWVyKGludCBtLCBpbnQgbiwgaW50IGssIGZsb2F0ICp0aW1lLCBmbG9hdCAqZ2Zsb3BzKSA6IG0obSksIG4obiksIGsoayksIHRpbWVfcHRyKHRpbWUpLCBnZmxvcHNfcHRyKGdmbG9wcykgewogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudENyZWF0ZSkoJnN0YXJ0KSk7CiAgICAgICAgTElCX0NBTEwoSE9TVF9UWVBFKEV2ZW50Q3JlYXRlKSgmc3RvcCkpOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFJlY29yZCkoc3RhcnQpKTsKICAgIH0KICAgIHZvaWQgc3RhcnRfdGltZXIoKSB7IExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFJlY29yZCkoc3RhcnQpKTsgfQogICAgdm9pZCBzdG9wX3RpbWVyKCkgewogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFJlY29yZCkoc3RvcCkpOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudFN5bmNocm9uaXplKShzdG9wKSk7CiAgICAgICAgZmxvYXQgZWxhcHNlZF90aW1lOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudEVsYXBzZWRUaW1lKSgmZWxhcHNlZF90aW1lLCBzdGFydCwgc3RvcCkpOwogICAgICAgIGRvdWJsZSBmbG9wcyA9IDIuMCAqIHN0YXRpY19jYXN0PGRvdWJsZT4obSkgKiBzdGF0aWNfY2FzdDxkb3VibGU+KG4pICogc3RhdGljX2Nhc3Q8ZG91YmxlPihrKTsKICAgICAgICBkb3VibGUgZ2Zsb3BzX3ZhbCA9IChmbG9wcyAvIChlbGFwc2VkX3RpbWUgKiAxZS0zKSkgLyAxZTk7CiAgICAgICAgCiAgICAgICAgaWYgKHRpbWVfcHRyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgKnRpbWVfcHRyID0gZWxhcHNlZF90aW1lOwogICAgICAgIH0KICAgICAgICBpZiAoZ2Zsb3BzX3B0ciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICpnZmxvcHNfcHRyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdmbG9wc192YWwpOwogICAgICAgIH0KICAgIH0KICAgIH5LZXJuZWxUaW1lcigpIHsKICAgICAgICBMSUJfQ0FMTChIT1NUX1RZUEUoRXZlbnREZXN0cm95KShzdGFydCkpOwogICAgICAgIExJQl9DQUxMKEhPU1RfVFlQRShFdmVudERlc3Ryb3kpKHN0b3ApKTsKICAgIH0KfTsKdm9pZCBydW4odm9pZCAqYSwgdm9pZCAqYiwgdm9pZCAqYXMsIHZvaWQgKmJzLCB2b2lkICpjLCBpbnQgbSwgaW50IG4sIGludCBrLCBmbG9hdCAqdGltZSwgZmxvYXQgKmdmbG9wcykgewogICAgCiAgICAKICAgIGNvbnN0IF9fRlA4X1RZUEUgKmFfcHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgX19GUDhfVFlQRSAqPihhKTsKICAgIGNvbnN0IF9fRlA4X1RZUEUgKmJfcHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgX19GUDhfVFlQRSAqPihiKTsKICAgIF9fQkYxNl9UWVBFICpjX3B0ciA9IHN0YXRpY19jYXN0PF9fQkYxNl9UWVBFICo+KGMpOwogICAgY29uc3QgZmxvYXQgKmFzX3B0ciA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KGFzKTsKICAgIGNvbnN0IGZsb2F0ICpic19wdHIgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPihicyk7CiAgICBLZXJuZWxUaW1lciB0aW1lcihtLCBuLCBrLCB0aW1lLCBnZmxvcHMpOwogICAgc3dpdGNoKHBhY2tfc2hhcGUobSwgbiwgaykpIHsKI2lmZGVmIFRFU1RfT05fUkROQTQgCiAgICAgICAgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDY0LCAgICAgMTI4LCAgICA2NCwgICAgNjQsICAgIDMyLCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICAxNTM2LCAgIDcxNjgsICAgNjQsICAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDY0LCAgICAgMzA3MiwgICAxNTM2LCAgIDY0LCAgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDU3NiwgICAgNzE2OCwgICA2NCwgICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oOTYsICAgICA3MTY4LCAgIDI1NiwgICAgOTYsICAgIDI1NiwgICA2NCwgICAyLCAgICAgIDQsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDk2LCAgICAgNzE2OCwgICAyMDQ4LCAgIDk2LCAgICAyNTYsICAgNjQsICAgMiwgICAgICA0LCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg5NiwgICAgIDQ2MDgsICAgNzE2OCwgICA5NiwgICAgMjU2LCAgIDY0LCAgIDIsICAgICAgNCwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTI4LCAgICA3MTY4LCAgIDIzMDQsICAgMTI4LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEyOCwgICAgNTEyLCAgICA3MTY4LCAgIDEyOCwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDI1NiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg1MTIsICAgIDQwOTYsICAgNTEyLCAgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICAyNTYsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNTEyLCAgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgMjU2LCAgICAgICAgICAxKTsKICAgICAgICAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgMTUzNiwgICA3MTY4LCAgICAxMjgsICAgIDEyOCwgICAgIDMyLCAgICAgIDIsICAgICAgMiwgICAgMTI4LCAgICAgNCk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAzMDcyLCAgIDE1MzYsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgICA1NzYsICAgNzE2OCwgICAgMTI4LCAgICAgNjQsICAgICAzMiwgICAgICA0LCAgICAgIDEsICAgIDEyOCwgICAgIDQpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAgMjU2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA3MTY4LCAgIDIwNDgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDQ2MDgsICAgNzE2OCwgICAgMTI4LCAgICAxMjgsICAgICAzMiwgICAgICAyLCAgICAgIDIsICAgIDEyOCwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyMzA0LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICAgNTEyLCAgIDcxNjgsICAgICA2NCwgICAgMTI4LCAgICAgMzIsICAgICAgMiwgICAgICAyLCAgICAxMjgsICAgICA0KTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDQwOTYsICAgIDUxMiwgICAgMTI4LCAgICAyNTYsICAgICAzMiwgICAgICAyLCAgICAgIDQsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgMTUzNiwgICA3MTY4LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAzMDcyLCAgIDE1MzYsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgICA1NzYsICAgNzE2OCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAgMjU2LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA3MTY4LCAgIDIwNDgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDQ2MDgsICAgNzE2OCwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyMzA0LCAgICAyNTYsICAgIDEyOCwgICAgIDMyLCAgICAgIDQsICAgICAgMiwgICAgMjU2LCAgICAgMSk7IAogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICAgNTEyLCAgIDcxNjgsICAgIDI1NiwgICAgMTI4LCAgICAgMzIsICAgICAgNCwgICAgICAyLCAgICAyNTYsICAgICAxKTsgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDQwOTYsICAgIDUxMiwgICAgMjU2LCAgICAxMjgsICAgICAzMiwgICAgICA0LCAgICAgIDIsICAgIDI1NiwgICAgIDEpOyAKI2Vsc2UgCiAgICAgICAgCiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDY0LCAgICAgMTI4LCAgICA2NCwgICAgNjQsICAgIDMyLCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjQsICAgICAxNTM2LCAgIDcxNjgsICAgNjQsICAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDY0LCAgICAgMzA3MiwgICAxNTM2LCAgIDY0LCAgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2NCwgICAgIDU3NiwgICAgNzE2OCwgICA2NCwgICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oOTYsICAgICA3MTY4LCAgIDI1NiwgICAgOTYsICAgIDI1NiwgICA2NCwgICAyLCAgICAgIDQsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDk2LCAgICAgNzE2OCwgICAyMDQ4LCAgIDk2LCAgICAyNTYsICAgNjQsICAgMiwgICAgICA0LCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg5NiwgICAgIDQ2MDgsICAgNzE2OCwgICA5NiwgICAgMjU2LCAgIDY0LCAgIDIsICAgICAgNCwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTI4LCAgICA3MTY4LCAgIDIzMDQsICAgMTI4LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEyOCwgICAgNTEyLCAgICA3MTY4LCAgIDEyOCwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg1MTIsICAgIDQwOTYsICAgNTEyLCAgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNTEyLCAgICAxNTM2LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICAKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgMTUzNiwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMik7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA1NzYsICAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICA4KTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyNTYsICAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0NjA4LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICA4KTsKICAgICAgICBESVNQQVRDSF9HRU1NKDEwMjQsICAgNzE2OCwgICAyMzA0LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSgxMDI0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDgpOwogICAgICAgIERJU1BBVENIX0dFTU0oMTAyNCwgICA0MDk2LCAgIDUxMiwgICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgMTUzNiwgICA3MTY4LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDMwNzIsICAgMTUzNiwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA1NzYsICAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyNTYsICAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDcxNjgsICAgMjA0OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDEpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0NjA4LCAgIDcxNjgsICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKICAgICAgICBESVNQQVRDSF9HRU1NKDYxNDQsICAgNzE2OCwgICAyMzA0LCAgIDI1NiwgICAxMjgsICAgNjQsICAgNCwgICAgICAyLCAgICAgIDUxMiwgICAgICAgICAgMSk7CiAgICAgICAgRElTUEFUQ0hfR0VNTSg2MTQ0LCAgIDUxMiwgICAgNzE2OCwgICAyNTYsICAgMTI4LCAgIDY0LCAgIDQsICAgICAgMiwgICAgICA1MTIsICAgICAgICAgIDgpOwogICAgICAgIERJU1BBVENIX0dFTU0oNjE0NCwgICA0MDk2LCAgIDUxMiwgICAgMjU2LCAgIDEyOCwgICA2NCwgICA0LCAgICAgIDIsICAgICAgNTEyLCAgICAgICAgICAxKTsKI2VuZGlmCiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICBhYm9ydCgpOwogICAgICAgIH0KICAgIH0KfSAKdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgewogICAgaW50IG0gPSBhLnNpemUoMCk7CiAgICBpbnQgbiA9IGIuc2l6ZSgwKTsKICAgIGludCBrID0gYS5zaXplKDEpOwogICAgcnVuKChfX0ZQOF9UWVBFKilhLmRhdGFfcHRyKCksIChfX0ZQOF9UWVBFKiliLmRhdGFfcHRyKCksIAogICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19CRjE2X1RZUEUqKWMuZGF0YV9wdHIoKSwgbSwgbiwgaywgbnVsbHB0ciwgbnVsbHB0cik7CiAgICAKfQoiIiIKaW1wb3J0IG9zCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0nZnA4X21tJywKICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwKICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLAogICAgdmVyYm9zZT1UcnVlLAogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLAopCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykKICAgIHJldHVybiBjSource code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Best evidence level for this revision: reported
JSON