Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIE11aXplbGFhciA8amVmZkBpbmZpZGlnbS5uZXQ+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWEgQ2FuY2lhbmkgPHJhbm1hNDJAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbXBsZW1lbnRhdGlvbgojZW5kaWYKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgImdvby9nbWVtLmgiCiNpbmNsdWRlICJnb28vZ3N0cnRvZC5oIgojaW5jbHVkZSAiT2JqZWN0LmgiCiNpbmNsdWRlICJEaWN0LmgiCiNpbmNsdWRlICJTdHJlYW0uaCIKI2luY2x1ZGUgIkVycm9yLmgiCiNpbmNsdWRlICJGdW5jdGlvbi5oIgoKI2lmbmRlZiBNX1BJCiNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CiNlbmRpZgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZ1bmN0aW9uOjpGdW5jdGlvbigpIHsKfQoKRnVuY3Rpb246On5GdW5jdGlvbigpIHsKfQoKRnVuY3Rpb24gKkZ1bmN0aW9uOjpwYXJzZShPYmplY3QgKmZ1bmNPYmopIHsKICBzdGQ6OnNldDxpbnQ+IHVzZWRQYXJlbnRzOwogIHJldHVybiBwYXJzZShmdW5jT2JqLCAmdXNlZFBhcmVudHMpOwp9CgpGdW5jdGlvbiAqRnVuY3Rpb246OnBhcnNlKE9iamVjdCAqZnVuY09iaiwgc3RkOjpzZXQ8aW50PiAqdXNlZFBhcmVudHMpIHsKICBGdW5jdGlvbiAqZnVuYzsKICBEaWN0ICpkaWN0OwogIGludCBmdW5jVHlwZTsKICBPYmplY3Qgb2JqMTsKCiAgaWYgKGZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGRpY3QgPSBmdW5jT2JqLT5zdHJlYW1HZXREaWN0KCk7CiAgfSBlbHNlIGlmIChmdW5jT2JqLT5pc0RpY3QoKSkgewogICAgZGljdCA9IGZ1bmNPYmotPmdldERpY3QoKTsKICB9IGVsc2UgaWYgKGZ1bmNPYmotPmlzTmFtZSgiSWRlbnRpdHkiKSkgewogICAgcmV0dXJuIG5ldyBJZGVudGl0eUZ1bmN0aW9uKCk7CiAgfSBlbHNlIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cGVjdGVkIGZ1bmN0aW9uIGRpY3Rpb25hcnkgb3Igc3RyZWFtIik7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIGlmICghZGljdC0+bG9va3VwKCJGdW5jdGlvblR5cGUiLCAmb2JqMSktPmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIHR5cGUgaXMgbWlzc2luZyBvciB3cm9uZyB0eXBlIik7CiAgICBvYmoxLmZyZWUoKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBmdW5jVHlwZSA9IG9iajEuZ2V0SW50KCk7CiAgb2JqMS5mcmVlKCk7CgogIGlmIChmdW5jVHlwZSA9PSAwKSB7CiAgICBmdW5jID0gbmV3IFNhbXBsZWRGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDIpIHsKICAgIGZ1bmMgPSBuZXcgRXhwb25lbnRpYWxGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDMpIHsKICAgIGZ1bmMgPSBuZXcgU3RpdGNoaW5nRnVuY3Rpb24oZnVuY09iaiwgZGljdCwgdXNlZFBhcmVudHMpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gNCkgewogICAgZnVuYyA9IG5ldyBQb3N0U2NyaXB0RnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gdHlwZSAoezA6ZH0pIiwgZnVuY1R5cGUpOwogICAgcmV0dXJuIE5VTEw7CiAgfQogIGlmICghZnVuYy0+aXNPaygpKSB7CiAgICBkZWxldGUgZnVuYzsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgcmV0dXJuIGZ1bmM7Cn0KCkdCb29sIEZ1bmN0aW9uOjppbml0KERpY3QgKmRpY3QpIHsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBpbnQgaTsKCiAgLy8tLS0tLSBEb21haW4KICBpZiAoIWRpY3QtPmxvb2t1cCgiRG9tYWluIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGlzIG1pc3NpbmcgZG9tYWluIik7CiAgICBnb3RvIGVycjI7CiAgfQogIG0gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogIGlmIChtID4gZnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBmdW5jTWF4SW5wdXRzKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMTsKICAgIH0KICAgIGRvbWFpbltpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyLmZyZWUoKTsKICAgIG9iajEuYXJyYXlHZXQoMippKzEsICZvYmoyKTsKICAgIGlmICghb2JqMi5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIGdvdG8gZXJyMTsKICAgIH0KICAgIGRvbWFpbltpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gUmFuZ2UKICBoYXNSYW5nZSA9IGdGYWxzZTsKICBuID0gMDsKICBpZiAoZGljdC0+bG9va3VwKCJSYW5nZSIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBoYXNSYW5nZSA9IGdUcnVlOwogICAgbiA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKSAvIDI7CiAgICBpZiAobiA+IGZ1bmNNYXhPdXRwdXRzKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiB7MDpkfSBvdXRwdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgICAgZnVuY01heE91dHB1dHMpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoMippLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7Cglnb3RvIGVycjE7CiAgICAgIH0KICAgICAgcmFuZ2VbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgICAgb2JqMS5hcnJheUdldCgyKmkrMSwgJm9iajIpOwogICAgICBpZiAoIW9iajIuaXNOdW0oKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiByYW5nZSBhcnJheSIpOwoJZ290byBlcnIxOwogICAgICB9CiAgICAgIHJhbmdlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfQogIG9iajEuZnJlZSgpOwoKICByZXR1cm4gZ1RydWU7CgogZXJyMToKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiAgcmV0dXJuIGdGYWxzZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSWRlbnRpdHlGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSWRlbnRpdHlGdW5jdGlvbjo6SWRlbnRpdHlGdW5jdGlvbigpIHsKICBpbnQgaTsKCiAgLy8gZmlsbCB0aGVzZSBpbiB3aXRoIGFyYml0cmFyeSB2YWx1ZXMganVzdCBpbiBjYXNlIHRoZXkgZ2V0IHVzZWQKICAvLyBzb21ld2hlcmUKICBtID0gZnVuY01heElucHV0czsKICBuID0gZnVuY01heE91dHB1dHM7CiAgZm9yIChpID0gMDsgaSA8IGZ1bmNNYXhJbnB1dHM7ICsraSkgewogICAgZG9tYWluW2ldWzBdID0gMDsKICAgIGRvbWFpbltpXVsxXSA9IDE7CiAgfQogIGhhc1JhbmdlID0gZ0ZhbHNlOwp9CgpJZGVudGl0eUZ1bmN0aW9uOjp+SWRlbnRpdHlGdW5jdGlvbigpIHsKfQoKdm9pZCBJZGVudGl0eUZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBpbnQgaTsKCiAgZm9yIChpID0gMDsgaSA8IGZ1bmNNYXhPdXRwdXRzOyArK2kpIHsKICAgIG91dFtpXSA9IGluW2ldOwogIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2FtcGxlZEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTYW1wbGVkRnVuY3Rpb246OlNhbXBsZWRGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBTdHJlYW0gKnN0cjsKICBpbnQgc2FtcGxlQml0czsKICBkb3VibGUgc2FtcGxlTXVsOwogIE9iamVjdCBvYmoxLCBvYmoyOwogIEd1aW50IGJ1ZiwgYml0TWFzazsKICBpbnQgYml0czsKICBHdWludCBzOwogIGRvdWJsZSBpbltmdW5jTWF4SW5wdXRzXTsKICBpbnQgaSwgaiwgdCwgYml0LCBpZHg7CgogIGlkeE9mZnNldCA9IE5VTEw7CiAgc2FtcGxlcyA9IE5VTEw7CiAgc0J1ZiA9IE5VTEw7CiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAoIWhhc1JhbmdlKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDAgZnVuY3Rpb24gaXMgbWlzc2luZyByYW5nZSIpOwogICAgZ290byBlcnIxOwogIH0KICBpZiAobSA+IHNhbXBsZWRGdW5jTWF4SW5wdXRzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTYW1wbGVkIGZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiB7MDpkfSBpbnB1dHMgYXJlIHVuc3VwcG9ydGVkIiwKCSAgc2FtcGxlZEZ1bmNNYXhJbnB1dHMpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBidWZmZXIKICBzQnVmID0gKGRvdWJsZSAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGRvdWJsZSkpOwoKICAvLy0tLS0tIGdldCB0aGUgc3RyZWFtCiAgaWYgKCFmdW5jT2JqLT5pc1N0cmVhbSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJUeXBlIDAgZnVuY3Rpb24gaXNuJ3QgYSBzdHJlYW0iKTsKICAgIGdvdG8gZXJyMTsKICB9CiAgc3RyID0gZnVuY09iai0+Z2V0U3RyZWFtKCk7CgogIC8vLS0tLS0gU2l6ZQogIGlmICghZGljdC0+bG9va3VwKCJTaXplIiwgJm9iajEpLT5pc0FycmF5KCkgfHwKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG0pIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgc2l6ZSBhcnJheSIpOwogICAgZ290byBlcnIyOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgIGlmICghb2JqMi5pc0ludCgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICBnb3RvIGVycjM7CiAgICB9CiAgICBzYW1wbGVTaXplW2ldID0gb2JqMi5nZXRJbnQoKTsKICAgIGlmIChzYW1wbGVTaXplW2ldIDw9IDApIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCBub24tcG9zaXRpdmUgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICBnb3RvIGVycjM7CiAgICB9CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CiAgaWR4T2Zmc2V0ID0gKGludCAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGludCkpOwogIGZvciAoaSA9IDA7IGkgPCAoMTw8bSk7ICsraSkgewogICAgaWR4ID0gMDsKICAgIGZvciAoaiA9IG0gLSAxLCB0ID0gaTsgaiA+PSAxOyAtLWosIHQgPDw9IDEpIHsKICAgICAgaWYgKHNhbXBsZVNpemVbal0gPT0gMSkgewoJYml0ID0gMDsKICAgICAgfSBlbHNlIHsKCWJpdCA9ICh0ID4+IChtIC0gMSkpICYgMTsKICAgICAgfQogICAgICBpZHggPSAoaWR4ICsgYml0KSAqIHNhbXBsZVNpemVbai0xXTsKICAgIH0KICAgIGlmIChzYW1wbGVTaXplWzBdID09IDEpIHsKICAgICAgYml0ID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGJpdCA9ICh0ID4+IChtIC0gMSkpICYgMTsKICAgIH0KICAgIGlkeE9mZnNldFtpXSA9IChpZHggKyBiaXQpICogbjsKICB9CgogIC8vLS0tLS0gQml0c1BlclNhbXBsZQogIGlmICghZGljdC0+bG9va3VwKCJCaXRzUGVyU2FtcGxlIiwgJm9iajEpLT5pc0ludCgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgbWlzc2luZyBvciBpbnZhbGlkIEJpdHNQZXJTYW1wbGUiKTsKICAgIGdvdG8gZXJyMjsKICB9CiAgc2FtcGxlQml0cyA9IG9iajEuZ2V0SW50KCk7CiAgc2FtcGxlTXVsID0gMS4wIC8gKHBvdygyLjAsIChkb3VibGUpc2FtcGxlQml0cykgLSAxKTsKICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBFbmNvZGUKICBpZiAoZGljdC0+bG9va3VwKCJFbmNvZGUiLCAmb2JqMSktPmlzQXJyYXkoKSAmJgogICAgICBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgPT0gMiptKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgIG9iajEuYXJyYXlHZXQoMippLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGVuY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgICBvYmoxLmFycmF5R2V0KDIqaSsxLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJZ290byBlcnIzOwogICAgICB9CiAgICAgIGVuY29kZVtpXVsxXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgIGVuY29kZVtpXVswXSA9IDA7CiAgICAgIGVuY29kZVtpXVsxXSA9IHNhbXBsZVNpemVbaV0gLSAxOwogICAgfQogIH0KICBvYmoxLmZyZWUoKTsKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpbnB1dE11bFtpXSA9IChlbmNvZGVbaV1bMV0gLSBlbmNvZGVbaV1bMF0pIC8KICAgICAgICAgICAgICAgICAgKGRvbWFpbltpXVsxXSAtIGRvbWFpbltpXVswXSk7CiAgfQoKICAvLy0tLS0tIERlY29kZQogIGlmIChkaWN0LT5sb29rdXAoIkRlY29kZSIsICZvYmoxKS0+aXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm4pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldCgyKmksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzBdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICAgIG9iajEuYXJyYXlHZXQoMippKzEsICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgICAgb2JqMi5mcmVlKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgZGVjb2RlW2ldWzBdID0gcmFuZ2VbaV1bMF07CiAgICAgIGRlY29kZVtpXVsxXSA9IHJhbmdlW2ldWzFdOwogICAgfQogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBzYW1wbGVzCiAgblNhbXBsZXMgPSBuOwogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpCiAgICBuU2FtcGxlcyAqPSBzYW1wbGVTaXplW2ldOwogIHNhbXBsZXMgPSAoZG91YmxlICopZ21hbGxvY24oblNhbXBsZXMsIHNpemVvZihkb3VibGUpKTsKICBidWYgPSAwOwogIGJpdHMgPSAwOwogIGJpdE1hc2sgPSAoMSA8PCBzYW1wbGVCaXRzKSAtIDE7CiAgc3RyLT5yZXNldCgpOwogIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICBpZiAoc2FtcGxlQml0cyA9PSA4KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlQml0cyA9PSAxNikgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDMyKSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChiaXRzIDwgc2FtcGxlQml0cykgewoJYnVmID0gKGJ1ZiA8PCA4KSB8IChzdHItPmdldENoYXIoKSAmIDB4ZmYpOwoJYml0cyArPSA4OwogICAgICB9CiAgICAgIHMgPSAoYnVmID4+IChiaXRzIC0gc2FtcGxlQml0cykpICYgYml0TWFzazsKICAgICAgYml0cyAtPSBzYW1wbGVCaXRzOwogICAgfQogICAgc2FtcGxlc1tpXSA9IChkb3VibGUpcyAqIHNhbXBsZU11bDsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLyBzZXQgdXAgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5baV0gPSBkb21haW5baV1bMF07CiAgICBjYWNoZUluW2ldID0gaW5baV0gLSAxOwogIH0KICB0cmFuc2Zvcm0oaW4sIGNhY2hlT3V0KTsKCiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMzoKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKU2FtcGxlZEZ1bmN0aW9uOjp+U2FtcGxlZEZ1bmN0aW9uKCkgewogIGlmIChpZHhPZmZzZXQpIHsKICAgIGdmcmVlKGlkeE9mZnNldCk7CiAgfQogIGlmIChzYW1wbGVzKSB7CiAgICBnZnJlZShzYW1wbGVzKTsKICB9CiAgaWYgKHNCdWYpIHsKICAgIGdmcmVlKHNCdWYpOwogIH0KfQoKU2FtcGxlZEZ1bmN0aW9uOjpTYW1wbGVkRnVuY3Rpb24oU2FtcGxlZEZ1bmN0aW9uICpmdW5jKSB7CiAgbWVtY3B5KHRoaXMsIGZ1bmMsIHNpemVvZihTYW1wbGVkRnVuY3Rpb24pKTsKICBpZHhPZmZzZXQgPSAoaW50ICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoaW50KSk7CiAgbWVtY3B5KGlkeE9mZnNldCwgZnVuYy0+aWR4T2Zmc2V0LCAoMSA8PCBtKSAqIChpbnQpc2l6ZW9mKGludCkpOwogIHNhbXBsZXMgPSAoZG91YmxlICopZ21hbGxvY24oblNhbXBsZXMsIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2FtcGxlcywgZnVuYy0+c2FtcGxlcywgblNhbXBsZXMgKiBzaXplb2YoZG91YmxlKSk7CiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKfQoKdm9pZCBTYW1wbGVkRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBlW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzBbZnVuY01heElucHV0c107CiAgZG91YmxlIGVmcmFjMVtmdW5jTWF4SW5wdXRzXTsKICBpbnQgaSwgaiwgaywgaWR4MCwgdDsKCiAgLy8gY2hlY2sgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKGluW2ldICE9IGNhY2hlSW5baV0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChpID09IG0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb3V0W2ldID0gY2FjaGVPdXRbaV07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICAvLyBtYXAgaW5wdXQgdmFsdWVzIGludG8gc2FtcGxlIGFycmF5CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgeCA9IChpbltpXSAtIGRvbWFpbltpXVswXSkgKiBpbnB1dE11bFtpXSArIGVuY29kZVtpXVswXTsKICAgIGlmICh4IDwgMCB8fCB4ICE9IHgpIHsgIC8vIHghPXggaXMgYSBtb3JlIHBvcnRhYmxlIHZlcnNpb24gb2YgaXNuYW4oeCkKICAgICAgeCA9IDA7CiAgICB9IGVsc2UgaWYgKHggPiBzYW1wbGVTaXplW2ldIC0gMSkgewogICAgICB4ID0gc2FtcGxlU2l6ZVtpXSAtIDE7CiAgICB9CiAgICBlW2ldID0gKGludCl4OwogICAgaWYgKGVbaV0gPT0gc2FtcGxlU2l6ZVtpXSAtIDEgJiYgc2FtcGxlU2l6ZVtpXSA+IDEpIHsKICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGluW2ldID0gZG9tYWluW2ldWzFdCiAgICAgIGVbaV0gPSBzYW1wbGVTaXplW2ldIC0gMjsKICAgIH0KICAgIGVmcmFjMVtpXSA9IHggLSBlW2ldOwogICAgZWZyYWMwW2ldID0gMSAtIGVmcmFjMVtpXTsKICB9CgogIC8vIGNvbXB1dGUgaW5kZXggZm9yIHRoZSBmaXJzdCBzYW1wbGUgdG8gYmUgdXNlZAogIGlkeDAgPSAwOwogIGZvciAoayA9IG0gLSAxOyBrID49IDE7IC0taykgewogICAgaWR4MCA9IChpZHgwICsgZVtrXSkgKiBzYW1wbGVTaXplW2stMV07CiAgfQogIGlkeDAgPSAoaWR4MCArIGVbMF0pICogbjsKCiAgLy8gZm9yIGVhY2ggb3V0cHV0LCBkbyBtLWxpbmVhciBpbnRlcnBvbGF0aW9uCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoKICAgIC8vIHB1bGwgMl5tIHZhbHVlcyBvdXQgb2YgdGhlIHNhbXBsZSBhcnJheQogICAgZm9yIChqID0gMDsgaiA8ICgxPDxtKTsgKytqKSB7CiAgICAgIGludCBpZHggPSBpZHgwICsgaWR4T2Zmc2V0W2pdICsgaTsKICAgICAgaWYgKGxpa2VseShpZHggPj0gMCAmJiBpZHggPCBuU2FtcGxlcykpIHsKICAgICAgICBzQnVmW2pdID0gc2FtcGxlc1tpZHhdOwogICAgICB9IGVsc2UgewogICAgICAgIHNCdWZbal0gPSAwOyAvLyBUT0RPIEludmVzdGlnYXRlIGlmIHRoaXMgaXMgd2hhdCBBZG9iZSBkb2VzCiAgICAgIH0KICAgIH0KCiAgICAvLyBkbyBtIHNldHMgb2YgaW50ZXJwb2xhdGlvbnMKICAgIGZvciAoaiA9IDAsIHQgPSAoMTw8bSk7IGogPCBtOyArK2osIHQgPj49IDEpIHsKICAgICAgZm9yIChrID0gMDsgayA8IHQ7IGsgKz0gMikgewoJc0J1ZltrID4+IDFdID0gZWZyYWMwW2pdICogc0J1ZltrXSArIGVmcmFjMVtqXSAqIHNCdWZbaysxXTsKICAgICAgfQogICAgfQoKICAgIC8vIG1hcCBvdXRwdXQgdmFsdWUgdG8gcmFuZ2UKICAgIG91dFtpXSA9IHNCdWZbMF0gKiAoZGVjb2RlW2ldWzFdIC0gZGVjb2RlW2ldWzBdKSArIGRlY29kZVtpXVswXTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQoKICAvLyBzYXZlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9CgpHQm9vbCBTYW1wbGVkRnVuY3Rpb246Omhhc0RpZmZlcmVudFJlc3VsdFNldChGdW5jdGlvbiAqZnVuYykgewogIGlmIChmdW5jLT5nZXRUeXBlKCkgPT0gMCkgewogICAgU2FtcGxlZEZ1bmN0aW9uICpjb21wVG8gPSAoU2FtcGxlZEZ1bmN0aW9uICopIGZ1bmM7CiAgICBpZiAoY29tcFRvLT5nZXRTYW1wbGVOdW1iZXIoKSAhPSBuU2FtcGxlcykKICAgICAgcmV0dXJuIGdUcnVlOwogICAgZG91YmxlICpjb21wU2FtcGxlcyA9IGNvbXBUby0+Z2V0U2FtcGxlcygpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7CiAgICAgIGlmIChzYW1wbGVzW2ldICE9IGNvbXBTYW1wbGVzW2ldKQogICAgICAgIHJldHVybiBnVHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGdGYWxzZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRXhwb25lbnRpYWxGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBPYmplY3Qgb2JqMSwgb2JqMjsKICBpbnQgaTsKCiAgb2sgPSBnRmFsc2U7CgogIC8vLS0tLS0gaW5pdGlhbGl6ZSB0aGUgZ2VuZXJpYyBzdHVmZgogIGlmICghaW5pdChkaWN0KSkgewogICAgZ290byBlcnIxOwogIH0KICBpZiAobSAhPSAxKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBvbmVudGlhbCBmdW5jdGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgaW5wdXQiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gQzAKICBpZiAoZGljdC0+bG9va3VwKCJDMCIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAoaGFzUmFuZ2UgJiYgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgbiA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKTsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgb2JqMS5hcnJheUdldChpLCAmb2JqMik7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIEMwIGFycmF5Iik7Cglnb3RvIGVycjM7CiAgICAgIH0KICAgICAgYzBbaV0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyLmZyZWUoKTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGhhc1JhbmdlICYmIG4gIT0gMSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMwIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBuID0gMTsKICAgIGMwWzBdID0gMDsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gQzEKICBpZiAoZGljdC0+bG9va3VwKCJDMSIsICZvYmoxKS0+aXNBcnJheSgpKSB7CiAgICBpZiAob2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMSBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvYmoxLmFycmF5R2V0KGksICZvYmoyKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzEgYXJyYXkiKTsKCWdvdG8gZXJyMzsKICAgICAgfQogICAgICBjMVtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIuZnJlZSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAobiAhPSAxKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGMxWzBdID0gMTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gTiAoZXhwb25lbnQpCiAgaWYgKCFkaWN0LT5sb29rdXAoIk4iLCAmb2JqMSktPmlzTnVtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgTiIpOwogICAgZ290byBlcnIyOwogIH0KICBlID0gb2JqMS5nZXROdW0oKTsKICBvYmoxLmZyZWUoKTsKCiAgaXNMaW5lYXIgPSBmYWJzKGUtMS4pIDwgMWUtMTA7CiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMzoKICBvYmoyLmZyZWUoKTsKIGVycjI6CiAgb2JqMS5mcmVlKCk7CiBlcnIxOgogIHJldHVybjsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6fkV4cG9uZW50aWFsRnVuY3Rpb24oKSB7Cn0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oRXhwb25lbnRpYWxGdW5jdGlvbiAqZnVuYykgewogIG1lbWNweSh0aGlzLCBmdW5jLCBzaXplb2YoRXhwb25lbnRpYWxGdW5jdGlvbikpOwp9Cgp2b2lkIEV4cG9uZW50aWFsRnVuY3Rpb246OnRyYW5zZm9ybShkb3VibGUgKmluLCBkb3VibGUgKm91dCkgewogIGRvdWJsZSB4OwogIGludCBpOwoKICBpZiAoaW5bMF0gPCBkb21haW5bMF1bMF0pIHsKICAgIHggPSBkb21haW5bMF1bMF07CiAgfSBlbHNlIGlmIChpblswXSA+IGRvbWFpblswXVsxXSkgewogICAgeCA9IGRvbWFpblswXVsxXTsKICB9IGVsc2UgewogICAgeCA9IGluWzBdOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBvdXRbaV0gPSBjMFtpXSArIChpc0xpbmVhciA/IHggOiBwb3coeCwgZSkpICogKGMxW2ldIC0gYzBbaV0pOwogICAgaWYgKGhhc1JhbmdlKSB7CiAgICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewoJb3V0W2ldID0gcmFuZ2VbaV1bMF07CiAgICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzFdOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybjsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3RpdGNoaW5nRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClN0aXRjaGluZ0Z1bmN0aW9uOjpTdGl0Y2hpbmdGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QsIHN0ZDo6c2V0PGludD4gKnVzZWRQYXJlbnRzKSB7CiAgT2JqZWN0IG9iajEsIG9iajI7CiAgaW50IGk7CgogIG9rID0gZ0ZhbHNlOwogIGZ1bmNzID0gTlVMTDsKICBib3VuZHMgPSBOVUxMOwogIGVuY29kZSA9IE5VTEw7CiAgc2NhbGUgPSBOVUxMOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKG0gIT0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RpdGNoaW5nIGZ1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCIpOwogICAgZ290byBlcnIxOwogIH0KCiAgLy8tLS0tLSBGdW5jdGlvbnMKICBpZiAoIWRpY3QtPmxvb2t1cCgiRnVuY3Rpb25zIiwgJm9iajEpLT5pc0FycmF5KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3NpbmcgJ0Z1bmN0aW9ucycgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGsgPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCk7CiAgZnVuY3MgPSAoRnVuY3Rpb24gKiopZ21hbGxvY24oaywgc2l6ZW9mKEZ1bmN0aW9uICopKTsKICBib3VuZHMgPSAoZG91YmxlICopZ21hbGxvY24oayArIDEsIHNpemVvZihkb3VibGUpKTsKICBlbmNvZGUgPSAoZG91YmxlICopZ21hbGxvY24oMiAqIGssIHNpemVvZihkb3VibGUpKTsKICBzY2FsZSA9IChkb3VibGUgKilnbWFsbG9jbihrLCBzaXplb2YoZG91YmxlKSk7CiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgZnVuY3NbaV0gPSBOVUxMOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBzdGQ6OnNldDxpbnQ+IHVzZWRQYXJlbnRzQXV4ID0gKnVzZWRQYXJlbnRzOwogICAgb2JqMS5hcnJheUdldE5GKGksICZvYmoyKTsKICAgIGlmIChvYmoyLmlzUmVmKCkpIHsKICAgICAgY29uc3QgUmVmIHJlZiA9IG9iajIuZ2V0UmVmKCk7CiAgICAgIGlmICh1c2VkUGFyZW50c0F1eC5maW5kKHJlZi5udW0pID09IHVzZWRQYXJlbnRzQXV4LmVuZCgpKSB7CiAgICAgICAgdXNlZFBhcmVudHNBdXguaW5zZXJ0KHJlZi5udW0pOwogICAgICAgIG9iajIuZnJlZSgpOwogICAgICAgIG9iajEuYXJyYXlHZXQoaSwgJm9iajIpOwogICAgICB9IGVsc2UgewogICAgICAgIGdvdG8gZXJyMjsKICAgICAgfQogICAgfQogICAgaWYgKCEoZnVuY3NbaV0gPSBGdW5jdGlvbjo6cGFyc2UoJm9iajIsICZ1c2VkUGFyZW50c0F1eCkpKSB7CiAgICAgIGdvdG8gZXJyMjsKICAgIH0KICAgIGlmIChmdW5jc1tpXS0+Z2V0SW5wdXRTaXplKCkgIT0gMSB8fAoJKGkgPiAwICYmIGZ1bmNzW2ldLT5nZXRPdXRwdXRTaXplKCkgIT0gZnVuY3NbMF0tPmdldE91dHB1dFNpemUoKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICJJbmNvbXBhdGlibGUgc3ViZnVuY3Rpb25zIGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBvYmoyLmZyZWUoKTsKICB9CiAgb2JqMS5mcmVlKCk7CgogIC8vLS0tLS0gQm91bmRzCiAgaWYgKCFkaWN0LT5sb29rdXAoIkJvdW5kcyIsICZvYmoxKS0+aXNBcnJheSgpIHx8CiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSBrIC0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyBvciBpbnZhbGlkICdCb3VuZHMnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgZ290byBlcnIxOwogIH0KICBib3VuZHNbMF0gPSBkb21haW5bMF1bMF07CiAgZm9yIChpID0gMTsgaSA8IGs7ICsraSkgewogICAgaWYgKCFvYmoxLmFycmF5R2V0KGkgLSAxLCAmb2JqMiktPmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW52YWxpZCB0eXBlIGluICdCb3VuZHMnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICBnb3RvIGVycjI7CiAgICB9CiAgICBib3VuZHNbaV0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMi5mcmVlKCk7CiAgfQogIGJvdW5kc1trXSA9IGRvbWFpblswXVsxXTsKICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBFbmNvZGUKICBpZiAoIWRpY3QtPmxvb2t1cCgiRW5jb2RlIiwgJm9iajEpLT5pc0FycmF5KCkgfHwKICAgICAgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IDIgKiBrKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nIG9yIGludmFsaWQgJ0VuY29kZScgZW50cnkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICBnb3RvIGVycjE7CiAgfQogIGZvciAoaSA9IDA7IGkgPCAyICogazsgKytpKSB7CiAgICBpZiAoIW9iajEuYXJyYXlHZXQoaSwgJm9iajIpLT5pc051bSgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkludmFsaWQgdHlwZSBpbiAnRW5jb2RlJyBhcnJheSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgICAgZ290byBlcnIyOwogICAgfQogICAgZW5jb2RlW2ldID0gb2JqMi5nZXROdW0oKTsKICAgIG9iajIuZnJlZSgpOwogIH0KICBvYmoxLmZyZWUoKTsKCiAgLy8tLS0tLSBwcmUtY29tcHV0ZSB0aGUgc2NhbGUgZmFjdG9ycwogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGlmIChib3VuZHNbaV0gPT0gYm91bmRzW2krMV0pIHsKICAgICAgLy8gYXZvaWQgYSBkaXZpZGUtYnktemVybyAtLSBpbiB0aGlzIHNpdHVhdGlvbiwgZnVuY3Rpb24gaSB3aWxsCiAgICAgIC8vIG5ldmVyIGJlIHVzZWQgYW55d2F5CiAgICAgIHNjYWxlW2ldID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIHNjYWxlW2ldID0gKGVuY29kZVsyKmkrMV0gLSBlbmNvZGVbMippXSkgLyAoYm91bmRzW2krMV0gLSBib3VuZHNbaV0pOwogICAgfQogIH0KCiAgbiA9IGZ1bmNzWzBdLT5nZXRPdXRwdXRTaXplKCk7CiAgb2sgPSBnVHJ1ZTsKICByZXR1cm47CgogZXJyMjoKICBvYmoyLmZyZWUoKTsKIGVycjE6CiAgb2JqMS5mcmVlKCk7Cn0KClN0aXRjaGluZ0Z1bmN0aW9uOjpTdGl0Y2hpbmdGdW5jdGlvbihTdGl0Y2hpbmdGdW5jdGlvbiAqZnVuYykgewogIGludCBpOwoKICBtZW1jcHkodGhpcywgZnVuYywgc2l6ZW9mKFN0aXRjaGluZ0Z1bmN0aW9uKSk7CiAgZnVuY3MgPSAoRnVuY3Rpb24gKiopZ21hbGxvY24oaywgc2l6ZW9mKEZ1bmN0aW9uICopKTsKICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICBmdW5jc1tpXSA9IGZ1bmMtPmZ1bmNzW2ldLT5jb3B5KCk7CiAgfQogIGJvdW5kcyA9IChkb3VibGUgKilnbWFsbG9jbihrICsgMSwgc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShib3VuZHMsIGZ1bmMtPmJvdW5kcywgKGsgKyAxKSAqIHNpemVvZihkb3VibGUpKTsKICBlbmNvZGUgPSAoZG91YmxlICopZ21hbGxvY24oMiAqIGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoZW5jb2RlLCBmdW5jLT5lbmNvZGUsIDIgKiBrICogc2l6ZW9mKGRvdWJsZSkpOwogIHNjYWxlID0gKGRvdWJsZSAqKWdtYWxsb2NuKGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoc2NhbGUsIGZ1bmMtPnNjYWxlLCBrICogc2l6ZW9mKGRvdWJsZSkpOwogIG9rID0gZ1RydWU7Cn0KClN0aXRjaGluZ0Z1bmN0aW9uOjp+U3RpdGNoaW5nRnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIGlmIChmdW5jcykgewogICAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgICBpZiAoZnVuY3NbaV0pIHsKCWRlbGV0ZSBmdW5jc1tpXTsKICAgICAgfQogICAgfQogIH0KICBnZnJlZShmdW5jcyk7CiAgZ2ZyZWUoYm91bmRzKTsKICBnZnJlZShlbmNvZGUpOwogIGdmcmVlKHNjYWxlKTsKfQoKdm9pZCBTdGl0Y2hpbmdGdW5jdGlvbjo6dHJhbnNmb3JtKGRvdWJsZSAqaW4sIGRvdWJsZSAqb3V0KSB7CiAgZG91YmxlIHg7CiAgaW50IGk7CgogIGlmIChpblswXSA8IGRvbWFpblswXVswXSkgewogICAgeCA9IGRvbWFpblswXVswXTsKICB9IGVsc2UgaWYgKGluWzBdID4gZG9tYWluWzBdWzFdKSB7CiAgICB4ID0gZG9tYWluWzBdWzFdOwogIH0gZWxzZSB7CiAgICB4ID0gaW5bMF07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBrIC0gMTsgKytpKSB7CiAgICBpZiAoeCA8IGJvdW5kc1tpKzFdKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICB4ID0gZW5jb2RlWzIqaV0gKyAoeCAtIGJvdW5kc1tpXSkgKiBzY2FsZVtpXTsKICBmdW5jc1tpXS0+dHJhbnNmb3JtKCZ4LCBvdXQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQb3N0U2NyaXB0RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmVudW0gUFNPcCB7CiAgcHNPcEFicywKICBwc09wQWRkLAogIHBzT3BBbmQsCiAgcHNPcEF0YW4sCiAgcHNPcEJpdHNoaWZ0LAogIHBzT3BDZWlsaW5nLAogIHBzT3BDb3B5LAogIHBzT3BDb3MsCiAgcHNPcEN2aSwKICBwc09wQ3ZyLAogIHBzT3BEaXYsCiAgcHNPcER1cCwKICBwc09wRXEsCiAgcHNPcEV4Y2gsCiAgcHNPcEV4cCwKICBwc09wRmFsc2UsCiAgcHNPcEZsb29yLAogIHBzT3BHZSwKICBwc09wR3QsCiAgcHNPcElkaXYsCiAgcHNPcEluZGV4LAogIHBzT3BMZSwKICBwc09wTG4sCiAgcHNPcExvZywKICBwc09wTHQsCiAgcHNPcE1vZCwKICBwc09wTXVsLAogIHBzT3BOZSwKICBwc09wTmVnLAogIHBzT3BOb3QsCiAgcHNPcE9yLAogIHBzT3BQb3AsCiAgcHNPcFJvbGwsCiAgcHNPcFJvdW5kLAogIHBzT3BTaW4sCiAgcHNPcFNxcnQsCiAgcHNPcFN1YiwKICBwc09wVHJ1ZSwKICBwc09wVHJ1bmNhdGUsCiAgcHNPcFhvciwKICBwc09wSWYsCiAgcHNPcElmZWxzZSwKICBwc09wUmV0dXJuCn07CgovLyBOb3RlOiAnaWYnIGFuZCAnaWZlbHNlJyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkuCi8vIFRoZSByZXN0IGFyZSBsaXN0ZWQgaGVyZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi8vIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVudHJ5IGluIFBTT3AuCnN0YXRpYyBjb25zdCBjaGFyICpwc09wTmFtZXNbXSA9IHsKICAiYWJzIiwKICAiYWRkIiwKICAiYW5kIiwKICAiYXRhbiIsCiAgImJpdHNoaWZ0IiwKICAiY2VpbGluZyIsCiAgImNvcHkiLAogICJjb3MiLAogICJjdmkiLAogICJjdnIiLAogICJkaXYiLAogICJkdXAiLAogICJlcSIsCiAgImV4Y2giLAogICJleHAiLAogICJmYWxzZSIsCiAgImZsb29yIiwKICAiZ2UiLAogICJndCIsCiAgImlkaXYiLAogICJpbmRleCIsCiAgImxlIiwKICAibG4iLAogICJsb2ciLAogICJsdCIsCiAgIm1vZCIsCiAgIm11bCIsCiAgIm5lIiwKICAibmVnIiwKICAibm90IiwKICAib3IiLAogICJwb3AiLAogICJyb2xsIiwKICAicm91bmQiLAogICJzaW4iLAogICJzcXJ0IiwKICAic3ViIiwKICAidHJ1ZSIsCiAgInRydW5jYXRlIiwKICAieG9yIgp9OwoKI2RlZmluZSBuUFNPcHMgKHNpemVvZihwc09wTmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpCgplbnVtIFBTT2JqZWN0VHlwZSB7CiAgcHNCb29sLAogIHBzSW50LAogIHBzUmVhbCwKICBwc09wZXJhdG9yLAogIHBzQmxvY2sKfTsKCi8vIEluIHRoZSBjb2RlIGFycmF5LCAnaWYnLydpZmVsc2UnIG9wZXJhdG9ycyB0YWtlIHVwIHRocmVlIHNsb3RzCi8vIHBsdXMgc3BhY2UgZm9yIHRoZSBjb2RlIGluIHRoZSBzdWJjbGF1c2UocykuCi8vCi8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BJZiAvIHBzT3BJZmVsc2UgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc0Jsb2NrOiBwdHI9PEE+ICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNCbG9jazogcHRyPTxCPiAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IGlmIGNsYXVzZSAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCBwc09wZXJhdG9yOiBwc09wUmV0dXJuICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgPEE+IHwgZWxzZSBjbGF1c2UgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BSZXR1cm4gICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICA8Qj4gfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8KLy8gRm9yICdpZicsIHBvaW50ZXIgPEE+IGlzIHByZXNlbnQgaW4gdGhlIGNvZGUgc3RyZWFtIGJ1dCB1bnVzZWQuCgpzdHJ1Y3QgUFNPYmplY3QgewogIFBTT2JqZWN0VHlwZSB0eXBlOwogIHVuaW9uIHsKICAgIEdCb29sIGJvb2xuOwkJLy8gYm9vbGVhbiAoc3RhY2sgb25seSkKICAgIGludCBpbnRnOwkJCS8vIGludGVnZXIgKHN0YWNrIGFuZCBjb2RlKQogICAgZG91YmxlIHJlYWw7CQkvLyByZWFsIChzdGFjayBhbmQgY29kZSkKICAgIFBTT3Agb3A7CQkJLy8gb3BlcmF0b3IgKGNvZGUgb25seSkKICAgIGludCBibGs7CQkJLy8gaWYvaWZlbHNlIGJsb2NrIHBvaW50ZXIgKGNvZGUgb25seSkKICB9Owp9OwoKI2RlZmluZSBwc1N0YWNrU2l6ZSAxMDAKCmNsYXNzIFBTU3RhY2sgewpwdWJsaWM6CgogIFBTU3RhY2soKSB7c3AgPSBwc1N0YWNrU2l6ZTsgfQogIHZvaWQgY2xlYXIoKSB7IHNwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIHB1c2hCb29sKEdCb29sIGJvb2xuKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzQm9vbDsKICAgICAgc3RhY2tbc3BdLmJvb2xuID0gYm9vbG47CiAgICB9CiAgfQogIHZvaWQgcHVzaEludChpbnQgaW50ZykKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0ludDsKICAgICAgc3RhY2tbc3BdLmludGcgPSBpbnRnOwogICAgfQogIH0KICB2b2lkIHB1c2hSZWFsKGRvdWJsZSByZWFsKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzUmVhbDsKICAgICAgc3RhY2tbc3BdLnJlYWwgPSByZWFsOwogICAgfQogIH0KICBHQm9vbCBwb3BCb29sKCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNCb29sLCBwc0Jvb2wpKSB7CiAgICAgIHJldHVybiBzdGFja1tzcCsrXS5ib29sbjsKICAgIH0KICAgIHJldHVybiBnRmFsc2U7CiAgfQogIGludCBwb3BJbnQoKQogIHsKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNJbnQpKSB7CiAgICAgIHJldHVybiBzdGFja1tzcCsrXS5pbnRnOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGRvdWJsZSBwb3BOdW0oKQogIHsKICAgIGRvdWJsZSByZXQ7CgogICAgaWYgKGNoZWNrVW5kZXJmbG93KCkgJiYgY2hlY2tUeXBlKHBzSW50LCBwc1JlYWwpKSB7CiAgICAgIHJldCA9IChzdGFja1tzcF0udHlwZSA9PSBwc0ludCkgPyAoZG91YmxlKXN0YWNrW3NwXS5pbnRnIDogc3RhY2tbc3BdLnJlYWw7CiAgICAgICsrc3A7CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgR0Jvb2wgZW1wdHkoKSB7IHJldHVybiBzcCA9PSBwc1N0YWNrU2l6ZTsgfQogIEdCb29sIHRvcElzSW50KCkgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAmJiBzdGFja1tzcF0udHlwZSA9PSBwc0ludDsgfQogIEdCb29sIHRvcFR3b0FyZUludHMoKQogICAgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAtIDEgJiYKCSAgICAgc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQgJiYKICAgICAgICAgICAgIHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNJbnQ7IH0KICBHQm9vbCB0b3BJc1JlYWwoKSB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplICYmIHN0YWNrW3NwXS50eXBlID09IHBzUmVhbDsgfQogIEdCb29sIHRvcFR3b0FyZU51bXMoKQogICAgeyByZXR1cm4gc3AgPCBwc1N0YWNrU2l6ZSAtIDEgJiYKCSAgICAgKHN0YWNrW3NwXS50eXBlID09IHBzSW50IHx8IHN0YWNrW3NwXS50eXBlID09IHBzUmVhbCkgJiYKCSAgICAgKHN0YWNrW3NwKzFdLnR5cGUgPT0gcHNJbnQgfHwgc3RhY2tbc3ArMV0udHlwZSA9PSBwc1JlYWwpOyB9CiAgdm9pZCBjb3B5KGludCBuKTsKICB2b2lkIHJvbGwoaW50IG4sIGludCBqKTsKICB2b2lkIGluZGV4KGludCBpKQogIHsKICAgIGlmICghY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC0tc3A7CiAgICBpZiAoc3AgKyBpICsgMSA+PSBwc1N0YWNrU2l6ZSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGFja1tzcF0gPSBzdGFja1tzcCArIDEgKyBpXTsKICB9CiAgdm9pZCBwb3AoKQogIHsKICAgIGlmICghY2hlY2tVbmRlcmZsb3coKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICArK3NwOwogIH0KCnByaXZhdGU6CgogIEdCb29sIGNoZWNrT3ZlcmZsb3coaW50IG4gPSAxKQogIHsKICAgIGlmIChzcCAtIG4gPCAwKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIG92ZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGdGYWxzZTsKICAgIH0KICAgIHJldHVybiBnVHJ1ZTsKICB9CiAgR0Jvb2wgY2hlY2tVbmRlcmZsb3coKQogIHsKICAgIGlmIChzcCA9PSBwc1N0YWNrU2l6ZSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBHQm9vbCBjaGVja1R5cGUoUFNPYmplY3RUeXBlIHQxLCBQU09iamVjdFR5cGUgdDIpCiAgewogICAgaWYgKHN0YWNrW3NwXS50eXBlICE9IHQxICYmIHN0YWNrW3NwXS50eXBlICE9IHQyKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgbWlzbWF0Y2ggaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcmV0dXJuIGdUcnVlOwogIH0KICBQU09iamVjdCBzdGFja1twc1N0YWNrU2l6ZV07CiAgaW50IHNwOwp9OwoKCnZvaWQgUFNTdGFjazo6Y29weShpbnQgbikgewogIGludCBpOwoKICBpZiAoc3AgKyBuID4gcHNTdGFja1NpemUpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIHVuZGVyZmxvdyBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgICByZXR1cm47CiAgfQogIGlmICghY2hlY2tPdmVyZmxvdyhuKSkgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGkgPSBzcCArIG4gLSAxOyBpID49IHNwOyAtLWkpIHsKICAgIHN0YWNrW2kgLSBuXSA9IHN0YWNrW2ldOwogIH0KICBzcCAtPSBuOwp9Cgp2b2lkIFBTU3RhY2s6OnJvbGwoaW50IG4sIGludCBqKSB7CiAgUFNPYmplY3Qgb2JqOwogIGludCBpLCBrOwoKICBpZiAodW5saWtlbHkobiA9PSAwKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoaiA+PSAwKSB7CiAgICBqICU9IG47CiAgfSBlbHNlIHsKICAgIGogPSAtaiAlIG47CiAgICBpZiAoaiAhPSAwKSB7CiAgICAgIGogPSBuIC0gajsKICAgIH0KICB9CiAgaWYgKG4gPD0gMCB8fCBqID09IDAgfHwgbiA+IHBzU3RhY2tTaXplIHx8IHNwICsgbiA+IHBzU3RhY2tTaXplKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChqIDw9IG4gLyAyKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgKytpKSB7CiAgICAgIG9iaiA9IHN0YWNrW3NwXTsKICAgICAgZm9yIChrID0gc3A7IGsgPCBzcCArIG4gLSAxOyArK2spIHsKICAgICAgICBzdGFja1trXSA9IHN0YWNrW2srMV07CiAgICAgIH0KICAgICAgc3RhY2tbc3AgKyBuIC0gMV0gPSBvYmo7CiAgICB9CiAgfSBlbHNlIHsKICAgIGogPSBuIC0gajsKICAgIGZvciAoaSA9IDA7IGkgPCBqOyArK2kpIHsKICAgICAgb2JqID0gc3RhY2tbc3AgKyBuIC0gMV07CiAgICAgIGZvciAoayA9IHNwICsgbiAtIDE7IGsgPiBzcDsgLS1rKSB7CiAgICAgICAgc3RhY2tba10gPSBzdGFja1trLTFdOwogICAgICB9CiAgICAgIHN0YWNrW3NwXSA9IG9iajsKICAgIH0KICB9Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKE9iamVjdCAqZnVuY09iaiwgRGljdCAqZGljdCkgewogIFN0cmVhbSAqc3RyOwogIGludCBjb2RlUHRyOwogIEdvb1N0cmluZyAqdG9rOwogIGRvdWJsZSBpbltmdW5jTWF4SW5wdXRzXTsKICBpbnQgaTsKCiAgY29kZSA9IE5VTEw7CiAgY29kZVN0cmluZyA9IE5VTEw7CiAgY29kZVNpemUgPSAwOwogIG9rID0gZ0ZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgNCBmdW5jdGlvbiBpc24ndCBhIHN0cmVhbSIpOwogICAgZ290byBlcnIxOwogIH0KICBzdHIgPSBmdW5jT2JqLT5nZXRTdHJlYW0oKTsKCiAgLy8tLS0tLSBwYXJzZSB0aGUgZnVuY3Rpb24KICBjb2RlU3RyaW5nID0gbmV3IEdvb1N0cmluZygpOwogIHN0ci0+cmVzZXQoKTsKICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSB8fCB0b2stPmNtcCgieyIpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCAneycgYXQgc3RhcnQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgaWYgKHRvaykgewogICAgICBkZWxldGUgdG9rOwogICAgfQogICAgZ290byBlcnIxOwogIH0KICBkZWxldGUgdG9rOwogIGNvZGVQdHIgPSAwOwogIGlmICghcGFyc2VDb2RlKHN0ciwgJmNvZGVQdHIpKSB7CiAgICBnb3RvIGVycjI7CiAgfQogIHN0ci0+Y2xvc2UoKTsKCiAgLy8tLS0tLSBzZXQgdXAgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5baV0gPSBkb21haW5baV1bMF07CiAgICBjYWNoZUluW2ldID0gaW5baV0gLSAxOwogIH0KICB0cmFuc2Zvcm0oaW4sIGNhY2hlT3V0KTsKCiAgb2sgPSBnVHJ1ZTsKICAKIGVycjI6CiAgc3RyLT5jbG9zZSgpOwogZXJyMToKICByZXR1cm47Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKFBvc3RTY3JpcHRGdW5jdGlvbiAqZnVuYykgewogIG1lbWNweSh0aGlzLCBmdW5jLCBzaXplb2YoUG9zdFNjcmlwdEZ1bmN0aW9uKSk7CiAgY29kZSA9IChQU09iamVjdCAqKWdtYWxsb2NuKGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICBtZW1jcHkoY29kZSwgZnVuYy0+Y29kZSwgY29kZVNpemUgKiBzaXplb2YoUFNPYmplY3QpKTsKICBjb2RlU3RyaW5nID0gZnVuYy0+Y29kZVN0cmluZy0+Y29weSgpOwp9CgpQb3N0U2NyaXB0RnVuY3Rpb246On5Qb3N0U2NyaXB0RnVuY3Rpb24oKSB7CiAgZ2ZyZWUoY29kZSk7CiAgZGVsZXRlIGNvZGVTdHJpbmc7Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjp0cmFuc2Zvcm0oZG91YmxlICppbiwgZG91YmxlICpvdXQpIHsKICBQU1N0YWNrIHN0YWNrOwogIGludCBpOwoKICAvLyBjaGVjayB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBpZiAoaW5baV0gIT0gY2FjaGVJbltpXSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGkgPT0gbSkgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBvdXRbaV0gPSBjYWNoZU91dFtpXTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIC8vfiBtYXkgbmVlZCB0byBjaGVjayBmb3IgaW50ZWdlcnMgaGVyZQogICAgc3RhY2sucHVzaFJlYWwoaW5baV0pOwogIH0KICBleGVjKCZzdGFjaywgMCk7CiAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICBvdXRbaV0gPSBzdGFjay5wb3BOdW0oKTsKICAgIGlmIChvdXRbaV0gPCByYW5nZVtpXVswXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVswXTsKICAgIH0gZWxzZSBpZiAob3V0W2ldID4gcmFuZ2VbaV1bMV0pIHsKICAgICAgb3V0W2ldID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQogIHN0YWNrLmNsZWFyKCk7CgogIC8vIGlmICghc3RhY2stPmVtcHR5KCkpIHsKICAvLyAgIGVycm9yKGVyclN5bnRheFdhcm5pbmcsIC0xLAogIC8vICAgICAgICAgIkV4dHJhIHZhbHVlcyBvbiBzdGFjayBhdCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogIC8vIH0KCiAgLy8gc2F2ZSBjdXJyZW50IHJlc3VsdCBpbiB0aGUgY2FjaGUKICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBjYWNoZUluW2ldID0gaW5baV07CiAgfQogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKR0Jvb2wgUG9zdFNjcmlwdEZ1bmN0aW9uOjpwYXJzZUNvZGUoU3RyZWFtICpzdHIsIGludCAqY29kZVB0cikgewogIEdvb1N0cmluZyAqdG9rOwogIGNoYXIgKnA7CiAgR0Jvb2wgaXNSZWFsOwogIGludCBvcFB0ciwgZWxzZVB0cjsKICBpbnQgYSwgYiwgbWlkLCBjbXA7CgogIHdoaWxlICgxKSB7CiAgICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJVbmV4cGVjdGVkIGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0cmVhbSIpOwogICAgICByZXR1cm4gZ0ZhbHNlOwogICAgfQogICAgcCA9IHRvay0+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