Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMsIDIwMTQgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIE11aXplbGFhciA8amVmZkBpbmZpZGlnbS5uZXQ+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBBZGFtIFJlaWNob2xkIDxhZGFtcmVpY2hvbGRAbXlvcGVyYS5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMyBGYWJpbyBEJ1Vyc28gPGZhYmlvZHVyc29AaG90bWFpbC5pdD4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGltcGxlbWVudGF0aW9uCiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgImdvby9nc3RydG9kLmgiCiNpbmNsdWRlICJPYmplY3QuaCIKI2luY2x1ZGUgIkRpY3QuaCIKI2luY2x1ZGUgIlN0cmVhbS5oIgojaW5jbHVkZSAiRXJyb3IuaCIKI2luY2x1ZGUgIkZ1bmN0aW9uLmgiCgojaWZuZGVmIE1fUEkKI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKI2VuZGlmCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRnVuY3Rpb246OkZ1bmN0aW9uKCkgewp9CgpGdW5jdGlvbjo6fkZ1bmN0aW9uKCkgewp9CgpGdW5jdGlvbiAqRnVuY3Rpb246OnBhcnNlKE9iamVjdCAqZnVuY09iaikgewogIHN0ZDo6c2V0PGludD4gdXNlZFBhcmVudHM7CiAgcmV0dXJuIHBhcnNlKGZ1bmNPYmosICZ1c2VkUGFyZW50cyk7Cn0KCkZ1bmN0aW9uICpGdW5jdGlvbjo6cGFyc2UoT2JqZWN0ICpmdW5jT2JqLCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIEZ1bmN0aW9uICpmdW5jOwogIERpY3QgKmRpY3Q7CiAgaW50IGZ1bmNUeXBlOwogIE9iamVjdCBvYmoxOwoKICBpZiAoZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZGljdCA9IGZ1bmNPYmotPnN0cmVhbUdldERpY3QoKTsKICB9IGVsc2UgaWYgKGZ1bmNPYmotPmlzRGljdCgpKSB7CiAgICBkaWN0ID0gZnVuY09iai0+Z2V0RGljdCgpOwogIH0gZWxzZSBpZiAoZnVuY09iai0+aXNOYW1lKCJJZGVudGl0eSIpKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5RnVuY3Rpb24oKTsKICB9IGVsc2UgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRXhwZWN0ZWQgZnVuY3Rpb24gZGljdGlvbmFyeSBvciBzdHJlYW0iKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgaWYgKCFkaWN0LT5sb29rdXAoIkZ1bmN0aW9uVHlwZSIsICZvYmoxKS0+aXNJbnQoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gdHlwZSBpcyBtaXNzaW5nIG9yIHdyb25nIHR5cGUiKTsKICAgIG9iajEuZnJlZSgpOwogICAgcmV0dXJuIE5VTEw7CiAgfQogIGZ1bmNUeXBlID0gb2JqMS5nZXRJbnQoKTsKICBvYmoxLmZyZWUoKTsKCiAgaWYgKGZ1bmNUeXBlID09IDApIHsKICAgIGZ1bmMgPSBuZXcgU2FtcGxlZEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gMikgewogICAgZnVuYyA9IG5ldyBFeHBvbmVudGlhbEZ1bmN0aW9uKGZ1bmNPYmosIGRpY3QpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gMykgewogICAgZnVuYyA9IG5ldyBTdGl0Y2hpbmdGdW5jdGlvbihmdW5jT2JqLCBkaWN0LCB1c2VkUGFyZW50cyk7CiAgfSBlbHNlIGlmIChmdW5jVHlwZSA9PSA0KSB7CiAgICBmdW5jID0gbmV3IFBvc3RTY3JpcHRGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5pbXBsZW1lbnRlZCBmdW5jdGlvbiB0eXBlICh7MDpkfSkiLCBmdW5jVHlwZSk7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgaWYgKCFmdW5jLT5pc09rKCkpIHsKICAgIGRlbGV0ZSBmdW5jOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICByZXR1cm4gZnVuYzsKfQoKRnVuY3Rpb246OkZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpmdW5jKSB7CiAgICBtID0gZnVuYy0+bTsKICAgIG4gPSBmdW5jLT5uOwoKICAgIG1lbWNweShkb21haW4sIGZ1bmMtPmRvbWFpbiwgZnVuY01heElucHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CiAgICBtZW1jcHkocmFuZ2UsIGZ1bmMtPnJhbmdlLCBmdW5jTWF4T3V0cHV0cyAqIDIgKiBzaXplb2YoZG91YmxlKSk7CgogICAgaGFzUmFuZ2UgPSBmdW5jLT5oYXNSYW5nZTsKfQoKR0Jvb2wgRnVuY3Rpb246OmluaXQoRGljdCAqZGljdCkgewogIE9iamVjdCBvYmoxLCBvYmoyOwogIGludCBpOwoKICAvLy0tLS0tIERvbWFpbgogIGlmICghZGljdC0+bG9va3VwKCJEb21haW4iLCAmb2JqMSktPmlzQXJyYXkoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaXMgbWlzc2luZyBkb21haW4iKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgbSA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKSAvIDI7CiAgaWYgKG0gPiBmdW5jTWF4SW5wdXRzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIGZ1bmNNYXhJbnB1dHMpOwogICAgZ290byBlcnIyOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBvYmoxLmFycmF5R2V0KDIqaSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgZ290byBlcnIxOwogICAgfQogICAgZG9tYWluW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgZ290byBlcnIxOwogICAgfQogICAgZG9tYWluW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBSYW5nZQogIGhhc1JhbmdlID0gZ0ZhbHNlOwogIG4gPSAwOwogIGlmIChkaWN0LT5sb29rdXAoIlJhbmdlIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGhhc1JhbmdlID0gZ1RydWU7CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpIC8gMjsKICAgIGlmIChuID4gZnVuY01heE91dHB1dHMpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IG91dHB1dHMgYXJlIHVuc3VwcG9ydGVkIiwKCSAgICBmdW5jTWF4T3V0cHV0cyk7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gcmFuZ2UgYXJyYXkiKTsKCWdvdG8gZXJyMTsKICAgICAgfQogICAgICByYW5nZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgICBvYmoxLmFycmF5R2V0KDIqaSsxLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7Cglnb3RvIGVycjE7CiAgICAgIH0KICAgICAgcmFuZ2VbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9CiAgb2JqMS5mcmVlKCk7CgogIHJldHVybiBnVHJ1ZTsKCiBlcnIxOgogIG9iajIuZnJlZSgpOwogZXJyMjoKICBvYmoxLmZyZWUoKTsKICByZXR1cm4gZ0ZhbHNlOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJZGVudGl0eUZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJZGVudGl0eUZ1bmN0aW9uOjpJZGVudGl0eUZ1bmN0aW9uKCkgewogIGludCBpOwoKICAvLyBmaWxsIHRoZXNlIGluIHdpdGggYXJiaXRyYXJ5IHZhbHVlcyBqdXN0IGluIGNhc2UgdGhleSBnZXQgdXNlZAogIC8vIHNvbWV3aGVyZQogIG0gPSBmdW5jTWF4SW5wdXRzOwogIG4gPSBmdW5jTWF4T3V0cHV0czsKICBmb3IgKGkgPSAwOyBpIDwgZnVuY01heElucHV0czsgKytpKSB7CiAgICBkb21haW5baV1bMF0gPSAwOwogICAgZG9tYWluW2ldWzFdID0gMTsKICB9CiAgaGFzUmFuZ2UgPSBnRmFsc2U7Cn0KCklkZW50aXR5RnVuY3Rpb246On5JZGVudGl0eUZ1bmN0aW9uKCkgewp9Cgp2b2lkIElkZW50aXR5RnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgZnVuY01heE91dHB1dHM7ICsraSkgewogICAgb3V0W2ldID0gaW5baV07CiAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTYW1wbGVkRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClNhbXBsZWRGdW5jdGlvbjo6U2FtcGxlZEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBzYW1wbGVCaXRzOwogIGRvdWJsZSBzYW1wbGVNdWw7CiAgT2JqZWN0IG9iajEsIG9iajI7CiAgR3VpbnQgYnVmLCBiaXRNYXNrOwogIGludCBiaXRzOwogIEd1aW50IHM7CiAgZG91YmxlIGluW2Z1bmNNYXhJbnB1dHNdOwogIGludCBpLCBqLCB0LCBiaXQsIGlkeDsKCiAgaWR4T2Zmc2V0ID0gTlVMTDsKICBzYW1wbGVzID0gTlVMTDsKICBzQnVmID0gTlVMTDsKICBvayA9IGdGYWxzZTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmICghaGFzUmFuZ2UpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgMCBmdW5jdGlvbiBpcyBtaXNzaW5nIHJhbmdlIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmIChtID4gc2FtcGxlZEZ1bmNNYXhJbnB1dHMpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlNhbXBsZWQgZnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBzYW1wbGVkRnVuY01heElucHV0cyk7CiAgICBnb3RvIGVycjE7CiAgfQoKICAvLy0tLS0tIGJ1ZmZlcgogIHNCdWYgPSAoZG91YmxlICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoZG91YmxlKSk7CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgMCBmdW5jdGlvbiBpc24ndCBhIHN0cmVhbSIpOwogICAgZ290byBlcnIxOwogIH0KICBzdHIgPSBmdW5jT2JqLT5nZXRTdHJlYW0oKTsKCiAgLy8tLS0tLSBTaXplCiAgaWYgKCFkaWN0LT5sb29rdXAoIlNpemUiLCAmb2JqMSktPmlzQXJyYXkoKSB8fAogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBzaXplIGFycmF5Iik7CiAgICBnb3RvIGVycjI7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgaWYgKCFvYmoyLmlzSW50KCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBzaXplIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMzsKICAgIH0KICAgIHNhbXBsZVNpemVbaV0gPSBvYmoyLmdldEludCgpOwogICAgaWYgKHNhbXBsZVNpemVbaV0gPD0gMCkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIG5vbi1wb3NpdGl2ZSB2YWx1ZSBpbiBmdW5jdGlvbiBzaXplIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMzsKICAgIH0KICAgIG9iajIuZnJlZSgpOwogIH0KICBvYmoxLmZyZWUoKTsKICBpZHhPZmZzZXQgPSAoaW50ICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoaW50KSk7CiAgZm9yIChpID0gMDsgaSA8ICgxPDxtKTsgKytpKSB7CiAgICBpZHggPSAwOwogICAgZm9yIChqID0gbSAtIDEsIHQgPSBpOyBqID49IDE7IC0taiwgdCA8PD0gMSkgewogICAgICBpZiAoc2FtcGxlU2l6ZVtqXSA9PSAxKSB7CgliaXQgPSAwOwogICAgICB9IGVsc2UgewoJYml0ID0gKHQgPj4gKG0gLSAxKSkgJiAxOwogICAgICB9CiAgICAgIGlkeCA9IChpZHggKyBiaXQpICogc2FtcGxlU2l6ZVtqLTFdOwogICAgfQogICAgaWYgKHNhbXBsZVNpemVbMF0gPT0gMSkgewogICAgICBiaXQgPSAwOwogICAgfSBlbHNlIHsKICAgICAgYml0ID0gKHQgPj4gKG0gLSAxKSkgJiAxOwogICAgfQogICAgaWR4T2Zmc2V0W2ldID0gKGlkeCArIGJpdCkgKiBuOwogIH0KCiAgLy8tLS0tLSBCaXRzUGVyU2FtcGxlCiAgaWYgKCFkaWN0LT5sb29rdXAoIkJpdHNQZXJTYW1wbGUiLCAmb2JqMSktPmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgQml0c1BlclNhbXBsZSIpOwogICAgZ290byBlcnIyOwogIH0KICBzYW1wbGVCaXRzID0gb2JqMS5nZXRJbnQoKTsKICBzYW1wbGVNdWwgPSAxLjAgLyAocG93KDIuMCwgKGRvdWJsZSlzYW1wbGVCaXRzKSAtIDEpOwogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIEVuY29kZQogIGlmIChkaWN0LT5sb29rdXAoIkVuY29kZSIsICZvYmoxKS0+aXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICAgIG9iajEuYXJyYXlHZXQoMippKzEsICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgZW5jb2RlW2ldWzBdID0gMDsKICAgICAgZW5jb2RlW2ldWzFdID0gc2FtcGxlU2l6ZVtpXSAtIDE7CiAgICB9CiAgfQogIG9iajEuZnJlZSgpOwogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGlucHV0TXVsW2ldID0gKGVuY29kZVtpXVsxXSAtIGVuY29kZVtpXVswXSkgLwogICAgICAgICAgICAgICAgICAoZG9tYWluW2ldWzFdIC0gZG9tYWluW2ldWzBdKTsKICB9CgogIC8vLS0tLS0gRGVjb2RlCiAgaWYgKGRpY3QtPmxvb2t1cCgiRGVjb2RlIiwgJm9iajEpLT5pc0FycmF5KCkgJiYKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpID09IDIqbikgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KDIqaSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkZWNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBkZWNvZGVbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkZWNvZGUgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBkZWNvZGVbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBkZWNvZGVbaV1bMF0gPSByYW5nZVtpXVswXTsKICAgICAgZGVjb2RlW2ldWzFdID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIHNhbXBsZXMKICBuU2FtcGxlcyA9IG47CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkKICAgIG5TYW1wbGVzICo9IHNhbXBsZVNpemVbaV07CiAgc2FtcGxlcyA9IChkb3VibGUgKilnbWFsbG9jbihuU2FtcGxlcywgc2l6ZW9mKGRvdWJsZSkpOwogIGJ1ZiA9IDA7CiAgYml0cyA9IDA7CiAgYml0TWFzayA9ICgxIDw8IHNhbXBsZUJpdHMpIC0gMTsKICBzdHItPnJlc2V0KCk7CiAgZm9yIChpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgIGlmIChzYW1wbGVCaXRzID09IDgpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDE2KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZUJpdHMgPT0gMzIpIHsKICAgICAgcyA9IHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKGJpdHMgPCBzYW1wbGVCaXRzKSB7CglidWYgPSAoYnVmIDw8IDgpIHwgKHN0ci0+Z2V0Q2hhcigpICYgMHhmZik7CgliaXRzICs9IDg7CiAgICAgIH0KICAgICAgcyA9IChidWYgPj4gKGJpdHMgLSBzYW1wbGVCaXRzKSkgJiBiaXRNYXNrOwogICAgICBiaXRzIC09IHNhbXBsZUJpdHM7CiAgICB9CiAgICBzYW1wbGVzW2ldID0gKGRvdWJsZSlzICogc2FtcGxlTXVsOwogIH0KICBzdHItPmNsb3NlKCk7CgogIC8vIHNldCB1cCB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbltpXSA9IGRvbWFpbltpXVswXTsKICAgIGNhY2hlSW5baV0gPSBpbltpXSAtIDE7CiAgfQogIHRyYW5zZm9ybShpbiwgY2FjaGVPdXQpOwoKICBvayA9IGdUcnVlOwogIHJldHVybjsKCiBlcnIzOgogIG9iajIuZnJlZSgpOwogZXJyMjoKICBvYmoxLmZyZWUoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpTYW1wbGVkRnVuY3Rpb246On5TYW1wbGVkRnVuY3Rpb24oKSB7CiAgaWYgKGlkeE9mZnNldCkgewogICAgZ2ZyZWUoaWR4T2Zmc2V0KTsKICB9CiAgaWYgKHNhbXBsZXMpIHsKICAgIGdmcmVlKHNhbXBsZXMpOwogIH0KICBpZiAoc0J1ZikgewogICAgZ2ZyZWUoc0J1Zik7CiAgfQp9CgpTYW1wbGVkRnVuY3Rpb246OlNhbXBsZWRGdW5jdGlvbihjb25zdCBTYW1wbGVkRnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIG1lbWNweShzYW1wbGVTaXplLCBmdW5jLT5zYW1wbGVTaXplLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGludCkpOwoKICBtZW1jcHkoZW5jb2RlLCBmdW5jLT5lbmNvZGUsIGZ1bmNNYXhJbnB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShkZWNvZGUsIGZ1bmMtPmRlY29kZSwgZnVuY01heE91dHB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwoKICBtZW1jcHkoaW5wdXRNdWwsIGZ1bmMtPmlucHV0TXVsLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBuU2FtcGxlcyA9IGZ1bmMtPm5TYW1wbGVzOwoKICBpZHhPZmZzZXQgPSAoaW50ICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoaW50KSk7CiAgbWVtY3B5KGlkeE9mZnNldCwgZnVuYy0+aWR4T2Zmc2V0LCAoMSA8PCBtKSAqIChpbnQpc2l6ZW9mKGludCkpOwoKICBzYW1wbGVzID0gKGRvdWJsZSAqKWdtYWxsb2NuKG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KHNhbXBsZXMsIGZ1bmMtPnNhbXBsZXMsIG5TYW1wbGVzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBzQnVmID0gKGRvdWJsZSAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGRvdWJsZSkpOwoKICBtZW1jcHkoY2FjaGVJbiwgZnVuYy0+Y2FjaGVJbiwgZnVuY01heElucHV0cyAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoY2FjaGVPdXQsIGZ1bmMtPmNhY2hlT3V0LCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBTYW1wbGVkRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBlW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzBbZnVuY01heElucHV0c107CiAgZG91YmxlIGVmcmFjMVtmdW5jTWF4SW5wdXRzXTsKICBpbnQgaSwgaiwgaywgaWR4MCwgdDsKCiAgLy8gY2hlY2sgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKGluW2ldICE9IGNhY2hlSW5baV0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpID09IG0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb3V0W2ldID0gY2FjaGVPdXRbaV07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICAvLyBtYXAgaW5wdXQgdmFsdWVzIGludG8gc2FtcGxlIGFycmF5CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgeCA9IChpbltpXSAtIGRvbWFpbltpXVswXSkgKiBpbnB1dE11bFtpXSArIGVuY29kZVtpXVswXTsKICAgIGlmICh4IDwgMCB8fCB4ICE9IHgpIHsgIC8vIHghPXggaXMgYSBtb3JlIHBvcnRhYmxlIHZlcnNpb24gb2YgaXNuYW4oeCkKICAgICAgeCA9IDA7CiAgICB9IGVsc2UgaWYgKHggPiBzYW1wbGVTaXplW2ldIC0gMSkgewogICAgICB4ID0gc2FtcGxlU2l6ZVtpXSAtIDE7CiAgICB9CiAgICBlW2ldID0gKGludCl4OwogICAgaWYgKGVbaV0gPT0gc2FtcGxlU2l6ZVtpXSAtIDEgJiYgc2FtcGxlU2l6ZVtpXSA+IDEpIHsKICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGluW2ldID0gZG9tYWluW2ldWzFdCiAgICAgIGVbaV0gPSBzYW1wbGVTaXplW2ldIC0gMjsKICAgIH0KICAgIGVmcmFjMVtpXSA9IHggLSBlW2ldOwogICAgZWZyYWMwW2ldID0gMSAtIGVmcmFjMVtpXTsKICB9CgogIC8vIGNvbXB1dGUgaW5kZXggZm9yIHRoZSBmaXJzdCBzYW1wbGUgdG8gYmUgdXNlZAogIGlkeDAgPSAwOwogIGZvciAoayA9IG0gLSAxOyBrID49IDE7IC0taykgewogICAgaWR4MCA9IChpZHgwICsgZVtrXSkgKiBzYW1wbGVTaXplW2stMV07CiAgfQogIGlkeDAgPSAoaWR4MCArIGVbMF0pICogbjsKCiAgLy8gZm9yIGVhY2ggb3V0cHV0LCBkbyBtLWxpbmVhciBpbnRlcnBvbGF0aW9uCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoKICAgIC8vIHB1bGwgMl5tIHZhbHVlcyBvdXQgb2YgdGhlIHNhbXBsZSBhcnJheQogICAgZm9yIChqID0gMDsgaiA8ICgxPDxtKTsgKytqKSB7CiAgICAgIGludCBpZHggPSBpZHgwICsgaWR4T2Zmc2V0W2pdICsgaTsKICAgICAgaWYgKGxpa2VseShpZHggPj0gMCAmJiBpZHggPCBuU2FtcGxlcykpIHsKICAgICAgICBzQnVmW2pdID0gc2FtcGxlc1tpZHhdOwogICAgICB9IGVsc2UgewogICAgICAgIHNCdWZbal0gPSAwOyAvLyBUT0RPIEludmVzdGlnYXRlIGlmIHRoaXMgaXMgd2hhdCBBZG9iZSBkb2VzCiAgICAgIH0KICAgIH0KCiAgICAvLyBkbyBtIHNldHMgb2YgaW50ZXJwb2xhdGlvbnMKICAgIGZvciAoaiA9IDAsIHQgPSAoMTw8bSk7IGogPCBtOyArK2osIHQgPj49IDEpIHsKICAgICAgZm9yIChrID0gMDsgayA8IHQ7IGsgKz0gMikgewoJc0J1ZltrID4+IDFdID0gZWZyYWMwW2pdICogc0J1ZltrXSArIGVmcmFjMVtqXSAqIHNCdWZbaysxXTsKICAgICAgfQogICAgfQoKICAgIC8vIG1hcCBvdXRwdXQgdmFsdWUgdG8gcmFuZ2UKICAgIG91dFtpXSA9IHNCdWZbMF0gKiAoZGVjb2RlW2ldWzFdIC0gZGVjb2RlW2ldWzBdKSArIGRlY29kZVtpXVswXTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQoKICAvLyBzYXZlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9CgpHQm9vbCBTYW1wbGVkRnVuY3Rpb246Omhhc0RpZmZlcmVudFJlc3VsdFNldChGdW5jdGlvbiAqZnVuYykgewogIGlmIChmdW5jLT5nZXRUeXBlKCkgPT0gMCkgewogICAgU2FtcGxlZEZ1bmN0aW9uICpjb21wVG8gPSAoU2FtcGxlZEZ1bmN0aW9uICopIGZ1bmM7CiAgICBpZiAoY29tcFRvLT5nZXRTYW1wbGVOdW1iZXIoKSAhPSBuU2FtcGxlcykKICAgICAgcmV0dXJuIGdUcnVlOwogICAgZG91YmxlICpjb21wU2FtcGxlcyA9IGNvbXBUby0+Z2V0U2FtcGxlcygpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7CiAgICAgIGlmIChzYW1wbGVzW2ldICE9IGNvbXBTYW1wbGVzW2ldKQogICAgICAgIHJldHVybiBnVHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGdGYWxzZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRXhwb25lbnRpYWxGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBpbnQgaTsKCiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAobSAhPSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBvbmVudGlhbCBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gQzAKICBpZiAoZGljdC0+bG9va3VwKCJDMCIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAoaGFzUmFuZ2UgJiYgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgbiA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKTsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldChpLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIEMwIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgYzBbaV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGhhc1JhbmdlICYmIG4gIT0gMSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBuID0gMTsKICAgIGMwWzBdID0gMDsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gQzEKICBpZiAoZGljdC0+bG9va3VwKCJDMSIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAob2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzEgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBjMVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAobiAhPSAxKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGMxWzBdID0gMTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gTiAoZXhwb25lbnQpCiAgaWYgKCFkaWN0LT5sb29rdXAoIk4iLCAmb2JqMSktPmlzTnVtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgTiIpOwogICAgZ290byBlcnIyOwogIH0KICBlID0gb2JqMS5nZXROdW0oKTsKICBvYmoxLmZyZWUoKTsKCiAgaXNMaW5lYXIgPSBmYWJzKGUtMS4pIDwgMWUtMTA7CiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMzoKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6fkV4cG9uZW50aWFsRnVuY3Rpb24oKSB7Cn0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oY29uc3QgRXhwb25lbnRpYWxGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgbWVtY3B5KGMwLCBmdW5jLT5jMCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGMxLCBmdW5jLT5jMSwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIGUgPSBmdW5jLT5lOwogIGlzTGluZWFyID0gZnVuYy0+aXNMaW5lYXI7CiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBFeHBvbmVudGlhbEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBkb3VibGUgeDsKICBpbnQgaTsKCiAgaWYgKGluWzBdIDwgZG9tYWluWzBdWzBdKSB7CiAgICB4ID0gZG9tYWluWzBdWzBdOwogIH0gZWxzZSBpZiAoaW5bMF0gPiBkb21haW5bMF1bMV0pIHsKICAgIHggPSBkb21haW5bMF1bMV07CiAgfSBlbHNlIHsKICAgIHggPSBpblswXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgb3V0W2ldID0gYzBbaV0gKyAoaXNMaW5lYXIgPyB4IDogcG93KHgsIGUpKSAqIChjMVtpXSAtIGMwW2ldKTsKICAgIGlmIChoYXNSYW5nZSkgewogICAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CglvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm47Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFN0aXRjaGluZ0Z1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0LCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIE9iamVjdCBvYmoxLCBvYmoyOwogIGludCBpOwoKICBvayA9IGdGYWxzZTsKICBmdW5jcyA9IE5VTEw7CiAgYm91bmRzID0gTlVMTDsKICBlbmNvZGUgPSBOVUxMOwogIHNjYWxlID0gTlVMTDsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICBnb3RvIGVycjE7CiAgfQogIGlmIChtICE9IDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0aXRjaGluZyBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gRnVuY3Rpb25zCiAgaWYgKCFkaWN0LT5sb29rdXAoIkZ1bmN0aW9ucyIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nICdGdW5jdGlvbnMnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgZ290byBlcnIxOwogIH0KICBrID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogIGZ1bmNzID0gKEZ1bmN0aW9uICoqKWdtYWxsb2NuKGssIHNpemVvZihGdW5jdGlvbiAqKSk7CiAgYm91bmRzID0gKGRvdWJsZSAqKWdtYWxsb2NuKGsgKyAxLCBzaXplb2YoZG91YmxlKSk7CiAgZW5jb2RlID0gKGRvdWJsZSAqKWdtYWxsb2NuKDIgKiBrLCBzaXplb2YoZG91YmxlKSk7CiAgc2NhbGUgPSAoZG91YmxlICopZ21hbGxvY24oaywgc2l6ZW9mKGRvdWJsZSkpOwogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGZ1bmNzW2ldID0gTlVMTDsKICB9CiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgc3RkOjpzZXQ8aW50PiB1c2VkUGFyZW50c0F1eCA9ICp1c2VkUGFyZW50czsKICAgIG9iajEuYXJyYXlHZXRORihpLCAmb2JqMik7CiAgICBpZiAob2JqMi5pc1JlZigpKSB7CiAgICAgIGNvbnN0IFJlZiByZWYgPSBvYmoyLmdldFJlZigpOwogICAgICBpZiAodXNlZFBhcmVudHNBdXguZmluZChyZWYubnVtKSA9PSB1c2VkUGFyZW50c0F1eC5lbmQoKSkgewogICAgICAgIHVzZWRQYXJlbnRzQXV4Lmluc2VydChyZWYubnVtKTsKICAgICAgICBvYmoyLmZyZWUoKTsKICAgICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb3RvIGVycjI7CiAgICAgIH0KICAgIH0KICAgIGlmICghKGZ1bmNzW2ldID0gRnVuY3Rpb246OnBhcnNlKCZvYmoyLCAmdXNlZFBhcmVudHNBdXgpKSkgewogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBpZiAoZnVuY3NbaV0tPmdldElucHV0U2l6ZSgpICE9IDEgfHwKCShpID4gMCAmJiBmdW5jc1tpXS0+Z2V0T3V0cHV0U2l6ZSgpICE9IGZ1bmNzWzBdLT5nZXRPdXRwdXRTaXplKCkpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAiSW5jb21wYXRpYmxlIHN1YmZ1bmN0aW9ucyBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgb2JqMi5mcmVlKCk7CiAgfQogIG9iajEuZnJlZSgpOwoKICAvLy0tLS0tIEJvdW5kcwogIGlmICghZGljdC0+bG9va3VwKCJCb3VuZHMiLCAmb2JqMSktPmlzQXJyYXkoKSB8fAogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gayAtIDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3Npbmcgb3IgaW52YWxpZCAnQm91bmRzJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgYm91bmRzWzBdID0gZG9tYWluWzBdWzBdOwogIGZvciAoaSA9IDE7IGkgPCBrOyArK2kpIHsKICAgIGlmICghb2JqMS5hcnJheUdldChpIC0gMSwgJm9iajIpLT5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludmFsaWQgdHlwZSBpbiAnQm91bmRzJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgYm91bmRzW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogIH0KICBib3VuZHNba10gPSBkb21haW5bMF1bMV07CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gRW5jb2RlCiAgaWYgKCFkaWN0LT5sb29rdXAoIkVuY29kZSIsICZvYmoxKS0+aXNBcnJheSgpIHx8CiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSAyICogaykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyBvciBpbnZhbGlkICdFbmNvZGUnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgZ290byBlcnIxOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgMiAqIGs7ICsraSkgewogICAgaWYgKCFvYmoxLmFycmF5R2V0KGksICZvYmoyKS0+aXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbnZhbGlkIHR5cGUgaW4gJ0VuY29kZScgYXJyYXkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGVuY29kZVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gcHJlLWNvbXB1dGUgdGhlIHNjYWxlIGZhY3RvcnMKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBpZiAoYm91bmRzW2ldID09IGJvdW5kc1tpKzFdKSB7CiAgICAgIC8vIGF2b2lkIGEgZGl2aWRlLWJ5LXplcm8gLS0gaW4gdGhpcyBzaXR1YXRpb24sIGZ1bmN0aW9uIGkgd2lsbAogICAgICAvLyBuZXZlciBiZSB1c2VkIGFueXdheQogICAgICBzY2FsZVtpXSA9IDA7CiAgICB9IGVsc2UgewogICAgICBzY2FsZVtpXSA9IChlbmNvZGVbMippKzFdIC0gZW5jb2RlWzIqaV0pIC8gKGJvdW5kc1tpKzFdIC0gYm91bmRzW2ldKTsKICAgIH0KICB9CgogIG4gPSBmdW5jc1swXS0+Z2V0T3V0cHV0U2l6ZSgpOwogIG9rID0gZ1RydWU7CiAgcmV0dXJuOwoKIGVycjI6CiAgb2JqMi5mcmVlKCk7CiBlcnIxOgogIG9iajEuZnJlZSgpOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oY29uc3QgU3RpdGNoaW5nRnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGsgPSBmdW5jLT5rOwoKICBmdW5jcyA9IChGdW5jdGlvbiAqKilnbWFsbG9jbihrLCBzaXplb2YoRnVuY3Rpb24gKikpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IGZ1bmMtPmZ1bmNzW2ldLT5jb3B5KCk7CiAgfQoKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoYm91bmRzLCBmdW5jLT5ib3VuZHMsIChrICsgMSkgKiBzaXplb2YoZG91YmxlKSk7CgogIGVuY29kZSA9IChkb3VibGUgKilnbWFsbG9jbigyICogaywgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShlbmNvZGUsIGZ1bmMtPmVuY29kZSwgMiAqIGsgKiBzaXplb2YoZG91YmxlKSk7CgogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2NhbGUsIGZ1bmMtPnNjYWxlLCBrICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpTdGl0Y2hpbmdGdW5jdGlvbjo6flN0aXRjaGluZ0Z1bmN0aW9uKCkgewogIGludCBpOwoKICBpZiAoZnVuY3MpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgICAgaWYgKGZ1bmNzW2ldKSB7CglkZWxldGUgZnVuY3NbaV07CiAgICAgIH0KICAgIH0KICB9CiAgZ2ZyZWUoZnVuY3MpOwogIGdmcmVlKGJvdW5kcyk7CiAgZ2ZyZWUoZW5jb2RlKTsKICBnZnJlZShzY2FsZSk7Cn0KCnZvaWQgU3RpdGNoaW5nRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBpOwoKICBpZiAoaW5bMF0gPCBkb21haW5bMF1bMF0pIHsKICAgIHggPSBkb21haW5bMF1bMF07CiAgfSBlbHNlIGlmIChpblswXSA+IGRvbWFpblswXVsxXSkgewogICAgeCA9IGRvbWFpblswXVsxXTsKICB9IGVsc2UgewogICAgeCA9IGluWzBdOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgayAtIDE7ICsraSkgewogICAgaWYgKHggPCBib3VuZHNbaSsxXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgeCA9IGVuY29kZVsyKmldICsgKHggLSBib3VuZHNbaV0pICogc2NhbGVbaV07CiAgZnVuY3NbaV0tPnRyYW5zZm9ybSgmeCwgb3V0KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUG9zdFNjcmlwdEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFBTT3AgewogIHBzT3BBYnMsCiAgcHNPcEFkZCwKICBwc09wQW5kLAogIHBzT3BBdGFuLAogIHBzT3BCaXRzaGlmdCwKICBwc09wQ2VpbGluZywKICBwc09wQ29weSwKICBwc09wQ29zLAogIHBzT3BDdmksCiAgcHNPcEN2ciwKICBwc09wRGl2LAogIHBzT3BEdXAsCiAgcHNPcEVxLAogIHBzT3BFeGNoLAogIHBzT3BFeHAsCiAgcHNPcEZhbHNlLAogIHBzT3BGbG9vciwKICBwc09wR2UsCiAgcHNPcEd0LAogIHBzT3BJZGl2LAogIHBzT3BJbmRleCwKICBwc09wTGUsCiAgcHNPcExuLAogIHBzT3BMb2csCiAgcHNPcEx0LAogIHBzT3BNb2QsCiAgcHNPcE11bCwKICBwc09wTmUsCiAgcHNPcE5lZywKICBwc09wTm90LAogIHBzT3BPciwKICBwc09wUG9wLAogIHBzT3BSb2xsLAogIHBzT3BSb3VuZCwKICBwc09wU2luLAogIHBzT3BTcXJ0LAogIHBzT3BTdWIsCiAgcHNPcFRydWUsCiAgcHNPcFRydW5jYXRlLAogIHBzT3BYb3IsCiAgcHNPcElmLAogIHBzT3BJZmVsc2UsCiAgcHNPcFJldHVybgp9OwoKLy8gTm90ZTogJ2lmJyBhbmQgJ2lmZWxzZScgYXJlIHBhcnNlZCBzZXBhcmF0ZWx5LgovLyBUaGUgcmVzdCBhcmUgbGlzdGVkIGhlcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgovLyBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBlbnRyeSBpbiBQU09wLgpzdGF0aWMgY29uc3QgY2hhciAqcHNPcE5hbWVzW10gPSB7CiAgImFicyIsCiAgImFkZCIsCiAgImFuZCIsCiAgImF0YW4iLAogICJiaXRzaGlmdCIsCiAgImNlaWxpbmciLAogICJjb3B5IiwKICAiY29zIiwKICAiY3ZpIiwKICAiY3ZyIiwKICAiZGl2IiwKICAiZHVwIiwKICAiZXEiLAogICJleGNoIiwKICAiZXhwIiwKICAiZmFsc2UiLAogICJmbG9vciIsCiAgImdlIiwKICAiZ3QiLAogICJpZGl2IiwKICAiaW5kZXgiLAogICJsZSIsCiAgImxuIiwKICAibG9nIiwKICAibHQiLAogICJtb2QiLAogICJtdWwiLAogICJuZSIsCiAgIm5lZyIsCiAgIm5vdCIsCiAgIm9yIiwKICAicG9wIiwKICAicm9sbCIsCiAgInJvdW5kIiwKICAic2luIiwKICAic3FydCIsCiAgInN1YiIsCiAgInRydWUiLAogICJ0cnVuY2F0ZSIsCiAgInhvciIKfTsKCiNkZWZpbmUgblBTT3BzIChzaXplb2YocHNPcE5hbWVzKSAvIHNpemVvZihjaGFyICopKQoKZW51bSBQU09iamVjdFR5cGUgewogIHBzQm9vbCwKICBwc0ludCwKICBwc1JlYWwsCiAgcHNPcGVyYXRvciwKICBwc0Jsb2NrCn07CgovLyBJbiB0aGUgY29kZSBhcnJheSwgJ2lmJy8naWZlbHNlJyBvcGVyYXRvcnMgdGFrZSB1cCB0aHJlZSBzbG90cwovLyBwbHVzIHNwYWNlIGZvciB0aGUgY29kZSBpbiB0aGUgc3ViY2xhdXNlKHMpLgovLwovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wSWYgLyBwc09wSWZlbHNlIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxBPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzQmxvY2s6IHB0cj08Qj4gICAgICAgICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBpZiBjbGF1c2UgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcFJldHVybiAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgIDxBPiB8IGVsc2UgY2xhdXNlICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEI+IHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vCi8vIEZvciAnaWYnLCBwb2ludGVyIDxBPiBpcyBwcmVzZW50IGluIHRoZSBjb2RlIHN0cmVhbSBidXQgdW51c2VkLgoKc3RydWN0IFBTT2JqZWN0IHsKICBQU09iamVjdFR5cGUgdHlwZTsKICB1bmlvbiB7CiAgICBHQm9vbCBib29sbjsJCS8vIGJvb2xlYW4gKHN0YWNrIG9ubHkpCiAgICBpbnQgaW50ZzsJCQkvLyBpbnRlZ2VyIChzdGFjayBhbmQgY29kZSkKICAgIGRvdWJsZSByZWFsOwkJLy8gcmVhbCAoc3RhY2sgYW5kIGNvZGUpCiAgICBQU09wIG9wOwkJCS8vIG9wZXJhdG9yIChjb2RlIG9ubHkpCiAgICBpbnQgYmxrOwkJCS8vIGlmL2lmZWxzZSBibG9jayBwb2ludGVyIChjb2RlIG9ubHkpCiAgfTsKfTsKCiNkZWZpbmUgcHNTdGFja1NpemUgMTAwCgpjbGFzcyBQU1N0YWNrIHsKcHVibGljOgoKICBQU1N0YWNrKCkge3NwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIGNsZWFyKCkgeyBzcCA9IHBzU3RhY2tTaXplOyB9CiAgdm9pZCBwdXNoQm9vbChHQm9vbCBib29sbikKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0Jvb2w7CiAgICAgIHN0YWNrW3NwXS5ib29sbiA9IGJvb2xuOwogICAgfQogIH0KICB2b2lkIHB1c2hJbnQoaW50IGludGcpCiAgewogICAgaWYgKGNoZWNrT3ZlcmZsb3coKSkgewogICAgICBzdGFja1stLXNwXS50eXBlID0gcHNJbnQ7CiAgICAgIHN0YWNrW3NwXS5pbnRnID0gaW50ZzsKICAgIH0KICB9CiAgdm9pZCBwdXNoUmVhbChkb3VibGUgcmVhbCkKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc1JlYWw7CiAgICAgIHN0YWNrW3NwXS5yZWFsID0gcmVhbDsKICAgIH0KICB9CiAgR0Jvb2wgcG9wQm9vbCgpCiAgewogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzQm9vbCwgcHNCb29sKSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uYm9vbG47CiAgICB9CiAgICByZXR1cm4gZ0ZhbHNlOwogIH0KICBpbnQgcG9wSW50KCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNJbnQsIHBzSW50KSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uaW50ZzsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBkb3VibGUgcG9wTnVtKCkKICB7CiAgICBkb3VibGUgcmV0OwoKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNSZWFsKSkgewogICAgICByZXQgPSAoc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQpID8gKGRvdWJsZSlzdGFja1tzcF0uaW50ZyA6IHN0YWNrW3NwXS5yZWFsOwogICAgICArK3NwOwogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIEdCb29sIGVtcHR5KCkgeyByZXR1cm4gc3AgPT0gcHNTdGFja1NpemU7IH0KICBHQm9vbCB0b3BJc0ludCgpIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgJiYgc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQ7IH0KICBHQm9vbCB0b3BUd29BcmVJbnRzKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIHN0YWNrW3NwXS50eXBlID09IHBzSW50ICYmCiAgICAgICAgICAgICBzdGFja1tzcCsxXS50eXBlID09IHBzSW50OyB9CiAgR0Jvb2wgdG9wSXNSZWFsKCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWw7IH0KICBHQm9vbCB0b3BUd29BcmVOdW1zKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIChzdGFja1tzcF0udHlwZSA9PSBwc0ludCB8fCBzdGFja1tzcF0udHlwZSA9PSBwc1JlYWwpICYmCgkgICAgIChzdGFja1tzcCsxXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNSZWFsKTsgfQogIHZvaWQgY29weShpbnQgbik7CiAgdm9pZCByb2xsKGludCBuLCBpbnQgaik7CiAgdm9pZCBpbmRleChpbnQgaSkKICB7CiAgICBpZiAoIWNoZWNrT3ZlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICAtLXNwOwogICAgaWYgKHVubGlrZWx5KHNwICsgaSArIDEgPj0gcHNTdGFja1NpemUpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh1bmxpa2VseShzcCArIGkgKyAxIDwgMCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RhY2sgb3ZlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGFja1tzcF0gPSBzdGFja1tzcCArIDEgKyBpXTsKICB9CiAgdm9pZCBwb3AoKQogIHsKICAgIGlmICghY2hlY2tVbmRlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICArK3NwOwogIH0KCnByaXZhdGU6CgogIEdCb29sIGNoZWNrT3ZlcmZsb3coaW50IG4gPSAxKQogIHsKICAgIGlmIChzcCAtIG4gPCAwKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIG92ZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHJldHVybiBnVHJ1ZTsKICB9CiAgR0Jvb2wgY2hlY2tVbmRlcmZsb3coKQogIHsKICAgIGlmIChzcCA9PSBwc1N0YWNrU2l6ZSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBHQm9vbCBjaGVja1R5cGUoUFNPYmplY3RUeXBlIHQxLCBQU09iamVjdFR5cGUgdDIpCiAgewogICAgaWYgKHN0YWNrW3NwXS50eXBlICE9IHQxICYmIHN0YWNrW3NwXS50eXBlICE9IHQyKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgbWlzbWF0Y2ggaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBQU09iamVjdCBzdGFja1twc1N0YWNrU2l6ZV07CiAgaW50IHNwOwp9OwoKCnZvaWQgUFNTdGFjazo6Y29weShpbnQgbikgewogIGludCBpOwoKICBpZiAoc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGlmICh1bmxpa2VseShzcCAtIG4gPiBwc1N0YWNrU2l6ZSkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGlmICghY2hlY2tPdmVyZmxvdyhuKSkgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGkgPSBzcCArIG4gLSAxOyBpID49IHNwOyAtLWkpIHsKICAgIHN0YWNrW2kgLSBuXSA9IHN0YWNrW2ldOwogIH0KICBzcCAtPSBuOwp9Cgp2b2lkIFBTU3RhY2s6OnJvbGwoaW50IG4sIGludCBqKSB7CiAgUFNPYmplY3Qgb2JqOwogIGludCBpLCBrOwoKICBpZiAodW5saWtlbHkobiA9PSAwKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoaiA+PSAwKSB7CiAgICBqICU9IG47CiAgfSBlbHNlIHsKICAgIGogPSAtaiAlIG47CiAgICBpZiAoaiAhPSAwKSB7CiAgICAgIGogPSBuIC0gajsKICAgIH0KICB9CiAgaWYgKG4gPD0gMCB8fCBqID09IDAgfHwgbiA+IHBzU3RhY2tTaXplIHx8IHNwICsgbiA+IHBzU3RhY2tTaXplKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqIDw9IG4gLyAyKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgKytpKSB7CiAgICAgIG9iaiA9IHN0YWNrW3NwXTsKICAgICAgZm9yIChrID0gc3A7IGsgPCBzcCArIG4gLSAxOyArK2spIHsKICAgICAgICBzdGFja1trXSA9IHN0YWNrW2srMV07CiAgICAgIH0KICAgICAgc3RhY2tbc3AgKyBuIC0gMV0gPSBvYmo7CiAgICB9CiAgfSBlbHNlIHsKICAgIGogPSBuIC0gajsKICAgIGZvciAoaSA9IDA7IGkgPCBqOyArK2kpIHsKICAgICAgb2JqID0gc3RhY2tbc3AgKyBuIC0gMV07CiAgICAgIGZvciAoayA9IHNwICsgbiAtIDE7IGsgPiBzcDsgLS1rKSB7CiAgICAgICAgc3RhY2tba10gPSBzdGFja1trLTFdOwogICAgICB9CiAgICAgIHN0YWNrW3NwXSA9IG9iajsKICAgIH0KICB9Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBjb2RlUHRyOwogIEdvb1N0cmluZyAqdG9rOwogIGRvdWJsZSBpbltmdW5jTWF4SW5wdXRzXTsKICBpbnQgaTsKCiAgY29kZSA9IE5VTEw7CiAgY29kZVN0cmluZyA9IE5VTEw7CiAgY29kZVNpemUgPSAwOwogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgNCBmdW5jdGlvbiBpc24ndCBhIHN0cmVhbSIpOwogICAgZ290byBlcnIxOwogIH0KICBzdHIgPSBmdW5jT2JqLT5nZXRTdHJlYW0oKTsKCiAgLy8tLS0tLSBwYXJzZSB0aGUgZnVuY3Rpb24KICBjb2RlU3RyaW5nID0gbmV3IEdvb1N0cmluZygpOwogIHN0ci0+cmVzZXQoKTsKICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSB8fCB0b2stPmNtcCgieyIpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCAne3snIGF0IHN0YXJ0IG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIGlmICh0b2spIHsKICAgICAgZGVsZXRlIHRvazsKICAgIH0KICAgIGdvdG8gZXJyMTsKICB9CiAgZGVsZXRlIHRvazsKICBjb2RlUHRyID0gMDsKICBpZiAoIXBhcnNlQ29kZShzdHIsICZjb2RlUHRyKSkgewogICAgZ290byBlcnIyOwogIH0KICBzdHItPmNsb3NlKCk7CgogIC8vLS0tLS0gc2V0IHVwIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGluW2ldID0gZG9tYWluW2ldWzBdOwogICAgY2FjaGVJbltpXSA9IGluW2ldIC0gMTsKICB9CiAgdHJhbnNmb3JtKGluLCBjYWNoZU91dCk7CgogIG9rID0gZ1RydWU7CiAgCiBlcnIyOgogIHN0ci0+Y2xvc2UoKTsKIGVycjE6CiAgcmV0dXJuOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246OlBvc3RTY3JpcHRGdW5jdGlvbihjb25zdCBQb3N0U2NyaXB0RnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIGNvZGVTaXplID0gZnVuYy0+Y29kZVNpemU7CgogIGNvZGUgPSAoUFNPYmplY3QgKilnbWFsbG9jbihjb2RlU2l6ZSwgc2l6ZW9mKFBTT2JqZWN0KSk7CiAgbWVtY3B5KGNvZGUsIGZ1bmMtPmNvZGUsIGNvZGVTaXplICogc2l6ZW9mKFBTT2JqZWN0KSk7CgogIGNvZGVTdHJpbmcgPSBmdW5jLT5jb2RlU3RyaW5nLT5jb3B5KCk7CgogIG1lbWNweShjYWNoZUluLCBmdW5jLT5jYWNoZUluLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShjYWNoZU91dCwgZnVuYy0+Y2FjaGVPdXQsIGZ1bmNNYXhPdXRwdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBvayA9IGZ1bmMtPm9rOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246On5Qb3N0U2NyaXB0RnVuY3Rpb24oKSB7CiAgZ2ZyZWUoY29kZSk7CiAgZGVsZXRlIGNvZGVTdHJpbmc7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBQU1N0YWNrIHN0YWNrOwogIGludCBpOwoKICAvLyBjaGVjayB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAoaW5baV0gIT0gY2FjaGVJbltpXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGkgPT0gbSkgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvdXRbaV0gPSBjYWNoZU91dFtpXTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIC8vfiBtYXkgbmVlZCB0byBjaGVjayBmb3IgaW50ZWdlcnMgaGVyZQogICAgc3RhY2sucHVzaFJlYWwoaW5baV0pOwogIH0KICBleGVjKCZzdGFjaywgMCk7CiAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICBvdXRbaV0gPSBzdGFjay5wb3BOdW0oKTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQogIHN0YWNrLmNsZWFyKCk7CgogIC8vIGlmICghc3RhY2stPmVtcHR5KCkpIHsKICAvLyAgIGVycm9yKGVyclN5bnRheFdhcm5pbmcsIC0xLAogIC8vICAgICAgICAgIkV4dHJhIHZhbHVlcyBvbiBzdGFjayBhdCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogIC8vIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBjYWNoZUluW2ldID0gaW5baV07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKR0Jvb2wgUG9zdFNjcmlwdEZ1bmN0aW9uOjpwYXJzZUNvZGUoU3RyZWFtICpzdHIsIGludCAqY29kZVB0cikgewogIEdvb1N0cmluZyAqdG9rOwogIGNoYXIgKnA7CiAgR0Jvb2wgaXNSZWFsOwogIGludCBvcFB0ciwgZWxzZVB0cjsKICBpbnQgYSwgYiwgbWlkLCBjbXA7CgogIHdoaWxlICgxKSB7CiAgICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcCA9IHRvay0+Z2V0Q1N0cmluZygpOwogICAgaWYgKGlzZGlnaXQoKnApIHx8ICpwID09ICcuJyB8fCAqcCA9PSAnLScpIHsKICAgICAgaXNSZWFsID0gZ0ZhbHNlOwogICAgICBmb3IgKDsgKnA7ICsrcCkgewoJaWYgKCpwID09ICcuJykgewoJICBpc1JlYWwgPSBnVHJ1ZTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGlmIChpc1JlYWwpIHsKCWNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc1JlYWw7CiAgICAgICAgICBjb2RlWypjb2RlUHRyXS5yZWFsID0gZ2F0b2YodG9rLT5nZXRDU3RyaW5nKCkpOwogICAgICB9IGVsc2UgewoJY29kZVsqY29kZVB0cl0udHlwZSA9IHBzSW50OwoJY29kZVsqY29kZVB0cl0uaW50ZyA9IGF0b2kodG9rLT5nZXRDU3RyaW5nKCkpOwogICAgICB9CiAgICAgICsrKmNvZGVQdHI7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgieyIpKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIG9wUHRyID0gKmNvZGVQdHI7CiAgICAgICpjb2RlUHRyICs9IDM7CiAgICAgIHJlc2l6ZUNvZGUob3BQdHIgKyAyKTsKICAgICAgaWYgKCFwYXJzZUNvZGUoc3RyLCBjb2RlUHRyKSkgewoJcmV0dXJuIGdGYWxzZTsKICAgICAgfQogICAgICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0b2stPmNtcCgieyIpKSB7CgllbHNlUHRyID0gKmNvZGVQdHI7CglpZiAoIXBhcnNlQ29kZShzdHIsIGNvZGVQdHIpKSB7CgkgIHJldHVybiBnRmFsc2U7Cgl9CglkZWxldGUgdG9rOwoJaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKCSAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KICAgICAgfSBlbHNlIHsKCWVsc2VQdHIgPSAtMTsKICAgICAgfQogICAgICBpZiAoIXRvay0+Y21wKCJpZiIpKSB7CglpZiAoZWxzZVB0ciA+PSAwKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCQkiR290ICdpZicgb3BlcmF0b3Igd2l0aCB0d28gYmxvY2tzIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCSAgcmV0dXJuIGdGYWxzZTsKCX0KCWNvZGVbb3BQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwoJY29kZVtvcFB0cl0ub3AgPSBwc09wSWY7Cgljb2RlW29wUHRyKzJdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisyXS5ibGsgPSAqY29kZVB0cjsKICAgICAgfSBlbHNlIGlmICghdG9rLT5jbXAoImlmZWxzZSIpKSB7CglpZiAoZWxzZVB0ciA8IDApIHsKCSAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJCSJHb3QgJ2lmZWxzZScgb3BlcmF0b3Igd2l0aCBvbmUgYmxvY2sgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwoJICByZXR1cm4gZ0ZhbHNlOwoJfQoJY29kZVtvcFB0cl0udHlwZSA9IHBzT3BlcmF0b3I7Cgljb2RlW29wUHRyXS5vcCA9IHBzT3BJZmVsc2U7Cgljb2RlW29wUHRyKzFdLnR5cGUgPSBwc0Jsb2NrOwoJY29kZVtvcFB0cisxXS5ibGsgPSBlbHNlUHRyOwoJY29kZVtvcFB0cisyXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMl0uYmxrID0gKmNvZGVQdHI7CiAgICAgIH0gZWxzZSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkgICAgICAiRXhwZWN0ZWQgaWYvaWZlbHNlIG9wZXJhdG9yIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCWRlbGV0ZSB0b2s7CglyZXR1cm4gZ0ZhbHNlOwogICAgICB9CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgifSIpKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBjb2RlWypjb2RlUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKICAgICAgY29kZVsqY29kZVB0cl0ub3AgPSBwc09wUmV0dXJuOwogICAgICArKypjb2RlUHRyOwogICAgICBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGEgPSAtMTsKICAgICAgYiA9IG5QU09wczsKICAgICAgY21wID0gMDsgLy8gbWFrZSBnY2MgaGFwcHkKICAgICAgLy8gaW52YXJpYW50OiBwc09wTmFtZXNbYV0gPCB0b2sgPCBwc09wTmFtZXNbYl0KICAgICAgd2hpbGUgKGIgLSBhID4gMSkgewoJbWlkID0gKGEgKyBiKSAvIDI7CgljbXAgPSB0b2stPmNtcChwc09wTmFtZXNbbWlkXSk7CglpZiAoY21wID4gMCkgewoJICBhID0gbWlkOwoJfSBlbHNlIGlmIChjbXAgPCAwKSB7CgkgIGIgPSBtaWQ7Cgl9IGVsc2UgewoJICBhID0gYiA9IG1pZDsKCX0KICAgICAgfQogICAgICBpZiAoY21wICE9IDApIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAgICJVbmtub3duIG9wZXJhdG9yICd7MDp0fScgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIsCgkgICAgICB0b2spOwoJZGVsZXRlIHRvazsKCXJldHVybiBnRmFsc2U7CiAgICAgIH0KICAgICAgZGVsZXRlIHRvazsKICAgICAgcmVzaXplQ29kZSgqY29kZVB0cik7CiAgICAgIGNvZGVbKmNvZGVQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwogICAgICBjb2RlWypjb2RlUHRyXS5vcCA9IChQU09wKWE7CiAgICAgICsrKmNvZGVQdHI7CiAgICB9CiAgfQogIHJldHVybiBnVHJ1ZTsKfQoKR29vU3RyaW5nICpQb3N0U2NyaXB0RnVuY3Rpb246OmdldFRva2VuKFN0cmVhbSAqc3RyKSB7CiAgR29vU3RyaW5nICpzOwogIGludCBjOwogIEdCb29sIGNvbW1lbnQ7CgogIHMgPSBuZXcgR29vU3RyaW5nKCk7CiAgY29tbWVudCA9IGdGYWxzZTsKICB3aGlsZSAoMSkgewogICAgaWYgKChjID0gc3RyLT5nZXRDaGFyKCkpID09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGNvZGVTdHJpbmctPmFwcGVuZChjKTsKICAgIGlmIChjb21tZW50KSB7CiAgICAgIGlmIChjID09ICdceDBhJyB8fCBjID09ICdceDBkJykgewoJY29tbWVudCA9IGdGYWxzZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjID09ICclJykgewogICAgICBjb21tZW50ID0gZ1RydWU7CiAgICB9IGVsc2UgaWYgKCFpc3NwYWNlKGMpKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoYyA9PSAneycgfHwgYyA9PSAnfScpIHsKICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICB9IGVsc2UgaWYgKGlzZGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLScpIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICEoaXNkaWdpdChjKSB8fCBjID09ICcuJyB8fCBjID09ICctJykpIHsKCWJyZWFrOwogICAgICB9CiAgICAgIHN0ci0+Z2V0Q2hhcigpOwogICAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICFpc2FsbnVtKGMpKSB7CglicmVhazsKICAgICAgfQogICAgICBzdHItPmdldENoYXIoKTsKICAgICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgfQogIH0KICByZXR1cm4gczsKfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OnJlc2l6ZUNvZGUoaW50IG5ld1NpemUpIHsKICBpZiAobmV3U2l6ZSA+PSBjb2RlU2l6ZSkgewogICAgY29kZVNpemUgKz0gNjQ7CiAgICBjb2RlID0gKFBTT2JqZWN0ICopZ3JlYWxsb2NuKGNvZGUsIGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICB9Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjpleGVjKFBTU3RhY2sgKnN0YWNrLCBpbnQgY29kZVB0cikgewogIGludCBpMSwgaTI7CiAgZG91YmxlIHIxLCByMiwgcmVzdWx0OwogIEdCb29sIGIxLCBiMjsKCiAgd2hpbGUgKDEpIHsKICAgIHN3aXRjaCAoY29kZVtjb2RlUHRyXS50eXBlKSB7CiAgICBjYXNlIHBzSW50OgogICAgICBzdGFjay0+cHVzaEludChjb2RlW2NvZGVQdHIrK10uaW50Zyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc1JlYWw6CiAgICAgIHN0YWNrLT5wdXNoUmVhbChjb2RlW2NvZGVQdHIrK10ucmVhbCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwc09wZXJhdG9yOgogICAgICBzd2l0Y2ggKGNvZGVbY29kZVB0cisrXS5vcCkgewogICAgICBjYXNlIHBzT3BBYnM6CglpZiAoc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoYWJzKHN0YWNrLT5wb3BJbnQoKSkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hSZWFsKGZhYnMoc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQWRkOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSArIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxICsgcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEFuZDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgJiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxICYmIGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBdGFuOgoJcjIgPSBzdGFjay0+cG9wTnVtKCk7CglyMSA9IHN0YWNrLT5wb3BOdW0oKTsKCXJlc3VsdCA9IGF0YW4yKHIxLCByMikgKiAxODAuMCAvIE1fUEk7CglpZiAocmVzdWx0IDwgMCkgcmVzdWx0ICs9IDM2MC4wOwoJc3RhY2stPnB1c2hSZWFsKHJlc3VsdCk7CglicmVhazsKICAgICAgY2FzZSBwc09wQml0c2hpZnQ6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJaWYgKGkyID4gMCkgewoJICBzdGFjay0+cHVzaEludChpMSA8PCBpMik7Cgl9IGVsc2UgaWYgKGkyIDwgMCkgewoJICBzdGFjay0+cHVzaEludCgoaW50KSgoR3VpbnQpaTEgPj4gLWkyKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaEludChpMSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ2VpbGluZzoKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKGNlaWwoc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ29weToKCXN0YWNrLT5jb3B5KHN0YWNrLT5wb3BJbnQoKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wQ29zOgoJc3RhY2stPnB1c2hSZWFsKGNvcyhzdGFjay0+cG9wTnVtKCkgKiBNX1BJIC8gMTgwLjApKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BDdmk6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KChpbnQpc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDdnI6CglpZiAoIXN0YWNrLT50b3BJc1JlYWwoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BEaXY6CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJc3RhY2stPnB1c2hSZWFsKHIxIC8gcjIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcER1cDoKCXN0YWNrLT5jb3B5KDEpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEVxOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPT0gaTIpOwoJfSBlbHNlIGlmIChzdGFjay0+dG9wVHdvQXJlTnVtcygpKSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID09IHIyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgPT0gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEV4Y2g6CglzdGFjay0+cm9sbCgyLCAxKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BFeHA6CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJc3RhY2stPnB1c2hSZWFsKHBvdyhyMSwgcjIpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BGYWxzZToKCXN0YWNrLT5wdXNoQm9vbChnRmFsc2UpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEZsb29yOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoZmxvb3Ioc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wR2U6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA+PSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA+PSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wR3Q6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA+IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID4gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElkaXY6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJc3RhY2stPnB1c2hJbnQoaTEgLyBpMik7CglicmVhazsKICAgICAgY2FzZSBwc09wSW5kZXg6CglzdGFjay0+aW5kZXgoc3RhY2stPnBvcEludCgpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxIDw9IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxIDw9IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BMbjoKCXN0YWNrLT5wdXNoUmVhbChsb2coc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTG9nOgoJc3RhY2stPnB1c2hSZWFsKGxvZzEwKHN0YWNrLT5wb3BOdW0oKSkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEx0OgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPCBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA8IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BNb2Q6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJc3RhY2stPnB1c2hJbnQoaTEgJSBpMik7CglicmVhazsKICAgICAgY2FzZSBwc09wTXVsOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICAvL34gc2hvdWxkIGNoZWNrIGZvciBvdXQtb2YtcmFuZ2UsIGFuZCBwdXNoIGEgcmVhbCBpbnN0ZWFkCgkgIHN0YWNrLT5wdXNoSW50KGkxICogaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgKiByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTmU6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSAhPSBpMik7Cgl9IGVsc2UgaWYgKHN0YWNrLT50b3BUd29BcmVOdW1zKCkpIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgIT0gcjIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSAhPSBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTmVnOgoJaWYgKHN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KC1zdGFjay0+cG9wSW50KCkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hSZWFsKC1zdGFjay0+cG9wTnVtKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5vdDoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCh+c3RhY2stPnBvcEludCgpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoQm9vbCghc3RhY2stPnBvcEJvb2woKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wT3I6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxIHwgaTIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSB8fCBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wUG9wOgoJc3RhY2stPnBvcCgpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFJvbGw6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJc3RhY2stPnJvbGwoaTEsIGkyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BSb3VuZDoKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbCgocjEgPj0gMCkgPyBmbG9vcihyMSArIDAuNSkgOiBjZWlsKHIxIC0gMC41KSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wU2luOgoJc3RhY2stPnB1c2hSZWFsKHNpbihzdGFjay0+cG9wTnVtKCkgKiBNX1BJIC8gMTgwLjApKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BTcXJ0OgoJc3RhY2stPnB1c2hSZWFsKHNxcnQoc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wU3ViOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSAtIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxIC0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFRydWU6CglzdGFjay0+cHVzaEJvb2woZ1RydWUpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFRydW5jYXRlOgoJaWYgKCFzdGFjay0+dG9wSXNJbnQoKSkgewoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKChyMSA+PSAwKSA/IGZsb29yKHIxKSA6IGNlaWwocjEpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BYb3I6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxIF4gaTIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSBeIGIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BJZjoKCWIxID0gc3RhY2stPnBvcEJvb2woKTsKCWlmIChiMSkgewoJICBleGVjKHN0YWNrLCBjb2RlUHRyICsgMik7Cgl9Cgljb2RlUHRyID0gY29kZVtjb2RlUHRyICsgMV0uYmxrOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElmZWxzZToKCWIxID0gc3RhY2stPnBvcEJvb2woKTsKCWlmIChiMSkgewoJICBleGVjKHN0YWNrLCBjb2RlUHRyICsgMik7Cgl9IGVsc2UgewoJICBleGVjKHN0YWNrLCBjb2RlW2NvZGVQdHJdLmJsayk7Cgl9Cgljb2RlUHRyID0gY29kZVtjb2RlUHRyICsgMV0uYmxrOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFJldHVybjoKCXJldHVybjsKICAgICAgfQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludGVybmFsOiBiYWQgb2JqZWN0IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24gY29kZSIpOwogICAgICBicmVhazsKICAgIH0KICB9Cn0K