Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmNjCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwNSBNYXJjbyBQZXNlbnRpIEdyaXR0aSA8bXBnQHJlZGhhdC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDExIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGltcGxlbWVudGF0aW9uCiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgImdvby9Hb29MaWtlbHkuaCIKI2luY2x1ZGUgInBvcHBsZXIvRXJyb3IuaCIKI2luY2x1ZGUgIlNwbGFzaEVycm9yQ29kZXMuaCIKI2luY2x1ZGUgIlNwbGFzaE1hdGguaCIKI2luY2x1ZGUgIlNwbGFzaEJpdG1hcC5oIgojaW5jbHVkZSAiU3BsYXNoU3RhdGUuaCIKI2luY2x1ZGUgIlNwbGFzaFBhdGguaCIKI2luY2x1ZGUgIlNwbGFzaFhQYXRoLmgiCiNpbmNsdWRlICJTcGxhc2hYUGF0aFNjYW5uZXIuaCIKI2luY2x1ZGUgIlNwbGFzaFBhdHRlcm4uaCIKI2luY2x1ZGUgIlNwbGFzaFNjcmVlbi5oIgojaW5jbHVkZSAiU3BsYXNoRm9udC5oIgojaW5jbHVkZSAiU3BsYXNoR2x5cGhCaXRtYXAuaCIKI2luY2x1ZGUgIlNwbGFzaC5oIgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIGRpc3RhbmNlIG9mIEJlemllciBjb250cm9sIHBvaW50IGZyb20gY2VudGVyIGZvciBjaXJjbGUgYXBwcm94aW1hdGlvbgovLyA9ICg0ICogKHNxcnQoMikgLSAxKSAvIDMpICogcgojZGVmaW5lIGJlemllckNpcmNsZSAoKFNwbGFzaENvb3JkKTAuNTUyMjg0NzUpCiNkZWZpbmUgYmV6aWVyQ2lyY2xlMiAoKFNwbGFzaENvb3JkKSgwLjUgKiAwLjU1MjI4NDc1KSkKCi8vIERpdmlkZSBhIDE2LWJpdCB2YWx1ZSAoaW4gWzAsIDI1NSoyNTVdKSBieSAyNTUsIHJldHVybmluZyBhbiA4LWJpdCByZXN1bHQuCnN0YXRpYyBpbmxpbmUgR3VjaGFyIGRpdjI1NShpbnQgeCkgewogIHJldHVybiAoR3VjaGFyKSgoeCArICh4ID4+IDgpICsgMHg4MCkgPj4gOCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmlubGluZSB2b2lkIEd1c3dhcCggVCZhLCBUJmIgKSB7IFQgdG1wID0gYTsgYT1iOyBiPXRtcDsgfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoUGlwZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2RlZmluZSBzcGxhc2hQaXBlTWF4U3RhZ2VzIDkKCnN0cnVjdCBTcGxhc2hQaXBlIHsKICAvLyBwaXhlbCBjb29yZGluYXRlcwogIGludCB4LCB5OwoKICAvLyBzb3VyY2UgcGF0dGVybgogIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm47CgogIC8vIHNvdXJjZSBhbHBoYSBhbmQgY29sb3IKICBTcGxhc2hDb29yZCBhSW5wdXQ7CiAgR0Jvb2wgdXNlc1NoYXBlOwogIEd1Y2hhciBhU3JjOwogIFNwbGFzaENvbG9yUHRyIGNTcmM7CiAgU3BsYXNoQ29sb3IgY1NyY1ZhbDsKCiAgLy8gbm9uLWlzb2xhdGVkIGdyb3VwIGFscGhhMAogIEd1Y2hhciAqYWxwaGEwUHRyOwoKICAvLyBzb2Z0IG1hc2sKICBTcGxhc2hDb2xvclB0ciBzb2Z0TWFza1B0cjsKCiAgLy8gZGVzdGluYXRpb24gYWxwaGEgYW5kIGNvbG9yCiAgU3BsYXNoQ29sb3JQdHIgZGVzdENvbG9yUHRyOwogIGludCBkZXN0Q29sb3JNYXNrOwogIEd1Y2hhciAqZGVzdEFscGhhUHRyOwoKICAvLyBzaGFwZQogIFNwbGFzaENvb3JkIHNoYXBlOwoKICAvLyByZXN1bHQgYWxwaGEgYW5kIGNvbG9yCiAgR0Jvb2wgbm9UcmFuc3BhcmVuY3k7CiAgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCByZXN1bHRDb2xvckN0cmw7CgogIC8vIG5vbi1pc29sYXRlZCBncm91cCBjb3JyZWN0aW9uCiAgaW50IG5vbklzb2xhdGVkR3JvdXA7Cn07CgpTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIFNwbGFzaDo6cGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kW10gPSB7CiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRSR0IsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kUkdCCiNpZiBTUExBU0hfQ01ZSwogICwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLCiNlbmRpZgp9OwoKU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBTcGxhc2g6OnBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFtdID0gewogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRSR0IsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kUkdCLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFJHQgojaWYgU1BMQVNIX0NNWUsKICAsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kQ01ZSwojZW5kaWYKfTsKClNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgU3BsYXNoOjpwaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kW10gPSB7CiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRSR0IsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFJHQgojaWYgU1BMQVNIX0NNWUsKICAsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZENNWUsKI2VuZGlmCn07CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHZvaWQgYmxlbmRYb3IoU3BsYXNoQ29sb3JQdHIgc3JjLCBTcGxhc2hDb2xvclB0ciBkZXN0LAoJCSAgICAgU3BsYXNoQ29sb3JQdHIgYmxlbmQsIFNwbGFzaENvbG9yTW9kZSBjbSkgewogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgc3BsYXNoQ29sb3JNb2RlTkNvbXBzW2NtXTsgKytpKSB7CiAgICBibGVuZFtpXSA9IHNyY1tpXSBeIGRlc3RbaV07CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBtb2RpZmllZCByZWdpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgU3BsYXNoOjpjbGVhck1vZFJlZ2lvbigpIHsKICBtb2RYTWluID0gYml0bWFwLT5nZXRXaWR0aCgpOwogIG1vZFlNaW4gPSBiaXRtYXAtPmdldEhlaWdodCgpOwogIG1vZFhNYXggPSAtMTsKICBtb2RZTWF4ID0gLTE7Cn0KCmlubGluZSB2b2lkIFNwbGFzaDo6dXBkYXRlTW9kWChpbnQgeCkgewogIGlmICh4IDwgbW9kWE1pbikgewogICAgbW9kWE1pbiA9IHg7CiAgfQogIGlmICh4ID4gbW9kWE1heCkgewogICAgbW9kWE1heCA9IHg7CiAgfQp9CgppbmxpbmUgdm9pZCBTcGxhc2g6OnVwZGF0ZU1vZFkoaW50IHkpIHsKICBpZiAoeSA8IG1vZFlNaW4pIHsKICAgIG1vZFlNaW4gPSB5OwogIH0KICBpZiAoeSA+IG1vZFlNYXgpIHsKICAgIG1vZFlNYXggPSB5OwogIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gcGlwZWxpbmUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlubGluZSB2b2lkIFNwbGFzaDo6cGlwZUluaXQoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LAoJCQkgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvbG9yUHRyIGNTcmMsCgkJCSAgICAgU3BsYXNoQ29vcmQgYUlucHV0LCBHQm9vbCB1c2VzU2hhcGUsCgkJCSAgICAgR0Jvb2wgbm9uSXNvbGF0ZWRHcm91cCkgewogIHBpcGVTZXRYWShwaXBlLCB4LCB5KTsKICBwaXBlLT5wYXR0ZXJuID0gTlVMTDsKCiAgLy8gc291cmNlIGNvbG9yCiAgaWYgKHBhdHRlcm4pIHsKICAgIGlmIChwYXR0ZXJuLT5pc1N0YXRpYygpKSB7CiAgICAgIHBhdHRlcm4tPmdldENvbG9yKHgsIHksIHBpcGUtPmNTcmNWYWwpOwogICAgfSBlbHNlIHsKICAgICAgcGlwZS0+cGF0dGVybiA9IHBhdHRlcm47CiAgICB9CiAgICBwaXBlLT5jU3JjID0gcGlwZS0+Y1NyY1ZhbDsKICB9IGVsc2UgewogICAgcGlwZS0+Y1NyYyA9IGNTcmM7CiAgfQoKICAvLyBzb3VyY2UgYWxwaGEKICBwaXBlLT5hSW5wdXQgPSBhSW5wdXQ7CiAgaWYgKCFzdGF0ZS0+c29mdE1hc2spIHsKICAgIGlmICh1c2VzU2hhcGUpIHsKICAgICAgcGlwZS0+YUlucHV0ICo9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHBpcGUtPmFTcmMgPSAoR3VjaGFyKXNwbGFzaFJvdW5kKHBpcGUtPmFJbnB1dCAqIDI1NSk7CiAgICB9CiAgfQogIHBpcGUtPnVzZXNTaGFwZSA9IHVzZXNTaGFwZTsKCiAgLy8gcmVzdWx0IGFscGhhCiAgaWYgKGFJbnB1dCA9PSAxICYmICFzdGF0ZS0+c29mdE1hc2sgJiYgIXVzZXNTaGFwZSAmJgogICAgICAhc3RhdGUtPmluTm9uSXNvbGF0ZWRHcm91cCkgewogICAgcGlwZS0+bm9UcmFuc3BhcmVuY3kgPSBnVHJ1ZTsKICB9IGVsc2UgewogICAgcGlwZS0+bm9UcmFuc3BhcmVuY3kgPSBnRmFsc2U7CiAgfQoKICAvLyByZXN1bHQgY29sb3IKICBpZiAocGlwZS0+bm9UcmFuc3BhcmVuY3kpIHsKICAgIC8vIHRoZSAhc3RhdGUtPmJsZW5kRnVuYyBjYXNlIGlzIGhhbmRsZWQgc2VwYXJhdGVseSBpbiBwaXBlUnVuCiAgICBwaXBlLT5yZXN1bHRDb2xvckN0cmwgPSBwaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRbYml0bWFwLT5tb2RlXTsKICB9IGVsc2UgaWYgKCFzdGF0ZS0+YmxlbmRGdW5jKSB7CiAgICBwaXBlLT5yZXN1bHRDb2xvckN0cmwgPSBwaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRbYml0bWFwLT5tb2RlXTsKICB9IGVsc2UgewogICAgcGlwZS0+cmVzdWx0Q29sb3JDdHJsID0gcGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFtiaXRtYXAtPm1vZGVdOwogIH0KCiAgLy8gbm9uLWlzb2xhdGVkIGdyb3VwIGNvcnJlY3Rpb24KICBpZiAobm9uSXNvbGF0ZWRHcm91cCkgewogICAgcGlwZS0+bm9uSXNvbGF0ZWRHcm91cCA9IHNwbGFzaENvbG9yTW9kZU5Db21wc1tiaXRtYXAtPm1vZGVdOwogIH0gZWxzZSB7CiAgICBwaXBlLT5ub25Jc29sYXRlZEdyb3VwID0gMDsKICB9Cn0KCmlubGluZSB2b2lkIFNwbGFzaDo6cGlwZVJ1bihTcGxhc2hQaXBlICpwaXBlKSB7CiAgR3VjaGFyIGFTcmMsIGFEZXN0LCBhbHBoYTIsIGFscGhhMCwgYVJlc3VsdDsKICBTcGxhc2hDb2xvciBjRGVzdCwgY0JsZW5kOwogIEd1Y2hhciBjUmVzdWx0MCwgY1Jlc3VsdDEsIGNSZXN1bHQyLCBjUmVzdWx0MzsKCiAgLy8tLS0tLSBzb3VyY2UgY29sb3IKCiAgLy8gc3RhdGljIHBhdHRlcm46IGhhbmRsZWQgaW4gcGlwZUluaXQKICAvLyBmaXhlZCBjb2xvcjogaGFuZGxlZCBpbiBwaXBlSW5pdAoKICAvLyBkeW5hbWljIHBhdHRlcm4KICBpZiAocGlwZS0+cGF0dGVybikgewogICAgaWYgKCFwaXBlLT5wYXR0ZXJuLT5nZXRDb2xvcihwaXBlLT54LCBwaXBlLT55LCBwaXBlLT5jU3JjVmFsKSkgewoJCXBpcGVJbmNYKHBpcGUpOwoJCXJldHVybjsKICAgIH0KICB9CgogIGlmIChwaXBlLT5ub1RyYW5zcGFyZW5jeSAmJiAhc3RhdGUtPmJsZW5kRnVuYykgewoKICAgIC8vLS0tLS0gd3JpdGUgZGVzdGluYXRpb24gcGl4ZWwKCiAgICBzd2l0Y2ggKGJpdG1hcC0+bW9kZSkgewogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICAgIGNSZXN1bHQwID0gcGlwZS0+Y1NyY1swXTsKICAgICAgaWYgKHN0YXRlLT5zY3JlZW4tPnRlc3QocGlwZS0+eCwgcGlwZS0+eSwgY1Jlc3VsdDApKSB7CgkqcGlwZS0+ZGVzdENvbG9yUHRyIHw9IHBpcGUtPmRlc3RDb2xvck1hc2s7CiAgICAgIH0gZWxzZSB7CgkqcGlwZS0+ZGVzdENvbG9yUHRyICY9IH5waXBlLT5kZXN0Q29sb3JNYXNrOwogICAgICB9CiAgICAgIGlmICghKHBpcGUtPmRlc3RDb2xvck1hc2sgPj49IDEpKSB7CglwaXBlLT5kZXN0Q29sb3JNYXNrID0gMHg4MDsKCSsrcGlwZS0+ZGVzdENvbG9yUHRyOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMF07CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1swXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1sxXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1syXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1syXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1sxXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1swXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gMjU1OwogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMl07CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMV07CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMF07CiAgICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzBdOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzFdOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzJdOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzNdOwogICAgICBicmVhazsKI2VuZGlmCiAgICB9CiAgICBpZiAocGlwZS0+ZGVzdEFscGhhUHRyKSB7CiAgICAgICpwaXBlLT5kZXN0QWxwaGFQdHIrKyA9IDI1NTsKICAgIH0KCiAgfSBlbHNlIHsKCiAgICAvLy0tLS0tIHJlYWQgZGVzdGluYXRpb24gcGl4ZWwKCiAgICBzd2l0Y2ggKGJpdG1hcC0+bW9kZSkgewogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICAgIGNEZXN0WzBdID0gKCpwaXBlLT5kZXN0Q29sb3JQdHIgJiBwaXBlLT5kZXN0Q29sb3JNYXNrKSA/IDB4ZmYgOiAweDAwOwogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgICBjRGVzdFswXSA9ICpwaXBlLT5kZXN0Q29sb3JQdHI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgY0Rlc3RbMF0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMF07CiAgICAgIGNEZXN0WzFdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzFdOwogICAgICBjRGVzdFsyXSA9IHBpcGUtPmRlc3RDb2xvclB0clsyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgICAgY0Rlc3RbMF0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMl07CiAgICAgIGNEZXN0WzFdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzFdOwogICAgICBjRGVzdFsyXSA9IHBpcGUtPmRlc3RDb2xvclB0clswXTsKICAgICAgY0Rlc3RbM10gPSAyNTU7CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgICAgY0Rlc3RbMF0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMl07CiAgICAgIGNEZXN0WzFdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzFdOwogICAgICBjRGVzdFsyXSA9IHBpcGUtPmRlc3RDb2xvclB0clswXTsKICAgICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogICAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICAgIGNEZXN0WzBdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzBdOwogICAgICBjRGVzdFsxXSA9IHBpcGUtPmRlc3RDb2xvclB0clsxXTsKICAgICAgY0Rlc3RbMl0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMl07CiAgICAgIGNEZXN0WzNdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzNdOwogICAgICBicmVhazsKI2VuZGlmCiAgICB9CiAgICBpZiAocGlwZS0+ZGVzdEFscGhhUHRyKSB7CiAgICAgIGFEZXN0ID0gKnBpcGUtPmRlc3RBbHBoYVB0cjsKICAgIH0gZWxzZSB7CiAgICAgIGFEZXN0ID0gMHhmZjsKICAgIH0KCiAgICAvLy0tLS0tIGJsZW5kIGZ1bmN0aW9uCgogICAgaWYgKHN0YXRlLT5ibGVuZEZ1bmMpIHsKICAgICAgKCpzdGF0ZS0+YmxlbmRGdW5jKShwaXBlLT5jU3JjLCBjRGVzdCwgY0JsZW5kLCBiaXRtYXAtPm1vZGUpOwogICAgfQoKICAgIC8vLS0tLS0gc291cmNlIGFscGhhCgogICAgaWYgKHN0YXRlLT5zb2Z0TWFzaykgewogICAgICBpZiAocGlwZS0+dXNlc1NoYXBlKSB7CglhU3JjID0gKEd1Y2hhcilzcGxhc2hSb3VuZChwaXBlLT5hSW5wdXQgKiAqcGlwZS0+c29mdE1hc2tQdHIrKwoJCQkJICAgKiBwaXBlLT5zaGFwZSk7CiAgICAgIH0gZWxzZSB7CglhU3JjID0gKEd1Y2hhcilzcGxhc2hSb3VuZChwaXBlLT5hSW5wdXQgKiAqcGlwZS0+c29mdE1hc2tQdHIrKyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGlwZS0+dXNlc1NoYXBlKSB7CiAgICAgIC8vIHBpcGUtPmFJbnB1dCBpcyBwcmVtdWx0aXBsaWVkIGJ5IDI1NSBpbiBwaXBlSW5pdAogICAgICBhU3JjID0gKEd1Y2hhcilzcGxhc2hSb3VuZChwaXBlLT5hSW5wdXQgKiBwaXBlLT5zaGFwZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBwcmVjb21wdXRlZCBpbiBwaXBlSW5pdAogICAgICBhU3JjID0gcGlwZS0+YVNyYzsKICAgIH0KCiAgICAvLy0tLS0tIHJlc3VsdCBhbHBoYSBhbmQgbm9uLWlzb2xhdGVkIGdyb3VwIGVsZW1lbnQgY29ycmVjdGlvbgoKICAgIGlmIChwaXBlLT5ub1RyYW5zcGFyZW5jeSkgewogICAgICBhbHBoYTIgPSBhUmVzdWx0ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgYVJlc3VsdCA9IGFTcmMgKyBhRGVzdCAtIGRpdjI1NShhU3JjICogYURlc3QpOwoKICAgICAgaWYgKHBpcGUtPmFscGhhMFB0cikgewoJYWxwaGEwID0gKnBpcGUtPmFscGhhMFB0cisrOwoJYWxwaGEyID0gYVJlc3VsdCArIGFscGhhMCAtIGRpdjI1NShhUmVzdWx0ICogYWxwaGEwKTsKICAgICAgfSBlbHNlIHsKCWFscGhhMiA9IGFSZXN1bHQ7CiAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0tIHJlc3VsdCBjb2xvcgoKICAgIGNSZXN1bHQwID0gY1Jlc3VsdDEgPSBjUmVzdWx0MiA9IGNSZXN1bHQzID0gMDsgLy8gbWFrZSBnY2MgaGFwcHkKCiAgICBzd2l0Y2ggKHBpcGUtPnJlc3VsdENvbG9yQ3RybCkgewoKI2lmIFNQTEFTSF9DTVlLCiAgICBjYXNlIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZENNWUs6CiAgICAgIGNSZXN1bHQzID0gZGl2MjU1KCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzNdICsgYURlc3QgKiBjQmxlbmRbM10pOwojZW5kaWYKICAgIGNhc2Ugc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kUkdCOgogICAgICBjUmVzdWx0MiA9IGRpdjI1NSgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1syXSArIGFEZXN0ICogY0JsZW5kWzJdKTsKICAgICAgY1Jlc3VsdDEgPSBkaXYyNTUoKDI1NSAtIGFEZXN0KSAqIHBpcGUtPmNTcmNbMV0gKyBhRGVzdCAqIGNCbGVuZFsxXSk7CiAgICBjYXNlIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZE1vbm86CiAgICAgIGNSZXN1bHQwID0gZGl2MjU1KCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzBdICsgYURlc3QgKiBjQmxlbmRbMF0pOwogICAgICBicmVhazsKCiAgICBjYXNlIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm86CiAgICAgIGlmIChhbHBoYTIgPT0gMCkgewoJY1Jlc3VsdDAgPSAwOwogICAgICB9IGVsc2UgewoJY1Jlc3VsdDAgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMF0gKwoJCQkgICAgIGFTcmMgKiBwaXBlLT5jU3JjWzBdKSAvIGFscGhhMik7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFJHQjoKICAgICAgaWYgKGFscGhhMiA9PSAwKSB7CgljUmVzdWx0MCA9IDA7CgljUmVzdWx0MSA9IDA7CgljUmVzdWx0MiA9IDA7CiAgICAgIH0gZWxzZSB7CgljUmVzdWx0MCA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFswXSArCgkJCSAgICAgYVNyYyAqIHBpcGUtPmNTcmNbMF0pIC8gYWxwaGEyKTsKCWNSZXN1bHQxID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzFdICsKCQkJICAgICBhU3JjICogcGlwZS0+Y1NyY1sxXSkgLyBhbHBoYTIpOwoJY1Jlc3VsdDIgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMl0gKwoJCQkgICAgIGFTcmMgKiBwaXBlLT5jU3JjWzJdKSAvIGFscGhhMik7CiAgICAgIH0KICAgICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLOgogICAgICBpZiAoYWxwaGEyID09IDApIHsKCWNSZXN1bHQwID0gMDsKCWNSZXN1bHQxID0gMDsKCWNSZXN1bHQyID0gMDsKCWNSZXN1bHQzID0gMDsKICAgICAgfSBlbHNlIHsKCWNSZXN1bHQwID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzBdICsKCQkJICAgICBhU3JjICogcGlwZS0+Y1NyY1swXSkgLyBhbHBoYTIpOwoJY1Jlc3VsdDEgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMV0gKwoJCQkgICAgIGFTcmMgKiBwaXBlLT5jU3JjWzFdKSAvIGFscGhhMik7CgljUmVzdWx0MiA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFsyXSArCgkJCSAgICAgYVNyYyAqIHBpcGUtPmNTcmNbMl0pIC8gYWxwaGEyKTsKCWNSZXN1bHQzID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzNdICsKCQkJICAgICBhU3JjICogcGlwZS0+Y1NyY1szXSkgLyBhbHBoYTIpOwogICAgICB9CiAgICAgIGJyZWFrOwojZW5kaWYKCiAgICBjYXNlIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vOgogICAgICBpZiAoYWxwaGEyID09IDApIHsKCWNSZXN1bHQwID0gMDsKICAgICAgfSBlbHNlIHsKCWNSZXN1bHQwID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzBdICsKCQkJICAgICBhU3JjICogKCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzBdICsKCQkJCSAgICAgYURlc3QgKiBjQmxlbmRbMF0pIC8gMjU1KSAvCgkJCSAgICBhbHBoYTIpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kUkdCOgogICAgICBpZiAoYWxwaGEyID09IDApIHsKCWNSZXN1bHQwID0gMDsKCWNSZXN1bHQxID0gMDsKCWNSZXN1bHQyID0gMDsKICAgICAgfSBlbHNlIHsKCWNSZXN1bHQwID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzBdICsKCQkJICAgICBhU3JjICogKCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzBdICsKCQkJCSAgICAgYURlc3QgKiBjQmxlbmRbMF0pIC8gMjU1KSAvCgkJCSAgICBhbHBoYTIpOwoJY1Jlc3VsdDEgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMV0gKwoJCQkgICAgIGFTcmMgKiAoKDI1NSAtIGFEZXN0KSAqIHBpcGUtPmNTcmNbMV0gKwoJCQkJICAgICBhRGVzdCAqIGNCbGVuZFsxXSkgLyAyNTUpIC8KCQkJICAgIGFscGhhMik7CgljUmVzdWx0MiA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFsyXSArCgkJCSAgICAgYVNyYyAqICgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1syXSArCgkJCQkgICAgIGFEZXN0ICogY0JsZW5kWzJdKSAvIDI1NSkgLwoJCQkgICAgYWxwaGEyKTsKICAgICAgfQogICAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgICBjYXNlIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLOgogICAgICBpZiAoYWxwaGEyID09IDApIHsKCWNSZXN1bHQwID0gMDsKCWNSZXN1bHQxID0gMDsKCWNSZXN1bHQyID0gMDsKCWNSZXN1bHQzID0gMDsKICAgICAgfSBlbHNlIHsKCWNSZXN1bHQwID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzBdICsKCQkJICAgICBhU3JjICogKCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzBdICsKCQkJCSAgICAgYURlc3QgKiBjQmxlbmRbMF0pIC8gMjU1KSAvCgkJCSAgICBhbHBoYTIpOwoJY1Jlc3VsdDEgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMV0gKwoJCQkgICAgIGFTcmMgKiAoKDI1NSAtIGFEZXN0KSAqIHBpcGUtPmNTcmNbMV0gKwoJCQkJICAgICBhRGVzdCAqIGNCbGVuZFsxXSkgLyAyNTUpIC8KCQkJICAgIGFscGhhMik7CgljUmVzdWx0MiA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFsyXSArCgkJCSAgICAgYVNyYyAqICgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1syXSArCgkJCQkgICAgIGFEZXN0ICogY0JsZW5kWzJdKSAvIDI1NSkgLwoJCQkgICAgYWxwaGEyKTsKCWNSZXN1bHQzID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzNdICsKCQkJICAgICBhU3JjICogKCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzNdICsKCQkJCSAgICAgYURlc3QgKiBjQmxlbmRbM10pIC8gMjU1KSAvCgkJCSAgICBhbHBoYTIpOwogICAgICB9CiAgICAgIGJyZWFrOwojZW5kaWYKICAgIH0KCiAgICAvLy0tLS0tIG5vbi1pc29sYXRlZCBncm91cCBjb3JyZWN0aW9uCgogICAgaWYgKGFSZXN1bHQgIT0gMCkgewogICAgICBzd2l0Y2ggKHBpcGUtPm5vbklzb2xhdGVkR3JvdXApIHsKI2lmIFNQTEFTSF9DTVlLCiAgICAgIGNhc2UgNDoKCWNSZXN1bHQzICs9IChjUmVzdWx0MyAtIGNEZXN0WzNdKSAqIGFEZXN0ICoKCSAgICAgICAgICAgICgyNTUgLSBhUmVzdWx0KSAvICgyNTUgKiBhUmVzdWx0KTsKI2VuZGlmCiAgICAgIGNhc2UgMzoKCWNSZXN1bHQyICs9IChjUmVzdWx0MiAtIGNEZXN0WzJdKSAqIGFEZXN0ICoKCSAgICAgICAgICAgICgyNTUgLSBhUmVzdWx0KSAvICgyNTUgKiBhUmVzdWx0KTsKCWNSZXN1bHQxICs9IChjUmVzdWx0MSAtIGNEZXN0WzFdKSAqIGFEZXN0ICoKCSAgICAgICAgICAgICgyNTUgLSBhUmVzdWx0KSAvICgyNTUgKiBhUmVzdWx0KTsKICAgICAgY2FzZSAxOgoJY1Jlc3VsdDAgKz0gKGNSZXN1bHQwIC0gY0Rlc3RbMF0pICogYURlc3QgKgoJICAgICAgICAgICAgKDI1NSAtIGFSZXN1bHQpIC8gKDI1NSAqIGFSZXN1bHQpOwogICAgICBjYXNlIDA6CglicmVhazsKICAgICAgfQogICAgfQoKICAgIC8vLS0tLS0gd3JpdGUgZGVzdGluYXRpb24gcGl4ZWwKCiAgICBzd2l0Y2ggKGJpdG1hcC0+bW9kZSkgewogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICAgIGlmIChzdGF0ZS0+c2NyZWVuLT50ZXN0KHBpcGUtPngsIHBpcGUtPnksIGNSZXN1bHQwKSkgewoJKnBpcGUtPmRlc3RDb2xvclB0ciB8PSBwaXBlLT5kZXN0Q29sb3JNYXNrOwogICAgICB9IGVsc2UgewoJKnBpcGUtPmRlc3RDb2xvclB0ciAmPSB+cGlwZS0+ZGVzdENvbG9yTWFzazsKICAgICAgfQogICAgICBpZiAoIShwaXBlLT5kZXN0Q29sb3JNYXNrID4+PSAxKSkgewoJcGlwZS0+ZGVzdENvbG9yTWFzayA9IDB4ODA7CgkrK3BpcGUtPmRlc3RDb2xvclB0cjsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MDsKICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MDsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDE7CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQyOwogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MjsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDE7CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQwOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSAyNTU7CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDI7CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQxOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MDsKICAgICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogICAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQwOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDI7CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQzOwogICAgICBicmVhazsKI2VuZGlmCiAgICB9CiAgICBpZiAocGlwZS0+ZGVzdEFscGhhUHRyKSB7CiAgICAgICpwaXBlLT5kZXN0QWxwaGFQdHIrKyA9IGFSZXN1bHQ7CiAgICB9CgogIH0KCiAgKytwaXBlLT54Owp9CgppbmxpbmUgdm9pZCBTcGxhc2g6OnBpcGVTZXRYWShTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHkpIHsKICBwaXBlLT54ID0geDsKICBwaXBlLT55ID0geTsKICBpZiAoc3RhdGUtPnNvZnRNYXNrKSB7CiAgICBwaXBlLT5zb2Z0TWFza1B0ciA9CiAgICAgICAgJnN0YXRlLT5zb2Z0TWFzay0+ZGF0YVt5ICogc3RhdGUtPnNvZnRNYXNrLT5yb3dTaXplICsgeF07CiAgfQogIHN3aXRjaCAoYml0bWFwLT5tb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBwaXBlLT5kZXN0Q29sb3JQdHIgPSAmYml0bWFwLT5kYXRhW3kgKiBiaXRtYXAtPnJvd1NpemUgKyAoeCA+PiAzKV07CiAgICBwaXBlLT5kZXN0Q29sb3JNYXNrID0gMHg4MCA+PiAoeCAmIDcpOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBwaXBlLT5kZXN0Q29sb3JQdHIgPSAmYml0bWFwLT5kYXRhW3kgKiBiaXRtYXAtPnJvd1NpemUgKyB4XTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIHBpcGUtPmRlc3RDb2xvclB0ciA9ICZiaXRtYXAtPmRhdGFbeSAqIGJpdG1hcC0+cm93U2l6ZSArIDMgKiB4XTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgcGlwZS0+ZGVzdENvbG9yUHRyID0gJmJpdG1hcC0+ZGF0YVt5ICogYml0bWFwLT5yb3dTaXplICsgNCAqIHhdOwogICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgcGlwZS0+ZGVzdENvbG9yUHRyID0gJmJpdG1hcC0+ZGF0YVt5ICogYml0bWFwLT5yb3dTaXplICsgNCAqIHhdOwogICAgYnJlYWs7CiNlbmRpZgogIH0KICBpZiAoYml0bWFwLT5hbHBoYSkgewogICAgcGlwZS0+ZGVzdEFscGhhUHRyID0gJmJpdG1hcC0+YWxwaGFbeSAqIGJpdG1hcC0+d2lkdGggKyB4XTsKICB9IGVsc2UgewogICAgcGlwZS0+ZGVzdEFscGhhUHRyID0gTlVMTDsKICB9CiAgaWYgKHN0YXRlLT5pbk5vbklzb2xhdGVkR3JvdXAgJiYgYWxwaGEwQml0bWFwLT5hbHBoYSkgewogICAgcGlwZS0+YWxwaGEwUHRyID0KICAgICAgICAmYWxwaGEwQml0bWFwLT5hbHBoYVsoYWxwaGEwWSArIHkpICogYWxwaGEwQml0bWFwLT53aWR0aCArCgkJCSAgICAgKGFscGhhMFggKyB4KV07CiAgfSBlbHNlIHsKICAgIHBpcGUtPmFscGhhMFB0ciA9IE5VTEw7CiAgfQp9CgppbmxpbmUgdm9pZCBTcGxhc2g6OnBpcGVJbmNYKFNwbGFzaFBpcGUgKnBpcGUpIHsKICArK3BpcGUtPng7CiAgaWYgKHN0YXRlLT5zb2Z0TWFzaykgewogICAgKytwaXBlLT5zb2Z0TWFza1B0cjsKICB9CiAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICAgIGlmICghKHBpcGUtPmRlc3RDb2xvck1hc2sgPj49IDEpKSB7CiAgICAgIHBpcGUtPmRlc3RDb2xvck1hc2sgPSAweDgwOwogICAgICArK3BpcGUtPmRlc3RDb2xvclB0cjsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgKytwaXBlLT5kZXN0Q29sb3JQdHI7CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBwaXBlLT5kZXN0Q29sb3JQdHIgKz0gMzsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgcGlwZS0+ZGVzdENvbG9yUHRyICs9IDQ7CiAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICBwaXBlLT5kZXN0Q29sb3JQdHIgKz0gNDsKICAgIGJyZWFrOwojZW5kaWYKICB9CiAgaWYgKHBpcGUtPmRlc3RBbHBoYVB0cikgewogICAgKytwaXBlLT5kZXN0QWxwaGFQdHI7CiAgfQogIGlmIChwaXBlLT5hbHBoYTBQdHIpIHsKICAgICsrcGlwZS0+YWxwaGEwUHRyOwogIH0KfQoKaW5saW5lIHZvaWQgU3BsYXNoOjpkcmF3UGl4ZWwoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LCBHQm9vbCBub0NsaXApIHsKICBpZiAodW5saWtlbHkoeSA8IDApKQogICAgcmV0dXJuOwoKICBpZiAobm9DbGlwIHx8IHN0YXRlLT5jbGlwLT50ZXN0KHgsIHkpKSB7CiAgICBwaXBlU2V0WFkocGlwZSwgeCwgeSk7CiAgICBwaXBlUnVuKHBpcGUpOwogICAgdXBkYXRlTW9kWCh4KTsKICAgIHVwZGF0ZU1vZFkoeSk7CiAgfQp9CgppbmxpbmUgdm9pZCBTcGxhc2g6OmRyYXdBQVBpeGVsSW5pdCgpIHsKICBhYUJ1ZlkgPSAtMTsKfQoKaW5saW5lIHZvaWQgU3BsYXNoOjpkcmF3QUFQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHkpIHsKI2lmIHNwbGFzaEFBU2l6ZSA9PSA0CiAgc3RhdGljIGludCBiaXRDb3VudDRbMTZdID0geyAwLCAxLCAxLCAyLCAxLCAyLCAyLCAzLAoJCQkgICAgICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCB9OwogIGludCB3OwojZWxzZQogIGludCB4eCwgeXk7CiNlbmRpZgogIFNwbGFzaENvbG9yUHRyIHA7CiAgaW50IHgwLCB4MSwgdDsKCiAgaWYgKHggPCAwIHx8IHggPj0gYml0bWFwLT53aWR0aCB8fAogICAgICB5IDwgc3RhdGUtPmNsaXAtPmdldFlNaW5JKCkgfHwgeSA+IHN0YXRlLT5jbGlwLT5nZXRZTWF4SSgpKSB7CiAgICByZXR1cm47CiAgfQoKICAvLyB1cGRhdGUgYWFCdWYKICBpZiAoeSAhPSBhYUJ1ZlkpIHsKICAgIG1lbXNldChhYUJ1Zi0+Z2V0RGF0YVB0cigpLCAweGZmLAoJICAgYWFCdWYtPmdldFJvd1NpemUoKSAqIGFhQnVmLT5nZXRIZWlnaHQoKSk7CiAgICB4MCA9IDA7CiAgICB4MSA9IGJpdG1hcC0+d2lkdGggLSAxOwogICAgc3RhdGUtPmNsaXAtPmNsaXBBQUxpbmUoYWFCdWYsICZ4MCwgJngxLCB5KTsKICAgIGFhQnVmWSA9IHk7CiAgfQoKICAvLyBjb21wdXRlIHRoZSBzaGFwZSB2YWx1ZQojaWYgc3BsYXNoQUFTaXplID09IDQKICBwID0gYWFCdWYtPmdldERhdGFQdHIoKSArICh4ID4+IDEpOwogIHcgPSBhYUJ1Zi0+Z2V0Um93U2l6ZSgpOwogIGlmICh4ICYgMSkgewogICAgdCA9IGJpdENvdW50NFsqcCAmIDB4MGZdICsgYml0Q291bnQ0W3Bbd10gJiAweDBmXSArCiAgICAgICAgYml0Q291bnQ0W3BbMip3XSAmIDB4MGZdICsgYml0Q291bnQ0W3BbMyp3XSAmIDB4MGZdOwogIH0gZWxzZSB7CiAgICB0ID0gYml0Q291bnQ0WypwID4+IDRdICsgYml0Q291bnQ0W3Bbd10gPj4gNF0gKwogICAgICAgIGJpdENvdW50NFtwWzIqd10gPj4gNF0gKyBiaXRDb3VudDRbcFszKnddID4+IDRdOwogIH0KI2Vsc2UKICB0ID0gMDsKICBmb3IgKHl5ID0gMDsgeXkgPCBzcGxhc2hBQVNpemU7ICsreXkpIHsKICAgIGZvciAoeHggPSAwOyB4eCA8IHNwbGFzaEFBU2l6ZTsgKyt4eCkgewogICAgICBwID0gYWFCdWYtPmdldERhdGFQdHIoKSArIHl5ICogYWFCdWYtPmdldFJvd1NpemUoKSArCgkgICgoeCAqIHNwbGFzaEFBU2l6ZSArIHh4KSA+PiAzKTsKICAgICAgdCArPSAoKnAgPj4gKDcgLSAoKHggKiBzcGxhc2hBQVNpemUgKyB4eCkgJiA3KSkpICYgMTsKICAgIH0KICB9CiNlbmRpZgoKICAvLyBkcmF3IHRoZSBwaXhlbAogIGlmICh0ICE9IDApIHsKICAgIHBpcGVTZXRYWShwaXBlLCB4LCB5KTsKICAgIHBpcGUtPnNoYXBlICo9IGFhR2FtbWFbdF07CiAgICBwaXBlUnVuKHBpcGUpOwogICAgdXBkYXRlTW9kWCh4KTsKICAgIHVwZGF0ZU1vZFkoeSk7CiAgfQp9CgppbmxpbmUgdm9pZCBTcGxhc2g6OmRyYXdTcGFuKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSwKCQkJICAgICBHQm9vbCBub0NsaXApIHsKICBpbnQgeDsKCiAgcGlwZVNldFhZKHBpcGUsIHgwLCB5KTsKICBpZiAobm9DbGlwKSB7CiAgICBmb3IgKHggPSB4MDsgeCA8PSB4MTsgKyt4KSB7CiAgICAgIHBpcGVSdW4ocGlwZSk7CiAgICB9CiAgICB1cGRhdGVNb2RYKHgwKTsKICAgIHVwZGF0ZU1vZFgoeDEpOwogICAgdXBkYXRlTW9kWSh5KTsKICB9IGVsc2UgewogICAgZm9yICh4ID0geDA7IHggPD0geDE7ICsreCkgewogICAgICBpZiAoc3RhdGUtPmNsaXAtPnRlc3QoeCwgeSkpIHsKCXBpcGVSdW4ocGlwZSk7Cgl1cGRhdGVNb2RYKHgpOwoJdXBkYXRlTW9kWSh5KTsKICAgICAgfSBlbHNlIHsKCXBpcGVJbmNYKHBpcGUpOwogICAgICB9CiAgICB9CiAgfQp9CgppbmxpbmUgdm9pZCBTcGxhc2g6OmRyYXdBQUxpbmUoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgwLCBpbnQgeDEsIGludCB5KSB7CiNpZiBzcGxhc2hBQVNpemUgPT0gNAogIHN0YXRpYyBpbnQgYml0Q291bnQ0WzE2XSA9IHsgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywKCQkJICAgICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQgfTsKICBTcGxhc2hDb2xvclB0ciBwMCwgcDEsIHAyLCBwMzsKICBpbnQgdDsKI2Vsc2UKICBTcGxhc2hDb2xvclB0ciBwOwogIGludCB4eCwgeXksIHQ7CiNlbmRpZgogIGludCB4OwoKI2lmIHNwbGFzaEFBU2l6ZSA9PSA0CiAgcDAgPSBhYUJ1Zi0+Z2V0RGF0YVB0cigpICsgKHgwID4+IDEpOwogIHAxID0gcDAgKyBhYUJ1Zi0+Z2V0Um93U2l6ZSgpOwogIHAyID0gcDEgKyBhYUJ1Zi0+Z2V0Um93U2l6ZSgpOwogIHAzID0gcDIgKyBhYUJ1Zi0+Z2V0Um93U2l6ZSgpOwojZW5kaWYKICBwaXBlU2V0WFkocGlwZSwgeDAsIHkpOwogIGZvciAoeCA9IHgwOyB4IDw9IHgxOyArK3gpIHsKCiAgICAvLyBjb21wdXRlIHRoZSBzaGFwZSB2YWx1ZQojaWYgc3BsYXNoQUFTaXplID09IDQKICAgIGlmICh4ICYgMSkgewogICAgICB0ID0gYml0Q291bnQ0WypwMCAmIDB4MGZdICsgYml0Q291bnQ0WypwMSAmIDB4MGZdICsKCSAgYml0Q291bnQ0WypwMiAmIDB4MGZdICsgYml0Q291bnQ0WypwMyAmIDB4MGZdOwogICAgICArK3AwOyArK3AxOyArK3AyOyArK3AzOwogICAgfSBlbHNlIHsKICAgICAgdCA9IGJpdENvdW50NFsqcDAgPj4gNF0gKyBiaXRDb3VudDRbKnAxID4+IDRdICsKCSAgYml0Q291bnQ0WypwMiA+PiA0XSArIGJpdENvdW50NFsqcDMgPj4gNF07CiAgICB9CiNlbHNlCiAgICB0ID0gMDsKICAgIGZvciAoeXkgPSAwOyB5eSA8IHNwbGFzaEFBU2l6ZTsgKyt5eSkgewogICAgICBmb3IgKHh4ID0gMDsgeHggPCBzcGxhc2hBQVNpemU7ICsreHgpIHsKCXAgPSBhYUJ1Zi0+Z2V0RGF0YVB0cigpICsgeXkgKiBhYUJ1Zi0+Z2V0Um93U2l6ZSgpICsKCSAgICAoKHggKiBzcGxhc2hBQVNpemUgKyB4eCkgPj4gMyk7Cgl0ICs9ICgqcCA+PiAoNyAtICgoeCAqIHNwbGFzaEFBU2l6ZSArIHh4KSAmIDcpKSkgJiAxOwogICAgICB9CiAgICB9CiNlbmRpZgoKICAgIGlmICh0ICE9IDApIHsKICAgICAgcGlwZS0+c2hhcGUgPSBhYUdhbW1hW3RdOwogICAgICBwaXBlUnVuKHBpcGUpOwogICAgICB1cGRhdGVNb2RYKHgpOwogICAgICB1cGRhdGVNb2RZKHkpOwogICAgfSBlbHNlIHsKICAgICAgcGlwZUluY1gocGlwZSk7CiAgICB9CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gVHJhbnNmb3JtIGEgcG9pbnQgZnJvbSB1c2VyIHNwYWNlIHRvIGRldmljZSBzcGFjZS4KaW5saW5lIHZvaWQgU3BsYXNoOjp0cmFuc2Zvcm0oU3BsYXNoQ29vcmQgKm1hdHJpeCwKCQkJICAgICAgU3BsYXNoQ29vcmQgeGksIFNwbGFzaENvb3JkIHlpLAoJCQkgICAgICBTcGxhc2hDb29yZCAqeG8sIFNwbGFzaENvb3JkICp5bykgewogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBbIG1bMF0gbVsxXSAwIF0KICAvLyBbeG8geW8gMV0gPSBbeGkgeWkgMV0gKiAgWyBtWzJdIG1bM10gMCBdCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFsgbVs0XSBtWzVdIDEgXQogICp4byA9IHhpICogbWF0cml4WzBdICsgeWkgKiBtYXRyaXhbMl0gKyBtYXRyaXhbNF07CiAgKnlvID0geGkgKiBtYXRyaXhbMV0gKyB5aSAqIG1hdHJpeFszXSArIG1hdHJpeFs1XTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTcGxhc2g6OlNwbGFzaChTcGxhc2hCaXRtYXAgKmJpdG1hcEEsIEdCb29sIHZlY3RvckFudGlhbGlhc0EsCgkgICAgICAgU3BsYXNoU2NyZWVuUGFyYW1zICpzY3JlZW5QYXJhbXMpIHsKICBpbnQgaTsKCiAgYml0bWFwID0gYml0bWFwQTsKICB2ZWN0b3JBbnRpYWxpYXMgPSB2ZWN0b3JBbnRpYWxpYXNBOwogIHN0YXRlID0gbmV3IFNwbGFzaFN0YXRlKGJpdG1hcC0+d2lkdGgsIGJpdG1hcC0+aGVpZ2h0LCB2ZWN0b3JBbnRpYWxpYXMsCgkJCSAgc2NyZWVuUGFyYW1zKTsKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBhYUJ1ZiA9IG5ldyBTcGxhc2hCaXRtYXAoc3BsYXNoQUFTaXplICogYml0bWFwLT53aWR0aCwgc3BsYXNoQUFTaXplLAoJCQkgICAgIDEsIHNwbGFzaE1vZGVNb25vMSwgZ0ZhbHNlKTsKICAgIGZvciAoaSA9IDA7IGkgPD0gc3BsYXNoQUFTaXplICogc3BsYXNoQUFTaXplOyArK2kpIHsKICAgICAgYWFHYW1tYVtpXSA9IHNwbGFzaFBvdygoU3BsYXNoQ29vcmQpaSAvCgkJCSAgICAgICAoU3BsYXNoQ29vcmQpKHNwbGFzaEFBU2l6ZSAqIHNwbGFzaEFBU2l6ZSksCgkJCSAgICAgMS41KTsKICAgIH0KICB9IGVsc2UgewogICAgYWFCdWYgPSBOVUxMOwogIH0KICBjbGVhck1vZFJlZ2lvbigpOwogIGRlYnVnTW9kZSA9IGdGYWxzZTsKfQoKU3BsYXNoOjpTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJICAgICAgIFNwbGFzaFNjcmVlbiAqc2NyZWVuQSkgewogIGludCBpOwoKICBiaXRtYXAgPSBiaXRtYXBBOwogIHZlY3RvckFudGlhbGlhcyA9IHZlY3RvckFudGlhbGlhc0E7CiAgc3RhdGUgPSBuZXcgU3BsYXNoU3RhdGUoYml0bWFwLT53aWR0aCwgYml0bWFwLT5oZWlnaHQsIHZlY3RvckFudGlhbGlhcywKCQkJICBzY3JlZW5BKTsKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBhYUJ1ZiA9IG5ldyBTcGxhc2hCaXRtYXAoc3BsYXNoQUFTaXplICogYml0bWFwLT53aWR0aCwgc3BsYXNoQUFTaXplLAoJCQkgICAgIDEsIHNwbGFzaE1vZGVNb25vMSwgZ0ZhbHNlKTsKICAgIGZvciAoaSA9IDA7IGkgPD0gc3BsYXNoQUFTaXplICogc3BsYXNoQUFTaXplOyArK2kpIHsKICAgICAgYWFHYW1tYVtpXSA9IHNwbGFzaFBvdygoU3BsYXNoQ29vcmQpaSAvCgkJCSAgICAgICAoU3BsYXNoQ29vcmQpKHNwbGFzaEFBU2l6ZSAqIHNwbGFzaEFBU2l6ZSksCgkJCSAgICAgMS41KTsKICAgIH0KICB9IGVsc2UgewogICAgYWFCdWYgPSBOVUxMOwogIH0KICBjbGVhck1vZFJlZ2lvbigpOwogIGRlYnVnTW9kZSA9IGdGYWxzZTsKfQoKU3BsYXNoOjp+U3BsYXNoKCkgewogIHdoaWxlIChzdGF0ZS0+bmV4dCkgewogICAgcmVzdG9yZVN0YXRlKCk7CiAgfQogIGRlbGV0ZSBzdGF0ZTsKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBkZWxldGUgYWFCdWY7CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBzdGF0ZSByZWFkCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTcGxhc2hDb29yZCAqU3BsYXNoOjpnZXRNYXRyaXgoKSB7CiAgcmV0dXJuIHN0YXRlLT5tYXRyaXg7Cn0KClNwbGFzaFBhdHRlcm4gKlNwbGFzaDo6Z2V0U3Ryb2tlUGF0dGVybigpIHsKICByZXR1cm4gc3RhdGUtPnN0cm9rZVBhdHRlcm47Cn0KClNwbGFzaFBhdHRlcm4gKlNwbGFzaDo6Z2V0RmlsbFBhdHRlcm4oKSB7CiAgcmV0dXJuIHN0YXRlLT5maWxsUGF0dGVybjsKfQoKU3BsYXNoU2NyZWVuICpTcGxhc2g6OmdldFNjcmVlbigpIHsKICByZXR1cm4gc3RhdGUtPnNjcmVlbjsKfQoKU3BsYXNoQmxlbmRGdW5jIFNwbGFzaDo6Z2V0QmxlbmRGdW5jKCkgewogIHJldHVybiBzdGF0ZS0+YmxlbmRGdW5jOwp9CgpTcGxhc2hDb29yZCBTcGxhc2g6OmdldFN0cm9rZUFscGhhKCkgewogIHJldHVybiBzdGF0ZS0+c3Ryb2tlQWxwaGE7Cn0KClNwbGFzaENvb3JkIFNwbGFzaDo6Z2V0RmlsbEFscGhhKCkgewogIHJldHVybiBzdGF0ZS0+ZmlsbEFscGhhOwp9CgpTcGxhc2hDb29yZCBTcGxhc2g6OmdldExpbmVXaWR0aCgpIHsKICByZXR1cm4gc3RhdGUtPmxpbmVXaWR0aDsKfQoKaW50IFNwbGFzaDo6Z2V0TGluZUNhcCgpIHsKICByZXR1cm4gc3RhdGUtPmxpbmVDYXA7Cn0KCmludCBTcGxhc2g6OmdldExpbmVKb2luKCkgewogIHJldHVybiBzdGF0ZS0+bGluZUpvaW47Cn0KClNwbGFzaENvb3JkIFNwbGFzaDo6Z2V0TWl0ZXJMaW1pdCgpIHsKICByZXR1cm4gc3RhdGUtPm1pdGVyTGltaXQ7Cn0KClNwbGFzaENvb3JkIFNwbGFzaDo6Z2V0RmxhdG5lc3MoKSB7CiAgcmV0dXJuIHN0YXRlLT5mbGF0bmVzczsKfQoKU3BsYXNoQ29vcmQgKlNwbGFzaDo6Z2V0TGluZURhc2goKSB7CiAgcmV0dXJuIHN0YXRlLT5saW5lRGFzaDsKfQoKaW50IFNwbGFzaDo6Z2V0TGluZURhc2hMZW5ndGgoKSB7CiAgcmV0dXJuIHN0YXRlLT5saW5lRGFzaExlbmd0aDsKfQoKU3BsYXNoQ29vcmQgU3BsYXNoOjpnZXRMaW5lRGFzaFBoYXNlKCkgewogIHJldHVybiBzdGF0ZS0+bGluZURhc2hQaGFzZTsKfQoKU3BsYXNoQ2xpcCAqU3BsYXNoOjpnZXRDbGlwKCkgewogIHJldHVybiBzdGF0ZS0+Y2xpcDsKfQoKU3BsYXNoQml0bWFwICpTcGxhc2g6OmdldFNvZnRNYXNrKCkgewogIHJldHVybiBzdGF0ZS0+c29mdE1hc2s7Cn0KCkdCb29sIFNwbGFzaDo6Z2V0SW5Ob25Jc29sYXRlZEdyb3VwKCkgewogIHJldHVybiBzdGF0ZS0+aW5Ob25Jc29sYXRlZEdyb3VwOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBzdGF0ZSB3cml0ZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBTcGxhc2g6OnNldE1hdHJpeChTcGxhc2hDb29yZCAqbWF0cml4KSB7CiAgbWVtY3B5KHN0YXRlLT5tYXRyaXgsIG1hdHJpeCwgNiAqIHNpemVvZihTcGxhc2hDb29yZCkpOwp9Cgp2b2lkIFNwbGFzaDo6c2V0U3Ryb2tlUGF0dGVybihTcGxhc2hQYXR0ZXJuICpzdHJva2VQYXR0ZXJuKSB7CiAgc3RhdGUtPnNldFN0cm9rZVBhdHRlcm4oc3Ryb2tlUGF0dGVybik7Cn0KCnZvaWQgU3BsYXNoOjpzZXRGaWxsUGF0dGVybihTcGxhc2hQYXR0ZXJuICpmaWxsUGF0dGVybikgewogIHN0YXRlLT5zZXRGaWxsUGF0dGVybihmaWxsUGF0dGVybik7Cn0KCnZvaWQgU3BsYXNoOjpzZXRTY3JlZW4oU3BsYXNoU2NyZWVuICpzY3JlZW4pIHsKICBzdGF0ZS0+c2V0U2NyZWVuKHNjcmVlbik7Cn0KCnZvaWQgU3BsYXNoOjpzZXRCbGVuZEZ1bmMoU3BsYXNoQmxlbmRGdW5jIGZ1bmMpIHsKICBzdGF0ZS0+YmxlbmRGdW5jID0gZnVuYzsKfQoKdm9pZCBTcGxhc2g6OnNldFN0cm9rZUFscGhhKFNwbGFzaENvb3JkIGFscGhhKSB7CiAgc3RhdGUtPnN0cm9rZUFscGhhID0gYWxwaGE7Cn0KCnZvaWQgU3BsYXNoOjpzZXRGaWxsQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpIHsKICBzdGF0ZS0+ZmlsbEFscGhhID0gYWxwaGE7Cn0KCnZvaWQgU3BsYXNoOjpzZXRMaW5lV2lkdGgoU3BsYXNoQ29vcmQgbGluZVdpZHRoKSB7CiAgc3RhdGUtPmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKfQoKdm9pZCBTcGxhc2g6OnNldExpbmVDYXAoaW50IGxpbmVDYXApIHsKICBzdGF0ZS0+bGluZUNhcCA9IGxpbmVDYXA7Cn0KCnZvaWQgU3BsYXNoOjpzZXRMaW5lSm9pbihpbnQgbGluZUpvaW4pIHsKICBzdGF0ZS0+bGluZUpvaW4gPSBsaW5lSm9pbjsKfQoKdm9pZCBTcGxhc2g6OnNldE1pdGVyTGltaXQoU3BsYXNoQ29vcmQgbWl0ZXJMaW1pdCkgewogIHN0YXRlLT5taXRlckxpbWl0ID0gbWl0ZXJMaW1pdDsKfQoKdm9pZCBTcGxhc2g6OnNldEZsYXRuZXNzKFNwbGFzaENvb3JkIGZsYXRuZXNzKSB7CiAgaWYgKGZsYXRuZXNzIDwgMSkgewogICAgc3RhdGUtPmZsYXRuZXNzID0gMTsKICB9IGVsc2UgewogICAgc3RhdGUtPmZsYXRuZXNzID0gZmxhdG5lc3M7CiAgfQp9Cgp2b2lkIFNwbGFzaDo6c2V0TGluZURhc2goU3BsYXNoQ29vcmQgKmxpbmVEYXNoLCBpbnQgbGluZURhc2hMZW5ndGgsCgkJCSBTcGxhc2hDb29yZCBsaW5lRGFzaFBoYXNlKSB7CiAgc3RhdGUtPnNldExpbmVEYXNoKGxpbmVEYXNoLCBsaW5lRGFzaExlbmd0aCwgbGluZURhc2hQaGFzZSk7Cn0KCnZvaWQgU3BsYXNoOjpzZXRTdHJva2VBZGp1c3QoR0Jvb2wgc3Ryb2tlQWRqdXN0KSB7CiAgc3RhdGUtPnN0cm9rZUFkanVzdCA9IHN0cm9rZUFkanVzdDsKfQoKdm9pZCBTcGxhc2g6OmNsaXBSZXNldFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJCSAgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxKSB7CiAgc3RhdGUtPmNsaXAtPnJlc2V0VG9SZWN0KHgwLCB5MCwgeDEsIHkxKTsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoOjpjbGlwVG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkJICAgICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSkgewogIHJldHVybiBzdGF0ZS0+Y2xpcC0+Y2xpcFRvUmVjdCh4MCwgeTAsIHgxLCB5MSk7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6Y2xpcFRvUGF0aChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbykgewogIHJldHVybiBzdGF0ZS0+Y2xpcC0+Y2xpcFRvUGF0aChwYXRoLCBzdGF0ZS0+bWF0cml4LCBzdGF0ZS0+ZmxhdG5lc3MsIGVvKTsKfQoKdm9pZCBTcGxhc2g6OnNldFNvZnRNYXNrKFNwbGFzaEJpdG1hcCAqc29mdE1hc2spIHsKICBzdGF0ZS0+c2V0U29mdE1hc2soc29mdE1hc2spOwp9Cgp2b2lkIFNwbGFzaDo6c2V0SW5Ob25Jc29sYXRlZEdyb3VwKFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwQSwKCQkJCSAgIGludCBhbHBoYTBYQSwgaW50IGFscGhhMFlBKSB7CiAgYWxwaGEwQml0bWFwID0gYWxwaGEwQml0bWFwQTsKICBhbHBoYTBYID0gYWxwaGEwWEE7CiAgYWxwaGEwWSA9IGFscGhhMFlBOwogIHN0YXRlLT5pbk5vbklzb2xhdGVkR3JvdXAgPSBnVHJ1ZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gc3RhdGUgc2F2ZS9yZXN0b3JlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIFNwbGFzaDo6c2F2ZVN0YXRlKCkgewogIFNwbGFzaFN0YXRlICpuZXdTdGF0ZTsKCiAgbmV3U3RhdGUgPSBzdGF0ZS0+Y29weSgpOwogIG5ld1N0YXRlLT5uZXh0ID0gc3RhdGU7CiAgc3RhdGUgPSBuZXdTdGF0ZTsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoOjpyZXN0b3JlU3RhdGUoKSB7CiAgU3BsYXNoU3RhdGUgKm9sZFN0YXRlOwoKICBpZiAoIXN0YXRlLT5uZXh0KSB7CiAgICByZXR1cm4gc3BsYXNoRXJyTm9TYXZlOwogIH0KICBvbGRTdGF0ZSA9IHN0YXRlOwogIHN0YXRlID0gc3RhdGUtPm5leHQ7CiAgZGVsZXRlIG9sZFN0YXRlOwogIHJldHVybiBzcGxhc2hPazsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gZHJhd2luZyBvcGVyYXRpb25zCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp2b2lkIFNwbGFzaDo6Y2xlYXIoU3BsYXNoQ29sb3JQdHIgY29sb3IsIEd1Y2hhciBhbHBoYSkgewogIFNwbGFzaENvbG9yUHRyIHJvdywgcDsKICBHdWNoYXIgbW9ubzsKICBpbnQgeCwgeTsKCiAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICAgIG1vbm8gPSAoY29sb3JbMF0gJiAweDgwKSA/IDB4ZmYgOiAweDAwOwogICAgaWYgKGJpdG1hcC0+cm93U2l6ZSA8IDApIHsKICAgICAgbWVtc2V0KGJpdG1hcC0+ZGF0YSArIGJpdG1hcC0+cm93U2l6ZSAqIChiaXRtYXAtPmhlaWdodCAtIDEpLAoJICAgICBtb25vLCAtYml0bWFwLT5yb3dTaXplICogYml0bWFwLT5oZWlnaHQpOwogICAgfSBlbHNlIHsKICAgICAgbWVtc2V0KGJpdG1hcC0+ZGF0YSwgbW9ubywgYml0bWFwLT5yb3dTaXplICogYml0bWFwLT5oZWlnaHQpOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBpZiAoYml0bWFwLT5yb3dTaXplIDwgMCkgewogICAgICBtZW1zZXQoYml0bWFwLT5kYXRhICsgYml0bWFwLT5yb3dTaXplICogKGJpdG1hcC0+aGVpZ2h0IC0gMSksCgkgICAgIGNvbG9yWzBdLCAtYml0bWFwLT5yb3dTaXplICogYml0bWFwLT5oZWlnaHQpOwogICAgfSBlbHNlIHsKICAgICAgbWVtc2V0KGJpdG1hcC0+ZGF0YSwgY29sb3JbMF0sIGJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICBpZiAoY29sb3JbMF0gPT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT0gY29sb3JbMl0pIHsKICAgICAgaWYgKGJpdG1hcC0+cm93U2l6ZSA8IDApIHsKCW1lbXNldChiaXRtYXAtPmRhdGEgKyBiaXRtYXAtPnJvd1NpemUgKiAoYml0bWFwLT5oZWlnaHQgLSAxKSwKCSAgICAgICBjb2xvclswXSwgLWJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgICAgfSBlbHNlIHsKCW1lbXNldChiaXRtYXAtPmRhdGEsIGNvbG9yWzBdLCBiaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJvdyA9IGJpdG1hcC0+ZGF0YTsKICAgICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKCXAgPSByb3c7Cglmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CgkgICpwKysgPSBjb2xvclsyXTsKCSAgKnArKyA9IGNvbG9yWzFdOwoJICAqcCsrID0gY29sb3JbMF07Cgl9Cglyb3cgKz0gYml0bWFwLT5yb3dTaXplOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGlmIChjb2xvclswXSA9PSBjb2xvclsxXSAmJiBjb2xvclsxXSA9PSBjb2xvclsyXSkgewogICAgICBpZiAoYml0bWFwLT5yb3dTaXplIDwgMCkgewoJbWVtc2V0KGJpdG1hcC0+ZGF0YSArIGJpdG1hcC0+cm93U2l6ZSAqIChiaXRtYXAtPmhlaWdodCAtIDEpLAoJICAgICAgIGNvbG9yWzBdLCAtYml0bWFwLT5yb3dTaXplICogYml0bWFwLT5oZWlnaHQpOwogICAgICB9IGVsc2UgewoJbWVtc2V0KGJpdG1hcC0+ZGF0YSwgY29sb3JbMF0sIGJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcm93ID0gYml0bWFwLT5kYXRhOwogICAgICBmb3IgKHkgPSAwOyB5IDwgYml0bWFwLT5oZWlnaHQ7ICsreSkgewoJcCA9IHJvdzsKCWZvciAoeCA9IDA7IHggPCBiaXRtYXAtPndpZHRoOyArK3gpIHsKCSAgKnArKyA9IGNvbG9yWzBdOwoJICAqcCsrID0gY29sb3JbMV07CgkgICpwKysgPSBjb2xvclsyXTsKCSAgKnArKyA9IDI1NTsKCX0KCXJvdyArPSBiaXRtYXAtPnJvd1NpemU7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBpZiAoY29sb3JbMF0gPT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT0gY29sb3JbMl0pIHsKICAgICAgaWYgKGJpdG1hcC0+cm93U2l6ZSA8IDApIHsKCW1lbXNldChiaXRtYXAtPmRhdGEgKyBiaXRtYXAtPnJvd1NpemUgKiAoYml0bWFwLT5oZWlnaHQgLSAxKSwKCSAgICAgICBjb2xvclswXSwgLWJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgICAgfSBlbHNlIHsKCW1lbXNldChiaXRtYXAtPmRhdGEsIGNvbG9yWzBdLCBiaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJvdyA9IGJpdG1hcC0+ZGF0YTsKICAgICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKCXAgPSByb3c7Cglmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CgkgICpwKysgPSBjb2xvclswXTsKCSAgKnArKyA9IGNvbG9yWzFdOwoJICAqcCsrID0gY29sb3JbMl07Cgl9Cglyb3cgKz0gYml0bWFwLT5yb3dTaXplOwogICAgICB9CiAgICB9CiAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICBpZiAoY29sb3JbMF0gPT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT0gY29sb3JbMl0gJiYgY29sb3JbMl0gPT0gY29sb3JbM10pIHsKICAgICAgaWYgKGJpdG1hcC0+cm93U2l6ZSA8IDApIHsKCW1lbXNldChiaXRtYXAtPmRhdGEgKyBiaXRtYXAtPnJvd1NpemUgKiAoYml0bWFwLT5oZWlnaHQgLSAxKSwKCSAgICAgICBjb2xvclswXSwgLWJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgICAgfSBlbHNlIHsKCW1lbXNldChiaXRtYXAtPmRhdGEsIGNvbG9yWzBdLCBiaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJvdyA9IGJpdG1hcC0+ZGF0YTsKICAgICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKCXAgPSByb3c7Cglmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CgkgICpwKysgPSBjb2xvclswXTsKCSAgKnArKyA9IGNvbG9yWzFdOwoJICAqcCsrID0gY29sb3JbMl07CgkgICpwKysgPSBjb2xvclszXTsKCX0KCXJvdyArPSBiaXRtYXAtPnJvd1NpemU7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwojZW5kaWYKICB9CgogIGlmIChiaXRtYXAtPmFscGhhKSB7CiAgICBtZW1zZXQoYml0bWFwLT5hbHBoYSwgYWxwaGEsIGJpdG1hcC0+d2lkdGggKiBiaXRtYXAtPmhlaWdodCk7CiAgfQoKICB1cGRhdGVNb2RYKDApOwogIHVwZGF0ZU1vZFkoMCk7CiAgdXBkYXRlTW9kWChiaXRtYXAtPndpZHRoIC0gMSk7CiAgdXBkYXRlTW9kWShiaXRtYXAtPmhlaWdodCAtIDEpOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OnN0cm9rZShTcGxhc2hQYXRoICpwYXRoKSB7CiAgU3BsYXNoUGF0aCAqcGF0aDIsICpkUGF0aDsKCiAgaWYgKGRlYnVnTW9kZSkgewogICAgcHJpbnRmKCJzdHJva2UgW2Rhc2g6JWRdIFt3aWR0aDolLjJmXTpcbiIsCgkgICBzdGF0ZS0+bGluZURhc2hMZW5ndGgsIChkb3VibGUpc3RhdGUtPmxpbmVXaWR0aCk7CiAgICBkdW1wUGF0aChwYXRoKTsKICB9CiAgb3BDbGlwUmVzID0gc3BsYXNoQ2xpcEFsbE91dHNpZGU7CiAgaWYgKHBhdGgtPmxlbmd0aCA9PSAwKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyRW1wdHlQYXRoOwogIH0KICBwYXRoMiA9IGZsYXR0ZW5QYXRoKHBhdGgsIHN0YXRlLT5tYXRyaXgsIHN0YXRlLT5mbGF0bmVzcyk7CiAgaWYgKHN0YXRlLT5saW5lRGFzaExlbmd0aCA+IDApIHsKICAgIGRQYXRoID0gbWFrZURhc2hlZFBhdGgocGF0aDIpOwogICAgZGVsZXRlIHBhdGgyOwogICAgcGF0aDIgPSBkUGF0aDsKICB9CiAgaWYgKHN0YXRlLT5saW5lV2lkdGggPT0gMCkgewogICAgc3Ryb2tlTmFycm93KHBhdGgyKTsKICB9IGVsc2UgewogICAgc3Ryb2tlV2lkZShwYXRoMik7CiAgfQogIGRlbGV0ZSBwYXRoMjsKICByZXR1cm4gc3BsYXNoT2s7Cn0KCnZvaWQgU3BsYXNoOjpzdHJva2VOYXJyb3coU3BsYXNoUGF0aCAqcGF0aCkgewogIFNwbGFzaFBpcGUgcGlwZTsKICBTcGxhc2hYUGF0aCAqeFBhdGg7CiAgU3BsYXNoWFBhdGhTZWcgKnNlZzsKICBpbnQgeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeCwgeSwgdDsKICBTcGxhc2hDb29yZCBkeCwgZHksIGR4ZHk7CiAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzOwogIGludCBuQ2xpcFJlc1szXTsKICBpbnQgaTsKCiAgbkNsaXBSZXNbMF0gPSBuQ2xpcFJlc1sxXSA9IG5DbGlwUmVzWzJdID0gMDsKCiAgeFBhdGggPSBuZXcgU3BsYXNoWFBhdGgocGF0aCwgc3RhdGUtPm1hdHJpeCwgc3RhdGUtPmZsYXRuZXNzLCBnRmFsc2UpOwoKICBwaXBlSW5pdCgmcGlwZSwgMCwgMCwgc3RhdGUtPnN0cm9rZVBhdHRlcm4sIE5VTEwsIHN0YXRlLT5zdHJva2VBbHBoYSwKCSAgIGdGYWxzZSwgZ0ZhbHNlKTsKCiAgZm9yIChpID0gMCwgc2VnID0geFBhdGgtPnNlZ3M7IGkgPCB4UGF0aC0+bGVuZ3RoOyArK2ksICsrc2VnKSB7CgogICAgeDAgPSBzcGxhc2hGbG9vcihzZWctPngwKTsKICAgIHgxID0gc3BsYXNoRmxvb3Ioc2VnLT54MSk7CiAgICB5MCA9IHNwbGFzaEZsb29yKHNlZy0+eTApOwogICAgeTEgPSBzcGxhc2hGbG9vcihzZWctPnkxKTsKCiAgICAvLyBob3Jpem9udGFsIHNlZ21lbnQKICAgIGlmICh5MCA9PSB5MSkgewogICAgICBpZiAoeDAgPiB4MSkgewoJdCA9IHgwOyB4MCA9IHgxOyB4MSA9IHQ7CiAgICAgIH0KICAgICAgaWYgKChjbGlwUmVzID0gc3RhdGUtPmNsaXAtPnRlc3RTcGFuKHgwLCB4MSwgeTApKQoJICAhPSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewoJZHJhd1NwYW4oJnBpcGUsIHgwLCB4MSwgeTAsIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CiAgICAgIH0KCiAgICAvLyBzZWdtZW50IHdpdGggfGR4fCA+IHxkeXwKICAgIH0gZWxzZSBpZiAoc3BsYXNoQWJzKHNlZy0+ZHhkeSkgPiAxKSB7CiAgICAgIGR4ID0gc2VnLT54MSAtIHNlZy0+eDA7CiAgICAgIGR5ID0gc2VnLT55MSAtIHNlZy0+eTA7CiAgICAgIGR4ZHkgPSBzZWctPmR4ZHk7CiAgICAgIGlmICh5MCA+IHkxKSB7Cgl0ID0geTA7IHkwID0geTE7IHkxID0gdDsKCXQgPSB4MDsgeDAgPSB4MTsgeDEgPSB0OwoJZHggPSAtZHg7CglkeSA9IC1keTsKICAgICAgfQogICAgICBpZiAoKGNsaXBSZXMgPSBzdGF0ZS0+Y2xpcC0+dGVzdFJlY3QoeDAgPD0geDEgPyB4MCA6IHgxLCB5MCwKCQkJCQkgICB4MCA8PSB4MSA/IHgxIDogeDAsIHkxKSkKCSAgIT0gc3BsYXNoQ2xpcEFsbE91dHNpZGUpIHsKCWlmIChkeCA+IDApIHsKCSAgeDIgPSB4MDsKCSAgeDMgPSBzcGxhc2hGbG9vcihzZWctPngwICsgKChTcGxhc2hDb29yZCl5MCArIDEgLSBzZWctPnkwKSAqIGR4ZHkpOwoJICBkcmF3U3BhbigmcGlwZSwgeDIsICh4MiA8PSB4MyAtIDEpID8geDMgLSAxIDogeDIsIHkwLAoJCSAgIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgIHgyID0geDM7CgkgIGZvciAoeSA9IHkwICsgMTsgeSA8PSB5MSAtIDE7ICsreSkgewoJICAgIHgzID0gc3BsYXNoRmxvb3Ioc2VnLT54MCArICgoU3BsYXNoQ29vcmQpeSArIDEgLSBzZWctPnkwKSAqIGR4ZHkpOwoJICAgIGRyYXdTcGFuKCZwaXBlLCB4MiwgeDMgLSAxLCB5LCBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJICAgIHgyID0geDM7CgkgIH0KCSAgZHJhd1NwYW4oJnBpcGUsIHgyLCB4MiA8PSB4MSA/IHgxIDogeDIsIHkxLAoJCSAgIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7Cgl9IGVsc2UgewoJICB4MiA9IHgwOwoJICB4MyA9IHNwbGFzaEZsb29yKHNlZy0+eDAgKyAoKFNwbGFzaENvb3JkKXkwICsgMSAtIHNlZy0+eTApICogZHhkeSk7CgkgIGRyYXdTcGFuKCZwaXBlLCAoeDMgKyAxIDw9IHgyKSA/IHgzICsgMSA6IHgyLCB4MiwgeTAsCgkJICAgY2xpcFJlcyA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgeDIgPSB4MzsKCSAgZm9yICh5ID0geTAgKyAxOyB5IDw9IHkxIC0gMTsgKyt5KSB7CgkgICAgeDMgPSBzcGxhc2hGbG9vcihzZWctPngwICsgKChTcGxhc2hDb29yZCl5ICsgMSAtIHNlZy0+eTApICogZHhkeSk7CgkgICAgZHJhd1NwYW4oJnBpcGUsIHgzICsgMSwgeDIsIHksIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgICAgeDIgPSB4MzsKCSAgfQoJICBkcmF3U3BhbigmcGlwZSwgeDEsICh4MSA8PSB4MikgPyB4MiA6IHgxLCB5MSwKCQkgICBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJfQogICAgICB9CgogICAgLy8gc2VnbWVudCB3aXRoIHxkeXwgPiB8ZHh8CiAgICB9IGVsc2UgewogICAgICBkeGR5ID0gc2VnLT5keGR5OwogICAgICBpZiAoeTAgPiB5MSkgewoJdCA9IHgwOyB4MCA9IHgxOyB4MSA9IHQ7Cgl0ID0geTA7IHkwID0geTE7IHkxID0gdDsKICAgICAgfQogICAgICBpZiAoKGNsaXBSZXMgPSBzdGF0ZS0+Y2xpcC0+dGVzdFJlY3QoeDAgPD0geDEgPyB4MCA6IHgxLCB5MCwKCQkJCQkgICB4MCA8PSB4MSA/IHgxIDogeDAsIHkxKSkKCSAgIT0gc3BsYXNoQ2xpcEFsbE91dHNpZGUpIHsKCWRyYXdQaXhlbCgmcGlwZSwgeDAsIHkwLCBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJZm9yICh5ID0geTAgKyAxOyB5IDw9IHkxIC0gMTsgKyt5KSB7CgkgIHggPSBzcGxhc2hGbG9vcihzZWctPngwICsgKChTcGxhc2hDb29yZCl5IC0gc2VnLT55MCkgKiBkeGR5KTsKCSAgZHJhd1BpeGVsKCZwaXBlLCB4LCB5LCBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJfQoJZHJhd1BpeGVsKCZwaXBlLCB4MSwgeTEsIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CiAgICB9CiAgICB9CiAgICArK25DbGlwUmVzW2NsaXBSZXNdOwogIH0KICBpZiAobkNsaXBSZXNbc3BsYXNoQ2xpcFBhcnRpYWxdIHx8CiAgICAgIChuQ2xpcFJlc1tzcGxhc2hDbGlwQWxsSW5zaWRlXSAmJiBuQ2xpcFJlc1tzcGxhc2hDbGlwQWxsT3V0c2lkZV0pKSB7CiAgICBvcENsaXBSZXMgPSBzcGxhc2hDbGlwUGFydGlhbDsKICB9IGVsc2UgaWYgKG5DbGlwUmVzW3NwbGFzaENsaXBBbGxJbnNpZGVdKSB7CiAgICBvcENsaXBSZXMgPSBzcGxhc2hDbGlwQWxsSW5zaWRlOwogIH0gZWxzZSB7CiAgICBvcENsaXBSZXMgPSBzcGxhc2hDbGlwQWxsT3V0c2lkZTsKICB9CgogIGRlbGV0ZSB4UGF0aDsKfQoKdm9pZCBTcGxhc2g6OnN0cm9rZVdpZGUoU3BsYXNoUGF0aCAqcGF0aCkgewogIFNwbGFzaFBhdGggKnBhdGgyOwoKICBwYXRoMiA9IG1ha2VTdHJva2VQYXRoKHBhdGgsIGdGYWxzZSk7CiAgZmlsbFdpdGhQYXR0ZXJuKHBhdGgyLCBnRmFsc2UsIHN0YXRlLT5zdHJva2VQYXR0ZXJuLCBzdGF0ZS0+c3Ryb2tlQWxwaGEpOwogIGRlbGV0ZSBwYXRoMjsKfQoKU3BsYXNoUGF0aCAqU3BsYXNoOjpmbGF0dGVuUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqbWF0cml4LAoJCQkJU3BsYXNoQ29vcmQgZmxhdG5lc3MpIHsKICBTcGxhc2hQYXRoICpmUGF0aDsKICBTcGxhc2hDb29yZCBmbGF0bmVzczI7CiAgR3VjaGFyIGZsYWc7CiAgaW50IGk7CgogIGZQYXRoID0gbmV3IFNwbGFzaFBhdGgoKTsKICBmbGF0bmVzczIgPSBmbGF0bmVzcyAqIGZsYXRuZXNzOwogIGkgPSAwOwogIHdoaWxlIChpIDwgcGF0aC0+bGVuZ3RoKSB7CiAgICBmbGFnID0gcGF0aC0+ZmxhZ3NbaV07CiAgICBpZiAoZmxhZyAmIHNwbGFzaFBhdGhGaXJzdCkgewogICAgICBmUGF0aC0+bW92ZVRvKHBhdGgtPnB0c1tpXS54LCBwYXRoLT5wdHNbaV0ueSk7CiAgICAgICsraTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmbGFnICYgc3BsYXNoUGF0aEN1cnZlKSB7CglmbGF0dGVuQ3VydmUocGF0aC0+cHRzW2ktMV0ueCwgcGF0aC0+cHRzW2ktMV0ueSwKCQkgICAgIHBhdGgtPnB0c1tpICBdLngsIHBhdGgtPnB0c1tpICBdLnksCgkJICAgICBwYXRoLT5wdHNbaSsxXS54LCBwYXRoLT5wdHNbaSsxXS55LAoJCSAgICAgcGF0aC0+cHRzW2krMl0ueCwgcGF0aC0+cHRzW2krMl0ueSwKCQkgICAgIG1hdHJpeCwgZmxhdG5lc3MyLCBmUGF0aCk7CglpICs9IDM7CiAgICAgIH0gZWxzZSB7CglmUGF0aC0+bGluZVRvKHBhdGgtPnB0c1tpXS54LCBwYXRoLT5wdHNbaV0ueSk7CgkrK2k7CiAgICAgIH0KICAgICAgaWYgKHBhdGgtPmZsYWdzW2ktMV0gJiBzcGxhc2hQYXRoQ2xvc2VkKSB7CglmUGF0aC0+Y2xvc2UoKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZlBhdGg7Cn0KCnZvaWQgU3BsYXNoOjpmbGF0dGVuQ3VydmUoU3BsYXNoQ29vcmQgeDAsIFNwbGFzaENvb3JkIHkwLAoJCQkgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSwKCQkJICBTcGxhc2hDb29yZCB4MiwgU3BsYXNoQ29vcmQgeTIsCgkJCSAgU3BsYXNoQ29vcmQgeDMsIFNwbGFzaENvb3JkIHkzLAoJCQkgIFNwbGFzaENvb3JkICptYXRyaXgsIFNwbGFzaENvb3JkIGZsYXRuZXNzMiwKCQkJICBTcGxhc2hQYXRoICpmUGF0aCkgewogIFNwbGFzaENvb3JkIGN4W3NwbGFzaE1heEN1cnZlU3BsaXRzICsgMV1bM107CiAgU3BsYXNoQ29vcmQgY3lbc3BsYXNoTWF4Q3VydmVTcGxpdHMgKyAxXVszXTsKICBpbnQgY05leHRbc3BsYXNoTWF4Q3VydmVTcGxpdHMgKyAxXTsKICBTcGxhc2hDb29yZCB4bDAsIHhsMSwgeGwyLCB4cjAsIHhyMSwgeHIyLCB4cjMsIHh4MSwgeHgyLCB4aDsKICBTcGxhc2hDb29yZCB5bDAsIHlsMSwgeWwyLCB5cjAsIHlyMSwgeXIyLCB5cjMsIHl5MSwgeXkyLCB5aDsKICBTcGxhc2hDb29yZCBkeCwgZHksIG14LCBteSwgdHgsIHR5LCBkMSwgZDI7CiAgaW50IHAxLCBwMiwgcDM7CgogIC8vIGluaXRpYWwgc2VnbWVudAogIHAxID0gMDsKICBwMiA9IHNwbGFzaE1heEN1cnZlU3BsaXRzOwogIGN4W3AxXVswXSA9IHgwOyAgY3lbcDFdWzBdID0geTA7CiAgY3hbcDFdWzFdID0geDE7ICBjeVtwMV1bMV0gPSB5MTsKICBjeFtwMV1bMl0gPSB4MjsgIGN5W3AxXVsyXSA9IHkyOwogIGN4W3AyXVswXSA9IHgzOyAgY3lbcDJdWzBdID0geTM7CiAgY05leHRbcDFdID0gcDI7CgogIHdoaWxlIChwMSA8IHNwbGFzaE1heEN1cnZlU3BsaXRzKSB7CgogICAgLy8gZ2V0IHRoZSBuZXh0IHNlZ21lbnQKICAgIHhsMCA9IGN4W3AxXVswXTsgIHlsMCA9IGN5W3AxXVswXTsKICAgIHh4MSA9IGN4W3AxXVsxXTsgIHl5MSA9IGN5W3AxXVsxXTsKICAgIHh4MiA9IGN4W3AxXVsyXTsgIHl5MiA9IGN5W3AxXVsyXTsKICAgIHAyID0gY05leHRbcDFdOwogICAgeHIzID0gY3hbcDJdWzBdOyAgeXIzID0gY3lbcDJdWzBdOwoKICAgIC8vIGNvbXB1dGUgdGhlIGRpc3RhbmNlcyAoaW4gZGV2aWNlIHNwYWNlKSBmcm9tIHRoZSBjb250cm9sIHBvaW50cwogICAgLy8gdG8gdGhlIG1pZHBvaW50IG9mIHRoZSBzdHJhaWdodCBsaW5lICh0aGlzIGlzIGEgYml0IG9mIGEgaGFjaywKICAgIC8vIGJ1dCBpdCdzIG11Y2ggZmFzdGVyIHRoYW4gY29tcHV0aW5nIHRoZSBhY3R1YWwgZGlzdGFuY2VzIHRvIHRoZQogICAgLy8gbGluZSkKICAgIHRyYW5zZm9ybShtYXRyaXgsICh4bDAgKyB4cjMpICogMC41LCAoeWwwICsgeXIzKSAqIDAuNSwgJm14LCAmbXkpOwogICAgdHJhbnNmb3JtKG1hdHJpeCwgeHgxLCB5eTEsICZ0eCwgJnR5KTsKICAgIGR4ID0gdHggLSBteDsKICAgIGR5ID0gdHkgLSBteTsKICAgIGQxID0gZHgqZHggKyBkeSpkeTsKICAgIHRyYW5zZm9ybShtYXRyaXgsIHh4MiwgeXkyLCAmdHgsICZ0eSk7CiAgICBkeCA9IHR4IC0gbXg7CiAgICBkeSA9IHR5IC0gbXk7CiAgICBkMiA9IGR4KmR4ICsgZHkqZHk7CgogICAgLy8gaWYgdGhlIGN1cnZlIGlzIGZsYXQgZW5vdWdoLCBvciBubyBtb3JlIHN1YmRpdmlzaW9ucyBhcmUKICAgIC8vIGFsbG93ZWQsIGFkZCB0aGUgc3RyYWlnaHQgbGluZSBzZWdtZW50CiAgICBpZiAocDIgLSBwMSA9PSAxIHx8IChkMSA8PSBmbGF0bmVzczIgJiYgZDIgPD0gZmxhdG5lc3MyKSkgewogICAgICBmUGF0aC0+bGluZVRvKHhyMywgeXIzKTsKICAgICAgcDEgPSBwMjsKCiAgICAvLyBvdGhlcndpc2UsIHN1YmRpdmlkZSB0aGUgY3VydmUKICAgIH0gZWxzZSB7CiAgICAgIHhsMSA9ICh4bDAgKyB4eDEpICogMC41OwogICAgICB5bDEgPSAoeWwwICsgeXkxKSAqIDAuNTsKICAgICAgeGggPSAoeHgxICsgeHgyKSAqIDAuNTsKICAgICAgeWggPSAoeXkxICsgeXkyKSAqIDAuNTsKICAgICAgeGwyID0gKHhsMSArIHhoKSAqIDAuNTsKICAgICAgeWwyID0gKHlsMSArIHloKSAqIDAuNTsKICAgICAgeHIyID0gKHh4MiArIHhyMykgKiAwLjU7CiAgICAgIHlyMiA9ICh5eTIgKyB5cjMpICogMC41OwogICAgICB4cjEgPSAoeGggKyB4cjIpICogMC41OwogICAgICB5cjEgPSAoeWggKyB5cjIpICogMC41OwogICAgICB4cjAgPSAoeGwyICsgeHIxKSAqIDAuNTsKICAgICAgeXIwID0gKHlsMiArIHlyMSkgKiAwLjU7CiAgICAgIC8vIGFkZCB0aGUgbmV3IHN1YmRpdmlzaW9uIHBvaW50cwogICAgICBwMyA9IChwMSArIHAyKSAvIDI7CiAgICAgIGN4W3AxXVsxXSA9IHhsMTsgIGN5W3AxXVsxXSA9IHlsMTsKICAgICAgY3hbcDFdWzJdID0geGwyOyAgY3lbcDFdWzJdID0geWwyOwogICAgICBjTmV4dFtwMV0gPSBwMzsKICAgICAgY3hbcDNdWzBdID0geHIwOyAgY3lbcDNdWzBdID0geXIwOwogICAgICBjeFtwM11bMV0gPSB4cjE7ICBjeVtwM11bMV0gPSB5cjE7CiAgICAgIGN4W3AzXVsyXSA9IHhyMjsgIGN5W3AzXVsyXSA9IHlyMjsKICAgICAgY05leHRbcDNdID0gcDI7CiAgICB9CiAgfQp9CgpTcGxhc2hQYXRoICpTcGxhc2g6Om1ha2VEYXNoZWRQYXRoKFNwbGFzaFBhdGggKnBhdGgpIHsKICBTcGxhc2hQYXRoICpkUGF0aDsKICBTcGxhc2hDb29yZCBsaW5lRGFzaFRvdGFsOwogIFNwbGFzaENvb3JkIGxpbmVEYXNoU3RhcnRQaGFzZSwgbGluZURhc2hEaXN0LCBzZWdMZW47CiAgU3BsYXNoQ29vcmQgeDAsIHkwLCB4MSwgeTEsIHhhLCB5YTsKICBHQm9vbCBsaW5lRGFzaFN0YXJ0T24sIGxpbmVEYXNoT24sIG5ld1BhdGg7CiAgaW50IGxpbmVEYXNoU3RhcnRJZHgsIGxpbmVEYXNoSWR4OwogIGludCBpLCBqLCBrOwoKICBsaW5lRGFzaFRvdGFsID0gMDsKICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPmxpbmVEYXNoTGVuZ3RoOyArK2kpIHsKICAgIGxpbmVEYXNoVG90YWwgKz0gc3RhdGUtPmxpbmVEYXNoW2ldOwogIH0KICBsaW5lRGFzaFN0YXJ0UGhhc2UgPSBzdGF0ZS0+bGluZURhc2hQaGFzZTsKICBpID0gc3BsYXNoRmxvb3IobGluZURhc2hTdGFydFBoYXNlIC8gbGluZURhc2hUb3RhbCk7CiAgbGluZURhc2hTdGFydFBoYXNlIC09IChTcGxhc2hDb29yZClpICogbGluZURhc2hUb3RhbDsKICBsaW5lRGFzaFN0YXJ0T24gPSBnVHJ1ZTsKICBsaW5lRGFzaFN0YXJ0SWR4ID0gMDsKICB3aGlsZSAobGluZURhc2hTdGFydFBoYXNlID49IHN0YXRlLT5saW5lRGFzaFtsaW5lRGFzaFN0YXJ0SWR4XSkgewogICAgbGluZURhc2hTdGFydE9uID0gIWxpbmVEYXNoU3RhcnRPbjsKICAgIGxpbmVEYXNoU3RhcnRQaGFzZSAtPSBzdGF0ZS0+bGluZURhc2hbbGluZURhc2hTdGFydElkeF07CiAgICArK2xpbmVEYXNoU3RhcnRJZHg7CiAgfQoKICBkUGF0aCA9IG5ldyBTcGxhc2hQYXRoKCk7CgogIC8vIHByb2Nlc3MgZWFjaCBzdWJwYXRoCiAgaSA9IDA7CiAgd2hpbGUgKGkgPCBwYXRoLT5sZW5ndGgpIHsKCiAgICAvLyBmaW5kIHRoZSBlbmQgb2YgdGhlIHN1YnBhdGgKICAgIGZvciAoaiA9IGk7CgkgaiA8IHBhdGgtPmxlbmd0aCAtIDEgJiYgIShwYXRoLT5mbGFnc1tqXSAmIHNwbGFzaFBhdGhMYXN0KTsKCSArK2opIDsKCiAgICAvLyBpbml0aWFsaXplIHRoZSBkYXNoIHBhcmFtZXRlcnMKICAgIGxpbmVEYXNoT24gPSBsaW5lRGFzaFN0YXJ0T247CiAgICBsaW5lRGFzaElkeCA9IGxpbmVEYXNoU3RhcnRJZHg7CiAgICBsaW5lRGFzaERpc3QgPSBzdGF0ZS0+bGluZURhc2hbbGluZURhc2hJZHhdIC0gbGluZURhc2hTdGFydFBoYXNlOwoKICAgIC8vIHByb2Nlc3MgZWFjaCBzZWdtZW50IG9mIHRoZSBzdWJwYXRoCiAgICBuZXdQYXRoID0gZ1RydWU7CiAgICBmb3IgKGsgPSBpOyBrIDwgajsgKytrKSB7CgogICAgICAvLyBncmFiIHRoZSBzZWdtZW50CiAgICAgIHgwID0gcGF0aC0+cHRzW2tdLng7CiAgICAgIHkwID0gcGF0aC0+cHRzW2tdLnk7CiAgICAgIHgxID0gcGF0aC0+cHRzW2srMV0ueDsKICAgICAgeTEgPSBwYXRoLT5wdHNbaysxXS55OwogICAgICBzZWdMZW4gPSBzcGxhc2hEaXN0KHgwLCB5MCwgeDEsIHkxKTsKCiAgICAgIC8vIHByb2Nlc3MgdGhlIHNlZ21lbnQKICAgICAgd2hpbGUgKHNlZ0xlbiA+IDApIHsKCglpZiAobGluZURhc2hEaXN0ID49IHNlZ0xlbikgewoJICBpZiAobGluZURhc2hPbikgewoJICAgIGlmIChuZXdQYXRoKSB7CgkgICAgICBkUGF0aC0+bW92ZVRvKHgwLCB5MCk7CgkgICAgICBuZXdQYXRoID0gZ0ZhbHNlOwoJICAgIH0KCSAgICBkUGF0aC0+bGluZVRvKHgxLCB5MSk7CgkgIH0KCSAgbGluZURhc2hEaXN0IC09IHNlZ0xlbjsKCSAgc2VnTGVuID0gMDsKCgl9IGVsc2UgewoJICB4YSA9IHgwICsgKGxpbmVEYXNoRGlzdCAvIHNlZ0xlbikgKiAoeDEgLSB4MCk7CgkgIHlhID0geTAgKyAobGluZURhc2hEaXN0IC8gc2VnTGVuKSAqICh5MSAtIHkwKTsKCSAgaWYgKGxpbmVEYXNoT24pIHsKCSAgICBpZiAobmV3UGF0aCkgewoJICAgICAgZFBhdGgtPm1vdmVUbyh4MCwgeTApOwoJICAgICAgbmV3UGF0aCA9IGdGYWxzZTsKCSAgICB9CgkgICAgZFBhdGgtPmxpbmVUbyh4YSwgeWEpOwoJICB9CgkgIHgwID0geGE7CgkgIHkwID0geWE7CgkgIHNlZ0xlbiAtPSBsaW5lRGFzaERpc3Q7CgkgIGxpbmVEYXNoRGlzdCA9IDA7Cgl9CgoJLy8gZ2V0IHRoZSBuZXh0IGVudHJ5IGluIHRoZSBkYXNoIGFycmF5CglpZiAobGluZURhc2hEaXN0IDw9IDApIHsKCSAgbGluZURhc2hPbiA9ICFsaW5lRGFzaE9uOwoJICBpZiAoKytsaW5lRGFzaElkeCA9PSBzdGF0ZS0+bGluZURhc2hMZW5ndGgpIHsKCSAgICBsaW5lRGFzaElkeCA9IDA7CgkgIH0KCSAgbGluZURhc2hEaXN0ID0gc3RhdGUtPmxpbmVEYXNoW2xpbmVEYXNoSWR4XTsKCSAgbmV3UGF0aCA9IGdUcnVlOwoJfQogICAgICB9CiAgICB9CiAgICBpID0gaiArIDE7CiAgfQoKICByZXR1cm4gZFBhdGg7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6ZmlsbChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbykgewogIGlmIChkZWJ1Z01vZGUpIHsKICAgIHByaW50ZigiZmlsbCBbZW86JWRdOlxuIiwgZW8pOwogICAgZHVtcFBhdGgocGF0aCk7CiAgfQogIHJldHVybiBmaWxsV2l0aFBhdHRlcm4ocGF0aCwgZW8sIHN0YXRlLT5maWxsUGF0dGVybiwgc3RhdGUtPmZpbGxBbHBoYSk7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6ZmlsbFdpdGhQYXR0ZXJuKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvLAoJCQkJICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sCgkJCQkgICAgU3BsYXNoQ29vcmQgYWxwaGEpIHsKICBTcGxhc2hQaXBlIHBpcGU7CiAgU3BsYXNoWFBhdGggKnhQYXRoOwogIFNwbGFzaFhQYXRoU2Nhbm5lciAqc2Nhbm5lcjsKICBpbnQgeE1pbkksIHlNaW5JLCB4TWF4SSwgeU1heEksIHgwLCB4MSwgeTsKICBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMsIGNsaXBSZXMyOwoKICBpZiAocGF0aC0+bGVuZ3RoID09IDApIHsKICAgIHJldHVybiBzcGxhc2hFcnJFbXB0eVBhdGg7CiAgfQogIHhQYXRoID0gbmV3IFNwbGFzaFhQYXRoKHBhdGgsIHN0YXRlLT5tYXRyaXgsIHN0YXRlLT5mbGF0bmVzcywgZ1RydWUpOwogIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgIHhQYXRoLT5hYVNjYWxlKCk7CiAgfQogIHhQYXRoLT5zb3J0KCk7CiAgc2Nhbm5lciA9IG5ldyBTcGxhc2hYUGF0aFNjYW5uZXIoeFBhdGgsIGVvKTsKCiAgLy8gZ2V0IHRoZSBtaW4gYW5kIG1heCB4IGFuZCB5IHZhbHVlcwogIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgIHNjYW5uZXItPmdldEJCb3hBQSgmeE1pbkksICZ5TWluSSwgJnhNYXhJLCAmeU1heEkpOwogIH0gZWxzZSB7CiAgICBzY2FubmVyLT5nZXRCQm94KCZ4TWluSSwgJnlNaW5JLCAmeE1heEksICZ5TWF4SSk7CiAgfQoKICAvLyBjaGVjayBjbGlwcGluZwogIGlmICgoY2xpcFJlcyA9IHN0YXRlLT5jbGlwLT50ZXN0UmVjdCh4TWluSSwgeU1pbkksIHhNYXhJLCB5TWF4SSkpCiAgICAgICE9IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CgogICAgLy8gbGltaXQgdGhlIHkgcmFuZ2UKICAgIGlmICh5TWluSSA8IHN0YXRlLT5jbGlwLT5nZXRZTWluSSgpKSB7CiAgICAgIHlNaW5JID0gc3RhdGUtPmNsaXAtPmdldFlNaW5JKCk7CiAgICB9CiAgICBpZiAoeU1heEkgPiBzdGF0ZS0+Y2xpcC0+Z2V0WU1heEkoKSkgewogICAgICB5TWF4SSA9IHN0YXRlLT5jbGlwLT5nZXRZTWF4SSgpOwogICAgfQoKICAgIHBpcGVJbml0KCZwaXBlLCAwLCB5TWluSSwgcGF0dGVybiwgTlVMTCwgYWxwaGEsIHZlY3RvckFudGlhbGlhcywgZ0ZhbHNlKTsKCiAgICAvLyBkcmF3IHRoZSBzcGFucwogICAgaWYgKHZlY3RvckFudGlhbGlhcykgewogICAgICBmb3IgKHkgPSB5TWluSTsgeSA8PSB5TWF4STsgKyt5KSB7CglzY2FubmVyLT5yZW5kZXJBQUxpbmUoYWFCdWYsICZ4MCwgJngxLCB5KTsKCWlmIChjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgc3RhdGUtPmNsaXAtPmNsaXBBQUxpbmUoYWFCdWYsICZ4MCwgJngxLCB5KTsKCX0KCWRyYXdBQUxpbmUoJnBpcGUsIHgwLCB4MSwgeSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoeSA9IHlNaW5JOyB5IDw9IHlNYXhJOyArK3kpIHsKCXdoaWxlIChzY2FubmVyLT5nZXROZXh0U3Bhbih5LCAmeDAsICZ4MSkpIHsKCSAgaWYgKGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSkgewoJICAgIGRyYXdTcGFuKCZwaXBlLCB4MCwgeDEsIHksIGdUcnVlKTsKCSAgfSBlbHNlIHsKCSAgICAvLyBsaW1pdCB0aGUgeCByYW5nZQoJICAgIGlmICh4MCA8IHN0YXRlLT5jbGlwLT5nZXRYTWluSSgpKSB7CgkgICAgICB4MCA9IHN0YXRlLT5jbGlwLT5nZXRYTWluSSgpOwoJICAgIH0KCSAgICBpZiAoeDEgPiBzdGF0ZS0+Y2xpcC0+Z2V0WE1heEkoKSkgewoJICAgICAgeDEgPSBzdGF0ZS0+Y2xpcC0+Z2V0WE1heEkoKTsKCSAgICB9CgkgICAgY2xpcFJlczIgPSBzdGF0ZS0+Y2xpcC0+dGVzdFNwYW4oeDAsIHgxLCB5KTsKCSAgICBkcmF3U3BhbigmcGlwZSwgeDAsIHgxLCB5LCBjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgfQoJfQogICAgICB9CiAgICB9CiAgfQogIG9wQ2xpcFJlcyA9IGNsaXBSZXM7CgogIGRlbGV0ZSBzY2FubmVyOwogIGRlbGV0ZSB4UGF0aDsKICByZXR1cm4gc3BsYXNoT2s7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6eG9yRmlsbChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbykgewogIFNwbGFzaFBpcGUgcGlwZTsKICBTcGxhc2hYUGF0aCAqeFBhdGg7CiAgU3BsYXNoWFBhdGhTY2FubmVyICpzY2FubmVyOwogIGludCB4TWluSSwgeU1pbkksIHhNYXhJLCB5TWF4SSwgeDAsIHgxLCB5OwogIFNwbGFzaENsaXBSZXN1bHQgY2xpcFJlcywgY2xpcFJlczI7CiAgU3BsYXNoQmxlbmRGdW5jIG9yaWdCbGVuZEZ1bmM7CgogIGlmIChwYXRoLT5sZW5ndGggPT0gMCkgewogICAgcmV0dXJuIHNwbGFzaEVyckVtcHR5UGF0aDsKICB9CiAgeFBhdGggPSBuZXcgU3BsYXNoWFBhdGgocGF0aCwgc3RhdGUtPm1hdHJpeCwgc3RhdGUtPmZsYXRuZXNzLCBnVHJ1ZSk7CiAgeFBhdGgtPnNvcnQoKTsKICBzY2FubmVyID0gbmV3IFNwbGFzaFhQYXRoU2Nhbm5lcih4UGF0aCwgZW8pOwoKICAvLyBnZXQgdGhlIG1pbiBhbmQgbWF4IHggYW5kIHkgdmFsdWVzCiAgc2Nhbm5lci0+Z2V0QkJveCgmeE1pbkksICZ5TWluSSwgJnhNYXhJLCAmeU1heEkpOwoKICAvLyBjaGVjayBjbGlwcGluZwogIGlmICgoY2xpcFJlcyA9IHN0YXRlLT5jbGlwLT50ZXN0UmVjdCh4TWluSSwgeU1pbkksIHhNYXhJLCB5TWF4SSkpCiAgICAgICE9IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CgogICAgLy8gbGltaXQgdGhlIHkgcmFuZ2UKICAgIGlmICh5TWluSSA8IHN0YXRlLT5jbGlwLT5nZXRZTWluSSgpKSB7CiAgICAgIHlNaW5JID0gc3RhdGUtPmNsaXAtPmdldFlNaW5JKCk7CiAgICB9CiAgICBpZiAoeU1heEkgPiBzdGF0ZS0+Y2xpcC0+Z2V0WU1heEkoKSkgewogICAgICB5TWF4SSA9IHN0YXRlLT5jbGlwLT5nZXRZTWF4SSgpOwogICAgfQoKICAgIG9yaWdCbGVuZEZ1bmMgPSBzdGF0ZS0+YmxlbmRGdW5jOwogICAgc3RhdGUtPmJsZW5kRnVuYyA9ICZibGVuZFhvcjsKICAgIHBpcGVJbml0KCZwaXBlLCAwLCB5TWluSSwgc3RhdGUtPmZpbGxQYXR0ZXJuLCBOVUxMLCAxLCBnRmFsc2UsIGdGYWxzZSk7CgogICAgLy8gZHJhdyB0aGUgc3BhbnMKICAgIGZvciAoeSA9IHlNaW5JOyB5IDw9IHlNYXhJOyArK3kpIHsKICAgICAgd2hpbGUgKHNjYW5uZXItPmdldE5leHRTcGFuKHksICZ4MCwgJngxKSkgewoJaWYgKGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSkgewoJICBkcmF3U3BhbigmcGlwZSwgeDAsIHgxLCB5LCBnVHJ1ZSk7Cgl9IGVsc2UgewoJICAvLyBsaW1pdCB0aGUgeCByYW5nZQoJICBpZiAoeDAgPCBzdGF0ZS0+Y2xpcC0+Z2V0WE1pbkkoKSkgewoJICAgIHgwID0gc3RhdGUtPmNsaXAtPmdldFhNaW5JKCk7CgkgIH0KCSAgaWYgKHgxID4gc3RhdGUtPmNsaXAtPmdldFhNYXhJKCkpIHsKCSAgICB4MSA9IHN0YXRlLT5jbGlwLT5nZXRYTWF4SSgpOwoJICB9CgkgIGNsaXBSZXMyID0gc3RhdGUtPmNsaXAtPnRlc3RTcGFuKHgwLCB4MSwgeSk7CgkgIGRyYXdTcGFuKCZwaXBlLCB4MCwgeDEsIHksIGNsaXBSZXMyID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJfQogICAgICB9CiAgICB9CiAgICBzdGF0ZS0+YmxlbmRGdW5jID0gb3JpZ0JsZW5kRnVuYzsKICB9CiAgb3BDbGlwUmVzID0gY2xpcFJlczsKCiAgZGVsZXRlIHNjYW5uZXI7CiAgZGVsZXRlIHhQYXRoOwogIHJldHVybiBzcGxhc2hPazsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoOjpmaWxsQ2hhcihTcGxhc2hDb29yZCB4LCBTcGxhc2hDb29yZCB5LAoJCQkgICAgIGludCBjLCBTcGxhc2hGb250ICpmb250KSB7CiAgU3BsYXNoR2x5cGhCaXRtYXAgZ2x5cGg7CiAgU3BsYXNoQ29vcmQgeHQsIHl0OwogIGludCB4MCwgeTAsIHhGcmFjLCB5RnJhYzsKICBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXM7CgogIGlmIChkZWJ1Z01vZGUpIHsKICAgIHByaW50ZigiZmlsbENoYXI6IHg9JS4yZiB5PSUuMmYgYz0lM2Q9MHglMDJ4PSclYydcbiIsCgkgICAoZG91YmxlKXgsIChkb3VibGUpeSwgYywgYywgYyk7CiAgfQogIHRyYW5zZm9ybShzdGF0ZS0+bWF0cml4LCB4LCB5LCAmeHQsICZ5dCk7CiAgeDAgPSBzcGxhc2hGbG9vcih4dCk7CiAgeEZyYWMgPSBzcGxhc2hGbG9vcigoeHQgLSB4MCkgKiBzcGxhc2hGb250RnJhY3Rpb24pOwogIHkwID0gc3BsYXNoRmxvb3IoeXQpOwogIHlGcmFjID0gc3BsYXNoRmxvb3IoKHl0IC0geTApICogc3BsYXNoRm9udEZyYWN0aW9uKTsKICBpZiAoIWZvbnQtPmdldEdseXBoKGMsIHhGcmFjLCB5RnJhYywgJmdseXBoLCB4MCwgeTAsIHN0YXRlLT5jbGlwLCAmY2xpcFJlcykpIHsKICAgIHJldHVybiBzcGxhc2hFcnJOb0dseXBoOwogIH0KICBpZiAoY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewogICAgZmlsbEdseXBoMih4MCwgeTAsICZnbHlwaCwgY2xpcFJlcyA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKICB9CiAgb3BDbGlwUmVzID0gY2xpcFJlczsKICBpZiAoZ2x5cGguZnJlZURhdGEpIHsKICAgIGdmcmVlKGdseXBoLmRhdGEpOwogIH0KICByZXR1cm4gc3BsYXNoT2s7Cn0KCnZvaWQgU3BsYXNoOjpmaWxsR2x5cGgoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwKCQkJICAgICAgU3BsYXNoR2x5cGhCaXRtYXAgKmdseXBoKSB7CiAgU3BsYXNoQ29vcmQgeHQsIHl0OwogIGludCB4MCwgeTA7CgogIHRyYW5zZm9ybShzdGF0ZS0+bWF0cml4LCB4LCB5LCAmeHQsICZ5dCk7CiAgeDAgPSBzcGxhc2hGbG9vcih4dCk7CiAgeTAgPSBzcGxhc2hGbG9vcih5dCk7CiAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzID0gc3RhdGUtPmNsaXAtPnRlc3RSZWN0KHgwIC0gZ2x5cGgtPngsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTAgLSBnbHlwaC0+eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MCAtIGdseXBoLT54ICsgZ2x5cGgtPncgLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkwIC0gZ2x5cGgtPnkgKyBnbHlwaC0+aCAtIDEpOwogIGlmIChjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CiAgICBmaWxsR2x5cGgyKHgwLCB5MCwgZ2x5cGgsIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CiAgfQogIG9wQ2xpcFJlcyA9IGNsaXBSZXM7Cn0KCnZvaWQgU3BsYXNoOjpmaWxsR2x5cGgyKGludCB4MCwgaW50IHkwLCBTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgsIEdCb29sIG5vQ2xpcCkgewogIFNwbGFzaFBpcGUgcGlwZTsKICBpbnQgYWxwaGEwLCBhbHBoYTsKICBHdWNoYXIgKnA7CiAgaW50IHgxLCB5MSwgeHgsIHh4MSwgeXk7CgogIHAgPSBnbHlwaC0+ZGF0YTsKICBpbnQgeFN0YXJ0ID0geDAgLSBnbHlwaC0+eDsKICBpbnQgeVN0YXJ0ID0geTAgLSBnbHlwaC0+eTsKICBpbnQgeHhMaW1pdCA9IGdseXBoLT53OwogIGludCB5eUxpbWl0ID0gZ2x5cGgtPmg7CgogIGlmICh5U3RhcnQgPCAwKQogIHsKICAgIHAgKz0gZ2x5cGgtPncgKiAteVN0YXJ0OyAvLyBtb3ZlIHAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgcGFpbnRlZCByb3cKICAgIHl5TGltaXQgKz0geVN0YXJ0OwogICAgeVN0YXJ0ID0gMDsKICB9CgogIGlmICh4U3RhcnQgPCAwKQogIHsKICAgIHAgKz0gLXhTdGFydDsgLy8gbW92ZSBwIHRvIHRoZSBmaXJzdCBwYWludGVkIHBpeGVsCiAgICB4eExpbWl0ICs9IHhTdGFydDsKICAgIHhTdGFydCA9IDA7CiAgfQoKICBpZiAoeHhMaW1pdCArIHhTdGFydCA+PSBiaXRtYXAtPndpZHRoKSB4eExpbWl0ID0gYml0bWFwLT53aWR0aCAtIHhTdGFydDsKICBpZiAoeXlMaW1pdCArIHlTdGFydCA+PSBiaXRtYXAtPmhlaWdodCkgeXlMaW1pdCA9IGJpdG1hcC0+aGVpZ2h0IC0geVN0YXJ0OwoKICBpZiAobm9DbGlwKSB7CiAgICBpZiAoZ2x5cGgtPmFhKSB7CiAgICAgIHBpcGVJbml0KCZwaXBlLCB4U3RhcnQsIHlTdGFydCwKICAgICAgICAgICAgICAgc3RhdGUtPmZpbGxQYXR0ZXJuLCBOVUxMLCBzdGF0ZS0+ZmlsbEFscGhhLCBnVHJ1ZSwgZ0ZhbHNlKTsKICAgICAgZm9yICh5eSA9IDAsIHkxID0geVN0YXJ0OyB5eSA8IHl5TGltaXQ7ICsreXksICsreTEpIHsKICAgICAgICBwaXBlU2V0WFkoJnBpcGUsIHhTdGFydCwgeTEpOwogICAgICAgIGZvciAoeHggPSAwLCB4MSA9IHhTdGFydDsgeHggPCB4eExpbWl0OyArK3h4LCArK3gxKSB7CiAgICAgICAgICBhbHBoYSA9IHBbeHhdOwogICAgICAgICAgaWYgKGFscGhhICE9IDApIHsKICAgICAgICAgICAgcGlwZS5zaGFwZSA9IChTcGxhc2hDb29yZCkoYWxwaGEgLyAyNTUuMCk7CiAgICAgICAgICAgIHBpcGVSdW4oJnBpcGUpOwogICAgICAgICAgICB1cGRhdGVNb2RYKHgxKTsKICAgICAgICAgICAgdXBkYXRlTW9kWSh5MSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwaXBlSW5jWCgmcGlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHAgKz0gZ2x5cGgtPnc7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGludCB3aWR0aEVpZ2h0ID0gc3BsYXNoQ2VpbChnbHlwaC0+dyAvIDguMCk7CgogICAgICBwaXBlSW5pdCgmcGlwZSwgeFN0YXJ0LCB5U3RhcnQsCiAgICAgICAgICAgICAgIHN0YXRlLT5maWxsUGF0dGVybiwgTlVMTCwgc3RhdGUtPmZpbGxBbHBoYSwgZ0ZhbHNlLCBnRmFsc2UpOwogICAgICBmb3IgKHl5ID0gMCwgeTEgPSB5U3RhcnQ7IHl5IDwgeXlMaW1pdDsgKyt5eSwgKyt5MSkgewogICAgICAgIHBpcGVTZXRYWSgmcGlwZSwgeFN0YXJ0LCB5MSk7CiAgICAgICAgZm9yICh4eCA9IDAsIHgxID0geFN0YXJ0OyB4eCA8IHh4TGltaXQ7IHh4ICs9IDgpIHsKICAgICAgICAgIGFscGhhMCA9IHBbeHggLyA4XTsKICAgICAgICAgIGZvciAoeHgxID0gMDsgeHgxIDwgOCAmJiB4eCArIHh4MSA8IHh4TGltaXQ7ICsreHgxLCArK3gxKSB7CiAgICAgICAgICAgIGlmIChhbHBoYTAgJiAweDgwKSB7CiAgICAgICAgICAgICAgcGlwZVJ1bigmcGlwZSk7CiAgICAgICAgICAgICAgdXBkYXRlTW9kWCh4MSk7CiAgICAgICAgICAgICAgdXBkYXRlTW9kWSh5MSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcGlwZUluY1goJnBpcGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFscGhhMCA8PD0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcCArPSB3aWR0aEVpZ2h0OwogICAgICB9CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChnbHlwaC0+YWEpIHsKICAgICAgcGlwZUluaXQoJnBpcGUsIHhTdGFydCwgeVN0YXJ0LAogICAgICAgICAgICAgICBzdGF0ZS0+ZmlsbFBhdHRlcm4sIE5VTEwsIHN0YXRlLT5maWxsQWxwaGEsIGdUcnVlLCBnRmFsc2UpOwogICAgICBmb3IgKHl5ID0gMCwgeTEgPSB5U3RhcnQ7IHl5IDwgeXlMaW1pdDsgKyt5eSwgKyt5MSkgewogICAgICAgIHBpcGVTZXRYWSgmcGlwZSwgeFN0YXJ0LCB5MSk7CiAgICAgICAgZm9yICh4eCA9IDAsIHgxID0geFN0YXJ0OyB4eCA8IHh4TGltaXQ7ICsreHgsICsreDEpIHsKICAgICAgICAgIGlmIChzdGF0ZS0+Y2xpcC0+dGVzdCh4MSwgeTEpKSB7CiAgICAgICAgICAgIGFscGhhID0gcFt4eF07CiAgICAgICAgICAgIGlmIChhbHBoYSAhPSAwKSB7CiAgICAgICAgICAgICAgcGlwZS5zaGFwZSA9IChTcGxhc2hDb29yZCkoYWxwaGEgLyAyNTUuMCk7CiAgICAgICAgICAgICAgcGlwZVJ1bigmcGlwZSk7CiAgICAgICAgICAgICAgdXBkYXRlTW9kWCh4MSk7CiAgICAgICAgICAgICAgdXBkYXRlTW9kWSh5MSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcGlwZUluY1goJnBpcGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwaXBlSW5jWCgmcGlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHAgKz0gZ2x5cGgtPnc7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGludCB3aWR0aEVpZ2h0ID0gc3BsYXNoQ2VpbChnbHlwaC0+dyAvIDguMCk7CgogICAgICBwaXBlSW5pdCgmcGlwZSwgeFN0YXJ0LCB5U3RhcnQsCiAgICAgICAgICAgICAgIHN0YXRlLT5maWxsUGF0dGVybiwgTlVMTCwgc3RhdGUtPmZpbGxBbHBoYSwgZ0ZhbHNlLCBnRmFsc2UpOwogICAgICBmb3IgKHl5ID0gMCwgeTEgPSB5U3RhcnQ7IHl5IDwgeXlMaW1pdDsgKyt5eSwgKyt5MSkgewogICAgICAgIHBpcGVTZXRYWSgmcGlwZSwgeFN0YXJ0LCB5MSk7CiAgICAgICAgZm9yICh4eCA9IDAsIHgxID0geFN0YXJ0OyB4eCA8IHh4TGltaXQ7IHh4ICs9IDgpIHsKICAgICAgICAgIGFscGhhMCA9IHBbeHggLyA4XTsKICAgICAgICAgIGZvciAoeHgxID0gMDsgeHgxIDwgOCAmJiB4eCArIHh4MSA8IHh4TGltaXQ7ICsreHgxLCArK3gxKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS0+Y2xpcC0+dGVzdCh4MSwgeTEpKSB7CiAgICAgICAgICAgICAgaWYgKGFscGhhMCAmIDB4ODApIHsKICAgICAgICAgICAgICAgIHBpcGVSdW4oJnBpcGUpOwogICAgICAgICAgICAgICAgdXBkYXRlTW9kWCh4MSk7CiAgICAgICAgICAgICAgICB1cGRhdGVNb2RZKHkxKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcGlwZUluY1goJnBpcGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwaXBlSW5jWCgmcGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWxwaGEwIDw8PSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwICs9IHdpZHRoRWlnaHQ7CiAgICAgIH0KICAgIH0KICB9Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6ZmlsbEltYWdlTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkJICBpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsCgkJCQkgIEdCb29sIGdseXBoTW9kZSkgewogIFNwbGFzaFBpcGUgcGlwZTsKICBHQm9vbCByb3Q7CiAgU3BsYXNoQ29vcmQgeFNjYWxlLCB5U2NhbGUsIHhTaGVhciwgeVNoZWFyLCB5U2hlYXIxOwogIGludCB0eCwgdHgyLCB0eSwgdHkyLCBzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0LCB4U2lnbiwgeVNpZ247CiAgaW50IHVseCwgdWx5LCBsbHgsIGxseSwgdXJ4LCB1cnksIGxyeCwgbHJ5OwogIGludCB1bHgxLCB1bHkxLCBsbHgxLCBsbHkxLCB1cngxLCB1cnkxLCBscngxLCBscnkxOwogIGludCB4TWluLCB4TWF4LCB5TWluLCB5TWF4OwogIFNwbGFzaENsaXBSZXN1bHQgY2xpcFJlcywgY2xpcFJlczI7CiAgaW50IHlwLCB5cSwgeXQsIHlTdGVwLCBsYXN0WVN0ZXA7CiAgaW50IHhwLCB4cSwgeHQsIHhTdGVwLCB4U3JjOwogIGludCBrMSwgc3BhblhNaW4sIHNwYW5YTWF4LCBzcGFuWTsKICBTcGxhc2hDb2xvclB0ciBwaXhCdWYsIHA7CiAgaW50IHBpeEFjYzsKICBpbnQgeCwgeSwgeDEsIHgyLCB5MjsKICBTcGxhc2hDb29yZCB5MTsKICBpbnQgbiwgbSwgaSwgajsKCiAgaWYgKGRlYnVnTW9kZSkgewogICAgcHJpbnRmKCJmaWxsSW1hZ2VNYXNrOiB3PSVkIGg9JWQgbWF0PVslLjJmICUuMmYgJS4yZiAlLjJmICUuMmYgJS4yZl1cbiIsCgkgICB3LCBoLCAoZG91YmxlKW1hdFswXSwgKGRvdWJsZSltYXRbMV0sIChkb3VibGUpbWF0WzJdLAoJICAgKGRvdWJsZSltYXRbM10sIChkb3VibGUpbWF0WzRdLCAoZG91YmxlKW1hdFs1XSk7CiAgfQoKICBpZiAodyA9PSAwICYmIGggPT0gMCkgcmV0dXJuIHNwbGFzaEVyclplcm9JbWFnZTsKCiAgLy8gY2hlY2sgZm9yIHNpbmd1bGFyIG1hdHJpeAogIGlmIChzcGxhc2hBYnMobWF0WzBdICogbWF0WzNdIC0gbWF0WzFdICogbWF0WzJdKSA8IDAuMDAwMDAxKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyU2luZ3VsYXJNYXRyaXg7CiAgfQoKICAvLyBjb21wdXRlIHNjYWxlLCBzaGVhciwgcm90YXRpb24sIHRyYW5zbGF0aW9uIHBhcmFtZXRlcnMKICByb3QgPSBzcGxhc2hBYnMobWF0WzFdKSA+IHNwbGFzaEFicyhtYXRbMF0pOwogIGlmIChyb3QpIHsKICAgIHhTY2FsZSA9IC1tYXRbMV07CiAgICB5U2NhbGUgPSBtYXRbMl0gLSAobWF0WzBdICogbWF0WzNdKSAvIG1hdFsxXTsKICAgIHhTaGVhciA9IC1tYXRbM10gLyB5U2NhbGU7CiAgICB5U2hlYXIgPSAtbWF0WzBdIC8gbWF0WzFdOwogIH0gZWxzZSB7CiAgICB4U2NhbGUgPSBtYXRbMF07CiAgICB5U2NhbGUgPSBtYXRbM10gLSAobWF0WzFdICogbWF0WzJdKSAvIG1hdFswXTsKICAgIHhTaGVhciA9IG1hdFsyXSAvIHlTY2FsZTsKICAgIHlTaGVhciA9IG1hdFsxXSAvIG1hdFswXTsKICB9CiAgLy8gTm90ZSAxOiBUaGUgUERGIHNwZWMgc2F5cyB0aGF0IGFsbCBwaXhlbHMgd2hvc2UgKmNlbnRlcnMqIGxpZQogIC8vIHdpdGhpbiB0aGUgcmVnaW9uIGdldCBwYWludGVkIC0tIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBtYXRjaAogIC8vIHVwIHdpdGggd2hhdCBBY3JvYmF0IGFjdHVhbGx5IGRvZXM6IGl0IGVuZHMgdXAgbGVhdmluZyBnYXBzCiAgLy8gYmV0d2VlbiBpbWFnZSBzdHJpcGVzLiAgU28gd2UgdXNlIHRoZSBzYW1lIHJ1bGUgaGVyZSBhcyBmb3IKICAvLyBmaWxsczogYW55IHBpeGVsIHRoYXQgb3ZlcmxhcHMgdGhlIHJlZ2lvbiBnZXRzIHBhaW50ZWQuCiAgLy8gTm90ZSAyOiBUaGUgImdseXBoTW9kZSIgZmxhZyBpcyBhIGtsdWRnZTogaXQgc3dpdGNoZXMgYmFjayB0bwogIC8vICJjb3JyZWN0IiBiZWhhdmlvciAobWF0Y2hpbmcgdGhlIHNwZWMpLCBmb3IgdXNlIGluIHJlbmRlcmluZyBUeXBlCiAgLy8gMyBmb250cy4KICAvLyBOb3RlIDM6IFRoZSArLy0wLjAxIGluIHRoZXNlIGNvbXB1dGF0aW9ucyBpcyB0byBhdm9pZCBmbG9hdGluZwogIC8vIHBvaW50IHByZWNpc2lvbiBwcm9ibGVtcyB3aGljaCBjYW4gbGVhZCB0byBnYXBzIGJldHdlZW4gaW1hZ2UKICAvLyBzdHJpcGVzIChpdCBjYW4gY2F1c2UgaW1hZ2Ugc3RyaXBlcyB0byBvdmVybGFwLCBidXQgdGhhdCdzIGEgbXVjaAogIC8vIGxlc3MgdmlzaWJsZSBwcm9ibGVtKS4KICBpZiAoZ2x5cGhNb2RlKSB7CiAgICBpZiAoeFNjYWxlID49IDApIHsKICAgICAgdHggPSBzcGxhc2hSb3VuZChtYXRbNF0pOwogICAgICB0eDIgPSBzcGxhc2hSb3VuZChtYXRbNF0gKyB4U2NhbGUpIC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIHR4ID0gc3BsYXNoUm91bmQobWF0WzRdKSAtIDE7CiAgICAgIHR4MiA9IHNwbGFzaFJvdW5kKG1hdFs0XSArIHhTY2FsZSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmICh4U2NhbGUgPj0gMCkgewogICAgICB0eCA9IHNwbGFzaEZsb29yKG1hdFs0XSAtIDAuMDEpOwogICAgICB0eDIgPSBzcGxhc2hGbG9vcihtYXRbNF0gKyB4U2NhbGUgKyAwLjAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHR4ID0gc3BsYXNoRmxvb3IobWF0WzRdICsgMC4wMSk7CiAgICAgIHR4MiA9IHNwbGFzaEZsb29yKG1hdFs0XSArIHhTY2FsZSAtIDAuMDEpOwogICAgfQogIH0KICBzY2FsZWRXaWR0aCA9IGFicyh0eDIgLSB0eCkgKyAxOwogIGlmIChnbHlwaE1vZGUpIHsKICAgIGlmICh5U2NhbGUgPj0gMCkgewogICAgICB0eSA9IHNwbGFzaFJvdW5kKG1hdFs1XSk7CiAgICAgIHR5MiA9IHNwbGFzaFJvdW5kKG1hdFs1XSArIHlTY2FsZSkgLSAxOwogICAgfSBlbHNlIHsKICAgICAgdHkgPSBzcGxhc2hSb3VuZChtYXRbNV0pIC0gMTsKICAgICAgdHkyID0gc3BsYXNoUm91bmQobWF0WzVdICsgeVNjYWxlKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHlTY2FsZSA+PSAwKSB7CiAgICAgIHR5ID0gc3BsYXNoRmxvb3IobWF0WzVdIC0gMC4wMSk7CiAgICAgIHR5MiA9IHNwbGFzaEZsb29yKG1hdFs1XSArIHlTY2FsZSArIDAuMDEpOwogICAgfSBlbHNlIHsKICAgICAgdHkgPSBzcGxhc2hGbG9vcihtYXRbNV0gKyAwLjAxKTsKICAgICAgdHkyID0gc3BsYXNoRmxvb3IobWF0WzVdICsgeVNjYWxlIC0gMC4wMSk7CiAgICB9CiAgfQogIHNjYWxlZEhlaWdodCA9IGFicyh0eTIgLSB0eSkgKyAxOwogIHhTaWduID0gKHhTY2FsZSA8IDApID8gLTEgOiAxOwogIHlTaWduID0gKHlTY2FsZSA8IDApID8gLTEgOiAxOwogIHlTaGVhcjEgPSAoU3BsYXNoQ29vcmQpeFNpZ24gKiB5U2hlYXI7CgogIC8vIGNsaXBwaW5nCiAgdWx4MSA9IDA7CiAgdWx5MSA9IDA7CiAgdXJ4MSA9IHhTaWduICogKHNjYWxlZFdpZHRoIC0gMSk7CiAgdXJ5MSA9IChpbnQpKHlTaGVhciAqIHVyeDEpOwogIGxseDEgPSBzcGxhc2hSb3VuZCh4U2hlYXIgKiB5U2lnbiAqIChzY2FsZWRIZWlnaHQgLSAxKSk7CiAgbGx5MSA9IHlTaWduICogKHNjYWxlZEhlaWdodCAtIDEpICsgKGludCkoeVNoZWFyICogbGx4MSk7CiAgbHJ4MSA9IHhTaWduICogKHNjYWxlZFdpZHRoIC0gMSkgKwogICAgICAgICAgIHNwbGFzaFJvdW5kKHhTaGVhciAqIHlTaWduICogKHNjYWxlZEhlaWdodCAtIDEpKTsKICBscnkxID0geVNpZ24gKiAoc2NhbGVkSGVpZ2h0IC0gMSkgKyAoaW50KSh5U2hlYXIgKiBscngxKTsKICBpZiAocm90KSB7CiAgICB1bHggPSB0eCArIHVseTE7ICAgIHVseSA9IHR5IC0gdWx4MTsKICAgIHVyeCA9IHR4ICsgdXJ5MTsgICAgdXJ5ID0gdHkgLSB1cngxOwogICAgbGx4ID0gdHggKyBsbHkxOyAgICBsbHkgPSB0eSAtIGxseDE7CiAgICBscnggPSB0eCArIGxyeTE7ICAgIGxyeSA9IHR5IC0gbHJ4MTsKICB9IGVsc2UgewogICAgdWx4ID0gdHggKyB1bHgxOyAgICB1bHkgPSB0eSArIHVseTE7CiAgICB1cnggPSB0eCArIHVyeDE7ICAgIHVyeSA9IHR5ICsgdXJ5MTsKICAgIGxseCA9IHR4ICsgbGx4MTsgICAgbGx5ID0gdHkgKyBsbHkxOwogICAgbHJ4ID0gdHggKyBscngxOyAgICBscnkgPSB0eSArIGxyeTE7CiAgfQogIHhNaW4gPSAodWx4IDwgdXJ4KSA/ICh1bHggPCBsbHgpID8gKHVseCA8IGxyeCkgPyB1bHggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPCBscngpID8gbGx4IDogbHJ4CgkJICAgICA6ICh1cnggPCBsbHgpID8gKHVyeCA8IGxyeCkgPyB1cnggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPCBscngpID8gbGx4IDogbHJ4OwogIHhNYXggPSAodWx4ID4gdXJ4KSA/ICh1bHggPiBsbHgpID8gKHVseCA+IGxyeCkgPyB1bHggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPiBscngpID8gbGx4IDogbHJ4CgkJICAgICA6ICh1cnggPiBsbHgpID8gKHVyeCA+IGxyeCkgPyB1cnggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPiBscngpID8gbGx4IDogbHJ4OwogIHlNaW4gPSAodWx5IDwgdXJ5KSA/ICh1bHkgPCBsbHkpID8gKHVseSA8IGxyeSkgPyB1bHkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPCBscnkpID8gbGx5IDogbHJ5CgkJICAgICA6ICh1cnkgPCBsbHkpID8gKHVyeSA8IGxyeSkgPyB1cnkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPCBscnkpID8gbGx5IDogbHJ5OwogIHlNYXggPSAodWx5ID4gdXJ5KSA/ICh1bHkgPiBsbHkpID8gKHVseSA+IGxyeSkgPyB1bHkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPiBscnkpID8gbGx5IDogbHJ5CgkJICAgICA6ICh1cnkgPiBsbHkpID8gKHVyeSA+IGxyeSkgPyB1cnkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPiBscnkpID8gbGx5IDogbHJ5OwogIGNsaXBSZXMgPSBzdGF0ZS0+Y2xpcC0+dGVzdFJlY3QoeE1pbiwgeU1pbiwgeE1heCwgeU1heCk7CiAgb3BDbGlwUmVzID0gY2xpcFJlczsKCiAgLy8gY29tcHV0ZSBCcmVzZW5oYW0gcGFyYW1ldGVycyBmb3IgeCBhbmQgeSBzY2FsaW5nCiAgeXAgPSBoIC8gc2NhbGVkSGVpZ2h0OwogIHlxID0gaCAlIHNjYWxlZEhlaWdodDsKICB4cCA9IHcgLyBzY2FsZWRXaWR0aDsKICB4cSA9IHcgJSBzY2FsZWRXaWR0aDsKCiAgLy8gYWxsb2NhdGUgcGl4ZWwgYnVmZmVyCiAgaWYgKHlwIDwgMCB8fCB5cCA+IElOVF9NQVggLSAxKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyQmFkQXJnOwogIH0KICBwaXhCdWYgPSAoU3BsYXNoQ29sb3JQdHIpZ21hbGxvY24oKHlwICsgMSksIHcpOwoKICAvLyBpbml0aWFsaXplIHRoZSBwaXhlbCBwaXBlCiAgcGlwZUluaXQoJnBpcGUsIDAsIDAsIHN0YXRlLT5maWxsUGF0dGVybiwgTlVMTCwgc3RhdGUtPmZpbGxBbHBoYSwKCSAgIGdUcnVlLCBnRmFsc2UpOwogIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgIGRyYXdBQVBpeGVsSW5pdCgpOwogIH0KCiAgLy8gaW5pdCB5IHNjYWxlIEJyZXNlbmhhbQogIHl0ID0gMDsKICBsYXN0WVN0ZXAgPSAxOwoKICBmb3IgKHkgPSAwOyB5IDwgc2NhbGVkSGVpZ2h0OyArK3kpIHsKCiAgICAvLyB5IHNjYWxlIEJyZXNlbmhhbQogICAgeVN0ZXAgPSB5cDsKICAgIHl0ICs9IHlxOwogICAgaWYgKHl0ID49IHNjYWxlZEhlaWdodCkgewogICAgICB5dCAtPSBzY2FsZWRIZWlnaHQ7CiAgICAgICsreVN0ZXA7CiAgICB9CgogICAgLy8gcmVhZCByb3cocykgZnJvbSBpbWFnZQogICAgbiA9ICh5cCA+IDApID8geVN0ZXAgOiBsYXN0WVN0ZXA7CiAgICBpZiAobiA+IDApIHsKICAgICAgcCA9IHBpeEJ1ZjsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJKCpzcmMpKHNyY0RhdGEsIHApOwoJcCArPSB3OwogICAgICB9CiAgICB9CiAgICBsYXN0WVN0ZXAgPSB5U3RlcDsKCiAgICAvLyBsb29wLWludmFyaWFudCBjb25zdGFudHMKICAgIGsxID0gc3BsYXNoUm91bmQoeFNoZWFyICogeVNpZ24gKiB5KTsKCiAgICAvLyBjbGlwcGluZyB0ZXN0CiAgICBpZiAoY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlICYmCgkhcm90ICYmCgkoaW50KSh5U2hlYXIgKiBrMSkgPT0KCSAgKGludCkoeVNoZWFyICogKHhTaWduICogKHNjYWxlZFdpZHRoIC0gMSkgKyBrMSkpKSB7CiAgICAgIGlmICh4U2lnbiA+IDApIHsKCXNwYW5YTWluID0gdHggKyBrMTsKCXNwYW5YTWF4ID0gc3BhblhNaW4gKyAoc2NhbGVkV2lkdGggLSAxKTsKICAgICAgfSBlbHNlIHsKCXNwYW5YTWF4ID0gdHggKyBrMTsKCXNwYW5YTWluID0gc3BhblhNYXggLSAoc2NhbGVkV2lkdGggLSAxKTsKICAgICAgfQogICAgICBzcGFuWSA9IHR5ICsgeVNpZ24gKiB5ICsgKGludCkoeVNoZWFyICogazEpOwogICAgICBjbGlwUmVzMiA9IHN0YXRlLT5jbGlwLT50ZXN0U3BhbihzcGFuWE1pbiwgc3BhblhNYXgsIHNwYW5ZKTsKICAgICAgaWYgKGNsaXBSZXMyID09IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7Cgljb250aW51ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY2xpcFJlczIgPSBjbGlwUmVzOwogICAgfQoKICAgIC8vIGluaXQgeCBzY2FsZSBCcmVzZW5oYW0KICAgIHh0ID0gMDsKICAgIHhTcmMgPSAwOwoKICAgIC8vIHggc2hlYXIKICAgIHgxID0gazE7CgogICAgLy8geSBzaGVhcgogICAgeTEgPSAoU3BsYXNoQ29vcmQpeVNpZ24gKiB5ICsgeVNoZWFyICogeDE7CiAgICAvLyB0aGlzIGlzIGEga2x1ZGdlOiBpZiB5U2hlYXIxIGlzIG5lZ2F0aXZlLCB0aGVuIChpbnQpeTEgd291bGQKICAgIC8vIGNoYW5nZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3QgcGl4ZWwsIHdoaWNoIGlzIG5vdCB3aGF0IHdlCiAgICAvLyB3YW50CiAgICBpZiAoeVNoZWFyMSA8IDApIHsKICAgICAgeTEgKz0gMC45OTk7CiAgICB9CgogICAgLy8gbG9vcC1pbnZhcmlhbnQgY29uc3RhbnRzCiAgICBuID0geVN0ZXAgPiAwID8geVN0ZXAgOiAxOwoKICAgIGZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgogICAgICAvLyB4IHNjYWxlIEJyZXNlbmhhbQogICAgICB4U3RlcCA9IHhwOwogICAgICB4dCArPSB4cTsKICAgICAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7Cgl4dCAtPSBzY2FsZWRXaWR0aDsKCSsreFN0ZXA7CiAgICAgIH0KCiAgICAgIC8vIHJvdGF0aW9uCiAgICAgIGlmIChyb3QpIHsKCXgyID0gKGludCl5MTsKCXkyID0gLXgxOwogICAgICB9IGVsc2UgewoJeDIgPSB4MTsKCXkyID0gKGludCl5MTsKICAgICAgfQoKICAgICAgLy8gY29tcHV0ZSB0aGUgYWxwaGEgdmFsdWUgZm9yICh4LHkpIGFmdGVyIHRoZSB4IGFuZCB5IHNjYWxpbmcKICAgICAgLy8gb3BlcmF0aW9ucwogICAgICBtID0geFN0ZXAgPiAwID8geFN0ZXAgOiAxOwogICAgICBwID0gcGl4QnVmICsgeFNyYzsKICAgICAgcGl4QWNjID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJZm9yIChqID0gMDsgaiA8IG07ICsraikgewoJICBwaXhBY2MgKz0gKnArKzsKCX0KCXAgKz0gdyAtIG07CiAgICAgIH0KCiAgICAgIC8vIGJsZW5kIGZpbGwgY29sb3Igd2l0aCBiYWNrZ3JvdW5kCiAgICAgIGlmIChwaXhBY2MgIT0gMCkgewoJcGlwZS5zaGFwZSA9IChwaXhBY2MgPT0gbiAqIG0pCgkgICAgICAgICAgICAgICAgID8gKFNwbGFzaENvb3JkKTEKCSAgICAgICAgICAgICAgICAgOiAoU3BsYXNoQ29vcmQpcGl4QWNjIC8gKFNwbGFzaENvb3JkKShuICogbSk7CglpZiAodmVjdG9yQW50aWFsaWFzICYmIGNsaXBSZXMyICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgZHJhd0FBUGl4ZWwoJnBpcGUsIHR4ICsgeDIsIHR5ICsgeTIpOwoJfSBlbHNlIHsKCSAgZHJhd1BpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyLCBjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCX0KICAgICAgfQoKICAgICAgLy8geCBzY2FsZSBCcmVzZW5oYW0KICAgICAgeFNyYyArPSB4U3RlcDsKCiAgICAgIC8vIHggc2hlYXIKICAgICAgeDEgKz0geFNpZ247CgogICAgICAvLyB5IHNoZWFyCiAgICAgIHkxICs9IHlTaGVhcjE7CiAgICB9CiAgfQoKICAvLyBmcmVlIG1lbW9yeQogIGdmcmVlKHBpeEJ1Zik7CgogIHJldHVybiBzcGxhc2hPazsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoOjpkcmF3SW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgR0Jvb2wgc3JjQWxwaGEsCgkJCSAgICAgIGludCB3LCBpbnQgaCwgU3BsYXNoQ29vcmQgKm1hdCkgewogIFNwbGFzaFBpcGUgcGlwZTsKICBHQm9vbCBvaywgcm90OwogIFNwbGFzaENvb3JkIHhTY2FsZSwgeVNjYWxlLCB4U2hlYXIsIHlTaGVhciwgeVNoZWFyMTsKICBpbnQgdHgsIHR4MiwgdHksIHR5Miwgc2NhbGVkV2lkdGgsIHNjYWxlZEhlaWdodCwgeFNpZ24sIHlTaWduOwogIGludCB1bHgsIHVseSwgbGx4LCBsbHksIHVyeCwgdXJ5LCBscngsIGxyeTsKICBpbnQgdWx4MSwgdWx5MSwgbGx4MSwgbGx5MSwgdXJ4MSwgdXJ5MSwgbHJ4MSwgbHJ5MTsKICBpbnQgeE1pbiwgeE1heCwgeU1pbiwgeU1heDsKICBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMsIGNsaXBSZXMyOwogIGludCB5cCwgeXEsIHl0LCB5U3RlcCwgbGFzdFlTdGVwOwogIGludCB4cCwgeHEsIHh0LCB4U3RlcCwgeFNyYzsKICBpbnQgazEsIHNwYW5YTWluLCBzcGFuWE1heCwgc3Bhblk7CiAgU3BsYXNoQ29sb3JQdHIgY29sb3JCdWYsIHA7CiAgU3BsYXNoQ29sb3IgcGl4OwogIEd1Y2hhciAqYWxwaGFCdWYsICpxOwojaWYgU1BMQVNIX0NNWUsKICBpbnQgcGl4QWNjMCwgcGl4QWNjMSwgcGl4QWNjMiwgcGl4QWNjMzsKI2Vsc2UKICBpbnQgcGl4QWNjMCwgcGl4QWNjMSwgcGl4QWNjMjsKI2VuZGlmCiAgaW50IGFscGhhQWNjOwogIFNwbGFzaENvb3JkIHBpeE11bCwgYWxwaGFNdWwsIGFscGhhOwogIGludCB4LCB5LCB4MSwgeDIsIHkyOwogIFNwbGFzaENvb3JkIHkxOwogIGludCBuQ29tcHMsIG4sIG0sIGksIGo7CgogIGlmIChkZWJ1Z01vZGUpIHsKICAgIHByaW50ZigiZHJhd0ltYWdlOiBzcmNNb2RlPSVkIHNyY0FscGhhPSVkIHc9JWQgaD0lZCBtYXQ9WyUuMmYgJS4yZiAlLjJmICUuMmYgJS4yZiAlLjJmXVxuIiwKCSAgIHNyY01vZGUsIHNyY0FscGhhLCB3LCBoLCAoZG91YmxlKW1hdFswXSwgKGRvdWJsZSltYXRbMV0sIChkb3VibGUpbWF0WzJdLAoJICAgKGRvdWJsZSltYXRbM10sIChkb3VibGUpbWF0WzRdLCAoZG91YmxlKW1hdFs1XSk7CiAgfQoKICAvLyBjaGVjayBjb2xvciBtb2RlcwogIG9rID0gZ0ZhbHNlOyAvLyBtYWtlIGdjYyBoYXBweQogIG5Db21wcyA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CiAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIG9rID0gc3JjTW9kZSA9PSBzcGxhc2hNb2RlTW9ubzg7CiAgICBuQ29tcHMgPSAxOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIG9rID0gc3JjTW9kZSA9PSBzcGxhc2hNb2RlUkdCODsKICAgIG5Db21wcyA9IDM7CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIG9rID0gc3JjTW9kZSA9PSBzcGxhc2hNb2RlWEJHUjg7CiAgICBuQ29tcHMgPSA0OwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIG9rID0gc3JjTW9kZSA9PSBzcGxhc2hNb2RlQkdSODsKICAgIG5Db21wcyA9IDM7CiAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICBvayA9IHNyY01vZGUgPT0gc3BsYXNoTW9kZUNNWUs4OwogICAgbkNvbXBzID0gNDsKICAgIGJyZWFrOwojZW5kaWYKICB9CiAgaWYgKCFvaykgewogICAgcmV0dXJuIHNwbGFzaEVyck1vZGVNaXNtYXRjaDsKICB9CgogIC8vIGNoZWNrIGZvciBzaW5ndWxhciBtYXRyaXgKICBpZiAoc3BsYXNoQWJzKG1hdFswXSAqIG1hdFszXSAtIG1hdFsxXSAqIG1hdFsyXSkgPCAwLjAwMDAwMSkgewogICAgcmV0dXJuIHNwbGFzaEVyclNpbmd1bGFyTWF0cml4OwogIH0KCiAgLy8gY29tcHV0ZSBzY2FsZSwgc2hlYXIsIHJvdGF0aW9uLCB0cmFuc2xhdGlvbiBwYXJhbWV0ZXJzCiAgcm90ID0gc3BsYXNoQWJzKG1hdFsxXSkgPiBzcGxhc2hBYnMobWF0WzBdKTsKICBpZiAocm90KSB7CiAgICB4U2NhbGUgPSAtbWF0WzFdOwogICAgeVNjYWxlID0gbWF0WzJdIC0gKG1hdFswXSAqIG1hdFszXSkgLyBtYXRbMV07CiAgICB4U2hlYXIgPSAtbWF0WzNdIC8geVNjYWxlOwogICAgeVNoZWFyID0gLW1hdFswXSAvIG1hdFsxXTsKICB9IGVsc2UgewogICAgeFNjYWxlID0gbWF0WzBdOwogICAgeVNjYWxlID0gbWF0WzNdIC0gKG1hdFsxXSAqIG1hdFsyXSkgLyBtYXRbMF07CiAgICB4U2hlYXIgPSBtYXRbMl0gLyB5U2NhbGU7CiAgICB5U2hlYXIgPSBtYXRbMV0gLyBtYXRbMF07CiAgfQogIC8vIE5vdGUgMTogVGhlIFBERiBzcGVjIHNheXMgdGhhdCBhbGwgcGl4ZWxzIHdob3NlICpjZW50ZXJzKiBsaWUKICAvLyB3aXRoaW4gdGhlIHJlZ2lvbiBnZXQgcGFpbnRlZCAtLSBidXQgdGhhdCBkb2Vzbid0IHNlZW0gdG8gbWF0Y2gKICAvLyB1cCB3aXRoIHdoYXQgQWNyb2JhdCBhY3R1YWxseSBkb2VzOiBpdCBlbmRzIHVwIGxlYXZpbmcgZ2FwcwogIC8vIGJldHdlZW4gaW1hZ2Ugc3RyaXBlcy4gIFNvIHdlIHVzZSB0aGUgc2FtZSBydWxlIGhlcmUgYXMgZm9yCiAgLy8gZmlsbHM6IGFueSBwaXhlbCB0aGF0IG92ZXJsYXBzIHRoZSByZWdpb24gZ2V0cyBwYWludGVkLgogIC8vIE5vdGUgMjogVGhlICsvLTAuMDEgaW4gdGhlc2UgY29tcHV0YXRpb25zIGlzIHRvIGF2b2lkIGZsb2F0aW5nCiAgLy8gcG9pbnQgcHJlY2lzaW9uIHByb2JsZW1zIHdoaWNoIGNhbiBsZWFkIHRvIGdhcHMgYmV0d2VlbiBpbWFnZQogIC8vIHN0cmlwZXMgKGl0IGNhbiBjYXVzZSBpbWFnZSBzdHJpcGVzIHRvIG92ZXJsYXAsIGJ1dCB0aGF0J3MgYSBtdWNoCiAgLy8gbGVzcyB2aXNpYmxlIHByb2JsZW0pLgogIGlmICh4U2NhbGUgPj0gMCkgewogICAgdHggPSBzcGxhc2hGbG9vcihtYXRbNF0gLSAwLjAxKTsKICAgIHR4MiA9IHNwbGFzaEZsb29yKG1hdFs0XSArIHhTY2FsZSArIDAuMDEpOwogIH0gZWxzZSB7CiAgICB0eCA9IHNwbGFzaEZsb29yKG1hdFs0XSArIDAuMDEpOwogICAgdHgyID0gc3BsYXNoRmxvb3IobWF0WzRdICsgeFNjYWxlIC0gMC4wMSk7CiAgfQogIHNjYWxlZFdpZHRoID0gYWJzKHR4MiAtIHR4KSArIDE7CiAgaWYgKHlTY2FsZSA+PSAwKSB7CiAgICB0eSA9IHNwbGFzaEZsb29yKG1hdFs1XSAtIDAuMDEpOwogICAgdHkyID0gc3BsYXNoRmxvb3IobWF0WzVdICsgeVNjYWxlICsgMC4wMSk7CiAgfSBlbHNlIHsKICAgIHR5ID0gc3BsYXNoRmxvb3IobWF0WzVdICsgMC4wMSk7CiAgICB0eTIgPSBzcGxhc2hGbG9vcihtYXRbNV0gKyB5U2NhbGUgLSAwLjAxKTsKICB9CiAgc2NhbGVkSGVpZ2h0ID0gYWJzKHR5MiAtIHR5KSArIDE7CiAgeFNpZ24gPSAoeFNjYWxlIDwgMCkgPyAtMSA6IDE7CiAgeVNpZ24gPSAoeVNjYWxlIDwgMCkgPyAtMSA6IDE7CiAgeVNoZWFyMSA9IChTcGxhc2hDb29yZCl4U2lnbiAqIHlTaGVhcjsKCiAgLy8gY2xpcHBpbmcKICB1bHgxID0gMDsKICB1bHkxID0gMDsKICB1cngxID0geFNpZ24gKiAoc2NhbGVkV2lkdGggLSAxKTsKICB1cnkxID0gKGludCkoeVNoZWFyICogdXJ4MSk7CiAgbGx4MSA9IHNwbGFzaFJvdW5kKHhTaGVhciAqIHlTaWduICogKHNjYWxlZEhlaWdodCAtIDEpKTsKICBsbHkxID0geVNpZ24gKiAoc2NhbGVkSGVpZ2h0IC0gMSkgKyAoaW50KSh5U2hlYXIgKiBsbHgxKTsKICBscngxID0geFNpZ24gKiAoc2NhbGVkV2lkdGggLSAxKSArCiAgICAgICAgICAgc3BsYXNoUm91bmQoeFNoZWFyICogeVNpZ24gKiAoc2NhbGVkSGVpZ2h0IC0gMSkpOwogIGxyeTEgPSB5U2lnbiAqIChzY2FsZWRIZWlnaHQgLSAxKSArIChpbnQpKHlTaGVhciAqIGxyeDEpOwogIGlmIChyb3QpIHsKICAgIHVseCA9IHR4ICsgdWx5MTsgICAgdWx5ID0gdHkgLSB1bHgxOwogICAgdXJ4ID0gdHggKyB1cnkxOyAgICB1cnkgPSB0eSAtIHVyeDE7CiAgICBsbHggPSB0eCArIGxseTE7ICAgIGxseSA9IHR5IC0gbGx4MTsKICAgIGxyeCA9IHR4ICsgbHJ5MTsgICAgbHJ5ID0gdHkgLSBscngxOwogIH0gZWxzZSB7CiAgICB1bHggPSB0eCArIHVseDE7ICAgIHVseSA9IHR5ICsgdWx5MTsKICAgIHVyeCA9IHR4ICsgdXJ4MTsgICAgdXJ5ID0gdHkgKyB1cnkxOwogICAgbGx4ID0gdHggKyBsbHgxOyAgICBsbHkgPSB0eSArIGxseTE7CiAgICBscnggPSB0eCArIGxyeDE7ICAgIGxyeSA9IHR5ICsgbHJ5MTsKICB9CiAgeE1pbiA9ICh1bHggPCB1cngpID8gKHVseCA8IGxseCkgPyAodWx4IDwgbHJ4KSA/IHVseCA6IGxyeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseCA8IGxyeCkgPyBsbHggOiBscngKCQkgICAgIDogKHVyeCA8IGxseCkgPyAodXJ4IDwgbHJ4KSA/IHVyeCA6IGxyeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseCA8IGxyeCkgPyBsbHggOiBscng7CiAgeE1heCA9ICh1bHggPiB1cngpID8gKHVseCA+IGxseCkgPyAodWx4ID4gbHJ4KSA/IHVseCA6IGxyeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseCA+IGxyeCkgPyBsbHggOiBscngKCQkgICAgIDogKHVyeCA+IGxseCkgPyAodXJ4ID4gbHJ4KSA/IHVyeCA6IGxyeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseCA+IGxyeCkgPyBsbHggOiBscng7CiAgeU1pbiA9ICh1bHkgPCB1cnkpID8gKHVseSA8IGxseSkgPyAodWx5IDwgbHJ5KSA/IHVseSA6IGxyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseSA8IGxyeSkgPyBsbHkgOiBscnkKCQkgICAgIDogKHVyeSA8IGxseSkgPyAodXJ5IDwgbHJ5KSA/IHVyeSA6IGxyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseSA8IGxyeSkgPyBsbHkgOiBscnk7CiAgeU1heCA9ICh1bHkgPiB1cnkpID8gKHVseSA+IGxseSkgPyAodWx5ID4gbHJ5KSA/IHVseSA6IGxyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseSA+IGxyeSkgPyBsbHkgOiBscnkKCQkgICAgIDogKHVyeSA+IGxseSkgPyAodXJ5ID4gbHJ5KSA/IHVyeSA6IGxyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGxseSA+IGxyeSkgPyBsbHkgOiBscnk7CiAgY2xpcFJlcyA9IHN0YXRlLT5jbGlwLT50ZXN0UmVjdCh4TWluLCB5TWluLCB4TWF4LCB5TWF4KTsKICBvcENsaXBSZXMgPSBjbGlwUmVzOwogIGlmIChjbGlwUmVzID09IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CiAgICByZXR1cm4gc3BsYXNoT2s7CiAgfQoKICAvLyBjb21wdXRlIEJyZXNlbmhhbSBwYXJhbWV0ZXJzIGZvciB4IGFuZCB5IHNjYWxpbmcKICB5cCA9IGggLyBzY2FsZWRIZWlnaHQ7CiAgeXEgPSBoICUgc2NhbGVkSGVpZ2h0OwogIHhwID0gdyAvIHNjYWxlZFdpZHRoOwogIHhxID0gdyAlIHNjYWxlZFdpZHRoOwoKICAvLyBhbGxvY2F0ZSBwaXhlbCBidWZmZXJzCiAgaWYgKHlwIDwgMCB8fCB5cCA+IElOVF9NQVggLSAxKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyQmFkQXJnOwogIH0KICBjb2xvckJ1ZiA9IChTcGxhc2hDb2xvclB0cilnbWFsbG9jbjMoKHlwICsgMSksIHcsIG5Db21wcyk7CiAgaWYgKHNyY0FscGhhKSB7CiAgICBhbHBoYUJ1ZiA9IChHdWNoYXIgKilnbWFsbG9jbigoeXAgKyAxKSwgdyk7CiAgfSBlbHNlIHsKICAgIGFscGhhQnVmID0gTlVMTDsKICB9CgogIHBpeEFjYzAgPSBwaXhBY2MxID0gcGl4QWNjMiA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CiNpZiBTUExBU0hfQ01ZSwogIHBpeEFjYzMgPSAwOyAvLyBtYWtlIGdjYyBoYXBweQojZW5kaWYKCiAgLy8gaW5pdGlhbGl6ZSB0aGUgcGl4ZWwgcGlwZQogIHBpcGVJbml0KCZwaXBlLCAwLCAwLCBOVUxMLCBwaXgsIHN0YXRlLT5maWxsQWxwaGEsCgkgICBzcmNBbHBoYSB8fCAodmVjdG9yQW50aWFsaWFzICYmIGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbEluc2lkZSksCgkgICBnRmFsc2UpOwogIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgIGRyYXdBQVBpeGVsSW5pdCgpOwogIH0KCiAgaWYgKHNyY0FscGhhKSB7CgogICAgLy8gaW5pdCB5IHNjYWxlIEJyZXNlbmhhbQogICAgeXQgPSAwOwogICAgbGFzdFlTdGVwID0gMTsKCiAgICBmb3IgKHkgPSAwOyB5IDwgc2NhbGVkSGVpZ2h0OyArK3kpIHsKCiAgICAgIC8vIHkgc2NhbGUgQnJlc2VuaGFtCiAgICAgIHlTdGVwID0geXA7CiAgICAgIHl0ICs9IHlxOwogICAgICBpZiAoeXQgPj0gc2NhbGVkSGVpZ2h0KSB7Cgl5dCAtPSBzY2FsZWRIZWlnaHQ7CgkrK3lTdGVwOwogICAgICB9CgogICAgICAvLyByZWFkIHJvdyhzKSBmcm9tIGltYWdlCiAgICAgIG4gPSAoeXAgPiAwKSA/IHlTdGVwIDogbGFzdFlTdGVwOwogICAgICBpZiAobiA+IDApIHsKCXAgPSBjb2xvckJ1ZjsKCXEgPSBhbHBoYUJ1ZjsKCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgKCpzcmMpKHNyY0RhdGEsIHAsIHEpOwoJICBwICs9IHcgKiBuQ29tcHM7CgkgIHEgKz0gdzsKCX0KICAgICAgfQogICAgICBsYXN0WVN0ZXAgPSB5U3RlcDsKCiAgICAgIC8vIGxvb3AtaW52YXJpYW50IGNvbnN0YW50cwogICAgICBrMSA9IHNwbGFzaFJvdW5kKHhTaGVhciAqIHlTaWduICogeSk7CgogICAgICAvLyBjbGlwcGluZyB0ZXN0CiAgICAgIGlmIChjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUgJiYKCSAgIXJvdCAmJgoJICAoaW50KSh5U2hlYXIgKiBrMSkgPT0KCSAgICAoaW50KSh5U2hlYXIgKiAoeFNpZ24gKiAoc2NhbGVkV2lkdGggLSAxKSArIGsxKSkpIHsKCWlmICh4U2lnbiA+IDApIHsKCSAgc3BhblhNaW4gPSB0eCArIGsxOwoJICBzcGFuWE1heCA9IHNwYW5YTWluICsgKHNjYWxlZFdpZHRoIC0gMSk7Cgl9IGVsc2UgewoJICBzcGFuWE1heCA9IHR4ICsgazE7CgkgIHNwYW5YTWluID0gc3BhblhNYXggLSAoc2NhbGVkV2lkdGggLSAxKTsKCX0KCXNwYW5ZID0gdHkgKyB5U2lnbiAqIHkgKyAoaW50KSh5U2hlYXIgKiBrMSk7CgljbGlwUmVzMiA9IHN0YXRlLT5jbGlwLT50ZXN0U3BhbihzcGFuWE1pbiwgc3BhblhNYXgsIHNwYW5ZKTsKCWlmIChjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewoJICBjb250aW51ZTsKCX0KICAgICAgfSBlbHNlIHsKCWNsaXBSZXMyID0gY2xpcFJlczsKICAgICAgfQoKICAgICAgLy8gaW5pdCB4IHNjYWxlIEJyZXNlbmhhbQogICAgICB4dCA9IDA7CiAgICAgIHhTcmMgPSAwOwoKICAgICAgLy8geCBzaGVhcgogICAgICB4MSA9IGsxOwoKICAgICAgLy8geSBzaGVhcgogICAgICB5MSA9IChTcGxhc2hDb29yZCl5U2lnbiAqIHkgKyB5U2hlYXIgKiB4MTsKICAgICAgLy8gdGhpcyBpcyBhIGtsdWRnZTogaWYgeVNoZWFyMSBpcyBuZWdhdGl2ZSwgdGhlbiAoaW50KXkxIHdvdWxkCiAgICAgIC8vIGNoYW5nZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3QgcGl4ZWwsIHdoaWNoIGlzIG5vdCB3aGF0CiAgICAgIC8vIHdlIHdhbnQKICAgICAgaWYgKHlTaGVhcjEgPCAwKSB7Cgl5MSArPSAwLjk5OTsKICAgICAgfQoKICAgICAgLy8gbG9vcC1pbnZhcmlhbnQgY29uc3RhbnRzCiAgICAgIG4gPSB5U3RlcCA+IDAgPyB5U3RlcCA6IDE7CgogICAgICBzd2l0Y2ggKHNyY01vZGUpIHsKCiAgICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgICBjYXNlIHNwbGFzaE1vZGVNb25vODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIGFscGhhQWNjID0gMDsKCSAgcCA9IGNvbG9yQnVmICsgeFNyYzsKCSAgcSA9IGFscGhhQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgICBhbHBoYUFjYyArPSAqcSsrOwoJICAgIH0KCSAgICBwICs9IHcgLSBtOwoJICAgIHEgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCSAgYWxwaGFNdWwgPSBwaXhNdWwgKiAoMS4wIC8gMjU1LjApOwoJICBhbHBoYSA9IChTcGxhc2hDb29yZClhbHBoYUFjYyAqIGFscGhhTXVsOwoKCSAgaWYgKGFscGhhID4gMCkgewoJICAgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCgkgICAgLy8gc2V0IHBpeGVsCgkgICAgcGlwZS5zaGFwZSA9IGFscGhhOwoJICAgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgICBkcmF3QUFQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5Mik7CgkgICAgfSBlbHNlIHsKCSAgICAgIGRyYXdQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5MiwKCQkJY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgICAgfQoJICB9CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3JjICs9IHhTdGVwOwoKCSAgLy8geCBzaGVhcgoJICB4MSArPSB4U2lnbjsKCgkgIC8vIHkgc2hlYXIKCSAgeTEgKz0geVNoZWFyMTsKCX0KCWJyZWFrOwoKICAgICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgY2FzZSBzcGxhc2hNb2RlQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIGFscGhhQWNjID0gMDsKCSAgcCA9IGNvbG9yQnVmICsgeFNyYyAqIDM7CgkgIHEgPSBhbHBoYUJ1ZiArIHhTcmM7CgkgIHBpeEFjYzAgPSBwaXhBY2MxID0gcGl4QWNjMiA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgICBwaXhBY2MxICs9ICpwKys7CgkgICAgICBwaXhBY2MyICs9ICpwKys7CgkgICAgICBhbHBoYUFjYyArPSAqcSsrOwoJICAgIH0KCSAgICBwICs9IDMgKiAodyAtIG0pOwoJICAgIHEgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCSAgYWxwaGFNdWwgPSBwaXhNdWwgKiAoMS4wIC8gMjU1LjApOwoJICBhbHBoYSA9IChTcGxhc2hDb29yZClhbHBoYUFjYyAqIGFscGhhTXVsOwoKCSAgaWYgKGFscGhhID4gMCkgewoJICAgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCSAgICBwaXhbMV0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMSAqIHBpeE11bCk7CgkgICAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoKCSAgICAvLyBzZXQgcGl4ZWwKCSAgICBwaXBlLnNoYXBlID0gYWxwaGE7CgkgICAgaWYgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgICB9IGVsc2UgewoJICAgICAgZHJhd1BpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyLAoJCQljbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgICB9CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CgogICAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTdGVwID0geHA7CgkgIHh0ICs9IHhxOwoJICBpZiAoeHQgPj0gc2NhbGVkV2lkdGgpIHsKCSAgICB4dCAtPSBzY2FsZWRXaWR0aDsKCSAgICArK3hTdGVwOwoJICB9CgoJICAvLyByb3RhdGlvbgoJICBpZiAocm90KSB7CgkgICAgeDIgPSAoaW50KXkxOwoJICAgIHkyID0gLXgxOwoJICB9IGVsc2UgewoJICAgIHgyID0geDE7CgkgICAgeTIgPSAoaW50KXkxOwoJICB9CgoJICAvLyBjb21wdXRlIHRoZSBmaWx0ZXJlZCBwaXhlbCBhdCAoeCx5KSBhZnRlciB0aGUgeCBhbmQgeSBzY2FsaW5nCgkgIC8vIG9wZXJhdGlvbnMKCSAgbSA9IHhTdGVwID4gMCA/IHhTdGVwIDogMTsKCSAgYWxwaGFBY2MgPSAwOwoJICBwID0gY29sb3JCdWYgKyB4U3JjICogNDsKCSAgcSA9IGFscGhhQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IHBpeEFjYzEgPSBwaXhBY2MyID0gMDsKCSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKCSAgICAgIHBpeEFjYzAgKz0gKnArKzsKCSAgICAgIHBpeEFjYzEgKz0gKnArKzsKCSAgICAgIHBpeEFjYzIgKz0gKnArKzsKCSAgICAgIHArKzsKCSAgICAgIGFscGhhQWNjICs9ICpxKys7CgkgICAgfQoJICAgIHAgKz0gNCAqICh3IC0gbSk7CgkgICAgcSArPSB3IC0gbTsKCSAgfQoJICBwaXhNdWwgPSAoU3BsYXNoQ29vcmQpMSAvIChTcGxhc2hDb29yZCkobiAqIG0pOwoJICBhbHBoYU11bCA9IHBpeE11bCAqICgxLjAgLyAyNTUuMCk7CgkgIGFscGhhID0gKFNwbGFzaENvb3JkKWFscGhhQWNjICogYWxwaGFNdWw7CgoJICBpZiAoYWxwaGEgPiAwKSB7CgkgICAgcGl4WzBdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzAgKiBwaXhNdWwpOwoJICAgIHBpeFsxXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MxICogcGl4TXVsKTsKCSAgICBwaXhbMl0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMiAqIHBpeE11bCk7CgkgICAgcGl4WzNdID0gMjU1OwoKCSAgICAvLyBzZXQgcGl4ZWwKCSAgICBwaXBlLnNoYXBlID0gYWxwaGE7CgkgICAgaWYgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgICB9IGVsc2UgewoJICAgICAgZHJhd1BpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyLAoJCQljbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgICB9CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CgoKI2lmIFNQTEFTSF9DTVlLCiAgICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgoJZm9yICh4ID0gMDsgeCA8IHNjYWxlZFdpZHRoOyArK3gpIHsKCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTdGVwID0geHA7CgkgIHh0ICs9IHhxOwoJICBpZiAoeHQgPj0gc2NhbGVkV2lkdGgpIHsKCSAgICB4dCAtPSBzY2FsZWRXaWR0aDsKCSAgICArK3hTdGVwOwoJICB9CgoJICAvLyByb3RhdGlvbgoJICBpZiAocm90KSB7CgkgICAgeDIgPSAoaW50KXkxOwoJICAgIHkyID0gLXgxOwoJICB9IGVsc2UgewoJICAgIHgyID0geDE7CgkgICAgeTIgPSAoaW50KXkxOwoJICB9CgoJICAvLyBjb21wdXRlIHRoZSBmaWx0ZXJlZCBwaXhlbCBhdCAoeCx5KSBhZnRlciB0aGUgeCBhbmQgeSBzY2FsaW5nCgkgIC8vIG9wZXJhdGlvbnMKCSAgbSA9IHhTdGVwID4gMCA/IHhTdGVwIDogMTsKCSAgYWxwaGFBY2MgPSAwOwoJICBwID0gY29sb3JCdWYgKyB4U3JjICogNDsKCSAgcSA9IGFscGhhQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IHBpeEFjYzEgPSBwaXhBY2MyID0gcGl4QWNjMyA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgICBwaXhBY2MxICs9ICpwKys7CgkgICAgICBwaXhBY2MyICs9ICpwKys7CgkgICAgICBwaXhBY2MzICs9ICpwKys7CgkgICAgICBhbHBoYUFjYyArPSAqcSsrOwoJICAgIH0KCSAgICBwICs9IDQgKiAodyAtIG0pOwoJICAgIHEgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCSAgYWxwaGFNdWwgPSBwaXhNdWwgKiAoMS4wIC8gMjU1LjApOwoJICBhbHBoYSA9IChTcGxhc2hDb29yZClhbHBoYUFjYyAqIGFscGhhTXVsOwoKCSAgaWYgKGFscGhhID4gMCkgewoJICAgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCSAgICBwaXhbMV0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMSAqIHBpeE11bCk7CgkgICAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoJICAgIHBpeFszXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MzICogcGl4TXVsKTsKCgkgICAgLy8gc2V0IHBpeGVsCgkgICAgcGlwZS5zaGFwZSA9IGFscGhhOwoJICAgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgICBkcmF3QUFQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5Mik7CgkgICAgfSBlbHNlIHsKCSAgICAgIGRyYXdQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5MiwKCQkJY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgICAgfQoJICB9CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3JjICs9IHhTdGVwOwoKCSAgLy8geCBzaGVhcgoJICB4MSArPSB4U2lnbjsKCgkgIC8vIHkgc2hlYXIKCSAgeTEgKz0geVNoZWFyMTsKCX0KCWJyZWFrOwojZW5kaWYgLy8gU1BMQVNIX0NNWUsKICAgICAgfQogICAgfQoKICB9IGVsc2UgewoKICAgIC8vIGluaXQgeSBzY2FsZSBCcmVzZW5oYW0KICAgIHl0ID0gMDsKICAgIGxhc3RZU3RlcCA9IDE7CgogICAgZm9yICh5ID0gMDsgeSA8IHNjYWxlZEhlaWdodDsgKyt5KSB7CgogICAgICAvLyB5IHNjYWxlIEJyZXNlbmhhbQogICAgICB5U3RlcCA9IHlwOwogICAgICB5dCArPSB5cTsKICAgICAgaWYgKHl0ID49IHNjYWxlZEhlaWdodCkgewoJeXQgLT0gc2NhbGVkSGVpZ2h0OwoJKyt5U3RlcDsKICAgICAgfQoKICAgICAgLy8gcmVhZCByb3cocykgZnJvbSBpbWFnZQogICAgICBuID0gKHlwID4gMCkgPyB5U3RlcCA6IGxhc3RZU3RlcDsKICAgICAgaWYgKG4gPiAwKSB7CglwID0gY29sb3JCdWY7Cglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkgICgqc3JjKShzcmNEYXRhLCBwLCBOVUxMKTsKCSAgcCArPSB3ICogbkNvbXBzOwoJfQogICAgICB9CiAgICAgIGxhc3RZU3RlcCA9IHlTdGVwOwoKICAgICAgLy8gbG9vcC1pbnZhcmlhbnQgY29uc3RhbnRzCiAgICAgIGsxID0gc3BsYXNoUm91bmQoeFNoZWFyICogeVNpZ24gKiB5KTsKCiAgICAgIC8vIGNsaXBwaW5nIHRlc3QKICAgICAgaWYgKGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbEluc2lkZSAmJgoJICAhcm90ICYmCgkgIChpbnQpKHlTaGVhciAqIGsxKSA9PQoJICAgIChpbnQpKHlTaGVhciAqICh4U2lnbiAqIChzY2FsZWRXaWR0aCAtIDEpICsgazEpKSkgewoJaWYgKHhTaWduID4gMCkgewoJICBzcGFuWE1pbiA9IHR4ICsgazE7CgkgIHNwYW5YTWF4ID0gc3BhblhNaW4gKyAoc2NhbGVkV2lkdGggLSAxKTsKCX0gZWxzZSB7CgkgIHNwYW5YTWF4ID0gdHggKyBrMTsKCSAgc3BhblhNaW4gPSBzcGFuWE1heCAtIChzY2FsZWRXaWR0aCAtIDEpOwoJfQoJc3BhblkgPSB0eSArIHlTaWduICogeSArIChpbnQpKHlTaGVhciAqIGsxKTsKCWNsaXBSZXMyID0gc3RhdGUtPmNsaXAtPnRlc3RTcGFuKHNwYW5YTWluLCBzcGFuWE1heCwgc3BhblkpOwoJaWYgKGNsaXBSZXMyID09IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CgkgIGNvbnRpbnVlOwoJfQogICAgICB9IGVsc2UgewoJY2xpcFJlczIgPSBjbGlwUmVzOwogICAgICB9CgogICAgICAvLyBpbml0IHggc2NhbGUgQnJlc2VuaGFtCiAgICAgIHh0ID0gMDsKICAgICAgeFNyYyA9IDA7CgogICAgICAvLyB4IHNoZWFyCiAgICAgIHgxID0gazE7CgogICAgICAvLyB5IHNoZWFyCiAgICAgIHkxID0gKFNwbGFzaENvb3JkKXlTaWduICogeSArIHlTaGVhciAqIHgxOwogICAgICAvLyB0aGlzIGlzIGEga2x1ZGdlOiBpZiB5U2hlYXIxIGlzIG5lZ2F0aXZlLCB0aGVuIChpbnQpeTEgd291bGQKICAgICAgLy8gY2hhbmdlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaXJzdCBwaXhlbCwgd2hpY2ggaXMgbm90IHdoYXQKICAgICAgLy8gd2Ugd2FudAogICAgICBpZiAoeVNoZWFyMSA8IDApIHsKCXkxICs9IDAuOTk5OwogICAgICB9CgogICAgICAvLyBsb29wLWludmFyaWFudCBjb25zdGFudHMKICAgICAgbiA9IHlTdGVwID4gMCA/IHlTdGVwIDogMTsKCiAgICAgIHN3aXRjaCAoc3JjTW9kZSkgewoKICAgICAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgoJZm9yICh4ID0gMDsgeCA8IHNjYWxlZFdpZHRoOyArK3gpIHsKCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTdGVwID0geHA7CgkgIHh0ICs9IHhxOwoJICBpZiAoeHQgPj0gc2NhbGVkV2lkdGgpIHsKCSAgICB4dCAtPSBzY2FsZWRXaWR0aDsKCSAgICArK3hTdGVwOwoJICB9CgoJICAvLyByb3RhdGlvbgoJICBpZiAocm90KSB7CgkgICAgeDIgPSAoaW50KXkxOwoJICAgIHkyID0gLXgxOwoJICB9IGVsc2UgewoJICAgIHgyID0geDE7CgkgICAgeTIgPSAoaW50KXkxOwoJICB9CgoJICAvLyBjb21wdXRlIHRoZSBmaWx0ZXJlZCBwaXhlbCBhdCAoeCx5KSBhZnRlciB0aGUgeCBhbmQgeSBzY2FsaW5nCgkgIC8vIG9wZXJhdGlvbnMKCSAgbSA9IHhTdGVwID4gMCA/IHhTdGVwIDogMTsKCSAgcCA9IGNvbG9yQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgfQoJICAgIHAgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCgkgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCgkgIC8vIHNldCBwaXhlbAoJICBpZiAodmVjdG9yQW50aWFsaWFzICYmIGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbEluc2lkZSkgewoJICAgIHBpcGUuc2hhcGUgPSAoU3BsYXNoQ29vcmQpMTsKCSAgICBkcmF3QUFQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5Mik7CgkgIH0gZWxzZSB7CgkgICAgZHJhd1BpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyLAoJCSAgICAgIGNsaXBSZXMyID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJICB9CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3JjICs9IHhTdGVwOwoKCSAgLy8geCBzaGVhcgoJICB4MSArPSB4U2lnbjsKCgkgIC8vIHkgc2hlYXIKCSAgeTEgKz0geVNoZWFyMTsKCX0KCWJyZWFrOwoKICAgICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgY2FzZSBzcGxhc2hNb2RlQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIHAgPSBjb2xvckJ1ZiArIHhTcmMgKiAzOwoJICBwaXhBY2MwID0gcGl4QWNjMSA9IHBpeEFjYzIgPSAwOwoJICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewoJICAgICAgcGl4QWNjMCArPSAqcCsrOwoJICAgICAgcGl4QWNjMSArPSAqcCsrOwoJICAgICAgcGl4QWNjMiArPSAqcCsrOwoJICAgIH0KCSAgICBwICs9IDMgKiAodyAtIG0pOwoJICB9CgkgIHBpeE11bCA9IChTcGxhc2hDb29yZCkxIC8gKFNwbGFzaENvb3JkKShuICogbSk7CgoJICBwaXhbMF0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMCAqIHBpeE11bCk7CgkgIHBpeFsxXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MxICogcGl4TXVsKTsKCSAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoKCSAgLy8gc2V0IHBpeGVsCgkgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgcGlwZS5zaGFwZSA9IChTcGxhc2hDb29yZCkxOwoJICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgfSBlbHNlIHsKCSAgICBkcmF3UGl4ZWwoJnBpcGUsIHR4ICsgeDIsIHR5ICsgeTIsCgkJICAgICAgY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CgogICAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIHAgPSBjb2xvckJ1ZiArIHhTcmMgKiA0OwoJICBwaXhBY2MwID0gcGl4QWNjMSA9IHBpeEFjYzIgPSAwOwoJICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewoJICAgICAgcGl4QWNjMCArPSAqcCsrOwoJICAgICAgcGl4QWNjMSArPSAqcCsrOwoJICAgICAgcGl4QWNjMiArPSAqcCsrOwoJICAgICAgcCsrOwoJICAgIH0KCSAgICBwICs9IDQgKiAodyAtIG0pOwoJICB9CgkgIHBpeE11bCA9IChTcGxhc2hDb29yZCkxIC8gKFNwbGFzaENvb3JkKShuICogbSk7CgoJICBwaXhbMF0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMCAqIHBpeE11bCk7CgkgIHBpeFsxXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MxICogcGl4TXVsKTsKCSAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoJICBwaXhbM10gPSAyNTU7CgoJICAvLyBzZXQgcGl4ZWwKCSAgaWYgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgICBwaXBlLnNoYXBlID0gKFNwbGFzaENvb3JkKTE7CgkgICAgZHJhd0FBUGl4ZWwoJnBpcGUsIHR4ICsgeDIsIHR5ICsgeTIpOwoJICB9IGVsc2UgewoJICAgIGRyYXdQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5MiwKCQkgICAgICBjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgfQoKCSAgLy8geCBzY2FsZSBCcmVzZW5oYW0KCSAgeFNyYyArPSB4U3RlcDsKCgkgIC8vIHggc2hlYXIKCSAgeDEgKz0geFNpZ247CgoJICAvLyB5IHNoZWFyCgkgIHkxICs9IHlTaGVhcjE7Cgl9CglicmVhazsKCiNpZiBTUExBU0hfQ01ZSwogICAgICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIHAgPSBjb2xvckJ1ZiArIHhTcmMgKiA0OwoJICBwaXhBY2MwID0gcGl4QWNjMSA9IHBpeEFjYzIgPSBwaXhBY2MzID0gMDsKCSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKCSAgICAgIHBpeEFjYzAgKz0gKnArKzsKCSAgICAgIHBpeEFjYzEgKz0gKnArKzsKCSAgICAgIHBpeEFjYzIgKz0gKnArKzsKCSAgICAgIHBpeEFjYzMgKz0gKnArKzsKCSAgICB9CgkgICAgcCArPSA0ICogKHcgLSBtKTsKCSAgfQoJICBwaXhNdWwgPSAoU3BsYXNoQ29vcmQpMSAvIChTcGxhc2hDb29yZCkobiAqIG0pOwoKCSAgcGl4WzBdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzAgKiBwaXhNdWwpOwoJICBwaXhbMV0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMSAqIHBpeE11bCk7CgkgIHBpeFsyXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MyICogcGl4TXVsKTsKCSAgcGl4WzNdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzMgKiBwaXhNdWwpOwoKCSAgLy8gc2V0IHBpeGVsCgkgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgcGlwZS5zaGFwZSA9IChTcGxhc2hDb29yZCkxOwoJICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgfSBlbHNlIHsKCSAgICBkcmF3UGl4ZWwoJnBpcGUsIHR4ICsgeDIsIHR5ICsgeTIsCgkJICAgICAgY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CiNlbmRpZiAvLyBTUExBU0hfQ01ZSwogICAgICB9CiAgICB9CgogIH0KCiAgZ2ZyZWUoY29sb3JCdWYpOwogIGdmcmVlKGFscGhhQnVmKTsKCiAgcmV0dXJuIHNwbGFzaE9rOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OmNvbXBvc2l0ZShTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoLAoJCQkgICAgICBHQm9vbCBub0NsaXAsIEdCb29sIG5vbklzb2xhdGVkKSB7CiAgU3BsYXNoUGlwZSBwaXBlOwogIFNwbGFzaENvbG9yIHBpeGVsOwogIEd1Y2hhciBhbHBoYTsKICBHdWNoYXIgKmFwOwogIGludCB4LCB5OwoKICBpZiAoc3JjLT5tb2RlICE9IGJpdG1hcC0+bW9kZSkgewogICAgcmV0dXJuIHNwbGFzaEVyck1vZGVNaXNtYXRjaDsKICB9CgogIGlmIChzcmMtPmFscGhhKSB7CiAgICBwaXBlSW5pdCgmcGlwZSwgeERlc3QsIHlEZXN0LCBOVUxMLCBwaXhlbCwgc3RhdGUtPmZpbGxBbHBoYSwKCSAgICAgZ1RydWUsIG5vbklzb2xhdGVkKTsKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcGlwZVNldFhZKCZwaXBlLCB4RGVzdCwgeURlc3QgKyB5KTsKICAgICAgYXAgPSBzcmMtPmdldEFscGhhUHRyKCkgKyAoeVNyYyArIHkpICogc3JjLT5nZXRXaWR0aCgpICsgeFNyYzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJYWxwaGEgPSAqYXArKzsKCWlmIChub0NsaXAgfHwgc3RhdGUtPmNsaXAtPnRlc3QoeERlc3QgKyB4LCB5RGVzdCArIHkpKSB7CgkgIC8vIHRoaXMgdXNlcyBzaGFwZSBpbnN0ZWFkIG9mIGFscGhhLCB3aGljaCBpc24ndCB0ZWNobmljYWxseQoJICAvLyBjb3JyZWN0LCBidXQgd29ya3Mgb3V0IHRoZSBzYW1lCgkgIHNyYy0+Z2V0UGl4ZWwoeFNyYyArIHgsIHlTcmMgKyB5LCBwaXhlbCk7CgkgIHBpcGUuc2hhcGUgPSAoU3BsYXNoQ29vcmQpKGFscGhhIC8gMjU1LjApOwoJICBwaXBlUnVuKCZwaXBlKTsKCSAgdXBkYXRlTW9kWCh4RGVzdCArIHgpOwoJICB1cGRhdGVNb2RZKHlEZXN0ICsgeSk7Cgl9IGVsc2UgewoJICBwaXBlSW5jWCgmcGlwZSk7Cgl9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgcGlwZUluaXQoJnBpcGUsIHhEZXN0LCB5RGVzdCwgTlVMTCwgcGl4ZWwsIHN0YXRlLT5maWxsQWxwaGEsCgkgICAgIGdGYWxzZSwgbm9uSXNvbGF0ZWQpOwogICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgewogICAgICBwaXBlU2V0WFkoJnBpcGUsIHhEZXN0LCB5RGVzdCArIHkpOwogICAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CglpZiAobm9DbGlwIHx8IHN0YXRlLT5jbGlwLT50ZXN0KHhEZXN0ICsgeCwgeURlc3QgKyB5KSkgewoJICBzcmMtPmdldFBpeGVsKHhTcmMgKyB4LCB5U3JjICsgeSwgcGl4ZWwpOwoJICBwaXBlUnVuKCZwaXBlKTsKCSAgdXBkYXRlTW9kWCh4RGVzdCArIHgpOwoJICB1cGRhdGVNb2RZKHlEZXN0ICsgeSk7Cgl9IGVsc2UgewoJICBwaXBlSW5jWCgmcGlwZSk7Cgl9CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBzcGxhc2hPazsKfQoKdm9pZCBTcGxhc2g6OmNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpIHsKICBTcGxhc2hDb2xvclB0ciBwOwogIEd1Y2hhciAqcTsKICBHdWNoYXIgYWxwaGEsIGFscGhhMSwgYywgY29sb3IwLCBjb2xvcjEsIGNvbG9yMjsKI2lmIFNQTEFTSF9DTVlLCiAgR3VjaGFyIGNvbG9yMzsKI2VuZGlmCiAgaW50IHgsIHksIG1hc2s7CgogIGlmICh1bmxpa2VseShiaXRtYXAtPmFscGhhID09IE5VTEwpKSB7CiAgICBlcnJvcigtMSwgImJpdG1hcC0+YWxwaGEgaXMgTlVMTCBpbiBTcGxhc2g6OmNvbXBvc2l0ZUJhY2tncm91bmQiKTsKICAgIHJldHVybjsKICB9CgogIHN3aXRjaCAoYml0bWFwLT5tb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBjb2xvcjAgPSBjb2xvclswXTsKICAgIGZvciAoeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSAmYml0bWFwLT5kYXRhW3kgKiBiaXRtYXAtPnJvd1NpemVdOwogICAgICBxID0gJmJpdG1hcC0+YWxwaGFbeSAqIGJpdG1hcC0+d2lkdGhdOwogICAgICBtYXNrID0gMHg4MDsKICAgICAgZm9yICh4ID0gMDsgeCA8IGJpdG1hcC0+d2lkdGg7ICsreCkgewoJYWxwaGEgPSAqcSsrOwoJYWxwaGExID0gMjU1IC0gYWxwaGE7CgljID0gKCpwICYgbWFzaykgPyAweGZmIDogMHgwMDsKCWMgPSBkaXYyNTUoYWxwaGExICogY29sb3IwICsgYWxwaGEgKiBjKTsKCWlmIChjICYgMHg4MCkgewoJICAqcCB8PSBtYXNrOwoJfSBlbHNlIHsKCSAgKnAgJj0gfm1hc2s7Cgl9CglpZiAoIShtYXNrID4+PSAxKSkgewoJICBtYXNrID0gMHg4MDsKCSAgKytwOwoJfQogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIGNvbG9yMCA9IGNvbG9yWzBdOwogICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbeSAqIGJpdG1hcC0+cm93U2l6ZV07CiAgICAgIHEgPSAmYml0bWFwLT5hbHBoYVt5ICogYml0bWFwLT53aWR0aF07CiAgICAgIGZvciAoeCA9IDA7IHggPCBiaXRtYXAtPndpZHRoOyArK3gpIHsKCWFscGhhID0gKnErKzsKCWFscGhhMSA9IDI1NSAtIGFscGhhOwoJcFswXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjAgKyBhbHBoYSAqIHBbMF0pOwoJKytwOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBjb2xvcjAgPSBjb2xvclswXTsKICAgIGNvbG9yMSA9IGNvbG9yWzFdOwogICAgY29sb3IyID0gY29sb3JbMl07CiAgICBmb3IgKHkgPSAwOyB5IDwgYml0bWFwLT5oZWlnaHQ7ICsreSkgewogICAgICBwID0gJmJpdG1hcC0+ZGF0YVt5ICogYml0bWFwLT5yb3dTaXplXTsKICAgICAgcSA9ICZiaXRtYXAtPmFscGhhW3kgKiBiaXRtYXAtPndpZHRoXTsKICAgICAgZm9yICh4ID0gMDsgeCA8IGJpdG1hcC0+d2lkdGg7ICsreCkgewoJYWxwaGEgPSAqcSsrOwoJaWYgKGFscGhhID09IDApCgl7CgkgIHBbMF0gPSBjb2xvcjA7CgkgIHBbMV0gPSBjb2xvcjE7CgkgIHBbMl0gPSBjb2xvcjI7Cgl9CgllbHNlIGlmIChhbHBoYSAhPSAyNTUpCgl7CgkgIGFscGhhMSA9IDI1NSAtIGFscGhhOwoJICBwWzBdID0gZGl2MjU1KGFscGhhMSAqIGNvbG9yMCArIGFscGhhICogcFswXSk7CgkgIHBbMV0gPSBkaXYyNTUoYWxwaGExICogY29sb3IxICsgYWxwaGEgKiBwWzFdKTsKCSAgcFsyXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjIgKyBhbHBoYSAqIHBbMl0pOwoJfQoJcCArPSAzOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGNvbG9yMCA9IGNvbG9yWzBdOwogICAgY29sb3IxID0gY29sb3JbMV07CiAgICBjb2xvcjIgPSBjb2xvclsyXTsKICAgIGZvciAoeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSAmYml0bWFwLT5kYXRhW3kgKiBiaXRtYXAtPnJvd1NpemVdOwogICAgICBxID0gJmJpdG1hcC0+YWxwaGFbeSAqIGJpdG1hcC0+d2lkdGhdOwogICAgICBmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CglhbHBoYSA9ICpxKys7CglpZiAoYWxwaGEgPT0gMCkKCXsKCSAgcFswXSA9IGNvbG9yMDsKCSAgcFsxXSA9IGNvbG9yMTsKCSAgcFsyXSA9IGNvbG9yMjsKCX0KCWVsc2UgaWYgKGFscGhhICE9IDI1NSkKCXsKCSAgYWxwaGExID0gMjU1IC0gYWxwaGE7CgkgIHBbMF0gPSBkaXYyNTUoYWxwaGExICogY29sb3IwICsgYWxwaGEgKiBwWzBdKTsKCSAgcFsxXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjEgKyBhbHBoYSAqIHBbMV0pOwoJICBwWzJdID0gZGl2MjU1KGFscGhhMSAqIGNvbG9yMiArIGFscGhhICogcFsyXSk7Cgl9CglwWzNdID0gMjU1OwoJcCArPSA0OwogICAgICB9CiAgICB9CiAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICBjb2xvcjAgPSBjb2xvclswXTsKICAgIGNvbG9yMSA9IGNvbG9yWzFdOwogICAgY29sb3IyID0gY29sb3JbMl07CiAgICBjb2xvcjMgPSBjb2xvclszXTsKICAgIGZvciAoeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSAmYml0bWFwLT5kYXRhW3kgKiBiaXRtYXAtPnJvd1NpemVdOwogICAgICBxID0gJmJpdG1hcC0+YWxwaGFbeSAqIGJpdG1hcC0+d2lkdGhdOwogICAgICBmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CglhbHBoYSA9ICpxKys7CglhbHBoYTEgPSAyNTUgLSBhbHBoYTsKCXBbMF0gPSBkaXYyNTUoYWxwaGExICogY29sb3IwICsgYWxwaGEgKiBwWzBdKTsKCXBbMV0gPSBkaXYyNTUoYWxwaGExICogY29sb3IxICsgYWxwaGEgKiBwWzFdKTsKCXBbMl0gPSBkaXYyNTUoYWxwaGExICogY29sb3IyICsgYWxwaGEgKiBwWzJdKTsKCXBbM10gPSBkaXYyNTUoYWxwaGExICogY29sb3IzICsgYWxwaGEgKiBwWzNdKTsKCXAgKz0gNDsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiNlbmRpZgogIH0KICBtZW1zZXQoYml0bWFwLT5hbHBoYSwgMjU1LCBiaXRtYXAtPndpZHRoICogYml0bWFwLT5oZWlnaHQpOwp9CgpHQm9vbCBTcGxhc2g6OmdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoU3BsYXNoR291cmF1ZENvbG9yICpzaGFkaW5nKQp7CiAgZG91YmxlIHhkYmxbM10gPSB7MC4sIDAuLCAwLn07CiAgZG91YmxlIHlkYmxbM10gPSB7MC4sIDAuLCAwLn07CiAgaW50ICAgIHhbM10gPSB7MCwgMCwgMH07CiAgaW50ICAgIHlbM10gPSB7MCwgMCwgMH07CiAgZG91YmxlIHh0PTAuLCB4YT0wLiwgeXQ9MC47CiAgZG91YmxlIGNhPTAuLCBjdD0wLjsKCiAgLy8gdHJpYW5nbGUgaW50ZXJwb2xhdGlvbjoKICAvLwogIGRvdWJsZSBzY2FuTGltaXRNYXBMWzJdID0gezAuLCAwLn07CiAgZG91YmxlIHNjYW5MaW1pdE1hcFJbMl0gPSB7MC4sIDAufTsKICBkb3VibGUgc2NhbkNvbG9yTWFwTFsyXSA9IHswLiwgMC59OwogIGRvdWJsZSBzY2FuQ29sb3JNYXBSWzJdID0gezAuLCAwLn07CiAgZG91YmxlIHNjYW5Db2xvck1hcFsyXSA9IHswLiwgMC59OwogIGludCBzY2FuRWRnZUxbMl0gPSB7IDAsIDAgfTsKICBpbnQgc2NhbkVkZ2VSWzJdID0geyAwLCAwIH07CiAgR0Jvb2wgaGFzRnVydGhlclNlZ21lbnQgPSBnRmFsc2U7CgogIGludCBzY2FuTGluZU9mZiA9IDA7CiAgaW50IGJpdG1hcE9mZiA9IDA7CiAgaW50IHNjYW5MaW1pdFIgPSAwLCBzY2FuTGltaXRMID0gMDsKCiAgaW50IGJpdG1hcFdpZHRoID0gYml0bWFwLT5nZXRXaWR0aCgpOwogIFNwbGFzaENsaXAqIGNsaXAgPSBnZXRDbGlwKCk7CiAgU3BsYXNoQml0bWFwICpibGl0VGFyZ2V0ID0gYml0bWFwOwogIFNwbGFzaENvbG9yUHRyIGJpdG1hcERhdGEgPSBiaXRtYXAtPmdldERhdGFQdHIoKTsKICBTcGxhc2hDb2xvclB0ciBiaXRtYXBBbHBoYSA9IGJpdG1hcC0+Z2V0QWxwaGFQdHIoKTsKICBTcGxhc2hDb2xvclB0ciBjdXIgPSBOVUxMOwogIFNwbGFzaENvb3JkKiB1c2VyVG9DYW52YXNNYXRyaXggPSBnZXRNYXRyaXgoKTsKICBTcGxhc2hDb2xvck1vZGUgYml0bWFwTW9kZSA9IGJpdG1hcC0+Z2V0TW9kZSgpOwogIEdCb29sIGhhc0FscGhhID0gKGJpdG1hcEFscGhhICE9IE5VTEwpOwogIGludCByb3dTaXplID0gYml0bWFwLT5nZXRSb3dTaXplKCk7CiAgaW50IGNvbG9yQ29tcHMgPSAwOwogIHN3aXRjaCAoYml0bWFwTW9kZSkgewogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgICBjb2xvckNvbXBzPTE7CiAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICAgIGNvbG9yQ29tcHM9MzsKICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgICAgY29sb3JDb21wcz0zOwogICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgICAgY29sb3JDb21wcz00OwogICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogICAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICAgIGNvbG9yQ29tcHM9NDsKICAgIGJyZWFrOwojZW5kaWYKICB9CgogIFNwbGFzaFBpcGUgcGlwZTsKICBTcGxhc2hDb2xvciBjU3JjVmFsOwoKICBwaXBlSW5pdCgmcGlwZSwgMCwgMCwgTlVMTCwgY1NyY1ZhbCwgc3RhdGUtPnN0cm9rZUFscGhhLCBnRmFsc2UsIGdGYWxzZSk7CgogIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgIGlmIChhYUJ1ZiA9PSBOVUxMKQogICAgICByZXR1cm4gZ0ZhbHNlOyAvLyBmYWxsIGJhY2sgdG8gb2xkIGJlaGF2aW91cgogICAgZHJhd0FBUGl4ZWxJbml0KCk7CiAgfQoKICAvLyBpZGVhOgogIC8vIDEuIElmIHBpcGUtPm5vVHJhbnNwYXJlbmN5ICYmICFzdGF0ZS0+YmxlbmRGdW5jCiAgLy8gIC0+IGJsaXQgZGlyZWN0bHkgaW50byB0aGUgZHJhd2luZyBzdXJmYWNlIQogIC8vICAtPiBkaXNhYmxlIGFscGhhIG1hbnVhbGx5LgogIC8vIDIuIE90aGVyd2lzZToKICAvLyAtIGJsaXQgYWxzbyBkaXJlY3RseSwgYnV0IGludG8gYW4gaW50ZXJtZWRpYXRlIHN1cmZhY2UuCiAgLy8gQWZ0ZXJ3YXJkcywgYmxpdCB0aGUgaW50ZXJtZWRpYXRlIHN1cmZhY2UgdXNpbmcgdGhlIGRyYXdpbmcgcGlwZWxpbmUuCiAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0cmlhbmdsZSBlbGVtZW50cyBjYW4gYmUgb24gdG9wIG9mIGVhY2gKICAvLyBvdGhlciwgc28gdGhlIGNvbXBsZXRlIHNoYWRpbmcgbmVlZHMgdG8gYmUgZHJhd24gYmVmb3JlIG9wYWNpdHkgaXMKICAvLyBhcHBsaWVkLgogIC8vIC0gdGhlIGZpbmFsIHN0ZXAsIGlzIHBlcmZvcm1lZCB1c2luZyBhIFNwbGFzaFBpcGU6CiAgLy8gLSBhc3NpZ24gdGhlIGFjdHVhbCBjb2xvciBpbnRvIGNTcmNWYWw6IHBpcGUgdXNlcyBjU3JjVmFsIGJ5IHJlZmVyZW5jZQogIC8vIC0gaW52b2tlIGRyYXdQaXhlbCgmcGlwZSxYLFksYk5vQ2xpcCk7CiAgR0Jvb2wgYkRpcmVjdEJsaXQgPSB2ZWN0b3JBbnRpYWxpYXMgPyBnRmFsc2UgOiBwaXBlLm5vVHJhbnNwYXJlbmN5ICYmICFzdGF0ZS0+YmxlbmRGdW5jOwogIGlmICghYkRpcmVjdEJsaXQpIHsKICAgIGJsaXRUYXJnZXQgPSBuZXcgU3BsYXNoQml0bWFwKGJpdG1hcC0+Z2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+Z2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmdldFJvd1BhZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5nZXRNb2RlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+Z2V0Um93U2l6ZSgpID49IDApOwogICAgYml0bWFwRGF0YSA9IGJsaXRUYXJnZXQtPmdldERhdGFQdHIoKTsKICAgIGJpdG1hcEFscGhhID0gYmxpdFRhcmdldC0+Z2V0QWxwaGFQdHIoKTsKCiAgICAvLyBpbml0aWFsaXNhdGlvbiBzZWVtcyB0byBiZSBuZWNlc3Nhcnk6CiAgICBpbnQgUyA9IGJpdG1hcC0+Z2V0V2lkdGgoKSAqIGJpdG1hcC0+Z2V0SGVpZ2h0KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFM7ICsraSkKICAgICAgYml0bWFwQWxwaGFbaV0gPSAwOwogICAgaGFzQWxwaGEgPSBnVHJ1ZTsKICB9CgogIGlmIChzaGFkaW5nLT5pc1BhcmFtZXRlcml6ZWQoKSkgewogICAgZG91YmxlIGNvbG9yWzNdOwogICAgZG91YmxlIGNvbG9yaW50ZXJwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2hhZGluZy0+Z2V0TlRyaWFuZ2xlcygpOyArK2kpIHsKICAgICAgc2hhZGluZy0+Z2V0VHJpYW5nbGUoaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRibCArIDAsIHlkYmwgKyAwLCBjb2xvciArIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkYmwgKyAxLCB5ZGJsICsgMSwgY29sb3IgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICB4ZGJsICsgMiwgeWRibCArIDIsIGNvbG9yICsgMik7CiAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMzsgKyttKSB7CiAgICAgICAgeHQgPSB4ZGJsW21dICogdXNlclRvQ2FudmFzTWF0cml4WzBdICsgeWRibFttXSAqIHVzZXJUb0NhbnZhc01hdHJpeFsyXSArIHVzZXJUb0NhbnZhc01hdHJpeFs0XTsKICAgICAgICB5dCA9IHhkYmxbbV0gKiB1c2VyVG9DYW52YXNNYXRyaXhbMV0gKyB5ZGJsW21dICogdXNlclRvQ2FudmFzTWF0cml4WzNdICsgdXNlclRvQ2FudmFzTWF0cml4WzVdOwogICAgICAgIHhkYmxbbV0gPSB4dDsKICAgICAgICB5ZGJsW21dID0geXQ7CiAgICAgICAgLy8gd2Ugb3BlcmF0ZSBvbiBzY2FubGluZXMgd2hpY2ggYXJlIGludGVnZXIgb2Zmc2V0cyBpbnRvIHRoZQogICAgICAgIC8vIHJhc3RlciBpbWFnZS4gVGhlIGRvdWJsZSBvZmZzZXRzIGFyZSBvZiBubyB1c2UgaGVyZS4KICAgICAgICB4W21dID0gc3BsYXNoUm91bmQoeHQpOwogICAgICAgIHlbbV0gPSBzcGxhc2hSb3VuZCh5dCk7CiAgICAgIH0KICAgICAgLy8gc29ydCBhY2NvcmRpbmcgdG8geSBjb29yZGluYXRlIHRvIHNpbXBsaWZ5IHN3ZWVwIHRocm91Z2ggc2NhbmxpbmVzOgogICAgICAvLyBJTlNFUlRJT04gU09SVC4KICAgICAgaWYgKHlbMF0gPiB5WzFdKSB7CiAgICAgICAgR3Vzd2FwKHhbMF0sIHhbMV0pOwogICAgICAgIEd1c3dhcCh5WzBdLCB5WzFdKTsKICAgICAgICBHdXN3YXAoY29sb3JbMF0sIGNvbG9yWzFdKTsKICAgICAgfQogICAgICAvLyBmaXJzdCB0d28gYXJlIHNvcnRlZC4KICAgICAgYXNzZXJ0KHlbMF0gPD0geVsxXSk7CiAgICAgIGlmICh5WzFdID4geVsyXSkgewogICAgICAgIGludCB0bXBYID0geFsyXTsKICAgICAgICBpbnQgdG1wWSA9IHlbMl07CiAgICAgICAgZG91YmxlIHRtcEMgPSBjb2xvclsyXTsKICAgICAgICB4WzJdID0geFsxXTsgeVsyXSA9IHlbMV07IGNvbG9yWzJdID0gY29sb3JbMV07CgogICAgICAgIGlmICh5WzBdID4gdG1wWSkgewogICAgICAgICAgeFsxXSA9IHhbMF07IHlbMV0gPSB5WzBdOyBjb2xvclsxXSA9IGNvbG9yWzBdOwogICAgICAgICAgeFswXSA9IHRtcFg7IHlbMF0gPSB0bXBZOyBjb2xvclswXSA9IHRtcEM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHhbMV0gPSB0bXBYOyB5WzFdID0gdG1wWTsgY29sb3JbMV0gPSB0bXBDOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBmaXJzdCB0aHJlZSBhcmUgc29ydGVkCiAgICAgIGFzc2VydCh5WzBdIDw9IHlbMV0pOwogICAgICBhc3NlcnQoeVsxXSA8PSB5WzJdKTsKICAgICAgLy8vLy8KCiAgICAgIC8vIHRoaXMgaGVyZSBpcyBkZXQoIFQgKSA9PSAwCiAgICAgIC8vIHdoZXJlIFQgaXMgdGhlIG1hdHJpeCB0byBtYXAgdG8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMuCiAgICAgIGlmICgoeFswXSAtIHhbMl0pICogKHlbMV0gLSB5WzJdKSAtICh4WzFdIC0geFsyXSkgKiAoeVswXSAtIHlbMl0pID09IDApCiAgICAgICAgY29udGludWU7IC8vIGRlZ2VuZXJhdGUgdHJpYW5nbGUuCgogICAgICAvLyB0aGlzIGhlcmUgaW5pdGlhbGlzZXMgdGhlIHNjYW5saW5lIGdlbmVyYXRpb24uCiAgICAgIC8vIFdlIHN0YXJ0IHdpdGggbG93IFkgY29vcmRpbmF0ZXMgYW5kIHN3ZWVwIHVwIHRvIHRoZSBsYXJnZSBZCiAgICAgIC8vIGNvb3JkaW5hdGVzLgogICAgICAvLwogICAgICAvLyBzY2FuRWRnZUxbbV0gaW4gezAsMSwyfSBtPTAsMQogICAgICAvLyBzY2FuRWRnZVJbbV0gaW4gezAsMSwyfSBtPTAsMQogICAgICAvLwogICAgICAvLyBhcmUgdGhlIHR3byBlZGdlcyBiZXR3ZWVuIHdoaWNoIHNjYW5saW5lcyBhcmUgKGN1cnJlbnRseSkKICAgICAgLy8gc3dlZXBlZC4gVGhlIHZhbHVlcyB7MCwxLDJ9IGFyZSBpbmRpY2VzIGludG8gJ3gnIGFuZCAneScuCiAgICAgIC8vIHNjYW5FZGdlTFswXSA9IDAgbWVhbnM6IHRoZSBsZWZ0IHNjYW4gZWRnZSBoYXMgKHhbMF0seVswXSkgYXMgdmVydGV4LgogICAgICAvLwogICAgICBzY2FuRWRnZUxbMF0gPSAwOwogICAgICBzY2FuRWRnZVJbMF0gPSAwOwogICAgICBpZiAoeVswXSA9PSB5WzFdKSB7CiAgICAgICAgc2NhbkVkZ2VMWzBdID0gMTsKICAgICAgICBzY2FuRWRnZUxbMV0gPSBzY2FuRWRnZVJbMV0gPSAyOwoKICAgICAgfSBlbHNlIHsKICAgICAgICBzY2FuRWRnZUxbMV0gPSAxOyBzY2FuRWRnZVJbMV0gPSAyOwogICAgICB9CiAgICAgIGFzc2VydCh5W3NjYW5FZGdlTFswXV0gPCB5W3NjYW5FZGdlTFsxXV0pOwogICAgICBhc3NlcnQoeVtzY2FuRWRnZVJbMF1dIDwgeVtzY2FuRWRnZVJbMV1dKTsKCiAgICAgIC8vIE9rLiBOb3cgcHJlcGFyZSB0aGUgbGluZWFyIG1hcHMgd2hpY2ggbWFwIHRoZSB5IGNvb3JkaW5hdGUgb2YKICAgICAgLy8gdGhlIGN1cnJlbnQgc2NhbmxpbmUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgTEVGVCBhbmQgUklHSFQgeAogICAgICAvLyBjb29yZGluYXRlICh3aGljaCBkZWZpbmUgdGhlIHNjYW5saW5lKS4KICAgICAgc2NhbkxpbWl0TWFwTFswXSA9IGRvdWJsZSh4W3NjYW5FZGdlTFsxXV0gLSB4W3NjYW5FZGdlTFswXV0pIC8gKHlbc2NhbkVkZ2VMWzFdXSAtIHlbc2NhbkVkZ2VMWzBdXSk7CiAgICAgIHNjYW5MaW1pdE1hcExbMV0gPSB4W3NjYW5FZGdlTFswXV0gLSB5W3NjYW5FZGdlTFswXV0gKiBzY2FuTGltaXRNYXBMWzBdOwogICAgICBzY2FuTGltaXRNYXBSWzBdID0gZG91YmxlKHhbc2NhbkVkZ2VSWzFdXSAtIHhbc2NhbkVkZ2VSWzBdXSkgLyAoeVtzY2FuRWRnZVJbMV1dIC0geVtzY2FuRWRnZVJbMF1dKTsKICAgICAgc2NhbkxpbWl0TWFwUlsxXSA9IHhbc2NhbkVkZ2VSWzBdXSAtIHlbc2NhbkVkZ2VSWzBdXSAqIHNjYW5MaW1pdE1hcFJbMF07CgogICAgICB4YSA9IHlbMV0gKiBzY2FuTGltaXRNYXBMWzBdICsgc2NhbkxpbWl0TWFwTFsxXTsKICAgICAgeHQgPSB5WzFdICogc2NhbkxpbWl0TWFwUlswXSArIHNjYW5MaW1pdE1hcFJbMV07CiAgICAgIGlmICh4YSA+IHh0KSB7CiAgICAgICAgLy8gSSBoYXZlICJsZWZ0IiBpcyB0byB0aGUgcmlnaHQgb2YgInJpZ2h0Ii4KICAgICAgICAvLyBFeGNoYW5nZSBzaWRlcyEKICAgICAgICBHdXN3YXAoc2NhbkVkZ2VMWzBdLCBzY2FuRWRnZVJbMF0pOwogICAgICAgIEd1c3dhcChzY2FuRWRnZUxbMV0sIHNjYW5FZGdlUlsxXSk7CiAgICAgICAgR3Vzd2FwKHNjYW5MaW1pdE1hcExbMF0sIHNjYW5MaW1pdE1hcFJbMF0pOwogICAgICAgIEd1c3dhcChzY2FuTGltaXRNYXBMWzFdLCBzY2FuTGltaXRNYXBSWzFdKTsKICAgICAgICAvLyBGSVhNRSBJJ20gc3VyZSB0aGVyZSBpcyBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBjaGVjayB0aGlzLgogICAgICB9CgogICAgICAvLyBTYW1lIGdhbWU6IHdlIGNhbiBsaW5lYXJseSBpbnRlcnBvbGF0ZSB0aGUgY29sb3IgYmFzZWQgb24gdGhlCiAgICAgIC8vIGN1cnJlbnQgeSBjb29yZGluYXRlICh0aGF0J3MgY29ycmVjdCBmb3IgdHJpYW5nbGUKICAgICAgLy8gaW50ZXJwb2xhdGlvbiBkdWUgdG8gbGluZWFyaXR5LiBXZSBjb3VsZCBhbHNvIGhhdmUgZG9uZSBpdCBpbgogICAgICAvLyBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcywgYnV0IHRoYXQncyBzbGlnaHRseSBtb3JlIGludm9sdmVkKQogICAgICBzY2FuQ29sb3JNYXBMWzBdID0gKGNvbG9yW3NjYW5FZGdlTFsxXV0gLSBjb2xvcltzY2FuRWRnZUxbMF1dKSAvICh5W3NjYW5FZGdlTFsxXV0gLSB5W3NjYW5FZGdlTFswXV0pOwogICAgICBzY2FuQ29sb3JNYXBMWzFdID0gY29sb3Jbc2NhbkVkZ2VMWzBdXSAtIHlbc2NhbkVkZ2VMWzBdXSAqIHNjYW5Db2xvck1hcExbMF07CiAgICAgIHNjYW5Db2xvck1hcFJbMF0gPSAoY29sb3Jbc2NhbkVkZ2VSWzFdXSAtIGNvbG9yW3NjYW5FZGdlUlswXV0pIC8gKHlbc2NhbkVkZ2VSWzFdXSAtIHlbc2NhbkVkZ2VSWzBdXSk7CiAgICAgIHNjYW5Db2xvck1hcFJbMV0gPSBjb2xvcltzY2FuRWRnZVJbMF1dIC0geVtzY2FuRWRnZVJbMF1dICogc2NhbkNvbG9yTWFwUlswXTsKCiAgICAgIGhhc0Z1cnRoZXJTZWdtZW50ID0gKHlbMV0gPCB5WzJdKTsKICAgICAgc2NhbkxpbmVPZmYgPSB5WzBdICogcm93U2l6ZTsKCiAgICAgIGZvciAoaW50IFkgPSB5WzBdOyBZIDw9IHlbMl07ICsrWSwgc2NhbkxpbmVPZmYgKz0gcm93U2l6ZSkgewogICAgICAgIGlmIChoYXNGdXJ0aGVyU2VnbWVudCAmJiBZID09IHlbMV0pIHsKICAgICAgICAgIC8vIFNXRUVQIEVWRU5UOiB3ZSBlbmNvdW50ZXJlZCB0aGUgbmV4dCBzZWdtZW50LgogICAgICAgICAgLy8KICAgICAgICAgIC8vIHN3aXRjaCB0byBuZXh0IHNlZ21lbnQsIGVpdGhlciBhdCBsZWZ0IGVuZCBvciBhdCByaWdodAogICAgICAgICAgLy8gZW5kOgogICAgICAgICAgaWYgKHNjYW5FZGdlTFsxXSA9PSAxKSB7CiAgICAgICAgICAgIHNjYW5FZGdlTFswXSA9IDE7CiAgICAgICAgICAgIHNjYW5FZGdlTFsxXSA9IDI7CiAgICAgICAgICAgIHNjYW5MaW1pdE1hcExbMF0gPSBkb3VibGUoeFtzY2FuRWRnZUxbMV1dIC0geFtzY2FuRWRnZUxbMF1dKSAvICh5W3NjYW5FZGdlTFsxXV0gLSB5W3NjYW5FZGdlTFswXV0pOwogICAgICAgICAgICBzY2FuTGltaXRNYXBMWzFdID0geFtzY2FuRWRnZUxbMF1dIC0geVtzY2FuRWRnZUxbMF1dICogc2NhbkxpbWl0TWFwTFswXTsKCiAgICAgICAgICAgIHNjYW5Db2xvck1hcExbMF0gPSAoY29sb3Jbc2NhbkVkZ2VMWzFdXSAtIGNvbG9yW3NjYW5FZGdlTFswXV0pIC8gKHlbc2NhbkVkZ2VMWzFdXSAtIHlbc2NhbkVkZ2VMWzBdXSk7CiAgICAgICAgICAgIHNjYW5Db2xvck1hcExbMV0gPSBjb2xvcltzY2FuRWRnZUxbMF1dIC0geVtzY2FuRWRnZUxbMF1dICogc2NhbkNvbG9yTWFwTFswXTsKICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbkVkZ2VSWzFdID09IDEpIHsKICAgICAgICAgICAgc2NhbkVkZ2VSWzBdID0gMTsKICAgICAgICAgICAgc2NhbkVkZ2VSWzFdID0gMjsKICAgICAgICAgICAgc2NhbkxpbWl0TWFwUlswXSA9IGRvdWJsZSh4W3NjYW5FZGdlUlsxXV0gLSB4W3NjYW5FZGdlUlswXV0pIC8gKHlbc2NhbkVkZ2VSWzFdXSAtIHlbc2NhbkVkZ2VSWzBdXSk7CiAgICAgICAgICAgIHNjYW5MaW1pdE1hcFJbMV0gPSB4W3NjYW5FZGdlUlswXV0gLSB5W3NjYW5FZGdlUlswXV0gKiBzY2FuTGltaXRNYXBSWzBdOwoKICAgICAgICAgICAgc2NhbkNvbG9yTWFwUlswXSA9IChjb2xvcltzY2FuRWRnZVJbMV1dIC0gY29sb3Jbc2NhbkVkZ2VSWzBdXSkgLyAoeVtzY2FuRWRnZVJbMV1dIC0geVtzY2FuRWRnZVJbMF1dKTsKICAgICAgICAgICAgc2NhbkNvbG9yTWFwUlsxXSA9IGNvbG9yW3NjYW5FZGdlUlswXV0gLSB5W3NjYW5FZGdlUlswXV0gKiBzY2FuQ29sb3JNYXBSWzBdOwogICAgICAgICAgfQogICAgICAgICAgYXNzZXJ0KCB5W3NjYW5FZGdlTFswXV0gIDwgIHlbc2NhbkVkZ2VMWzFdXSApOwogICAgICAgICAgYXNzZXJ0KCB5W3NjYW5FZGdlUlswXV0gPCAgeVtzY2FuRWRnZVJbMV1dICk7CiAgICAgICAgICBoYXNGdXJ0aGVyU2VnbWVudCA9IGdGYWxzZTsKICAgICAgICB9CgogICAgICAgIHl0ID0gWTsKCiAgICAgICAgeGEgPSB5dCAqIHNjYW5MaW1pdE1hcExbMF0gKyBzY2FuTGltaXRNYXBMWzFdOwogICAgICAgIHh0ID0geXQgKiBzY2FuTGltaXRNYXBSWzBdICsgc2NhbkxpbWl0TWFwUlsxXTsKCiAgICAgICAgY2EgPSB5dCAqIHNjYW5Db2xvck1hcExbMF0gKyBzY2FuQ29sb3JNYXBMWzFdOwogICAgICAgIGN0ID0geXQgKiBzY2FuQ29sb3JNYXBSWzBdICsgc2NhbkNvbG9yTWFwUlsxXTsKCiAgICAgICAgc2NhbkxpbWl0TCA9IHNwbGFzaFJvdW5kKHhhKTsKICAgICAgICBzY2FuTGltaXRSID0gc3BsYXNoUm91bmQoeHQpOwoKICAgICAgICAvLyBPay4gTm93OiBpbml0IHRoZSBjb2xvciBpbnRlcnBvbGF0aW9uIGRlcGVuZGluZyBvbiB0aGUgWAogICAgICAgIC8vIGNvb3JkaW5hdGUgaW5zaWRlIG9mIHRoZSBjdXJyZW50IHNjYW5saW5lOgogICAgICAgIHNjYW5Db2xvck1hcFswXSA9IChzY2FuTGltaXRSID09IHNjYW5MaW1pdEwpID8gMC4gOiAoKGN0IC0gY2EpIC8gKHNjYW5MaW1pdFIgLSBzY2FuTGltaXRMKSk7CiAgICAgICAgc2NhbkNvbG9yTWFwWzFdID0gY2EgLSBzY2FuTGltaXRMICogc2NhbkNvbG9yTWFwWzBdOwoKICAgICAgICAvLyBoYW5kbGVkIGJ5IGNsaXBwaW5nOgogICAgICAgIC8vIGFzc2VydCggc2NhbkxpbWl0TCA+PSAwICYmIHNjYW5MaW1pdFIgPCBiaXRtYXAtPmdldFdpZHRoKCkgKTsKICAgICAgICBhc3NlcnQoc2NhbkxpbWl0TCA8PSBzY2FuTGltaXRSIHx8IGFicyhzY2FuTGltaXRMIC0gc2NhbkxpbWl0UikgPD0gMik7IC8vIGFsbG93IHJvdW5kaW5nIGluYWNjdXJhY2llcwogICAgICAgIGFzc2VydChzY2FuTGluZU9mZiA9PSBZICogcm93U2l6ZSk7CgogICAgICAgIGNvbG9yaW50ZXJwID0gc2NhbkNvbG9yTWFwWzBdICogc2NhbkxpbWl0TCArIHNjYW5Db2xvck1hcFsxXTsKCiAgICAgICAgYml0bWFwT2ZmID0gc2NhbkxpbmVPZmYgKyBzY2FuTGltaXRMICogY29sb3JDb21wczsKICAgICAgICBmb3IgKGludCBYID0gc2NhbkxpbWl0TDsgWCA8PSBzY2FuTGltaXRSOyArK1gsIGNvbG9yaW50ZXJwICs9IHNjYW5Db2xvck1hcFswXSwgYml0bWFwT2ZmICs9IGNvbG9yQ29tcHMpIHsKICAgICAgICAgIC8vIEZJWE1FIDogc3RhbmRhcmQgcmVjdGFuZ3VsYXIgY2xpcHBpbmcgY2FuIGJlIGRvbmUgZm9yIGEKICAgICAgICAgIC8vIGNvbXBsZXRlIHNjYW5saW5lIHdoaWNoIGlzIGZhc3RlcgogICAgICAgICAgLy8gLS0+IHNlZSBTcGxhc2hDbGlwIGFuZCBpdHMgbWV0aG9kcwogICAgICAgICAgaWYgKCFjbGlwLT50ZXN0KFgsIFkpKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICBhc3NlcnQoZmFicyhjb2xvcmludGVycCAtIChzY2FuQ29sb3JNYXBbMF0gKiBYICsgc2NhbkNvbG9yTWFwWzFdKSkgPCAxZS0xMCk7CiAgICAgICAgICBhc3NlcnQoYml0bWFwT2ZmID09IFkgKiByb3dTaXplICsgY29sb3JDb21wcyAqIFggJiYgc2NhbkxpbmVPZmYgPT0gWSAqIHJvd1NpemUpOwoKICAgICAgICAgIHNoYWRpbmctPmdldFBhcmFtZXRlcml6ZWRDb2xvcihjb2xvcmludGVycCwgYml0bWFwTW9kZSwgJmJpdG1hcERhdGFbYml0bWFwT2ZmXSk7CgogICAgICAgICAgLy8gbWFrZSB0aGUgc2hhZGluZyB2aXNpYmxlLgogICAgICAgICAgLy8gTm90ZSB0aGF0IG9wYWNpdHkgaXMgaGFuZGxlZCBieSB0aGUgYkRpcmVjdEJsaXQgc3R1ZmYsIHNlZQogICAgICAgICAgLy8gYWJvdmUgZm9yIGNvbW1lbnRzIGFuZCBiZWxvdyBmb3IgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBpZiAoaGFzQWxwaGEpCiAgICAgICAgICAgIGJpdG1hcEFscGhhW1kgKiBiaXRtYXBXaWR0aCArIFhdID0gMjU1OwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ0ZhbHNlOwogIH0KCiAgaWYgKCFiRGlyZWN0QmxpdCkgewogICAgLy8gb2suIEZpbmFsaXplIHRoZSBzdHVmZiBieSBibGl0dGluZyB0aGUgc2hhZGluZyBpbnRvIHRoZSBmaW5hbAogICAgLy8gZ2VvbWV0cnksIHRoaXMgdGltZSByZXNwZWN0aW5nIHRoZSByZW5kZXJpbmcgcGlwZS4KICAgIGludCBXID0gYmxpdFRhcmdldC0+Z2V0V2lkdGgoKTsKICAgIGludCBIID0gYmxpdFRhcmdldC0+Z2V0SGVpZ2h0KCk7CiAgICBjdXIgPSBjU3JjVmFsOwoKICAgIGZvciAoaW50IFggPSAwOyBYIDwgVzsgKytYKSB7CiAgICAgIGZvciAoaW50IFkgPSAwOyBZIDwgSDsgKytZKSB7CiAgICAgICAgaWYgKCFiaXRtYXBBbHBoYVtZICogYml0bWFwV2lkdGggKyBYXSkKICAgICAgICAgIGNvbnRpbnVlOyAvLyBkcmF3IG9ubHkgcGFydHMgb2YgdGhlIHNoYWRpbmchCiAgICAgICAgYml0bWFwT2ZmID0gWSAqIHJvd1NpemUgKyBjb2xvckNvbXBzICogWDsKCiAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBjb2xvckNvbXBzOyArK20pCiAgICAgICAgICBjdXJbbV0gPSBiaXRtYXBEYXRhW2JpdG1hcE9mZiArIG1dOwogICAgICAgIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgICAgICAgIGRyYXdBQVBpeGVsKCZwaXBlLCBYLCBZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZHJhd1BpeGVsKCZwaXBlLCBYLCBZLCBnVHJ1ZSk7IC8vIG5vIGNsaXBwaW5nIC0gaGFzIGFscmVhZHkgYmVlbiBkb25lLgogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGRlbGV0ZSBibGl0VGFyZ2V0OwogICAgYmxpdFRhcmdldCA9IE5VTEw7CiAgfQoKICByZXR1cm4gZ1RydWU7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6YmxpdFRyYW5zcGFyZW50KFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeFNyYywgaW50IHlTcmMsCgkJCQkgICAgaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCkgewogIFNwbGFzaENvbG9yUHRyIHAsIHNwOwogIEd1Y2hhciAqcTsKICBpbnQgeCwgeSwgbWFzazsKCiAgaWYgKHNyYy0+bW9kZSAhPSBiaXRtYXAtPm1vZGUpIHsKICAgIHJldHVybiBzcGxhc2hFcnJNb2RlTWlzbWF0Y2g7CiAgfQoKICBzd2l0Y2ggKGJpdG1hcC0+bW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgewogICAgICBwID0gJmJpdG1hcC0+ZGF0YVsoeURlc3QgKyB5KSAqIGJpdG1hcC0+cm93U2l6ZSArICh4RGVzdCA+PiAzKV07CiAgICAgIHNwID0gJnNyYy0+ZGF0YVsoeVNyYyArIHkpICogYml0bWFwLT5yb3dTaXplICsgKHhTcmMgPj4gMyldOwogICAgICBtYXNrID0gMHg4MCA+PiAoeERlc3QgJiA3KTsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJaWYgKHNwWzBdICYgKDB4ODAgPj4gKHggJiA3KSkpIHsKCSAgKnAgfD0gbWFzazsKCX0gZWxzZSB7CgkgICpwICY9IH5tYXNrOwoJfQoJaWYgKCEobWFzayA+Pj0gMSkpIHsKCSAgbWFzayA9IDB4ODA7CgkgICsrcDsKCSAgKytzcDsKCX0KICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CiAgICAgIHAgPSAmYml0bWFwLT5kYXRhWyh5RGVzdCArIHkpICogYml0bWFwLT5yb3dTaXplICsgeERlc3RdOwogICAgICBzcCA9ICZzcmMtPmRhdGFbKHlTcmMgKyB5KSAqIGJpdG1hcC0+cm93U2l6ZSArIHhTcmNdOwogICAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CgkqcCsrID0gKnNwKys7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyAzICogeERlc3RdOwogICAgICBzcCA9ICZzcmMtPmRhdGFbKHlTcmMgKyB5KSAqIHNyYy0+cm93U2l6ZSArIDMgKiB4U3JjXTsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyA0ICogeERlc3RdOwogICAgICBzcCA9ICZzcmMtPmRhdGFbKHlTcmMgKyB5KSAqIHNyYy0+cm93U2l6ZSArIDQgKiB4U3JjXTsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9IDI1NTsKCXNwKys7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyA0ICogeERlc3RdOwogICAgICBzcCA9ICZzcmMtPmRhdGFbKHlTcmMgKyB5KSAqIGJpdG1hcC0+cm93U2l6ZSArIDQgKiB4U3JjXTsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwogICAgICB9CiAgICB9CiAgICBicmVhazsKI2VuZGlmCiAgfQoKICBpZiAoYml0bWFwLT5hbHBoYSkgewogICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgewogICAgICBxID0gJmJpdG1hcC0+YWxwaGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPndpZHRoICsgeERlc3RdOwogICAgICBtZW1zZXQocSwgMHgwMCwgdyk7CiAgICB9CiAgfQoKICByZXR1cm4gc3BsYXNoT2s7Cn0KClNwbGFzaFBhdGggKlNwbGFzaDo6bWFrZVN0cm9rZVBhdGgoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZmxhdHRlbikgewogIFNwbGFzaFBhdGggKnBhdGhJbiwgKnBhdGhPdXQ7CiAgU3BsYXNoQ29vcmQgdywgZCwgZHgsIGR5LCB3ZHgsIHdkeSwgZHhOZXh0LCBkeU5leHQsIHdkeE5leHQsIHdkeU5leHQ7CiAgU3BsYXNoQ29vcmQgY3Jvc3Nwcm9kLCBkb3Rwcm9kLCBtaXRlciwgbTsKICBHQm9vbCBmaXJzdCwgbGFzdCwgY2xvc2VkOwogIGludCBzdWJwYXRoU3RhcnQsIG5leHQsIGk7CiAgaW50IGxlZnQwLCBsZWZ0MSwgbGVmdDIsIHJpZ2h0MCwgcmlnaHQxLCByaWdodDIsIGpvaW4wLCBqb2luMSwgam9pbjI7CiAgaW50IGxlZnRGaXJzdCwgcmlnaHRGaXJzdCwgZmlyc3RQdDsKCiAgaWYgKGZsYXR0ZW4pIHsKICAgIHBhdGhJbiA9IGZsYXR0ZW5QYXRoKHBhdGgsIHN0YXRlLT5tYXRyaXgsIHN0YXRlLT5mbGF0bmVzcyk7CiAgICBpZiAoc3RhdGUtPmxpbmVEYXNoTGVuZ3RoID4gMCkgewogICAgICBwYXRoT3V0ID0gbWFrZURhc2hlZFBhdGgocGF0aEluKTsKICAgICAgZGVsZXRlIHBhdGhJbjsKICAgICAgcGF0aEluID0gcGF0aE91dDsKICAgIH0KICB9IGVsc2UgewogICAgcGF0aEluID0gcGF0aDsKICB9CgogIHN1YnBhdGhTdGFydCA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CiAgY2xvc2VkID0gZ0ZhbHNlOyAvLyBtYWtlIGdjYyBoYXBweQogIGxlZnQwID0gbGVmdDEgPSByaWdodDAgPSByaWdodDEgPSBqb2luMCA9IGpvaW4xID0gMDsgLy8gbWFrZSBnY2MgaGFwcHkKICBsZWZ0Rmlyc3QgPSByaWdodEZpcnN0ID0gZmlyc3RQdCA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CgogIHBhdGhPdXQgPSBuZXcgU3BsYXNoUGF0aCgpOwogIHcgPSBzdGF0ZS0+bGluZVdpZHRoOwoKICBmb3IgKGkgPSAwOyBpIDwgcGF0aEluLT5sZW5ndGggLSAxOyArK2kpIHsKICAgIGlmIChwYXRoSW4tPmZsYWdzW2ldICYgc3BsYXNoUGF0aExhc3QpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoKGZpcnN0ID0gcGF0aEluLT5mbGFnc1tpXSAmIHNwbGFzaFBhdGhGaXJzdCkpIHsKICAgICAgc3VicGF0aFN0YXJ0ID0gaTsKICAgICAgY2xvc2VkID0gcGF0aEluLT5mbGFnc1tpXSAmIHNwbGFzaFBhdGhDbG9zZWQ7CiAgICB9CiAgICBsYXN0ID0gcGF0aEluLT5mbGFnc1tpKzFdICYgc3BsYXNoUGF0aExhc3Q7CgogICAgLy8gY29tcHV0ZSB0aGUgZGVsdGFzIGZvciBzZWdtZW50IChpLCBpKzEpCiAgICBkID0gc3BsYXNoRGlzdChwYXRoSW4tPnB0c1tpXS54LCBwYXRoSW4tPnB0c1tpXS55LAoJCSAgIHBhdGhJbi0+cHRzW2krMV0ueCwgcGF0aEluLT5wdHNbaSsxXS55KTsKICAgIGlmIChkID09IDApIHsKICAgICAgLy8gd2UgbmVlZCB0byBkcmF3IGVuZCBjYXBzIG9uIHplcm8tbGVuZ3RoIGxpbmVzCiAgICAgIC8vfiBub3QgY2xlYXIgd2hhdCB0aGUgYmVoYXZpb3Igc2hvdWxkIGJlIGZvciBzcGxhc2hMaW5lQ2FwQnV0dAogICAgICAvL34gICB3aXRoIGQ9PTAKICAgICAgZHggPSAwOwogICAgICBkeSA9IDE7CiAgICB9IGVsc2UgewogICAgICBkID0gKFNwbGFzaENvb3JkKTEgLyBkOwogICAgICBkeCA9IGQgKiAocGF0aEluLT5wdHNbaSsxXS54IC0gcGF0aEluLT5wdHNbaV0ueCk7CiAgICAgIGR5ID0gZCAqIChwYXRoSW4tPnB0c1tpKzFdLnkgLSBwYXRoSW4tPnB0c1tpXS55KTsKICAgIH0KICAgIHdkeCA9IChTcGxhc2hDb29yZCkwLjUgKiB3ICogZHg7CiAgICB3ZHkgPSAoU3BsYXNoQ29vcmQpMC41ICogdyAqIGR5OwoKICAgIC8vIGNvbXB1dGUgdGhlIGRlbHRhcyBmb3Igc2VnbWVudCAoaSsxLCBuZXh0KQogICAgbmV4dCA9IGxhc3QgPyBzdWJwYXRoU3RhcnQgKyAxIDogaSArIDI7CiAgICBkID0gc3BsYXNoRGlzdChwYXRoSW4tPnB0c1tpKzFdLngsIHBhdGhJbi0+cHRzW2krMV0ueSwKCQkgICBwYXRoSW4tPnB0c1tuZXh0XS54LCBwYXRoSW4tPnB0c1tuZXh0XS55KTsKICAgIGlmIChkID09IDApIHsKICAgICAgLy8gd2UgbmVlZCB0byBkcmF3IGVuZCBjYXBzIG9uIHplcm8tbGVuZ3RoIGxpbmVzCiAgICAgIC8vfiBub3QgY2xlYXIgd2hhdCB0aGUgYmVoYXZpb3Igc2hvdWxkIGJlIGZvciBzcGxhc2hMaW5lQ2FwQnV0dAogICAgICAvL34gICB3aXRoIGQ9PTAKICAgICAgZHhOZXh0ID0gMDsKICAgICAgZHlOZXh0ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGQgPSAoU3BsYXNoQ29vcmQpMSAvIGQ7CiAgICAgIGR4TmV4dCA9IGQgKiAocGF0aEluLT5wdHNbbmV4dF0ueCAtIHBhdGhJbi0+cHRzW2krMV0ueCk7CiAgICAgIGR5TmV4dCA9IGQgKiAocGF0aEluLT5wdHNbbmV4dF0ueSAtIHBhdGhJbi0+cHRzW2krMV0ueSk7CiAgICB9CiAgICB3ZHhOZXh0ID0gKFNwbGFzaENvb3JkKTAuNSAqIHcgKiBkeE5leHQ7CiAgICB3ZHlOZXh0ID0gKFNwbGFzaENvb3JkKTAuNSAqIHcgKiBkeU5leHQ7CgogICAgLy8gZHJhdyB0aGUgc3RhcnQgY2FwCiAgICBwYXRoT3V0LT5tb3ZlVG8ocGF0aEluLT5wdHNbaV0ueCAtIHdkeSwgcGF0aEluLT5wdHNbaV0ueSArIHdkeCk7CiAgICBpZiAoaSA9PSBzdWJwYXRoU3RhcnQpIHsKICAgICAgZmlyc3RQdCA9IHBhdGhPdXQtPmxlbmd0aCAtIDE7CiAgICB9CiAgICBpZiAoZmlyc3QgJiYgIWNsb3NlZCkgewogICAgICBzd2l0Y2ggKHN0YXRlLT5saW5lQ2FwKSB7CiAgICAgIGNhc2Ugc3BsYXNoTGluZUNhcEJ1dHQ6CglwYXRoT3V0LT5saW5lVG8ocGF0aEluLT5wdHNbaV0ueCArIHdkeSwgcGF0aEluLT5wdHNbaV0ueSAtIHdkeCk7CglicmVhazsKICAgICAgY2FzZSBzcGxhc2hMaW5lQ2FwUm91bmQ6CglwYXRoT3V0LT5jdXJ2ZVRvKHBhdGhJbi0+cHRzW2ldLnggLSB3ZHkgLSBiZXppZXJDaXJjbGUgKiB3ZHgsCgkJCSBwYXRoSW4tPnB0c1tpXS55ICsgd2R4IC0gYmV6aWVyQ2lyY2xlICogd2R5LAoJCQkgcGF0aEluLT5wdHNbaV0ueCAtIHdkeCAtIGJlemllckNpcmNsZSAqIHdkeSwKCQkJIHBhdGhJbi0+cHRzW2ldLnkgLSB3ZHkgKyBiZXppZXJDaXJjbGUgKiB3ZHgsCgkJCSBwYXRoSW4tPnB0c1tpXS54IC0gd2R4LAoJCQkgcGF0aEluLT5wdHNbaV0ueSAtIHdkeSk7CglwYXRoT3V0LT5jdXJ2ZVRvKHBhdGhJbi0+cHRzW2ldLnggLSB3ZHggKyBiZXppZXJDaXJjbGUgKiB3ZHksCgkJCSBwYXRoSW4tPnB0c1tpXS55IC0gd2R5IC0gYmV6aWVyQ2lyY2xlICogd2R4LAoJCQkgcGF0aEluLT5wdHNbaV0ueCArIHdkeSAtIGJlemllckNpcmNsZSAqIHdkeCwKCQkJIHBhdGhJbi0+cHRzW2ldLnkgLSB3ZHggLSBiZXppZXJDaXJjbGUgKiB3ZHksCgkJCSBwYXRoSW4tPnB0c1tpXS54ICsgd2R5LAoJCQkgcGF0aEluLT5wdHNbaV0ueSAtIHdkeCk7CglicmVhazsKICAgICAgY2FzZSBzcGxhc2hMaW5lQ2FwUHJvamVjdGluZzoKCXBhdGhPdXQtPmxpbmVUbyhwYXRoSW4tPnB0c1tpXS54IC0gd2R4IC0gd2R5LAoJCQlwYXRoSW4tPnB0c1tpXS55ICsgd2R4IC0gd2R5KTsKCXBhdGhPdXQtPmxpbmVUbyhwYXRoSW4tPnB0c1tpXS54IC0gd2R4ICsgd2R5LAoJCQlwYXRoSW4tPnB0c1tpXS55IC0gd2R4IC0gd2R5KTsKCXBhdGhPdXQtPmxpbmVUbyhwYXRoSW4tPnB0c1tpXS54ICsgd2R5LAoJCQlwYXRoSW4tPnB0c1tpXS55IC0gd2R4KTsKCWJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBwYXRoT3V0LT5saW5lVG8ocGF0aEluLT5wdHNbaV0ueCArIHdkeSwgcGF0aEluLT5wdHNbaV0ueSAtIHdkeCk7CiAgICB9CgogICAgLy8gZHJhdyB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWdtZW50IHJlY3RhbmdsZQogICAgbGVmdDIgPSBwYXRoT3V0LT5sZW5ndGggLSAxOwogICAgcGF0aE91dC0+bGluZVRvKHBhdGhJbi0+cHRzW2krMV0ueCArIHdkeSwgcGF0aEluLT5wdHNbaSsxXS55IC0gd2R4KTsKCiAgICAvLyBkcmF3IHRoZSBlbmQgY2FwCiAgICBpZiAobGFzdCAmJiAhY2xvc2VkKSB7CiAgICAgIHN3aXRjaCAoc3RhdGUtPmxpbmVDYXApIHsKICAgICAgY2FzZSBzcGxhc2hMaW5lQ2FwQnV0dDoKCXBhdGhPdXQtPmxpbmVUbyhwYXRoSW4tPnB0c1tpKzFdLnggLSB3ZHksIHBhdGhJbi0+cHRzW2krMV0ueSArIHdkeCk7CglicmVhazsKICAgICAgY2FzZSBzcGxhc2hMaW5lQ2FwUm91bmQ6CglwYXRoT3V0LT5jdXJ2ZVRvKHBhdGhJbi0+cHRzW2krMV0ueCArIHdkeSArIGJlemllckNpcmNsZSAqIHdkeCwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSAtIHdkeCArIGJlemllckNpcmNsZSAqIHdkeSwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueCArIHdkeCArIGJlemllckNpcmNsZSAqIHdkeSwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSArIHdkeSAtIGJlemllckNpcmNsZSAqIHdkeCwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueCArIHdkeCwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSArIHdkeSk7CglwYXRoT3V0LT5jdXJ2ZVRvKHBhdGhJbi0+cHRzW2krMV0ueCArIHdkeCAtIGJlemllckNpcmNsZSAqIHdkeSwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSArIHdkeSArIGJlemllckNpcmNsZSAqIHdkeCwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueCAtIHdkeSArIGJlemllckNpcmNsZSAqIHdkeCwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSArIHdkeCArIGJlemllckNpcmNsZSAqIHdkeSwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueCAtIHdkeSwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSArIHdkeCk7CglicmVhazsKICAgICAgY2FzZSBzcGxhc2hMaW5lQ2FwUHJvamVjdGluZzoKCXBhdGhPdXQtPmxpbmVUbyhwYXRoSW4tPnB0c1tpKzFdLnggKyB3ZHkgKyB3ZHgsCgkJCXBhdGhJbi0+cHRzW2krMV0ueSAtIHdkeCArIHdkeSk7CglwYXRoT3V0LT5saW5lVG8ocGF0aEluLT5wdHNbaSsxXS54IC0gd2R5ICsgd2R4LAoJCQlwYXRoSW4tPnB0c1tpKzFdLnkgKyB3ZHggKyB3ZHkpOwoJcGF0aE91dC0+bGluZVRvKHBhdGhJbi0+cHRzW2krMV0ueCAtIHdkeSwKCQkJcGF0aEluLT5wdHNbaSsxXS55ICsgd2R4KTsKCWJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBwYXRoT3V0LT5saW5lVG8ocGF0aEluLT5wdHNbaSsxXS54IC0gd2R5LCBwYXRoSW4tPnB0c1tpKzFdLnkgKyB3ZHgpOwogICAgfQoKICAgIC8vIGRyYXcgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNlZ21lbnQgcmVjdGFuZ2xlCiAgICByaWdodDIgPSBwYXRoT3V0LT5sZW5ndGggLSAxOwogICAgcGF0aE91dC0+Y2xvc2UoKTsKCiAgICAvLyBkcmF3IHRoZSBqb2luCiAgICBqb2luMiA9IHBhdGhPdXQtPmxlbmd0aDsKICAgIGlmICghbGFzdCB8fCBjbG9zZWQpIHsKICAgICAgY3Jvc3Nwcm9kID0gZHggKiBkeU5leHQgLSBkeSAqIGR4TmV4dDsKICAgICAgZG90cHJvZCA9IC0oZHggKiBkeE5leHQgKyBkeSAqIGR5TmV4dCk7CiAgICAgIGlmIChkb3Rwcm9kID4gMC45OTk5OSkgewoJLy8gYXZvaWQgYSBkaXZpZGUtYnktemVybyAtLSBzZXQgbWl0ZXIgdG8gc29tZXRoaW5nIGFyYml0cmFyeQoJLy8gc3VjaCB0aGF0IHNxcnQobWl0ZXIpIHdpbGwgZXhjZWVkIG1pdGVyTGltaXQgKGFuZCBtIGlzIG5ldmVyCgkvLyB1c2VkIGluIHRoYXQgc2l0dWF0aW9uKQoJbWl0ZXIgPSAoc3RhdGUtPm1pdGVyTGltaXQgKyAxKSAqIChzdGF0ZS0+bWl0ZXJMaW1pdCArIDEpOwoJbSA9IDA7CiAgICAgIH0gZWxzZSB7CgltaXRlciA9IChTcGxhc2hDb29yZCkyIC8gKChTcGxhc2hDb29yZCkxIC0gZG90cHJvZCk7CglpZiAobWl0ZXIgPCAxKSB7CgkgIC8vIHRoaXMgY2FuIGhhcHBlbiBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IGluYWNjdXJhY2llcwoJICBtaXRlciA9IDE7Cgl9CgltID0gc3BsYXNoU3FydChtaXRlciAtIDEpOwogICAgICB9CgogICAgICAvLyByb3VuZCBqb2luCiAgICAgIGlmIChzdGF0ZS0+bGluZUpvaW4gPT0gc3BsYXNoTGluZUpvaW5Sb3VuZCkgewoJcGF0aE91dC0+bW92ZVRvKHBhdGhJbi0+cHRzW2krMV0ueCArIChTcGxhc2hDb29yZCkwLjUgKiB3LAoJCQlwYXRoSW4tPnB0c1tpKzFdLnkpOwoJcGF0aE91dC0+Y3VydmVUbyhwYXRoSW4tPnB0c1tpKzFdLnggKyAoU3BsYXNoQ29vcmQpMC41ICogdywKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSArIGJlemllckNpcmNsZTIgKiB3LAoJCQkgcGF0aEluLT5wdHNbaSsxXS54ICsgYmV6aWVyQ2lyY2xlMiAqIHcsCgkJCSBwYXRoSW4tPnB0c1tpKzFdLnkgKyAoU3BsYXNoQ29vcmQpMC41ICogdywKCQkJIHBhdGhJbi0+cHRzW2krMV0ueCwKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSArIChTcGxhc2hDb29yZCkwLjUgKiB3KTsKCXBhdGhPdXQtPmN1cnZlVG8ocGF0aEluLT5wdHNbaSsxXS54IC0gYmV6aWVyQ2lyY2xlMiAqIHcsCgkJCSBwYXRoSW4tPnB0c1tpKzFdLnkgKyAoU3BsYXNoQ29vcmQpMC41ICogdywKCQkJIHBhdGhJbi0+cHRzW2krMV0ueCAtIChTcGxhc2hDb29yZCkwLjUgKiB3LAoJCQkgcGF0aEluLT5wdHNbaSsxXS55ICsgYmV6aWVyQ2lyY2xlMiAqIHcsCgkJCSBwYXRoSW4tPnB0c1tpKzFdLnggLSAoU3BsYXNoQ29vcmQpMC41ICogdywKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSk7CglwYXRoT3V0LT5jdXJ2ZVRvKHBhdGhJbi0+cHRzW2krMV0ueCAtIChTcGxhc2hDb29yZCkwLjUgKiB3LAoJCQkgcGF0aEluLT5wdHNbaSsxXS55IC0gYmV6aWVyQ2lyY2xlMiAqIHcsCgkJCSBwYXRoSW4tPnB0c1tpKzFdLnggLSBiZXppZXJDaXJjbGUyICogdywKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSAtIChTcGxhc2hDb29yZCkwLjUgKiB3LAoJCQkgcGF0aEluLT5wdHNbaSsxXS54LAoJCQkgcGF0aEluLT5wdHNbaSsxXS55IC0gKFNwbGFzaENvb3JkKTAuNSAqIHcpOwoJcGF0aE91dC0+Y3VydmVUbyhwYXRoSW4tPnB0c1tpKzFdLnggKyBiZXppZXJDaXJjbGUyICogdywKCQkJIHBhdGhJbi0+cHRzW2krMV0ueSAtIChTcGxhc2hDb29yZCkwLjUgKiB3LAoJCQkgcGF0aEluLT5wdHNbaSsxXS54ICsgKFNwbGFzaENvb3JkKTAuNSAqIHcsCgkJCSBwYXRoSW4tPnB0c1tpKzFdLnkgLSBiZXppZXJDaXJjbGUyICogdywKCQkJIHBhdGhJbi0+cHRzW2krMV0ueCArIChTcGxhc2hDb29yZCkwLjUgKiB3LAoJCQkgcGF0aEluLT5wdHNbaSsxXS55KTsKCiAgICAgIH0gZWxzZSB7CglwYXRoT3V0LT5tb3ZlVG8ocGF0aEluLT5wdHNbaSsxXS54LCBwYXRoSW4tPnB0c1tpKzFdLnkpOwoKCS8vIGFuZ2xlIDwgMTgwCglpZiAoY3Jvc3Nwcm9kIDwgMCkgewoJICBwYXRoT3V0LT5saW5lVG8ocGF0aEluLT5wdHNbaSsxXS54IC0gd2R5TmV4dCwKCQkJICBwYXRoSW4tPnB0c1tpKzFdLnkgKyB3ZHhOZXh0KTsKCSAgLy8gbWl0ZXIgam9pbiBpbnNpZGUgbGltaXQKCSAgaWYgKHN0YXRlLT5saW5lSm9pbiA9PSBzcGxhc2hMaW5lSm9pbk1pdGVyICYmCgkgICAgICBzcGxhc2hTcXJ0KG1pdGVyKSA8PSBzdGF0ZS0+bWl0ZXJMaW1pdCkgewoJICAgIHBhdGhPdXQtPmxpbmVUbyhwYXRoSW4tPnB0c1tpKzFdLnggLSB3ZHkgKyB3ZHggKiBtLAoJCQkgICAgcGF0aEluLT5wdHNbaSsxXS55ICsgd2R4ICsgd2R5ICogbSk7CgkgICAgcGF0aE91dC0+bGluZVRvKHBhdGhJbi0+cHRzW2krMV0ueCAtIHdkeSwKCQkJICAgIHBhdGhJbi0+cHRzW2krMV0ueSArIHdkeCk7CgkgIC8vIGJldmVsIGpvaW4gb3IgbWl0ZXIgam9pbiBvdXRzaWRlIGxpbWl0CgkgIH0gZWxzZSB7CgkgICAgcGF0aE91dC0+bGluZVRvKHBhdGhJbi0+cHRzW2krMV0ueCAtIHdkeSwgcGF0aEluLT5wdHNbaSsxXS55ICsgd2R4KTsKCSAgfQoKCS8vIGFuZ2xlID49IDE4MAoJfSBlbHNlIHsKCSAgcGF0aE91dC0+bGluZVRvKHBhdGhJbi0+cHRzW2krMV0ueCArIHdkeSwKCQkJICBwYXRoSW4tPnB0c1tpKzFdLnkgLSB3ZHgpOwoJICAvLyBtaXRlciBqb2luIGluc2lkZSBsaW1pdAoJICBpZiAoc3RhdGUtPmxpbmVKb2luID09IHNwbGFzaExpbmVKb2luTWl0ZXIgJiYKCSAgICAgIHNwbGFzaFNxcnQobWl0ZXIpIDw9IHN0YXRlLT5taXRlckxpbWl0KSB7CgkgICAgcGF0aE91dC0+bGluZVRvKHBhdGhJbi0+cHRzW2krMV0ueCArIHdkeSArIHdkeCAqIG0sCgkJCSAgICBwYXRoSW4tPnB0c1tpKzFdLnkgLSB3ZHggKyB3ZHkgKiBtKTsKCSAgICBwYXRoT3V0LT5saW5lVG8ocGF0aEluLT5wdHNbaSsxXS54ICsgd2R5TmV4dCwKCQkJICAgIHBhdGhJbi0+cHRzW2krMV0ueSAtIHdkeE5leHQpOwoJICAvLyBiZXZlbCBqb2luIG9yIG1pdGVyIGpvaW4gb3V0c2lkZSBsaW1pdAoJICB9IGVsc2UgewoJICAgIHBhdGhPdXQtPmxpbmVUbyhwYXRoSW4tPnB0c1tpKzFdLnggKyB3ZHlOZXh0LAoJCQkgICAgcGF0aEluLT5wdHNbaSsxXS55IC0gd2R4TmV4dCk7CgkgIH0KCX0KICAgICAgfQoKICAgICAgcGF0aE91dC0+Y2xvc2UoKTsKICAgIH0KCiAgICAvLyBhZGQgc3Ryb2tlIGFkanVzdG1lbnQgaGludHMKICAgIGlmIChzdGF0ZS0+c3Ryb2tlQWRqdXN0KSB7CiAgICAgIGlmIChpID49IHN1YnBhdGhTdGFydCArIDEpIHsKCWlmIChpID49IHN1YnBhdGhTdGFydCArIDIpIHsKCSAgcGF0aE91dC0+YWRkU3Ryb2tlQWRqdXN0SGludChsZWZ0MSwgcmlnaHQxLCBsZWZ0MCArIDEsIHJpZ2h0MCk7CgkgIHBhdGhPdXQtPmFkZFN0cm9rZUFkanVzdEhpbnQobGVmdDEsIHJpZ2h0MSwgam9pbjAsIGxlZnQyKTsKCX0gZWxzZSB7CgkgIHBhdGhPdXQtPmFkZFN0cm9rZUFkanVzdEhpbnQobGVmdDEsIHJpZ2h0MSwgZmlyc3RQdCwgbGVmdDIpOwoJfQoJcGF0aE91dC0+YWRkU3Ryb2tlQWRqdXN0SGludChsZWZ0MSwgcmlnaHQxLCByaWdodDIgKyAxLCByaWdodDIgKyAxKTsKICAgICAgfQogICAgICBsZWZ0MCA9IGxlZnQxOwogICAgICBsZWZ0MSA9IGxlZnQyOwogICAgICByaWdodDAgPSByaWdodDE7CiAgICAgIHJpZ2h0MSA9IHJpZ2h0MjsKICAgICAgam9pbjAgPSBqb2luMTsKICAgICAgam9pbjEgPSBqb2luMjsKICAgICAgaWYgKGkgPT0gc3VicGF0aFN0YXJ0KSB7CglsZWZ0Rmlyc3QgPSBsZWZ0MjsKCXJpZ2h0Rmlyc3QgPSByaWdodDI7CiAgICAgIH0KICAgICAgaWYgKGxhc3QpIHsKCWlmIChpID49IHN1YnBhdGhTdGFydCArIDIpIHsKCSAgcGF0aE91dC0+YWRkU3Ryb2tlQWRqdXN0SGludChsZWZ0MSwgcmlnaHQxLCBsZWZ0MCArIDEsIHJpZ2h0MCk7CgkgIHBhdGhPdXQtPmFkZFN0cm9rZUFkanVzdEhpbnQobGVmdDEsIHJpZ2h0MSwKCQkJCSAgICAgICBqb2luMCwgcGF0aE91dC0+bGVuZ3RoIC0gMSk7Cgl9IGVsc2UgewoJICBwYXRoT3V0LT5hZGRTdHJva2VBZGp1c3RIaW50KGxlZnQxLCByaWdodDEsCgkJCQkgICAgICAgZmlyc3RQdCwgcGF0aE91dC0+bGVuZ3RoIC0gMSk7Cgl9CglpZiAoY2xvc2VkKSB7CgkgIHBhdGhPdXQtPmFkZFN0cm9rZUFkanVzdEhpbnQobGVmdDEsIHJpZ2h0MSwgZmlyc3RQdCwgbGVmdEZpcnN0KTsKCSAgcGF0aE91dC0+YWRkU3Ryb2tlQWRqdXN0SGludChsZWZ0MSwgcmlnaHQxLAoJCQkJICAgICAgIHJpZ2h0Rmlyc3QgKyAxLCByaWdodEZpcnN0ICsgMSk7CgkgIHBhdGhPdXQtPmFkZFN0cm9rZUFkanVzdEhpbnQobGVmdEZpcnN0LCByaWdodEZpcnN0LAoJCQkJICAgICAgIGxlZnQxICsgMSwgcmlnaHQxKTsKCSAgcGF0aE91dC0+YWRkU3Ryb2tlQWRqdXN0SGludChsZWZ0Rmlyc3QsIHJpZ2h0Rmlyc3QsCgkJCQkgICAgICAgam9pbjEsIHBhdGhPdXQtPmxlbmd0aCAtIDEpOwoJfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAocGF0aEluICE9IHBhdGgpIHsKICAgIGRlbGV0ZSBwYXRoSW47CiAgfQoKICByZXR1cm4gcGF0aE91dDsKfQoKdm9pZCBTcGxhc2g6OmR1bXBQYXRoKFNwbGFzaFBhdGggKnBhdGgpIHsKICBpbnQgaTsKCiAgZm9yIChpID0gMDsgaSA8IHBhdGgtPmxlbmd0aDsgKytpKSB7CiAgICBwcmludGYoIiAgJTNkOiB4PSU4LjJmIHk9JTguMmYlcyVzJXMlc1xuIiwKCSAgIGksIChkb3VibGUpcGF0aC0+cHRzW2ldLngsIChkb3VibGUpcGF0aC0+cHRzW2ldLnksCgkgICAocGF0aC0+ZmxhZ3NbaV0gJiBzcGxhc2hQYXRoRmlyc3QpID8gIiBmaXJzdCIgOiAiIiwKCSAgIChwYXRoLT5mbGFnc1tpXSAmIHNwbGFzaFBhdGhMYXN0KSA/ICIgbGFzdCIgOiAiIiwKCSAgIChwYXRoLT5mbGFnc1tpXSAmIHNwbGFzaFBhdGhDbG9zZWQpID8gIiBjbG9zZWQiIDogIiIsCgkgICAocGF0aC0+ZmxhZ3NbaV0gJiBzcGxhc2hQYXRoQ3VydmUpID8gIiBjdXJ2ZSIgOiAiIik7CiAgfQp9Cgp2b2lkIFNwbGFzaDo6ZHVtcFhQYXRoKFNwbGFzaFhQYXRoICpwYXRoKSB7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBwYXRoLT5sZW5ndGg7ICsraSkgewogICAgcHJpbnRmKCIgICU0ZDogeDA9JTguMmYgeTA9JTguMmYgeDE9JTguMmYgeTE9JTguMmYgJXMlcyVzJXMlcyVzJXNcbiIsCgkgICBpLCAoZG91YmxlKXBhdGgtPnNlZ3NbaV0ueDAsIChkb3VibGUpcGF0aC0+c2Vnc1tpXS55MCwKCSAgIChkb3VibGUpcGF0aC0+c2Vnc1tpXS54MSwgKGRvdWJsZSlwYXRoLT5zZWdzW2ldLnkxLAoJICAgKHBhdGgtPnNlZ3NbaV0uZmxhZ3MJJiBzcGxhc2hYUGF0aEZpcnN0KSA/ICJGIiA6ICIgIiwKCSAgIChwYXRoLT5zZWdzW2ldLmZsYWdzCSYgc3BsYXNoWFBhdGhMYXN0KSA/ICJMIiA6ICIgIiwKCSAgIChwYXRoLT5zZWdzW2ldLmZsYWdzCSYgc3BsYXNoWFBhdGhFbmQwKSA/ICIwIiA6ICIgIiwKCSAgIChwYXRoLT5zZWdzW2ldLmZsYWdzCSYgc3BsYXNoWFBhdGhFbmQxKSA/ICIxIiA6ICIgIiwKCSAgIChwYXRoLT5zZWdzW2ldLmZsYWdzCSYgc3BsYXNoWFBhdGhIb3JpeikgPyAiSCIgOiAiICIsCgkgICAocGF0aC0+c2Vnc1tpXS5mbGFncwkmIHNwbGFzaFhQYXRoVmVydCkgPyAiViIgOiAiICIsCgkgICAocGF0aC0+c2Vnc1tpXS5mbGFncwkmIHNwbGFzaFhQYXRoRmxpcCkgPyAiUCIgOiAiICIpOwogIH0KfQoKU3BsYXNoRXJyb3IgU3BsYXNoOjpzaGFkZWRGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGhhc0JCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuKSB7CiAgU3BsYXNoUGlwZSBwaXBlOwogIFNwbGFzaFhQYXRoICp4UGF0aDsKICBTcGxhc2hYUGF0aFNjYW5uZXIgKnNjYW5uZXI7CiAgaW50IHhNaW5JLCB5TWluSSwgeE1heEksIHlNYXhJLCB4MCwgeDEsIHk7CiAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzOwoKICBpZiAodmVjdG9yQW50aWFsaWFzICYmIGFhQnVmID09IE5VTEwpIHsgLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCB0byBiZSBzZWN1cmUKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KICBpZiAocGF0aC0+bGVuZ3RoID09IDApIHsKICAgIHJldHVybiBzcGxhc2hFcnJFbXB0eVBhdGg7CiAgfQogIHhQYXRoID0gbmV3IFNwbGFzaFhQYXRoKHBhdGgsIHN0YXRlLT5tYXRyaXgsIHN0YXRlLT5mbGF0bmVzcywgZ1RydWUpOwogIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgIHhQYXRoLT5hYVNjYWxlKCk7CiAgfQogIHhQYXRoLT5zb3J0KCk7CiAgc2Nhbm5lciA9IG5ldyBTcGxhc2hYUGF0aFNjYW5uZXIoeFBhdGgsIGdGYWxzZSk7CgogIC8vIGdldCB0aGUgbWluIGFuZCBtYXggeCBhbmQgeSB2YWx1ZXMKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBzY2FubmVyLT5nZXRCQm94QUEoJnhNaW5JLCAmeU1pbkksICZ4TWF4SSwgJnlNYXhJKTsKICB9IGVsc2UgewogICAgc2Nhbm5lci0+Z2V0QkJveCgmeE1pbkksICZ5TWluSSwgJnhNYXhJLCAmeU1heEkpOwogIH0KCiAgLy8gY2hlY2sgY2xpcHBpbmcKICBpZiAoKGNsaXBSZXMgPSBzdGF0ZS0+Y2xpcC0+dGVzdFJlY3QoeE1pbkksIHlNaW5JLCB4TWF4SSwgeU1heEkpKSAhPSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewogICAgLy8gbGltaXQgdGhlIHkgcmFuZ2UKICAgIGlmICh5TWluSSA8IHN0YXRlLT5jbGlwLT5nZXRZTWluSSgpKSB7CiAgICAgIHlNaW5JID0gc3RhdGUtPmNsaXAtPmdldFlNaW5JKCk7CiAgICB9CiAgICBpZiAoeU1heEkgPiBzdGF0ZS0+Y2xpcC0+Z2V0WU1heEkoKSkgewogICAgICB5TWF4SSA9IHN0YXRlLT5jbGlwLT5nZXRZTWF4SSgpOwogICAgfQoKICAgIHBpcGVJbml0KCZwaXBlLCAwLCB5TWluSSwgcGF0dGVybiwgTlVMTCwgc3RhdGUtPmZpbGxBbHBoYSwgdmVjdG9yQW50aWFsaWFzICYmICFoYXNCQm94LCBnRmFsc2UpOwoKICAgIC8vIGRyYXcgdGhlIHNwYW5zCiAgICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICAgIGZvciAoeSA9IHlNaW5JOyB5IDw9IHlNYXhJOyArK3kpIHsKICAgICAgICBzY2FubmVyLT5yZW5kZXJBQUxpbmUoYWFCdWYsICZ4MCwgJngxLCB5KTsKICAgICAgICBpZiAoY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CiAgICAgICAgICBzdGF0ZS0+Y2xpcC0+Y2xpcEFBTGluZShhYUJ1ZiwgJngwLCAmeDEsIHkpOwogICAgICAgIH0KI2lmIHNwbGFzaEFBU2l6ZSA9PSA0CiAgICAgICAgaWYgKCFoYXNCQm94ICYmIHkgPiB5TWluSSAmJiB5IDwgeU1heEkpIHsKICAgICAgICAgIC8vIGNvcnJlY3Qgc2hhcGUgb24gbGVmdCBzaWRlIGlmIGNsaXAgaXMKICAgICAgICAgIC8vIHZlcnRpY2FsIHRocm91Z2ggdGhlIG1pZGRsZSBvZiBzaGFkaW5nOgogICAgICAgICAgR3VjaGFyICpwMCwgKnAxLCAqcDIsICpwMzsKICAgICAgICAgIEd1Y2hhciBjMSwgYzIsIGMzLCBjNDsKICAgICAgICAgIHAwID0gYWFCdWYtPmdldERhdGFQdHIoKSArICh4MCA+PiAxKTsKICAgICAgICAgIHAxID0gcDAgKyBhYUJ1Zi0+Z2V0Um93U2l6ZSgpOwogICAgICAgICAgcDIgPSBwMSArIGFhQnVmLT5nZXRSb3dTaXplKCk7CiAgICAgICAgICBwMyA9IHAyICsgYWFCdWYtPmdldFJvd1NpemUoKTsKICAgICAgICAgIGlmICh4MCAmIDEpIHsKICAgICAgICAgICBjMSA9ICgqcDAgJiAweDBmKTsgYzIgPSgqcDEgJiAweDBmKTsgYzMgPSAoKnAyICYgMHgwZikgOyBjNCA9ICgqcDMgJiAweDBmKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGMxID0gKCpwMCA+PiA0KTsgYzIgPSAoKnAxID4+IDQpOyBjMyA9ICgqcDIgPj4gNCk7IGM0ID0gKCpwMyA+PiA0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICggKGMxICYgMHgwMykgPT0gMHgwMyAmJiAoYzIgJiAweDAzKSA9PSAweDAzICYmIChjMyAmIDB4MDMpID09IDB4MDMgJiYgKGM0ICYgMHgwMykgPT0gMHgwMwogICAgICAgICAgICAmJiBjMSA9PSBjMiAmJiBjMiA9PSBjMyAmJiBjMyA9PSBjNCAmJgogICAgICAgICAgICBwYXR0ZXJuLT50ZXN0UG9zaXRpb24oeDAgLSAxLCB5KSApCiAgICAgICAgICB7CiAgICAgICAgICAgIEd1Y2hhciBzaGFwZUNvcnJlY3Rpb24gPSAoeDAgJiAxKSA/IDB4MGYgOiAweGYwOwogICAgICAgICAgICAqcDAgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgICAqcDEgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgICAqcDIgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgICAqcDMgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgfQogICAgICAgICAgLy8gY29ycmVjdCBzaGFwZSBvbiByaWdodCBzaWRlIGlmIGNsaXAgaXMKICAgICAgICAgIC8vIHRocm91Z2ggdGhlIG1pZGRsZSBvZiBzaGFkaW5nOgogICAgICAgICAgcDAgPSBhYUJ1Zi0+Z2V0RGF0YVB0cigpICsgKHgxID4+IDEpOwogICAgICAgICAgcDEgPSBwMCArIGFhQnVmLT5nZXRSb3dTaXplKCk7CiAgICAgICAgICBwMiA9IHAxICsgYWFCdWYtPmdldFJvd1NpemUoKTsKICAgICAgICAgIHAzID0gcDIgKyBhYUJ1Zi0+Z2V0Um93U2l6ZSgpOwogICAgICAgICAgaWYgKHgxICYgMSkgewogICAgICAgICAgICBjMSA9ICgqcDAgJiAweDBmKTsgYzIgPSgqcDEgJiAweDBmKTsgYzMgPSAoKnAyICYgMHgwZikgOyBjNCA9ICgqcDMgJiAweDBmKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGMxID0gKCpwMCA+PiA0KTsgYzIgPSAoKnAxID4+IDQpOyBjMyA9ICgqcDIgPj4gNCk7IGM0ID0gKCpwMyA+PiA0KTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIChjMSAmIDB4YykgPT0gMHgwYyAmJiAoYzIgJiAweDBjKSA9PSAweDBjICYmIChjMyAmIDB4MGMpID09IDB4MGMgJiYgKGM0ICYgMHgwYykgPT0gMHgwYwogICAgICAgICAgICAmJiBjMSA9PSBjMiAmJiBjMiA9PSBjMyAmJiBjMyA9PSBjNCAmJgogICAgICAgICAgICBwYXR0ZXJuLT50ZXN0UG9zaXRpb24oeDEgKyAxLCB5KSApCiAgICAgICAgICB7CiAgICAgICAgICAgIEd1Y2hhciBzaGFwZUNvcnJlY3Rpb24gPSAoeDEgJiAxKSA/IDB4MGYgOiAweGYwOwogICAgICAgICAgICAqcDAgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgICAqcDEgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgICAqcDIgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgICAqcDMgfD0gc2hhcGVDb3JyZWN0aW9uOwogICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiAgICAgICAgZHJhd0FBTGluZSgmcGlwZSwgeDAsIHgxLCB5KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzMjsKICAgICAgZm9yICh5ID0geU1pbkk7IHkgPD0geU1heEk7ICsreSkgewogICAgICAgIHdoaWxlIChzY2FubmVyLT5nZXROZXh0U3Bhbih5LCAmeDAsICZ4MSkpIHsKICAgICAgICAgIGlmIChjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKICAgICAgICAgICAgZHJhd1NwYW4oJnBpcGUsIHgwLCB4MSwgeSwgZ1RydWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gbGltaXQgdGhlIHggcmFuZ2UKICAgICAgICAgICAgaWYgKHgwIDwgc3RhdGUtPmNsaXAtPmdldFhNaW5JKCkpIHsKICAgICAgICAgICAgICB4MCA9IHN0YXRlLT5jbGlwLT5nZXRYTWluSSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh4MSA+IHN0YXRlLT5jbGlwLT5nZXRYTWF4SSgpKSB7CiAgICAgICAgICAgICAgeDEgPSBzdGF0ZS0+Y2xpcC0+Z2V0WE1heEkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbGlwUmVzMiA9IHN0YXRlLT5jbGlwLT50ZXN0U3Bhbih4MCwgeDEsIHkpOwogICAgICAgICAgICBkcmF3U3BhbigmcGlwZSwgeDAsIHgxLCB5LCBjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgb3BDbGlwUmVzID0gY2xpcFJlczsKCiAgZGVsZXRlIHNjYW5uZXI7CiAgZGVsZXRlIHhQYXRoOwogIHJldHVybiBzcGxhc2hPazsKfQo=