Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmNjCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwNSBNYXJjbyBQZXNlbnRpIEdyaXR0aSA8bXBnQHJlZGhhdC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBUaG9tYXMgRnJlaXRhZyA8VGhvbWFzLkZyZWl0YWdAYWxmYS5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGltcGxlbWVudGF0aW9uCiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgImdvby9Hb29MaWtlbHkuaCIKI2luY2x1ZGUgInBvcHBsZXIvRXJyb3IuaCIKI2luY2x1ZGUgIlNwbGFzaEVycm9yQ29kZXMuaCIKI2luY2x1ZGUgIlNwbGFzaE1hdGguaCIKI2luY2x1ZGUgIlNwbGFzaEJpdG1hcC5oIgojaW5jbHVkZSAiU3BsYXNoU3RhdGUuaCIKI2luY2x1ZGUgIlNwbGFzaFBhdGguaCIKI2luY2x1ZGUgIlNwbGFzaFhQYXRoLmgiCiNpbmNsdWRlICJTcGxhc2hYUGF0aFNjYW5uZXIuaCIKI2luY2x1ZGUgIlNwbGFzaFBhdHRlcm4uaCIKI2luY2x1ZGUgIlNwbGFzaFNjcmVlbi5oIgojaW5jbHVkZSAiU3BsYXNoRm9udC5oIgojaW5jbHVkZSAiU3BsYXNoR2x5cGhCaXRtYXAuaCIKI2luY2x1ZGUgIlNwbGFzaC5oIgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIGRpc3RhbmNlIG9mIEJlemllciBjb250cm9sIHBvaW50IGZyb20gY2VudGVyIGZvciBjaXJjbGUgYXBwcm94aW1hdGlvbgovLyA9ICg0ICogKHNxcnQoMikgLSAxKSAvIDMpICogcgojZGVmaW5lIGJlemllckNpcmNsZSAoKFNwbGFzaENvb3JkKTAuNTUyMjg0NzUpCiNkZWZpbmUgYmV6aWVyQ2lyY2xlMiAoKFNwbGFzaENvb3JkKSgwLjUgKiAwLjU1MjI4NDc1KSkKCi8vIERpdmlkZSBhIDE2LWJpdCB2YWx1ZSAoaW4gWzAsIDI1NSoyNTVdKSBieSAyNTUsIHJldHVybmluZyBhbiA4LWJpdCByZXN1bHQuCnN0YXRpYyBpbmxpbmUgR3VjaGFyIGRpdjI1NShpbnQgeCkgewogIHJldHVybiAoR3VjaGFyKSgoeCArICh4ID4+IDgpICsgMHg4MCkgPj4gOCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmlubGluZSB2b2lkIEd1c3dhcCggVCZhLCBUJmIgKSB7IFQgdG1wID0gYTsgYT1iOyBiPXRtcDsgfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoUGlwZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2RlZmluZSBzcGxhc2hQaXBlTWF4U3RhZ2VzIDkKCnN0cnVjdCBTcGxhc2hQaXBlIHsKICAvLyBwaXhlbCBjb29yZGluYXRlcwogIGludCB4LCB5OwoKICAvLyBzb3VyY2UgcGF0dGVybgogIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm47CgogIC8vIHNvdXJjZSBhbHBoYSBhbmQgY29sb3IKICBTcGxhc2hDb29yZCBhSW5wdXQ7CiAgR0Jvb2wgdXNlc1NoYXBlOwogIEd1Y2hhciBhU3JjOwogIFNwbGFzaENvbG9yUHRyIGNTcmM7CiAgU3BsYXNoQ29sb3IgY1NyY1ZhbDsKCiAgLy8gbm9uLWlzb2xhdGVkIGdyb3VwIGFscGhhMAogIEd1Y2hhciAqYWxwaGEwUHRyOwoKICAvLyBzb2Z0IG1hc2sKICBTcGxhc2hDb2xvclB0ciBzb2Z0TWFza1B0cjsKCiAgLy8gZGVzdGluYXRpb24gYWxwaGEgYW5kIGNvbG9yCiAgU3BsYXNoQ29sb3JQdHIgZGVzdENvbG9yUHRyOwogIGludCBkZXN0Q29sb3JNYXNrOwogIEd1Y2hhciAqZGVzdEFscGhhUHRyOwoKICAvLyBzaGFwZQogIFNwbGFzaENvb3JkIHNoYXBlOwoKICAvLyByZXN1bHQgYWxwaGEgYW5kIGNvbG9yCiAgR0Jvb2wgbm9UcmFuc3BhcmVuY3k7CiAgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCByZXN1bHRDb2xvckN0cmw7CgogIC8vIG5vbi1pc29sYXRlZCBncm91cCBjb3JyZWN0aW9uCiAgaW50IG5vbklzb2xhdGVkR3JvdXA7Cn07CgpTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIFNwbGFzaDo6cGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kW10gPSB7CiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRSR0IsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kUkdCCiNpZiBTUExBU0hfQ01ZSwogICwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLCiNlbmRpZgp9OwoKU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBTcGxhc2g6OnBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFtdID0gewogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRSR0IsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kUkdCLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFJHQgojaWYgU1BMQVNIX0NNWUsKICAsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kQ01ZSwojZW5kaWYKfTsKClNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgU3BsYXNoOjpwaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kW10gPSB7CiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRSR0IsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFJHQgojaWYgU1BMQVNIX0NNWUsKICAsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZENNWUsKI2VuZGlmCn07CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHZvaWQgYmxlbmRYb3IoU3BsYXNoQ29sb3JQdHIgc3JjLCBTcGxhc2hDb2xvclB0ciBkZXN0LAoJCSAgICAgU3BsYXNoQ29sb3JQdHIgYmxlbmQsIFNwbGFzaENvbG9yTW9kZSBjbSkgewogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgc3BsYXNoQ29sb3JNb2RlTkNvbXBzW2NtXTsgKytpKSB7CiAgICBibGVuZFtpXSA9IHNyY1tpXSBeIGRlc3RbaV07CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBtb2RpZmllZCByZWdpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgU3BsYXNoOjpjbGVhck1vZFJlZ2lvbigpIHsKICBtb2RYTWluID0gYml0bWFwLT5nZXRXaWR0aCgpOwogIG1vZFlNaW4gPSBiaXRtYXAtPmdldEhlaWdodCgpOwogIG1vZFhNYXggPSAtMTsKICBtb2RZTWF4ID0gLTE7Cn0KCmlubGluZSB2b2lkIFNwbGFzaDo6dXBkYXRlTW9kWChpbnQgeCkgewogIGlmICh4IDwgbW9kWE1pbikgewogICAgbW9kWE1pbiA9IHg7CiAgfQogIGlmICh4ID4gbW9kWE1heCkgewogICAgbW9kWE1heCA9IHg7CiAgfQp9CgppbmxpbmUgdm9pZCBTcGxhc2g6OnVwZGF0ZU1vZFkoaW50IHkpIHsKICBpZiAoeSA8IG1vZFlNaW4pIHsKICAgIG1vZFlNaW4gPSB5OwogIH0KICBpZiAoeSA+IG1vZFlNYXgpIHsKICAgIG1vZFlNYXggPSB5OwogIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gcGlwZWxpbmUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlubGluZSB2b2lkIFNwbGFzaDo6cGlwZUluaXQoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5LAoJCQkgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4sIFNwbGFzaENvbG9yUHRyIGNTcmMsCgkJCSAgICAgU3BsYXNoQ29vcmQgYUlucHV0LCBHQm9vbCB1c2VzU2hhcGUsCgkJCSAgICAgR0Jvb2wgbm9uSXNvbGF0ZWRHcm91cCkgewogIHBpcGVTZXRYWShwaXBlLCB4LCB5KTsKICBwaXBlLT5wYXR0ZXJuID0gTlVMTDsKCiAgLy8gc291cmNlIGNvbG9yCiAgaWYgKHBhdHRlcm4pIHsKICAgIGlmIChwYXR0ZXJuLT5pc1N0YXRpYygpKSB7CiAgICAgIHBhdHRlcm4tPmdldENvbG9yKHgsIHksIHBpcGUtPmNTcmNWYWwpOwogICAgfSBlbHNlIHsKICAgICAgcGlwZS0+cGF0dGVybiA9IHBhdHRlcm47CiAgICB9CiAgICBwaXBlLT5jU3JjID0gcGlwZS0+Y1NyY1ZhbDsKICB9IGVsc2UgewogICAgcGlwZS0+Y1NyYyA9IGNTcmM7CiAgfQoKICAvLyBzb3VyY2UgYWxwaGEKICBwaXBlLT5hSW5wdXQgPSBhSW5wdXQ7CiAgaWYgKCFzdGF0ZS0+c29mdE1hc2spIHsKICAgIGlmICh1c2VzU2hhcGUpIHsKICAgICAgcGlwZS0+YUlucHV0ICo9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHBpcGUtPmFTcmMgPSAoR3VjaGFyKXNwbGFzaFJvdW5kKHBpcGUtPmFJbnB1dCAqIDI1NSk7CiAgICB9CiAgfQogIHBpcGUtPnVzZXNTaGFwZSA9IHVzZXNTaGFwZTsKCiAgLy8gcmVzdWx0IGFscGhhCiAgaWYgKGFJbnB1dCA9PSAxICYmICFzdGF0ZS0+c29mdE1hc2sgJiYgIXVzZXNTaGFwZSAmJgogICAgICAhc3RhdGUtPmluTm9uSXNvbGF0ZWRHcm91cCkgewogICAgcGlwZS0+bm9UcmFuc3BhcmVuY3kgPSBnVHJ1ZTsKICB9IGVsc2UgewogICAgcGlwZS0+bm9UcmFuc3BhcmVuY3kgPSBnRmFsc2U7CiAgfQoKICAvLyByZXN1bHQgY29sb3IKICBpZiAocGlwZS0+bm9UcmFuc3BhcmVuY3kpIHsKICAgIC8vIHRoZSAhc3RhdGUtPmJsZW5kRnVuYyBjYXNlIGlzIGhhbmRsZWQgc2VwYXJhdGVseSBpbiBwaXBlUnVuCiAgICBwaXBlLT5yZXN1bHRDb2xvckN0cmwgPSBwaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRbYml0bWFwLT5tb2RlXTsKICB9IGVsc2UgaWYgKCFzdGF0ZS0+YmxlbmRGdW5jKSB7CiAgICBwaXBlLT5yZXN1bHRDb2xvckN0cmwgPSBwaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRbYml0bWFwLT5tb2RlXTsKICB9IGVsc2UgewogICAgcGlwZS0+cmVzdWx0Q29sb3JDdHJsID0gcGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFtiaXRtYXAtPm1vZGVdOwogIH0KCiAgLy8gbm9uLWlzb2xhdGVkIGdyb3VwIGNvcnJlY3Rpb24KICBpZiAobm9uSXNvbGF0ZWRHcm91cCkgewogICAgcGlwZS0+bm9uSXNvbGF0ZWRHcm91cCA9IHNwbGFzaENvbG9yTW9kZU5Db21wc1tiaXRtYXAtPm1vZGVdOwogIH0gZWxzZSB7CiAgICBwaXBlLT5ub25Jc29sYXRlZEdyb3VwID0gMDsKICB9Cn0KCmlubGluZSB2b2lkIFNwbGFzaDo6cGlwZVJ1bihTcGxhc2hQaXBlICpwaXBlKSB7CiAgR3VjaGFyIGFTcmMsIGFEZXN0LCBhbHBoYTIsIGFscGhhMCwgYVJlc3VsdDsKICBTcGxhc2hDb2xvciBjRGVzdCwgY0JsZW5kOwogIEd1Y2hhciBjUmVzdWx0MCwgY1Jlc3VsdDEsIGNSZXN1bHQyLCBjUmVzdWx0MzsKCiAgLy8tLS0tLSBzb3VyY2UgY29sb3IKCiAgLy8gc3RhdGljIHBhdHRlcm46IGhhbmRsZWQgaW4gcGlwZUluaXQKICAvLyBmaXhlZCBjb2xvcjogaGFuZGxlZCBpbiBwaXBlSW5pdAoKICAvLyBkeW5hbWljIHBhdHRlcm4KICBpZiAocGlwZS0+cGF0dGVybikgewogICAgaWYgKCFwaXBlLT5wYXR0ZXJuLT5nZXRDb2xvcihwaXBlLT54LCBwaXBlLT55LCBwaXBlLT5jU3JjVmFsKSkgewogICAgICBzd2l0Y2ggKGJpdG1hcC0+bW9kZSkgewogICAgICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgICAgICAgaWYgKCEocGlwZS0+ZGVzdENvbG9yTWFzayA+Pj0gMSkpIAogICAgICAgICAgICArK3BpcGUtPmRlc3RDb2xvclB0cjsKICAgICAgICBicmVhazsKICAgICAgICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgICAgICAgICsrcGlwZS0+ZGVzdENvbG9yUHRyOwogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICAgICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgICAgIHBpcGUtPmRlc3RDb2xvclB0ciArPSAzOwogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgojaWYgU1BMQVNIX0NNWUsKICAgICAgICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKI2VuZGlmCiAgICAgICAgICBwaXBlLT5kZXN0Q29sb3JQdHIgKz0gNDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocGlwZS0+ZGVzdEFscGhhUHRyKSB7CiAgICAgICAgKytwaXBlLT5kZXN0QWxwaGFQdHI7CiAgICAgIH0KICAgICAgKytwaXBlLT54OwogICAgICByZXR1cm47CiAgICB9CiAgfQoKICBpZiAocGlwZS0+bm9UcmFuc3BhcmVuY3kgJiYgIXN0YXRlLT5ibGVuZEZ1bmMpIHsKCiAgICAvLy0tLS0tIHdyaXRlIGRlc3RpbmF0aW9uIHBpeGVsCgogICAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgICBjUmVzdWx0MCA9IHBpcGUtPmNTcmNbMF07CiAgICAgIGlmIChzdGF0ZS0+c2NyZWVuLT50ZXN0KHBpcGUtPngsIHBpcGUtPnksIGNSZXN1bHQwKSkgewoJKnBpcGUtPmRlc3RDb2xvclB0ciB8PSBwaXBlLT5kZXN0Q29sb3JNYXNrOwogICAgICB9IGVsc2UgewoJKnBpcGUtPmRlc3RDb2xvclB0ciAmPSB+cGlwZS0+ZGVzdENvbG9yTWFzazsKICAgICAgfQogICAgICBpZiAoIShwaXBlLT5kZXN0Q29sb3JNYXNrID4+PSAxKSkgewoJcGlwZS0+ZGVzdENvbG9yTWFzayA9IDB4ODA7CgkrK3BpcGUtPmRlc3RDb2xvclB0cjsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzBdOwogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMF07CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMV07CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMl07CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMl07CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMV07CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IHBpcGUtPmNTcmNbMF07CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IDI1NTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVCR1I4OgogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzJdOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzFdOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBwaXBlLT5jU3JjWzBdOwogICAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1swXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1sxXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1syXTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gcGlwZS0+Y1NyY1szXTsKICAgICAgYnJlYWs7CiNlbmRpZgogICAgfQogICAgaWYgKHBpcGUtPmRlc3RBbHBoYVB0cikgewogICAgICAqcGlwZS0+ZGVzdEFscGhhUHRyKysgPSAyNTU7CiAgICB9CgogIH0gZWxzZSB7CgogICAgLy8tLS0tLSByZWFkIGRlc3RpbmF0aW9uIHBpeGVsCgogICAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgICBjRGVzdFswXSA9ICgqcGlwZS0+ZGVzdENvbG9yUHRyICYgcGlwZS0+ZGVzdENvbG9yTWFzaykgPyAweGZmIDogMHgwMDsKICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgICAgY0Rlc3RbMF0gPSAqcGlwZS0+ZGVzdENvbG9yUHRyOwogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICAgIGNEZXN0WzBdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzBdOwogICAgICBjRGVzdFsxXSA9IHBpcGUtPmRlc3RDb2xvclB0clsxXTsKICAgICAgY0Rlc3RbMl0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMl07CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICAgIGNEZXN0WzBdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzJdOwogICAgICBjRGVzdFsxXSA9IHBpcGUtPmRlc3RDb2xvclB0clsxXTsKICAgICAgY0Rlc3RbMl0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMF07CiAgICAgIGNEZXN0WzNdID0gMjU1OwogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICAgIGNEZXN0WzBdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzJdOwogICAgICBjRGVzdFsxXSA9IHBpcGUtPmRlc3RDb2xvclB0clsxXTsKICAgICAgY0Rlc3RbMl0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMF07CiAgICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgICBjRGVzdFswXSA9IHBpcGUtPmRlc3RDb2xvclB0clswXTsKICAgICAgY0Rlc3RbMV0gPSBwaXBlLT5kZXN0Q29sb3JQdHJbMV07CiAgICAgIGNEZXN0WzJdID0gcGlwZS0+ZGVzdENvbG9yUHRyWzJdOwogICAgICBjRGVzdFszXSA9IHBpcGUtPmRlc3RDb2xvclB0clszXTsKICAgICAgYnJlYWs7CiNlbmRpZgogICAgfQogICAgaWYgKHBpcGUtPmRlc3RBbHBoYVB0cikgewogICAgICBhRGVzdCA9ICpwaXBlLT5kZXN0QWxwaGFQdHI7CiAgICB9IGVsc2UgewogICAgICBhRGVzdCA9IDB4ZmY7CiAgICB9CgogICAgLy8tLS0tLSBibGVuZCBmdW5jdGlvbgoKICAgIGlmIChzdGF0ZS0+YmxlbmRGdW5jKSB7CiAgICAgICgqc3RhdGUtPmJsZW5kRnVuYykocGlwZS0+Y1NyYywgY0Rlc3QsIGNCbGVuZCwgYml0bWFwLT5tb2RlKTsKICAgIH0KCiAgICAvLy0tLS0tIHNvdXJjZSBhbHBoYQoKICAgIGlmIChzdGF0ZS0+c29mdE1hc2spIHsKICAgICAgaWYgKHBpcGUtPnVzZXNTaGFwZSkgewoJYVNyYyA9IChHdWNoYXIpc3BsYXNoUm91bmQocGlwZS0+YUlucHV0ICogKnBpcGUtPnNvZnRNYXNrUHRyKysKCQkJCSAgICogcGlwZS0+c2hhcGUpOwogICAgICB9IGVsc2UgewoJYVNyYyA9IChHdWNoYXIpc3BsYXNoUm91bmQocGlwZS0+YUlucHV0ICogKnBpcGUtPnNvZnRNYXNrUHRyKyspOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBpcGUtPnVzZXNTaGFwZSkgewogICAgICAvLyBwaXBlLT5hSW5wdXQgaXMgcHJlbXVsdGlwbGllZCBieSAyNTUgaW4gcGlwZUluaXQKICAgICAgYVNyYyA9IChHdWNoYXIpc3BsYXNoUm91bmQocGlwZS0+YUlucHV0ICogcGlwZS0+c2hhcGUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gcHJlY29tcHV0ZWQgaW4gcGlwZUluaXQKICAgICAgYVNyYyA9IHBpcGUtPmFTcmM7CiAgICB9CgogICAgLy8tLS0tLSByZXN1bHQgYWxwaGEgYW5kIG5vbi1pc29sYXRlZCBncm91cCBlbGVtZW50IGNvcnJlY3Rpb24KCiAgICBpZiAocGlwZS0+bm9UcmFuc3BhcmVuY3kpIHsKICAgICAgYWxwaGEyID0gYVJlc3VsdCA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIGFSZXN1bHQgPSBhU3JjICsgYURlc3QgLSBkaXYyNTUoYVNyYyAqIGFEZXN0KTsKCiAgICAgIGlmIChwaXBlLT5hbHBoYTBQdHIpIHsKCWFscGhhMCA9ICpwaXBlLT5hbHBoYTBQdHIrKzsKCWFscGhhMiA9IGFSZXN1bHQgKyBhbHBoYTAgLSBkaXYyNTUoYVJlc3VsdCAqIGFscGhhMCk7CiAgICAgIH0gZWxzZSB7CglhbHBoYTIgPSBhUmVzdWx0OwogICAgICB9CiAgICB9CgogICAgLy8tLS0tLSByZXN1bHQgY29sb3IKCiAgICBjUmVzdWx0MCA9IGNSZXN1bHQxID0gY1Jlc3VsdDIgPSBjUmVzdWx0MyA9IDA7IC8vIG1ha2UgZ2NjIGhhcHB5CgogICAgc3dpdGNoIChwaXBlLT5yZXN1bHRDb2xvckN0cmwpIHsKCiNpZiBTUExBU0hfQ01ZSwogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLOgogICAgICBjUmVzdWx0MyA9IGRpdjI1NSgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1szXSArIGFEZXN0ICogY0JsZW5kWzNdKTsKI2VuZGlmCiAgICBjYXNlIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQjoKICAgICAgY1Jlc3VsdDIgPSBkaXYyNTUoKDI1NSAtIGFEZXN0KSAqIHBpcGUtPmNTcmNbMl0gKyBhRGVzdCAqIGNCbGVuZFsyXSk7CiAgICAgIGNSZXN1bHQxID0gZGl2MjU1KCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzFdICsgYURlc3QgKiBjQmxlbmRbMV0pOwogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vOgogICAgICBjUmVzdWx0MCA9IGRpdjI1NSgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1swXSArIGFEZXN0ICogY0JsZW5kWzBdKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRNb25vOgogICAgICBpZiAoYWxwaGEyID09IDApIHsKCWNSZXN1bHQwID0gMDsKICAgICAgfSBlbHNlIHsKCWNSZXN1bHQwID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzBdICsKCQkJICAgICBhU3JjICogcGlwZS0+Y1NyY1swXSkgLyBhbHBoYTIpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRSR0I6CiAgICAgIGlmIChhbHBoYTIgPT0gMCkgewoJY1Jlc3VsdDAgPSAwOwoJY1Jlc3VsdDEgPSAwOwoJY1Jlc3VsdDIgPSAwOwogICAgICB9IGVsc2UgewoJY1Jlc3VsdDAgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMF0gKwoJCQkgICAgIGFTcmMgKiBwaXBlLT5jU3JjWzBdKSAvIGFscGhhMik7CgljUmVzdWx0MSA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFsxXSArCgkJCSAgICAgYVNyYyAqIHBpcGUtPmNTcmNbMV0pIC8gYWxwaGEyKTsKCWNSZXN1bHQyID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzJdICsKCQkJICAgICBhU3JjICogcGlwZS0+Y1NyY1syXSkgLyBhbHBoYTIpOwogICAgICB9CiAgICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kQ01ZSzoKICAgICAgaWYgKGFscGhhMiA9PSAwKSB7CgljUmVzdWx0MCA9IDA7CgljUmVzdWx0MSA9IDA7CgljUmVzdWx0MiA9IDA7CgljUmVzdWx0MyA9IDA7CiAgICAgIH0gZWxzZSB7CgljUmVzdWx0MCA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFswXSArCgkJCSAgICAgYVNyYyAqIHBpcGUtPmNTcmNbMF0pIC8gYWxwaGEyKTsKCWNSZXN1bHQxID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzFdICsKCQkJICAgICBhU3JjICogcGlwZS0+Y1NyY1sxXSkgLyBhbHBoYTIpOwoJY1Jlc3VsdDIgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMl0gKwoJCQkgICAgIGFTcmMgKiBwaXBlLT5jU3JjWzJdKSAvIGFscGhhMik7CgljUmVzdWx0MyA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFszXSArCgkJCSAgICAgYVNyYyAqIHBpcGUtPmNTcmNbM10pIC8gYWxwaGEyKTsKICAgICAgfQogICAgICBicmVhazsKI2VuZGlmCgogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kTW9ubzoKICAgICAgaWYgKGFscGhhMiA9PSAwKSB7CgljUmVzdWx0MCA9IDA7CiAgICAgIH0gZWxzZSB7CgljUmVzdWx0MCA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFswXSArCgkJCSAgICAgYVNyYyAqICgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1swXSArCgkJCQkgICAgIGFEZXN0ICogY0JsZW5kWzBdKSAvIDI1NSkgLwoJCQkgICAgYWxwaGEyKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFCbGVuZFJHQjoKICAgICAgaWYgKGFscGhhMiA9PSAwKSB7CgljUmVzdWx0MCA9IDA7CgljUmVzdWx0MSA9IDA7CgljUmVzdWx0MiA9IDA7CiAgICAgIH0gZWxzZSB7CgljUmVzdWx0MCA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFswXSArCgkJCSAgICAgYVNyYyAqICgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1swXSArCgkJCQkgICAgIGFEZXN0ICogY0JsZW5kWzBdKSAvIDI1NSkgLwoJCQkgICAgYWxwaGEyKTsKCWNSZXN1bHQxID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzFdICsKCQkJICAgICBhU3JjICogKCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzFdICsKCQkJCSAgICAgYURlc3QgKiBjQmxlbmRbMV0pIC8gMjU1KSAvCgkJCSAgICBhbHBoYTIpOwoJY1Jlc3VsdDIgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMl0gKwoJCQkgICAgIGFTcmMgKiAoKDI1NSAtIGFEZXN0KSAqIHBpcGUtPmNTcmNbMl0gKwoJCQkJICAgICBhRGVzdCAqIGNCbGVuZFsyXSkgLyAyNTUpIC8KCQkJICAgIGFscGhhMik7CiAgICAgIH0KICAgICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogICAgY2FzZSBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kQ01ZSzoKICAgICAgaWYgKGFscGhhMiA9PSAwKSB7CgljUmVzdWx0MCA9IDA7CgljUmVzdWx0MSA9IDA7CgljUmVzdWx0MiA9IDA7CgljUmVzdWx0MyA9IDA7CiAgICAgIH0gZWxzZSB7CgljUmVzdWx0MCA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFswXSArCgkJCSAgICAgYVNyYyAqICgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1swXSArCgkJCQkgICAgIGFEZXN0ICogY0JsZW5kWzBdKSAvIDI1NSkgLwoJCQkgICAgYWxwaGEyKTsKCWNSZXN1bHQxID0gKEd1Y2hhcikoKChhbHBoYTIgLSBhU3JjKSAqIGNEZXN0WzFdICsKCQkJICAgICBhU3JjICogKCgyNTUgLSBhRGVzdCkgKiBwaXBlLT5jU3JjWzFdICsKCQkJCSAgICAgYURlc3QgKiBjQmxlbmRbMV0pIC8gMjU1KSAvCgkJCSAgICBhbHBoYTIpOwoJY1Jlc3VsdDIgPSAoR3VjaGFyKSgoKGFscGhhMiAtIGFTcmMpICogY0Rlc3RbMl0gKwoJCQkgICAgIGFTcmMgKiAoKDI1NSAtIGFEZXN0KSAqIHBpcGUtPmNTcmNbMl0gKwoJCQkJICAgICBhRGVzdCAqIGNCbGVuZFsyXSkgLyAyNTUpIC8KCQkJICAgIGFscGhhMik7CgljUmVzdWx0MyA9IChHdWNoYXIpKCgoYWxwaGEyIC0gYVNyYykgKiBjRGVzdFszXSArCgkJCSAgICAgYVNyYyAqICgoMjU1IC0gYURlc3QpICogcGlwZS0+Y1NyY1szXSArCgkJCQkgICAgIGFEZXN0ICogY0JsZW5kWzNdKSAvIDI1NSkgLwoJCQkgICAgYWxwaGEyKTsKICAgICAgfQogICAgICBicmVhazsKI2VuZGlmCiAgICB9CgogICAgLy8tLS0tLSBub24taXNvbGF0ZWQgZ3JvdXAgY29ycmVjdGlvbgoKICAgIGlmIChhUmVzdWx0ICE9IDApIHsKICAgICAgc3dpdGNoIChwaXBlLT5ub25Jc29sYXRlZEdyb3VwKSB7CiNpZiBTUExBU0hfQ01ZSwogICAgICBjYXNlIDQ6CgljUmVzdWx0MyArPSAoY1Jlc3VsdDMgLSBjRGVzdFszXSkgKiBhRGVzdCAqCgkgICAgICAgICAgICAoMjU1IC0gYVJlc3VsdCkgLyAoMjU1ICogYVJlc3VsdCk7CiNlbmRpZgogICAgICBjYXNlIDM6CgljUmVzdWx0MiArPSAoY1Jlc3VsdDIgLSBjRGVzdFsyXSkgKiBhRGVzdCAqCgkgICAgICAgICAgICAoMjU1IC0gYVJlc3VsdCkgLyAoMjU1ICogYVJlc3VsdCk7CgljUmVzdWx0MSArPSAoY1Jlc3VsdDEgLSBjRGVzdFsxXSkgKiBhRGVzdCAqCgkgICAgICAgICAgICAoMjU1IC0gYVJlc3VsdCkgLyAoMjU1ICogYVJlc3VsdCk7CiAgICAgIGNhc2UgMToKCWNSZXN1bHQwICs9IChjUmVzdWx0MCAtIGNEZXN0WzBdKSAqIGFEZXN0ICoKCSAgICAgICAgICAgICgyNTUgLSBhUmVzdWx0KSAvICgyNTUgKiBhUmVzdWx0KTsKICAgICAgY2FzZSAwOgoJYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0tIHdyaXRlIGRlc3RpbmF0aW9uIHBpeGVsCgogICAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgICBpZiAoc3RhdGUtPnNjcmVlbi0+dGVzdChwaXBlLT54LCBwaXBlLT55LCBjUmVzdWx0MCkpIHsKCSpwaXBlLT5kZXN0Q29sb3JQdHIgfD0gcGlwZS0+ZGVzdENvbG9yTWFzazsKICAgICAgfSBlbHNlIHsKCSpwaXBlLT5kZXN0Q29sb3JQdHIgJj0gfnBpcGUtPmRlc3RDb2xvck1hc2s7CiAgICAgIH0KICAgICAgaWYgKCEocGlwZS0+ZGVzdENvbG9yTWFzayA+Pj0gMSkpIHsKCXBpcGUtPmRlc3RDb2xvck1hc2sgPSAweDgwOwoJKytwaXBlLT5kZXN0Q29sb3JQdHI7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDA7CiAgICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDA7CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQxOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MjsKICAgICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDI7CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQxOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MDsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gMjU1OwogICAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQyOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MTsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDA7CiAgICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MDsKICAgICAgKnBpcGUtPmRlc3RDb2xvclB0cisrID0gY1Jlc3VsdDE7CiAgICAgICpwaXBlLT5kZXN0Q29sb3JQdHIrKyA9IGNSZXN1bHQyOwogICAgICAqcGlwZS0+ZGVzdENvbG9yUHRyKysgPSBjUmVzdWx0MzsKICAgICAgYnJlYWs7CiNlbmRpZgogICAgfQogICAgaWYgKHBpcGUtPmRlc3RBbHBoYVB0cikgewogICAgICAqcGlwZS0+ZGVzdEFscGhhUHRyKysgPSBhUmVzdWx0OwogICAgfQoKICB9CgogICsrcGlwZS0+eDsKfQoKaW5saW5lIHZvaWQgU3BsYXNoOjpwaXBlU2V0WFkoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KSB7CiAgcGlwZS0+eCA9IHg7CiAgcGlwZS0+eSA9IHk7CiAgaWYgKHN0YXRlLT5zb2Z0TWFzaykgewogICAgcGlwZS0+c29mdE1hc2tQdHIgPQogICAgICAgICZzdGF0ZS0+c29mdE1hc2stPmRhdGFbeSAqIHN0YXRlLT5zb2Z0TWFzay0+cm93U2l6ZSArIHhdOwogIH0KICBzd2l0Y2ggKGJpdG1hcC0+bW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgcGlwZS0+ZGVzdENvbG9yUHRyID0gJmJpdG1hcC0+ZGF0YVt5ICogYml0bWFwLT5yb3dTaXplICsgKHggPj4gMyldOwogICAgcGlwZS0+ZGVzdENvbG9yTWFzayA9IDB4ODAgPj4gKHggJiA3KTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgcGlwZS0+ZGVzdENvbG9yUHRyID0gJmJpdG1hcC0+ZGF0YVt5ICogYml0bWFwLT5yb3dTaXplICsgeF07CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBwaXBlLT5kZXN0Q29sb3JQdHIgPSAmYml0bWFwLT5kYXRhW3kgKiBiaXRtYXAtPnJvd1NpemUgKyAzICogeF07CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIHBpcGUtPmRlc3RDb2xvclB0ciA9ICZiaXRtYXAtPmRhdGFbeSAqIGJpdG1hcC0+cm93U2l6ZSArIDQgKiB4XTsKICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIHBpcGUtPmRlc3RDb2xvclB0ciA9ICZiaXRtYXAtPmRhdGFbeSAqIGJpdG1hcC0+cm93U2l6ZSArIDQgKiB4XTsKICAgIGJyZWFrOwojZW5kaWYKICB9CiAgaWYgKGJpdG1hcC0+YWxwaGEpIHsKICAgIHBpcGUtPmRlc3RBbHBoYVB0ciA9ICZiaXRtYXAtPmFscGhhW3kgKiBiaXRtYXAtPndpZHRoICsgeF07CiAgfSBlbHNlIHsKICAgIHBpcGUtPmRlc3RBbHBoYVB0ciA9IE5VTEw7CiAgfQogIGlmIChzdGF0ZS0+aW5Ob25Jc29sYXRlZEdyb3VwICYmIGFscGhhMEJpdG1hcC0+YWxwaGEpIHsKICAgIHBpcGUtPmFscGhhMFB0ciA9CiAgICAgICAgJmFscGhhMEJpdG1hcC0+YWxwaGFbKGFscGhhMFkgKyB5KSAqIGFscGhhMEJpdG1hcC0+d2lkdGggKwoJCQkgICAgIChhbHBoYTBYICsgeCldOwogIH0gZWxzZSB7CiAgICBwaXBlLT5hbHBoYTBQdHIgPSBOVUxMOwogIH0KfQoKaW5saW5lIHZvaWQgU3BsYXNoOjpwaXBlSW5jWChTcGxhc2hQaXBlICpwaXBlKSB7CiAgKytwaXBlLT54OwogIGlmIChzdGF0ZS0+c29mdE1hc2spIHsKICAgICsrcGlwZS0+c29mdE1hc2tQdHI7CiAgfQogIHN3aXRjaCAoYml0bWFwLT5tb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBpZiAoIShwaXBlLT5kZXN0Q29sb3JNYXNrID4+PSAxKSkgewogICAgICBwaXBlLT5kZXN0Q29sb3JNYXNrID0gMHg4MDsKICAgICAgKytwaXBlLT5kZXN0Q29sb3JQdHI7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgICsrcGlwZS0+ZGVzdENvbG9yUHRyOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICBjYXNlIHNwbGFzaE1vZGVCR1I4OgogICAgcGlwZS0+ZGVzdENvbG9yUHRyICs9IDM7CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIHBpcGUtPmRlc3RDb2xvclB0ciArPSA0OwogICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgcGlwZS0+ZGVzdENvbG9yUHRyICs9IDQ7CiAgICBicmVhazsKI2VuZGlmCiAgfQogIGlmIChwaXBlLT5kZXN0QWxwaGFQdHIpIHsKICAgICsrcGlwZS0+ZGVzdEFscGhhUHRyOwogIH0KICBpZiAocGlwZS0+YWxwaGEwUHRyKSB7CiAgICArK3BpcGUtPmFscGhhMFB0cjsKICB9Cn0KCmlubGluZSB2b2lkIFNwbGFzaDo6ZHJhd1BpeGVsKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSwgR0Jvb2wgbm9DbGlwKSB7CiAgaWYgKHVubGlrZWx5KHkgPCAwKSkKICAgIHJldHVybjsKCiAgaWYgKG5vQ2xpcCB8fCBzdGF0ZS0+Y2xpcC0+dGVzdCh4LCB5KSkgewogICAgcGlwZVNldFhZKHBpcGUsIHgsIHkpOwogICAgcGlwZVJ1bihwaXBlKTsKICAgIHVwZGF0ZU1vZFgoeCk7CiAgICB1cGRhdGVNb2RZKHkpOwogIH0KfQoKaW5saW5lIHZvaWQgU3BsYXNoOjpkcmF3QUFQaXhlbEluaXQoKSB7CiAgYWFCdWZZID0gLTE7Cn0KCmlubGluZSB2b2lkIFNwbGFzaDo6ZHJhd0FBUGl4ZWwoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KSB7CiNpZiBzcGxhc2hBQVNpemUgPT0gNAogIHN0YXRpYyBpbnQgYml0Q291bnQ0WzE2XSA9IHsgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywKCQkJICAgICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQgfTsKICBpbnQgdzsKI2Vsc2UKICBpbnQgeHgsIHl5OwojZW5kaWYKICBTcGxhc2hDb2xvclB0ciBwOwogIGludCB4MCwgeDEsIHQ7CgogIGlmICh4IDwgMCB8fCB4ID49IGJpdG1hcC0+d2lkdGggfHwKICAgICAgeSA8IHN0YXRlLT5jbGlwLT5nZXRZTWluSSgpIHx8IHkgPiBzdGF0ZS0+Y2xpcC0+Z2V0WU1heEkoKSkgewogICAgcmV0dXJuOwogIH0KCiAgLy8gdXBkYXRlIGFhQnVmCiAgaWYgKHkgIT0gYWFCdWZZKSB7CiAgICBtZW1zZXQoYWFCdWYtPmdldERhdGFQdHIoKSwgMHhmZiwKCSAgIGFhQnVmLT5nZXRSb3dTaXplKCkgKiBhYUJ1Zi0+Z2V0SGVpZ2h0KCkpOwogICAgeDAgPSAwOwogICAgeDEgPSBiaXRtYXAtPndpZHRoIC0gMTsKICAgIHN0YXRlLT5jbGlwLT5jbGlwQUFMaW5lKGFhQnVmLCAmeDAsICZ4MSwgeSk7CiAgICBhYUJ1ZlkgPSB5OwogIH0KCiAgLy8gY29tcHV0ZSB0aGUgc2hhcGUgdmFsdWUKI2lmIHNwbGFzaEFBU2l6ZSA9PSA0CiAgcCA9IGFhQnVmLT5nZXREYXRhUHRyKCkgKyAoeCA+PiAxKTsKICB3ID0gYWFCdWYtPmdldFJvd1NpemUoKTsKICBpZiAoeCAmIDEpIHsKICAgIHQgPSBiaXRDb3VudDRbKnAgJiAweDBmXSArIGJpdENvdW50NFtwW3ddICYgMHgwZl0gKwogICAgICAgIGJpdENvdW50NFtwWzIqd10gJiAweDBmXSArIGJpdENvdW50NFtwWzMqd10gJiAweDBmXTsKICB9IGVsc2UgewogICAgdCA9IGJpdENvdW50NFsqcCA+PiA0XSArIGJpdENvdW50NFtwW3ddID4+IDRdICsKICAgICAgICBiaXRDb3VudDRbcFsyKnddID4+IDRdICsgYml0Q291bnQ0W3BbMyp3XSA+PiA0XTsKICB9CiNlbHNlCiAgdCA9IDA7CiAgZm9yICh5eSA9IDA7IHl5IDwgc3BsYXNoQUFTaXplOyArK3l5KSB7CiAgICBmb3IgKHh4ID0gMDsgeHggPCBzcGxhc2hBQVNpemU7ICsreHgpIHsKICAgICAgcCA9IGFhQnVmLT5nZXREYXRhUHRyKCkgKyB5eSAqIGFhQnVmLT5nZXRSb3dTaXplKCkgKwoJICAoKHggKiBzcGxhc2hBQVNpemUgKyB4eCkgPj4gMyk7CiAgICAgIHQgKz0gKCpwID4+ICg3IC0gKCh4ICogc3BsYXNoQUFTaXplICsgeHgpICYgNykpKSAmIDE7CiAgICB9CiAgfQojZW5kaWYKCiAgLy8gZHJhdyB0aGUgcGl4ZWwKICBpZiAodCAhPSAwKSB7CiAgICBwaXBlU2V0WFkocGlwZSwgeCwgeSk7CiAgICBwaXBlLT5zaGFwZSAqPSBhYUdhbW1hW3RdOwogICAgcGlwZVJ1bihwaXBlKTsKICAgIHVwZGF0ZU1vZFgoeCk7CiAgICB1cGRhdGVNb2RZKHkpOwogIH0KfQoKaW5saW5lIHZvaWQgU3BsYXNoOjpkcmF3U3BhbihTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksCgkJCSAgICAgR0Jvb2wgbm9DbGlwKSB7CiAgaW50IHg7CgogIHBpcGVTZXRYWShwaXBlLCB4MCwgeSk7CiAgaWYgKG5vQ2xpcCkgewogICAgZm9yICh4ID0geDA7IHggPD0geDE7ICsreCkgewogICAgICBwaXBlUnVuKHBpcGUpOwogICAgfQogICAgdXBkYXRlTW9kWCh4MCk7CiAgICB1cGRhdGVNb2RYKHgxKTsKICAgIHVwZGF0ZU1vZFkoeSk7CiAgfSBlbHNlIHsKICAgIGZvciAoeCA9IHgwOyB4IDw9IHgxOyArK3gpIHsKICAgICAgaWYgKHN0YXRlLT5jbGlwLT50ZXN0KHgsIHkpKSB7CglwaXBlUnVuKHBpcGUpOwoJdXBkYXRlTW9kWCh4KTsKCXVwZGF0ZU1vZFkoeSk7CiAgICAgIH0gZWxzZSB7CglwaXBlSW5jWChwaXBlKTsKICAgICAgfQogICAgfQogIH0KfQoKaW5saW5lIHZvaWQgU3BsYXNoOjpkcmF3QUFMaW5lKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSkgewojaWYgc3BsYXNoQUFTaXplID09IDQKICBzdGF0aWMgaW50IGJpdENvdW50NFsxNl0gPSB7IDAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsCgkJCSAgICAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0IH07CiAgU3BsYXNoQ29sb3JQdHIgcDAsIHAxLCBwMiwgcDM7CiAgaW50IHQ7CiNlbHNlCiAgU3BsYXNoQ29sb3JQdHIgcDsKICBpbnQgeHgsIHl5LCB0OwojZW5kaWYKICBpbnQgeDsKCiNpZiBzcGxhc2hBQVNpemUgPT0gNAogIHAwID0gYWFCdWYtPmdldERhdGFQdHIoKSArICh4MCA+PiAxKTsKICBwMSA9IHAwICsgYWFCdWYtPmdldFJvd1NpemUoKTsKICBwMiA9IHAxICsgYWFCdWYtPmdldFJvd1NpemUoKTsKICBwMyA9IHAyICsgYWFCdWYtPmdldFJvd1NpemUoKTsKI2VuZGlmCiAgcGlwZVNldFhZKHBpcGUsIHgwLCB5KTsKICBmb3IgKHggPSB4MDsgeCA8PSB4MTsgKyt4KSB7CgogICAgLy8gY29tcHV0ZSB0aGUgc2hhcGUgdmFsdWUKI2lmIHNwbGFzaEFBU2l6ZSA9PSA0CiAgICBpZiAoeCAmIDEpIHsKICAgICAgdCA9IGJpdENvdW50NFsqcDAgJiAweDBmXSArIGJpdENvdW50NFsqcDEgJiAweDBmXSArCgkgIGJpdENvdW50NFsqcDIgJiAweDBmXSArIGJpdENvdW50NFsqcDMgJiAweDBmXTsKICAgICAgKytwMDsgKytwMTsgKytwMjsgKytwMzsKICAgIH0gZWxzZSB7CiAgICAgIHQgPSBiaXRDb3VudDRbKnAwID4+IDRdICsgYml0Q291bnQ0WypwMSA+PiA0XSArCgkgIGJpdENvdW50NFsqcDIgPj4gNF0gKyBiaXRDb3VudDRbKnAzID4+IDRdOwogICAgfQojZWxzZQogICAgdCA9IDA7CiAgICBmb3IgKHl5ID0gMDsgeXkgPCBzcGxhc2hBQVNpemU7ICsreXkpIHsKICAgICAgZm9yICh4eCA9IDA7IHh4IDwgc3BsYXNoQUFTaXplOyArK3h4KSB7CglwID0gYWFCdWYtPmdldERhdGFQdHIoKSArIHl5ICogYWFCdWYtPmdldFJvd1NpemUoKSArCgkgICAgKCh4ICogc3BsYXNoQUFTaXplICsgeHgpID4+IDMpOwoJdCArPSAoKnAgPj4gKDcgLSAoKHggKiBzcGxhc2hBQVNpemUgKyB4eCkgJiA3KSkpICYgMTsKICAgICAgfQogICAgfQojZW5kaWYKCiAgICBpZiAodCAhPSAwKSB7CiAgICAgIHBpcGUtPnNoYXBlID0gYWFHYW1tYVt0XTsKICAgICAgcGlwZVJ1bihwaXBlKTsKICAgICAgdXBkYXRlTW9kWCh4KTsKICAgICAgdXBkYXRlTW9kWSh5KTsKICAgIH0gZWxzZSB7CiAgICAgIHBpcGVJbmNYKHBpcGUpOwogICAgfQogIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFRyYW5zZm9ybSBhIHBvaW50IGZyb20gdXNlciBzcGFjZSB0byBkZXZpY2Ugc3BhY2UuCmlubGluZSB2b2lkIFNwbGFzaDo6dHJhbnNmb3JtKFNwbGFzaENvb3JkICptYXRyaXgsCgkJCSAgICAgIFNwbGFzaENvb3JkIHhpLCBTcGxhc2hDb29yZCB5aSwKCQkJICAgICAgU3BsYXNoQ29vcmQgKnhvLCBTcGxhc2hDb29yZCAqeW8pIHsKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgWyBtWzBdIG1bMV0gMCBdCiAgLy8gW3hvIHlvIDFdID0gW3hpIHlpIDFdICogIFsgbVsyXSBtWzNdIDAgXQogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBbIG1bNF0gbVs1XSAxIF0KICAqeG8gPSB4aSAqIG1hdHJpeFswXSArIHlpICogbWF0cml4WzJdICsgbWF0cml4WzRdOwogICp5byA9IHhpICogbWF0cml4WzFdICsgeWkgKiBtYXRyaXhbM10gKyBtYXRyaXhbNV07Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3BsYXNoOjpTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJICAgICAgIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zKSB7CiAgaW50IGk7CgogIGJpdG1hcCA9IGJpdG1hcEE7CiAgdmVjdG9yQW50aWFsaWFzID0gdmVjdG9yQW50aWFsaWFzQTsKICBzdGF0ZSA9IG5ldyBTcGxhc2hTdGF0ZShiaXRtYXAtPndpZHRoLCBiaXRtYXAtPmhlaWdodCwgdmVjdG9yQW50aWFsaWFzLAoJCQkgIHNjcmVlblBhcmFtcyk7CiAgaWYgKHZlY3RvckFudGlhbGlhcykgewogICAgYWFCdWYgPSBuZXcgU3BsYXNoQml0bWFwKHNwbGFzaEFBU2l6ZSAqIGJpdG1hcC0+d2lkdGgsIHNwbGFzaEFBU2l6ZSwKCQkJICAgICAxLCBzcGxhc2hNb2RlTW9ubzEsIGdGYWxzZSk7CiAgICBmb3IgKGkgPSAwOyBpIDw9IHNwbGFzaEFBU2l6ZSAqIHNwbGFzaEFBU2l6ZTsgKytpKSB7CiAgICAgIGFhR2FtbWFbaV0gPSBzcGxhc2hQb3coKFNwbGFzaENvb3JkKWkgLwoJCQkgICAgICAgKFNwbGFzaENvb3JkKShzcGxhc2hBQVNpemUgKiBzcGxhc2hBQVNpemUpLAoJCQkgICAgIDEuNSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGFhQnVmID0gTlVMTDsKICB9CiAgY2xlYXJNb2RSZWdpb24oKTsKICBkZWJ1Z01vZGUgPSBnRmFsc2U7Cn0KClNwbGFzaDo6U3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSAgICAgICBTcGxhc2hTY3JlZW4gKnNjcmVlbkEpIHsKICBpbnQgaTsKCiAgYml0bWFwID0gYml0bWFwQTsKICB2ZWN0b3JBbnRpYWxpYXMgPSB2ZWN0b3JBbnRpYWxpYXNBOwogIHN0YXRlID0gbmV3IFNwbGFzaFN0YXRlKGJpdG1hcC0+d2lkdGgsIGJpdG1hcC0+aGVpZ2h0LCB2ZWN0b3JBbnRpYWxpYXMsCgkJCSAgc2NyZWVuQSk7CiAgaWYgKHZlY3RvckFudGlhbGlhcykgewogICAgYWFCdWYgPSBuZXcgU3BsYXNoQml0bWFwKHNwbGFzaEFBU2l6ZSAqIGJpdG1hcC0+d2lkdGgsIHNwbGFzaEFBU2l6ZSwKCQkJICAgICAxLCBzcGxhc2hNb2RlTW9ubzEsIGdGYWxzZSk7CiAgICBmb3IgKGkgPSAwOyBpIDw9IHNwbGFzaEFBU2l6ZSAqIHNwbGFzaEFBU2l6ZTsgKytpKSB7CiAgICAgIGFhR2FtbWFbaV0gPSBzcGxhc2hQb3coKFNwbGFzaENvb3JkKWkgLwoJCQkgICAgICAgKFNwbGFzaENvb3JkKShzcGxhc2hBQVNpemUgKiBzcGxhc2hBQVNpemUpLAoJCQkgICAgIDEuNSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGFhQnVmID0gTlVMTDsKICB9CiAgY2xlYXJNb2RSZWdpb24oKTsKICBkZWJ1Z01vZGUgPSBnRmFsc2U7Cn0KClNwbGFzaDo6flNwbGFzaCgpIHsKICB3aGlsZSAoc3RhdGUtPm5leHQpIHsKICAgIHJlc3RvcmVTdGF0ZSgpOwogIH0KICBkZWxldGUgc3RhdGU7CiAgaWYgKHZlY3RvckFudGlhbGlhcykgewogICAgZGVsZXRlIGFhQnVmOwogIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gc3RhdGUgcmVhZAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3BsYXNoQ29vcmQgKlNwbGFzaDo6Z2V0TWF0cml4KCkgewogIHJldHVybiBzdGF0ZS0+bWF0cml4Owp9CgpTcGxhc2hQYXR0ZXJuICpTcGxhc2g6OmdldFN0cm9rZVBhdHRlcm4oKSB7CiAgcmV0dXJuIHN0YXRlLT5zdHJva2VQYXR0ZXJuOwp9CgpTcGxhc2hQYXR0ZXJuICpTcGxhc2g6OmdldEZpbGxQYXR0ZXJuKCkgewogIHJldHVybiBzdGF0ZS0+ZmlsbFBhdHRlcm47Cn0KClNwbGFzaFNjcmVlbiAqU3BsYXNoOjpnZXRTY3JlZW4oKSB7CiAgcmV0dXJuIHN0YXRlLT5zY3JlZW47Cn0KClNwbGFzaEJsZW5kRnVuYyBTcGxhc2g6OmdldEJsZW5kRnVuYygpIHsKICByZXR1cm4gc3RhdGUtPmJsZW5kRnVuYzsKfQoKU3BsYXNoQ29vcmQgU3BsYXNoOjpnZXRTdHJva2VBbHBoYSgpIHsKICByZXR1cm4gc3RhdGUtPnN0cm9rZUFscGhhOwp9CgpTcGxhc2hDb29yZCBTcGxhc2g6OmdldEZpbGxBbHBoYSgpIHsKICByZXR1cm4gc3RhdGUtPmZpbGxBbHBoYTsKfQoKU3BsYXNoQ29vcmQgU3BsYXNoOjpnZXRMaW5lV2lkdGgoKSB7CiAgcmV0dXJuIHN0YXRlLT5saW5lV2lkdGg7Cn0KCmludCBTcGxhc2g6OmdldExpbmVDYXAoKSB7CiAgcmV0dXJuIHN0YXRlLT5saW5lQ2FwOwp9CgppbnQgU3BsYXNoOjpnZXRMaW5lSm9pbigpIHsKICByZXR1cm4gc3RhdGUtPmxpbmVKb2luOwp9CgpTcGxhc2hDb29yZCBTcGxhc2g6OmdldE1pdGVyTGltaXQoKSB7CiAgcmV0dXJuIHN0YXRlLT5taXRlckxpbWl0Owp9CgpTcGxhc2hDb29yZCBTcGxhc2g6OmdldEZsYXRuZXNzKCkgewogIHJldHVybiBzdGF0ZS0+ZmxhdG5lc3M7Cn0KClNwbGFzaENvb3JkICpTcGxhc2g6OmdldExpbmVEYXNoKCkgewogIHJldHVybiBzdGF0ZS0+bGluZURhc2g7Cn0KCmludCBTcGxhc2g6OmdldExpbmVEYXNoTGVuZ3RoKCkgewogIHJldHVybiBzdGF0ZS0+bGluZURhc2hMZW5ndGg7Cn0KClNwbGFzaENvb3JkIFNwbGFzaDo6Z2V0TGluZURhc2hQaGFzZSgpIHsKICByZXR1cm4gc3RhdGUtPmxpbmVEYXNoUGhhc2U7Cn0KClNwbGFzaENsaXAgKlNwbGFzaDo6Z2V0Q2xpcCgpIHsKICByZXR1cm4gc3RhdGUtPmNsaXA7Cn0KClNwbGFzaEJpdG1hcCAqU3BsYXNoOjpnZXRTb2Z0TWFzaygpIHsKICByZXR1cm4gc3RhdGUtPnNvZnRNYXNrOwp9CgpHQm9vbCBTcGxhc2g6OmdldEluTm9uSXNvbGF0ZWRHcm91cCgpIHsKICByZXR1cm4gc3RhdGUtPmluTm9uSXNvbGF0ZWRHcm91cDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gc3RhdGUgd3JpdGUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgU3BsYXNoOjpzZXRNYXRyaXgoU3BsYXNoQ29vcmQgKm1hdHJpeCkgewogIG1lbWNweShzdGF0ZS0+bWF0cml4LCBtYXRyaXgsIDYgKiBzaXplb2YoU3BsYXNoQ29vcmQpKTsKfQoKdm9pZCBTcGxhc2g6OnNldFN0cm9rZVBhdHRlcm4oU3BsYXNoUGF0dGVybiAqc3Ryb2tlUGF0dGVybikgewogIHN0YXRlLT5zZXRTdHJva2VQYXR0ZXJuKHN0cm9rZVBhdHRlcm4pOwp9Cgp2b2lkIFNwbGFzaDo6c2V0RmlsbFBhdHRlcm4oU3BsYXNoUGF0dGVybiAqZmlsbFBhdHRlcm4pIHsKICBzdGF0ZS0+c2V0RmlsbFBhdHRlcm4oZmlsbFBhdHRlcm4pOwp9Cgp2b2lkIFNwbGFzaDo6c2V0U2NyZWVuKFNwbGFzaFNjcmVlbiAqc2NyZWVuKSB7CiAgc3RhdGUtPnNldFNjcmVlbihzY3JlZW4pOwp9Cgp2b2lkIFNwbGFzaDo6c2V0QmxlbmRGdW5jKFNwbGFzaEJsZW5kRnVuYyBmdW5jKSB7CiAgc3RhdGUtPmJsZW5kRnVuYyA9IGZ1bmM7Cn0KCnZvaWQgU3BsYXNoOjpzZXRTdHJva2VBbHBoYShTcGxhc2hDb29yZCBhbHBoYSkgewogIHN0YXRlLT5zdHJva2VBbHBoYSA9IGFscGhhOwp9Cgp2b2lkIFNwbGFzaDo6c2V0RmlsbEFscGhhKFNwbGFzaENvb3JkIGFscGhhKSB7CiAgc3RhdGUtPmZpbGxBbHBoYSA9IGFscGhhOwp9Cgp2b2lkIFNwbGFzaDo6c2V0TGluZVdpZHRoKFNwbGFzaENvb3JkIGxpbmVXaWR0aCkgewogIHN0YXRlLT5saW5lV2lkdGggPSBsaW5lV2lkdGg7Cn0KCnZvaWQgU3BsYXNoOjpzZXRMaW5lQ2FwKGludCBsaW5lQ2FwKSB7CiAgc3RhdGUtPmxpbmVDYXAgPSBsaW5lQ2FwOwp9Cgp2b2lkIFNwbGFzaDo6c2V0TGluZUpvaW4oaW50IGxpbmVKb2luKSB7CiAgc3RhdGUtPmxpbmVKb2luID0gbGluZUpvaW47Cn0KCnZvaWQgU3BsYXNoOjpzZXRNaXRlckxpbWl0KFNwbGFzaENvb3JkIG1pdGVyTGltaXQpIHsKICBzdGF0ZS0+bWl0ZXJMaW1pdCA9IG1pdGVyTGltaXQ7Cn0KCnZvaWQgU3BsYXNoOjpzZXRGbGF0bmVzcyhTcGxhc2hDb29yZCBmbGF0bmVzcykgewogIGlmIChmbGF0bmVzcyA8IDEpIHsKICAgIHN0YXRlLT5mbGF0bmVzcyA9IDE7CiAgfSBlbHNlIHsKICAgIHN0YXRlLT5mbGF0bmVzcyA9IGZsYXRuZXNzOwogIH0KfQoKdm9pZCBTcGxhc2g6OnNldExpbmVEYXNoKFNwbGFzaENvb3JkICpsaW5lRGFzaCwgaW50IGxpbmVEYXNoTGVuZ3RoLAoJCQkgU3BsYXNoQ29vcmQgbGluZURhc2hQaGFzZSkgewogIHN0YXRlLT5zZXRMaW5lRGFzaChsaW5lRGFzaCwgbGluZURhc2hMZW5ndGgsIGxpbmVEYXNoUGhhc2UpOwp9Cgp2b2lkIFNwbGFzaDo6c2V0U3Ryb2tlQWRqdXN0KEdCb29sIHN0cm9rZUFkanVzdCkgewogIHN0YXRlLT5zdHJva2VBZGp1c3QgPSBzdHJva2VBZGp1c3Q7Cn0KCnZvaWQgU3BsYXNoOjpjbGlwUmVzZXRUb1JlY3QoU3BsYXNoQ29vcmQgeDAsIFNwbGFzaENvb3JkIHkwLAoJCQkgICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSkgewogIHN0YXRlLT5jbGlwLT5yZXNldFRvUmVjdCh4MCwgeTAsIHgxLCB5MSk7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6Y2xpcFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJCSAgICAgICBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEpIHsKICByZXR1cm4gc3RhdGUtPmNsaXAtPmNsaXBUb1JlY3QoeDAsIHkwLCB4MSwgeTEpOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OmNsaXBUb1BhdGgoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pIHsKICByZXR1cm4gc3RhdGUtPmNsaXAtPmNsaXBUb1BhdGgocGF0aCwgc3RhdGUtPm1hdHJpeCwgc3RhdGUtPmZsYXRuZXNzLCBlbyk7Cn0KCnZvaWQgU3BsYXNoOjpzZXRTb2Z0TWFzayhTcGxhc2hCaXRtYXAgKnNvZnRNYXNrKSB7CiAgc3RhdGUtPnNldFNvZnRNYXNrKHNvZnRNYXNrKTsKfQoKdm9pZCBTcGxhc2g6OnNldEluTm9uSXNvbGF0ZWRHcm91cChTcGxhc2hCaXRtYXAgKmFscGhhMEJpdG1hcEEsCgkJCQkgICBpbnQgYWxwaGEwWEEsIGludCBhbHBoYTBZQSkgewogIGFscGhhMEJpdG1hcCA9IGFscGhhMEJpdG1hcEE7CiAgYWxwaGEwWCA9IGFscGhhMFhBOwogIGFscGhhMFkgPSBhbHBoYTBZQTsKICBzdGF0ZS0+aW5Ob25Jc29sYXRlZEdyb3VwID0gZ1RydWU7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHN0YXRlIHNhdmUvcmVzdG9yZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBTcGxhc2g6OnNhdmVTdGF0ZSgpIHsKICBTcGxhc2hTdGF0ZSAqbmV3U3RhdGU7CgogIG5ld1N0YXRlID0gc3RhdGUtPmNvcHkoKTsKICBuZXdTdGF0ZS0+bmV4dCA9IHN0YXRlOwogIHN0YXRlID0gbmV3U3RhdGU7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6cmVzdG9yZVN0YXRlKCkgewogIFNwbGFzaFN0YXRlICpvbGRTdGF0ZTsKCiAgaWYgKCFzdGF0ZS0+bmV4dCkgewogICAgcmV0dXJuIHNwbGFzaEVyck5vU2F2ZTsKICB9CiAgb2xkU3RhdGUgPSBzdGF0ZTsKICBzdGF0ZSA9IHN0YXRlLT5uZXh0OwogIGRlbGV0ZSBvbGRTdGF0ZTsKICByZXR1cm4gc3BsYXNoT2s7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGRyYXdpbmcgb3BlcmF0aW9ucwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBTcGxhc2g6OmNsZWFyKFNwbGFzaENvbG9yUHRyIGNvbG9yLCBHdWNoYXIgYWxwaGEpIHsKICBTcGxhc2hDb2xvclB0ciByb3csIHA7CiAgR3VjaGFyIG1vbm87CiAgaW50IHgsIHk7CgogIHN3aXRjaCAoYml0bWFwLT5tb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBtb25vID0gKGNvbG9yWzBdICYgMHg4MCkgPyAweGZmIDogMHgwMDsKICAgIGlmIChiaXRtYXAtPnJvd1NpemUgPCAwKSB7CiAgICAgIG1lbXNldChiaXRtYXAtPmRhdGEgKyBiaXRtYXAtPnJvd1NpemUgKiAoYml0bWFwLT5oZWlnaHQgLSAxKSwKCSAgICAgbW9ubywgLWJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbXNldChiaXRtYXAtPmRhdGEsIG1vbm8sIGJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgaWYgKGJpdG1hcC0+cm93U2l6ZSA8IDApIHsKICAgICAgbWVtc2V0KGJpdG1hcC0+ZGF0YSArIGJpdG1hcC0+cm93U2l6ZSAqIChiaXRtYXAtPmhlaWdodCAtIDEpLAoJICAgICBjb2xvclswXSwgLWJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbXNldChiaXRtYXAtPmRhdGEsIGNvbG9yWzBdLCBiaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogICAgaWYgKGNvbG9yWzBdID09IGNvbG9yWzFdICYmIGNvbG9yWzFdID09IGNvbG9yWzJdKSB7CiAgICAgIGlmIChiaXRtYXAtPnJvd1NpemUgPCAwKSB7CgltZW1zZXQoYml0bWFwLT5kYXRhICsgYml0bWFwLT5yb3dTaXplICogKGJpdG1hcC0+aGVpZ2h0IC0gMSksCgkgICAgICAgY29sb3JbMF0sIC1iaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICAgIH0gZWxzZSB7CgltZW1zZXQoYml0bWFwLT5kYXRhLCBjb2xvclswXSwgYml0bWFwLT5yb3dTaXplICogYml0bWFwLT5oZWlnaHQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByb3cgPSBiaXRtYXAtPmRhdGE7CiAgICAgIGZvciAoeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodDsgKyt5KSB7CglwID0gcm93OwoJZm9yICh4ID0gMDsgeCA8IGJpdG1hcC0+d2lkdGg7ICsreCkgewoJICAqcCsrID0gY29sb3JbMl07CgkgICpwKysgPSBjb2xvclsxXTsKCSAgKnArKyA9IGNvbG9yWzBdOwoJfQoJcm93ICs9IGJpdG1hcC0+cm93U2l6ZTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICBpZiAoY29sb3JbMF0gPT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT0gY29sb3JbMl0pIHsKICAgICAgaWYgKGJpdG1hcC0+cm93U2l6ZSA8IDApIHsKCW1lbXNldChiaXRtYXAtPmRhdGEgKyBiaXRtYXAtPnJvd1NpemUgKiAoYml0bWFwLT5oZWlnaHQgLSAxKSwKCSAgICAgICBjb2xvclswXSwgLWJpdG1hcC0+cm93U2l6ZSAqIGJpdG1hcC0+aGVpZ2h0KTsKICAgICAgfSBlbHNlIHsKCW1lbXNldChiaXRtYXAtPmRhdGEsIGNvbG9yWzBdLCBiaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJvdyA9IGJpdG1hcC0+ZGF0YTsKICAgICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKCXAgPSByb3c7Cglmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CgkgICpwKysgPSBjb2xvclswXTsKCSAgKnArKyA9IGNvbG9yWzFdOwoJICAqcCsrID0gY29sb3JbMl07CgkgICpwKysgPSAyNTU7Cgl9Cglyb3cgKz0gYml0bWFwLT5yb3dTaXplOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVCR1I4OgogICAgaWYgKGNvbG9yWzBdID09IGNvbG9yWzFdICYmIGNvbG9yWzFdID09IGNvbG9yWzJdKSB7CiAgICAgIGlmIChiaXRtYXAtPnJvd1NpemUgPCAwKSB7CgltZW1zZXQoYml0bWFwLT5kYXRhICsgYml0bWFwLT5yb3dTaXplICogKGJpdG1hcC0+aGVpZ2h0IC0gMSksCgkgICAgICAgY29sb3JbMF0sIC1iaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICAgIH0gZWxzZSB7CgltZW1zZXQoYml0bWFwLT5kYXRhLCBjb2xvclswXSwgYml0bWFwLT5yb3dTaXplICogYml0bWFwLT5oZWlnaHQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByb3cgPSBiaXRtYXAtPmRhdGE7CiAgICAgIGZvciAoeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodDsgKyt5KSB7CglwID0gcm93OwoJZm9yICh4ID0gMDsgeCA8IGJpdG1hcC0+d2lkdGg7ICsreCkgewoJICAqcCsrID0gY29sb3JbMF07CgkgICpwKysgPSBjb2xvclsxXTsKCSAgKnArKyA9IGNvbG9yWzJdOwoJfQoJcm93ICs9IGJpdG1hcC0+cm93U2l6ZTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgaWYgKGNvbG9yWzBdID09IGNvbG9yWzFdICYmIGNvbG9yWzFdID09IGNvbG9yWzJdICYmIGNvbG9yWzJdID09IGNvbG9yWzNdKSB7CiAgICAgIGlmIChiaXRtYXAtPnJvd1NpemUgPCAwKSB7CgltZW1zZXQoYml0bWFwLT5kYXRhICsgYml0bWFwLT5yb3dTaXplICogKGJpdG1hcC0+aGVpZ2h0IC0gMSksCgkgICAgICAgY29sb3JbMF0sIC1iaXRtYXAtPnJvd1NpemUgKiBiaXRtYXAtPmhlaWdodCk7CiAgICAgIH0gZWxzZSB7CgltZW1zZXQoYml0bWFwLT5kYXRhLCBjb2xvclswXSwgYml0bWFwLT5yb3dTaXplICogYml0bWFwLT5oZWlnaHQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByb3cgPSBiaXRtYXAtPmRhdGE7CiAgICAgIGZvciAoeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodDsgKyt5KSB7CglwID0gcm93OwoJZm9yICh4ID0gMDsgeCA8IGJpdG1hcC0+d2lkdGg7ICsreCkgewoJICAqcCsrID0gY29sb3JbMF07CgkgICpwKysgPSBjb2xvclsxXTsKCSAgKnArKyA9IGNvbG9yWzJdOwoJICAqcCsrID0gY29sb3JbM107Cgl9Cglyb3cgKz0gYml0bWFwLT5yb3dTaXplOwogICAgICB9CiAgICB9CiAgICBicmVhazsKI2VuZGlmCiAgfQoKICBpZiAoYml0bWFwLT5hbHBoYSkgewogICAgbWVtc2V0KGJpdG1hcC0+YWxwaGEsIGFscGhhLCBiaXRtYXAtPndpZHRoICogYml0bWFwLT5oZWlnaHQpOwogIH0KCiAgdXBkYXRlTW9kWCgwKTsKICB1cGRhdGVNb2RZKDApOwogIHVwZGF0ZU1vZFgoYml0bWFwLT53aWR0aCAtIDEpOwogIHVwZGF0ZU1vZFkoYml0bWFwLT5oZWlnaHQgLSAxKTsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoOjpzdHJva2UoU3BsYXNoUGF0aCAqcGF0aCkgewogIFNwbGFzaFBhdGggKnBhdGgyLCAqZFBhdGg7CgogIGlmIChkZWJ1Z01vZGUpIHsKICAgIHByaW50Zigic3Ryb2tlIFtkYXNoOiVkXSBbd2lkdGg6JS4yZl06XG4iLAoJICAgc3RhdGUtPmxpbmVEYXNoTGVuZ3RoLCAoZG91YmxlKXN0YXRlLT5saW5lV2lkdGgpOwogICAgZHVtcFBhdGgocGF0aCk7CiAgfQogIG9wQ2xpcFJlcyA9IHNwbGFzaENsaXBBbGxPdXRzaWRlOwogIGlmIChwYXRoLT5sZW5ndGggPT0gMCkgewogICAgcmV0dXJuIHNwbGFzaEVyckVtcHR5UGF0aDsKICB9CiAgcGF0aDIgPSBmbGF0dGVuUGF0aChwYXRoLCBzdGF0ZS0+bWF0cml4LCBzdGF0ZS0+ZmxhdG5lc3MpOwogIGlmIChzdGF0ZS0+bGluZURhc2hMZW5ndGggPiAwKSB7CiAgICBkUGF0aCA9IG1ha2VEYXNoZWRQYXRoKHBhdGgyKTsKICAgIGRlbGV0ZSBwYXRoMjsKICAgIHBhdGgyID0gZFBhdGg7CiAgfQogIGlmIChzdGF0ZS0+bGluZVdpZHRoID09IDApIHsKICAgIHN0cm9rZU5hcnJvdyhwYXRoMik7CiAgfSBlbHNlIHsKICAgIHN0cm9rZVdpZGUocGF0aDIpOwogIH0KICBkZWxldGUgcGF0aDI7CiAgcmV0dXJuIHNwbGFzaE9rOwp9Cgp2b2lkIFNwbGFzaDo6c3Ryb2tlTmFycm93KFNwbGFzaFBhdGggKnBhdGgpIHsKICBTcGxhc2hQaXBlIHBpcGU7CiAgU3BsYXNoWFBhdGggKnhQYXRoOwogIFNwbGFzaFhQYXRoU2VnICpzZWc7CiAgaW50IHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHgsIHksIHQ7CiAgU3BsYXNoQ29vcmQgZHgsIGR5LCBkeGR5OwogIFNwbGFzaENsaXBSZXN1bHQgY2xpcFJlczsKICBpbnQgbkNsaXBSZXNbM107CiAgaW50IGk7CgogIG5DbGlwUmVzWzBdID0gbkNsaXBSZXNbMV0gPSBuQ2xpcFJlc1syXSA9IDA7CgogIHhQYXRoID0gbmV3IFNwbGFzaFhQYXRoKHBhdGgsIHN0YXRlLT5tYXRyaXgsIHN0YXRlLT5mbGF0bmVzcywgZ0ZhbHNlKTsKCiAgcGlwZUluaXQoJnBpcGUsIDAsIDAsIHN0YXRlLT5zdHJva2VQYXR0ZXJuLCBOVUxMLCBzdGF0ZS0+c3Ryb2tlQWxwaGEsCgkgICBnRmFsc2UsIGdGYWxzZSk7CgogIGZvciAoaSA9IDAsIHNlZyA9IHhQYXRoLT5zZWdzOyBpIDwgeFBhdGgtPmxlbmd0aDsgKytpLCArK3NlZykgewoKICAgIHgwID0gc3BsYXNoRmxvb3Ioc2VnLT54MCk7CiAgICB4MSA9IHNwbGFzaEZsb29yKHNlZy0+eDEpOwogICAgeTAgPSBzcGxhc2hGbG9vcihzZWctPnkwKTsKICAgIHkxID0gc3BsYXNoRmxvb3Ioc2VnLT55MSk7CgogICAgLy8gaG9yaXpvbnRhbCBzZWdtZW50CiAgICBpZiAoeTAgPT0geTEpIHsKICAgICAgaWYgKHgwID4geDEpIHsKCXQgPSB4MDsgeDAgPSB4MTsgeDEgPSB0OwogICAgICB9CiAgICAgIGlmICgoY2xpcFJlcyA9IHN0YXRlLT5jbGlwLT50ZXN0U3Bhbih4MCwgeDEsIHkwKSkKCSAgIT0gc3BsYXNoQ2xpcEFsbE91dHNpZGUpIHsKCWRyYXdTcGFuKCZwaXBlLCB4MCwgeDEsIHkwLCBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwogICAgICB9CgogICAgLy8gc2VnbWVudCB3aXRoIHxkeHwgPiB8ZHl8CiAgICB9IGVsc2UgaWYgKHNwbGFzaEFicyhzZWctPmR4ZHkpID4gMSkgewogICAgICBkeCA9IHNlZy0+eDEgLSBzZWctPngwOwogICAgICBkeSA9IHNlZy0+eTEgLSBzZWctPnkwOwogICAgICBkeGR5ID0gc2VnLT5keGR5OwogICAgICBpZiAoeTAgPiB5MSkgewoJdCA9IHkwOyB5MCA9IHkxOyB5MSA9IHQ7Cgl0ID0geDA7IHgwID0geDE7IHgxID0gdDsKCWR4ID0gLWR4OwoJZHkgPSAtZHk7CiAgICAgIH0KICAgICAgaWYgKChjbGlwUmVzID0gc3RhdGUtPmNsaXAtPnRlc3RSZWN0KHgwIDw9IHgxID8geDAgOiB4MSwgeTAsCgkJCQkJICAgeDAgPD0geDEgPyB4MSA6IHgwLCB5MSkpCgkgICE9IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CglpZiAoZHggPiAwKSB7CgkgIHgyID0geDA7CgkgIHgzID0gc3BsYXNoRmxvb3Ioc2VnLT54MCArICgoU3BsYXNoQ29vcmQpeTAgKyAxIC0gc2VnLT55MCkgKiBkeGR5KTsKCSAgZHJhd1NwYW4oJnBpcGUsIHgyLCAoeDIgPD0geDMgLSAxKSA/IHgzIC0gMSA6IHgyLCB5MCwKCQkgICBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJICB4MiA9IHgzOwoJICBmb3IgKHkgPSB5MCArIDE7IHkgPD0geTEgLSAxOyArK3kpIHsKCSAgICB4MyA9IHNwbGFzaEZsb29yKHNlZy0+eDAgKyAoKFNwbGFzaENvb3JkKXkgKyAxIC0gc2VnLT55MCkgKiBkeGR5KTsKCSAgICBkcmF3U3BhbigmcGlwZSwgeDIsIHgzIC0gMSwgeSwgY2xpcFJlcyA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgICB4MiA9IHgzOwoJICB9CgkgIGRyYXdTcGFuKCZwaXBlLCB4MiwgeDIgPD0geDEgPyB4MSA6IHgyLCB5MSwKCQkgICBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJfSBlbHNlIHsKCSAgeDIgPSB4MDsKCSAgeDMgPSBzcGxhc2hGbG9vcihzZWctPngwICsgKChTcGxhc2hDb29yZCl5MCArIDEgLSBzZWctPnkwKSAqIGR4ZHkpOwoJICBkcmF3U3BhbigmcGlwZSwgKHgzICsgMSA8PSB4MikgPyB4MyArIDEgOiB4MiwgeDIsIHkwLAoJCSAgIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgIHgyID0geDM7CgkgIGZvciAoeSA9IHkwICsgMTsgeSA8PSB5MSAtIDE7ICsreSkgewoJICAgIHgzID0gc3BsYXNoRmxvb3Ioc2VnLT54MCArICgoU3BsYXNoQ29vcmQpeSArIDEgLSBzZWctPnkwKSAqIGR4ZHkpOwoJICAgIGRyYXdTcGFuKCZwaXBlLCB4MyArIDEsIHgyLCB5LCBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJICAgIHgyID0geDM7CgkgIH0KCSAgZHJhd1NwYW4oJnBpcGUsIHgxLCAoeDEgPD0geDIpID8geDIgOiB4MSwgeTEsCgkJICAgY2xpcFJlcyA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCX0KICAgICAgfQoKICAgIC8vIHNlZ21lbnQgd2l0aCB8ZHl8ID4gfGR4fAogICAgfSBlbHNlIHsKICAgICAgZHhkeSA9IHNlZy0+ZHhkeTsKICAgICAgaWYgKHkwID4geTEpIHsKCXQgPSB4MDsgeDAgPSB4MTsgeDEgPSB0OwoJdCA9IHkwOyB5MCA9IHkxOyB5MSA9IHQ7CiAgICAgIH0KICAgICAgaWYgKChjbGlwUmVzID0gc3RhdGUtPmNsaXAtPnRlc3RSZWN0KHgwIDw9IHgxID8geDAgOiB4MSwgeTAsCgkJCQkJICAgeDAgPD0geDEgPyB4MSA6IHgwLCB5MSkpCgkgICE9IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CglkcmF3UGl4ZWwoJnBpcGUsIHgwLCB5MCwgY2xpcFJlcyA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCWZvciAoeSA9IHkwICsgMTsgeSA8PSB5MSAtIDE7ICsreSkgewoJICB4ID0gc3BsYXNoRmxvb3Ioc2VnLT54MCArICgoU3BsYXNoQ29vcmQpeSAtIHNlZy0+eTApICogZHhkeSk7CgkgIGRyYXdQaXhlbCgmcGlwZSwgeCwgeSwgY2xpcFJlcyA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCX0KCWRyYXdQaXhlbCgmcGlwZSwgeDEsIHkxLCBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwogICAgfQogICAgfQogICAgKytuQ2xpcFJlc1tjbGlwUmVzXTsKICB9CiAgaWYgKG5DbGlwUmVzW3NwbGFzaENsaXBQYXJ0aWFsXSB8fAogICAgICAobkNsaXBSZXNbc3BsYXNoQ2xpcEFsbEluc2lkZV0gJiYgbkNsaXBSZXNbc3BsYXNoQ2xpcEFsbE91dHNpZGVdKSkgewogICAgb3BDbGlwUmVzID0gc3BsYXNoQ2xpcFBhcnRpYWw7CiAgfSBlbHNlIGlmIChuQ2xpcFJlc1tzcGxhc2hDbGlwQWxsSW5zaWRlXSkgewogICAgb3BDbGlwUmVzID0gc3BsYXNoQ2xpcEFsbEluc2lkZTsKICB9IGVsc2UgewogICAgb3BDbGlwUmVzID0gc3BsYXNoQ2xpcEFsbE91dHNpZGU7CiAgfQoKICBkZWxldGUgeFBhdGg7Cn0KCnZvaWQgU3BsYXNoOjpzdHJva2VXaWRlKFNwbGFzaFBhdGggKnBhdGgpIHsKICBTcGxhc2hQYXRoICpwYXRoMjsKCiAgcGF0aDIgPSBtYWtlU3Ryb2tlUGF0aChwYXRoLCBnRmFsc2UpOwogIGZpbGxXaXRoUGF0dGVybihwYXRoMiwgZ0ZhbHNlLCBzdGF0ZS0+c3Ryb2tlUGF0dGVybiwgc3RhdGUtPnN0cm9rZUFscGhhKTsKICBkZWxldGUgcGF0aDI7Cn0KClNwbGFzaFBhdGggKlNwbGFzaDo6ZmxhdHRlblBhdGgoU3BsYXNoUGF0aCAqcGF0aCwgU3BsYXNoQ29vcmQgKm1hdHJpeCwKCQkJCVNwbGFzaENvb3JkIGZsYXRuZXNzKSB7CiAgU3BsYXNoUGF0aCAqZlBhdGg7CiAgU3BsYXNoQ29vcmQgZmxhdG5lc3MyOwogIEd1Y2hhciBmbGFnOwogIGludCBpOwoKICBmUGF0aCA9IG5ldyBTcGxhc2hQYXRoKCk7CiAgZmxhdG5lc3MyID0gZmxhdG5lc3MgKiBmbGF0bmVzczsKICBpID0gMDsKICB3aGlsZSAoaSA8IHBhdGgtPmxlbmd0aCkgewogICAgZmxhZyA9IHBhdGgtPmZsYWdzW2ldOwogICAgaWYgKGZsYWcgJiBzcGxhc2hQYXRoRmlyc3QpIHsKICAgICAgZlBhdGgtPm1vdmVUbyhwYXRoLT5wdHNbaV0ueCwgcGF0aC0+cHRzW2ldLnkpOwogICAgICArK2k7CiAgICB9IGVsc2UgewogICAgICBpZiAoZmxhZyAmIHNwbGFzaFBhdGhDdXJ2ZSkgewoJZmxhdHRlbkN1cnZlKHBhdGgtPnB0c1tpLTFdLngsIHBhdGgtPnB0c1tpLTFdLnksCgkJICAgICBwYXRoLT5wdHNbaSAgXS54LCBwYXRoLT5wdHNbaSAgXS55LAoJCSAgICAgcGF0aC0+cHRzW2krMV0ueCwgcGF0aC0+cHRzW2krMV0ueSwKCQkgICAgIHBhdGgtPnB0c1tpKzJdLngsIHBhdGgtPnB0c1tpKzJdLnksCgkJICAgICBtYXRyaXgsIGZsYXRuZXNzMiwgZlBhdGgpOwoJaSArPSAzOwogICAgICB9IGVsc2UgewoJZlBhdGgtPmxpbmVUbyhwYXRoLT5wdHNbaV0ueCwgcGF0aC0+cHRzW2ldLnkpOwoJKytpOwogICAgICB9CiAgICAgIGlmIChwYXRoLT5mbGFnc1tpLTFdICYgc3BsYXNoUGF0aENsb3NlZCkgewoJZlBhdGgtPmNsb3NlKCk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGZQYXRoOwp9Cgp2b2lkIFNwbGFzaDo6ZmxhdHRlbkN1cnZlKFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkJICBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEsCgkJCSAgU3BsYXNoQ29vcmQgeDIsIFNwbGFzaENvb3JkIHkyLAoJCQkgIFNwbGFzaENvb3JkIHgzLCBTcGxhc2hDb29yZCB5MywKCQkJICBTcGxhc2hDb29yZCAqbWF0cml4LCBTcGxhc2hDb29yZCBmbGF0bmVzczIsCgkJCSAgU3BsYXNoUGF0aCAqZlBhdGgpIHsKICBTcGxhc2hDb29yZCBjeFtzcGxhc2hNYXhDdXJ2ZVNwbGl0cyArIDFdWzNdOwogIFNwbGFzaENvb3JkIGN5W3NwbGFzaE1heEN1cnZlU3BsaXRzICsgMV1bM107CiAgaW50IGNOZXh0W3NwbGFzaE1heEN1cnZlU3BsaXRzICsgMV07CiAgU3BsYXNoQ29vcmQgeGwwLCB4bDEsIHhsMiwgeHIwLCB4cjEsIHhyMiwgeHIzLCB4eDEsIHh4MiwgeGg7CiAgU3BsYXNoQ29vcmQgeWwwLCB5bDEsIHlsMiwgeXIwLCB5cjEsIHlyMiwgeXIzLCB5eTEsIHl5MiwgeWg7CiAgU3BsYXNoQ29vcmQgZHgsIGR5LCBteCwgbXksIHR4LCB0eSwgZDEsIGQyOwogIGludCBwMSwgcDIsIHAzOwoKICAvLyBpbml0aWFsIHNlZ21lbnQKICBwMSA9IDA7CiAgcDIgPSBzcGxhc2hNYXhDdXJ2ZVNwbGl0czsKICBjeFtwMV1bMF0gPSB4MDsgIGN5W3AxXVswXSA9IHkwOwogIGN4W3AxXVsxXSA9IHgxOyAgY3lbcDFdWzFdID0geTE7CiAgY3hbcDFdWzJdID0geDI7ICBjeVtwMV1bMl0gPSB5MjsKICBjeFtwMl1bMF0gPSB4MzsgIGN5W3AyXVswXSA9IHkzOwogIGNOZXh0W3AxXSA9IHAyOwoKICB3aGlsZSAocDEgPCBzcGxhc2hNYXhDdXJ2ZVNwbGl0cykgewoKICAgIC8vIGdldCB0aGUgbmV4dCBzZWdtZW50CiAgICB4bDAgPSBjeFtwMV1bMF07ICB5bDAgPSBjeVtwMV1bMF07CiAgICB4eDEgPSBjeFtwMV1bMV07ICB5eTEgPSBjeVtwMV1bMV07CiAgICB4eDIgPSBjeFtwMV1bMl07ICB5eTIgPSBjeVtwMV1bMl07CiAgICBwMiA9IGNOZXh0W3AxXTsKICAgIHhyMyA9IGN4W3AyXVswXTsgIHlyMyA9IGN5W3AyXVswXTsKCiAgICAvLyBjb21wdXRlIHRoZSBkaXN0YW5jZXMgKGluIGRldmljZSBzcGFjZSkgZnJvbSB0aGUgY29udHJvbCBwb2ludHMKICAgIC8vIHRvIHRoZSBtaWRwb2ludCBvZiB0aGUgc3RyYWlnaHQgbGluZSAodGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssCiAgICAvLyBidXQgaXQncyBtdWNoIGZhc3RlciB0aGFuIGNvbXB1dGluZyB0aGUgYWN0dWFsIGRpc3RhbmNlcyB0byB0aGUKICAgIC8vIGxpbmUpCiAgICB0cmFuc2Zvcm0obWF0cml4LCAoeGwwICsgeHIzKSAqIDAuNSwgKHlsMCArIHlyMykgKiAwLjUsICZteCwgJm15KTsKICAgIHRyYW5zZm9ybShtYXRyaXgsIHh4MSwgeXkxLCAmdHgsICZ0eSk7CiAgICBkeCA9IHR4IC0gbXg7CiAgICBkeSA9IHR5IC0gbXk7CiAgICBkMSA9IGR4KmR4ICsgZHkqZHk7CiAgICB0cmFuc2Zvcm0obWF0cml4LCB4eDIsIHl5MiwgJnR4LCAmdHkpOwogICAgZHggPSB0eCAtIG14OwogICAgZHkgPSB0eSAtIG15OwogICAgZDIgPSBkeCpkeCArIGR5KmR5OwoKICAgIC8vIGlmIHRoZSBjdXJ2ZSBpcyBmbGF0IGVub3VnaCwgb3Igbm8gbW9yZSBzdWJkaXZpc2lvbnMgYXJlCiAgICAvLyBhbGxvd2VkLCBhZGQgdGhlIHN0cmFpZ2h0IGxpbmUgc2VnbWVudAogICAgaWYgKHAyIC0gcDEgPT0gMSB8fCAoZDEgPD0gZmxhdG5lc3MyICYmIGQyIDw9IGZsYXRuZXNzMikpIHsKICAgICAgZlBhdGgtPmxpbmVUbyh4cjMsIHlyMyk7CiAgICAgIHAxID0gcDI7CgogICAgLy8gb3RoZXJ3aXNlLCBzdWJkaXZpZGUgdGhlIGN1cnZlCiAgICB9IGVsc2UgewogICAgICB4bDEgPSAoeGwwICsgeHgxKSAqIDAuNTsKICAgICAgeWwxID0gKHlsMCArIHl5MSkgKiAwLjU7CiAgICAgIHhoID0gKHh4MSArIHh4MikgKiAwLjU7CiAgICAgIHloID0gKHl5MSArIHl5MikgKiAwLjU7CiAgICAgIHhsMiA9ICh4bDEgKyB4aCkgKiAwLjU7CiAgICAgIHlsMiA9ICh5bDEgKyB5aCkgKiAwLjU7CiAgICAgIHhyMiA9ICh4eDIgKyB4cjMpICogMC41OwogICAgICB5cjIgPSAoeXkyICsgeXIzKSAqIDAuNTsKICAgICAgeHIxID0gKHhoICsgeHIyKSAqIDAuNTsKICAgICAgeXIxID0gKHloICsgeXIyKSAqIDAuNTsKICAgICAgeHIwID0gKHhsMiArIHhyMSkgKiAwLjU7CiAgICAgIHlyMCA9ICh5bDIgKyB5cjEpICogMC41OwogICAgICAvLyBhZGQgdGhlIG5ldyBzdWJkaXZpc2lvbiBwb2ludHMKICAgICAgcDMgPSAocDEgKyBwMikgLyAyOwogICAgICBjeFtwMV1bMV0gPSB4bDE7ICBjeVtwMV1bMV0gPSB5bDE7CiAgICAgIGN4W3AxXVsyXSA9IHhsMjsgIGN5W3AxXVsyXSA9IHlsMjsKICAgICAgY05leHRbcDFdID0gcDM7CiAgICAgIGN4W3AzXVswXSA9IHhyMDsgIGN5W3AzXVswXSA9IHlyMDsKICAgICAgY3hbcDNdWzFdID0geHIxOyAgY3lbcDNdWzFdID0geXIxOwogICAgICBjeFtwM11bMl0gPSB4cjI7ICBjeVtwM11bMl0gPSB5cjI7CiAgICAgIGNOZXh0W3AzXSA9IHAyOwogICAgfQogIH0KfQoKU3BsYXNoUGF0aCAqU3BsYXNoOjptYWtlRGFzaGVkUGF0aChTcGxhc2hQYXRoICpwYXRoKSB7CiAgU3BsYXNoUGF0aCAqZFBhdGg7CiAgU3BsYXNoQ29vcmQgbGluZURhc2hUb3RhbDsKICBTcGxhc2hDb29yZCBsaW5lRGFzaFN0YXJ0UGhhc2UsIGxpbmVEYXNoRGlzdCwgc2VnTGVuOwogIFNwbGFzaENvb3JkIHgwLCB5MCwgeDEsIHkxLCB4YSwgeWE7CiAgR0Jvb2wgbGluZURhc2hTdGFydE9uLCBsaW5lRGFzaE9uLCBuZXdQYXRoOwogIGludCBsaW5lRGFzaFN0YXJ0SWR4LCBsaW5lRGFzaElkeDsKICBpbnQgaSwgaiwgazsKCiAgbGluZURhc2hUb3RhbCA9IDA7CiAgZm9yIChpID0gMDsgaSA8IHN0YXRlLT5saW5lRGFzaExlbmd0aDsgKytpKSB7CiAgICBsaW5lRGFzaFRvdGFsICs9IHN0YXRlLT5saW5lRGFzaFtpXTsKICB9CiAgbGluZURhc2hTdGFydFBoYXNlID0gc3RhdGUtPmxpbmVEYXNoUGhhc2U7CiAgaSA9IHNwbGFzaEZsb29yKGxpbmVEYXNoU3RhcnRQaGFzZSAvIGxpbmVEYXNoVG90YWwpOwogIGxpbmVEYXNoU3RhcnRQaGFzZSAtPSAoU3BsYXNoQ29vcmQpaSAqIGxpbmVEYXNoVG90YWw7CiAgbGluZURhc2hTdGFydE9uID0gZ1RydWU7CiAgbGluZURhc2hTdGFydElkeCA9IDA7CiAgd2hpbGUgKGxpbmVEYXNoU3RhcnRQaGFzZSA+PSBzdGF0ZS0+bGluZURhc2hbbGluZURhc2hTdGFydElkeF0pIHsKICAgIGxpbmVEYXNoU3RhcnRPbiA9ICFsaW5lRGFzaFN0YXJ0T247CiAgICBsaW5lRGFzaFN0YXJ0UGhhc2UgLT0gc3RhdGUtPmxpbmVEYXNoW2xpbmVEYXNoU3RhcnRJZHhdOwogICAgKytsaW5lRGFzaFN0YXJ0SWR4OwogIH0KCiAgZFBhdGggPSBuZXcgU3BsYXNoUGF0aCgpOwoKICAvLyBwcm9jZXNzIGVhY2ggc3VicGF0aAogIGkgPSAwOwogIHdoaWxlIChpIDwgcGF0aC0+bGVuZ3RoKSB7CgogICAgLy8gZmluZCB0aGUgZW5kIG9mIHRoZSBzdWJwYXRoCiAgICBmb3IgKGogPSBpOwoJIGogPCBwYXRoLT5sZW5ndGggLSAxICYmICEocGF0aC0+ZmxhZ3Nbal0gJiBzcGxhc2hQYXRoTGFzdCk7CgkgKytqKSA7CgogICAgLy8gaW5pdGlhbGl6ZSB0aGUgZGFzaCBwYXJhbWV0ZXJzCiAgICBsaW5lRGFzaE9uID0gbGluZURhc2hTdGFydE9uOwogICAgbGluZURhc2hJZHggPSBsaW5lRGFzaFN0YXJ0SWR4OwogICAgbGluZURhc2hEaXN0ID0gc3RhdGUtPmxpbmVEYXNoW2xpbmVEYXNoSWR4XSAtIGxpbmVEYXNoU3RhcnRQaGFzZTsKCiAgICAvLyBwcm9jZXNzIGVhY2ggc2VnbWVudCBvZiB0aGUgc3VicGF0aAogICAgbmV3UGF0aCA9IGdUcnVlOwogICAgZm9yIChrID0gaTsgayA8IGo7ICsraykgewoKICAgICAgLy8gZ3JhYiB0aGUgc2VnbWVudAogICAgICB4MCA9IHBhdGgtPnB0c1trXS54OwogICAgICB5MCA9IHBhdGgtPnB0c1trXS55OwogICAgICB4MSA9IHBhdGgtPnB0c1trKzFdLng7CiAgICAgIHkxID0gcGF0aC0+cHRzW2srMV0ueTsKICAgICAgc2VnTGVuID0gc3BsYXNoRGlzdCh4MCwgeTAsIHgxLCB5MSk7CgogICAgICAvLyBwcm9jZXNzIHRoZSBzZWdtZW50CiAgICAgIHdoaWxlIChzZWdMZW4gPiAwKSB7CgoJaWYgKGxpbmVEYXNoRGlzdCA+PSBzZWdMZW4pIHsKCSAgaWYgKGxpbmVEYXNoT24pIHsKCSAgICBpZiAobmV3UGF0aCkgewoJICAgICAgZFBhdGgtPm1vdmVUbyh4MCwgeTApOwoJICAgICAgbmV3UGF0aCA9IGdGYWxzZTsKCSAgICB9CgkgICAgZFBhdGgtPmxpbmVUbyh4MSwgeTEpOwoJICB9CgkgIGxpbmVEYXNoRGlzdCAtPSBzZWdMZW47CgkgIHNlZ0xlbiA9IDA7CgoJfSBlbHNlIHsKCSAgeGEgPSB4MCArIChsaW5lRGFzaERpc3QgLyBzZWdMZW4pICogKHgxIC0geDApOwoJICB5YSA9IHkwICsgKGxpbmVEYXNoRGlzdCAvIHNlZ0xlbikgKiAoeTEgLSB5MCk7CgkgIGlmIChsaW5lRGFzaE9uKSB7CgkgICAgaWYgKG5ld1BhdGgpIHsKCSAgICAgIGRQYXRoLT5tb3ZlVG8oeDAsIHkwKTsKCSAgICAgIG5ld1BhdGggPSBnRmFsc2U7CgkgICAgfQoJICAgIGRQYXRoLT5saW5lVG8oeGEsIHlhKTsKCSAgfQoJICB4MCA9IHhhOwoJICB5MCA9IHlhOwoJICBzZWdMZW4gLT0gbGluZURhc2hEaXN0OwoJICBsaW5lRGFzaERpc3QgPSAwOwoJfQoKCS8vIGdldCB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgZGFzaCBhcnJheQoJaWYgKGxpbmVEYXNoRGlzdCA8PSAwKSB7CgkgIGxpbmVEYXNoT24gPSAhbGluZURhc2hPbjsKCSAgaWYgKCsrbGluZURhc2hJZHggPT0gc3RhdGUtPmxpbmVEYXNoTGVuZ3RoKSB7CgkgICAgbGluZURhc2hJZHggPSAwOwoJICB9CgkgIGxpbmVEYXNoRGlzdCA9IHN0YXRlLT5saW5lRGFzaFtsaW5lRGFzaElkeF07CgkgIG5ld1BhdGggPSBnVHJ1ZTsKCX0KICAgICAgfQogICAgfQogICAgaSA9IGogKyAxOwogIH0KCiAgcmV0dXJuIGRQYXRoOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OmZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pIHsKICBpZiAoZGVidWdNb2RlKSB7CiAgICBwcmludGYoImZpbGwgW2VvOiVkXTpcbiIsIGVvKTsKICAgIGR1bXBQYXRoKHBhdGgpOwogIH0KICByZXR1cm4gZmlsbFdpdGhQYXR0ZXJuKHBhdGgsIGVvLCBzdGF0ZS0+ZmlsbFBhdHRlcm4sIHN0YXRlLT5maWxsQWxwaGEpOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OmZpbGxXaXRoUGF0dGVybihTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbywKCQkJCSAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuLAoJCQkJICAgIFNwbGFzaENvb3JkIGFscGhhKSB7CiAgU3BsYXNoUGlwZSBwaXBlOwogIFNwbGFzaFhQYXRoICp4UGF0aDsKICBTcGxhc2hYUGF0aFNjYW5uZXIgKnNjYW5uZXI7CiAgaW50IHhNaW5JLCB5TWluSSwgeE1heEksIHlNYXhJLCB4MCwgeDEsIHk7CiAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzLCBjbGlwUmVzMjsKCiAgaWYgKHBhdGgtPmxlbmd0aCA9PSAwKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyRW1wdHlQYXRoOwogIH0KICB4UGF0aCA9IG5ldyBTcGxhc2hYUGF0aChwYXRoLCBzdGF0ZS0+bWF0cml4LCBzdGF0ZS0+ZmxhdG5lc3MsIGdUcnVlKTsKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICB4UGF0aC0+YWFTY2FsZSgpOwogIH0KICB4UGF0aC0+c29ydCgpOwogIHNjYW5uZXIgPSBuZXcgU3BsYXNoWFBhdGhTY2FubmVyKHhQYXRoLCBlbyk7CgogIC8vIGdldCB0aGUgbWluIGFuZCBtYXggeCBhbmQgeSB2YWx1ZXMKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBzY2FubmVyLT5nZXRCQm94QUEoJnhNaW5JLCAmeU1pbkksICZ4TWF4SSwgJnlNYXhJKTsKICB9IGVsc2UgewogICAgc2Nhbm5lci0+Z2V0QkJveCgmeE1pbkksICZ5TWluSSwgJnhNYXhJLCAmeU1heEkpOwogIH0KCiAgLy8gY2hlY2sgY2xpcHBpbmcKICBpZiAoKGNsaXBSZXMgPSBzdGF0ZS0+Y2xpcC0+dGVzdFJlY3QoeE1pbkksIHlNaW5JLCB4TWF4SSwgeU1heEkpKQogICAgICAhPSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewoKICAgIC8vIGxpbWl0IHRoZSB5IHJhbmdlCiAgICBpZiAoeU1pbkkgPCBzdGF0ZS0+Y2xpcC0+Z2V0WU1pbkkoKSkgewogICAgICB5TWluSSA9IHN0YXRlLT5jbGlwLT5nZXRZTWluSSgpOwogICAgfQogICAgaWYgKHlNYXhJID4gc3RhdGUtPmNsaXAtPmdldFlNYXhJKCkpIHsKICAgICAgeU1heEkgPSBzdGF0ZS0+Y2xpcC0+Z2V0WU1heEkoKTsKICAgIH0KCiAgICBwaXBlSW5pdCgmcGlwZSwgMCwgeU1pbkksIHBhdHRlcm4sIE5VTEwsIGFscGhhLCB2ZWN0b3JBbnRpYWxpYXMsIGdGYWxzZSk7CgogICAgLy8gZHJhdyB0aGUgc3BhbnMKICAgIGlmICh2ZWN0b3JBbnRpYWxpYXMpIHsKICAgICAgZm9yICh5ID0geU1pbkk7IHkgPD0geU1heEk7ICsreSkgewoJc2Nhbm5lci0+cmVuZGVyQUFMaW5lKGFhQnVmLCAmeDAsICZ4MSwgeSk7CglpZiAoY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgIHN0YXRlLT5jbGlwLT5jbGlwQUFMaW5lKGFhQnVmLCAmeDAsICZ4MSwgeSk7Cgl9CglkcmF3QUFMaW5lKCZwaXBlLCB4MCwgeDEsIHkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKHkgPSB5TWluSTsgeSA8PSB5TWF4STsgKyt5KSB7Cgl3aGlsZSAoc2Nhbm5lci0+Z2V0TmV4dFNwYW4oeSwgJngwLCAmeDEpKSB7CgkgIGlmIChjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgICBkcmF3U3BhbigmcGlwZSwgeDAsIHgxLCB5LCBnVHJ1ZSk7CgkgIH0gZWxzZSB7CgkgICAgLy8gbGltaXQgdGhlIHggcmFuZ2UKCSAgICBpZiAoeDAgPCBzdGF0ZS0+Y2xpcC0+Z2V0WE1pbkkoKSkgewoJICAgICAgeDAgPSBzdGF0ZS0+Y2xpcC0+Z2V0WE1pbkkoKTsKCSAgICB9CgkgICAgaWYgKHgxID4gc3RhdGUtPmNsaXAtPmdldFhNYXhJKCkpIHsKCSAgICAgIHgxID0gc3RhdGUtPmNsaXAtPmdldFhNYXhJKCk7CgkgICAgfQoJICAgIGNsaXBSZXMyID0gc3RhdGUtPmNsaXAtPnRlc3RTcGFuKHgwLCB4MSwgeSk7CgkgICAgZHJhd1NwYW4oJnBpcGUsIHgwLCB4MSwgeSwgY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgIH0KCX0KICAgICAgfQogICAgfQogIH0KICBvcENsaXBSZXMgPSBjbGlwUmVzOwoKICBkZWxldGUgc2Nhbm5lcjsKICBkZWxldGUgeFBhdGg7CiAgcmV0dXJuIHNwbGFzaE9rOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OnhvckZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pIHsKICBTcGxhc2hQaXBlIHBpcGU7CiAgU3BsYXNoWFBhdGggKnhQYXRoOwogIFNwbGFzaFhQYXRoU2Nhbm5lciAqc2Nhbm5lcjsKICBpbnQgeE1pbkksIHlNaW5JLCB4TWF4SSwgeU1heEksIHgwLCB4MSwgeTsKICBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMsIGNsaXBSZXMyOwogIFNwbGFzaEJsZW5kRnVuYyBvcmlnQmxlbmRGdW5jOwoKICBpZiAocGF0aC0+bGVuZ3RoID09IDApIHsKICAgIHJldHVybiBzcGxhc2hFcnJFbXB0eVBhdGg7CiAgfQogIHhQYXRoID0gbmV3IFNwbGFzaFhQYXRoKHBhdGgsIHN0YXRlLT5tYXRyaXgsIHN0YXRlLT5mbGF0bmVzcywgZ1RydWUpOwogIHhQYXRoLT5zb3J0KCk7CiAgc2Nhbm5lciA9IG5ldyBTcGxhc2hYUGF0aFNjYW5uZXIoeFBhdGgsIGVvKTsKCiAgLy8gZ2V0IHRoZSBtaW4gYW5kIG1heCB4IGFuZCB5IHZhbHVlcwogIHNjYW5uZXItPmdldEJCb3goJnhNaW5JLCAmeU1pbkksICZ4TWF4SSwgJnlNYXhJKTsKCiAgLy8gY2hlY2sgY2xpcHBpbmcKICBpZiAoKGNsaXBSZXMgPSBzdGF0ZS0+Y2xpcC0+dGVzdFJlY3QoeE1pbkksIHlNaW5JLCB4TWF4SSwgeU1heEkpKQogICAgICAhPSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewoKICAgIC8vIGxpbWl0IHRoZSB5IHJhbmdlCiAgICBpZiAoeU1pbkkgPCBzdGF0ZS0+Y2xpcC0+Z2V0WU1pbkkoKSkgewogICAgICB5TWluSSA9IHN0YXRlLT5jbGlwLT5nZXRZTWluSSgpOwogICAgfQogICAgaWYgKHlNYXhJID4gc3RhdGUtPmNsaXAtPmdldFlNYXhJKCkpIHsKICAgICAgeU1heEkgPSBzdGF0ZS0+Y2xpcC0+Z2V0WU1heEkoKTsKICAgIH0KCiAgICBvcmlnQmxlbmRGdW5jID0gc3RhdGUtPmJsZW5kRnVuYzsKICAgIHN0YXRlLT5ibGVuZEZ1bmMgPSAmYmxlbmRYb3I7CiAgICBwaXBlSW5pdCgmcGlwZSwgMCwgeU1pbkksIHN0YXRlLT5maWxsUGF0dGVybiwgTlVMTCwgMSwgZ0ZhbHNlLCBnRmFsc2UpOwoKICAgIC8vIGRyYXcgdGhlIHNwYW5zCiAgICBmb3IgKHkgPSB5TWluSTsgeSA8PSB5TWF4STsgKyt5KSB7CiAgICAgIHdoaWxlIChzY2FubmVyLT5nZXROZXh0U3Bhbih5LCAmeDAsICZ4MSkpIHsKCWlmIChjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgZHJhd1NwYW4oJnBpcGUsIHgwLCB4MSwgeSwgZ1RydWUpOwoJfSBlbHNlIHsKCSAgLy8gbGltaXQgdGhlIHggcmFuZ2UKCSAgaWYgKHgwIDwgc3RhdGUtPmNsaXAtPmdldFhNaW5JKCkpIHsKCSAgICB4MCA9IHN0YXRlLT5jbGlwLT5nZXRYTWluSSgpOwoJICB9CgkgIGlmICh4MSA+IHN0YXRlLT5jbGlwLT5nZXRYTWF4SSgpKSB7CgkgICAgeDEgPSBzdGF0ZS0+Y2xpcC0+Z2V0WE1heEkoKTsKCSAgfQoJICBjbGlwUmVzMiA9IHN0YXRlLT5jbGlwLT50ZXN0U3Bhbih4MCwgeDEsIHkpOwoJICBkcmF3U3BhbigmcGlwZSwgeDAsIHgxLCB5LCBjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCX0KICAgICAgfQogICAgfQogICAgc3RhdGUtPmJsZW5kRnVuYyA9IG9yaWdCbGVuZEZ1bmM7CiAgfQogIG9wQ2xpcFJlcyA9IGNsaXBSZXM7CgogIGRlbGV0ZSBzY2FubmVyOwogIGRlbGV0ZSB4UGF0aDsKICByZXR1cm4gc3BsYXNoT2s7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6ZmlsbENoYXIoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwKCQkJICAgICBpbnQgYywgU3BsYXNoRm9udCAqZm9udCkgewogIFNwbGFzaEdseXBoQml0bWFwIGdseXBoOwogIFNwbGFzaENvb3JkIHh0LCB5dDsKICBpbnQgeDAsIHkwLCB4RnJhYywgeUZyYWM7CiAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzOwoKICBpZiAoZGVidWdNb2RlKSB7CiAgICBwcmludGYoImZpbGxDaGFyOiB4PSUuMmYgeT0lLjJmIGM9JTNkPTB4JTAyeD0nJWMnXG4iLAoJICAgKGRvdWJsZSl4LCAoZG91YmxlKXksIGMsIGMsIGMpOwogIH0KICB0cmFuc2Zvcm0oc3RhdGUtPm1hdHJpeCwgeCwgeSwgJnh0LCAmeXQpOwogIHgwID0gc3BsYXNoRmxvb3IoeHQpOwogIHhGcmFjID0gc3BsYXNoRmxvb3IoKHh0IC0geDApICogc3BsYXNoRm9udEZyYWN0aW9uKTsKICB5MCA9IHNwbGFzaEZsb29yKHl0KTsKICB5RnJhYyA9IHNwbGFzaEZsb29yKCh5dCAtIHkwKSAqIHNwbGFzaEZvbnRGcmFjdGlvbik7CiAgaWYgKCFmb250LT5nZXRHbHlwaChjLCB4RnJhYywgeUZyYWMsICZnbHlwaCwgeDAsIHkwLCBzdGF0ZS0+Y2xpcCwgJmNsaXBSZXMpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyTm9HbHlwaDsKICB9CiAgaWYgKGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbE91dHNpZGUpIHsKICAgIGZpbGxHbHlwaDIoeDAsIHkwLCAmZ2x5cGgsIGNsaXBSZXMgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CiAgfQogIG9wQ2xpcFJlcyA9IGNsaXBSZXM7CiAgaWYgKGdseXBoLmZyZWVEYXRhKSB7CiAgICBnZnJlZShnbHlwaC5kYXRhKTsKICB9CiAgcmV0dXJuIHNwbGFzaE9rOwp9Cgp2b2lkIFNwbGFzaDo6ZmlsbEdseXBoKFNwbGFzaENvb3JkIHgsIFNwbGFzaENvb3JkIHksCgkJCSAgICAgIFNwbGFzaEdseXBoQml0bWFwICpnbHlwaCkgewogIFNwbGFzaENvb3JkIHh0LCB5dDsKICBpbnQgeDAsIHkwOwoKICB0cmFuc2Zvcm0oc3RhdGUtPm1hdHJpeCwgeCwgeSwgJnh0LCAmeXQpOwogIHgwID0gc3BsYXNoRmxvb3IoeHQpOwogIHkwID0gc3BsYXNoRmxvb3IoeXQpOwogIFNwbGFzaENsaXBSZXN1bHQgY2xpcFJlcyA9IHN0YXRlLT5jbGlwLT50ZXN0UmVjdCh4MCAtIGdseXBoLT54LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkwIC0gZ2x5cGgtPnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDAgLSBnbHlwaC0+eCArIGdseXBoLT53IC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MCAtIGdseXBoLT55ICsgZ2x5cGgtPmggLSAxKTsKICBpZiAoY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewogICAgZmlsbEdseXBoMih4MCwgeTAsIGdseXBoLCBjbGlwUmVzID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwogIH0KICBvcENsaXBSZXMgPSBjbGlwUmVzOwp9Cgp2b2lkIFNwbGFzaDo6ZmlsbEdseXBoMihpbnQgeDAsIGludCB5MCwgU3BsYXNoR2x5cGhCaXRtYXAgKmdseXBoLCBHQm9vbCBub0NsaXApIHsKICBTcGxhc2hQaXBlIHBpcGU7CiAgaW50IGFscGhhMCwgYWxwaGE7CiAgR3VjaGFyICpwOwogIGludCB4MSwgeTEsIHh4LCB4eDEsIHl5OwoKICBwID0gZ2x5cGgtPmRhdGE7CiAgaW50IHhTdGFydCA9IHgwIC0gZ2x5cGgtPng7CiAgaW50IHlTdGFydCA9IHkwIC0gZ2x5cGgtPnk7CiAgaW50IHh4TGltaXQgPSBnbHlwaC0+dzsKICBpbnQgeXlMaW1pdCA9IGdseXBoLT5oOwoKICBpZiAoeVN0YXJ0IDwgMCkKICB7CiAgICBwICs9IGdseXBoLT53ICogLXlTdGFydDsgLy8gbW92ZSBwIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHBhaW50ZWQgcm93CiAgICB5eUxpbWl0ICs9IHlTdGFydDsKICAgIHlTdGFydCA9IDA7CiAgfQoKICBpZiAoeFN0YXJ0IDwgMCkKICB7CiAgICBwICs9IC14U3RhcnQ7IC8vIG1vdmUgcCB0byB0aGUgZmlyc3QgcGFpbnRlZCBwaXhlbAogICAgeHhMaW1pdCArPSB4U3RhcnQ7CiAgICB4U3RhcnQgPSAwOwogIH0KCiAgaWYgKHh4TGltaXQgKyB4U3RhcnQgPj0gYml0bWFwLT53aWR0aCkgeHhMaW1pdCA9IGJpdG1hcC0+d2lkdGggLSB4U3RhcnQ7CiAgaWYgKHl5TGltaXQgKyB5U3RhcnQgPj0gYml0bWFwLT5oZWlnaHQpIHl5TGltaXQgPSBiaXRtYXAtPmhlaWdodCAtIHlTdGFydDsKCiAgaWYgKG5vQ2xpcCkgewogICAgaWYgKGdseXBoLT5hYSkgewogICAgICBwaXBlSW5pdCgmcGlwZSwgeFN0YXJ0LCB5U3RhcnQsCiAgICAgICAgICAgICAgIHN0YXRlLT5maWxsUGF0dGVybiwgTlVMTCwgc3RhdGUtPmZpbGxBbHBoYSwgZ1RydWUsIGdGYWxzZSk7CiAgICAgIGZvciAoeXkgPSAwLCB5MSA9IHlTdGFydDsgeXkgPCB5eUxpbWl0OyArK3l5LCArK3kxKSB7CiAgICAgICAgcGlwZVNldFhZKCZwaXBlLCB4U3RhcnQsIHkxKTsKICAgICAgICBmb3IgKHh4ID0gMCwgeDEgPSB4U3RhcnQ7IHh4IDwgeHhMaW1pdDsgKyt4eCwgKyt4MSkgewogICAgICAgICAgYWxwaGEgPSBwW3h4XTsKICAgICAgICAgIGlmIChhbHBoYSAhPSAwKSB7CiAgICAgICAgICAgIHBpcGUuc2hhcGUgPSAoU3BsYXNoQ29vcmQpKGFscGhhIC8gMjU1LjApOwogICAgICAgICAgICBwaXBlUnVuKCZwaXBlKTsKICAgICAgICAgICAgdXBkYXRlTW9kWCh4MSk7CiAgICAgICAgICAgIHVwZGF0ZU1vZFkoeTEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGlwZUluY1goJnBpcGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwICs9IGdseXBoLT53OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBpbnQgd2lkdGhFaWdodCA9IHNwbGFzaENlaWwoZ2x5cGgtPncgLyA4LjApOwoKICAgICAgcGlwZUluaXQoJnBpcGUsIHhTdGFydCwgeVN0YXJ0LAogICAgICAgICAgICAgICBzdGF0ZS0+ZmlsbFBhdHRlcm4sIE5VTEwsIHN0YXRlLT5maWxsQWxwaGEsIGdGYWxzZSwgZ0ZhbHNlKTsKICAgICAgZm9yICh5eSA9IDAsIHkxID0geVN0YXJ0OyB5eSA8IHl5TGltaXQ7ICsreXksICsreTEpIHsKICAgICAgICBwaXBlU2V0WFkoJnBpcGUsIHhTdGFydCwgeTEpOwogICAgICAgIGZvciAoeHggPSAwLCB4MSA9IHhTdGFydDsgeHggPCB4eExpbWl0OyB4eCArPSA4KSB7CiAgICAgICAgICBhbHBoYTAgPSBwW3h4IC8gOF07CiAgICAgICAgICBmb3IgKHh4MSA9IDA7IHh4MSA8IDggJiYgeHggKyB4eDEgPCB4eExpbWl0OyArK3h4MSwgKyt4MSkgewogICAgICAgICAgICBpZiAoYWxwaGEwICYgMHg4MCkgewogICAgICAgICAgICAgIHBpcGVSdW4oJnBpcGUpOwogICAgICAgICAgICAgIHVwZGF0ZU1vZFgoeDEpOwogICAgICAgICAgICAgIHVwZGF0ZU1vZFkoeTEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBpcGVJbmNYKCZwaXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbHBoYTAgPDw9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHAgKz0gd2lkdGhFaWdodDsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoZ2x5cGgtPmFhKSB7CiAgICAgIHBpcGVJbml0KCZwaXBlLCB4U3RhcnQsIHlTdGFydCwKICAgICAgICAgICAgICAgc3RhdGUtPmZpbGxQYXR0ZXJuLCBOVUxMLCBzdGF0ZS0+ZmlsbEFscGhhLCBnVHJ1ZSwgZ0ZhbHNlKTsKICAgICAgZm9yICh5eSA9IDAsIHkxID0geVN0YXJ0OyB5eSA8IHl5TGltaXQ7ICsreXksICsreTEpIHsKICAgICAgICBwaXBlU2V0WFkoJnBpcGUsIHhTdGFydCwgeTEpOwogICAgICAgIGZvciAoeHggPSAwLCB4MSA9IHhTdGFydDsgeHggPCB4eExpbWl0OyArK3h4LCArK3gxKSB7CiAgICAgICAgICBpZiAoc3RhdGUtPmNsaXAtPnRlc3QoeDEsIHkxKSkgewogICAgICAgICAgICBhbHBoYSA9IHBbeHhdOwogICAgICAgICAgICBpZiAoYWxwaGEgIT0gMCkgewogICAgICAgICAgICAgIHBpcGUuc2hhcGUgPSAoU3BsYXNoQ29vcmQpKGFscGhhIC8gMjU1LjApOwogICAgICAgICAgICAgIHBpcGVSdW4oJnBpcGUpOwogICAgICAgICAgICAgIHVwZGF0ZU1vZFgoeDEpOwogICAgICAgICAgICAgIHVwZGF0ZU1vZFkoeTEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBpcGVJbmNYKCZwaXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGlwZUluY1goJnBpcGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwICs9IGdseXBoLT53OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBpbnQgd2lkdGhFaWdodCA9IHNwbGFzaENlaWwoZ2x5cGgtPncgLyA4LjApOwoKICAgICAgcGlwZUluaXQoJnBpcGUsIHhTdGFydCwgeVN0YXJ0LAogICAgICAgICAgICAgICBzdGF0ZS0+ZmlsbFBhdHRlcm4sIE5VTEwsIHN0YXRlLT5maWxsQWxwaGEsIGdGYWxzZSwgZ0ZhbHNlKTsKICAgICAgZm9yICh5eSA9IDAsIHkxID0geVN0YXJ0OyB5eSA8IHl5TGltaXQ7ICsreXksICsreTEpIHsKICAgICAgICBwaXBlU2V0WFkoJnBpcGUsIHhTdGFydCwgeTEpOwogICAgICAgIGZvciAoeHggPSAwLCB4MSA9IHhTdGFydDsgeHggPCB4eExpbWl0OyB4eCArPSA4KSB7CiAgICAgICAgICBhbHBoYTAgPSBwW3h4IC8gOF07CiAgICAgICAgICBmb3IgKHh4MSA9IDA7IHh4MSA8IDggJiYgeHggKyB4eDEgPCB4eExpbWl0OyArK3h4MSwgKyt4MSkgewogICAgICAgICAgICBpZiAoc3RhdGUtPmNsaXAtPnRlc3QoeDEsIHkxKSkgewogICAgICAgICAgICAgIGlmIChhbHBoYTAgJiAweDgwKSB7CiAgICAgICAgICAgICAgICBwaXBlUnVuKCZwaXBlKTsKICAgICAgICAgICAgICAgIHVwZGF0ZU1vZFgoeDEpOwogICAgICAgICAgICAgICAgdXBkYXRlTW9kWSh5MSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBpcGVJbmNYKCZwaXBlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcGlwZUluY1goJnBpcGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFscGhhMCA8PD0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcCArPSB3aWR0aEVpZ2h0OwogICAgICB9CiAgICB9CiAgfQp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OmZpbGxJbWFnZU1hc2soU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJCSAgaW50IHcsIGludCBoLCBTcGxhc2hDb29yZCAqbWF0LAoJCQkJICBHQm9vbCBnbHlwaE1vZGUpIHsKICBTcGxhc2hQaXBlIHBpcGU7CiAgR0Jvb2wgcm90OwogIFNwbGFzaENvb3JkIHhTY2FsZSwgeVNjYWxlLCB4U2hlYXIsIHlTaGVhciwgeVNoZWFyMTsKICBpbnQgdHgsIHR4MiwgdHksIHR5Miwgc2NhbGVkV2lkdGgsIHNjYWxlZEhlaWdodCwgeFNpZ24sIHlTaWduOwogIGludCB1bHgsIHVseSwgbGx4LCBsbHksIHVyeCwgdXJ5LCBscngsIGxyeTsKICBpbnQgdWx4MSwgdWx5MSwgbGx4MSwgbGx5MSwgdXJ4MSwgdXJ5MSwgbHJ4MSwgbHJ5MTsKICBpbnQgeE1pbiwgeE1heCwgeU1pbiwgeU1heDsKICBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMsIGNsaXBSZXMyOwogIGludCB5cCwgeXEsIHl0LCB5U3RlcCwgbGFzdFlTdGVwOwogIGludCB4cCwgeHEsIHh0LCB4U3RlcCwgeFNyYzsKICBpbnQgazEsIHNwYW5YTWluLCBzcGFuWE1heCwgc3Bhblk7CiAgU3BsYXNoQ29sb3JQdHIgcGl4QnVmLCBwOwogIGludCBwaXhBY2M7CiAgaW50IHgsIHksIHgxLCB4MiwgeTI7CiAgU3BsYXNoQ29vcmQgeTE7CiAgaW50IG4sIG0sIGksIGo7CgogIGlmIChkZWJ1Z01vZGUpIHsKICAgIHByaW50ZigiZmlsbEltYWdlTWFzazogdz0lZCBoPSVkIG1hdD1bJS4yZiAlLjJmICUuMmYgJS4yZiAlLjJmICUuMmZdXG4iLAoJICAgdywgaCwgKGRvdWJsZSltYXRbMF0sIChkb3VibGUpbWF0WzFdLCAoZG91YmxlKW1hdFsyXSwKCSAgIChkb3VibGUpbWF0WzNdLCAoZG91YmxlKW1hdFs0XSwgKGRvdWJsZSltYXRbNV0pOwogIH0KCiAgaWYgKHcgPT0gMCAmJiBoID09IDApIHJldHVybiBzcGxhc2hFcnJaZXJvSW1hZ2U7CgogIC8vIGNoZWNrIGZvciBzaW5ndWxhciBtYXRyaXgKICBpZiAoc3BsYXNoQWJzKG1hdFswXSAqIG1hdFszXSAtIG1hdFsxXSAqIG1hdFsyXSkgPCAwLjAwMDAwMSkgewogICAgcmV0dXJuIHNwbGFzaEVyclNpbmd1bGFyTWF0cml4OwogIH0KCiAgLy8gY29tcHV0ZSBzY2FsZSwgc2hlYXIsIHJvdGF0aW9uLCB0cmFuc2xhdGlvbiBwYXJhbWV0ZXJzCiAgcm90ID0gc3BsYXNoQWJzKG1hdFsxXSkgPiBzcGxhc2hBYnMobWF0WzBdKTsKICBpZiAocm90KSB7CiAgICB4U2NhbGUgPSAtbWF0WzFdOwogICAgeVNjYWxlID0gbWF0WzJdIC0gKG1hdFswXSAqIG1hdFszXSkgLyBtYXRbMV07CiAgICB4U2hlYXIgPSAtbWF0WzNdIC8geVNjYWxlOwogICAgeVNoZWFyID0gLW1hdFswXSAvIG1hdFsxXTsKICB9IGVsc2UgewogICAgeFNjYWxlID0gbWF0WzBdOwogICAgeVNjYWxlID0gbWF0WzNdIC0gKG1hdFsxXSAqIG1hdFsyXSkgLyBtYXRbMF07CiAgICB4U2hlYXIgPSBtYXRbMl0gLyB5U2NhbGU7CiAgICB5U2hlYXIgPSBtYXRbMV0gLyBtYXRbMF07CiAgfQogIC8vIE5vdGUgMTogVGhlIFBERiBzcGVjIHNheXMgdGhhdCBhbGwgcGl4ZWxzIHdob3NlICpjZW50ZXJzKiBsaWUKICAvLyB3aXRoaW4gdGhlIHJlZ2lvbiBnZXQgcGFpbnRlZCAtLSBidXQgdGhhdCBkb2Vzbid0IHNlZW0gdG8gbWF0Y2gKICAvLyB1cCB3aXRoIHdoYXQgQWNyb2JhdCBhY3R1YWxseSBkb2VzOiBpdCBlbmRzIHVwIGxlYXZpbmcgZ2FwcwogIC8vIGJldHdlZW4gaW1hZ2Ugc3RyaXBlcy4gIFNvIHdlIHVzZSB0aGUgc2FtZSBydWxlIGhlcmUgYXMgZm9yCiAgLy8gZmlsbHM6IGFueSBwaXhlbCB0aGF0IG92ZXJsYXBzIHRoZSByZWdpb24gZ2V0cyBwYWludGVkLgogIC8vIE5vdGUgMjogVGhlICJnbHlwaE1vZGUiIGZsYWcgaXMgYSBrbHVkZ2U6IGl0IHN3aXRjaGVzIGJhY2sgdG8KICAvLyAiY29ycmVjdCIgYmVoYXZpb3IgKG1hdGNoaW5nIHRoZSBzcGVjKSwgZm9yIHVzZSBpbiByZW5kZXJpbmcgVHlwZQogIC8vIDMgZm9udHMuCiAgLy8gTm90ZSAzOiBUaGUgKy8tMC4wMSBpbiB0aGVzZSBjb21wdXRhdGlvbnMgaXMgdG8gYXZvaWQgZmxvYXRpbmcKICAvLyBwb2ludCBwcmVjaXNpb24gcHJvYmxlbXMgd2hpY2ggY2FuIGxlYWQgdG8gZ2FwcyBiZXR3ZWVuIGltYWdlCiAgLy8gc3RyaXBlcyAoaXQgY2FuIGNhdXNlIGltYWdlIHN0cmlwZXMgdG8gb3ZlcmxhcCwgYnV0IHRoYXQncyBhIG11Y2gKICAvLyBsZXNzIHZpc2libGUgcHJvYmxlbSkuCiAgaWYgKGdseXBoTW9kZSkgewogICAgaWYgKHhTY2FsZSA+PSAwKSB7CiAgICAgIHR4ID0gc3BsYXNoUm91bmQobWF0WzRdKTsKICAgICAgdHgyID0gc3BsYXNoUm91bmQobWF0WzRdICsgeFNjYWxlKSAtIDE7CiAgICB9IGVsc2UgewogICAgICB0eCA9IHNwbGFzaFJvdW5kKG1hdFs0XSkgLSAxOwogICAgICB0eDIgPSBzcGxhc2hSb3VuZChtYXRbNF0gKyB4U2NhbGUpOwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoeFNjYWxlID49IDApIHsKICAgICAgdHggPSBzcGxhc2hGbG9vcihtYXRbNF0gLSAwLjAxKTsKICAgICAgdHgyID0gc3BsYXNoRmxvb3IobWF0WzRdICsgeFNjYWxlICsgMC4wMSk7CiAgICB9IGVsc2UgewogICAgICB0eCA9IHNwbGFzaEZsb29yKG1hdFs0XSArIDAuMDEpOwogICAgICB0eDIgPSBzcGxhc2hGbG9vcihtYXRbNF0gKyB4U2NhbGUgLSAwLjAxKTsKICAgIH0KICB9CiAgc2NhbGVkV2lkdGggPSBhYnModHgyIC0gdHgpICsgMTsKICBpZiAoZ2x5cGhNb2RlKSB7CiAgICBpZiAoeVNjYWxlID49IDApIHsKICAgICAgdHkgPSBzcGxhc2hSb3VuZChtYXRbNV0pOwogICAgICB0eTIgPSBzcGxhc2hSb3VuZChtYXRbNV0gKyB5U2NhbGUpIC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIHR5ID0gc3BsYXNoUm91bmQobWF0WzVdKSAtIDE7CiAgICAgIHR5MiA9IHNwbGFzaFJvdW5kKG1hdFs1XSArIHlTY2FsZSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmICh5U2NhbGUgPj0gMCkgewogICAgICB0eSA9IHNwbGFzaEZsb29yKG1hdFs1XSAtIDAuMDEpOwogICAgICB0eTIgPSBzcGxhc2hGbG9vcihtYXRbNV0gKyB5U2NhbGUgKyAwLjAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHR5ID0gc3BsYXNoRmxvb3IobWF0WzVdICsgMC4wMSk7CiAgICAgIHR5MiA9IHNwbGFzaEZsb29yKG1hdFs1XSArIHlTY2FsZSAtIDAuMDEpOwogICAgfQogIH0KICBzY2FsZWRIZWlnaHQgPSBhYnModHkyIC0gdHkpICsgMTsKICB4U2lnbiA9ICh4U2NhbGUgPCAwKSA/IC0xIDogMTsKICB5U2lnbiA9ICh5U2NhbGUgPCAwKSA/IC0xIDogMTsKICB5U2hlYXIxID0gKFNwbGFzaENvb3JkKXhTaWduICogeVNoZWFyOwoKICAvLyBjbGlwcGluZwogIHVseDEgPSAwOwogIHVseTEgPSAwOwogIHVyeDEgPSB4U2lnbiAqIChzY2FsZWRXaWR0aCAtIDEpOwogIHVyeTEgPSAoaW50KSh5U2hlYXIgKiB1cngxKTsKICBsbHgxID0gc3BsYXNoUm91bmQoeFNoZWFyICogeVNpZ24gKiAoc2NhbGVkSGVpZ2h0IC0gMSkpOwogIGxseTEgPSB5U2lnbiAqIChzY2FsZWRIZWlnaHQgLSAxKSArIChpbnQpKHlTaGVhciAqIGxseDEpOwogIGxyeDEgPSB4U2lnbiAqIChzY2FsZWRXaWR0aCAtIDEpICsKICAgICAgICAgICBzcGxhc2hSb3VuZCh4U2hlYXIgKiB5U2lnbiAqIChzY2FsZWRIZWlnaHQgLSAxKSk7CiAgbHJ5MSA9IHlTaWduICogKHNjYWxlZEhlaWdodCAtIDEpICsgKGludCkoeVNoZWFyICogbHJ4MSk7CiAgaWYgKHJvdCkgewogICAgdWx4ID0gdHggKyB1bHkxOyAgICB1bHkgPSB0eSAtIHVseDE7CiAgICB1cnggPSB0eCArIHVyeTE7ICAgIHVyeSA9IHR5IC0gdXJ4MTsKICAgIGxseCA9IHR4ICsgbGx5MTsgICAgbGx5ID0gdHkgLSBsbHgxOwogICAgbHJ4ID0gdHggKyBscnkxOyAgICBscnkgPSB0eSAtIGxyeDE7CiAgfSBlbHNlIHsKICAgIHVseCA9IHR4ICsgdWx4MTsgICAgdWx5ID0gdHkgKyB1bHkxOwogICAgdXJ4ID0gdHggKyB1cngxOyAgICB1cnkgPSB0eSArIHVyeTE7CiAgICBsbHggPSB0eCArIGxseDE7ICAgIGxseSA9IHR5ICsgbGx5MTsKICAgIGxyeCA9IHR4ICsgbHJ4MTsgICAgbHJ5ID0gdHkgKyBscnkxOwogIH0KICB4TWluID0gKHVseCA8IHVyeCkgPyAodWx4IDwgbGx4KSA/ICh1bHggPCBscngpID8gdWx4IDogbHJ4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx4IDwgbHJ4KSA/IGxseCA6IGxyeAoJCSAgICAgOiAodXJ4IDwgbGx4KSA/ICh1cnggPCBscngpID8gdXJ4IDogbHJ4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx4IDwgbHJ4KSA/IGxseCA6IGxyeDsKICB4TWF4ID0gKHVseCA+IHVyeCkgPyAodWx4ID4gbGx4KSA/ICh1bHggPiBscngpID8gdWx4IDogbHJ4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx4ID4gbHJ4KSA/IGxseCA6IGxyeAoJCSAgICAgOiAodXJ4ID4gbGx4KSA/ICh1cnggPiBscngpID8gdXJ4IDogbHJ4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx4ID4gbHJ4KSA/IGxseCA6IGxyeDsKICB5TWluID0gKHVseSA8IHVyeSkgPyAodWx5IDwgbGx5KSA/ICh1bHkgPCBscnkpID8gdWx5IDogbHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx5IDwgbHJ5KSA/IGxseSA6IGxyeQoJCSAgICAgOiAodXJ5IDwgbGx5KSA/ICh1cnkgPCBscnkpID8gdXJ5IDogbHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx5IDwgbHJ5KSA/IGxseSA6IGxyeTsKICB5TWF4ID0gKHVseSA+IHVyeSkgPyAodWx5ID4gbGx5KSA/ICh1bHkgPiBscnkpID8gdWx5IDogbHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx5ID4gbHJ5KSA/IGxseSA6IGxyeQoJCSAgICAgOiAodXJ5ID4gbGx5KSA/ICh1cnkgPiBscnkpID8gdXJ5IDogbHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGx5ID4gbHJ5KSA/IGxseSA6IGxyeTsKICBjbGlwUmVzID0gc3RhdGUtPmNsaXAtPnRlc3RSZWN0KHhNaW4sIHlNaW4sIHhNYXgsIHlNYXgpOwogIG9wQ2xpcFJlcyA9IGNsaXBSZXM7CgogIC8vIGNvbXB1dGUgQnJlc2VuaGFtIHBhcmFtZXRlcnMgZm9yIHggYW5kIHkgc2NhbGluZwogIHlwID0gaCAvIHNjYWxlZEhlaWdodDsKICB5cSA9IGggJSBzY2FsZWRIZWlnaHQ7CiAgeHAgPSB3IC8gc2NhbGVkV2lkdGg7CiAgeHEgPSB3ICUgc2NhbGVkV2lkdGg7CgogIC8vIGFsbG9jYXRlIHBpeGVsIGJ1ZmZlcgogIGlmICh5cCA8IDAgfHwgeXAgPiBJTlRfTUFYIC0gMSkgewogICAgcmV0dXJuIHNwbGFzaEVyckJhZEFyZzsKICB9CiAgcGl4QnVmID0gKFNwbGFzaENvbG9yUHRyKWdtYWxsb2NuKCh5cCArIDEpLCB3KTsKCiAgLy8gaW5pdGlhbGl6ZSB0aGUgcGl4ZWwgcGlwZQogIHBpcGVJbml0KCZwaXBlLCAwLCAwLCBzdGF0ZS0+ZmlsbFBhdHRlcm4sIE5VTEwsIHN0YXRlLT5maWxsQWxwaGEsCgkgICBnVHJ1ZSwgZ0ZhbHNlKTsKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBkcmF3QUFQaXhlbEluaXQoKTsKICB9CgogIC8vIGluaXQgeSBzY2FsZSBCcmVzZW5oYW0KICB5dCA9IDA7CiAgbGFzdFlTdGVwID0gMTsKCiAgZm9yICh5ID0gMDsgeSA8IHNjYWxlZEhlaWdodDsgKyt5KSB7CgogICAgLy8geSBzY2FsZSBCcmVzZW5oYW0KICAgIHlTdGVwID0geXA7CiAgICB5dCArPSB5cTsKICAgIGlmICh5dCA+PSBzY2FsZWRIZWlnaHQpIHsKICAgICAgeXQgLT0gc2NhbGVkSGVpZ2h0OwogICAgICArK3lTdGVwOwogICAgfQoKICAgIC8vIHJlYWQgcm93KHMpIGZyb20gaW1hZ2UKICAgIG4gPSAoeXAgPiAwKSA/IHlTdGVwIDogbGFzdFlTdGVwOwogICAgaWYgKG4gPiAwKSB7CiAgICAgIHAgPSBwaXhCdWY7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSgqc3JjKShzcmNEYXRhLCBwKTsKCXAgKz0gdzsKICAgICAgfQogICAgfQogICAgbGFzdFlTdGVwID0geVN0ZXA7CgogICAgLy8gbG9vcC1pbnZhcmlhbnQgY29uc3RhbnRzCiAgICBrMSA9IHNwbGFzaFJvdW5kKHhTaGVhciAqIHlTaWduICogeSk7CgogICAgLy8gY2xpcHBpbmcgdGVzdAogICAgaWYgKGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbEluc2lkZSAmJgoJIXJvdCAmJgoJKGludCkoeVNoZWFyICogazEpID09CgkgIChpbnQpKHlTaGVhciAqICh4U2lnbiAqIChzY2FsZWRXaWR0aCAtIDEpICsgazEpKSkgewogICAgICBpZiAoeFNpZ24gPiAwKSB7CglzcGFuWE1pbiA9IHR4ICsgazE7CglzcGFuWE1heCA9IHNwYW5YTWluICsgKHNjYWxlZFdpZHRoIC0gMSk7CiAgICAgIH0gZWxzZSB7CglzcGFuWE1heCA9IHR4ICsgazE7CglzcGFuWE1pbiA9IHNwYW5YTWF4IC0gKHNjYWxlZFdpZHRoIC0gMSk7CiAgICAgIH0KICAgICAgc3BhblkgPSB0eSArIHlTaWduICogeSArIChpbnQpKHlTaGVhciAqIGsxKTsKICAgICAgY2xpcFJlczIgPSBzdGF0ZS0+Y2xpcC0+dGVzdFNwYW4oc3BhblhNaW4sIHNwYW5YTWF4LCBzcGFuWSk7CiAgICAgIGlmIChjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewoJY29udGludWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNsaXBSZXMyID0gY2xpcFJlczsKICAgIH0KCiAgICAvLyBpbml0IHggc2NhbGUgQnJlc2VuaGFtCiAgICB4dCA9IDA7CiAgICB4U3JjID0gMDsKCiAgICAvLyB4IHNoZWFyCiAgICB4MSA9IGsxOwoKICAgIC8vIHkgc2hlYXIKICAgIHkxID0gKFNwbGFzaENvb3JkKXlTaWduICogeSArIHlTaGVhciAqIHgxOwogICAgLy8gdGhpcyBpcyBhIGtsdWRnZTogaWYgeVNoZWFyMSBpcyBuZWdhdGl2ZSwgdGhlbiAoaW50KXkxIHdvdWxkCiAgICAvLyBjaGFuZ2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpcnN0IHBpeGVsLCB3aGljaCBpcyBub3Qgd2hhdCB3ZQogICAgLy8gd2FudAogICAgaWYgKHlTaGVhcjEgPCAwKSB7CiAgICAgIHkxICs9IDAuOTk5OwogICAgfQoKICAgIC8vIGxvb3AtaW52YXJpYW50IGNvbnN0YW50cwogICAgbiA9IHlTdGVwID4gMCA/IHlTdGVwIDogMTsKCiAgICBmb3IgKHggPSAwOyB4IDwgc2NhbGVkV2lkdGg7ICsreCkgewoKICAgICAgLy8geCBzY2FsZSBCcmVzZW5oYW0KICAgICAgeFN0ZXAgPSB4cDsKICAgICAgeHQgKz0geHE7CiAgICAgIGlmICh4dCA+PSBzY2FsZWRXaWR0aCkgewoJeHQgLT0gc2NhbGVkV2lkdGg7CgkrK3hTdGVwOwogICAgICB9CgogICAgICAvLyByb3RhdGlvbgogICAgICBpZiAocm90KSB7Cgl4MiA9IChpbnQpeTE7Cgl5MiA9IC14MTsKICAgICAgfSBlbHNlIHsKCXgyID0geDE7Cgl5MiA9IChpbnQpeTE7CiAgICAgIH0KCiAgICAgIC8vIGNvbXB1dGUgdGhlIGFscGhhIHZhbHVlIGZvciAoeCx5KSBhZnRlciB0aGUgeCBhbmQgeSBzY2FsaW5nCiAgICAgIC8vIG9wZXJhdGlvbnMKICAgICAgbSA9IHhTdGVwID4gMCA/IHhTdGVwIDogMTsKICAgICAgcCA9IHBpeEJ1ZiArIHhTcmM7CiAgICAgIHBpeEFjYyA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCWZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKCSAgcGl4QWNjICs9ICpwKys7Cgl9CglwICs9IHcgLSBtOwogICAgICB9CgogICAgICAvLyBibGVuZCBmaWxsIGNvbG9yIHdpdGggYmFja2dyb3VuZAogICAgICBpZiAocGl4QWNjICE9IDApIHsKCXBpcGUuc2hhcGUgPSAocGl4QWNjID09IG4gKiBtKQoJICAgICAgICAgICAgICAgICA/IChTcGxhc2hDb29yZCkxCgkgICAgICAgICAgICAgICAgIDogKFNwbGFzaENvb3JkKXBpeEFjYyAvIChTcGxhc2hDb29yZCkobiAqIG0pOwoJaWYgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzMiAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCX0gZWxzZSB7CgkgIGRyYXdQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5MiwgY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7Cgl9CiAgICAgIH0KCiAgICAgIC8vIHggc2NhbGUgQnJlc2VuaGFtCiAgICAgIHhTcmMgKz0geFN0ZXA7CgogICAgICAvLyB4IHNoZWFyCiAgICAgIHgxICs9IHhTaWduOwoKICAgICAgLy8geSBzaGVhcgogICAgICB5MSArPSB5U2hlYXIxOwogICAgfQogIH0KCiAgLy8gZnJlZSBtZW1vcnkKICBnZnJlZShwaXhCdWYpOwoKICByZXR1cm4gc3BsYXNoT2s7Cn0KClNwbGFzaEVycm9yIFNwbGFzaDo6ZHJhd0ltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIEdCb29sIHNyY0FscGhhLAoJCQkgICAgICBpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQpIHsKICBTcGxhc2hQaXBlIHBpcGU7CiAgR0Jvb2wgb2ssIHJvdDsKICBTcGxhc2hDb29yZCB4U2NhbGUsIHlTY2FsZSwgeFNoZWFyLCB5U2hlYXIsIHlTaGVhcjE7CiAgaW50IHR4LCB0eDIsIHR5LCB0eTIsIHNjYWxlZFdpZHRoLCBzY2FsZWRIZWlnaHQsIHhTaWduLCB5U2lnbjsKICBpbnQgdWx4LCB1bHksIGxseCwgbGx5LCB1cngsIHVyeSwgbHJ4LCBscnk7CiAgaW50IHVseDEsIHVseTEsIGxseDEsIGxseTEsIHVyeDEsIHVyeTEsIGxyeDEsIGxyeTE7CiAgaW50IHhNaW4sIHhNYXgsIHlNaW4sIHlNYXg7CiAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzLCBjbGlwUmVzMjsKICBpbnQgeXAsIHlxLCB5dCwgeVN0ZXAsIGxhc3RZU3RlcDsKICBpbnQgeHAsIHhxLCB4dCwgeFN0ZXAsIHhTcmM7CiAgaW50IGsxLCBzcGFuWE1pbiwgc3BhblhNYXgsIHNwYW5ZOwogIFNwbGFzaENvbG9yUHRyIGNvbG9yQnVmLCBwOwogIFNwbGFzaENvbG9yIHBpeDsKICBHdWNoYXIgKmFscGhhQnVmLCAqcTsKI2lmIFNQTEFTSF9DTVlLCiAgaW50IHBpeEFjYzAsIHBpeEFjYzEsIHBpeEFjYzIsIHBpeEFjYzM7CiNlbHNlCiAgaW50IHBpeEFjYzAsIHBpeEFjYzEsIHBpeEFjYzI7CiNlbmRpZgogIGludCBhbHBoYUFjYzsKICBTcGxhc2hDb29yZCBwaXhNdWwsIGFscGhhTXVsLCBhbHBoYTsKICBpbnQgeCwgeSwgeDEsIHgyLCB5MjsKICBTcGxhc2hDb29yZCB5MTsKICBpbnQgbkNvbXBzLCBuLCBtLCBpLCBqOwoKICBpZiAoZGVidWdNb2RlKSB7CiAgICBwcmludGYoImRyYXdJbWFnZTogc3JjTW9kZT0lZCBzcmNBbHBoYT0lZCB3PSVkIGg9JWQgbWF0PVslLjJmICUuMmYgJS4yZiAlLjJmICUuMmYgJS4yZl1cbiIsCgkgICBzcmNNb2RlLCBzcmNBbHBoYSwgdywgaCwgKGRvdWJsZSltYXRbMF0sIChkb3VibGUpbWF0WzFdLCAoZG91YmxlKW1hdFsyXSwKCSAgIChkb3VibGUpbWF0WzNdLCAoZG91YmxlKW1hdFs0XSwgKGRvdWJsZSltYXRbNV0pOwogIH0KCiAgLy8gY2hlY2sgY29sb3IgbW9kZXMKICBvayA9IGdGYWxzZTsgLy8gbWFrZSBnY2MgaGFwcHkKICBuQ29tcHMgPSAwOyAvLyBtYWtlIGdjYyBoYXBweQogIHN3aXRjaCAoYml0bWFwLT5tb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBvayA9IHNyY01vZGUgPT0gc3BsYXNoTW9kZU1vbm84OwogICAgbkNvbXBzID0gMTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICBvayA9IHNyY01vZGUgPT0gc3BsYXNoTW9kZVJHQjg7CiAgICBuQ29tcHMgPSAzOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICBvayA9IHNyY01vZGUgPT0gc3BsYXNoTW9kZVhCR1I4OwogICAgbkNvbXBzID0gNDsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBvayA9IHNyY01vZGUgPT0gc3BsYXNoTW9kZUJHUjg7CiAgICBuQ29tcHMgPSAzOwogICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgb2sgPSBzcmNNb2RlID09IHNwbGFzaE1vZGVDTVlLODsKICAgIG5Db21wcyA9IDQ7CiAgICBicmVhazsKI2VuZGlmCiAgfQogIGlmICghb2spIHsKICAgIHJldHVybiBzcGxhc2hFcnJNb2RlTWlzbWF0Y2g7CiAgfQoKICAvLyBjaGVjayBmb3Igc2luZ3VsYXIgbWF0cml4CiAgaWYgKHNwbGFzaEFicyhtYXRbMF0gKiBtYXRbM10gLSBtYXRbMV0gKiBtYXRbMl0pIDwgMC4wMDAwMDEpIHsKICAgIHJldHVybiBzcGxhc2hFcnJTaW5ndWxhck1hdHJpeDsKICB9CgogIC8vIGNvbXB1dGUgc2NhbGUsIHNoZWFyLCByb3RhdGlvbiwgdHJhbnNsYXRpb24gcGFyYW1ldGVycwogIHJvdCA9IHNwbGFzaEFicyhtYXRbMV0pID4gc3BsYXNoQWJzKG1hdFswXSk7CiAgaWYgKHJvdCkgewogICAgeFNjYWxlID0gLW1hdFsxXTsKICAgIHlTY2FsZSA9IG1hdFsyXSAtIChtYXRbMF0gKiBtYXRbM10pIC8gbWF0WzFdOwogICAgeFNoZWFyID0gLW1hdFszXSAvIHlTY2FsZTsKICAgIHlTaGVhciA9IC1tYXRbMF0gLyBtYXRbMV07CiAgfSBlbHNlIHsKICAgIHhTY2FsZSA9IG1hdFswXTsKICAgIHlTY2FsZSA9IG1hdFszXSAtIChtYXRbMV0gKiBtYXRbMl0pIC8gbWF0WzBdOwogICAgeFNoZWFyID0gbWF0WzJdIC8geVNjYWxlOwogICAgeVNoZWFyID0gbWF0WzFdIC8gbWF0WzBdOwogIH0KICAvLyBOb3RlIDE6IFRoZSBQREYgc3BlYyBzYXlzIHRoYXQgYWxsIHBpeGVscyB3aG9zZSAqY2VudGVycyogbGllCiAgLy8gd2l0aGluIHRoZSByZWdpb24gZ2V0IHBhaW50ZWQgLS0gYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIG1hdGNoCiAgLy8gdXAgd2l0aCB3aGF0IEFjcm9iYXQgYWN0dWFsbHkgZG9lczogaXQgZW5kcyB1cCBsZWF2aW5nIGdhcHMKICAvLyBiZXR3ZWVuIGltYWdlIHN0cmlwZXMuICBTbyB3ZSB1c2UgdGhlIHNhbWUgcnVsZSBoZXJlIGFzIGZvcgogIC8vIGZpbGxzOiBhbnkgcGl4ZWwgdGhhdCBvdmVybGFwcyB0aGUgcmVnaW9uIGdldHMgcGFpbnRlZC4KICAvLyBOb3RlIDI6IFRoZSArLy0wLjAxIGluIHRoZXNlIGNvbXB1dGF0aW9ucyBpcyB0byBhdm9pZCBmbG9hdGluZwogIC8vIHBvaW50IHByZWNpc2lvbiBwcm9ibGVtcyB3aGljaCBjYW4gbGVhZCB0byBnYXBzIGJldHdlZW4gaW1hZ2UKICAvLyBzdHJpcGVzIChpdCBjYW4gY2F1c2UgaW1hZ2Ugc3RyaXBlcyB0byBvdmVybGFwLCBidXQgdGhhdCdzIGEgbXVjaAogIC8vIGxlc3MgdmlzaWJsZSBwcm9ibGVtKS4KICBpZiAoeFNjYWxlID49IDApIHsKICAgIHR4ID0gc3BsYXNoRmxvb3IobWF0WzRdIC0gMC4wMSk7CiAgICB0eDIgPSBzcGxhc2hGbG9vcihtYXRbNF0gKyB4U2NhbGUgKyAwLjAxKTsKICB9IGVsc2UgewogICAgdHggPSBzcGxhc2hGbG9vcihtYXRbNF0gKyAwLjAxKTsKICAgIHR4MiA9IHNwbGFzaEZsb29yKG1hdFs0XSArIHhTY2FsZSAtIDAuMDEpOwogIH0KICBzY2FsZWRXaWR0aCA9IGFicyh0eDIgLSB0eCkgKyAxOwogIGlmICh5U2NhbGUgPj0gMCkgewogICAgdHkgPSBzcGxhc2hGbG9vcihtYXRbNV0gLSAwLjAxKTsKICAgIHR5MiA9IHNwbGFzaEZsb29yKG1hdFs1XSArIHlTY2FsZSArIDAuMDEpOwogIH0gZWxzZSB7CiAgICB0eSA9IHNwbGFzaEZsb29yKG1hdFs1XSArIDAuMDEpOwogICAgdHkyID0gc3BsYXNoRmxvb3IobWF0WzVdICsgeVNjYWxlIC0gMC4wMSk7CiAgfQogIHNjYWxlZEhlaWdodCA9IGFicyh0eTIgLSB0eSkgKyAxOwogIHhTaWduID0gKHhTY2FsZSA8IDApID8gLTEgOiAxOwogIHlTaWduID0gKHlTY2FsZSA8IDApID8gLTEgOiAxOwogIHlTaGVhcjEgPSAoU3BsYXNoQ29vcmQpeFNpZ24gKiB5U2hlYXI7CgogIC8vIGNsaXBwaW5nCiAgdWx4MSA9IDA7CiAgdWx5MSA9IDA7CiAgdXJ4MSA9IHhTaWduICogKHNjYWxlZFdpZHRoIC0gMSk7CiAgdXJ5MSA9IChpbnQpKHlTaGVhciAqIHVyeDEpOwogIGxseDEgPSBzcGxhc2hSb3VuZCh4U2hlYXIgKiB5U2lnbiAqIChzY2FsZWRIZWlnaHQgLSAxKSk7CiAgbGx5MSA9IHlTaWduICogKHNjYWxlZEhlaWdodCAtIDEpICsgKGludCkoeVNoZWFyICogbGx4MSk7CiAgbHJ4MSA9IHhTaWduICogKHNjYWxlZFdpZHRoIC0gMSkgKwogICAgICAgICAgIHNwbGFzaFJvdW5kKHhTaGVhciAqIHlTaWduICogKHNjYWxlZEhlaWdodCAtIDEpKTsKICBscnkxID0geVNpZ24gKiAoc2NhbGVkSGVpZ2h0IC0gMSkgKyAoaW50KSh5U2hlYXIgKiBscngxKTsKICBpZiAocm90KSB7CiAgICB1bHggPSB0eCArIHVseTE7ICAgIHVseSA9IHR5IC0gdWx4MTsKICAgIHVyeCA9IHR4ICsgdXJ5MTsgICAgdXJ5ID0gdHkgLSB1cngxOwogICAgbGx4ID0gdHggKyBsbHkxOyAgICBsbHkgPSB0eSAtIGxseDE7CiAgICBscnggPSB0eCArIGxyeTE7ICAgIGxyeSA9IHR5IC0gbHJ4MTsKICB9IGVsc2UgewogICAgdWx4ID0gdHggKyB1bHgxOyAgICB1bHkgPSB0eSArIHVseTE7CiAgICB1cnggPSB0eCArIHVyeDE7ICAgIHVyeSA9IHR5ICsgdXJ5MTsKICAgIGxseCA9IHR4ICsgbGx4MTsgICAgbGx5ID0gdHkgKyBsbHkxOwogICAgbHJ4ID0gdHggKyBscngxOyAgICBscnkgPSB0eSArIGxyeTE7CiAgfQogIHhNaW4gPSAodWx4IDwgdXJ4KSA/ICh1bHggPCBsbHgpID8gKHVseCA8IGxyeCkgPyB1bHggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPCBscngpID8gbGx4IDogbHJ4CgkJICAgICA6ICh1cnggPCBsbHgpID8gKHVyeCA8IGxyeCkgPyB1cnggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPCBscngpID8gbGx4IDogbHJ4OwogIHhNYXggPSAodWx4ID4gdXJ4KSA/ICh1bHggPiBsbHgpID8gKHVseCA+IGxyeCkgPyB1bHggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPiBscngpID8gbGx4IDogbHJ4CgkJICAgICA6ICh1cnggPiBsbHgpID8gKHVyeCA+IGxyeCkgPyB1cnggOiBscngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHggPiBscngpID8gbGx4IDogbHJ4OwogIHlNaW4gPSAodWx5IDwgdXJ5KSA/ICh1bHkgPCBsbHkpID8gKHVseSA8IGxyeSkgPyB1bHkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPCBscnkpID8gbGx5IDogbHJ5CgkJICAgICA6ICh1cnkgPCBsbHkpID8gKHVyeSA8IGxyeSkgPyB1cnkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPCBscnkpID8gbGx5IDogbHJ5OwogIHlNYXggPSAodWx5ID4gdXJ5KSA/ICh1bHkgPiBsbHkpID8gKHVseSA+IGxyeSkgPyB1bHkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPiBscnkpID8gbGx5IDogbHJ5CgkJICAgICA6ICh1cnkgPiBsbHkpID8gKHVyeSA+IGxyeSkgPyB1cnkgOiBscnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChsbHkgPiBscnkpID8gbGx5IDogbHJ5OwogIGNsaXBSZXMgPSBzdGF0ZS0+Y2xpcC0+dGVzdFJlY3QoeE1pbiwgeU1pbiwgeE1heCwgeU1heCk7CiAgb3BDbGlwUmVzID0gY2xpcFJlczsKICBpZiAoY2xpcFJlcyA9PSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewogICAgcmV0dXJuIHNwbGFzaE9rOwogIH0KCiAgLy8gY29tcHV0ZSBCcmVzZW5oYW0gcGFyYW1ldGVycyBmb3IgeCBhbmQgeSBzY2FsaW5nCiAgeXAgPSBoIC8gc2NhbGVkSGVpZ2h0OwogIHlxID0gaCAlIHNjYWxlZEhlaWdodDsKICB4cCA9IHcgLyBzY2FsZWRXaWR0aDsKICB4cSA9IHcgJSBzY2FsZWRXaWR0aDsKCiAgLy8gYWxsb2NhdGUgcGl4ZWwgYnVmZmVycwogIGlmICh5cCA8IDAgfHwgeXAgPiBJTlRfTUFYIC0gMSkgewogICAgcmV0dXJuIHNwbGFzaEVyckJhZEFyZzsKICB9CiAgY29sb3JCdWYgPSAoU3BsYXNoQ29sb3JQdHIpZ21hbGxvY24zKCh5cCArIDEpLCB3LCBuQ29tcHMpOwogIGlmIChzcmNBbHBoYSkgewogICAgYWxwaGFCdWYgPSAoR3VjaGFyICopZ21hbGxvY24oKHlwICsgMSksIHcpOwogIH0gZWxzZSB7CiAgICBhbHBoYUJ1ZiA9IE5VTEw7CiAgfQoKICBwaXhBY2MwID0gcGl4QWNjMSA9IHBpeEFjYzIgPSAwOyAvLyBtYWtlIGdjYyBoYXBweQojaWYgU1BMQVNIX0NNWUsKICBwaXhBY2MzID0gMDsgLy8gbWFrZSBnY2MgaGFwcHkKI2VuZGlmCgogIC8vIGluaXRpYWxpemUgdGhlIHBpeGVsIHBpcGUKICBwaXBlSW5pdCgmcGlwZSwgMCwgMCwgTlVMTCwgcGl4LCBzdGF0ZS0+ZmlsbEFscGhhLAoJICAgc3JjQWxwaGEgfHwgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpLAoJICAgZ0ZhbHNlKTsKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBkcmF3QUFQaXhlbEluaXQoKTsKICB9CgogIGlmIChzcmNBbHBoYSkgewoKICAgIC8vIGluaXQgeSBzY2FsZSBCcmVzZW5oYW0KICAgIHl0ID0gMDsKICAgIGxhc3RZU3RlcCA9IDE7CgogICAgZm9yICh5ID0gMDsgeSA8IHNjYWxlZEhlaWdodDsgKyt5KSB7CgogICAgICAvLyB5IHNjYWxlIEJyZXNlbmhhbQogICAgICB5U3RlcCA9IHlwOwogICAgICB5dCArPSB5cTsKICAgICAgaWYgKHl0ID49IHNjYWxlZEhlaWdodCkgewoJeXQgLT0gc2NhbGVkSGVpZ2h0OwoJKyt5U3RlcDsKICAgICAgfQoKICAgICAgLy8gcmVhZCByb3cocykgZnJvbSBpbWFnZQogICAgICBuID0gKHlwID4gMCkgPyB5U3RlcCA6IGxhc3RZU3RlcDsKICAgICAgaWYgKG4gPiAwKSB7CglwID0gY29sb3JCdWY7CglxID0gYWxwaGFCdWY7Cglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkgICgqc3JjKShzcmNEYXRhLCBwLCBxKTsKCSAgcCArPSB3ICogbkNvbXBzOwoJICBxICs9IHc7Cgl9CiAgICAgIH0KICAgICAgbGFzdFlTdGVwID0geVN0ZXA7CgogICAgICAvLyBsb29wLWludmFyaWFudCBjb25zdGFudHMKICAgICAgazEgPSBzcGxhc2hSb3VuZCh4U2hlYXIgKiB5U2lnbiAqIHkpOwogIAogICAgICAvLyBjbGlwcGluZyB0ZXN0CiAgICAgIGlmIChjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUgJiYKCSAgIXJvdCAmJgoJICAoaW50KSh5U2hlYXIgKiBrMSkgPT0KCSAgICAoaW50KSh5U2hlYXIgKiAoeFNpZ24gKiAoc2NhbGVkV2lkdGggLSAxKSArIGsxKSkpIHsKCWlmICh4U2lnbiA+IDApIHsKCSAgc3BhblhNaW4gPSB0eCArIGsxOwoJICBzcGFuWE1heCA9IHNwYW5YTWluICsgKHNjYWxlZFdpZHRoIC0gMSk7Cgl9IGVsc2UgewoJICBzcGFuWE1heCA9IHR4ICsgazE7CgkgIHNwYW5YTWluID0gc3BhblhNYXggLSAoc2NhbGVkV2lkdGggLSAxKTsKCX0KCXNwYW5ZID0gdHkgKyB5U2lnbiAqIHkgKyAoaW50KSh5U2hlYXIgKiBrMSk7CgljbGlwUmVzMiA9IHN0YXRlLT5jbGlwLT50ZXN0U3BhbihzcGFuWE1pbiwgc3BhblhNYXgsIHNwYW5ZKTsKCWlmIChjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsT3V0c2lkZSkgewoJICBjb250aW51ZTsKCX0KICAgICAgfSBlbHNlIHsKCWNsaXBSZXMyID0gY2xpcFJlczsKICAgICAgfQoKICAgICAgLy8gaW5pdCB4IHNjYWxlIEJyZXNlbmhhbQogICAgICB4dCA9IDA7CiAgICAgIHhTcmMgPSAwOwoKICAgICAgLy8geCBzaGVhcgogICAgICB4MSA9IGsxOwoKICAgICAgLy8geSBzaGVhcgogICAgICB5MSA9IChTcGxhc2hDb29yZCl5U2lnbiAqIHkgKyB5U2hlYXIgKiB4MTsKICAgICAgLy8gdGhpcyBpcyBhIGtsdWRnZTogaWYgeVNoZWFyMSBpcyBuZWdhdGl2ZSwgdGhlbiAoaW50KXkxIHdvdWxkCiAgICAgIC8vIGNoYW5nZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3QgcGl4ZWwsIHdoaWNoIGlzIG5vdCB3aGF0CiAgICAgIC8vIHdlIHdhbnQKICAgICAgaWYgKHlTaGVhcjEgPCAwKSB7Cgl5MSArPSAwLjk5OTsKICAgICAgfQoKICAgICAgLy8gbG9vcC1pbnZhcmlhbnQgY29uc3RhbnRzCiAgICAgIG4gPSB5U3RlcCA+IDAgPyB5U3RlcCA6IDE7CgogICAgICBzd2l0Y2ggKHNyY01vZGUpIHsKCiAgICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgICBjYXNlIHNwbGFzaE1vZGVNb25vODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIGFscGhhQWNjID0gMDsKCSAgcCA9IGNvbG9yQnVmICsgeFNyYzsKCSAgcSA9IGFscGhhQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgICBhbHBoYUFjYyArPSAqcSsrOwoJICAgIH0KCSAgICBwICs9IHcgLSBtOwoJICAgIHEgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCSAgYWxwaGFNdWwgPSBwaXhNdWwgKiAoMS4wIC8gMjU1LjApOwoJICBhbHBoYSA9IChTcGxhc2hDb29yZClhbHBoYUFjYyAqIGFscGhhTXVsOwoKCSAgaWYgKGFscGhhID4gMCkgewoJICAgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCgkgICAgLy8gc2V0IHBpeGVsCgkgICAgcGlwZS5zaGFwZSA9IGFscGhhOwoJICAgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgICBkcmF3QUFQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5Mik7CgkgICAgfSBlbHNlIHsKCSAgICAgIGRyYXdQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5MiwKCQkJY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgICAgfQoJICB9CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3JjICs9IHhTdGVwOwoKCSAgLy8geCBzaGVhcgoJICB4MSArPSB4U2lnbjsKCgkgIC8vIHkgc2hlYXIKCSAgeTEgKz0geVNoZWFyMTsKCX0KCWJyZWFrOwoKICAgICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgY2FzZSBzcGxhc2hNb2RlQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIGFscGhhQWNjID0gMDsKCSAgcCA9IGNvbG9yQnVmICsgeFNyYyAqIDM7CgkgIHEgPSBhbHBoYUJ1ZiArIHhTcmM7CgkgIHBpeEFjYzAgPSBwaXhBY2MxID0gcGl4QWNjMiA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgICBwaXhBY2MxICs9ICpwKys7CgkgICAgICBwaXhBY2MyICs9ICpwKys7CgkgICAgICBhbHBoYUFjYyArPSAqcSsrOwoJICAgIH0KCSAgICBwICs9IDMgKiAodyAtIG0pOwoJICAgIHEgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCSAgYWxwaGFNdWwgPSBwaXhNdWwgKiAoMS4wIC8gMjU1LjApOwoJICBhbHBoYSA9IChTcGxhc2hDb29yZClhbHBoYUFjYyAqIGFscGhhTXVsOwoKCSAgaWYgKGFscGhhID4gMCkgewoJICAgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCSAgICBwaXhbMV0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMSAqIHBpeE11bCk7CgkgICAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoKCSAgICAvLyBzZXQgcGl4ZWwKCSAgICBwaXBlLnNoYXBlID0gYWxwaGE7CgkgICAgaWYgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgICB9IGVsc2UgewoJICAgICAgZHJhd1BpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyLAoJCQljbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgICB9CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CgogICAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTdGVwID0geHA7CgkgIHh0ICs9IHhxOwoJICBpZiAoeHQgPj0gc2NhbGVkV2lkdGgpIHsKCSAgICB4dCAtPSBzY2FsZWRXaWR0aDsKCSAgICArK3hTdGVwOwoJICB9CgoJICAvLyByb3RhdGlvbgoJICBpZiAocm90KSB7CgkgICAgeDIgPSAoaW50KXkxOwoJICAgIHkyID0gLXgxOwoJICB9IGVsc2UgewoJICAgIHgyID0geDE7CgkgICAgeTIgPSAoaW50KXkxOwoJICB9CgoJICAvLyBjb21wdXRlIHRoZSBmaWx0ZXJlZCBwaXhlbCBhdCAoeCx5KSBhZnRlciB0aGUgeCBhbmQgeSBzY2FsaW5nCgkgIC8vIG9wZXJhdGlvbnMKCSAgbSA9IHhTdGVwID4gMCA/IHhTdGVwIDogMTsKCSAgYWxwaGFBY2MgPSAwOwoJICBwID0gY29sb3JCdWYgKyB4U3JjICogNDsKCSAgcSA9IGFscGhhQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IHBpeEFjYzEgPSBwaXhBY2MyID0gMDsKCSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKCSAgICAgIHBpeEFjYzAgKz0gKnArKzsKCSAgICAgIHBpeEFjYzEgKz0gKnArKzsKCSAgICAgIHBpeEFjYzIgKz0gKnArKzsKCSAgICAgIHArKzsKCSAgICAgIGFscGhhQWNjICs9ICpxKys7CgkgICAgfQoJICAgIHAgKz0gNCAqICh3IC0gbSk7CgkgICAgcSArPSB3IC0gbTsKCSAgfQoJICBwaXhNdWwgPSAoU3BsYXNoQ29vcmQpMSAvIChTcGxhc2hDb29yZCkobiAqIG0pOwoJICBhbHBoYU11bCA9IHBpeE11bCAqICgxLjAgLyAyNTUuMCk7CgkgIGFscGhhID0gKFNwbGFzaENvb3JkKWFscGhhQWNjICogYWxwaGFNdWw7CgoJICBpZiAoYWxwaGEgPiAwKSB7CgkgICAgcGl4WzBdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzAgKiBwaXhNdWwpOwoJICAgIHBpeFsxXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MxICogcGl4TXVsKTsKCSAgICBwaXhbMl0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMiAqIHBpeE11bCk7CgkgICAgcGl4WzNdID0gMjU1OwoKCSAgICAvLyBzZXQgcGl4ZWwKCSAgICBwaXBlLnNoYXBlID0gYWxwaGE7CgkgICAgaWYgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgICB9IGVsc2UgewoJICAgICAgZHJhd1BpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyLAoJCQljbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgICB9CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CgoKI2lmIFNQTEFTSF9DTVlLCiAgICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgoJZm9yICh4ID0gMDsgeCA8IHNjYWxlZFdpZHRoOyArK3gpIHsKCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTdGVwID0geHA7CgkgIHh0ICs9IHhxOwoJICBpZiAoeHQgPj0gc2NhbGVkV2lkdGgpIHsKCSAgICB4dCAtPSBzY2FsZWRXaWR0aDsKCSAgICArK3hTdGVwOwoJICB9CgoJICAvLyByb3RhdGlvbgoJICBpZiAocm90KSB7CgkgICAgeDIgPSAoaW50KXkxOwoJICAgIHkyID0gLXgxOwoJICB9IGVsc2UgewoJICAgIHgyID0geDE7CgkgICAgeTIgPSAoaW50KXkxOwoJICB9CgoJICAvLyBjb21wdXRlIHRoZSBmaWx0ZXJlZCBwaXhlbCBhdCAoeCx5KSBhZnRlciB0aGUgeCBhbmQgeSBzY2FsaW5nCgkgIC8vIG9wZXJhdGlvbnMKCSAgbSA9IHhTdGVwID4gMCA/IHhTdGVwIDogMTsKCSAgYWxwaGFBY2MgPSAwOwoJICBwID0gY29sb3JCdWYgKyB4U3JjICogNDsKCSAgcSA9IGFscGhhQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IHBpeEFjYzEgPSBwaXhBY2MyID0gcGl4QWNjMyA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgICBwaXhBY2MxICs9ICpwKys7CgkgICAgICBwaXhBY2MyICs9ICpwKys7CgkgICAgICBwaXhBY2MzICs9ICpwKys7CgkgICAgICBhbHBoYUFjYyArPSAqcSsrOwoJICAgIH0KCSAgICBwICs9IDQgKiAodyAtIG0pOwoJICAgIHEgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCSAgYWxwaGFNdWwgPSBwaXhNdWwgKiAoMS4wIC8gMjU1LjApOwoJICBhbHBoYSA9IChTcGxhc2hDb29yZClhbHBoYUFjYyAqIGFscGhhTXVsOwoKCSAgaWYgKGFscGhhID4gMCkgewoJICAgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCSAgICBwaXhbMV0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMSAqIHBpeE11bCk7CgkgICAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoJICAgIHBpeFszXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MzICogcGl4TXVsKTsKCgkgICAgLy8gc2V0IHBpeGVsCgkgICAgcGlwZS5zaGFwZSA9IGFscGhhOwoJICAgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgICBkcmF3QUFQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5Mik7CgkgICAgfSBlbHNlIHsKCSAgICAgIGRyYXdQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5MiwKCQkJY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgICAgfQoJICB9CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3JjICs9IHhTdGVwOwoKCSAgLy8geCBzaGVhcgoJICB4MSArPSB4U2lnbjsKCgkgIC8vIHkgc2hlYXIKCSAgeTEgKz0geVNoZWFyMTsKCX0KCWJyZWFrOwojZW5kaWYgLy8gU1BMQVNIX0NNWUsKICAgICAgfQogICAgfQoKICB9IGVsc2UgewoKICAgIC8vIGluaXQgeSBzY2FsZSBCcmVzZW5oYW0KICAgIHl0ID0gMDsKICAgIGxhc3RZU3RlcCA9IDE7CgogICAgZm9yICh5ID0gMDsgeSA8IHNjYWxlZEhlaWdodDsgKyt5KSB7CgogICAgICAvLyB5IHNjYWxlIEJyZXNlbmhhbQogICAgICB5U3RlcCA9IHlwOwogICAgICB5dCArPSB5cTsKICAgICAgaWYgKHl0ID49IHNjYWxlZEhlaWdodCkgewoJeXQgLT0gc2NhbGVkSGVpZ2h0OwoJKyt5U3RlcDsKICAgICAgfQoKICAgICAgLy8gcmVhZCByb3cocykgZnJvbSBpbWFnZQogICAgICBuID0gKHlwID4gMCkgPyB5U3RlcCA6IGxhc3RZU3RlcDsKICAgICAgaWYgKG4gPiAwKSB7CglwID0gY29sb3JCdWY7Cglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkgICgqc3JjKShzcmNEYXRhLCBwLCBOVUxMKTsKCSAgcCArPSB3ICogbkNvbXBzOwoJfQogICAgICB9CiAgICAgIGxhc3RZU3RlcCA9IHlTdGVwOwoKICAgICAgLy8gbG9vcC1pbnZhcmlhbnQgY29uc3RhbnRzCiAgICAgIGsxID0gc3BsYXNoUm91bmQoeFNoZWFyICogeVNpZ24gKiB5KTsKCiAgICAgIC8vIGNsaXBwaW5nIHRlc3QKICAgICAgaWYgKGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbEluc2lkZSAmJgoJICAhcm90ICYmCgkgIChpbnQpKHlTaGVhciAqIGsxKSA9PQoJICAgIChpbnQpKHlTaGVhciAqICh4U2lnbiAqIChzY2FsZWRXaWR0aCAtIDEpICsgazEpKSkgewoJaWYgKHhTaWduID4gMCkgewoJICBzcGFuWE1pbiA9IHR4ICsgazE7CgkgIHNwYW5YTWF4ID0gc3BhblhNaW4gKyAoc2NhbGVkV2lkdGggLSAxKTsKCX0gZWxzZSB7CgkgIHNwYW5YTWF4ID0gdHggKyBrMTsKCSAgc3BhblhNaW4gPSBzcGFuWE1heCAtIChzY2FsZWRXaWR0aCAtIDEpOwoJfQoJc3BhblkgPSB0eSArIHlTaWduICogeSArIChpbnQpKHlTaGVhciAqIGsxKTsKCWNsaXBSZXMyID0gc3RhdGUtPmNsaXAtPnRlc3RTcGFuKHNwYW5YTWluLCBzcGFuWE1heCwgc3BhblkpOwoJaWYgKGNsaXBSZXMyID09IHNwbGFzaENsaXBBbGxPdXRzaWRlKSB7CgkgIGNvbnRpbnVlOwoJfQogICAgICB9IGVsc2UgewoJY2xpcFJlczIgPSBjbGlwUmVzOwogICAgICB9CgogICAgICAvLyBpbml0IHggc2NhbGUgQnJlc2VuaGFtCiAgICAgIHh0ID0gMDsKICAgICAgeFNyYyA9IDA7CgogICAgICAvLyB4IHNoZWFyCiAgICAgIHgxID0gazE7CgogICAgICAvLyB5IHNoZWFyCiAgICAgIHkxID0gKFNwbGFzaENvb3JkKXlTaWduICogeSArIHlTaGVhciAqIHgxOwogICAgICAvLyB0aGlzIGlzIGEga2x1ZGdlOiBpZiB5U2hlYXIxIGlzIG5lZ2F0aXZlLCB0aGVuIChpbnQpeTEgd291bGQKICAgICAgLy8gY2hhbmdlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaXJzdCBwaXhlbCwgd2hpY2ggaXMgbm90IHdoYXQKICAgICAgLy8gd2Ugd2FudAogICAgICBpZiAoeVNoZWFyMSA8IDApIHsKCXkxICs9IDAuOTk5OwogICAgICB9CgogICAgICAvLyBsb29wLWludmFyaWFudCBjb25zdGFudHMKICAgICAgbiA9IHlTdGVwID4gMCA/IHlTdGVwIDogMTsKCiAgICAgIHN3aXRjaCAoc3JjTW9kZSkgewoKICAgICAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgoJZm9yICh4ID0gMDsgeCA8IHNjYWxlZFdpZHRoOyArK3gpIHsKCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTdGVwID0geHA7CgkgIHh0ICs9IHhxOwoJICBpZiAoeHQgPj0gc2NhbGVkV2lkdGgpIHsKCSAgICB4dCAtPSBzY2FsZWRXaWR0aDsKCSAgICArK3hTdGVwOwoJICB9CgoJICAvLyByb3RhdGlvbgoJICBpZiAocm90KSB7CgkgICAgeDIgPSAoaW50KXkxOwoJICAgIHkyID0gLXgxOwoJICB9IGVsc2UgewoJICAgIHgyID0geDE7CgkgICAgeTIgPSAoaW50KXkxOwoJICB9CgoJICAvLyBjb21wdXRlIHRoZSBmaWx0ZXJlZCBwaXhlbCBhdCAoeCx5KSBhZnRlciB0aGUgeCBhbmQgeSBzY2FsaW5nCgkgIC8vIG9wZXJhdGlvbnMKCSAgbSA9IHhTdGVwID4gMCA/IHhTdGVwIDogMTsKCSAgcCA9IGNvbG9yQnVmICsgeFNyYzsKCSAgcGl4QWNjMCA9IDA7CgkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKCSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CgkgICAgICBwaXhBY2MwICs9ICpwKys7CgkgICAgfQoJICAgIHAgKz0gdyAtIG07CgkgIH0KCSAgcGl4TXVsID0gKFNwbGFzaENvb3JkKTEgLyAoU3BsYXNoQ29vcmQpKG4gKiBtKTsKCgkgIHBpeFswXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MwICogcGl4TXVsKTsKCgkgIC8vIHNldCBwaXhlbAoJICBpZiAodmVjdG9yQW50aWFsaWFzICYmIGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbEluc2lkZSkgewoJICAgIHBpcGUuc2hhcGUgPSAoU3BsYXNoQ29vcmQpMTsKCSAgICBkcmF3QUFQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5Mik7CgkgIH0gZWxzZSB7CgkgICAgZHJhd1BpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyLAoJCSAgICAgIGNsaXBSZXMyID09IHNwbGFzaENsaXBBbGxJbnNpZGUpOwoJICB9CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3JjICs9IHhTdGVwOwoKCSAgLy8geCBzaGVhcgoJICB4MSArPSB4U2lnbjsKCgkgIC8vIHkgc2hlYXIKCSAgeTEgKz0geVNoZWFyMTsKCX0KCWJyZWFrOwoKICAgICAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgICAgY2FzZSBzcGxhc2hNb2RlQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIHAgPSBjb2xvckJ1ZiArIHhTcmMgKiAzOwoJICBwaXhBY2MwID0gcGl4QWNjMSA9IHBpeEFjYzIgPSAwOwoJICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewoJICAgICAgcGl4QWNjMCArPSAqcCsrOwoJICAgICAgcGl4QWNjMSArPSAqcCsrOwoJICAgICAgcGl4QWNjMiArPSAqcCsrOwoJICAgIH0KCSAgICBwICs9IDMgKiAodyAtIG0pOwoJICB9CgkgIHBpeE11bCA9IChTcGxhc2hDb29yZCkxIC8gKFNwbGFzaENvb3JkKShuICogbSk7CgoJICBwaXhbMF0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMCAqIHBpeE11bCk7CgkgIHBpeFsxXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MxICogcGl4TXVsKTsKCSAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoKCSAgLy8gc2V0IHBpeGVsCgkgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgcGlwZS5zaGFwZSA9IChTcGxhc2hDb29yZCkxOwoJICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgfSBlbHNlIHsKCSAgICBkcmF3UGl4ZWwoJnBpcGUsIHR4ICsgeDIsIHR5ICsgeTIsCgkJICAgICAgY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CgogICAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIHAgPSBjb2xvckJ1ZiArIHhTcmMgKiA0OwoJICBwaXhBY2MwID0gcGl4QWNjMSA9IHBpeEFjYzIgPSAwOwoJICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewoJICAgICAgcGl4QWNjMCArPSAqcCsrOwoJICAgICAgcGl4QWNjMSArPSAqcCsrOwoJICAgICAgcGl4QWNjMiArPSAqcCsrOwoJICAgICAgcCsrOwoJICAgIH0KCSAgICBwICs9IDQgKiAodyAtIG0pOwoJICB9CgkgIHBpeE11bCA9IChTcGxhc2hDb29yZCkxIC8gKFNwbGFzaENvb3JkKShuICogbSk7CgoJICBwaXhbMF0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMCAqIHBpeE11bCk7CgkgIHBpeFsxXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MxICogcGl4TXVsKTsKCSAgcGl4WzJdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzIgKiBwaXhNdWwpOwoJICBwaXhbM10gPSAyNTU7CgoJICAvLyBzZXQgcGl4ZWwKCSAgaWYgKHZlY3RvckFudGlhbGlhcyAmJiBjbGlwUmVzICE9IHNwbGFzaENsaXBBbGxJbnNpZGUpIHsKCSAgICBwaXBlLnNoYXBlID0gKFNwbGFzaENvb3JkKTE7CgkgICAgZHJhd0FBUGl4ZWwoJnBpcGUsIHR4ICsgeDIsIHR5ICsgeTIpOwoJICB9IGVsc2UgewoJICAgIGRyYXdQaXhlbCgmcGlwZSwgdHggKyB4MiwgdHkgKyB5MiwKCQkgICAgICBjbGlwUmVzMiA9PSBzcGxhc2hDbGlwQWxsSW5zaWRlKTsKCSAgfQoKCSAgLy8geCBzY2FsZSBCcmVzZW5oYW0KCSAgeFNyYyArPSB4U3RlcDsKCgkgIC8vIHggc2hlYXIKCSAgeDEgKz0geFNpZ247CgoJICAvLyB5IHNoZWFyCgkgIHkxICs9IHlTaGVhcjE7Cgl9CglicmVhazsKCiNpZiBTUExBU0hfQ01ZSwogICAgICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKCWZvciAoeCA9IDA7IHggPCBzY2FsZWRXaWR0aDsgKyt4KSB7CgoJICAvLyB4IHNjYWxlIEJyZXNlbmhhbQoJICB4U3RlcCA9IHhwOwoJICB4dCArPSB4cTsKCSAgaWYgKHh0ID49IHNjYWxlZFdpZHRoKSB7CgkgICAgeHQgLT0gc2NhbGVkV2lkdGg7CgkgICAgKyt4U3RlcDsKCSAgfQoKCSAgLy8gcm90YXRpb24KCSAgaWYgKHJvdCkgewoJICAgIHgyID0gKGludCl5MTsKCSAgICB5MiA9IC14MTsKCSAgfSBlbHNlIHsKCSAgICB4MiA9IHgxOwoJICAgIHkyID0gKGludCl5MTsKCSAgfQoKCSAgLy8gY29tcHV0ZSB0aGUgZmlsdGVyZWQgcGl4ZWwgYXQgKHgseSkgYWZ0ZXIgdGhlIHggYW5kIHkgc2NhbGluZwoJICAvLyBvcGVyYXRpb25zCgkgIG0gPSB4U3RlcCA+IDAgPyB4U3RlcCA6IDE7CgkgIHAgPSBjb2xvckJ1ZiArIHhTcmMgKiA0OwoJICBwaXhBY2MwID0gcGl4QWNjMSA9IHBpeEFjYzIgPSBwaXhBY2MzID0gMDsKCSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKCSAgICAgIHBpeEFjYzAgKz0gKnArKzsKCSAgICAgIHBpeEFjYzEgKz0gKnArKzsKCSAgICAgIHBpeEFjYzIgKz0gKnArKzsKCSAgICAgIHBpeEFjYzMgKz0gKnArKzsKCSAgICB9CgkgICAgcCArPSA0ICogKHcgLSBtKTsKCSAgfQoJICBwaXhNdWwgPSAoU3BsYXNoQ29vcmQpMSAvIChTcGxhc2hDb29yZCkobiAqIG0pOwoKCSAgcGl4WzBdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzAgKiBwaXhNdWwpOwoJICBwaXhbMV0gPSAoaW50KSgoU3BsYXNoQ29vcmQpcGl4QWNjMSAqIHBpeE11bCk7CgkgIHBpeFsyXSA9IChpbnQpKChTcGxhc2hDb29yZClwaXhBY2MyICogcGl4TXVsKTsKCSAgcGl4WzNdID0gKGludCkoKFNwbGFzaENvb3JkKXBpeEFjYzMgKiBwaXhNdWwpOwoKCSAgLy8gc2V0IHBpeGVsCgkgIGlmICh2ZWN0b3JBbnRpYWxpYXMgJiYgY2xpcFJlcyAhPSBzcGxhc2hDbGlwQWxsSW5zaWRlKSB7CgkgICAgcGlwZS5zaGFwZSA9IChTcGxhc2hDb29yZCkxOwoJICAgIGRyYXdBQVBpeGVsKCZwaXBlLCB0eCArIHgyLCB0eSArIHkyKTsKCSAgfSBlbHNlIHsKCSAgICBkcmF3UGl4ZWwoJnBpcGUsIHR4ICsgeDIsIHR5ICsgeTIsCgkJICAgICAgY2xpcFJlczIgPT0gc3BsYXNoQ2xpcEFsbEluc2lkZSk7CgkgIH0KCgkgIC8vIHggc2NhbGUgQnJlc2VuaGFtCgkgIHhTcmMgKz0geFN0ZXA7CgoJICAvLyB4IHNoZWFyCgkgIHgxICs9IHhTaWduOwoKCSAgLy8geSBzaGVhcgoJICB5MSArPSB5U2hlYXIxOwoJfQoJYnJlYWs7CiNlbmRpZiAvLyBTUExBU0hfQ01ZSwogICAgICB9CiAgICB9CgogIH0KCiAgZ2ZyZWUoY29sb3JCdWYpOwogIGdmcmVlKGFscGhhQnVmKTsKCiAgcmV0dXJuIHNwbGFzaE9rOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OmNvbXBvc2l0ZShTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoLAoJCQkgICAgICBHQm9vbCBub0NsaXAsIEdCb29sIG5vbklzb2xhdGVkKSB7CiAgU3BsYXNoUGlwZSBwaXBlOwogIFNwbGFzaENvbG9yIHBpeGVsOwogIEd1Y2hhciBhbHBoYTsKICBHdWNoYXIgKmFwOwogIGludCB4LCB5OwoKICBpZiAoc3JjLT5tb2RlICE9IGJpdG1hcC0+bW9kZSkgewogICAgcmV0dXJuIHNwbGFzaEVyck1vZGVNaXNtYXRjaDsKICB9CgogIGlmIChzcmMtPmFscGhhKSB7CiAgICBwaXBlSW5pdCgmcGlwZSwgeERlc3QsIHlEZXN0LCBOVUxMLCBwaXhlbCwgc3RhdGUtPmZpbGxBbHBoYSwKCSAgICAgZ1RydWUsIG5vbklzb2xhdGVkKTsKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcGlwZVNldFhZKCZwaXBlLCB4RGVzdCwgeURlc3QgKyB5KTsKICAgICAgYXAgPSBzcmMtPmdldEFscGhhUHRyKCkgKyAoeVNyYyArIHkpICogc3JjLT5nZXRXaWR0aCgpICsgeFNyYzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJYWxwaGEgPSAqYXArKzsKCWlmIChub0NsaXAgfHwgc3RhdGUtPmNsaXAtPnRlc3QoeERlc3QgKyB4LCB5RGVzdCArIHkpKSB7CgkgIC8vIHRoaXMgdXNlcyBzaGFwZSBpbnN0ZWFkIG9mIGFscGhhLCB3aGljaCBpc24ndCB0ZWNobmljYWxseQoJICAvLyBjb3JyZWN0LCBidXQgd29ya3Mgb3V0IHRoZSBzYW1lCgkgIHNyYy0+Z2V0UGl4ZWwoeFNyYyArIHgsIHlTcmMgKyB5LCBwaXhlbCk7CgkgIHBpcGUuc2hhcGUgPSAoU3BsYXNoQ29vcmQpKGFscGhhIC8gMjU1LjApOwoJICBwaXBlUnVuKCZwaXBlKTsKCSAgdXBkYXRlTW9kWCh4RGVzdCArIHgpOwoJICB1cGRhdGVNb2RZKHlEZXN0ICsgeSk7Cgl9IGVsc2UgewoJICBwaXBlSW5jWCgmcGlwZSk7Cgl9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgcGlwZUluaXQoJnBpcGUsIHhEZXN0LCB5RGVzdCwgTlVMTCwgcGl4ZWwsIHN0YXRlLT5maWxsQWxwaGEsCgkgICAgIGdGYWxzZSwgbm9uSXNvbGF0ZWQpOwogICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgewogICAgICBwaXBlU2V0WFkoJnBpcGUsIHhEZXN0LCB5RGVzdCArIHkpOwogICAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CglpZiAobm9DbGlwIHx8IHN0YXRlLT5jbGlwLT50ZXN0KHhEZXN0ICsgeCwgeURlc3QgKyB5KSkgewoJICBzcmMtPmdldFBpeGVsKHhTcmMgKyB4LCB5U3JjICsgeSwgcGl4ZWwpOwoJICBwaXBlUnVuKCZwaXBlKTsKCSAgdXBkYXRlTW9kWCh4RGVzdCArIHgpOwoJICB1cGRhdGVNb2RZKHlEZXN0ICsgeSk7Cgl9IGVsc2UgewoJICBwaXBlSW5jWCgmcGlwZSk7Cgl9CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBzcGxhc2hPazsKfQoKdm9pZCBTcGxhc2g6OmNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpIHsKICBTcGxhc2hDb2xvclB0ciBwOwogIEd1Y2hhciAqcTsKICBHdWNoYXIgYWxwaGEsIGFscGhhMSwgYywgY29sb3IwLCBjb2xvcjEsIGNvbG9yMjsKI2lmIFNQTEFTSF9DTVlLCiAgR3VjaGFyIGNvbG9yMzsKI2VuZGlmCiAgaW50IHgsIHksIG1hc2s7CiAgCiAgaWYgKHVubGlrZWx5KGJpdG1hcC0+YWxwaGEgPT0gTlVMTCkpIHsKICAgIGVycm9yKC0xLCAiYml0bWFwLT5hbHBoYSBpcyBOVUxMIGluIFNwbGFzaDo6Y29tcG9zaXRlQmFja2dyb3VuZCIpOwogICAgcmV0dXJuOwogIH0KCiAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICAgIGNvbG9yMCA9IGNvbG9yWzBdOwogICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbeSAqIGJpdG1hcC0+cm93U2l6ZV07CiAgICAgIHEgPSAmYml0bWFwLT5hbHBoYVt5ICogYml0bWFwLT53aWR0aF07CiAgICAgIG1hc2sgPSAweDgwOwogICAgICBmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CglhbHBoYSA9ICpxKys7CglhbHBoYTEgPSAyNTUgLSBhbHBoYTsKCWMgPSAoKnAgJiBtYXNrKSA/IDB4ZmYgOiAweDAwOwoJYyA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjAgKyBhbHBoYSAqIGMpOwoJaWYgKGMgJiAweDgwKSB7CgkgICpwIHw9IG1hc2s7Cgl9IGVsc2UgewoJICAqcCAmPSB+bWFzazsKCX0KCWlmICghKG1hc2sgPj49IDEpKSB7CgkgIG1hc2sgPSAweDgwOwoJICArK3A7Cgl9CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgY29sb3IwID0gY29sb3JbMF07CiAgICBmb3IgKHkgPSAwOyB5IDwgYml0bWFwLT5oZWlnaHQ7ICsreSkgewogICAgICBwID0gJmJpdG1hcC0+ZGF0YVt5ICogYml0bWFwLT5yb3dTaXplXTsKICAgICAgcSA9ICZiaXRtYXAtPmFscGhhW3kgKiBiaXRtYXAtPndpZHRoXTsKICAgICAgZm9yICh4ID0gMDsgeCA8IGJpdG1hcC0+d2lkdGg7ICsreCkgewoJYWxwaGEgPSAqcSsrOwoJYWxwaGExID0gMjU1IC0gYWxwaGE7CglwWzBdID0gZGl2MjU1KGFscGhhMSAqIGNvbG9yMCArIGFscGhhICogcFswXSk7CgkrK3A7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIGNvbG9yMCA9IGNvbG9yWzBdOwogICAgY29sb3IxID0gY29sb3JbMV07CiAgICBjb2xvcjIgPSBjb2xvclsyXTsKICAgIGZvciAoeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSAmYml0bWFwLT5kYXRhW3kgKiBiaXRtYXAtPnJvd1NpemVdOwogICAgICBxID0gJmJpdG1hcC0+YWxwaGFbeSAqIGJpdG1hcC0+d2lkdGhdOwogICAgICBmb3IgKHggPSAwOyB4IDwgYml0bWFwLT53aWR0aDsgKyt4KSB7CglhbHBoYSA9ICpxKys7CglpZiAoYWxwaGEgPT0gMCkKCXsKCSAgcFswXSA9IGNvbG9yMDsKCSAgcFsxXSA9IGNvbG9yMTsKCSAgcFsyXSA9IGNvbG9yMjsKCX0KCWVsc2UgaWYgKGFscGhhICE9IDI1NSkKCXsKCSAgYWxwaGExID0gMjU1IC0gYWxwaGE7CgkgIHBbMF0gPSBkaXYyNTUoYWxwaGExICogY29sb3IwICsgYWxwaGEgKiBwWzBdKTsKCSAgcFsxXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjEgKyBhbHBoYSAqIHBbMV0pOwoJICBwWzJdID0gZGl2MjU1KGFscGhhMSAqIGNvbG9yMiArIGFscGhhICogcFsyXSk7Cgl9CglwICs9IDM7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgY29sb3IwID0gY29sb3JbMF07CiAgICBjb2xvcjEgPSBjb2xvclsxXTsKICAgIGNvbG9yMiA9IGNvbG9yWzJdOwogICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbeSAqIGJpdG1hcC0+cm93U2l6ZV07CiAgICAgIHEgPSAmYml0bWFwLT5hbHBoYVt5ICogYml0bWFwLT53aWR0aF07CiAgICAgIGZvciAoeCA9IDA7IHggPCBiaXRtYXAtPndpZHRoOyArK3gpIHsKCWFscGhhID0gKnErKzsKCWlmIChhbHBoYSA9PSAwKQoJewoJICBwWzBdID0gY29sb3IwOwoJICBwWzFdID0gY29sb3IxOwoJICBwWzJdID0gY29sb3IyOwoJfQoJZWxzZSBpZiAoYWxwaGEgIT0gMjU1KQoJewoJICBhbHBoYTEgPSAyNTUgLSBhbHBoYTsKCSAgcFswXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjAgKyBhbHBoYSAqIHBbMF0pOwoJICBwWzFdID0gZGl2MjU1KGFscGhhMSAqIGNvbG9yMSArIGFscGhhICogcFsxXSk7CgkgIHBbMl0gPSBkaXYyNTUoYWxwaGExICogY29sb3IyICsgYWxwaGEgKiBwWzJdKTsKCX0KCXBbM10gPSAyNTU7CglwICs9IDQ7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIGNvbG9yMCA9IGNvbG9yWzBdOwogICAgY29sb3IxID0gY29sb3JbMV07CiAgICBjb2xvcjIgPSBjb2xvclsyXTsKICAgIGNvbG9yMyA9IGNvbG9yWzNdOwogICAgZm9yICh5ID0gMDsgeSA8IGJpdG1hcC0+aGVpZ2h0OyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbeSAqIGJpdG1hcC0+cm93U2l6ZV07CiAgICAgIHEgPSAmYml0bWFwLT5hbHBoYVt5ICogYml0bWFwLT53aWR0aF07CiAgICAgIGZvciAoeCA9IDA7IHggPCBiaXRtYXAtPndpZHRoOyArK3gpIHsKCWFscGhhID0gKnErKzsKCWFscGhhMSA9IDI1NSAtIGFscGhhOwoJcFswXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjAgKyBhbHBoYSAqIHBbMF0pOwoJcFsxXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjEgKyBhbHBoYSAqIHBbMV0pOwoJcFsyXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjIgKyBhbHBoYSAqIHBbMl0pOwoJcFszXSA9IGRpdjI1NShhbHBoYTEgKiBjb2xvcjMgKyBhbHBoYSAqIHBbM10pOwoJcCArPSA0OwogICAgICB9CiAgICB9CiAgICBicmVhazsKI2VuZGlmCiAgfQogIG1lbXNldChiaXRtYXAtPmFscGhhLCAyNTUsIGJpdG1hcC0+d2lkdGggKiBiaXRtYXAtPmhlaWdodCk7Cn0KCkdCb29sIFNwbGFzaDo6Z291cmF1ZFRyaWFuZ2xlU2hhZGVkRmlsbChTcGxhc2hHb3VyYXVkQ29sb3IgKnNoYWRpbmcpCnsKICBkb3VibGUgeGRibFszXSA9IHswLiwgMC4sIDAufTsKICBkb3VibGUgeWRibFszXSA9IHswLiwgMC4sIDAufTsKICBpbnQgICAgeFszXSA9IHswLCAwLCAwfTsKICBpbnQgICAgeVszXSA9IHswLCAwLCAwfTsKICBkb3VibGUgeHQ9MC4sIHhhPTAuLCB5dD0wLjsKICBkb3VibGUgY2E9MC4sIGN0PTAuOwoKICAvLyB0cmlhbmdsZSBpbnRlcnBvbGF0aW9uOgogIC8vCiAgZG91YmxlIHNjYW5MaW1pdE1hcExbMl0gPSB7MC4sIDAufTsKICBkb3VibGUgc2NhbkxpbWl0TWFwUlsyXSA9IHswLiwgMC59OwogIGRvdWJsZSBzY2FuQ29sb3JNYXBMWzJdID0gezAuLCAwLn07CiAgZG91YmxlIHNjYW5Db2xvck1hcFJbMl0gPSB7MC4sIDAufTsKICBkb3VibGUgc2NhbkNvbG9yTWFwWzJdID0gezAuLCAwLn07CiAgaW50IHNjYW5FZGdlTFsyXSA9IHsgMCwgMCB9OwogIGludCBzY2FuRWRnZVJbMl0gPSB7IDAsIDAgfTsKICBHQm9vbCBoYXNGdXJ0aGVyU2VnbWVudCA9IGdGYWxzZTsKCiAgaW50IHNjYW5MaW5lT2ZmID0gMDsKICBpbnQgYml0bWFwT2ZmID0gMDsKICBpbnQgc2NhbkxpbWl0UiA9IDAsIHNjYW5MaW1pdEwgPSAwLCBZdCA9IDA7CgogIGludCBiaXRtYXBXaWR0aCA9IGJpdG1hcC0+Z2V0V2lkdGgoKTsKICBTcGxhc2hDbGlwKiBjbGlwID0gZ2V0Q2xpcCgpOwogIFNwbGFzaEJpdG1hcCAqYmxpdFRhcmdldCA9IGJpdG1hcDsKICBTcGxhc2hDb2xvclB0ciBiaXRtYXBEYXRhID0gYml0bWFwLT5nZXREYXRhUHRyKCk7CiAgU3BsYXNoQ29sb3JQdHIgYml0bWFwQWxwaGEgPSBiaXRtYXAtPmdldEFscGhhUHRyKCk7CiAgU3BsYXNoQ29sb3JQdHIgY3VyID0gTlVMTDsKICBTcGxhc2hDb29yZCogdXNlclRvQ2FudmFzTWF0cml4ID0gZ2V0TWF0cml4KCk7CiAgU3BsYXNoQ29sb3JNb2RlIGJpdG1hcE1vZGUgPSBiaXRtYXAtPmdldE1vZGUoKTsKICBHQm9vbCBoYXNBbHBoYSA9IChiaXRtYXBBbHBoYSAhPSBOVUxMKTsKICBpbnQgcm93U2l6ZSA9IGJpdG1hcC0+Z2V0Um93U2l6ZSgpOwogIGludCBjb2xvckNvbXBzID0gMDsKICBzd2l0Y2ggKGJpdG1hcE1vZGUpIHsKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgICAgY29sb3JDb21wcz0xOwogICAgYnJlYWs7CiAgICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogICAgICBjb2xvckNvbXBzPTM7CiAgICBicmVhazsKICAgIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICAgIGNvbG9yQ29tcHM9MzsKICAgIGJyZWFrOwogICAgY2FzZSBzcGxhc2hNb2RlWEJHUjg6CiAgICAgIGNvbG9yQ29tcHM9NDsKICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICAgIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgICBjb2xvckNvbXBzPTQ7CiAgICBicmVhazsKI2VuZGlmCiAgfQoKICBTcGxhc2hQaXBlIHBpcGU7CiAgU3BsYXNoQ29sb3IgY1NyY1ZhbDsKCiAgcGlwZUluaXQoJnBpcGUsIDAsIDAsIE5VTEwsIGNTcmNWYWwsIHN0YXRlLT5zdHJva2VBbHBoYSwgZ0ZhbHNlLCBnRmFsc2UpOwoKICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICBpZiAoYWFCdWYgPT0gTlVMTCkgCiAgICAgIHJldHVybiBnRmFsc2U7IC8vIGZhbGwgYmFjayB0byBvbGQgYmVoYXZpb3VyCiAgICBkcmF3QUFQaXhlbEluaXQoKTsKICB9CgogIC8vIGlkZWE6CiAgLy8gMS4gSWYgcGlwZS0+bm9UcmFuc3BhcmVuY3kgJiYgIXN0YXRlLT5ibGVuZEZ1bmMKICAvLyAgLT4gYmxpdCBkaXJlY3RseSBpbnRvIHRoZSBkcmF3aW5nIHN1cmZhY2UhCiAgLy8gIC0+IGRpc2FibGUgYWxwaGEgbWFudWFsbHkuCiAgLy8gMi4gT3RoZXJ3aXNlOgogIC8vIC0gYmxpdCBhbHNvIGRpcmVjdGx5LCBidXQgaW50byBhbiBpbnRlcm1lZGlhdGUgc3VyZmFjZS4KICAvLyBBZnRlcndhcmRzLCBibGl0IHRoZSBpbnRlcm1lZGlhdGUgc3VyZmFjZSB1c2luZyB0aGUgZHJhd2luZyBwaXBlbGluZS4KICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRyaWFuZ2xlIGVsZW1lbnRzIGNhbiBiZSBvbiB0b3Agb2YgZWFjaAogIC8vIG90aGVyLCBzbyB0aGUgY29tcGxldGUgc2hhZGluZyBuZWVkcyB0byBiZSBkcmF3biBiZWZvcmUgb3BhY2l0eSBpcwogIC8vIGFwcGxpZWQuCiAgLy8gLSB0aGUgZmluYWwgc3RlcCwgaXMgcGVyZm9ybWVkIHVzaW5nIGEgU3BsYXNoUGlwZToKICAvLyAtIGFzc2lnbiB0aGUgYWN0dWFsIGNvbG9yIGludG8gY1NyY1ZhbDogcGlwZSB1c2VzIGNTcmNWYWwgYnkgcmVmZXJlbmNlCiAgLy8gLSBpbnZva2UgZHJhd1BpeGVsKCZwaXBlLFgsWSxiTm9DbGlwKTsKICBHQm9vbCBiRGlyZWN0QmxpdCA9IHZlY3RvckFudGlhbGlhcyA/IGdGYWxzZSA6IHBpcGUubm9UcmFuc3BhcmVuY3kgJiYgIXN0YXRlLT5ibGVuZEZ1bmM7CiAgaWYgKCFiRGlyZWN0QmxpdCkgewogICAgYmxpdFRhcmdldCA9IG5ldyBTcGxhc2hCaXRtYXAoYml0bWFwLT5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5nZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+Z2V0Um93UGFkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmdldE1vZGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5nZXRSb3dTaXplKCkgPj0gMCk7CiAgICBiaXRtYXBEYXRhID0gYmxpdFRhcmdldC0+Z2V0RGF0YVB0cigpOwogICAgYml0bWFwQWxwaGEgPSBibGl0VGFyZ2V0LT5nZXRBbHBoYVB0cigpOwoKICAgIC8vIGluaXRpYWxpc2F0aW9uIHNlZW1zIHRvIGJlIG5lY2Vzc2FyeToKICAgIGludCBTID0gYml0bWFwLT5nZXRXaWR0aCgpICogYml0bWFwLT5nZXRIZWlnaHQoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUzsgKytpKQogICAgICBiaXRtYXBBbHBoYVtpXSA9IDA7CiAgICBoYXNBbHBoYSA9IGdUcnVlOwogIH0KCiAgaWYgKHNoYWRpbmctPmlzUGFyYW1ldGVyaXplZCgpKSB7CiAgICBkb3VibGUgY29sb3JbM107CiAgICBkb3VibGUgY29sb3JpbnRlcnA7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFkaW5nLT5nZXROVHJpYW5nbGVzKCk7ICsraSkgewogICAgICBzaGFkaW5nLT5nZXRUcmlhbmdsZShpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB4ZGJsICsgMCwgeWRibCArIDAsIGNvbG9yICsgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRibCArIDEsIHlkYmwgKyAxLCBjb2xvciArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkYmwgKyAyLCB5ZGJsICsgMiwgY29sb3IgKyAyKTsKICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAzOyArK20pIHsKICAgICAgICB4dCA9IHhkYmxbbV0gKiB1c2VyVG9DYW52YXNNYXRyaXhbMF0gKyB5ZGJsW21dICogdXNlclRvQ2FudmFzTWF0cml4WzJdICsgdXNlclRvQ2FudmFzTWF0cml4WzRdOwogICAgICAgIHl0ID0geGRibFttXSAqIHVzZXJUb0NhbnZhc01hdHJpeFsxXSArIHlkYmxbbV0gKiB1c2VyVG9DYW52YXNNYXRyaXhbM10gKyB1c2VyVG9DYW52YXNNYXRyaXhbNV07CiAgICAgICAgeGRibFttXSA9IHh0OwogICAgICAgIHlkYmxbbV0gPSB5dDsKICAgICAgICAvLyB3ZSBvcGVyYXRlIG9uIHNjYW5saW5lcyB3aGljaCBhcmUgaW50ZWdlciBvZmZzZXRzIGludG8gdGhlCiAgICAgICAgLy8gcmFzdGVyIGltYWdlLiBUaGUgZG91YmxlIG9mZnNldHMgYXJlIG9mIG5vIHVzZSBoZXJlLgogICAgICAgIHhbbV0gPSBzcGxhc2hSb3VuZCh4dCk7CiAgICAgICAgeVttXSA9IHNwbGFzaFJvdW5kKHl0KTsKICAgICAgfQogICAgICAvLyBzb3J0IGFjY29yZGluZyB0byB5IGNvb3JkaW5hdGUgdG8gc2ltcGxpZnkgc3dlZXAgdGhyb3VnaCBzY2FubGluZXM6CiAgICAgIC8vIElOU0VSVElPTiBTT1JULgogICAgICBpZiAoeVswXSA+IHlbMV0pIHsKICAgICAgICBHdXN3YXAoeFswXSwgeFsxXSk7CiAgICAgICAgR3Vzd2FwKHlbMF0sIHlbMV0pOwogICAgICAgIEd1c3dhcChjb2xvclswXSwgY29sb3JbMV0pOwogICAgICB9CiAgICAgIC8vIGZpcnN0IHR3byBhcmUgc29ydGVkLgogICAgICBhc3NlcnQoeVswXSA8PSB5WzFdKTsKICAgICAgaWYgKHlbMV0gPiB5WzJdKSB7CiAgICAgICAgaW50IHRtcFggPSB4WzJdOwogICAgICAgIGludCB0bXBZID0geVsyXTsKICAgICAgICBkb3VibGUgdG1wQyA9IGNvbG9yWzJdOwogICAgICAgIHhbMl0gPSB4WzFdOyB5WzJdID0geVsxXTsgY29sb3JbMl0gPSBjb2xvclsxXTsKCiAgICAgICAgaWYgKHlbMF0gPiB0bXBZKSB7CiAgICAgICAgICB4WzFdID0geFswXTsgeVsxXSA9IHlbMF07IGNvbG9yWzFdID0gY29sb3JbMF07CiAgICAgICAgICB4WzBdID0gdG1wWDsgeVswXSA9IHRtcFk7IGNvbG9yWzBdID0gdG1wQzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgeFsxXSA9IHRtcFg7IHlbMV0gPSB0bXBZOyBjb2xvclsxXSA9IHRtcEM7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGZpcnN0IHRocmVlIGFyZSBzb3J0ZWQKICAgICAgYXNzZXJ0KHlbMF0gPD0geVsxXSk7CiAgICAgIGFzc2VydCh5WzFdIDw9IHlbMl0pOwogICAgICAvLy8vLwoKICAgICAgLy8gdGhpcyBoZXJlIGlzIGRldCggVCApID09IDAKICAgICAgLy8gd2hlcmUgVCBpcyB0aGUgbWF0cml4IHRvIG1hcCB0byBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcy4KICAgICAgaWYgKCh4WzBdIC0geFsyXSkgKiAoeVsxXSAtIHlbMl0pIC0gKHhbMV0gLSB4WzJdKSAqICh5WzBdIC0geVsyXSkgPT0gMCkKICAgICAgICBjb250aW51ZTsgLy8gZGVnZW5lcmF0ZSB0cmlhbmdsZS4KCiAgICAgIC8vIHRoaXMgaGVyZSBpbml0aWFsaXNlcyB0aGUgc2NhbmxpbmUgZ2VuZXJhdGlvbi4KICAgICAgLy8gV2Ugc3RhcnQgd2l0aCBsb3cgWSBjb29yZGluYXRlcyBhbmQgc3dlZXAgdXAgdG8gdGhlIGxhcmdlIFkKICAgICAgLy8gY29vcmRpbmF0ZXMuCiAgICAgIC8vCiAgICAgIC8vIHNjYW5FZGdlTFttXSBpbiB7MCwxLDJ9IG09MCwxCiAgICAgIC8vIHNjYW5FZGdlUlttXSBpbiB7MCwxLDJ9IG09MCwxCiAgICAgIC8vCiAgICAgIC8vIGFyZSB0aGUgdHdvIGVkZ2VzIGJldHdlZW4gd2hpY2ggc2NhbmxpbmVzIGFyZSAoY3VycmVudGx5KQogICAgICAvLyBzd2VlcGVkLiBUaGUgdmFsdWVzIHswLDEsMn0gYXJlIGluZGljZXMgaW50byAneCcgYW5kICd5Jy4KICAgICAgLy8gc2NhbkVkZ2VMWzBdID0gMCBtZWFuczogdGhlIGxlZnQgc2NhbiBlZGdlIGhhcyAoeFswXSx5WzBdKSBhcyB2ZXJ0ZXguCiAgICAgIC8vCiAgICAgIHNjYW5FZGdlTFswXSA9IDA7CiAgICAgIHNjYW5FZGdlUlswXSA9IDA7CiAgICAgIGlmICh5WzBdID09IHlbMV0pIHsKICAgICAgICBzY2FuRWRnZUxbMF0gPSAxOwogICAgICAgIHNjYW5FZGdlTFsxXSA9IHNjYW5FZGdlUlsxXSA9IDI7CgogICAgICB9IGVsc2UgewogICAgICAgIHNjYW5FZGdlTFsxXSA9IDE7IHNjYW5FZGdlUlsxXSA9IDI7CiAgICAgIH0KICAgICAgYXNzZXJ0KHlbc2NhbkVkZ2VMWzBdXSA8IHlbc2NhbkVkZ2VMWzFdXSk7CiAgICAgIGFzc2VydCh5W3NjYW5FZGdlUlswXV0gPCB5W3NjYW5FZGdlUlsxXV0pOwoKICAgICAgLy8gT2suIE5vdyBwcmVwYXJlIHRoZSBsaW5lYXIgbWFwcyB3aGljaCBtYXAgdGhlIHkgY29vcmRpbmF0ZSBvZgogICAgICAvLyB0aGUgY3VycmVudCBzY2FubGluZSB0byB0aGUgY29ycmVzcG9uZGluZyBMRUZUIGFuZCBSSUdIVCB4CiAgICAgIC8vIGNvb3JkaW5hdGUgKHdoaWNoIGRlZmluZSB0aGUgc2NhbmxpbmUpLgogICAgICBzY2FuTGltaXRNYXBMWzBdID0gZG91YmxlKHhbc2NhbkVkZ2VMWzFdXSAtIHhbc2NhbkVkZ2VMWzBdXSkgLyAoeVtzY2FuRWRnZUxbMV1dIC0geVtzY2FuRWRnZUxbMF1dKTsKICAgICAgc2NhbkxpbWl0TWFwTFsxXSA9IHhbc2NhbkVkZ2VMWzBdXSAtIHlbc2NhbkVkZ2VMWzBdXSAqIHNjYW5MaW1pdE1hcExbMF07CiAgICAgIHNjYW5MaW1pdE1hcFJbMF0gPSBkb3VibGUoeFtzY2FuRWRnZVJbMV1dIC0geFtzY2FuRWRnZVJbMF1dKSAvICh5W3NjYW5FZGdlUlsxXV0gLSB5W3NjYW5FZGdlUlswXV0pOwogICAgICBzY2FuTGltaXRNYXBSWzFdID0geFtzY2FuRWRnZVJbMF1dIC0geVtzY2FuRWRnZVJbMF1dICogc2NhbkxpbWl0TWFwUlswXTsKCiAgICAgIHhhID0geVsxXSAqIHNjYW5MaW1pdE1hcExbMF0gKyBzY2FuTGltaXRNYXBMWzFdOwogICAgICB4dCA9IHlbMV0gKiBzY2FuTGltaXRNYXBSWzBdICsgc2NhbkxpbWl0TWFwUlsxXTsKICAgICAgaWYgKHhhID4geHQpIHsKICAgICAgICAvLyBJIGhhdmUgImxlZnQiIGlzIHRvIHRoZSByaWdodCBvZiAicmlnaHQiLgogICAgICAgIC8vIEV4Y2hhbmdlIHNpZGVzIQogICAgICAgIEd1c3dhcChzY2FuRWRnZUxbMF0sIHNjYW5FZGdlUlswXSk7CiAgICAgICAgR3Vzd2FwKHNjYW5FZGdlTFsxXSwgc2NhbkVkZ2VSWzFdKTsKICAgICAgICBHdXN3YXAoc2NhbkxpbWl0TWFwTFswXSwgc2NhbkxpbWl0TWFwUlswXSk7CiAgICAgICAgR3Vzd2FwKHNjYW5MaW1pdE1hcExbMV0sIHNjYW5MaW1pdE1hcFJbMV0pOwogICAgICAgIC8vIEZJWE1FIEknbSBzdXJlIHRoZXJlIGlzIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGNoZWNrIHRoaXMuCiAgICAgIH0KCiAgICAgIC8vIFNhbWUgZ2FtZTogd2UgY2FuIGxpbmVhcmx5IGludGVycG9sYXRlIHRoZSBjb2xvciBiYXNlZCBvbiB0aGUKICAgICAgLy8gY3VycmVudCB5IGNvb3JkaW5hdGUgKHRoYXQncyBjb3JyZWN0IGZvciB0cmlhbmdsZQogICAgICAvLyBpbnRlcnBvbGF0aW9uIGR1ZSB0byBsaW5lYXJpdHkuIFdlIGNvdWxkIGFsc28gaGF2ZSBkb25lIGl0IGluCiAgICAgIC8vIGJhcnljZW50cmljIGNvb3JkaW5hdGVzLCBidXQgdGhhdCdzIHNsaWdodGx5IG1vcmUgaW52b2x2ZWQpCiAgICAgIHNjYW5Db2xvck1hcExbMF0gPSAoY29sb3Jbc2NhbkVkZ2VMWzFdXSAtIGNvbG9yW3NjYW5FZGdlTFswXV0pIC8gKHlbc2NhbkVkZ2VMWzFdXSAtIHlbc2NhbkVkZ2VMWzBdXSk7CiAgICAgIHNjYW5Db2xvck1hcExbMV0gPSBjb2xvcltzY2FuRWRnZUxbMF1dIC0geVtzY2FuRWRnZUxbMF1dICogc2NhbkNvbG9yTWFwTFswXTsKICAgICAgc2NhbkNvbG9yTWFwUlswXSA9IChjb2xvcltzY2FuRWRnZVJbMV1dIC0gY29sb3Jbc2NhbkVkZ2VSWzBdXSkgLyAoeVtzY2FuRWRnZVJbMV1dIC0geVtzY2FuRWRnZVJbMF1dKTsKICAgICAgc2NhbkNvbG9yTWFwUlsxXSA9IGNvbG9yW3NjYW5FZGdlUlswXV0gLSB5W3NjYW5FZGdlUlswXV0gKiBzY2FuQ29sb3JNYXBSWzBdOwoKICAgICAgWXQgPSB5WzJdOwogICAgICBoYXNGdXJ0aGVyU2VnbWVudCA9ICh5WzFdIDwgeVsyXSk7CiAgICAgIHNjYW5MaW5lT2ZmID0geVswXSAqIHJvd1NpemU7CgogICAgICBmb3IgKGludCBZID0geVswXTsgWSA8PSB5WzJdOyArK1ksIHNjYW5MaW5lT2ZmICs9IHJvd1NpemUpIHsKICAgICAgICBpZiAoaGFzRnVydGhlclNlZ21lbnQgJiYgWSA9PSB5WzFdKSB7CiAgICAgICAgICAvLyBTV0VFUCBFVkVOVDogd2UgZW5jb3VudGVyZWQgdGhlIG5leHQgc2VnbWVudC4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBzd2l0Y2ggdG8gbmV4dCBzZWdtZW50LCBlaXRoZXIgYXQgbGVmdCBlbmQgb3IgYXQgcmlnaHQKICAgICAgICAgIC8vIGVuZDoKICAgICAgICAgIGlmIChzY2FuRWRnZUxbMV0gPT0gMSkgewogICAgICAgICAgICBzY2FuRWRnZUxbMF0gPSAxOwogICAgICAgICAgICBzY2FuRWRnZUxbMV0gPSAyOwogICAgICAgICAgICBzY2FuTGltaXRNYXBMWzBdID0gZG91YmxlKHhbc2NhbkVkZ2VMWzFdXSAtIHhbc2NhbkVkZ2VMWzBdXSkgLyAoeVtzY2FuRWRnZUxbMV1dIC0geVtzY2FuRWRnZUxbMF1dKTsKICAgICAgICAgICAgc2NhbkxpbWl0TWFwTFsxXSA9IHhbc2NhbkVkZ2VMWzBdXSAtIHlbc2NhbkVkZ2VMWzBdXSAqIHNjYW5MaW1pdE1hcExbMF07CgogICAgICAgICAgICBzY2FuQ29sb3JNYXBMWzBdID0gKGNvbG9yW3NjYW5FZGdlTFsxXV0gLSBjb2xvcltzY2FuRWRnZUxbMF1dKSAvICh5W3NjYW5FZGdlTFsxXV0gLSB5W3NjYW5FZGdlTFswXV0pOwogICAgICAgICAgICBzY2FuQ29sb3JNYXBMWzFdID0gY29sb3Jbc2NhbkVkZ2VMWzBdXSAtIHlbc2NhbkVkZ2VMWzBdXSAqIHNjYW5Db2xvck1hcExbMF07CiAgICAgICAgICB9IGVsc2UgaWYgKHNjYW5FZGdlUlsxXSA9PSAxKSB7CiAgICAgICAgICAgIHNjYW5FZGdlUlswXSA9IDE7CiAgICAgICAgICAgIHNjYW5FZGdlUlsxXSA9IDI7CiAgICAgICAgICAgIHNjYW5MaW1pdE1hcFJbMF0gPSBkb3VibGUoeFtzY2FuRWRnZVJbMV1dIC0geFtzY2FuRWRnZVJbMF1dKSAvICh5W3NjYW5FZGdlUlsxXV0gLSB5W3NjYW5FZGdlUlswXV0pOwogICAgICAgICAgICBzY2FuTGltaXRNYXBSWzFdID0geFtzY2FuRWRnZVJbMF1dIC0geVtzY2FuRWRnZVJbMF1dICogc2NhbkxpbWl0TWFwUlswXTsKCiAgICAgICAgICAgIHNjYW5Db2xvck1hcFJbMF0gPSAoY29sb3Jbc2NhbkVkZ2VSWzFdXSAtIGNvbG9yW3NjYW5FZGdlUlswXV0pIC8gKHlbc2NhbkVkZ2VSWzFdXSAtIHlbc2NhbkVkZ2VSWzBdXSk7CiAgICAgICAgICAgIHNjYW5Db2xvck1hcFJbMV0gPSBjb2xvcltzY2FuRWRnZVJbMF1dIC0geVtzY2FuRWRnZVJbMF1dICogc2NhbkNvbG9yTWFwUlswXTsKICAgICAgICAgIH0KICAgICAgICAgIGFzc2VydCggeVtzY2FuRWRnZUxbMF1dICA8ICB5W3NjYW5FZGdlTFsxXV0gKTsKICAgICAgICAgIGFzc2VydCggeVtzY2FuRWRnZVJbMF1dIDwgIHlbc2NhbkVkZ2VSWzFdXSApOwogICAgICAgICAgaGFzRnVydGhlclNlZ21lbnQgPSBnRmFsc2U7CiAgICAgICAgfQoKICAgICAgICB5dCA9IFk7CgogICAgICAgIHhhID0geXQgKiBzY2FuTGltaXRNYXBMWzBdICsgc2NhbkxpbWl0TWFwTFsxXTsKICAgICAgICB4dCA9IHl0ICogc2NhbkxpbWl0TWFwUlswXSArIHNjYW5MaW1pdE1hcFJbMV07CgogICAgICAgIGNhID0geXQgKiBzY2FuQ29sb3JNYXBMWzBdICsgc2NhbkNvbG9yTWFwTFsxXTsKICAgICAgICBjdCA9IHl0ICogc2NhbkNvbG9yTWFwUlswXSArIHNjYW5Db2xvck1hcFJbMV07CgogICAgICAgIHNjYW5MaW1pdEwgPSBzcGxhc2hSb3VuZCh4YSk7CiAgICAgICAgc2NhbkxpbWl0UiA9IHNwbGFzaFJvdW5kKHh0KTsKCiAgICAgICAgLy8gT2suIE5vdzogaW5pdCB0aGUgY29sb3IgaW50ZXJwb2xhdGlvbiBkZXBlbmRpbmcgb24gdGhlIFgKICAgICAgICAvLyBjb29yZGluYXRlIGluc2lkZSBvZiB0aGUgY3VycmVudCBzY2FubGluZToKICAgICAgICBzY2FuQ29sb3JNYXBbMF0gPSAoc2NhbkxpbWl0UiA9PSBzY2FuTGltaXRMKSA/IDAuIDogKChjdCAtIGNhKSAvIChzY2FuTGltaXRSIC0gc2NhbkxpbWl0TCkpOwogICAgICAgIHNjYW5Db2xvck1hcFsxXSA9IGNhIC0gc2NhbkxpbWl0TCAqIHNjYW5Db2xvck1hcFswXTsKCiAgICAgICAgLy8gaGFuZGxlZCBieSBjbGlwcGluZzoKICAgICAgICAvLyBhc3NlcnQoIHNjYW5MaW1pdEwgPj0gMCAmJiBzY2FuTGltaXRSIDwgYml0bWFwLT5nZXRXaWR0aCgpICk7CiAgICAgICAgYXNzZXJ0KHNjYW5MaW1pdEwgPD0gc2NhbkxpbWl0UiB8fCBhYnMoc2NhbkxpbWl0TCAtIHNjYW5MaW1pdFIpIDw9IDIpOyAvLyBhbGxvdyByb3VuZGluZyBpbmFjY3VyYWNpZXMKICAgICAgICBhc3NlcnQoc2NhbkxpbmVPZmYgPT0gWSAqIHJvd1NpemUpOwoKICAgICAgICBjb2xvcmludGVycCA9IHNjYW5Db2xvck1hcFswXSAqIHNjYW5MaW1pdEwgKyBzY2FuQ29sb3JNYXBbMV07CgogICAgICAgIGJpdG1hcE9mZiA9IHNjYW5MaW5lT2ZmICsgc2NhbkxpbWl0TCAqIGNvbG9yQ29tcHM7CiAgICAgICAgZm9yIChpbnQgWCA9IHNjYW5MaW1pdEw7IFggPD0gc2NhbkxpbWl0UjsgKytYLCBjb2xvcmludGVycCArPSBzY2FuQ29sb3JNYXBbMF0sIGJpdG1hcE9mZiArPSBjb2xvckNvbXBzKSB7CiAgICAgICAgICAvLyBGSVhNRSA6IHN0YW5kYXJkIHJlY3Rhbmd1bGFyIGNsaXBwaW5nIGNhbiBiZSBkb25lIGZvciBhCiAgICAgICAgICAvLyBjb21wbGV0ZSBzY2FubGluZSB3aGljaCBpcyBmYXN0ZXIKICAgICAgICAgIC8vIC0tPiBzZWUgU3BsYXNoQ2xpcCBhbmQgaXRzIG1ldGhvZHMKICAgICAgICAgIGlmICghY2xpcC0+dGVzdChYLCBZKSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgYXNzZXJ0KGZhYnMoY29sb3JpbnRlcnAgLSAoc2NhbkNvbG9yTWFwWzBdICogWCArIHNjYW5Db2xvck1hcFsxXSkpIDwgMWUtMTApOwogICAgICAgICAgYXNzZXJ0KGJpdG1hcE9mZiA9PSBZICogcm93U2l6ZSArIGNvbG9yQ29tcHMgKiBYICYmIHNjYW5MaW5lT2ZmID09IFkgKiByb3dTaXplKTsKCiAgICAgICAgICBzaGFkaW5nLT5nZXRQYXJhbWV0ZXJpemVkQ29sb3IoY29sb3JpbnRlcnAsIGJpdG1hcE1vZGUsICZiaXRtYXBEYXRhW2JpdG1hcE9mZl0pOwoKICAgICAgICAgIC8vIG1ha2UgdGhlIHNoYWRpbmcgdmlzaWJsZS4KICAgICAgICAgIC8vIE5vdGUgdGhhdCBvcGFjaXR5IGlzIGhhbmRsZWQgYnkgdGhlIGJEaXJlY3RCbGl0IHN0dWZmLCBzZWUKICAgICAgICAgIC8vIGFib3ZlIGZvciBjb21tZW50cyBhbmQgYmVsb3cgZm9yIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgaWYgKGhhc0FscGhhKQogICAgICAgICAgICBiaXRtYXBBbHBoYVtZICogYml0bWFwV2lkdGggKyBYXSA9IDI1NTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgcmV0dXJuIGdGYWxzZTsKICB9CgogIGlmICghYkRpcmVjdEJsaXQpIHsKICAgIC8vIG9rLiBGaW5hbGl6ZSB0aGUgc3R1ZmYgYnkgYmxpdHRpbmcgdGhlIHNoYWRpbmcgaW50byB0aGUgZmluYWwKICAgIC8vIGdlb21ldHJ5LCB0aGlzIHRpbWUgcmVzcGVjdGluZyB0aGUgcmVuZGVyaW5nIHBpcGUuCiAgICBpbnQgVyA9IGJsaXRUYXJnZXQtPmdldFdpZHRoKCk7CiAgICBpbnQgSCA9IGJsaXRUYXJnZXQtPmdldEhlaWdodCgpOwogICAgY3VyID0gY1NyY1ZhbDsKCiAgICBmb3IgKGludCBYID0gMDsgWCA8IFc7ICsrWCkgewogICAgICBmb3IgKGludCBZID0gMDsgWSA8IEg7ICsrWSkgewogICAgICAgIGlmICghYml0bWFwQWxwaGFbWSAqIGJpdG1hcFdpZHRoICsgWF0pCiAgICAgICAgICBjb250aW51ZTsgLy8gZHJhdyBvbmx5IHBhcnRzIG9mIHRoZSBzaGFkaW5nIQogICAgICAgIGJpdG1hcE9mZiA9IFkgKiByb3dTaXplICsgY29sb3JDb21wcyAqIFg7CgogICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgY29sb3JDb21wczsgKyttKQogICAgICAgICAgY3VyW21dID0gYml0bWFwRGF0YVtiaXRtYXBPZmYgKyBtXTsKICAgICAgICBpZiAodmVjdG9yQW50aWFsaWFzKSB7CiAgICAgICAgICBkcmF3QUFQaXhlbCgmcGlwZSwgWCwgWSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRyYXdQaXhlbCgmcGlwZSwgWCwgWSwgZ1RydWUpOyAvLyBubyBjbGlwcGluZyAtIGhhcyBhbHJlYWR5IGJlZW4gZG9uZS4KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBkZWxldGUgYmxpdFRhcmdldDsKICAgIGJsaXRUYXJnZXQgPSBOVUxMOwogIH0KCiAgcmV0dXJuIGdUcnVlOwp9CgpTcGxhc2hFcnJvciBTcGxhc2g6OmJsaXRUcmFuc3BhcmVudChTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkJICAgIGludCB4RGVzdCwgaW50IHlEZXN0LCBpbnQgdywgaW50IGgpIHsKICBTcGxhc2hDb2xvciBwaXhlbDsKICBTcGxhc2hDb2xvclB0ciBwLCBzcDsKICBHdWNoYXIgKnE7CiAgaW50IHgsIHksIG1hc2s7CgogIGlmIChzcmMtPm1vZGUgIT0gYml0bWFwLT5tb2RlKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyTW9kZU1pc21hdGNoOwogIH0KCiAgc3dpdGNoIChiaXRtYXAtPm1vZGUpIHsKICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyAoeERlc3QgPj4gMyldOwogICAgICBtYXNrID0gMHg4MCA+PiAoeERlc3QgJiA3KTsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJc3JjLT5nZXRQaXhlbCh4U3JjICsgeCwgeVNyYyArIHksIHBpeGVsKTsKCWlmIChwaXhlbFswXSkgewoJICAqcCB8PSBtYXNrOwoJfSBlbHNlIHsKCSAgKnAgJj0gfm1hc2s7Cgl9CglpZiAoIShtYXNrID4+PSAxKSkgewoJICBtYXNrID0gMHg4MDsKCSAgKytwOwoJfQogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyB4RGVzdF07CiAgICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKCXNyYy0+Z2V0UGl4ZWwoeFNyYyArIHgsIHlTcmMgKyB5LCBwaXhlbCk7CgkqcCsrID0gcGl4ZWxbMF07CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyAzICogeERlc3RdOwogICAgICBzcCA9ICZzcmMtPmRhdGFbKHlTcmMgKyB5KSAqIHNyYy0+cm93U2l6ZSArIDMgKiB4U3JjXTsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyA0ICogeERlc3RdOwogICAgICBzcCA9ICZzcmMtPmRhdGFbKHlTcmMgKyB5KSAqIHNyYy0+cm93U2l6ZSArIDQgKiB4U3JjXTsKICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9ICpzcCsrOwoJKnArKyA9IDI1NTsKCXNwKys7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKICAgICAgcCA9ICZiaXRtYXAtPmRhdGFbKHlEZXN0ICsgeSkgKiBiaXRtYXAtPnJvd1NpemUgKyA0ICogeERlc3RdOwogICAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CglzcmMtPmdldFBpeGVsKHhTcmMgKyB4LCB5U3JjICsgeSwgcGl4ZWwpOwoJKnArKyA9IHBpeGVsWzBdOwoJKnArKyA9IHBpeGVsWzFdOwoJKnArKyA9IHBpeGVsWzJdOwoJKnArKyA9IHBpeGVsWzNdOwogICAgICB9CiAgICB9CiAgICBicmVhazsKI2VuZGlmCiAgfQoKICBpZiAoYml0bWFwLT5hbHBoYSkgewogICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgewogICAgICBxID0gJmJpdG1hcC0+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+c2Vnc1tpXS5mbGFncwkmIHNwbGFzaFhQYXRoRmxpcCkgPyAiUCIgOiAiICIpOwogIH0KfQoKU3BsYXNoRXJyb3IgU3BsYXNoOjpzaGFkZWRGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGhhc0JCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuKSB7CiAgU3BsYXNoUGlwZSBwaXBlOwogIFNwbGFzaFhQYXRoICp4UGF0aDsKICBTcGxhc2hYUGF0aFNjYW5uZXIgKnNjYW5uZXI7CiAgaW50IHhNaW5JLCB5TWluSSwgeE1heEksIHlNYXhJLCB4MCwgeDEsIHk7CiAgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzOwoKICBpZiAoYWFCdWYgPT0gTlVMTCkgeyAvLyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHRvIGJlIHNlY3VyZQogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgfQogIGlmIChwYXRoLT5sZW5ndGggPT0gMCkgewogICAgcmV0dXJuIHNwbGFzaEVyckVtcHR5UGF0aDsKICB9CiAgeFBhdGggPSBuZXcgU3BsYXNoWFBhdGgocGF0aCwgc3RhdGUtPm1hdHJpeCwgc3RhdGUtPmZsYXRuZXNzLCBnVHJ1ZSk7CiAgeFBhdGgtPmFhU2NhbGUoKTsKICB4UGF0aC0+c29ydCgpOwogIHNjYW5uZXIgPSBuZXcgU3BsYXNoWFBhdGhTY2FubmVyKHhQYXRoLCBnRmFsc2UpOwoKICAvLyBnZXQgdGhlIG1pbiBhbmQgbWF4IHggYW5kIHkgdmFsdWVzCiAgc2Nhbm5lci0+Z2V0QkJveEFBKCZ4TWluSSwgJnlNaW5JLCAmeE1heEksICZ5TWF4SSk7CgogIC8vIGNoZWNrIGNsaXBwaW5nCiAgaWYgKChjbGlwUmVzID0gc3RhdGUtPmNsaXAtPnRlc3RSZWN0KHhNaW5JLCB5TWluSSwgeE1heEksIHlNYXhJKSkgIT0gc3BsYXNoQ2xpcEFsbE91dHNpZGUpIHsKICAgIC8vIGxpbWl0IHRoZSB5IHJhbmdlCiAgICBpZiAoeU1pbkkgPCBzdGF0ZS0+Y2xpcC0+Z2V0WU1pbkkoKSkgewogICAgICB5TWluSSA9IHN0YXRlLT5jbGlwLT5nZXRZTWluSSgpOwogICAgfQogICAgaWYgKHlNYXhJID4gc3RhdGUtPmNsaXAtPmdldFlNYXhJKCkpIHsKICAgICAgeU1heEkgPSBzdGF0ZS0+Y2xpcC0+Z2V0WU1heEkoKTsKICAgIH0KCiAgICBwaXBlSW5pdCgmcGlwZSwgMCwgeU1pbkksIHBhdHRlcm4sIE5VTEwsIHN0YXRlLT5maWxsQWxwaGEsIHZlY3RvckFudGlhbGlhcyAmJiAhaGFzQkJveCwgZ0ZhbHNlKTsKCiAgICAvLyBkcmF3IHRoZSBzcGFucwogICAgZm9yICh5ID0geU1pbkk7IHkgPD0geU1heEk7ICsreSkgewogICAgICBzY2FubmVyLT5yZW5kZXJBQUxpbmUoYWFCdWYsICZ4MCwgJngxLCB5KTsKICAgICAgaWYgKGNsaXBSZXMgIT0gc3BsYXNoQ2xpcEFsbEluc2lkZSkgewogICAgICAgIHN0YXRlLT5jbGlwLT5jbGlwQUFMaW5lKGFhQnVmLCAmeDAsICZ4MSwgeSk7CiAgICAgIH0KICAgICAgZHJhd0FBTGluZSgmcGlwZSwgeDAsIHgxLCB5KTsKICAgIH0KICB9CiAgb3BDbGlwUmVzID0gY2xpcFJlczsKCiAgZGVsZXRlIHNjYW5uZXI7CiAgZGVsZXRlIHhQYXRoOwogIHJldHVybiBzcGxhc2hPazsKfQo=