ZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wuYyBiL29iai90b29scy9NR3Rvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdmMzRmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC5jCkBAIC0wLDAgKzEsMTgyMyBAQAorLyoKKyAqICBNR3Rvb2wtMS4zCisgKiAgRmlsZTogTUd0b29sLmMKKyAqICBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHRoZSBvcmlnaW5hbCBYdG9vbCBpcyBjb3B5cmlnaHRlZCBieSBIeXAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKworaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpZiAhZGVmaW5lZChRVUVSWUNBQ0hFRCkKKyNkZWZpbmUgUVVFUllDQUNIRUQgNDA5NgorI2VuZGlmCisjaWYgIWRlZmluZWQgKFNFVENBQ0hFRCkKKyNkZWZpbmUgU0VUQ0FDSEVEIDQwOTYKKyNlbmRpZgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKyNpbmNsdWRlIDx1c2VyaW5mby5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworI2luY2x1ZGUgIk1HdG9vbC90b29sLmgiCisKKyNpbmNsdWRlICJNR3Rvb2wvdG9vbGxpYi5oIgorCisjZGVmaW5lIFhEQkcgMQorCitub3NhdmUgb2JqZWN0ICBjbG9uZXI7Citub3NhdmUgb2JqZWN0ICBtc2d0bz1OVUxMOworbm9zYXZlIHN0cmluZyAqbWFucGF0aD0oe1RPT0xfUEFUSCsiL21hbi5kLyIsCisJCQkgIi9kb2MvZWZ1bi8iLAorCQkJICIvZG9jL2xmdW4vIiwKKwkJCSAiL2RvYy93LyIsCisJCQkgIi9kb2MvaGVscGRpci8iLAorCQkJICIvZG9jL0xQQy8iLAorCQkJICIvZG9jL3N0ZC8iLAorCQkJICIvZG9jL2NvbmNlcHRzLyIsCisJCQkgIiJ9KTsKK25vc2F2ZSBzdHJpbmcgIG1vcmVmaWxlPU5VTEw7Citub3NhdmUgc3RyaW5nICpzY3JpcHRsaW5lPU5VTEw7Citub3NhdmUgc3RyaW5nICpoaXN0b3J5PWFsbG9jYXRlKE1BWF9ISVNUT1JZKTsKK25vc2F2ZSBpbnQgICAgIG1vcmVmbGFnPUZBTFNFOworbm9zYXZlIGludCAgICAgbW9yZW9mZnNldD0xOworbm9zYXZlIGludCAgICAgdGVybT1OVUxMOworbm9zYXZlIGludCAgICAgc2NyaXB0c2l6ZT1OVUxMOworbm9zYXZlIGludCAgICAgbm9zdG9yZT1GQUxTRTsKK25vc2F2ZSBpbnQgICAgIHhsaWdodD0wOworbm9zYXZlIGludCAgICAgcGlwZV9pbj1GQUxTRTsKK25vc2F2ZSBpbnQgICAgIHBpcGVfb3V0PUZBTFNFOworbm9zYXZlIGludCAgICAgcGlwZV9vdnI9VFJVRTsKK25vc2F2ZSBzdHJpbmcgIHBpcGVfaWY9TlVMTDsKK25vc2F2ZSBzdHJpbmcgIHBpcGVfb2Y9TlVMTDsKK25vc2F2ZSBpbnQgICAgIHh0az1GQUxTRTsKK25vc2F2ZSBtYXBwaW5nIHZhcmlhYmxlPShbXSk7Citub3NhdmUgc3RyaW5nICpjbWRzOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaW5lX2J1ZmZlcj0oW10pOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIGxpbmVfYnVmZmVyX25hbWU9IiI7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgbW9yZV9zZWFyY2hleHByPSIiOworaW50ICAgIG1vcmVsaW5lcz1NT1JFX0xJTkVTOworaW50ICAgIG1vZGk9KE1PREVfRklSU1R8TU9ERV9QUk9URUNUfE1PREVfU0hPUlQpOworCisjaW5jbHVkZSAiTUd0b29sL3Rvb2xsaWIuYyIKKyNpbmNsdWRlICJNR3Rvb2wvdG9vbGNtZC5jIgorCisjZGVmaW5lIFNhZmVSZXR1cm4oeCkgXAoreyBcCisgIGNtZHM9KHt9KTsgXAorICBwaXBlX2luPUZBTFNFOyBcCisgIHBpcGVfb2Y9TlVMTDsgXAorICBwaXBlX292cj1UUlVFOyBcCisgIHBpcGVfb3V0PUZBTFNFOyBcCisgIHBpcGVfb2Y9TlVMTDsgXAorICByZXR1cm4gKHgpOyBcCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY2hlY2sgc29tZSBzZWN1cml0eSBhc3BlY3RzCisgKi8KKworc3RhdGljIGludCBzZWN1cml0eSgpCit7CisgIG9iamVjdCBwcmV2OworIAorICBpZiggcHJvY2Vzc19jYWxsKCkgfHwgZ2V0dWlkKCkhPWdldHVpZChjbG9uZXIpICkgcmV0dXJuIEZBTFNFOyAvLyBSdW1hdGEKKworICBUSygiVUlEOiAiK2dldHVpZChNRSkrIiBjbG9uZXI6IitnZXR1aWQoY2xvbmVyKSk7CisvLyAgVEsoInByZXY6ICIrb2JqZWN0X25hbWUoUFJFVikrIiBtZToiK29iamVjdF9uYW1lKE1FKSk7CisgIGlmKHByZXY9UFJFVikKKyAgeworICAgIGlmKCFjbG9uZXIpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZihnZXR1aWQocHJldik9PVJPT1RJRHx8SVNfQVJDSChwcmV2KSkKKyAgICAgIHJldHVybiBUUlVFOworICAgIGlmKHByZXY9PU1FKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHNlY3VyZV9sZXZlbCgpPj1xdWVyeV93aXpfbGV2ZWwoY2xvbmVyKTsgLy8gUnVtYXRhCisgICAgLy9yZXR1cm4gZ2V0dWlkKHByZXYpPT1nZXR1aWQoKSYmZ2V0ZXVpZChwcmV2KT09Z2V0ZXVpZCgpJiZjbG9uZXI9PVJUUDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIGNsb25lcj09TlVMTDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvd24gd3JpdGUgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgaW50IFdyaXRlKHN0cmluZyBzdHIpCit7CisgIGlmKCFzdHJpbmdwKHN0cikgfHwgc3RyPT0iIikKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmKCFjbG9uZXIgJiYgb2JqZWN0cCh0aGlzX3BsYXllcigpKSkKKyAgICB3cml0ZShzdHIpOworICBlbHNlCisgICAgdGVsbF9vYmplY3QoY2xvbmVyLCBzdHIpOworICByZXR1cm4gVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvd24gY29tbWFuZCBmdW5jdGlvbgorICovCisKK3N0YXRpYyBpbnQgQ29tbWFuZChzdHJpbmcgc3RyKQoreworICBpbnQgaTsKKyAgVEsoIkNvbW1hbmQ6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBub3N0b3JlKys7CisgIGlmKE1PREUoTU9ERV9FQ0hPKSkKKyAgICBXTE4oIkRvaW5nOiAiK3N0cik7CisgIGk9KGludCljbG9uZXItPmNvbW1hbmRfbWUoc3RyKTsKKyAgbm9zdG9yZS0tOworICByZXR1cm4gaTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvYmplY3Qgc2VhcmNoaW5nCisgKi8KKworc3RhdGljIHZhcmFyZ3Mgb2JqZWN0IFhGaW5kT2JqKHN0cmluZyBzdHIsIGludCBzaWxlbnQpCit7CisgIG9iamVjdCBvYmosIGVudjsKKyAgc3RyaW5nICpzdHJzOworICBpbnQgaSwgcywgY250OworICAKKyAgaWYoIXN0cikKKyAgICByZXR1cm4gTlVMTDsKKyAgVEsoIlhGaW5kT2JqOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgZW52PUVOVihjbG9uZXIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXFwuIiwisDAxIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXF4iLCAisDAyIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXCQiLCAisDAzIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXFxcIiwgIlxcIik7CisgIGlmIChmaW5kX29iamVjdChzdHIpKSByZXR1cm4gZmluZF9vYmplY3Qoc3RyKTsKKyAgaWYgKGZpbGVfc2l6ZShzdHIpPjEpIHsKKyAgICAgY2FsbF9vdGhlcihzdHIsICI/Pz8iKTsKKyAgICAgcmV0dXJuIGZpbmRfb2JqZWN0KHN0cik7CisgIH0KKyAgcz1zaXplb2Yoc3Rycz1zdHJpcF9leHBsb2RlKHN0ciwgIi4iKSk7CisgIHdoaWxlKHMtLSkKKyAgeworICAgIGlmKHN0cnNbaV09PSJtInx8c3Ryc1tpXT09Im1lIikKKyAgICAgIHN0cnNbaV09Uk5BTUUoY2xvbmVyKTsKKyAgICBlbHNlIGlmKHN0cnNbaV09PSJoInx8c3Ryc1tpXT09ImhlcmUiKQorICAgICAgc3Ryc1tpXT1vYmplY3RfbmFtZShFTlYoY2xvbmVyKSk7CisgICAgaWYob2JqPUZpbmRPYmooc3Ryc1tpKytdLGVudiwoc2lsZW50PzE6MCkpKQorICAgICAgZW52PW9iajsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gb2JqOworfQorCitzdGF0aWMgdmFyYXJncyBvYmplY3QgRmluZE9iaihzdHJpbmcgc3RyLCBvYmplY3QgZW52LCBpbnQgc2lsZW50KQoreworICBvYmplY3Qgb2JqLCAqaW52OworICBzdHJpbmcgdG1wOworICBpbnQgbnVtLCBlOworICAKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8ICFvYmplY3RwKGVudikpCisgICAgcmV0dXJuIE5VTEw7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICKwMDEiLCAiLiIpOworICB3aGlsZShzdHJbZSsrXT09J14nKQorICAgIDsKKyAgc3RyPXN0clstLWUuLjwxXTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIrAwMiIsICJeIik7CisgIGlmKG9iaj1WYXJUb09iaihzdHIpKQorICAgIDsKKyAgZWxzZSBpZihzdHJbMF09PScDJykKKyAgICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAisDAzIiwgIiQiKTsKKyAgZWxzZSBpZihzc2NhbmYoc3RyLCAiJWQiLCBudW0pJiYoaW52PWFsbF9pbnZlbnRvcnkoZW52KSkpCisgIHsKKyAgICBpZihudW0+MCYmbnVtPD1zaXplb2YoaW52KSkKKyAgICAgIG9iaj1pbnZbbnVtLTFdOworICAgIGVsc2UKKyAgICB7CisgICAgICBXRExOKCJTcGVjaWZpZWQgb2JqZWN0IG51bWJlciBvdXQgb2YgcmFuZ2UgWzEtIitzaXplb2YoaW52KSsiXSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIGlmKG9ianx8KG9iaj1wcmVzZW50KHN0ciwgZW52KSl8fAorICAgICAob2JqPWZpbmRfcGxheWVyKExPV0VSKHN0cikpKXx8CisgICAgIChvYmo9ZmluZF9saXZpbmcoc3RyKSl8fAorICAgICAob2JqPWZpbmRfb2JqZWN0KGxvbmdfcGF0aChzdHIpKSkpCisgIHsKKyAgICB3aGlsZShlLS0pCisgICAgeworICAgICAgaWYoIShvYmo9RU5WKG9iaikpKQorICAgICAgeworCVcoIlNwZWNpZmllZCBvYmplY3QgaGFzIG5vIGVudmlyb25tZW50IFsiKTsKKwl3aGlsZShlLS0pCisJICBXKCJeIik7CisJV0RMTihzdHIrIl0iKTsKKwlyZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGlmKCFzaWxlbnQpCisgICAgICBXRExOKCJTcGVjaWZpZWQgb2JqZWN0IGRvZXMgbm90IGV4aXN0IFsiK3N0cisiXSIpOworICByZXR1cm4gb2JqOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9iamVjdCB2YXJpYWJsZSBoYW5kbGluZworICovCisKK3N0YXRpYyBvYmplY3QgVmFyVG9PYmooc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8IHN0clswXSE9JyQnKQorICAgIHJldHVybiBOVUxMOworICBzd2l0Y2goc3RyKQorICB7CisgICAgY2FzZSAiJG0iOgorICAgIGNhc2UgIiRtZSI6CisgICAgcmV0dXJuIGNsb25lcjsKKyAgICBjYXNlICIkaCI6CisgICAgY2FzZSAiJGhlcmUiOgorICAgIHJldHVybiBFTlYoY2xvbmVyKTsKKyAgICBkZWZhdWx0OgorICAgIHJldHVybiB2YXJpYWJsZVtzdHJbMS4uPDFdXTsKKyAgfQorICByZXR1cm4oTlVMTCk7IC8vbmV2ZXIgcmVhY2hlZAorfQorCitzdGF0aWMgc3RyaW5nIFZhclRvRmlsZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gc291cmNlX2ZpbGVfbmFtZShWYXJUb09iaihzdHIpKTsKK30KKworc3RhdGljIHN0cmluZyBWYXJUb1B1cmVGaWxlKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBwdXJlX2ZpbGVfbmFtZShWYXJUb09iaihzdHIpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvYmplY3QgZGVzY3JpcHRpb24gcHJpbnRpbmcKKyAqLworCitzdGF0aWMgdm9pZCBQcmludE9iaihvYmplY3Qgb2JqLCBzdHJpbmcgZmlsZSkKK3sKKyAgb2JqZWN0IGl0ZW0sIHRtcDsKKyAgc3RyaW5nIHN0cjsKKyAgaW50IGk7CisKKyAgU0VDVVJFMSgpOworICBpZighb2JqKQorICAgIHJldHVybjsKKyAgUHJpbnRTaG9ydCgiU2hvcnQ6ICIsIG9iaiwgZmlsZSk7CisgIGlmKCFmaWxlfHxmaWxlPT0iIikKKyAgICBXTE4oIkxvbmcgOiIpOworICBlbHNlCisgICAgd3JpdGVfZmlsZShmaWxlLCJMb25nIDpcbiIpOworICBpZihxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iaikpCisgICAgc3RyPWNhcGl0YWxpemUoZ2V0dWlkKG9iaikpOworICBlbHNlCisgIHsKKyAgICBpZihvYmplY3RfbmFtZShvYmopWzAuLjI2XT09Ii9kL3VudGVyd2VsdC9vYmpla3RlL3RlZGR5IyIgJiYKKyAgICAgICBJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICBzdHI9IkVpbiBUZWRkeSAoc3R1bW0pIjsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYoc3RyPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9JTlRfTE9ORykpCisJOworICAgICAgZWxzZSBpZihzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0xPTkcpKQorCTsKKyAgICAgIGVsc2UKKwlzdHI9Ii0gbm8gbG9uZyBkZXNjcmlwdGlvbiAtXG4iOworICAgIH0KKyAgfQorICBpZighZmlsZXx8ZmlsZT09IiIpCisgICAgVyhzdHIpOworICBlbHNlCisgICAgd3JpdGVfZmlsZShmaWxlLHN0cik7CisgIEZPUkFMTChpdGVtLCBvYmopCisgIHsKKyAgICBpZighaSkKKyAgICAgIGlmKCFmaWxlfHxmaWxlPT0iIikKKwlXTE4oIkNvbnRlbnQ6Iik7CisgICAgICBlbHNlCisJd3JpdGVfZmlsZShmaWxlLCJDb250ZW50OlxuIik7CisgICAgUHJpbnRTaG9ydChBUklHSFQoKytpKyIuICIsIDQsICIgIiksIGl0ZW0sIGZpbGUpOworICB9Cit9CisKK3N0YXRpYyBzdHJpbmcgT2JqRmlsZShvYmplY3Qgb2JqKQoreworICByZXR1cm4gIlsiK3Nob3J0X3BhdGgob2JqZWN0X25hbWUob2JqKSkrIl0iOworfQorCitzdGF0aWMgdmFyYXJncyB2b2lkIFByaW50U2hvcnQoc3RyaW5nIHByZSwgb2JqZWN0IG9iaiwgc3RyaW5nIGZpbGUpCit7CisgIHN0cmluZyBzdHI7CisKKyAgU0VDVVJFMSgpOworICBpZighb2JqKQorICAgIHJldHVybjsKKyAgaWYoTU9ERShNT0RFX1NIT1JUKSkKKyAgeworICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iaikpCisgICAgICBzdHI9Y2FwaXRhbGl6ZShnZXR1aWQob2JqKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKCEoKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSl8fAorCSAgIChzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX1NIT1JUKSkpKQorCWlmKGlzX3BsYXllcihvYmopKQorCSAgc3RyPUNSTkFNRShvYmopKyIgKGludmlzaWJsZSkiOworCWVsc2UKKwkgIHN0cj0iLSBubyBzaG9ydCBkZXNjcmlwdGlvbiAtIjsKKyAgICB9CisgICAgc3RyPUFMRUZUKHNwcmludGYoIiVPICIsc3RyKSwgMzQsICIuIikrIiAiOworICB9CisgIGVsc2UKKyAgICBzdHI9IiI7CisgIGlmKGludGVyYWN0aXZlKG9iaikpCisgICAgc3RyKz0iaSI7CisgIGVsc2UgaWYobGl2aW5nKG9iaikpCisgICAgc3RyKz0ibCI7CisgIGVsc2UKKyAgICBzdHIrPSIuIjsKKyAgc3RyKz0oc2hhZG93KG9iaiwgMCkgPyAicyIgOiAiLiIpOworICBpZighZmlsZXx8ZmlsZT09IiIpCisgICAgV0xOKChwcmUrQ0FQKHN0cikrIiAiK09iakZpbGUob2JqKSlbMC4uNzldKTsKKyAgZWxzZQorICAgIHdyaXRlX2ZpbGUoZmlsZSwocHJlK0NBUChzdHIpKyIgIitPYmpGaWxlKG9iaikpWzAuLjc5XSsiXG4iKTsKK30KKworc3RhdGljIHZhcmFyZ3Mgdm9pZCBEZWVwUHJpbnRTaG9ydChvYmplY3QgZW52LCBpbnQgaW5kZW50LCBzdHJpbmcgcHJlLCBzdHJpbmcgZmlsZSkKK3sKKyAgaW50IGk7CisgIG9iamVjdCBpdGVtOworICBzdHJpbmcgc3RyOworICAKKyAgU0VDVVJFMSgpOworICBpZighZW52KQorICAgIHJldHVybjsKKyAgZm9yKGk9aW5kZW50LHN0cj0iIjsgaS0tOyBzdHIrPSIgICIpOworICBpZihwcmUpCisgICAgc3RyKz1wcmU7CisgIGlmKCFmaWxlfHxmaWxlPT0iIikKKyAgICBXKHN0cik7CisgIGVsc2UKKyAgICB3cml0ZV9maWxlKGZpbGUsc3RyKTsKKyAgaSsrOworICBQcmludFNob3J0KCIiLGVudixmaWxlKTsKKyAgRk9SQUxMKGl0ZW0sIGVudikKKyAgICBEZWVwUHJpbnRTaG9ydChpdGVtLGluZGVudCsxLEFSSUdIVCgoKytpKSsiLiAiLDQsIiAiKSxmaWxlKTsKK30KKworc3RhdGljIHN0cmluZyBicmVha19zdHJpbmdfaGFyZChzdHJpbmcgc3RyLCBpbnQgbGVuLCBzdHJpbmcgcHJlKQoreworICBpbnQgcyxwLHQ7CisgIHN0cmluZyB0bXA7CisKKyAgaWYoIXN0cnx8IShzPXNpemVvZihzdHIpKSkKKyAgICByZXR1cm4gIiI7CisgIHQ9bGVuLShwPXNpemVvZihwcmUpKS0xOworCisgIHRtcD0iIjsKKyAgd2hpbGUocCtzPmxlbikKKyAgeworICAgIHRtcCs9cHJlK3N0clswLi50XSsiXG4iOworCXN0cj1zdHJbdCsxLi5dOworCXMtPXQ7CisgIH0KKyAgaWYoc2l6ZW9mKHN0cikpCisgICAgdG1wKz1wcmUrc3RyWzAuLl0rIlxuIjsKKyAgcmV0dXJuIHRtcDsKK30KKyAgCitzdGF0aWMgdm9pZCBkcHJvcChzdHJpbmcga2V5LCBtaXhlZCBkYXRhLCBvYmplY3Qgb2JqKQoreworICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICB3cml0ZV9maWxlKHBpcGVfb2YsYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKG9iai0+UXVlcnlQcm9wKGtleSksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7CisgIGVsc2UKKyAgICBXKGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhvYmotPlF1ZXJ5UHJvcChrZXkpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOworfQorCitzdGF0aWMgc3RyaW5nIHByb3BmbGFncyhzdHJpbmcga2V5LCBvYmplY3Qgb2IpCit7CisgIGludCB0bXA7CisgIHN0cmluZyAqZmxhZ3M7CisgIHRtcD0oaW50KW9iLT5RdWVyeShrZXksMSk7CisgIGZsYWdzPSh7fSk7CisgIHRtcCZTQVZFID8JICAgICAgIGZsYWdzKz0oeyJTQVYifSkgOiBmbGFncys9KHsiICAgIn0pOworICB0bXAmUFJPVEVDVEVEID8gICAgICBmbGFncys9KHsiUFJPIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgdG1wJlNFQ1VSRUQgPyAgICAgICAgZmxhZ3MrPSh7IlNFQyJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHRtcCZOT1NFVE1FVEhPRCA/ICAgIGZsYWdzKz0oeyJOU00ifSkgOiBmbGFncys9KHsiICAgIn0pOworICB0bXAmU0VUTU5PVEZPVU5EID8gICBmbGFncys9KHsiU01OIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgdG1wJlFVRVJZTU5PVEZPVU5EID8gZmxhZ3MrPSh7IlFNTiJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHRtcCZRVUVSWUNBQ0hFRCA/ICAgIGZsYWdzKz0oeyJRQ0EifSkgOiBmbGFncys9KHsiICAgIn0pOworICB0bXAmU0VUQ0FDSEVEID8gICAgICBmbGFncys9KHsiU0NBIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgcmV0dXJuICIiK2ltcGxvZGUoZmxhZ3MsInwiKTsKK30KKworc3RhdGljIHZvaWQgZHByb3AyKHN0cmluZyBrZXksIG1peGVkIGRhdGEsIG9iamVjdCBvYikKK3sKKyAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgd3JpdGVfZmlsZShwaXBlX29mLGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wZmxhZ3Moa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKKyAgZWxzZQorICAgIFcoYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKHByb3BmbGFncyhrZXksb2IpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOworfQorCitzdGF0aWMgbWl4ZWQgcHJvcG1ldGhvZHMoc3RyaW5nIGtleSwgb2JqZWN0IG9iKQoreworICByZXR1cm4gKG1peGVkKW9iLT5RdWVyeShrZXksMik7Cit9CisKK3N0YXRpYyB2b2lkIGRwcm9wMyhzdHJpbmcga2V5LCBtaXhlZCBkYXRhLCBvYmplY3Qgb2IpCit7CisgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcG1ldGhvZHMoa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKKyAgZWxzZQorICAgIFcoYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKHByb3BtZXRob2RzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7Cit9CisKK3N0YXRpYyB2b2lkIER1bXBQcm9wZXJ0aWVzKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBTRUNVUkUxKCk7CisgIGlmKCFvYmopCisgICAgcmV0dXJuOworICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgc3dpdGNoIChmbGFnKSB7CisgICAgY2FzZSAwOgorICAgICAgd2Fsa19tYXBwaW5nKCgobWFwcGluZyAqKShvYmotPl9fcXVlcnlfcHJvcGVydGllcygpKSlbMF0sIydkcHJvcCxvYmopOyAvLycpCisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB3YWxrX21hcHBpbmcoKChtYXBwaW5nICopKG9iai0+X19xdWVyeV9wcm9wZXJ0aWVzKCkpKVswXSwjJ2Rwcm9wMixvYmopOyAvLycpCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB3YWxrX21hcHBpbmcoKChtYXBwaW5nICopKG9iai0+X19xdWVyeV9wcm9wZXJ0aWVzKCkpKVswXSwjJ2Rwcm9wMyxvYmopOyAvLycpCisgICAgICBicmVhazsKKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1vdmluZyBvYmplY3RzCisgKi8KKworc3RhdGljIGludCBNb3ZlT2JqKG9iamVjdCBvYmoxLCBvYmplY3Qgb2JqMiwgaW50IHNpbGVudCkKK3sKKyAgaW50IGVycjsKKyAgb2JqZWN0IG9sZGVudjsKKworICBTRUNVUkUyKEZBTFNFKTsKKyAgaWYoIShvYmoxJiZvYmoyKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIG9sZGVudj1FTlYob2JqMSk7CisgIGVycj0oaW50KW9iajEtPm1vdmUob2JqMiwgTV9TSUxFTlR8TV9OT0NIRUNLKTsKKyAgaWYoIXNpbGVudCkKKyAgICBzd2l0Y2goZXJyKQorICAgIHsKKyAgICAgIGNhc2UgTUVfUExBWUVSOgorICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIE1FX1BMQVlFUiIpOworICAgICAgaWYob2xkZW52ICYmIG9sZGVudiAhPSBFTlYob2JqMSkpCisJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBjYXNlIE1FX1RPT19IRUFWWToKKyAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9UT09fSEVBVlkiKTsKKyAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQorCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgY2FzZSBNRV9DQU5UX1RQT1JUX0lOOgorICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIE1FX0NBTlRfVFBPUlRfSU4iKTsKKyAgICAgIGlmKG9sZGVudiAmJiBvbGRlbnYgIT0gRU5WKG9iajEpKQorCVdETE4oIk9iamVjdCBoYXMgYmVlbiBtb3ZlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgY2FzZSBNRV9DQU5UX1RQT1JUX09VVDoKKyAgICAgIFdETE4oIk9iamVjdCByZXR1cm5lZCBNRV9DQU5UX1RQT1JUX09VVCIpOworICAgICAgaWYob2xkZW52ICYmIG9sZGVudiAhPSBFTlYob2JqMSkpCisJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBkZWZhdWx0OgorICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIHVua25vd24gcmV0dXJuIHZhbHVlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzYXZlIGRlc3RydWN0aW5nIG9mIG9iamVjdHMKKyAqLworCitzdGF0aWMgdm9pZCBEZXN0cnVjdChvYmplY3Qgb2JqKQoreworICBpZighb2JqIHx8ICF0aGlzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgY2F0Y2gob2JqLT5yZW1vdmUoKSk7CisgIGlmKG9iamVjdHAob2JqKSAmJiAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmopKQorICAgIGRlc3RydWN0KG9iaik7Cit9CisKK3N0YXRpYyB2b2lkIERlZXBDbGVhbihvYmplY3Qgb2JqKQoreworICBpZighb2JqKQorICAgIHJldHVybjsKKyAgZmlsdGVyKGZpbHRlcihkZWVwX2ludmVudG9yeShvYmopLCAiaXNfbm90X3BsYXllciIsIE1FKSwKKwkgICAgICAgIkRlc3RydWN0IiwgTUUpOworICBpZihpc19ub3RfcGxheWVyKG9iaikpCisgICAgRGVzdHJ1Y3Qob2JqKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTaG93IHRoZSBpbmhlcml0YW5jZSB0cmVlIG9mIG9iamVjdHMKKyAqLworCitzdGF0aWMgb2JqZWN0ICpTdWJOb2RlcyhvYmplY3Qgb2JqKQoreworICBpbnQgczsKKyAgb2JqZWN0ICpvYmpzOworICBzdHJpbmcgKmlubGlzdDsKKyAgCisgIGlmKCFvYmopCisgICAgcmV0dXJuIE5VTEw7CisgIGlubGlzdD1pbmhlcml0X2xpc3Qob2JqKTsKKyAgcz1zaXplb2YoaW5saXN0KTsKKyAgb2Jqcz0oe30pOworICB3aGlsZShzLS0+MSkKKyAgICBvYmpzPSh7ZmluZF9vYmplY3QoaW5saXN0W3NdKX0pK29ianM7CisgIHJldHVybiBvYmpzOworfQorCitzdGF0aWMgdm9pZCBJbmhlcml0YW5jZShvYmplY3Qgb2JqLCBzdHJpbmcgZnVuYywgc3RyaW5nIHByZSkKK3sKKyAgaW50IGksIHM7CisgIG9iamVjdCAqbG47CisgIHN0cmluZyBzdHI7CisgIAorICBpZighb2JqKQorICAgIHJldHVybjsKKyAgc3RyPXByZSsiICIrT2JqRmlsZShvYmopOworICBpZihmdW5jKQorICB7CisgICAgc3RyPUFMRUZUKHN0cisiICIsIDUwLCAiLiIpOworICAgIGlmKGZ1bmN0aW9uX2V4aXN0cyhmdW5jLCBvYmopPT1vYmplY3RfbmFtZShvYmopKQorICAgICAgc3RyKz1BUklHSFQoIiAiK2Z1bmMsIDE5LCAiLiIpOworICAgIGVsc2UKKyAgICAgIHN0cis9QVJJR0hUKCIiLCAxOSwgIi4iKTsKKyAgfQorICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICB3cml0ZV9maWxlKHBpcGVfb2Ysc3RyKyJcbiIpOworICBlbHNlCisgICAgV0xOKHN0cik7CisgIGxuPVN1Yk5vZGVzKG9iaik7CisgIGZvcihpPTA7IGk8c2l6ZW9mKGxuKTsgaSsrKQorICAgIGxuPWxuLVN1Yk5vZGVzKGxuW2ldKTsKKyAgcz1zaXplb2YobG4pOworICBmb3IoaT0wOyBpPHM7IGkrKykKKyAgICBJbmhlcml0YW5jZShsbltpXSwgZnVuYywgcHJlKyIuLi4uLiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZpbGUgbmFtZSBoYW5kbGluZworICovCisKK3N0YXRpYyBzdHJpbmcgWEZpbGUoc3RyaW5nIGZpbGUpCit7CisgIFRLKCJYRmlsZTogZmlsZTogIisoZmlsZT9maWxlOiIoTlVMTCkiKSk7CisgIGlmKGZpbGUpCisgICAgc3dpdGNoKGZpbGVbMF0pCisgICAgeworICAgICAgY2FzZSAnQCc6CisJcmV0dXJuIHNvdXJjZV9maWxlX25hbWUoWEZpbmRPYmooZmlsZVsxLi48MV0pKTsKKyAgICAgIGNhc2UgJyQnOgorCXJldHVybiBzb3VyY2VfZmlsZV9uYW1lKFhGaW5kT2JqKGZpbGUpKTsKKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuIG9sZF9leHBsb2RlKGxvbmdfcGF0aChmaWxlKSwiIyIpWzBdOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJpbmcgWEZpbmRGaWxlKHN0cmluZyBmaWxlKQoreworICBUSygiWEZpbmRGaWxlOiBmaWxlOiAiKyhmaWxlP2ZpbGU6IihOVUxMKSIpKTsKKyAgaWYoZmlsZT1YRmlsZShmaWxlKSkKKyAgeworICAgIGlmKGZpbGVfc2l6ZShmaWxlKT49MCkKKyAgICAgIHJldHVybiBmaWxlOworICAgIGlmKGZpbGVbPDMuLjwxXSE9Ii5jIiAmJiBmaWxlX3NpemUoZmlsZSsiLmMiKT4wKQorICAgICAgcmV0dXJuIGZpbGUrIi5jIjsKKyAgfQorICBXRExOKCJGaWxlIG5vdCBmb3VuZCBvciBub3QgcmVhZGFibGUgWyIrc2hvcnRfcGF0aChmaWxlKSsiXSIpOworICByZXR1cm4gTlVMTDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmaWxlIHByaW50aW5nLCBzZWFyY2hpbmcgYW5kIGV4ZWN1dGluZworICovCisKK3N0YXRpYyB2b2lkIFhNb3JlRmlsZShzdHJpbmcgZmlsZSwgaW50IGZsYWcpCit7CisgIGludCBzLHNpemU7CisgIAorICBTRUNVUkUxKCk7CisgIGlmKCFmaWxlKQorICAgIHJldHVybjsKKyAgCisgIC8vIHRlcm09KHN0cmluZyljbG9uZXItPlF1ZXJ5UHJvcChQX1RUWSkhPSJkdW1iIjsKKyAgaWYoKHNpemU9KGZpbGVfc2l6ZShtb3JlZmlsZT1sb25nX3BhdGgoZmlsZSkpKSk+MCkKKyAgeworICAgIGlmKHNpemU+MTAwMDAwKQorICAgICAgV0RMTigiV2FybmluZzogbGFyZ2UgZmlsZSIpOworICAgIE1vcmVGaWxlKE5VTEwpOworICB9CisgIGVsc2UgaWYoZmxhZykKKyAgICBXRExOKCJDYW5ub3QgcmVhZCBmaWxlIik7Cit9CisKKy8qCitzdGF0aWMgc3RyaW5nIHJlYWRfYnVmZmVyKHN0cmluZyBmaWxlbmFtZSwgaW50IHN0YXJ0LCBpbnQgbnVtYmVyKQoreworICBtaXhlZCB0bXA7CisgIHN0cmluZyByZXN1bHQ7CisgIGludCBjdXJyZW50OworCisgIGlmKCFmaWxlbmFtZXx8ZmlsZW5hbWU9PSIiKQorICAgIHJldHVybiAiIjsKKyAgaWYobnVtYmVyPD0xKQorICAgIG51bWJlcj0xOworICBudW1iZXItLTsKKyAgcmVzdWx0PSIiOworICBpZihmaWxlbmFtZSE9bGluZV9idWZmZXJfbmFtZSkKKyAgeworICAgIC8vIFRLKCJyZWFkX2J1ZmZlcjogaW5pdGlhbGl6aW5nIik7CisgICAgbGluZV9idWZmZXI9KFtdKTsKKyAgICBsaW5lX2J1ZmZlcl9uYW1lPWZpbGVuYW1lOworICAgIGN1cnJlbnQ9MDsKKyAgfQorICBlbHNlCisgICAgY3VycmVudD1zdGFydDsKKworICB3aGlsZShjdXJyZW50PD1zdGFydCtudW1iZXIgJiYgc3RyaW5ncCgodG1wPWxvYWRfYnVmZmVyKGN1cnJlbnQrKykpKSkKKyAgICBpZihjdXJyZW50Pj1zdGFydCkKKyAgICAgIHJlc3VsdCs9dG1wOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RyaW5nIGxvYWRfYnVmZmVyKGludCBsaW5lKQoreworICBpbnQgaSwgY3VycmVudCwgc3RhcnQsIGxlbmd0aCwgKmlkeDsKKworICBpZihpbnRwKGxpbmVfYnVmZmVyW2xpbmVdKSkKKyAgeworICAgIC8vIFRLKCJsb2FkX2J1ZmZlcjogTm90Zm91bmQ6ICIrbGluZSk7CisgICAgY3VycmVudD1saW5lOworICAgIHdoaWxlKGN1cnJlbnQ+MCYmaW50cChsaW5lX2J1ZmZlclstLWN1cnJlbnRdKSk7CisgICAgZm9yKGk9Y3VycmVudDtpPD1saW5lO2krKykKKyAgICB7CisgICAgICAvLyBUSygibG9hZF9idWZmZXI6IHRyeWluZzogIitpKTsKKyAgICAgIGlmKGk+MCkKKwlpZHg9bGluZV9idWZmZXJbaS0xXTsKKyAgICAgIGVsc2UKKwlpZHg9KHswLDB9KTsKKyAgICAgIGxlbmd0aD1yZWFkX2xpbmUoKHN0YXJ0PWlkeFswXStpZHhbMV0pKTsKKyAgICAgIC8vIFRLKCJsb2FkX2J1ZmZlcjogIitzdGFydCsiLyIrbGVuZ3RoKTsKKyAgICAgIGxpbmVfYnVmZmVyW2ldPSh7c3RhcnQsbGVuZ3RofSk7CisgICAgfQorICB9CisgIGlkeD1saW5lX2J1ZmZlcltsaW5lXTsKKyAgcmV0dXJuCisgICAgcmVhZF9ieXRlcyhsaW5lX2J1ZmZlcl9uYW1lLGlkeFswXSxpZHhbMV0pOworfQorCitzdGF0aWMgaW50IHJlYWRfbGluZShpbnQgb2Zmc2V0KQoreworICBtaXhlZCBsb2NfYnVmOworICBpbnQgbGVuZ3RoLCBwb3M7CisKKyAgLy8gVEsoInJlYWRfbGluZTogIitvZmZzZXQpOworICBsZW5ndGg9MDsKKyAgd2hpbGUoIWludHAoKGxvY19idWY9cmVhZF9ieXRlcyhsaW5lX2J1ZmZlcl9uYW1lLG9mZnNldCtsZW5ndGgsMTAyNCkpKSkKKyAgeworICAgIGlmKChwb3M9bWVtYmVyKGxvY19idWYsJ1xuJykpPj0wKQorICAgICAgcmV0dXJuIGxlbmd0aCtwb3MrMTsKKyAgICBsZW5ndGgrPTEwMjQ7CisgIH0KKyAgcmV0dXJuIGxlbmd0aDsKK30KKyovCisKK3N0YXRpYyB2b2lkIE1vcmVGaWxlKHN0cmluZyBzdHIpCit7CisgIGludCBpLCBvZmY7CisgIHN0cmluZyBmLCBsLCByOworICAKKyAgU0VDVVJFMSgpOworICAKKyAgaWYgKHN0ciAvKiYmIHNpemVvZihzdHIpKi8pCisgIHsKKwkJaWYoICFzaXplb2Yoc3RyKSApIHN0cj0iXDAiOworICAgIGlmKHRlcm0pCisgICAgICBXKCIbTRtbMU0iKTsKKyAgICBzd2l0Y2goc3RyWzBdKQorICAgIHsKKyAgICAgIGNhc2UgJ3EnOgorICAgICAgY2FzZSAneCc6CisgICAgICBtb3JlZmxhZz1GQUxTRTsKKyAgICAgIG1vcmVvZmZzZXQ9MTsKKyAgICAgIGlmKG1vcmVmaWxlPT1UTVBfRklMRXx8bW9yZWZpbGU9PVBJUEVfRklMRSkKKwlybShtb3JlZmlsZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUCc6CisgICAgICBjYXNlICdVJzoKKyAgICAgIG1vcmVmbGFnPUZBTFNFOworICAgICAgbW9yZW9mZnNldD1tb3Jlb2Zmc2V0LW1vcmVsaW5lczsKKyAgICAgIGNhc2UgJ3AnOgorICAgICAgY2FzZSAndSc6CisgICAgICBtb3Jlb2Zmc2V0PW1vcmVvZmZzZXQtMiptb3JlbGluZXM7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgY2FzZSAnTic6CisgICAgICBtb3Jlb2Zmc2V0Kz1tb3JlbGluZXM7CisgICAgICBjYXNlIDA6CS8qIFJFVFVSTiAqLworICAgICAgY2FzZSAnZCc6CisgICAgICBpZihtb3JlZmxhZykKKyAgICAgIHsKKwltb3JlZmxhZz1GQUxTRTsKKwltb3Jlb2Zmc2V0PTE7CisJaWYobW9yZWZpbGU9PVRNUF9GSUxFKQorCSAgcm0obW9yZWZpbGUpOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICBtb3Jlb2Zmc2V0LS07CisgICAgICBtb3JlX3NlYXJjaGV4cHI9c3RyWzEuLjwxXTsKKyAgICAgIGNhc2UgJ24nOgorICAgICAgaT1tb3Jlb2Zmc2V0LW1vcmVsaW5lcysxOworICAgICAgaWYobW9yZV9zZWFyY2hleHByPT0iIikKKyAgICAgIHsKKwlXRExOKCJObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iKTsKKwlyZXR1cm47CisgICAgICB9CisgICAgICBpZighcmVnZXhwKCh7ImR1bW15In0pLCBtb3JlX3NlYXJjaGV4cHIpKQorCVdETE4oIkJhZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKKyAgICAgIGVsc2UKKwl3aGlsZSgobD1yZWFkX2ZpbGUobW9yZWZpbGUsIGkrKywgMSkpJiYKKwkgICAgICAhc2l6ZW9mKHJlZ2V4cCgoe2x9KSwgbW9yZV9zZWFyY2hleHByKSkpCisJICA7CisgICAgICBpZihsKQorICAgICAgeworCVdMTigiKioqIFNraXBwaW5nIC4uLiIpOworCW1vcmVvZmZzZXQ9aS0xOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCVdMTigiKioqIFBhdHRlcm4gbm90IGZvdW5kIik7CisJbW9yZW9mZnNldC09bW9yZWxpbmVzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICBjYXNlICcwJy4uJzknOgorICAgICAgc3NjYW5mKHN0ciwgIiVkIiwgaSk7CisgICAgICBtb3Jlb2Zmc2V0PWk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgbW9yZW9mZnNldD0xOworICAgIG1vcmVmbGFnPUZBTFNFOworICB9CisgIGlmKG1vcmVvZmZzZXQ8MSkKKyAgICBtb3Jlb2Zmc2V0PTE7CisgIGlmKENhdEZpbGUoKSkKKyAgICBXKCIqKiogTW9yZTogcSx1LFUsZCxELC88cmVnZXhwPiw8bGluZT4gWyIrKG1vcmVvZmZzZXQtMSkrIl0gKioqICIpOworICBlbHNlCisgIHsKKyAgICBXKCIqKiogTW9yZTogcSx1LFUsZCxELC88cmVnZXhwPiw8bGluZT4gWyIrKG1vcmVvZmZzZXQtMSkrIj1FT0ZdICoqKiAiKTsKKyAgICBtb3JlZmxhZz1UUlVFOworICB9CisgIGlucHV0X3RvKCJNb3JlRmlsZSIpOworICByZXR1cm47Cit9CisKKy8vIFNjaGFkZSBlaWdlbnRsaWNoIGRhcyBpY2ggZXMgbmV1c2NocmVpYmVuIG11c3N0ZSwgYWJlciBlcyBpc3QKKy8vIHNjaG5lbGxlciBuZXUgZ2VzY2hyaWViZW4gYWxzIGR1cmNoIGRpZSB1bmRva3VtZW50aWVyZW4gYWx0ZW4gRnVua3Rpb25lbgorLy8gZHVyY2h6dXN0ZWlnZW4uLi4gKnNldWZ6KgorLy8JCQkJCSAgUGFkcmVpYworCitzdGF0aWMgc3RyaW5nIGxhc3RfZmlsZSwgKmxhc3RfZmlsZV9idWZmZXI7CitzdGF0aWMgaW50ICAgIGxhc3RfZmlsZV9kYXRlLCBsYXN0X2ZpbGVfc2l6ZSwgbGFzdF9maWxlX2NvbXBsZXRlOworCitzdGF0aWMgc3RyaW5nIHNyZWFkX2xpbmUoaW50IG51bSkKK3sKKyAgIGlmICghbW9yZWZpbGUpIHJldHVybiAiIjsKKyAgIGlmIChsYXN0X2ZpbGUhPW1vcmVmaWxlIHx8IGxhc3RfZmlsZV9kYXRlIT1maWxlX3RpbWUobW9yZWZpbGUpKSB7CisgICAgICBpZiAoIShsYXN0X2ZpbGU9cmVhZF9ieXRlcyhtb3JlZmlsZSwgMCwgNTAwMDApKSkgcmV0dXJuICIiOworICAgICAgbGFzdF9maWxlX2RhdGU9ZmlsZV90aW1lKG1vcmVmaWxlKTsKKyAgICAgIGxhc3RfZmlsZV9idWZmZXI9ZXhwbG9kZShsYXN0X2ZpbGUsICJcbiIpOworICAgICAgbGFzdF9maWxlX3NpemU9c2l6ZW9mKGxhc3RfZmlsZV9idWZmZXIpOworICAgICAgaWYgKHNpemVvZihsYXN0X2ZpbGUpPT01MDAwMCAmJiBsYXN0X2ZpbGVbPDFdIT0nXG4nKSB7CisJIGxhc3RfZmlsZV9zaXplLS07IC8vIGxldHp0ZSBaZWlsZSBuaWNodCB2b2xsc3RhZW5kaWcgZ2VsZXNlbgorCSBsYXN0X2ZpbGVfY29tcGxldGU9MDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGZpbGVfc2l6ZShtb3JlZmlsZSk+NTAwMDApCisJbGFzdF9maWxlX2NvbXBsZXRlPTA7CisgICAgICBlbHNlIGxhc3RfZmlsZV9jb21wbGV0ZT0xOworICAgICAgbGFzdF9maWxlPW1vcmVmaWxlOworICAgfQorICAgaWYgKG51bT09MCkgbnVtPTE7CisgICAvLyBiZWkgenUgZ3Jvc3NlbiBGaWxlcyBuaWNodCBtZWhyIGFsbGVzIGJ1ZmZlcm4uLi4KKyAgIGlmIChudW0+bGFzdF9maWxlX3NpemUpIHsKKyAgICAgIGlmIChsYXN0X2ZpbGVfY29tcGxldGUpIHJldHVybiAiIjsKKyAgICAgIHJldHVybiAocmVhZF9maWxlKG1vcmVmaWxlLCBudW0sIDEpIHx8ICIiKTsKKyAgIH0KKyAgIHJldHVybiBsYXN0X2ZpbGVfYnVmZmVyW251bS0xXSsiXG4iOworfQorCitzdGF0aWMgaW50IENhdEZpbGUoKQoreworICBpbnQgZW5kOworICBzdHJpbmcgbDsKKyAgCisgIGVuZD1tb3Jlb2Zmc2V0K21vcmVsaW5lczsKKyAgd2hpbGUobW9yZW9mZnNldDxlbmQpCisvLyAgICBpZigobD1yZWFkX2ZpbGUobW9yZWZpbGUsIG1vcmVvZmZzZXQsIDEpKSE9IiIpCisgICAgaWYoKGw9c3JlYWRfbGluZShtb3Jlb2Zmc2V0KSkhPSIiKQorICAgIHsKKyAgICAgIG1vcmVvZmZzZXQrKzsKKyAgICAgIFcobCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBGQUxTRTsKKy8vICBpZihyZWFkX2ZpbGUobW9yZWZpbGUsIG1vcmVvZmZzZXQrMSwgMSkhPSIiKQorICBpZihzcmVhZF9saW5lKG1vcmVvZmZzZXQrMSkhPSIiKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IFhHcmVwRmlsZShzdHJpbmcgcGF0LCBzdHJpbmcgZmlsZSwgaW50IG1vZGUpCit7CisgIGludCBpLCBqLCBmLCBzLCBmc2l6ZTsKKyAgc3RyaW5nIHRmaWxlLCAqdG1wLCAqdHMsIHQ7CisgIAorICBTRUNVUkUyKEZBTFNFKTsKKyAgVEsoIlhHcmVwRmlsZTogcGF0OiAiK3BhdCsiIGZpbGU6ICIrZmlsZSsiIG1vZGU6ICIrbW9kZSk7CisgIGlmKCEocGF0JiZmaWxlKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIHRmaWxlPVRNUF9GSUxFOworICBmc2l6ZT1maWxlX3NpemUoZmlsZSk7CisgIGZvcihpPTAsZj0wOyBpPGZzaXplICYmIHQ9cmVhZF9ieXRlcyhmaWxlLCBpLCA1MDAwMCk7IGkrPTUwMDAwKQorICAgIHRtcD1zdHJpcF9leHBsb2RlKHQsIlxuIik7CisgICAgaWYgKHQgJiYgdFs8MV0hPSdcbicgJiYgc2l6ZW9mKHQpPT01MDAwMCkgeworICAgICAgIGktPXNpemVvZih0bXBbPDFdKTsKKyAgICAgICB0bXA9dG1wWzAuLjwyXTsKKyAgICB9CisgICAgaWYocz1zaXplb2YodG1wKSkKKyAgICB7CisgICAgICBmb3Ioaj0wO2o8cztqKyspCisgICAgICB7CisJaWYoc2l6ZW9mKHRzPXJlZ2V4cCgoeyhtb2RlJlhHUkVQX0lDQVNFP2xvd2VyX2Nhc2UodG1wW2pdKTp0bXBbal0pfSkscGF0KSkpCisJeworCSAgaWYoIShtb2RlJlhHUkVQX1JFVkVSVCkpCisJICAgeworCSAgICAgaWYoIWYrKykKKwkgICAgICAgd3JpdGVfZmlsZSh0ZmlsZSwgIioqKiBGaWxlOiAiK2ZpbGUrIiAqKipcbiIpOworCSAgICAgd3JpdGVfZmlsZSh0ZmlsZSwgdG1wW2pdKyJcbiIpOworCSAgIH0KKwl9CisJZWxzZSBpZihtb2RlJlhHUkVQX1JFVkVSVCkKKwl7CisJICBpZighZisrKQorCSAgICB3cml0ZV9maWxlKHRmaWxlLCAiKioqIEZpbGU6ICIrZmlsZSsiICoqKlxuIik7CisJICB3cml0ZV9maWxlKHRmaWxlLCB0bXBbal0rIlxuIik7CisJfQorICAgICAgfQorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIFhFeGVjRmlsZShpbnQgbGluZSkKK3sKKyAgaW50IGk7CisgIAorICBpZighc2NyaXB0bGluZSkKKyAgICByZXR1cm47CisgIGZvcihpPWxpbmU7IGk8c2NyaXB0c2l6ZSYmaTxsaW5lK0VYRUNfTElORVM7IGkrKykKKyAgeworICAgIGlmKCFzY3JpcHRsaW5lW2ldKQorICAgICAgY29udGludWU7CisgICAgaWYoIUNvbW1hbmQoc2NyaXB0bGluZVtpXSkpCisgICAgeworICAgICAgc2NyaXB0bGluZT1OVUxMOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZihpPHNjcmlwdHNpemUpCisgICAgY2FsbF9vdXQoIlhFeGVjRmlsZSIsIEVYRUNfVElNRSwgaSk7CisgIGVsc2UKKyAgICBzY3JpcHRsaW5lPU5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIFhtdHBTY3JpcHQoc3RyaW5nIGRpciwgc3RyaW5nIGZpbGUsIHN0cmluZyBvcHQpCit7CisgIGludCBzLCB0OworICBzdHJpbmcgKmZpbGVzOworICAKKyAgcz1zaXplb2YoZmlsZXM9Z2V0X2RpcihkaXIrIi8qIikpOworICB3aGlsZShzLS0pCisgIHsKKyAgICB0PXNpemVvZihmaWxlc1tzXSktMTsKKyAgICBpZihmaWxlc1tzXSA9PSAiLi4iIHx8IGZpbGVzW3NdID09ICIuIiB8fCBmaWxlc1tzXVt0XSA9PSAnficgfHwKKyAgICAgICAoZmlsZXNbc11bMF0gPT0gJyMnICYmIGZpbGVzW3NdW3RdID09ICcjJykpCisgICAgICBjb250aW51ZTsKKyAgICBpZihmaWxlX3NpemUoZGlyKyIvIitmaWxlc1tzXSk9PS0yKQorICAgIHsKKyAgICAgIHdyaXRlX2ZpbGUoZmlsZSwgIm1rZGlyICIrZmlsZXNbc10rIiA7IGNkICIrZmlsZXNbc10rIlxuIik7CisgICAgICBYbXRwU2NyaXB0KGRpcisiLyIrZmlsZXNbc10sIGZpbGUsIG9wdCk7CisgICAgICB3cml0ZV9maWxlKGZpbGUsICJjZCAuLlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHdyaXRlX2ZpbGUoZmlsZSwgIm10cCAtciAiK29wdCsiICIrZGlyKyIvIitmaWxlc1tzXSsiXG4iKTsKKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBwbGF5ZXIgcHJvcGVydGllcyBoYW5kbGluZworICovCisKK3N0YXRpYyBzdHJpbmcgUGxheWVySWRsZShvYmplY3Qgb2JqKQoreworICBzdHJpbmcgc3RyOworICBpbnQgaSwgdG1wOworICAKKyAgaWYoIW9iaikKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYoKGk9cXVlcnlfaWRsZShvYmopKT49NjApCisgIHsKKyAgICBzdHI9QVJJR0hUKCIiKyhpLzM2MDApLCAyLCAiMCIpOworICAgIGktPShpLzM2MDApKjM2MDA7CisgICAgc3RyKz0iJyIrQVJJR0hUKCIiKyhpLzYwKSwgMiwgIjAiKTsKKyAgfQorICBlbHNlCisgICAgc3RyPSIuLi4uLiI7CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyQWdlKG9iamVjdCBvYmopCit7CisgIHN0cmluZyBzdHI7CisgIGludCBpLCB0bXA7CisgIAorICBpZighb2JqKQorICAgIHJldHVybiBOVUxMOworICBpPShpbnQpb2JqLT5RdWVyeVByb3AoUF9BR0UpOworICBzdHI9IiAiK0FSSUdIVCgiIisoaS80MzIwMCksIDQsICIuIik7CisgIGktPShpLzQzMjAwKSo0MzIwMDsKKyAgcmV0dXJuIHN0cisiOiIrQVJJR0hUKCIiKyhpLzE4MDApLCAyLCAiMCIpOworfQorCitzdGF0aWMgc3RyaW5nIGNybmFtZShvYmplY3Qgd2hvKQoreworICBzdHJpbmcgdWlkLCBsbmFtZTsKKworICBpZigodWlkPWdldHVpZCh3aG8pKT09Uk9PVElEICYmIAorICAgICBvYmplY3RfbmFtZSh3aG8pWzAuLjddPT0iL3NlY3VyZS8iICYmCisgICAgIChsbmFtZT0oc3RyaW5nKXdoby0+bG9naW5uYW1lKCkpKQorICAgIHJldHVybiBDQVAobG5hbWUpOworICByZXR1cm4gQ0FQKHVpZCk7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyV2hvKG9iamVjdCBvYmopCit7CisgIG9iamVjdCB0bXA7CisgIHN0cmluZyBzdHIsIHN0bXA7CisgIHN0cj1BUklHSFQoIiIrTEVWRUwob2JqKSAgLCAgMywgIiAiKTsKKyAgc3RyKz1BTEVGVCgiICIrY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKTsKKyAgc3RyKz1QbGF5ZXJBZ2Uob2JqKTsKKyAgc3RyKz0oKGludClvYmotPlF1ZXJ5UHJvcChQX0dFTkRFUik9PTEgPyAiIG0gIiA6ICIgZiAiKTsKKyAgc3RyKz0ob2JqLT5RdWVyeVByb3AoUF9GUk9HKSkgID8gImYiIDogIi4iOworICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0dIT1NUKSkgPyAiZyIgOiAiLiI7CisgIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfSU5WSVMpKSA/ICJpIiA6ICIuIjsKKyAgc3RyKz0ocXVlcnlfZWRpdGluZyhvYmopfHxxdWVyeV9pbnB1dF9wZW5kaW5nKG9iaikgPyAiZSIgOiAiLiIpOworICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0FXQVkpKSAgPyAiYSIgOiAiLiI7CisgIHN0cis9IiAiK1BsYXllcklkbGUob2JqKSsiICI7CisgIHN0cis9KHRtcD1FTlYob2JqKSkgPyBPYmpGaWxlKHRtcCkgOiAiLSBmYWJyaWMgb2Ygc3BhY2UgLSI7CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyTWFpbChvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgc3RyaW5nIHByZTsKKyAgCisgIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOworICByZXR1cm4gcHJlKyJtYWlsOiAiK29iai0+UXVlcnlQcm9wKFBfTUFJTEFERFIpOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllcklQKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBzdHJpbmcgcHJlOworICAKKyAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CisgIHJldHVybiBwcmUrImhvc3Q6ICIrcXVlcnlfaXBfbmFtZShvYmopKyIgKCIrcXVlcnlfaXBfbnVtYmVyKG9iaikrIikiOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllclJhY2Uob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIHN0cmluZyB0bXAsIHByZTsKKyAgCisgIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOworICBwcmU9cHJlKyJyYWNlOiAiK0FMRUZUKG9iai0+UXVlcnlQcm9wKFBfUkFDRSkrIiAiLCAxMCwgIi4iKSsiIGd1aWxkOiAiOworICB0bXA9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0dVSUxEKTsKKyAgcmV0dXJuIHRtcCA/IHByZSt0bXAgOiBwcmUrIi0gbm9uZSAtIjsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJEb21haW4ob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIGludCBpLCBzOworICBtaXhlZCAqdWluZm87CisgIHN0cmluZyAqZG9tYWlucywgcHJlOworICAKKyAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CisgIHByZSs9ImRvbWFpbmxvcmQgb2Y6ICI7CisgIHVpbmZvPShtaXhlZCopTUFTVEVSLT5nZXRfdXNlcmluZm8oZ2V0dWlkKG9iaikpOworICBpZih1aW5mbyYmKGRvbWFpbnM9dWluZm9bM10pJiYocz1zaXplb2YoZG9tYWlucykpKQorICB7CisgICAgZm9yKGk9MDsgaTxzOyBpKyspCisgICAgeworICAgICAgcHJlICs9IENBUChkb21haW5zW2ldKTsKKyAgICAgIGlmKGk8cy0xKQorCXByZSArPSAiLCAiOworICAgIH0KKyAgfQorICByZXR1cm4gcHJlOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllclN0YXRzKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBzdHJpbmcgcHJlOworICAKKyAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CisgIHByZSs9ImhwPSIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfSFApLCAzLCAiMCIpOworICBwcmUrPSIvIitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9NQVhfSFApLCAzLCAiMCIpOworICBwcmUrPSIgc3A9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9TUCksIDMsICIwIik7CisgIHByZSs9Ii8iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX01BWF9TUCksIDMsICIwIik7CisgIHByZSs9IiBmb29kPSIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfRk9PRCksIDMsICIwIik7CisgIHByZSs9Ii8iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX01BWF9GT09EKSwgMywgIjAiKTsKKyAgcHJlKz0iIGRyaW5rPSIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfRFJJTkspLCAzLCAiMCIpOworICBwcmUrPSIvIitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9NQVhfRFJJTkspLCAzLCAiMCIpOworICBwcmUrPSIgZXhwcz0iK29iai0+UXVlcnlQcm9wKFBfWFApOworICByZXR1cm4gcHJlOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllclNub29wKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBzdHJpbmcgdG1wLCBwcmU7CisgIG9iamVjdCB2aWN0aW07CisgIAorICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKKyAgcHJlPXByZSsiaXMgc25vb3BlZCBieTogIjsKKyAgaWYodmljdGltPXF1ZXJ5X3Nub29wKG9iaikpCisgICAgcHJlKz1BUklHSFQoIiAiK2NybmFtZSh2aWN0aW0pLCAxMiwgIi4iKTsKKyAgZWxzZQorICAgIHByZSs9Ii4uLi4uLi4uLi4uLiI7CisgIHJldHVybiBwcmU7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyQ21kQXZnKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBzdHJpbmcgcHJlOworICAKKyAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CisgIHJldHVybiBwcmUrImNtZGF2ZzogIisoaW50KW9iai0+X3F1ZXJ5X2NvbW1hbmRfYXZlcmFnZSgpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbXNnIGlucHV0IHRvIG9iamVjdHMKKyAqLworCitzdGF0aWMgdm9pZCBYTXNnU2F5KHN0cmluZyBzdHIpCit7CisgIGlmKHN0cj09Ii4ifHxzdHI9PSIqKiIpCisgIHsKKyAgICBXTE4oIltFbmQgb2YgbWVzc2FnZV0iKTsKKyAgICBzYXkoIltFbmQgb2YgbWVzc2FnZV1cbiIpOworICB9CisgIGVsc2UKKyAgeworICAgIHNheShzdHIrIlxuIik7CisgICAgaW5wdXRfdG8oIlhNc2dTYXkiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBYTXNnVGVsbChzdHJpbmcgc3RyKQoreworICBpZihzdHI9PSIuInx8c3RyPT0iKioiKQorICB7CisgICAgV0xOKCJbRW5kIG9mIG1lc3NhZ2VdIik7CisgICAgdGVsbF9vYmplY3QobXNndG8sICJbRW5kIG9mIG1lc3NhZ2VdXG4iKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0ZWxsX29iamVjdChtc2d0bywgc3RyKyJcbiIpOworICAgIGlucHV0X3RvKCJYTXNnVGVsbCIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFhNc2dTaG91dChzdHJpbmcgc3RyKQoreworICBpZihzdHI9PSIuInx8c3RyPT0iKioiKQorICB7CisgICAgV0xOKCJbRW5kIG9mIG1lc3NhZ2VdIik7CisgICAgc2hvdXQoIltFbmQgb2YgbWVzc2FnZV1cbiIpOworICB9CisgIGVsc2UKKyAgeworICAgIHNob3V0KHN0cisiXG4iKTsKKyAgICBpbnB1dF90bygiWE1zZ1Nob3V0Iik7CisgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvd24gb2JqZWN0IG1vdmluZworICovCisKK2ludCBtb3ZlKG1peGVkIGRlc3QpCit7CisgIG1vdmVfb2JqZWN0KE1FLCBjbG9uZXI/Y2xvbmVyOmRlc3QpOworICByZXR1cm4gVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvYmplY3QgaWQKKyAqLworCitpbnQgaWQoc3RyaW5nIHN0cikKK3sKKyAgaWYoIXNlY3VyaXR5KCkmJk1PREUoTU9ERV9TQ0FOQ0hLKSYmUlRQJiYhSVNfQVJDSChSVFApKQorICAgIFdETE4oY3JuYW1lKFJUUCkrIiBzY2FubmVkIHlvdSAoaWQpIFsiK3F1ZXJ5X3ZlcmIoKSsiXSAiKworCSAoUFJFViA/IE9iakZpbGUoUFJFVikgOiAiW2Rlc3RydWN0ZWQgb2JqZWN0XSIpKTsKKyAgcmV0dXJuIExPV0VSKHN0cik9PUxPV0VSKFRPT0xfTkFNRSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc2hvcnQgYW5kIGxvbmcgZGVzY3JpcHRpb24KKyAqLworCitzdHJpbmcgc2hvcnQoKQoreworICByZXR1cm4gX3F1ZXJ5X3Nob3J0KCkrIi5cbiI7Cit9CisKK3N0cmluZyBfcXVlcnlfc2hvcnQoKQoreworICBzdHJpbmcgc2g7IC8vIGFkZGVkIGJ5IFJ1bWF0YQorICBpZihjbG9uZXIpCisgIHsKKyAgICBpZigoIXNlY3VyaXR5KCkpJiZNT0RFKE1PREVfU0NBTkNISykmJiFJU19BUkNIKFJUUCkpCisgICAgICBXRExOKGNybmFtZShSVFApKyIgc2Nhbm5lZCB5b3UgKHNob3J0KSBbIitxdWVyeV92ZXJiKCkrIl0gIisKKwkgICAoUFJFViA/IE9iakZpbGUoUFJFVikgOiAiW2Rlc3RydWN0ZWQgb2JqZWN0XSIpKTsKKwlpZiggc2g9UXVlcnkoUF9TSE9SVCkgKSByZXR1cm4gc2g7IC8vIGFkZGVkIGJ5IFJ1bWF0YQorICAgIHJldHVybiBjbG9uZXItPm5hbWUoV0VTU0VOKSsiICIrVE9PTF9USVRMRSsiIFsiKworICAgICAgY3RpbWUodGltZSgpKVsxMS4uMThdKyJdIjsKKyAgfQorICByZXR1cm4gVE9PTF9USVRMRTsKK30KKworc3RyaW5nIGxvbmcoKQoreworICByZXR1cm4gX3F1ZXJ5X2xvbmcoKTsKK30KKworc3RyaW5nIF9xdWVyeV9sb25nKCkKK3sKKyAgaWYoY2xvbmVyJiYhc2VjdXJpdHkoKSYmTU9ERShNT0RFX1NDQU5DSEspJiYhSVNfQVJDSChSVFApKQorICB7CisgICAgV0RMTihjcm5hbWUoUlRQKSsiIHNjYW5uZWQgeW91IChsb25nKSBbIitxdWVyeV92ZXJiKCkrIl0gIisKKwkgKFBSRVYgPyBPYmpGaWxlKFBSRVYpIDogIltkZXN0cnVjdGVkIG9iamVjdF0iKSk7CisgIH0KKyAgcmV0dXJuIAorICAgICJUaGlzIGlzICIrVE9PTF9OQU1FKyIgdmVyc2lvbiAiK1RPT0xfVkVSU0lPTisKKyAgICAiIChtYWludGFpbmVkIGJ5IEtpcmtATW9yZ2VuR3JhdWVuKVxuIisKKyAgICAiT3JpZ2luYWwgY29weXJpZ2h0IGhlbGQgYnkgSHlwLlxuIisKKyAgICAiR2FtZWRyaXZlciBwYXRjaGxldmVsOiAiK19fVkVSU0lPTl9fKyIgbWFzdGVyIG9iamVjdDogIitfX01BU1RFUl9PQkpFQ1RfXysKKyAgICAiXG5cbkRvICd4aGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iOworfQorCitzdHJpbmcgbmFtZShtaXhlZCBkdW1teTEsIG1peGVkIGR1bW15MikKK3sKKyAgcmV0dXJuIF9xdWVyeV9zaG9ydCgpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGxpZ2h0IHN0dWZmCisgKi8KKworaW50IF9xdWVyeV9saWdodCgpCit7CisgIHJldHVybiB4bGlnaHQ7Cit9CisKK2ludCBfc2V0X2xpZ2h0KGludCB4KQoreworICByZXR1cm4geGxpZ2h0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEF1dG9sb2FkaW5nCisgKi8KKworbWl4ZWQgKl9xdWVyeV9hdXRvbG9hZG9iaigpCit7CisgIHJldHVybiBBVVRPTE9BRF9BUkdTOworfQorCit2b2lkIF9zZXRfYXV0b2xvYWRvYmoobWl4ZWQgKmFyZ3MpCit7CisgIFdMTihUT09MX1RJVExFKyIgLi4uIik7CisgIGlmKCFwb2ludGVycChhcmdzKSkKKyAgICA7CisgIGVsc2UgaWYoc2l6ZW9mKGFyZ3MpIT0zKQorICAgIDsKKyAgZWxzZSBpZighc3RyaW5ncChhcmdzWzBdKSkKKyAgICA7CisgIGVsc2UgaWYoIWludHAoYXJnc1sxXSkpCisgICAgOworICBlbHNlIGlmKCFpbnRwKGFyZ3NbMl0pKQorICAgIDsKKyAgZWxzZQorICB7CisgICAgaWYoKHN0cmluZylhcmdzWzBdIT1UT09MX0lOVEVSTkFMKQorICAgIHsKKyAgICAgIFdMTigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKKyAgICAgIFdMTigiKioqCSAgICBORVcgRURJVElPTiAgICAgICoqKiIpOworICAgICAgV0xOKCIqKioJZG8gJ3h0b29sIG5ld3MnIGZvciAgKioqIik7CisgICAgICBXTE4oIioqKgkgbW9yZSBpbmZvcm1hdGlvbiAgICAqKioiKTsKKyAgICAgIFdMTigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKKyAgICB9CisgICAgbW9kaT0oaW50KWFyZ3NbMV07CisgICAgbW9yZWxpbmVzPShpbnQpYXJnc1syXTsKKyAgICByZXR1cm47CisgIH0KKyAgVygiKGJhZCBhdXRvbG9hZCwgdXNpbmcgZGVmYXVsdClcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNyZWF0aW9uLCB1cGRhdGluZyBhbmQgaW5pdGlhbGl6YXRpb24gc3R1ZmYKKyAqLworCit2b2lkIHVwZGF0ZV90b29sKG1peGVkICphcmdzLCBvYmplY3Qgb2JqKQoreworICBTRUNVUkUxKCk7CisgIGlmKCEob2JqJiZhcmdzKSkKKyAgICByZXR1cm47CisgIERlc3RydWN0KFBSRVYpOworICBfc2V0X2F1dG9sb2Fkb2JqKGFyZ3MpOworICBtb3ZlKG9iaik7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIGlmKG1lbWJlcihvYmplY3RfbmFtZSgpLCcjJyk8MCkKKyAgICByZXR1cm47CisgIGlmKCFjbG9uZXImJiEoKGNsb25lcj1UUCl8fChjbG9uZXI9RU5WKE1FKSkpJiYhaW50ZXJhY3RpdmUoY2xvbmVyKSkKKyAgICBkZXN0cnVjdChNRSk7CisgIGlmKCFJU19MRUFSTkVSKGNsb25lcikpCisgICAgZGVzdHJ1Y3QoTUUpOworICBTZXRQcm9wKFBfTk9EUk9QLCJEYXMgd2FlcmUgenUgZ2VmYWVocmxpY2guXG4iKTsKKyAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKyAgU2V0UHJvcChQX05PQlVZLDEpOworICBpZihmaWxlX3NpemUoU0FWRV9GSUxFKyIubyIpPjApCisgIHsKKyAgICBXRExOKCJMb2FkaW5nICIrVE9PTF9USVRMRSsiIHNldHRpbmdzIik7CisgICAgcmVzdG9yZV9vYmplY3QoU0FWRV9GSUxFKTsKKyAgfQorICBpZihNT0RFKE1PREVfRklSU1QpKQorICAgIGNhbGxfb3V0KCJtb3ZlIiwwLGNsb25lcik7CisgIGNhbGxfb3V0KCJhZGRfaW5zZXJ0X2hvb2siLDEsTUUpOworfQorCit2b2lkIFRLKHN0cmluZyBzdHIpCit7CisgIGlmICgheHRrKQorICAgIHJldHVybjsKKyAgdGVsbF9vYmplY3QoY2xvbmVyLCJYVE9PTDogIitzdHIrIlxuIik7Cit9CisKK2ludCBYdGsoc3RyaW5nIHN0cikKK3sKKyAgeHRrPSF4dGs7CisgIFdETE4oIlh0b29sIGludGVybmFsIHRyYWNpbmcgIisoeHRrPyJlbmFibGVkIjoiZGlzYWJsZWQiKSk7CisgIHJldHVybiBUUlVFOworfQorCit2b2lkIGFkZF9pbnNlcnRfaG9vayhvYmplY3Qgb2JqKQoreworICBpZihvYmplY3RwKG9iaikpCisgICAgY2xvbmVyLT5BZGRJbnNlcnRIb29rKG9iaik7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIG9iamVjdCBmaXJzdCwgcHJldjsKKyAgCisgIGlmKG1lbWJlcihvYmplY3RfbmFtZSgpLCcjJyk8MCkgcmV0dXJuOworICBmaXJzdD1maXJzdF9pbnZlbnRvcnkoRU5WKE1FKSk7CisgIGlmKE1PREUoTU9ERV9QUk9URUNUKSYmaXNfcGxheWVyKGZpcnN0KSYmIUlTX0FSQ0goZmlyc3QpKQorICB7CisgICAgV0RMTigiV0FSTklORzogIitjcm5hbWUoZmlyc3QpKyIgdHJpZWQgdG8gbW92ZSBpbnRvIHlvdXIgaW52ZW50b3J5Iik7CisgICAgdGVsbF9vYmplY3QoZmlyc3QsICJZb3UgY2Fubm90IG1vdmUgeW91cnNlbGYgaW50byAiKworCQljcm5hbWUoY2xvbmVyKSsiJ3MgaW52ZW50b3J5LlxuIik7CisgICAgY2FsbF9vdXQoIkRyb3BPYmoiLDAsZmlyc3QpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIGlmKE1PREUoTU9ERV9GSVJTVCkmJmZpcnN0IT1NRSkKKyAgICBtb3ZlKGNsb25lcik7CisgIGVsc2UgYWN0aW9ucygpOworfQorCit2b2lkIERyb3BPYmoob2JqZWN0IG9iaikKK3sKKyAgaWYoIW9ianx8IW9iamVjdHAob2JqKSkKKyAgICByZXR1cm47CisgIG9iai0+bW92ZShFTlYoY2xvbmVyKSxNX05PQ0hFQ0t8TV9OT19TSE9XKTsKK30KKworI2RlZmluZSBBQ1RJT05TXAorKFtcCisgICJ4Y2FsbG91dHMiIDogIlhjYWxsb3V0cyI7MDsxLFwKKyAgInhjYWxsIiAgICAgOiAiWGNhbGwiOzA7MSxcCisgICJ4Y2F0IiAgICAgIDogIlhjYXQiOzE7MSxcCisgICJ4Y2QiICAgICAgIDogIlhjZCI7MDswLFwKKyAgInhjbGVhbiIgICAgOiAiWGNsZWFuIjswOzAsXAorICAieGNsb25lIiAgICA6ICJYY2xvbmUiOzA7MCxcCisgICJ4dWNsb25lIiAgIDogIlh1Y2xvbmUiOzA7MCxcCisgICJ4Y21kcyIgICAgIDogIlhjbWRzIjswOzEsXAorICAieGRiZyIgICAgICA6ICJYZGJnIjswOzAsXAorICAieGRjbGVhbiIgICA6ICJYZGNsZWFuIjswOzAsXAorICAieGRkZXMiICAgICA6ICJYZGRlcyI7MDswLFwKKyAgInhkZXMiICAgICAgOiAiWGRlcyI7MDswLFwKKyAgInhkZXN0IiAgICAgOiAiWGRlcyI7MDswLFwKKyAgInhkbG9vayIgICAgOiAiWGRsb29rIjswOzEsXAorICAieGRvIiAgICAgICA6ICJYZG8iOzA7MCxcCisgICJ4ZHVwZGF0ZSIgIDogIlhkdXBkYXRlIjswOzAsXAorICAieGVjaG8iICAgICA6ICJYZWNobyI7MDswLFwKKyAgInhldmFsIiAgICAgOiAiWGV2YWwiOzA7MSxcCisgICJ4Zm9yYWxsIiAgIDogIlhmb3JhbGwiOzA7MCxcCisgICJ4Z290byIgICAgIDogIlhnb3RvIjswOzAsXAorICAieGhiZWF0cyIgICA6ICJYaGJlYXRzIjswOzEsXAorICAieGdyZXAiICAgICA6ICJYZ3JlcCI7MTsxLFwKKyAgInhoZWFkIiAgICAgOiAiWGhlYWQiOzE7MSxcCisgICJ4aGVscCIgICAgIDogIlhoZWxwIjswOzAsXAorICAieGludmVudG9yeSI6ICJYaW52ZW50b3J5IjswOzEsXAorICAieGlkcyIgICAgICA6ICJYaWRzIjswOzAsXAorICAieGluZm8iICAgICA6ICJYaW5mbyI7MDswLFwKKyAgInhpbmhlcml0IiAgOiAiWGluaGVyaXQiOzA7MSxcCisgICJ4bGFnIiAgICAgIDogIlhsYWciOzA7MCxcCisgICJ4bGlnaHQiICAgIDogIlhsaWdodCI7MDswLFwKKyAgInhsb2FkIiAgICAgOiAiWGxvYWQiOzA7MCxcCisgICJ4bG9vayIgICAgIDogIlhsb29rIjswOzEsXAorICAieGxwYyIgICAgICA6ICJYbHBjIjswOzAsXAorICAieG1hbiIgICAgICA6ICJYbWFuIjswOzAsXAorICAieG1vcmUiICAgICA6ICJYbW9yZSI7MTswLFwKKyAgInhtb3ZlIiAgICAgOiAiWG1vdmUiOzA7MCxcCisgICJ4bXNnIiAgICAgIDogIlhtc2ciOzE7MCxcCisgICJ4bXRwIiAgICAgIDogIlhtdHAiOzA7MCxcCisgICJ4cHJvYyIgICAgIDogIlhwcm9jIjswOzEsXAorICAieHByb2YiICAgICA6ICJYcHJvZiI7MDswLFwKKyAgInhwcm9wcyIgICAgOiAiWHByb3BzIjswOzEsXAorICAieHF1aXQiICAgICA6ICJYcXVpdCI7MDswLFwKKyAgInhzY2FuIiAgICAgOiAiWHNjYW4iOzA7MCxcCisgICJ4c2V0IiAgICAgIDogIlhzZXQiOzA7MCxcCisgICJ4c2giICAgICAgIDogIlhzaCI7MDswLFwKKyAgInhzb3J0IiAgICAgOiAiWHNvcnQiOzE7MSxcCisgICJ4dGFpbCIgICAgIDogIlh0YWlsIjsxOzEsXAorICAieHRrIiAgICAgICA6ICJYdGsiOzA7MCxcCisgICJ4dG9vbCIgICAgIDogIlh0b29sIjswOzAsXAorICAieHRyYWNlIiAgICA6ICJYdHJhY2UiOzA7MCxcCisgICJ4dHJhbnMiICAgIDogIlh0cmFucyI7MDswLFwKKyAgInh1cGRhdGUiICAgOiAiWHVwZGF0ZSI7MDswLFwKKyAgInh3YyIgICAgICAgOiAiWHdjIjsxOzAsXAorICAieHdobyIgICAgICA6ICJYd2hvIjswOzEsXAorICBdKQorCitzdGF0aWMgc3RyaW5nIFByZXBhcmVMaW5lKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBzdHJpbmcgUXVvdGVMaW5lKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqdG1wLCp0bXAyOworICBpbnQgaSwgaTIsIGxlbiwgbGVuMiwgcWQsIHFzOworCisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcXFwiLCKwQlNITCIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXFwiIiwisERCTFEiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFxcJyIsIrBTR0xRIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcfCIsIrBQSVBFIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsInx8IiwisE9ST1IiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiLT4iLCKwTEFSUiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXCQiLCKwRE9MUiIpOworICB0bXA9cmVnZXhwbG9kZShzdHIsIihcInwnKSIpOworICBsZW49c2l6ZW9mKHRtcCk7CisgIHFkPXFzPTA7CisgIGZvcihpPTA7aTxsZW47aSsrKQorICB7CisgICAgaWYoaSUyKQorICAgIHsKKyAgICAgIGlmKHRtcFtpXT09IiciKQorCXFkPSghcXM/IXFkOnFkKTsKKyAgICAgIGVsc2UKKwlxcz0oIXFkPyFxczpxcyk7CisgICAgICBpZigodG1wW2ldPT0iXCIiJiYhcWQpfHwodG1wW2ldPT0iJyImJiFxcykpCisJdG1wW2ldPSIiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoIXFkKQorICAgICAgeworCWxlbjI9c2l6ZW9mKHRtcDI9cmVnZXhwbG9kZSh0bXBbaV0sIlxcJFteIF1bXiBdKiIpKTsKKwlmb3IoaTI9MDtpMjxsZW4yO2kyKyspCisJICBpZihpMiUyKQorCSAgeworCSAgICBUSygiUXVvdGVMaW5lOiAiK3RtcDJbaTJdWzEuLl0pOworCSAgICB0bXAyW2kyXT0oc3RyaW5nKVhGaW5kT2JqKCh0bXAyW2kyXSlbMS4uXSk7CisJICB9CisJdG1wW2ldPWltcGxvZGUodG1wMiwiIik7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHFkfHxxcykKKyAgICByZXR1cm4gTlVMTDsKKyAgc3RyPWltcGxvZGUodG1wLCIiKTsKKyAgVEsoIlF1b3RlTGluZTogc3RyOiAiK3N0cik7CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBzdHJpbmcgVW5xdW90ZUxpbmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisEJTSEwiLCJcXCIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwREJMUSIsIlwiIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBTR0xRIiwiXCciKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisERRVU8iLCIiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisFNRVU8iLCIiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisFBJUEUiLCJ8Iik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBPUk9SIiwifHwiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisExBUlIiLCItPiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwRE9MUiIsIiQiKTsKKyAgVEsoIlVucXVvdGVMaW5lOiBzdHI6ICIrc3RyKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHN0cmluZyAqRXhwbG9kZUNtZHMoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp0bXA7CisgIAorICB0bXA9cmVnZXhwbG9kZShzdHIsIlxcfHw+fD4+Iik7CisgIHdoaWxlKHRtcFs8MV09PSIiKQorICAgIHRtcD10bXBbMC4uPDJdOworICByZXR1cm4gdG1wOworfQorCit2YXJhcmdzIGludCBQYXJzZUxpbmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHZlcmIsIGFyZzsKKyAgaW50IHJldDsKKyAgCisgIFRLKCJQYXJzZUxpbmU6IHN0cjogIisoc3RyP3N0cjoiIikpOworICBpZighc2l6ZW9mKGNtZHMpKQorICB7CisgICAgLy8gdGhpcyBpcyBhIHNpbmdsZSBjb21tYW5kIG9yIGJlZ2lubmluZyBvZiBhIGNvbW1hbmQgcGlwZQorICAgIHZlcmI9cXVlcnlfdmVyYigpOworCisgICAgLy8gcmV0dXJuIG9uIHVua25vd24gY29tbWFuZHMKKyAgICBpZighdmVyYnx8IXNpemVvZih2ZXJiKXx8IUdldEZ1bmModmVyYixUUlVFKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN0cj0oc3RyaW5nKXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7CisgICAgcGlwZV9pbj1GQUxTRTsKKyAgICBwaXBlX29mPU5VTEw7CisgICAgcGlwZV9vdnI9VFJVRTsKKyAgICBwaXBlX291dD1GQUxTRTsKKyAgICBwaXBlX29mPU5VTEw7CisgICAgLy8gcGFzcyBhcmd1bWVudHMgdG8gc29tZSBzcGVjaWFsIGZ1bmN0aW9ucyB1bnBhcnNlZAorICAgIGlmKG1lbWJlcigoeyJ4bHBjIiwieGNhbGwiLCJ4ZXZhbCJ9KSx2ZXJiKT49MCkKKyAgICB7CisjaWZkZWYgWERCRworICAgICAgVEsoIlBhcnNlTGluZTogc3BlY2lhbCBmdW5jOiAiK3ZlcmIpOworI2VuZGlmCisgICAgICByZXQ9Q2FsbEZ1bmModmVyYixzdHIpOworICAgICAgU2FmZVJldHVybihyZXQpOworICAgIH0KKyAgICAvLyBvaywgaGVyZSB3ZSBnbworICAgIHBpcGVfaW49cGlwZV9vdXQ9RkFMU0U7CisgICAgcGlwZV9pZj1waXBlX29mPU5VTEw7CisgICAgcGlwZV9vdnI9VFJVRTsKKyAgICBpZihmaWxlX3NpemUoUElQRV9GSUxFKT49MCkKKyAgICAgIHJtKFBJUEVfRklMRSk7CisgICAgaWYgKHN0ciYmc3RyIT0iIikJICAKKyAgICB7CisgICAgICBpZighKHN0cj1RdW90ZUxpbmUoc3RyKSkpCisgICAgICB7CisJV0RMTigiVW50ZXJtaW5hdGVkIHF1b3RhdGlvbiIpOworCVNhZmVSZXR1cm4oVFJVRSk7CisgICAgICB9CisgICAgICBjbWRzPUV4cGxvZGVDbWRzKHN0cik7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGNtZHM9KHsiIn0pOworICAgIGFyZz1zdHJpcF9zdHJpbmcoY21kc1swXSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgY21kc1swXT1zdHJpcF9zdHJpbmcoY21kc1swXSk7CisgICAgVEsoIlBhcnNlTGluZTogY21kc1swXTogIitjbWRzWzBdKTsKKyAgICBpZihzc2NhbmYoY21kc1swXSwiJXMgJXMiLHZlcmIsYXJnKSE9MikKKyAgICB7CisgICAgICB2ZXJiPWNtZHNbMF07CisgICAgICBhcmc9IiI7CisgICAgfQorICB9CisgIGNtZHM9Y21kc1sxLi5dOworICBUSygiUGFyc2VMaW5lOiB2ZXJiOiAiK3ZlcmIpOworICBpZiAoIXZlcmJ8fCFzaXplb2YodmVyYil8fCFHZXRGdW5jKHZlcmIsVFJVRSkpCisgICAgU2FmZVJldHVybihGQUxTRSk7CisgIFRLKCJQYXJzZUxpbmUoMSk6IGFyZzogIithcmcrIiBjbWRzOiAiK3NwcmludGYoIiVPIixjbWRzKSk7CisgIHN3aXRjaChzaXplb2YoY21kcykpCisgIHsKKyAgICBjYXNlIDA6CisgICAgcmV0PUNhbGxGdW5jKHZlcmIsc3RyaXBfc3RyaW5nKFVucXVvdGVMaW5lKGFyZykpKTsKKyAgICBTYWZlUmV0dXJuKHJldCk7CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSAxOgorICAgIFdETE4oIk1pc3NpbmcgcmhzIG9mIGNvbW1hbmQgcGlwZSIpOworICAgIFNhZmVSZXR1cm4oVFJVRSk7CisgICAgYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKyAgICBwaXBlX291dD1UUlVFOworICAgIHN3aXRjaChjbWRzWzBdKQorICAgIHsKKyAgICAgIGNhc2UgInwiOgorICAgICAgcGlwZV9vZj1QSVBFX0ZJTEU7CisgICAgICBwaXBlX292cj1UUlVFOworICAgICAgY21kcz1jbWRzWzEuLl07CisgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSAiPiI6CisgICAgICBwaXBlX292cj1UUlVFOworICAgICAgaWYoc2l6ZW9mKGNtZHMpIT0yKQorICAgICAgeworCVdETE4oIklsbGVnYWwgSU8gcmVkaXJlY3Rpb24iKTsKKwlTYWZlUmV0dXJuKFRSVUUpOworICAgICAgfQorICAgICAgcGlwZV9vZj1jbWRzWzFdOworICAgICAgY21kcz0oe30pOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgIj4+IjoKKyAgICAgIHBpcGVfb3ZyPUZBTFNFOworICAgICAgaWYoc2l6ZW9mKGNtZHMpIT0yKQorICAgICAgeworCVdETE4oIklsbGVnYWwgSU8gcmVkaXJlY3Rpb24iKTsKKwlTYWZlUmV0dXJuKFRSVUUpOworICAgICAgfQorICAgICAgcGlwZV9vZj1jbWRzWzFdOworICAgICAgY21kcz0oe30pOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIFRLKCJQYXJzZUxpbmUoMik6IGFyZzogIithcmcrIiBjbWRzOiAiK3NwcmludGYoIiVPIixjbWRzKSk7CisgIGlmKCFDYWxsRnVuYyh2ZXJiLHN0cmlwX3N0cmluZyhhcmcpKSkKKyAgICBTYWZlUmV0dXJuKEZBTFNFKTsKKyAgcGlwZV9pbj1waXBlX291dDsKKyAgcGlwZV9pZj1waXBlX29mOworICBwaXBlX292cj1GQUxTRTsKKyAgcGlwZV9vdXQ9RkFMU0U7CisgIHBpcGVfb2Y9TlVMTDsKKyAgaWYoc2l6ZW9mKGNtZHMpKQorICAgIGNhbGxfb3V0KCJQYXJzZUxpbmUiLDApOworICBlbHNlCisgICAgU2FmZVJldHVybihUUlVFKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgQ2FsbEZ1bmMoc3RyaW5nIHZlcmIsIHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBmdW47CisKKyAgZnVuPUdldEZ1bmModmVyYixGQUxTRSk7CisjaWZkZWYgWERCRworICBUSygiQ2FsbEZ1bmM6IHZlcmI6ICIrdmVyYisiIHN0cjogIitzdHIpOworICBUSygiQ2FsbEZ1bmM6IHJlc29sdmVkIGZ1bmN0aW9uOiAiKyhmdW4/ZnVuOiIodW5yZXNvbHZlZCkiKSk7CisjZW5kaWYKKyAgaWYoc3RyPT0iIikKKyAgICBzdHI9TlVMTDsKKyAgcmV0dXJuIGZ1bj8oaW50KWNhbGxfb3RoZXIoTUUsZnVuLHN0cik6RkFMU0U7Cit9CisKK3N0YXRpYyBzdHJpbmcgR2V0RnVuYyhzdHJpbmcgdmVyYiwgaW50IHRlc3QpCit7CisgIHN0cmluZyBmdW4sKmtleXMsa2V5OworICBpbnQgaSxsZW47CisKKyAgVEsoIkdldEZ1bmM6IHZlcmI6ICIrdmVyYik7CisKKyAgaWYodmVyYlswLi4wXSE9IngiKSAvLyBBc3N1bWUgYWxsIGNvbW1hbmRzIHN0YXJ0IHdpdGggIngiCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCEoZnVuPShzdHJpbmcpQUNUSU9OU1t2ZXJiLDBdKSkgeyAvLyBUcnkgZXhhY3QgaGl0IGZpcnN0CisgICAga2V5PSIiOworICAgIGxlbj1zaXplb2YodmVyYik7CisgICAgZm9yIChpPXNpemVvZihrZXlzPW1faW5kaWNlcyhBQ1RJT05TKSktMTtpPj0wO2ktLSkgeworICAgICAgVEsoIiAgdHJ5aW5nOiAiK2tleXNbaV0pOworICAgICAgaWYoc2l6ZW9mKGtleXNbaV0pPj1sZW4mJmtleXNbaV1bMC4ubGVuLTFdPT12ZXJiKSB7CisJaWYoc2l6ZW9mKGtleSkpIHsKKwkgIFdMTigiRGFzIGlzdCBuaWNodCBlaW5kZXV0aWcgLi4uIik7CisJICByZXR1cm4gMDsKKwl9CisJZnVuPUFDVElPTlNba2V5c1tpXSwwXTsKKwlrZXk9a2V5c1tpXTsKKwkvL2JyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlCisgICAga2V5PXZlcmI7CisKKyAgaWYodGVzdCkKKyAgICByZXR1cm4gZnVuOworICAKKyAgaWYgKGtleSkgeworI2lmZGVmIFhEQkcKKyAgICBUSygiR2V0RnVuYzogZnVuOiAiK2Z1bisiIChrZXk6ICIra2V5KyIpXG4iKworICAgICAgICJwaXBlX2luOiAiKyhwaXBlX2luPyJUUlVFICAiOiJGQUxTRSAiKSsocGlwZV9pZj9waXBlX2lmOiIoTlVMTCkiKSsiXG4iKworICAgICAgICJwaXBlX291dDogIisocGlwZV9vdXQ/IlRSVUUgICI6IkZBTFNFICIpKyhwaXBlX29mP3BpcGVfb2Y6IihOVUxMKSIpKyJcbiIrCisgICAgICAgInBpcGVfb3ZyOiAiKyhwaXBlX292cj8iVFJVRSI6IkZBTFNFIikpOworI2VuZGlmCisgICAgaWYgKHBpcGVfaW4mJiFBQ1RJT05TW2tleSxQSVBFX0lOXSkKKyAgICB7CisgICAgICAvLyB0aGlzIGNvbW1hbmQgZG9lcyBub3QgcmVhZCBwaXBlcworI2lmZGVmIFhEQkcKKyAgICAgIFRLKCJJbGxlZ2FsIHJocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOworI2VuZGlmCisgICAgICBub3RpZnlfZmFpbCgiSWxsZWdhbCByaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChwaXBlX291dCYmIUFDVElPTlNba2V5LFBJUEVfT1VUXSkKKyAgICB7CisgICAgICAvLyB0aGlzIGNvbW1hbmQgZG9lcyBub3QgZmVlZCBwaXBlcworI2lmZGVmIFhEQkcKKyAgICAgIFRLKCJJbGxlZ2FsIGxocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOworI2VuZGlmCisgICAgICBub3RpZnlfZmFpbCgiSWxsZWdhbCBsaHMgb2YgY29tbWFuZCBwaXBlIFwiIitmdW4rIlwiXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gZnVuOworfQorCit2b2lkIGFjdGlvbnMoKQoreworICBpZiAoIWNsb25lcnx8IVJUUHx8Y2xvbmVyPT1SVFB8fHF1ZXJ5X3dpel9sZXZlbChjbG9uZXIpPD1xdWVyeV93aXpfbGV2ZWwoUlRQKSkKKyAgICBhZGRfYWN0aW9uKCJQYXJzZUxpbmUiLCIiLDEpOworICBhZGRfYWN0aW9uKCJDb21tYW5kU2NhbiIsICIiLCAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgdGhlIGNoZWNraW5nIHN0dWZmCisgKi8KKwordm9pZCBJbnNlcnROb3RpZnkob2JqZWN0IG9iaikKK3sKKyAgaWYoIWNsb25lcikKKyAgICByZXR1cm47CisgIGlmKE1PREUoTU9ERV9GSVJTVCkgJiYgZmluZF9jYWxsX291dCgibW92ZSIpPT0tMSkKKyAgICBjYWxsX291dCgibW92ZSIsMCxjbG9uZXIpOworICBpZihNT0RFKE1PREVfSU5WQ0hFQ0spKQorICAgIHdyaXRlX25ld2ludm9iaihvYmopOworfQorCitzdGF0aWMgdm9pZCBWYXJDaGVjayhpbnQgc2hvdykKK3sKKyAgaW50IGksIHM7CisgIGZvcmVhY2goc3RyaW5nIGssIG1peGVkIHYgOiB2YXJpYWJsZSkKKyAgeworICAgIGlmICh2KSBjb250aW51ZTsKKyAgICBpZihzaG93KSBXRExOKCIqKiogVmFyaWFibGUgJCIraysiIGhhcyBiZWVuIGRlc3RydWN0ZWQiKTsKKyAgICBtX2RlbGV0ZSh2YXJpYWJsZSwgayk7CisgIH0KK30KKworCitpbnQgd3JpdGVfbmV3aW52b2JqKG9iamVjdCBvYmopCit7CisgIGlmKG9iaikgV0RMTigiKioqIE5ldyBvYmplY3QgaW4gaW52ZW50b3J5ICIrT2JqRmlsZShvYmopKTsKKyAgcmV0dXJuKDEpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBjYXRjaCBhbGwgY29tbWFuZHMsIGFic29yYiBmb3JjZXMgYW5kIGNoZWNrIGhpc3RvcnkKKyAqLworCitpbnQgQ29tbWFuZFNjYW4oc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHZlcmIsIGNtZDsKKyAgb2JqZWN0IHJ0cDsKKyAgcnRwPVJUUDsKKworICBpZighY2xvbmVyJiYhKGNsb25lcj1ydHApKSBkZXN0cnVjdChNRSk7CisKKyAgaWYoKCFNT0RFKE1PREVfUFJPVEVDVCkpfHxzZWN1cml0eSgpfHwKKyAgICAgcXVlcnlfd2l6X2xldmVsKGNsb25lcik8cXVlcnlfd2l6X2xldmVsKHJ0cCkpCisgIHsKKyAgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgICBpZih2ZXJiJiZEb0hpc3RvcnkodmVyYisoYXJnID8gIiAiK2FyZyA6ICIiKSkpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBub3N0b3JlPUZBTFNFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZihydHApCisgICAgeworICAgICAgV0RMTigiWW91ciAiK1RPT0xfVElUTEUrIiBwcm90ZWN0cyB5b3UgZnJvbSBhIGZvcmNlIGJ5ICIrY3JuYW1lKHJ0cCkrCisJICAgIiBbIitxdWVyeV92ZXJiKCkrKGFyZyA/ICIgIithcmcrIl0iIDogIl0iKSk7CisgICAgICB0ZWxsX29iamVjdChydHAsIGNybmFtZShjbG9uZXIpKyIncyAiK1RPT0xfVElUTEUrCisJCSAgIiBhYnNvcmJlcyB5b3VyIGZvcmNlLlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBXRExOKCJZb3VyICIrVE9PTF9USVRMRSsiIHByb3RlY3RzIHlvdSBmcm9tIGEgZm9yY2UgWyIrCisJICAgcXVlcnlfdmVyYigpKyhhcmcgPyAiICIrYXJnKyJdIiA6ICJdIikpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitpbnQgRG9IaXN0b3J5KHN0cmluZyBsaW5lKQoreworICBpbnQgaTsKKyAgc3RyaW5nIGNtZCwgKnN0cnM7CisgIAorICBTRUNVUkUyKEZBTFNFKTsKKyAgaWYoIXN0cmluZ3AobGluZSkgfHwgIXNpemVvZihsaW5lKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZSBpZihsaW5lPT0iJSEiKQorICB7CisgICAgV0xOKCJDdXJyZW50IGNvbW1hbmQgaGlzdG9yeToiKTsKKyAgICBmb3IoaT1NQVhfSElTVE9SWTsgaTsgLS1pKQorICAgICAgaWYoaGlzdG9yeVtpLTFdKQorICAgICAgeworCVcoIiAiK0FSSUdIVCgiIitpLCAyLCAiICIpKyI6ICIpOworCWlmKHNpemVvZihoaXN0b3J5W2ktMV0pPjcwKQorCSAgV0xOKEFMRUZUKGhpc3RvcnlbaS0xXSwgNzAsICIgIikpOworCWVsc2UKKwkgIFdMTihoaXN0b3J5W2ktMV0pOworICAgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgaWYobGluZVswLi4xXT09IiUlIiAmJiAoY21kPWhpc3RvcnlbMF0rbGluZVsyLi48MV0pKQorICB7CisgICAgQ29tbWFuZChjbWQpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgaWYobGluZVswXT09J14nJiYoc3Rycz1zdHJpcF9leHBsb2RlKGxpbmUsICJeIikpKQorICB7CisgICAgaWYoc2l6ZW9mKHN0cnMpJiZzdHJzWzBdJiYoY21kPWhpc3RvcnlbMF0pKQorICAgIHsKKyAgICAgIGlmKHNpemVvZihzdHJzKT09MikKKwljbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCBzdHJzWzBdLCBzdHJzWzFdKTsKKyAgICAgIGVsc2UKKwljbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCBzdHJzWzBdLCAiIik7CisgICAgICBub3N0b3JlLS07CisgICAgICBDb21tYW5kKGNtZCk7CisgICAgICBub3N0b3JlKys7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihsaW5lWzBdPT0nJScgJiYgKHNzY2FuZihsaW5lWzEuLjwxXSwgIiVkIiwgaSkpKQorICB7CisgICAgaT0gaT4wID8gaSA6IDE7CisgICAgaT0gaTw9TUFYX0hJU1RPUlkgPyBpIDogTUFYX0hJU1RPUlk7CisgICAgaWYoY21kPWhpc3RvcnlbaS0xXSkKKyAgICAgIENvbW1hbmQoY21kKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBlbHNlIGlmKGxpbmVbMF09PSclJykKKyAgeworICAgIGZvcihpPTA7IGk8TUFYX0hJU1RPUlk7IGkrKykKKyAgICB7CisgICAgICBpZihoaXN0b3J5W2ldJiYKKwkgaGlzdG9yeVtpXVswLi5zaXplb2YobGluZSktMl09PWxpbmVbMS4uIDwxXSkKKyAgICAgIHsKKwlDb21tYW5kKGhpc3RvcnlbaV0pOworCXJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmKG5vc3RvcmU8MSkKKyAgICBoaXN0b3J5PSh7bGluZX0pK2hpc3RvcnlbMC4uTUFYX0hJU1RPUlktMl07CisgIHJldHVybiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2FsbCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlMjFlYQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNhbGwKQEAgLTAsMCArMSwyMSBAQAorU1lOT1BTSVMKKyAgICAgIHhjYWxsIDxvYmplY3Q+LT48ZnVuY3Rpb24+KDxleHByZXNzaW9uPikKKworREVTQ1JJUFRJT04KKyAgICAgIENhbGxzIHRoZSBsZnVuIDxmdW5jdGlvbj4gb2YgdGhlIDxvYmplY3Q+IHdpdGggPGV4cHJlc3Npb24+IGFzCisgICAgICBhcmd1bWVudC4gVGhlIDxwcm9wZXJ0aWVzLmg+IGFyZSBpbmNsdWRlZC4gVGhyZWUgb2JqZWN0cyBhcmUgYWxscmVhZHkKKyAgICAgIGRlZmluZWQgb24gaW52b2thdGlvbi4gIm1lIiByZXByZXNlbnRzIHRoZSBvbndlciBvZiB0aGUgWHRvb2wuICJoZXJlIgorICAgICAgaXMgdGhlIGN1cnJlbnQgcm9vbSBhbmQgIm9iaiIgaXMgdGhlIG9iamVjdCB3aGljaCBsZnVuIGlzIGNhbGxlZC4KKyAgICAgIFRvIHVzZSB0aGUgb2JqZWN0IGFjY2VzcyBzeW50YXggZGVzY3JpYmVkIGFib3ZlLCBhIGZ1bmN0aW9uIGNhbGxlZAorICAgICAgImdldChzdHJpbmcpIiBjYW4gYmUgdXNlZC4gSWYgdGhlIGNhbGwgcmV0dXJuZWQgYW4gb2JqZWN0LCB0aGUgdmFyaWFibGUKKyAgICAgICIkcmVzdWx0IiB3aWxsIGJlIHNldCB0byB0aGlzIG9iamVjdC4KKyAgICAgIHhjYWxsIGluY2x1ZGVzIGEgcHJpdmF0ZSB+Ly54dG9vbC5oLCBpZiBpdCBleGlzdHMsIHRvIHN1cHBvcnQgdXNlcgorICAgICAgZGVmaW5lZCBtYWNyb3MuCisKK0VYQU1QTEVTCisgICAgICB4Y2FsbCAkbWUtPlF1ZXJ5UHJvcChQX0xPTkcpCisgICAgICB4Y2FsbCAvc3RkL3RoaW5nIzE0NS0+U2V0UHJvcChQX1NIT1JULCJhIHNtYWxsIHRoaW5nIikKKyAgICAgIHhjYWxsIC9zZWN1cmUvbWFzdGVyLT5hZGRfZG9tYWluX3dpeigiaGVsbCIsICJoeXAiKQorICAgICAgeGNhbGwgJG1lLT5tb3ZlKGdldCgiXmRlZXB0aG91Z2h0IiksImdvIikKKyAgICAgICh0aGUgbGFzdCBvbmUgdXNlcyB0aGUgZnVuY3Rpb24gZ2V0KCkgdG8gZmluZCB0aGUgcm9vbSB3aGVyZSBvdXIgZ29kIGlzKQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjYWxsb3V0cyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNhbGxvdXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWRmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjYWxsb3V0cwpAQCAtMCwwICsxLDE2IEBACitTWU5PUFNJUworICAgICAgeGNhbGxvdXRzIFtzZWFyY2ggcGF0dGVybl0KKwkgIG9yCisJICB4Y2FsbG91dHMgICAgKHdoZW4gd3JpdGluZyB0byBhIHBpcGUpCisKK0RFU0NSSVBUSU9OCisgICAgICBXaXRoIG5vIGFyZ3VtZW50IGl0IHNob3dzIGFsbCB5b3VyIGNhbGxvdXRzLiBXaXRoIGEgcmVnZXhwIGFzIGFyZ3VtZW50LAorICAgICAgYWxsIG1hdGNoaW5nIGNhbGxvdXRzIHdpbGwgYmUgcHJpbnRlZC4gV2hlbiB3cml0aW5nIHRvIGEgcGlwZSwgYWxsCisJICBjYWxsX291dHMgd2lsbCBiZSBwcmludGVkIGFuZCB0aGUgc2VhcmNoIHBhdHRlcm4gaXMgbm90IGFsbG93ZWQuCisKK0VYQU1QTEVTCisgICAgICB4Y2FsbG91dHMgb2JqICAgU2hvdyBhbGwgY2FsbG91dHMgd2l0aCB0aGUgc3RyaW5nICJvYmoiIGluIGl0LgorICAgICAgeGNhbGxvdXRzIC4gICAgIFNob3cgYWxsIGNhbGxvdXRzLiBQbGVhc2UgbmV2ZXIgZG8gdGhpcyBpZiBpdCBpc24ndAorICAgICAgICAgICAgICAgICAgICAgIHJlYWxseSBuZWNjZXNzYXJ5LiBJdCBqdXN0IGNvc3RzIHRpbWUgLSBhbmQgd2hhdCBkbyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGRvIHdpdGggdGhpcyBtYXNzIG9mIGluZm9ybWF0aW9uPworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjbGVhbiBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNsZWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzQ4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjbGVhbgpAQCAtMCwwICsxLDEyIEBACitTWU5PUFNJUworICAgICAgeGNsZWFuIFtvYmplY3RdCisKK0RFU0NSSVBUSU9OCisgICAgICBDbGVhbiB0aGUgaW52ZW50b3J5IG9mIHRoZSBvYmplY3QsIGJ1dCBkb24ndCBkZXN0cnVjdCBhbnkgbGl2aW5nLgorICAgICAgV2l0aCBubyBhcmd1bWVudCB0aGUgY3VycmVudCByb29tIHdpbGwgYmUgY2xlYW5lZC4gVGhlIG9iamVjdHMKKyAgICAgIGFyZSByZW1vdmVkIHdpdGggdGhlIGxmdW4gcmVtb3ZlKCkuCisKK0VYQU1QTEUKKyAgICAgIHhjbGVhbiAkbWUuYmFnCisgICAgICBDbGVhbiBteSBiYWcuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNsb25lIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2xvbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjMWI3YQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNsb25lCkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICB4Y2xvbmUgPGZpbGVuYW1lPgorCitERVNDUklQVElPTgorICAgICAgQ2xvbmVzIGFuIG9iamVjdC4gT24gZXJyb3IsIHRoZSBlcnJvciBsb2cgZmlsZSB3aWxsIGJlIHByaW50ZWQuCisgICAgICBNb3ZlcyB0aGUgb2JqZWN0IChpZiBwb3NzaWJsZSkgaW50byB5b3VyIGludmVudG9yeS4gSWYgdGhlIG9iamVjdAorICAgICAgaGFzIGJlZW4gY2xvbmVkIHN1Y2Nlc3NmdWxseSwgdGhlIHZhcmlhYmxlICIkY2xvbmUiIHdpbGwgYmUgc2V0LAorICAgICAgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGxvc2UgdGhlIG9iamVjdCBvdXQgb2Ygc2lnaHQgOikKKworRVhBTVBMRQorICAgICAgeGNsb25lIC9zdGQvdGhpbmcKKyAgICAgIHhjYWxsICRjbG9uZS0+U2V0U2hvcnQoImEgQklHIHRoaW5nISIpOworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkYmcgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkYmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwOWYyZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRiZwpAQCAtMCwwICsxLDE0IEBACitTWU5PUFNJUworICAgICAgeGRiZyA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgUHJpbnRzIG91dCBkZWJ1ZyBpbmZvcm1hdGlvbiBidXkgdXNpbmcgdGhlIGVmdW4gZGVidWdfaW5mbygpLgorICAgICAgTm90IGFsbCBvZiB0aGVzZSBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgYnV0IGl0IGdpdmVzIHlvdSBpbmZvcm1hdGlvbgorICAgICAgb2YgaG93IG1hbnkgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGluaGVyaXRlZCBvYmpldGNzIGFuZCBzbyBvbiBhIG9iamVjdAorICAgICAgaGFzLiBJdCBhbHNvIHNob3dzIGlmIGFuIG9iamVjdCBpcyBsaXZpbmcsIGlmIGl0cyBoZWFydCBiZWF0IGlzIHR1cm5lZAorICAgICAgb24sIHdoZW4gdGhlIG5leHQgY2FsbCBvZiByZXNldCgpIHdpbGwgYmUgKGJ1dCBkb24ndCB0YWtlIHRoaXMgdmFsdWUKKyAgICAgIG5vdCB0b28gc2VyaW91c2x5KSBldGMuCisKK0VYQU1QTEUKKyAgICAgIHhkYmcgJG1lCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRjbGVhbiBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRjbGVhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY5MDkzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGNsZWFuCkBAIC0wLDAgKzEsNiBAQAorU1lOT1BTSVMKKyAgICAgIHhkY2xlYW4gPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIFNhbWUgYXMgeGNsZWFuLCBidXQgbWFrZXMgYSBkZWVwIGNsZWFuLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkZGVzIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjM1NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGRlcwpAQCAtMCwwICsxLDYgQEAKK1NZTk9QU0lTCisgICAgICB4ZGRlcyA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgU2FtZSBhcyB4ZGVzLCBidXQgbWFrZXMgYSBkZWVwIGRlc3RydWN0LgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkZXMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiZjk4NAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRlcwpAQCAtMCwwICsxLDggQEAKK1NZTk9QU0lTCisgICAgICB4ZGVzIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBEZXN0cnVjdCBhbiBvYmplY3QgdXNpbmcgYnkgZmlyc3QgY2FsbGluZyB0aGUgbGZ1biByZW1vdmUoKSBvZiB0aGUKKyAgICAgIG9iamVjdCBhbmQgaWYgaXRzIHN0aWxsICJhbGl2ZSIgdGhlbiBkZXN0cnVjdCBpdCB3aXRoIHRoZSBlZnVuCisgICAgICBkZXN0cnVjdCgpLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkbG9vayBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRsb29rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNzc3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkbG9vawpAQCAtMCwwICsxLDYgQEAKK1NZTk9QU0lTCisgICAgICB4ZGxvb2sgPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIFNhbWUgYXMgbG9vaywgYnV0IHRha2VzIGEgZGVlcCBsb29rIGF0IHRoZSBvYmplY3QuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRvIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmYTVmMQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRvCkBAIC0wLDAgKzEsMTQgQEAKK1NZTk9QU0lTCisgICAgICB4ZG8gWzxudW1iZXIxPiNdPGNvbW1hbmQxPls7WzxudW1iZXIyPiNdPGNvbW1hbmQyPl0gLi4uCisKK0RFU0NSSVBUSU9OCisgICAgICBQZXJmb3JtIG11bHRpcGxlIGNvbW1hbmQgZXhlY3V0aW9uLgorCisgICAgICBFeGFtcGxlczoKKyAgICAgIHhkbyA1I3NtaWxlICAgKHNtaWxlIDUgdGltZXMpCisKKyAgICAgIHhkbyBsO2kgICAgICAgKGxvb2sgYXJvdW5kIGluIHRoZSByb29tIGFuZCB0aGVuIGluIHlvdXIgaW52ZW50b3J5KQorCisgICAgICB4ZG8gczs5I3c7MyNuO2tpbGwgc2hhbWFuO2dldCBzd29yZCBmcm9tIGNvcnBzZTszI3M7OSNlO247Li4uCisgICAgICAgICAgICAgICAgICAgICh5b3Uga25vdyB0aGlzIG9uZSA6KQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkdXBkYXRlIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZHVwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc1MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZHVwZGF0ZQpAQCAtMCwwICsxLDggQEAKK1NZTk9QU0lTCisgICAgICB4ZHVwZGF0ZSA8ZmlsZW5hbWU+CisKK0RFU0NSSVBUSU9OCisgICAgIFVwZGF0ZSBhbiBvYmplY3QgaW5jbHVkaW5nIGFsbCBpdHMgaW5oZXJpdGVkIG9iamVjdHMuCisKK0VYQU1QTEUKKyAgICAgeGR1cGRhdGUgL3N0ZC9wbGF5ZXIuYwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZXZhbCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGV2YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzMmJkZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGV2YWwKQEAgLTAsMCArMSwxOCBAQAorU1lOT1BTSVMKKyAgICAgIHhldmFsIDxleHByZXNzaW9uPgorCitERVNDUklQVElPTgorICAgICAgRXhlY3V0ZSBhbiBMUEMgZXhwcmVzc2lvbi4gSW5zaWRlIHRoZSA8ZXhwcmVzc2lvbj4sICJtZSIgYW5kICJoZXJlIiBhcmUKKyAgICAgIHByZWRlZmluZWQgb2JqZWN0cyAoZ3Vlc3MgZm9yIHdoYXQgOikuIEhlcmUgd2UgY2FuIGFsc28gdXNlIHRoZSBmdW5jdGlvbgorICAgICAgImdldCgpIiB0byBmaW5kIGFuIG9iamVjdCB1c2luZyB0aGUgb2JqZWN0IGFjY2VzcyBzeW50YXguIElmIHRoZQorICAgICAgRXhwcmVzc2lvbiByZXR1cm5zIGFuIG9iamVjdCB0aGUgdmFyaWFibGUgIiRyZXN1bHQiIHdpbGwgYmUgc2V0IHRvIHRoaXMuCisgICAgICB4ZXZhbCBpbmNsdWRlcyBhIHByaXZhdGUgfi8ueHRvb2wuaCwgaWYgaXQgZXhpc3RzLCB0byBzdXBwb3J0IHVzZXIgICAgICAgIAorICAgICAgZGVmaW5lZCBtYWNyb3MuCisKKworRVhBTVBMRVMKKyAgICAgIEp1c3QgZG8gaXQhCisgICAgICB4ZXZhbCB1c2VycygpCisgICAgICB4ZXZhbCBnZXR1aWQobWUpCisgICAgICB4ZXZhbCBnZXQoIiRtZS54dG9vbCIpCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGZvcmFsbCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGZvcmFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzU1OGY0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Zm9yYWxsCkBAIC0wLDAgKzEsMjkgQEAKK1NZTk9QU0lTCisgICAgICB4Zm9yYWxsIDxmaWxlcGF0dGVybj4gPGNvbW1hbmQ+CisKK0RFU0NSSVBUSU9OCisgICAgICBFeGVjdXRlIDxjb21tYW5kPiBmb3IgYWxsIG1hdGNoaW5nIGZpbGVzLiBUaGUgPGNvbW1hbmQ+IHN0cmluZyBjYW4KKyAgICAgIGNvbnRhaW4gcmVwbGFjbWVudCBtYXJrcy4gQ3VycmVudGx5IHRoZXJlIGFyZSBmaXZlIG9mIHRoZXNlIG1hcmtzOgorICAgICAgLSAiISEiIHRoaXMgbWFyayBzdGFuZHMgZm9yIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICAgIC0gIiFlIiBzdGFuZHMgZm9yIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGUgbmFtZS4KKyAgICAgIC0gIiFmIiBzdGFuZHMgZm9yIHRoZSBmaWxlIG5hbWUgd2l0aG91dCBleHRlbnNpb24gYW5kIGRpcmVjdG9yeSBuYW1lLgorICAgICAgLSAiIWgiIHN0YW5kcyBmb3IgdGhlIGZ1bGwgZGlyZWN0b3J5IG5hbWUgb2YgdGhlIGZpbGVzLgorICAgICAgLSAiIXIiIHN0YW5kcyBmb3IgdGhlIGZ1bGwgZmlsZSBuYW1lIHdpdGhvdXQgZmlsZSBleHRlbnNpb24uCisgICAgICAtICIhdCIgc3RhbmRzIGZvciB0aGUgZmlsZSBuYW1lIHdpdGhvdXQgdGhlIGRpcmVjdG9yeSBuYW1lLgorCisgICAgICBJZiB0aGUgZnVsbCBmaWxlIG5hbWUgd291bGQgYmUgIi9kaXJlY3RvcnkvZmlsZS5leHQiIHRoZW4KKyAgICAgICIhISIgZXF1YWxzICIvZGlyZWN0b3J5L2ZpbGUuZXh0IgorICAgICAgIiFlIiBlcXVhbHMgImV4dCIKKyAgICAgICIhZiIgZXF1YWxzICJmaWxlIgorICAgICAgIiFoIiBlcXVhbHMgIi9kaXJlY3RvcnkiCisgICAgICAiIXIiIGVxdWFscyAiL2RpcmVjdG9yeS9maWxlIgorICAgICAgIiF0IiBlcXVhbHMgImZpbGUuZXh0IgorCitFWEFNUExFUworICAgICAgeGZvcmFsbCB+L3Jvb20vKi5jIHhjYWxsICFyLT5yZXNldCgpOworICAgICAgQ2FsbCB0aGUgcmVzZXQoKSBmdW5jdGlvbiBpbiBhbGwgeW91ciByb29tcy4KKworICAgICAgeGZvcmFsbCB+L29iai8qIG12ICEhICFoL29sZG9iai8hZi4hZS5vbGQKKyAgICAgIE1vdmUgYWxsIGZpbGVzIGZyb20geW91ciAib2JqIiBkaXIgaW50byB0aGUgIm9iai9vbGRvYmoiIGRpciBhbmQgY2hhbmdlCisgICAgICB0aGUgZXh0ZW5zaW9ucy4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Z290byBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGdvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0Y2NiYQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGdvdG8KQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKyAgICAgIHhnb3RvIFtvYmplY3RdCisKK0RFU0NSSVBUSU9OCisgICAgICBHbyBpbnNpZGUgPG9iamVjdD4uIFdpdGhvdXQgYW4gYXJndW1lbnQgeW91IHdpbGwgbGVhdmUgaW50byB5b3VyCisgICAgICB3b3Jrcm9vbS4gSWYgPG9iamVjdD4gaXMgYSBsaXZpbmcgdGhpbmcsIGdvdG8gaXQncyBlbnZpcm9ubWVudAorICAgICAgKG5ldmVyIHRlc3RlZCB1bnRpbCBub3csIHdoZW4gZ29pbmcgdG8gYSBsaXZpbmcgdGhpbmcsIGluc2lkZQorICAgICAgYSBsaXZpbmcgdGhpbmcgOikKKworRVhBTVBMRVMKKyAgICAgIHhnb3RvIC9yb29tL3Nob3AKKyAgICAgIHhnb3RvIHNob3AJIChib3RoIGFyZSB0aGUgc2FtZSwgYmVjYXVzZSBpZiB0aGVyZSBpcyBubyBzaG9wIGluCisJCQkgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYSAiL3Jvb20vIiB3aWxsIGJlIGFwcGVuZGVkCisJCQkgIHRvIHRoZSBhcmd1bWVudCkKKyAgICAgIHhnb3RvIHB1YmxpYyBlbmVteSAoZG8gdGhpcyBvbmx5IHdoZW4geW91IGFyZSByZWFsbHkgYm9yZWQpCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGdyZXAgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hncmVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTRmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hncmVwCkBAIC0wLDAgKzEsMjUgQEAKK1NZTk9QU0lTCisgICAgICB4Z3JlcCBbLWl2XSA8cmVnZXhwPiA8ZmlsZXBhdHRlcm4+CisgICAgICAgIG9yCisgICAgICB4Z3JlcCBbLWl2XSA8cmVnZXhwPiAgICAod2hlbiByZWFkaW5nIGZyb20gYSBwaXBlKQorCitERVNDUklQVElPTgorICAgICAgU2VhcmNoIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uIDxyZWdleHA+IGluIGFsbCBmaWxlcyBtYXRjaGluZyB0aGUKKyAgICAgIDxmaWxlcGF0dGVybj4uCisgICAgICBXb3JrcyBzaW11bGFyIHRvIHRoZSBVbml4IGNvbW1hbmQgImdyZXAiLiBUaGUgcmVzbHV0IHdpbGwgYmUgd3JpdHRlbgorICAgICAgdG8gPFNURE9VVD4gYW5kIG1heSBiZSBwaXBlZCBpbnRvIGFub3RoZXIgY29tbWFuZC4KKworT1BUSU9OUworICAgICAgLXYgIHJldmVydHMgdGhlIHNlbnNlIG9mIDxyZWdleHA+LgorCisgICAgICAtaSAgbWF0Y2hlcyBjYXNlLWluc2Vuc2l0aXZlCisKK0VYQU1QTEVTCisgICAgICB4Z3JlcCBEZWVwdGhvdWdodCAvbG9nL1NIT1VUUworICAgICAgVGhpcyB3aWxsIHNlYXJjaCB0aHJvdWdodCB0aGUgc2hvdXQgbG9nIGZpbGUgZm9yIGFueSBsaW5lIHdoaWNoIGhhcworICAgICAgdGhlIHdvcmQgIkRlZXB0aG91Z2h0IiBpbiBpdC4KKworICAgICAgeGdyZXAgY3JlYXRlXChcKSAqLmMKKyAgICAgIFRoaXMgd2lsbCBzZWFyY2ggZm9yIGFsbCBsaW5lcyBvZiBhbGwgbHBjIGNvZGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyCisgICAgICB3aGljaCBoYXZlIHRoZSBmdW5jdGlvbiAiY3JlYXRlKCkiIGRlZmluZWQuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhiZWF0cyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhiZWF0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTg5N2YzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGJlYXRzCkBAIC0wLDAgKzEsMTggQEAKK1NZTk9QU0lTCisgICAgICB4aGJlYXRzIFtzZWFyY2ggcGF0dGVybl0KKyAgICAgIG9yCisJICB4aGJlYXRzICAgICAod2hlbiB3cml0aW5nIHRvIGEgcGlwZSkKKworREVTQ1JJUFRJT04KKyAgICAgIFdpdGggbm8gYXJndW1lbnQgaXQgc2hvd3MgYWxsIHlvdXIgb2JqZWN0cyB3aGljaCBoYXZlIGEgcnVubmluZyBoZWFydAorICAgICAgYmVhdC4gV2l0aCBhIHJlZ2V4cCBhcyBhcmd1bWVudCwgYWxsIG1hdGNoaW5nIG9iamVjdHMgd2lsbCBiZSBwcmludGVkLgorCSAgV2hlbiB3cml0aW5nIHRvIGEgcGlwZSwgYWxsIGhlYXJiZWF0cyB3aWxsIGJlIHByaW50ZWQgYW5kIGEgc2VhcmNoCisJICBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkLgorCitFWEFNUExFUworICAgICAgeGhiZWF0cyBvYmogICBTaG93IGFsbCBvYmplY3RzIHdoaWNoIGhhdmUgYSBydW5uaW5nIGhlYXJ0IGJlYXQgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIG9iamVjdCBuYW1lcyB3aXRoIHRoZSBzdHJpbmcgIm9iaiIgaW4gaXQuCisgICAgICB4aGJlYXRzIC4gICAgIFNob3cgYWxsIGNhbGxvdXRzLiBQbGVhc2UgZG9uJ3QgZG8gdGhpcyBpZiBpdCBpc24ndAorICAgICAgICAgICAgICAgICAgICByZWFsbHkgbmVjY2Vzc2FyeS4gSXQganVzdCBjb3N0cyB0aW1lIC0gYW5kIHdoYXQgZG8geW91CisgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZG8gd2l0aCB0aGlzIGluZm9ybWF0aW9uPworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoZWFkIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGVhZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODAxMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGVhZApAQCAtMCwwICsxLDExIEBACitTWU5PUFNJUworICAgICAgeGhlYWQgPC0jPiA8ZmlsZT4KKwkgIG9yCisJICB4aGVhZCA8LSM+ICAgICh3aGVuIHJlYWRpbmcgZnJvbSBhIHBpcGUpCisKK0RFU0NSSVBUSU9OCisgICAgICB4aGVhZCBwcmludHMgdGhlIGZpcnN0IHBhcnQgb2YgYSBnaXZlbiBmaWxlOyBJdCByZWFkcyBmcm9tIGEgcGlwZQorCSAgaWYgbm8gZmlsZSBpcyBnaXZlbi4KKworRVhBTVBMRVMKKyAgICAgIHhoZWFkIC0xMCB3b3Jrcm9vbS5jIHByaW50cyB0aGUgZmlyc3QgMTAgbGluZXMgb2YgdGhlIGZpbGUgd29ya3Jvb20uYy4KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhlbHAgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoZWxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYWE3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoZWxwCkBAIC0wLDAgKzEsNiBAQAorU1lOT1BTSVMKKyAgICAgIHhoZWxwCisKK0RFU0NSSVBUSU9OCisgICAgICBTaG93IHRoZSBtYWluIGhlbHAgZmlsZS4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aWRzIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aWRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZWY3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hpZHMKQEAgLTAsMCArMSw2IEBACitTWU5PUFNJUworICAgICAgeGlkcyA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgU2hvdyB0aGUgdXNlciBpZCBhbmQgdGhlIGVmZmVjdGl2ZSB1c2VyIGlkIG9mIHRoZSA8b2JqZWN0Pi4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aW5oZXJpdCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGluaGVyaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMmYzZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGluaGVyaXQKQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKyAgICAgIHhpbmhlcml0IDxvYmplY3Q+IFtmdW5jdGlvbl0KKworREVTQ1JJUFRJT04KKyAgICAgIFNob3cgdGhlIGluaGVyaXRhbmNlIHRyZWUgb2YgYW4gb2JqZWN0IGFuZCBpZiBvcHRpb25hbCBzcGVjaWZpZWQKKyAgICAgIGRpc3BsYXkgYWxsIG9jY3VyZW5jaWVzIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgIFRoZSBpbmhlcml0YW5jZSB0cmVlIGlzIHBlcmhhcHMgbm90IHRoZSBvbmUgeW91IGV4cGVjdCB0byBzZWUuIEluCisgICAgICBmYWN0IGl0cyB0aGUgb25lIHRoZSBnYW1lZHJpdmVyIHJlYWxseSB1c2VzLiBUaGF0IG1lYW5zIGlmIGZvcgorICAgICAgZXhhbXBsZSB0d28gb2JqZWN0IGluaGVyaXQgZWFjaCBvdGhlciBvciBpbiBhbnkgb3RoZXIgY2FzZSBvZiByZWN1cnNpb24KKyAgICAgIGl0IHdpbGwgbm90IGJlIHNob3duLiBPciBpZiBhbiBvYmplY3QgQSBpbmhlcml0cyBvYmplY3QgQiBhbmQgQworICAgICAgYW5kIG9iamVjdCBCIGFsc28gaW5oZXJpdHMgb2JqZWN0IEMsIHRoZSBvYmplY3QgQyB3aWxsIG9ubHkgZGlzcGxheWVkCisgICAgICBvbmNlIChiZWNhdXNlIHRoZSBnYW1lZHJpdmVyIGFsc28gaW5oZXJpdHMgb2JqZWN0IG9uY2UpLgorCitFWEFNUExFCisgICAgICB4aW5oZXJpdCAkbWUKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bGFnIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjgxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsYWcKQEAgLTAsMCArMSwxNiBAQAorU1lOT1BTSVMKKyAgICAgIHhsYWcKKworREVTQ1JJUFRJT04KKyAgICAgIHhsYWcgZGlzcGxheXMgdGhlIGN1cnJlbnQgc3lzdGVtIExBRyBieSBjb21wYXJpbmcgdGhlIGFjdHVhbAorICAgICAgcHJvY2Vzc2VkIGhlYXJ0YmVhdHMgd2l0aCB0aGUgaW5pdGlhbCBoZWFydGJlYXQgcmF0ZSAoMS8ycykuCisgICAgICBWYWx1ZXMgd2lsbCB3ZSBkaXNwbGF5ZWQgZm9yIHRoZSBsYXN0IG1pbnV0ZSwgdGhlIGxhc3QgMTUgbWludXRlcworICAgICAgYW5kIHRoZSBsYXN0IGhvdXIuCisKK0VYQU1QTEUKKyAgICAgIExldHp0ZSA2MCBtaW46ICMjIyMjIyMgKDcuMiUpCisgICAgICBMZXR6dGUgMTUgbWluOiAjIyMjIyMjIyAoOC4zJSkKKyAgICAgIExldHp0ZSBNaW51dGU6ICMjIyMjIyMjIyAoOS40JSkgCisKK0FWQUlMQUJJTElUWQorICAgICAgeGxhZyByZXF1aXJlcyAvcGxheWVycy9raXJrL29iai9sYWctby1kYWVtb24uYyB0byBiZSBsb2FkZWQuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsb2FkIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bG9hZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRiODc3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bG9hZApAQCAtMCwwICsxLDE1IEBACitTWU5PUFNJUworICAgICAgeGxvYWQgPGZpbGVuYW1lPgorCitERVNDUklQVElPTgorICAgICAgVXBkYXRlIGFuZCBsb2FkIHRoZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBmaWxlbmFtZS4gSWYgeW91IHVwZGF0ZQorICAgICAgeW91ciBjdXJyZW50IGVudmlyb25tZW50LCBhbGwgcGxheWVycyB3aWxsIGJlIG1vdmVkIHNpbGVudGx5IGludG8KKyAgICAgICIvc3RkL3ZvaWQiIGFuZCBhZnRlciBzdWNjZXNzZnVsIHVwZGF0aW5nIGFuZCBsb2FkaW5nIGJhY2sgaW50byBpdC4KKworRVhBTVBMRVMKKyAgICAgIHhsb2FkICRoZXJlCisgICAgICBVcGRhdGUgYW5kIHJlbG9hZCB0aGUgY3VycmVudCByb29tIChidXQgd2l0aG91dCBhIHRyaXAgaW50byB0aGUgdm9pZCA6KS4KKworICAgICAgeGxvYWQgb2JqL2xpdHRsZV90aGluZy5jCisgICAgICBVcGRhdGUgYW5kIGxvYWQgaXQuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxvb2sgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsb29rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWJjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsb29rCkBAIC0wLDAgKzEsNyBAQAorU1lOT1BTSVMKKyAgICAgIHhsb29rIFtvYmplY3RdCisKK0RFU0NSSVBUSU9OCisgICAgICBMb29rIGF0IHRoZSBvYmplY3QuIElmIHRoZSBhcmd1bWVudCBpcyBvbW1pdHRlZCwgbG9vayBpbnNpZGUgdGhlCisgICAgICBjdXJyZW50IHJvb20uCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxwYyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxwYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ3MWVkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bHBjCkBAIC0wLDAgKzEsMjAgQEAKK1NZTk9QU0lTCisgICAgICB4bHBjIDxscGMgY29kZT4KKworREVTQ1JJUFRJT04KKyAgICAgIEV4ZWN1dGUgcHVyZSBMUEMgY29kZS4gIm1lIiBhbmQgImhlcmUiIGFyZSBwcmVkZWZpbmVkIG9iamVjdHMuIEFsc28gdGhlCisgICAgICA8cHJvcGVydGllcy5oPiB3aWxsIGJlIGluY2x1ZGVkLiBUaGUgZnVuY3Rpb24gImdldChzdHJpbmcpIiBjYW4gYmUgdXNlZAorICAgICAgZm9yIGFjY2Vzc2luZyBvYmplY3RzLiBJZiB0aGUgZXhlY3V0aW9uIHJldHVybnMgYW4gb2JqZWN0IHRoZSB2YXJpYWJsZQorICAgICAgIiRyZXN1bHQiIHdpbGwgc2V0IHRvIHRoaXMgb2JqZWN0LgorCitFWEFNUExFUworICAgICAgeGxwYyBpbnQgaTtvYmplY3QgKm87bz11c2VycygpO2ZvcihpPTA7aTxzaXplb2Yobyk7aSsrKW9baV0tPgorICAgICAgICAgICBTZXRQcm9wKFBfRlJPRywxKTsKKyAgICAgIChMZXQgYWxsIHVzZXJzIGJlIHNsaW15IGZyb2dzIDopCisKKyAgICAgIHhscGMgaW50IGk7b2JqZWN0ICpvO289dXNlcnMoKTtmb3IoaT0wO2k8c2l6ZW9mKG8pO2krKykKKwkgICBvW2ldLT5TZXRQcm9wKFBfVElUTEUsZ2V0KCIkbWUiKS0+UXVlcnlQcm9wKFBfVElUTEUpKTsKKyAgICAgIChHaXZlIGFsbCB1c2VycyB5b3VyIHByZWZlcmVkIHRpdGxlLiBUYWtlIGEgbG9vayBvZiB0aGUgdXNlIG9mIGdldCgpLikKKworICAgICAgQm90aCBjb21tYW5kcyBtdXN0IGJlIHdyaXR0ZW4gaW4gb25lIGxpbmUgb2YgY291cnNlIQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htYW4gYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NmFkMQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1hbgpAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUworICAgICAgeG1hbiA8dG9waWM+CisKK0RFU0NSSVBUSU9OCisgICAgICBTZWFyY2hlcyBpbiBzb21lIHNwZWNpYWwgZGlyZWN0b3JpZXMgdW5kZXIgL2RvYyBmb3IgdGhlIGdpdmVuIHRvcGljCisgICAgICBvciBjb21tYW5kLiBJZiB0aGVyZSBhcmUgdHdvIGVxdWFsIHRvcGljcyBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMKKyAgICAgIHRoZSBvbmUgZm91bmQgZmlyc3Qgd2lsbCBiZSBwcmludGVkLgorCitFWEFNUExFUworICAgICAgeG1hbiB4bWFuCisgICAgICB4bWFuIHhmb3JhbGwKKyAgICAgIHhtYW4gZWZ1bi9kZXN0cnVjdAorICAgICAgeG1hbiB3L2Rlc3RydWN0CisgICAgICB4bWFuIG1vdmUKKyAgICAgIHhtYW4gdGhpbmcKKyAgICAgIHhtYW4gZG9tYWlucworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htb3JlIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bW9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q5MjUwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bW9yZQpAQCAtMCwwICsxLDEyIEBACitTWU5PUFNJUworICAgICAgeG1vcmUgPGZpbGVuYW1lPiBbc3RhcnRdCisKK0RFU0NSSVBUSU9OCisgICAgICBQcmludHMgb3V0IGEgZmlsZSBhbmQgaWYgYSBzdGFydGluZyBsaW5lIGlzIGdpdmVuLCB0aGVuIHRoZSBwcmludGluZworICAgICAgd2lsbCBzdGFydCB0aGVyZS4gT24gYW5zaSBvciB2dDEwMCB0ZXJtaW5hbHMgdGhlIHN0YXR1cyBsaW5lIHdpbGwgYmUKKyAgICAgIG92ZXJzdHJva2VkIHRvIGdpdmUgYSBoYXJtb25pYyB2aWV3IG9mIHRoZSBmaWxlLgorCitFWEFNUExFUworICAgICAgeG1vcmUgfi93b3Jrcm9vbS5jCisgICAgICB4bW9yZSAkaGVyZSAodGhpcyB3aWxsIHNob3cgdGhlIHNvdXJjZSBvZiB0aGUgY3VycmVudCByb29tKQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htb3ZlIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bW92ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMwYWVjCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bW92ZQpAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworICAgICAgeG1vdmUgPG9iamVjdD4gaW50byA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgTW92ZXMgb25lIG9iamVjdCBpbnRvIGFub3RoZXIgb3IgZ2l2ZSB0aGUgcmVhc29uIHdoeSB0aGUgbW92ZSBmYWlsZWQuCisKK0VYQU1QTEVTCisgICAgICB4bW92ZSAkY2xvbmUgaW50byAkbWUKKyAgICAgIElmIHlvdSBjbG9uZWQgYW4gb2JqZWN0IHdpdGggeGNsb25lIGJ1dCB0aGUgb2JqZWN0IGNvdWxkbid0IGJlIG1vdmVkCisgICAgICB0aGVuIHRoaXMgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSByZWFzb24gZm9yIGl0LgorCisgICAgICB4bW92ZSBoeXAgaW50byBed3VyemVsICAodGhpcyBpcyBhIHNpbGVudCBmb3JtIG9mIGdvaW5nIHRvIG90aGVyIHBsYXllcnMpCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1zZyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzViNzgwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bXNnCkBAIC0wLDAgKzEsMTEgQEAKK1NZTk9QU0lTCisgICAgICB4bXNnIFt0byA8b2JqZWN0PnxhbGxdCisKK0RFU0NSSVBUSU9OCisgICAgICBTZW5kIGEgbWVzc2FnZS4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbmQgaW50bworICAgICAgdGhlIHJvb20uIElmIHNlY29uZCBhcmd1bWVudCBpcyAidG8iIHRoZW4gc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUKKyAgICAgIHNwZWNpZmllZCA8b2JqZWN0Pi4gSWYgc2Vjb25kIGFyZ3VtZW50IGlzICJhbGwiIHRoZW4gc2VuZCB0aGUgbWVzc2FnZSB0bworICAgICAgYWxsIHBsYXllcnMgaW4gdGhlIG11ZC4KKyAgICAgIFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBzZW5kIHRleHQgdmlhIGN1dCZwYXN0ZSB0byBzb21lb25lIHdpdGhvdXQKKyAgICAgIHB1dHRpbmcgYSAic2F5IiwgInRlbGwiIG9yICJzaG91dCIgaW5mcm9udCBvZiBlYWNoIGxpbmUuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveG10cCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG10cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDc0YTljCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bXRwCkBAIC0wLDAgKzEsMjQgQEAKK1NZTk9QU0lTCisgICAgICB4bXRwIFtvcHRpb25zXSA8ZGlyZWN0b3J5PiA8ZmlsZT4KKworREVTQ1JJUFRJT04KKyAgICAgIENyZWF0ZSBhIHNjcmlwdCBmaWxlIGZvciB0cmFuc2ZlcmluZyBjb21wbGV0ZSBkaXJlY3RvcmllcyB3aXRoIG10cC4KKyAgICAgIElmIHlvdXIgbXRwIG5lZWRzIGV4dHJhIGFyZ3VtZW50cyAoZXhjZXB0IG9mIHRoZSAtciBvcHRpb24gd2hpY2gKKyAgICAgIHN0YW5kcyBmb3IgcmVhZGluZyBmaWxlcykgZm9yIGV4YW1wbGUgdGhlIC1nIG9wdGlvbiB0aGVuIHlvdSBjYW4gYWRkCisgICAgICB0aGVuIHRvIHRoZSBjb21tYW5kLgorICAgICAgVGhpcyBjb21tYW5kIHdvcmtzIHJlY3Vyc2l2ZWx5IGFuZCBjYW4gY2F1c2UgYSB0byBkZWVwIHJlY3Vyc2lvbiBvcgorICAgICAgYSB0b28gbG9uZyBldmFsdWF0aW9uIGVycm9yIHdoZW4gdHJ5aW5nIHRvIG1ha2UgYSBzY3JpcHQgZm9yIGh1Z2UKKyAgICAgIGRpcmVjdG9yaWVzIGxpa2UgIi9wbGF5ZXJzIiBmb3IgZXhhbXBsZS4KKyAgICAgIElmIHRoZSA8ZmlsZT4gYWxscmVhZHkgZXhpc3RzIGl0IHdpbGwgbm90IGJlIHJlbW92ZWQgaW5zdGVhZCB0aGUgc2NyaXB0CisgICAgICB3aWxsIHNpbXBseSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCitFWEFNUExFCisgICAgICB4bXRwIC1ndHVibXVkIC9iYXNpYyB+L2Jhc2ljLmNzaAorICAgICAgQ3JlYXRlIGEgc2NyaXB0IGZpbGUgImJhc2ljLmNzaCIgdG8gdHJhbnNmZXIgdGhlIHdob2xlIGNvbnRlbnQgb2YgdGhlCisgICAgICAiL2Jhc2ljIiBkaXJlY3RvcnkuCisKKyAgICAgIE9uIHlvdXIgaG9zdCB5b3UgdGhlbiBqdXN0IGNyZWF0ZSBhIGRpcmVjdG9yeSAobm9ybWFsbHkgd2l0aCB0aGUgc2FtZQorICAgICAgbmFtZSBnaXZlIHRvIHRoZSB4bXRwIGNvbW1hbmQpLCBjaGFuZ2UgaW50byB0aGUgZGlyZWN0b3J5IGFuZCByZWFkCisgICAgICB0aGUgc2NyaXB0IGZpbGUgd2l0aCAibXRwIC1yIGJhc2ljLmNzaCIuIFRoZW4ganVzdCBleGVjdXRlIHRoZSBzY3JpcHQKKyAgICAgIHdpdGggImNzaCIgb3IgInNoIi4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94cHJvYyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHByb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMGFhMQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHByb2MKQEAgLTAsMCArMSwxMyBAQAorU1lOT1BTSVMKKyAgICAgIHhwcm9jIFstY10gWy1sXSBbLW1dIFstdV0gWy12XQorCitERVNDUklQVElPTgorICAgICAgeHByb2MgcHJpbnRzIGluZm9ybWF0aW9uIGZyb20gdGhlIC9wcm9jIGZpbGVzeXN0ZW0gdG8gdGhlIHNjcmVlbi4KKyAgICAgIFRoZSBmb3JtYXQgaXMgdG90YWxseSB1bmZvcm1hdHRlZCEgKEkgY2FuJ3QgaGVscCBpdCBmb3Igbm93Li4uKSAKKyAgICAgIFdpdGhvdXQgYW55IG9wdGlvbiwgaXQgZGlzcGxheSB0aGUgbWFjaGluZXMgbG9hZCBhdmVyYWdlcy4KKworICAgICAgLWM6IGNwdSBpbmZvcm1hdGlvbgorICAgICAgLWw6IGxvYWQgYXZlcmFnZXMKKyAgICAgIC1tOiBtZW1vcnkgdXNhZ2UKKyAgICAgIC11OiBtYWNoaW5lJ3MgdXB0aW1lCisgICAgICAtdjoga2VybmVsIHZlcnNpb24KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHByb3BzIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94cHJvcHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmMGRmZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHByb3BzCkBAIC0wLDAgKzEsMTUgQEAKK1NZTk9QU0lTCisgICAgICB4cHJvcHMgWy1mfC1tXSA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgUHJpbnRzIG91dCBhbGwgcHJvcGVydGllcyBvZiA8b2JqZWN0PiB3aGljaCBhcmUgY3VycmVudGx5IGRlZmluZWQKKyAgICAgIGluIC9zeXMvcHJvcGVydGllcy5oLgorCitPUFRJT05TCisgICAgICAtZiAgTGlzdCBwcm9wZXJ0eSBmbGFncyB2ZXJib3NlCisKKyAgICAgIC1tICBMaXN0IHByb3BlcnR5IG1ldGhvZHMKKworRVhBTVBMRQorICAgICAgeHByb3BzICRtZQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzY2FuIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2NhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdiNDUwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2NhbgpAQCAtMCwwICsxLDcgQEAKK1NZTk9QU0lTCisgICAgICB4c2NhbgorCitERVNDUklQVElPTgorICAgICAgU2NhbiBjdXJyZW50IHJvb20gZm9yIG5ldGRlYWQgcGxheWVycyBhbmQgY2hlY2sgdmFyaWFibGVzLgorICAgICAgKFRoZXJlIHdpbGwgZm9sbG93IG1vcmUgY2hlY2tpbmcgcm91dGluZXMgbGlrZSBzbm9vcCwgaW52aXMgZXRjLiA6KQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzZXQgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3YzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNldApAQCAtMCwwICsxLDE1IEBACitTWU5PUFNJUworICAgICAgeHNldCBbJDxuYW1lPj08b2JqZWN0Pl0KKworREVTQ1JJUFRJT04KKyAgICAgIFdpdGhvdXQgYW4gYXJndW1lbnQgYWxsIGN1cnJlbnQgdmFyaWFibGUgc2V0dGluZ3Mgd2lsbCBiZSBzaG93biBhbmQKKyAgICAgIGRlc3RydWN0ZWQgb2JqZWN0cyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgdmFyaWFibGVzLgorICAgICAgV2l0aCBhcmd1bWVudCB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlIHdpbGwgYmUgc2V0LgorCitFWEFNUExFUworICAgICAgeHNldCAkZGVlcD1kZWVwdGhvdWdodAorICAgICAgeHNldCAkeHRvb2w9JG1lLnh0b29sCisgICAgICB4c2V0ICRnb2Q9JGRlZXAKKyAgICAgIHhzZXQgJGxhc3RfcmVzdWx0PSRyZXN1bHQKKyAgICAgIHhzZXQgJDM9XiQxLjMKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2ggYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzc3OTkyCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2gKQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVMKKyAgICAgIHhzaCA8ZmlsZW5hbWU+CisKK0RFU0NSSVBUSU9OCisgICAgICBSZWFkIGluIGEgZmlsZSBhbmQgZXhlY3V0ZSBlYWNoIGxpbmUgb2YgaXQgYXMgYSBjb21tYW5kIGdpdmVuIGZyb20gdGhlCisgICAgICBrZXlib2FyZC4KKworRVhBTVBMRQorICAgICAgeHNoIH4vc2V0dXAueHNoCisgICAgICBFeGVjdXRlIHRoZSBmaWxlICJ+L3NldHVwLnhzaCIuIFRoaXMgd2F5IHlvdSBjYW4gc2V0IHVwIHlvdXIgYWxpYXNlcyBvcgorICAgICAgb3RoZXIgcGFyYW1ldGVycyBmb3Igb3RoZXIgdG9vbHMgaWYgdGhlIHNldHRpbmcgZ29uZSBsb3N0LgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzb3J0IGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c29ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVhMmRhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c29ydApAQCAtMCwwICsxLDExIEBACitTWU5PUFNJUworICAgICAgeHNvcnQgWy1yXSA8ZmlsZT4KKwkgIG9yCisJICB4c29ydCBbLXJdICAgICh3aGVuIHJlYWRpbmcgZnJvbSBhIHBpcGUpCisKK0RFU0NSSVBUSU9OCisgICAgICB4c29ydCBzb3J0IGFsbCBsaW5lcyBvZiBhIGdpdmVuIGZpbGUgaW4gaW5jcmVhc2luZy9kZWNyZWFzaW5nIG9yZGVyLgorCSAgSWYgbm8gZmlsZSBpcyBnaXZlbiBpdCByZWFkcyBmcm9tIGEgcGlwZS4KKworRVhBTVBMRVMKKyAgICAgIHhzb3J0IC1yIHdvcmtyb29tLmMgc29ydHMgYWxsIGxpbmVzIG9mIHdvcmtyb29tLmMgaW4gcmV2ZXJzZSBvcmRlci4KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRhaWwgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0YWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzIzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0YWlsCkBAIC0wLDAgKzEsMTIgQEAKK1NZTk9QU0lTCisgICAgICB4dGFpbCA8LXwrIz4gPGZpbGU+CisJICBvcgorCSAgeHRhaWwgPC18KyM+ICAgICh3aGVuIHJlYWRpbmcgZnJvbSBhIHBpcGUpCisKK0RFU0NSSVBUSU9OCisgICAgICB4dGFpbCBwcmludHMgdGhlIGxhc3QgcGFydCBvZiBhIGdpdmVuIGZpbGU7IEl0IHJlYWRzIGZyb20gYSBwaXBlCisJICBpZiBubyBmaWxlIGlzIGdpdmVuLgorCitFWEFNUExFUworICAgICAgeHRhaWwgLTEwIHdvcmtyb29tLmMgcHJpbnRzIHRoZSBsYXN0IDEwIGxpbmVzIG9mIHRoZSBmaWxlIHdvcmtyb29tLmMuCisJICB4dGFpbCArMTAgd29ya3Jvb20uYyBwcmludHMgYWxsIGxpbmVzIG9mIHdvcmtyb29tLmMgYmVnaW5uaW5nIGF0IGxpbmUgMTAuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0b29sIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dG9vbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQwNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dG9vbApAQCAtMCwwICsxLDQ1IEBACitTWU5PUFNJUworICAgICAgeHRvb2wgW3VwZGF0ZXxoZWFydD08b258b2ZmPnxmaXJzdD08b258b2ZmPnxwcm90ZWN0PTxvbnxvZmY+fAorCSAgICAgaW52Y2hlY2s9PG9ufG9mZj58ZW52Y2hlY2s9PG9ufG9mZj58bmRjaGVjaz08b258b2ZmPnwKKwkgICAgIHZhcmNoZWNrPTxvbnxvZmY+fHNob3J0PTxvbnxvZmY+fGVjaG89PG9ufG9mZj58CisJICAgICBtb3JlPTxhbW91bnQ+fGtpbGx8bmV3c3xzYXZlfGxvYWR8cmVzZXRdCisKK0RFU0NSSVBUSU9OCisgICAgICBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgc29tZSB0b29sLXNwZWNpZmljIGJlaGF2aW91cnMuCisgICAgICAtICJ1cGRhdGUiIGNsb25lcyBhIG5ldyBYdG9vbCBhbmQgZGVzdHJ1Y3RzIHRoZSBvbGQgb25lLiBUaGlzIHNob3VsZAorICAgICAgICBvbmx5IGJlIGRvbmUgd2hlbiB3b3JraW5nIG9uIHRoZSBzb3VyY2Ugb2YgdGhlIHRvb2wgYW5kIHRvIGdldCBhIGZhc3QKKyAgICAgICAgdXBkYXRlLiBTZXR0aW5ncyBhbmQgYWxpYXNlcyB3aWxsIGJlIHJlYWNoZWQgdGhyb3VnaCB0aGUgbmV3IGNsb25lLgorICAgICAgLSAiaGVhcnQ9PG9ufG9mZj4iIHR1cm5zIHRoZSBoZWFydCBiZWF0IG9mIHRoZSB0b29sIG9uIG9yIG9mZi4KKyAgICAgICAgVGhlIGhlYXJ0IGJlYXQgaXMgZm9yIGEgaGlnaGVyIHNlY3VyaXR5IGFuZCB0byBrZWVwIHRoZSBvdGhlciBjaGVja3MKKyAgICAgICAgcnVubmluZy4gSWYgeW91IGp1c3Qgd2FudCB0byB1c2UgdGhlIFh0b29sIGFzIGEgcGFzc2l2ZSB0b29sIHdpdGhvdXQKKyAgICAgICAgYW55IGNoZWNrcyB0aGVuIHR1cm4gdGhlIGhlYXJ0IGJlYXQgb2ZmLgorICAgICAgLSAiZmlyc3Q9PG9ufG9mZj4iIHR1cm5zIHRoZSBhdXRvbWF0aWMgbW92aW5nIGludG8gdGhlIHBvbGUgcG9zaXRpb24KKyAgICAgICAgb2YgeW91ciBpbnZlbnRvcnkgb24gb3Igb2ZmLiBUdXJuaW5nIGl0IG9mZiwgYXZvaWRzIHN0cnVnZ2xlIHdpdGgKKyAgICAgICAgb3RoZXIgdG9vbHMgd2hpY2ggYmVoYXZlIHNhbWUsIGJ1dCBhbHNvIHJlZHVjZXMgc2VjdXJpdHkuIFRoZSBoaXN0b3J5CisgICAgICAgIG1lY2hhbmlzbSB3aWxsIGFsc28gY2FwdHVyZSB0aGUgbGVzcyBjb21tYW5kcy4KKyAgICAgIC0gInByb3RlY3Q9PG9ufG9mZj4iIHR1cm5zIG9uL29mZiB0aGUgcHJvdGVjdGlvbiBtb2RlIG9mIHRoZSBYdG9vbC4KKyAgICAgICAgSXQgd2lsbCBwcm90ZWN0IHlvdSBmcm9tIGZvcmNlcyBvZiBvdGhlciB3aXphcmRzIGFuZCBvZiBwbGF5ZXIgb2JqZWN0cworICAgICAgICB3aGljaCB0cnkgdG8gbW92ZSBpbnRvIHlvdXIgaW52ZW50b3J5LgorICAgICAgLSAiaW52Y2hlY2s9PG9ufG9mZj4iIHR1cm5zIHRoZSBhdXRvbWF0aWMgY2hlY2sgb2YgeW91ciBpbnZlbnRvcnkgb24gb3IKKyAgICAgICAgb2ZmLiBJZiB0dXJuZWQgb24sIGFsbCBuZXcgb2JqZWN0cyBpbiB5b3VyIGludmVudG9yeSB3aWxsIGJlIHJlcG9ydGVkLgorICAgICAgLSAiZW52Y2hlY2s9PG9ufG9mZj4iIGxpa2UgImludmNoZWNrIiBidXQgY2hlY2tzIHlvdXIgZW52aXJvbm1lbnQsIHRoZQorICAgICAgICBjb250ZW50IG9mIHRoZSBjdXJyZW50IHJvb20uCisgICAgICAtICJuZGNoZWNrPTxvbnxvZmY+IiBzZXRzIHRoZSBuZXRkZWFkY2hlY2tpbmcgbW9kZSBvZiB0aGUgWHRvb2wuCisgICAgICAtICJzaG9ydD08b258b2ZmPiIgdHVybnMgZGlzcGxheWluZyBvZiBzaG9ydCBkZXNjcmlwdGlvbnMgb24gb3Igb2ZmLgorICAgICAgICBUaGlzIGlzIHRvIGF2b2lkIHRvIGdldCBvbiBvdGhlciB3aXphcmRzIG5lcnZlcywgd2hlbiB0aGV5IGhhdmUgYSB0b29sCisgICAgICAgIHRoYXQgbm90aWZpZXMgaW52ZW50b3J5IGNoZWNrcyAobGlrZSB0aGlzIHRvb2wgZG9lcyA6KS4gQnV0IHRoZSBtYWluCisgICAgICAgIHJlYXNvbiBpcyB0byBjb3BlIHdpdGggYmFkIHNob3J0IGRlc2NyaXB0aW9ucyBvZiBvYmplY3RzLiBGb3IKKyAgICAgICAgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byBkZXN0cnVjdCBpdCBhIGJ1ZyBpbiB0aGUgc2hvcnQgZGVzYy4gd291bGQKKyAgICAgICAgbWFrZSBpdCBuZWFybHkgaW1wb3NzaWJsZSB0byBkbyBzby4KKyAgICAgIC0gIm1vcmU9PGFtb3VudD4iIHNldHMgdGhlIGFtb3VudCBvZiBsaW5lcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGF0IG9uZQorICAgICAgICB0aW1lIHdpdGggdGhlIHhtb3JlIGNvbW1hbmQuIFdpbGwgYmUgcmVtb3ZlZCBzb29uIGJlY2F1c2UgdGhlcmUgaXMgYQorICAgICAgICBwbGF5ZXIgcHJvcGVydHkgY2FsbGVkIFBfUEFHRVNJWkUgdG8gdGFrZSBjYXJlIG9mIGl0LgorICAgICAgLSAiZWNobz08b258b2ZmPiIgdHVybnMgdGhlIGVjaG9pbmcgb2YgY29tbWFuZHMgZXhlY3V0ZWQgdmlhIGFsaWFzLAorICAgICAgICBoaXN0b3J5IG9yIG11bHRpcGxlIGNvbW1hbmQgZXhlY3V0aW9uIG9uIG9yIG9mZi4KKyAgICAgIC0gImtpbGwiIGRlc3RydWN0cyB0aGUgWHRvb2wgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgYXV0b2xvYWQgbGlzdC4KKyAgICAgIC0gIm5ld3MiIHNob3cgdGhlIG5ld3MgYW5kIGNoYW5nZXMgb2YgdGhlIFh0b29sLgorICAgICAgLSAic2F2ZSIgc2F2ZXMgdGhlIHNldHRpbmdzIG9mIHRoZSBYdG9vbCBpbmNsdWRpbmcgdGhlIGFsaWFzZXMgaW50byBhCisgICAgICAgIGZpbGUuCisgICAgICAtICJsb2FkIiByZXN0b3JlcyB0aGUgc2F2ZWQgc2V0dGluZ3MgZnJvbSB0aGUgc2F2ZSBmaWxlLgorICAgICAgLSAicmVzZXQiIHJlc2V0cyB0aGUgWHRvb2wuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRyYWNlIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dHJhY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwNWU5NAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRyYWNlCkBAIC0wLDAgKzEsMTQgQEAKK1NZTk9QU0lTCisgICAgICB4dHJhY2UgPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIFRyYWNlIGFsbCBmdW5jdGlvbiBjYWxscyB3aXRoIGFyZ3VtZW50cyBhbmQgdGhlaXIgcmV0dXJuIHZhbHVlcyBvZgorICAgICAgdGhlIHNwZWNpZmllZCBvYmplY3QuIFdpdGhvdXQgYW55IGFyZ3VtZW50IHR1cm5zIHRoZSB0cmFjaW5nIG9mZiBhZ2Fpbi4KKworRVhBTVBMRQorICAgICAgeHRyYWNlICRtZS5idWdneXRoaW5nCisgICAgICBMZXRzIGRlYnVnIGFuIGJ1Z2d5IG9iamVjdC4KKworICAgICAgeHRyYWNlCisgICAgICBUdXJuIGRlYnVnZ2luZyBvZmYuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRyYW5zIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dHJhbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1NmQwYQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRyYW5zCkBAIC0wLDAgKzEsNiBAQAorU1lOT1BTSVMKKyAgICAgIHh0cmFucyA8cGxheWVyPgorCitERVNDUklQVElPTgorICAgICAgVGVsZXBvcnQgPHBsYXllcj4gdG8geW91LgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h1Y2xvbmUgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h1Y2xvbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxYzgyNQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHVjbG9uZQpAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworICAgICAgeHVjbG9uZSA8ZmlsZW5hbWU+CisKK0RFU0NSSVBUSU9OCisgICAgICBVcGRhdGVzICYgQ2xvbmVzIGFuIG9iamVjdC4gT24gZXJyb3IsIHRoZSBlcnJvciBsb2cgZmlsZSB3aWxsIGJlCisgICAgICBwcmludGVkLiBNb3ZlcyB0aGUgb2JqZWN0IChpZiBwb3NzaWJsZSkgaW50byB5b3VyIGludmVudG9yeS4gSWYgdGhlCisgICAgICBvYmplY3QgaGFzIGJlZW4gY2xvbmVkIHN1Y2Nlc3NmdWxseSwgdGhlIHZhcmlhYmxlICIkY2xvbmUiIHdpbGwgYmUgc2V0LAorICAgICAgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGxvc2UgdGhlIG9iamVjdCBvdXQgb2Ygc2lnaHQgOikKKworRVhBTVBMRQorICAgICAgeHVjbG9uZSAvc3RkL3RoaW5nCisgICAgICB4Y2FsbCAkY2xvbmUtPlNldFNob3J0KCJhIEJJRyB0aGluZyEiKTsKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dXBkYXRlIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dXBkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjY1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h1cGRhdGUKQEAgLTAsMCArMSwxMCBAQAorU1lOT1BTSVMKKyAgICAgIHh1cGRhdGUgPGZpbGVuYW1lPgorCitERVNDUklQVElPTgorICAgICBVcGRhdGUgYW4gb2JqZWN0IGJ5IGZpcnN0IGNhbGxpbmcgdGhlIGxmdW4gInJlbW92ZSgpIiBvZiBpdCBhbmQgd2hlbgorICAgICBpdCBzdGlsbCBleGlzdHMgZGVzdHJ1Y3QgaXQuCisKK0VYQU1QTEUKKyAgICAgeHVwZGF0ZSBvYmovYmx1Yi5jCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHdjIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94d2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExMzE0NwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHdjCkBAIC0wLDAgKzEsMjIgQEAKK1NZTk9QU0lTCisgICAgICB4d2MgWy1jbHddIDxmaWxlPgorCSAgb3IKKwkgIHh3YyBbLWNsd10gICAgKHdoZW4gcmVhZGluZyBmcm9tIGEgcGlwZSkKKworREVTQ1JJUFRJT04KKyAgICAgIHh3YyBjb3VudHMgdGhlIG51bWJlciBvZiBieXRlcywgd2hpdGVzcGFjZS1zZXBhcmF0ZWQgd29yZHMsIGFuZCBuZXctCisgICAgICBsaW5lcyBpbiBhIGdpdmVuIGZpbGUsIG9yIHJlYWRpbmcgZnJvbSBhIHBpcGUuIEl0IHByaW50cyBvbmUgbGluZQorICAgICAgb2YgY291bnRzLCBhbmQgaWYgdGhlIGZpbGUgbmFtZSB3YXMgZ2l2ZW4gYXMgYW4gYXJndW1lbnQsIGl0IHByaW50cworICAgICAgdGhlIGZpbGVuYW1lIGZvbGxvd2luZyB0aGUgY291bnRzLiBUaGUgY291bnRzIGFyZSBwcmludGVkIGluIHRoZQorICAgICAgb3JkZXI6IGxpbmVzLCB3b3JkcywgYnl0ZXMuCisgICAgICBCeSBkZWZhdWx0LCB3YyBwcmludHMgYWxsIHRocmVlIGNvdW50cy4KKworT1BUSU9OUzoKKyAgICAgIC1jIHByaW50IGNoYXJhY3RlciBjb3VudAorCisgICAgICAtbCBwcmludCBsaW5lIGNvdW50CisKKyAgICAgIC13IHByaW50IHdvcmQgY291bnQKKyAgICAgIAorRVhBTVBMRVMKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94d2hvIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94d2hvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWZiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h3aG8KQEAgLTAsMCArMSwxNyBAQAorU1lOT1BTSVMKKyAgICAgIHh3aG8gW21haWx8aXB8cmFjZXxndWlsZHxkb21haW58c3RhdHN8Y21kYXZnXQorCitERVNDUklQVElPTgorICAgICAgV2l0aG91dCBhbnkgYXJndW1lbnQgdGhpcyBjb21tYW5kIGJlaGF2ZXMgbGlrZSB0aGUgbm9ybWFsIHBlb3BsZQorICAgICAgY29tbWFuZC4gV2l0aCB0aGUgYXJndW1lbnQgIm1haWwiIGl0IHdpbGwgbGlzdCBhbGwgcGxheWVycyB3aXRoIHRoZWlyCisgICAgICBlbWFpbCBhZGRyZXNzLiBXaXRoIHRoZSBhcmd1bWVudCAiaXAiIGl0IHdpbGwgbGlzdCBhbGwgcGxheWVycyB3aXRoCisgICAgICB0aGVpciBob3N0IG5hbWUgYW5kIGlwIG51bWJlci4gSWYgdGhlIGFyZ3VtZW50IGlzICJyYWNlIiBvciAiZ3VpbGQiCisgICAgICB5b3Ugd2lsbCBnZXQgYSBsaXN0IG9mIGFsbCBwbGF5ZXJzIHdpdGggdGhlc2UgYXR0cmlidXRlcy4gImRvbWFpbiIKKyAgICAgIHdpbGwgc2hvdyB0aGUgZG9tYWluKHMpIG9mIHRoZSBjdXJyZW50IHBsYXllcnMuIEFuZCB3aXRoICJzdGF0cyIgaXQKKyAgICAgIHdpbGwgcHJpbnQgc29tZSBzdGF0cyBpbmZvcm1hdGlvbiBvZiBhbGwgcGxheWVycy4KKyAgICAgIFRoZSBhcmd1bWVudCAiY21kYXZnIiBsaXN0IHRoZSB2YWx1ZSBvZiBfcXVlcnlfY29tbWFuZF9hdmVyYWdlKCkKKyAgICAgIGZvciBldmVyeSB1c2VyIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyLgorCitFWEFNUExFUworICAgICAgeHdobworICAgICAgeHdobyBpcApkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL2NwdWluZm8gYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvY3B1aW5mbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40YWU3ZDdlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL2NwdWluZm8KQEAgLTAsMCArMSBAQAorL3Byb2MvY3B1aW5mbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvcHJvYy9sb2FkYXZnIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL2xvYWRhdmcKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTY5ODNmNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvcHJvYy9sb2FkYXZnCkBAIC0wLDAgKzEgQEAKKy9wcm9jL2xvYWRhdmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Byb2MvbWVtaW5mbyBiL29iai90b29scy9NR3Rvb2wvcHJvYy9tZW1pbmZvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjMzOGI1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvbWVtaW5mbwpAQCAtMCwwICsxIEBACisvcHJvYy9tZW1pbmZvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL3VwdGltZSBiL29iai90b29scy9NR3Rvb2wvcHJvYy91cHRpbWUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjc3MmE4ZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvcHJvYy91cHRpbWUKQEAgLTAsMCArMSBAQAorL3Byb2MvdXB0aW1lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL3ZlcnNpb24gYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iMTdhZjFlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL3ZlcnNpb24KQEAgLTAsMCArMSBAQAorL3Byb2MvdmVyc2lvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvcHJvZi5oIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkY2ViZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvcHJvZi5oCkBAIC0wLDAgKzEsNDIgQEAKK3ByaXZhdGUgbWl4ZWQgX190bV9fPSh7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSk7Citwcml2YXRlIG1peGVkIF9feHRtX189KHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9KTsKK3ByaXZhdGUgbWl4ZWQgIF9fZWNfXz0oezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0pOworcHJpdmF0ZSBtaXhlZCAgX194ZWNfXz0oezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0pOworcHJpdmF0ZSBpbnQgX19sZXZlbF9fOworcHJpdmF0ZSBtYXBwaW5nIF9fZGF0YV9fID0gKFtdKTsKK19fcXVlcnlfeHByb2ZfZGF0YV9fKCkgeyByZXR1cm4gX19kYXRhX187IH0KKyNkZWZpbmUgVTJUKHJ1KSAoKChydSlbMF0rKHJ1KVsxXSkqMTApCisjZGVmaW5lIEVDMSA0MAorI2RlZmluZSBFQzIgMjIKKyNkZWZpbmUgRUMzIDE1MAorI2RlZmluZSBUTTEgMAorI2RlZmluZSBUTTIgMAorI2RlZmluZSBUTTMgMAorI2RlZmluZSBGKGZ1bmMsbmFtZSxhcmdzKSBmdW5jIGFyZ3MgeyBcCisgIG1peGVkICpfX2R0X18sICpfX3J1X18sIF9fcmVfXzsgXAorICBpbnQgX190X187IFwKKyAgaWYoIV9fZGF0YV9fKSByZXR1cm4gOjogZnVuYyBhcmdzOyBcCisgIF9fcnVfXz1ydXNhZ2UoKTsgXAorICBfX3RtX19bX19sZXZlbF9fXT0oX190X189VTJUKF9fcnVfXykpPDA/MDpfX3RfXzsgXAorICBfX3h0bV9fW19fbGV2ZWxfX109VE0xOyBfX3RtX19bX19sZXZlbF9fKzFdPTA7IFwKKyAgX19lY19fW19fbGV2ZWxfX109Z2V0X2V2YWxfY29zdCgpOyBcCisgIF9feGVjX19bX19sZXZlbF9fXT1FQzE7IF9fZWNfX1tfX2xldmVsX18rMV09MDsgXAorICBfX2xldmVsX18rKzsgX19yZV9fID0gOjogZnVuYyBhcmdzOyBfX2xldmVsX18tLTsgXAorICBpZighKF9fZHRfXz1fX2RhdGFfX1tuYW1lXSkpIHsgXAorICAgIF9fZHRfXz1fX2RhdGFfX1tuYW1lXT0oezAsMCwwLDAsMH0pOyBcCisgICAgX194dG1fX1tfX2xldmVsX19dKz1UTTI7IF9feGVjX19bX19sZXZlbF9fXSs9RUMyOyBcCisgIH0gXAorICBfX2VjX19bX19sZXZlbF9fXS09Z2V0X2V2YWxfY29zdCgpK19feGVjX19bX19sZXZlbF9fXTsgXAorICBfX3J1X189cnVzYWdlKCk7IFwKKyAgX190X189KF9fdF9fPVUyVChfX3J1X18pKTwwPzA6X190X187IFwKKyAgX190bV9fW19fbGV2ZWxfX109X190X18tX190bV9fW19fbGV2ZWxfX10tX194dG1fX1tfX2xldmVsX19dOyBcCisgIF9fZHRfX1swXSsrOyBcCisgIF9fZHRfX1sxXSs9X19lY19fW19fbGV2ZWxfX10tX19lY19fW19fbGV2ZWxfXysxXTsgXAorICBfX2R0X19bMl0rPV9fdG1fX1tfX2xldmVsX19dLV9fdG1fX1tfX2xldmVsX18rMV07IFwKKyAgX19kdF9fWzNdKz1fX2VjX19bX19sZXZlbF9fXTsgX19kdF9fWzRdKz1fX3RtX19bX19sZXZlbF9fXTsgXAorICBpZihfX2xldmVsX18+MCkgeyBcCisgICAgX194ZWNfX1tfX2xldmVsX18tMV0rPV9feGVjX19bX19sZXZlbF9fXStFQzM7IFwKKyAgICBfX3h0bV9fW19fbGV2ZWxfXy0xXSs9X194dG1fX1tfX2xldmVsX19dK1RNMzsgXAorICB9IFwKKyAgcmV0dXJuIF9fcmVfXzsgXAorfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC90b29sLmRvYyBiL29iai90b29scy9NR3Rvb2wvdG9vbC5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0NzdjZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvdG9vbC5kb2MKQEAgLTAsMCArMSwxMDEgQEAKK0NPTU1BTkRTOgorICAgIHhjYWxsICAgICAgeGRkZXMgICAgICB4Zm9yYWxsICAgIHhpZHMgICAgICAgeG1hbiAgICAgICB4c2NhbiAgICAgIHh0cmFjZQorICAgIHhjYWxsb3V0cyAgeGRlcyAgICAgICB4Z290byAgICAgIHhpbmhlcml0ICAgeG1vcmUgICAgICB4c2V0ICAgICAgIHh0cmFucworICAgIHhjbGVhbiAgICAgeGRsb29rICAgICB4Z3JlcCAgICAgIHhsYWcgICAgICAgeG1vdmUgICAgICB4c2ggICAgICAgIHh1Y2xvbmUKKyAgICB4Y2xvbmUgICAgIHhkbyAgICAgICAgeGhiZWF0cyAgICB4bG9hZCAgICAgIHhtc2cgICAgICAgeHNvcnQgICAgICB4dXBkYXRlCisgICAgeGRiZyAgICAgICB4ZHVwZGF0ZSAgIHhoZWFkICAgICAgeGxvb2sgICAgICB4bXRwICAgICAgIHh0YWlsICAgICAgeHdjCisgICAgeGRjbGVhbiAgICB4ZXZhbCAgICAgIHhoZWxwICAgICAgeGxwYyAgICAgICB4cHJvcHMgICAgIHh0b29sICAgICAgeHdobworCisKK0dpdmUgYSAiPyIgYXMgc2luZ2xlIGFyZ3VtZW50IHRvIGdldCB0aGUgY29tbWFuZCB1c2FnZSBvciBkbyAieG1hbiA8Y29tbWFuZD4iCitmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbW1hbmQuCisKK1FVSUNLVFlQRVI6CisgICBUaGUgTUd0b29sIGNvbnRhaW5zIGEgZnVsbCBxdWlja3R5cGluZyB0b29sLiBJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCisgICBmZWF0dXJlczoKKworICAgICAgLSBtdWx0aXBsZSBjb21tYW5kIGV4ZWN1dGlvbiAoc2VlIHRoZSB4ZG8gYW5kIHhmb3JhbGwgY29tbWFuZCkKKyAgICAgIC0gc2NyaXB0IGZpbGVzICAgICAgICAgICAgICAgKHNlZSB0aGUgeHNoIGNvbW1hbmQpCisgICAgICAtIGNvbW1hbmQgcGlwZWxpbmluZworICAgICAgLSBjb21tYW5kIGhpc3RvcnkKKworICAgVGhlIGNvbW1hbmQgaGlzdG9yeSBzdG9yZXMgKG5lYXJseSkgZWFjaCBjb21tYW5kIHlvdSB0eXBlIGluIGFuZCBsZXRzIHlvdQorICAgcmUtZXhlY3V0ZSBpdC4KKworICAgICAgLSAlISAgICAgICAgc2hvdyB0aGUgY29tbWFuZCBoaXN0b3J5CisgICAgICAtICUlICAgICAgICByZS1leGVjdXRlIHRoZSBsYXN0IGNvbW1hbmQKKyAgICAgIC0gXm9sZF5uZXcgIHJlLWV4ZWN1dGUgdGhlIGxhc3QgY29tbWFuZCBidXQgcmVwbGFjZSBhbGwgb2NjdXJlbmNpZXMgb2YKKyAgICAgICAgICAgICAgICAgIHRoZSAib2xkIiBzdHJpbmcgb2YgdGhlIGNvbW1hbmQgYnkgIm5ldyIuCisgICAgICAtICVudW0gICAgICByZS1leGVjdXRlIHRoZSBjb21tYW5kIGF0IHBvc2l0aW9uIG51bSBvZiB0aGUgaGlzdG9yeQorICAgICAgLSAlc3RyICAgICAgcmUtZXhlY3V0ZSB0aGUgbGFzdCBjb21tYW5kIGJlZ2lubmluZyB3aXRoIHRoZSBzdHJpbmcgInN0ciIKKworCitDT01NQU5EIEFSR1VNRU5UUzoKKyAgIE1vc3QgY29tbWFuZHMgbmVlZCBmaWxlbmFtZXMgb3Igb2JqZWN0cyBhcyBhcmd1bWVudC4gVGhlIHdheSBvYmplY3RzIGFyZQorICAgc3BlY2lmaWVkIHdpbGwgYmUgZGVzY3JpcGVkIGluIHRoZSBmb2xsb3dpbmcuCisKKyAgICAgIC0gYW4gb2JqZWN0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBieSBpdHMgdW5pcXVlIG9iamVjdCBuYW1lCisgICAgICAtIGEgcGxheWVyIGNhbiBiZSBhY2Nlc3NlZCBieSBpdHMgcGxheWVyIG5hbWUKKyAgICAgIC0gYSBsaXZpbmcgY2FuIGJlIGFjY2Vzc2VkIGJ5IGl0cyBsaXZpbmcgbmFtZQorICAgICAgLSBhIG9iamVjdCBpbnNpZGUgdGhlIGN1cnJlbnQgcm9vbSBieSBpdHMgaWQKKyAgICAgIC0gYSBvYmplY3QgaW5zaWRlIHRoZSBjdXJyZW50IHJvb20gYnkgaXRzIHBvc2l0aW9uCisKKyAgIElmIHRoZSBvYmplY3QgY2FuIG5vdCBiZSBhY2Nlc3NlZCBieSB0aGUgYWJvdmUgbWVudGlvbmVkIHdheXMgeW91IGNhbiBhbHNvCisgICB1c2UgdGhlIGZvbGxvd2luZyBvYmplY3QgbW9kaWZpZXJzOgorCisgICAgICBeb2JqICAgICAgICAgc3RhbmRzIGZvciB0aGUgZW52aXJvbm1lbnQgb2YgYW4gb2JqZWN0CisgICAgICBvYmoxLm9iajIgICAgc3RhbmRzIGZvciBhbiBvYmplY3Qgb2JqMiBpbnNpZGUgYW5vdGhlciBvYmplY3Qgb2JqMQorICAgICAgCisgIFRoZXNlIG1vZGlmaWVycyBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyIHdoZXJlIHRoZSAiXiIgaGFzIGEgaGlnaGVyCisgIHByaW9yaXR5IHRoYW4gdGhlICIuIi4gVGhpcyBhbGxvd3MgeW91IHRvIGFjY2VzcyBhbiBvYmplY3QgZnJvbSBhbm90aGVyIGtub3cKKyAgb2JqZWN0LgorCisgIE5vdyBzb21lIGV4YW1wbGVzIHdoaWNoIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoaXMgYWNjZXNzaW5nIG1lY2hhbmlzbS4KKyAgVGhlcmVmb3JlIHdlIHVzZSB0aGUgY29tbWFuZCAieGxvb2siIHdoaWNoIHByaW50cyB0aGUgc2hvcnQgYW5kIGxvbmcKKyAgZGVzY3JpcHRpb24gYW5kIGFsc28gdGhlIGNvbnRlbnQgb2YgYW4gb2JqZWN0OgorCisgICAxLiB4bG9vayBkZWVwdGhvdWdodAorICAgICAgTG9vayBhdCBEZWVwdGhvdWdodC4KKyAgIDIuIHhsb29rIF5kZWVwdGhvdWdodAorICAgICAgTG9vayBhdCB0aGUgcm9vbSBEZWVwdGhvdWdodCBpcyBpbi4KKyAgIDMuIHhsb29rIGRlZXB0aG91Z2h0LmJhZworICAgICAgTG9vayBhdCB0aGUgYmFnIG9mIERlZXB0aG91Z2h0LgorICAgNC4geGxvb2sgZGVlcHRob3VnaHQuYmFnLmJhZworICAgICAgTG9vayBhdCB0aGUgYmFnIGluc2lkZSBEZWVwcyBiYWcuCisgICA0LiB4bG9vayBkZWVwdGhvdWdodC41CisgICAgICBMb29rIGF0IHRoZSBmaWZ0aCBvYmplY3Qgb2YgRGVlcHMgaW52ZW50b3J5LgorICAgNS4geGxvb2sgL3N0ZC90aGluZyMxMjMKKyAgICAgIExvb2sgYXQgdGhlIG9iamVjdCB3aXRoIHRoZSB1bmlxdWUgb2JqZWN0IG5hbWUgIi9zdGQvdGhpbmcjMTIzIi4KKyAgIDYuIHhsb29rIDEKKyAgICAgIExvb2sgYXQgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgY3VycmVudCByb29tLgorICAgNy4geGxvb2sgMS4yLjMKKyAgICAgIExvb2sgYXQgdGhlIHRoaXJkIG9mIHRoZSBzZWNvbmQgb2YgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgcm9vbS4KKworICBJZiB0aGUgbmFtZSBvZiBhbiBvYmplY3QgY29udGFpbnMgYW4gb2JqZWN0IG1vZGlmaWVyIGFzIGEgY2hhcmFjdGVyIHRoZW4gaXQKKyAgY2FuIGJlIGVzY2FwZWQgYnkgYSAiXCIuIEEgIlwiIGlzIGVzY2FwZWQgYnkgaXRzZWxmLiBUaGlzIGlzIGJlY2F1c2UgZmlsZQorICBuYW1lcyBvZnRlbiBjb250YWluIHRoZSAiLiIgZm9yIGZpbGUgZXh0ZW5zaW9ucy4gU28gaWYgeW91IHdhbnQgdG8gYWNjZXNzCisgIGRpcmVjdGx5IGFuIG9iamVjdCB3aXRoIGZvciBleGFtcGxlIHN1Y2ggYSBuYW1lICJmaWxlLm9sZC5idWxiIiB5b3UgaGF2ZSB0bworICB3cml0ZSAiZmlsZVwub2xkXC5ibHViIi4KKyAgICAKKyAgSWYgYSBjb21tYW5kIG5lZWRzIGEgZmlsZSBhcyBhcmd1bWVudCB5b3UgY2FuIHVzZSB0aGUgZmlsZW5hbWUgb2YgYW4gb2JqZWN0CisgIGZvciBpdCBieSBwbGFjaW5nIGFuICJAIiBpbmZyb250IG9mIHRoZSBvYmplY3QuIFRoaXMgd2F5IHlvdSBjYW4gY2xvbmUKKyAgYW4gb2JqZWN0IGJ5IHVzaW5nIGFub3RoZXIgY2xvbmU6CisKKyAgICAgeGNsb25lIEBoYXJyeS5iYWcuY2FuZGxlcworICAgICBDbG9uZSBzb21lIGNhbmRsZXMgb2YgdGhlIGtpbmQgSGFycnkgaXMgY2FycnlpbmcgaW4gaGlzIGJhZy4KKworCitBUkdVTUVOVCBWQVJJQUJMRVM6CisgICBXaGVuZXZlciBhbiBvYmplY3Qgb3IgYSBmaWxlbmFtZSBpcyBuZWVkZWQsIHdlIGNhbiB1c2UgdmFyaWFibGVzLgorICAgQSB2YXJpYWJsZSBhbGx3YXlzIHN0YXJ0cyB3aXRoIGEgIiQiIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIHdoaWNoCisgICBpZGVudGlmaWNhdGVzIGl0LiBUd28gdmFyaWFibGUgbmFtZXMgYXJlIHJlc2VydmVkIGZvciBzcGVjaWFsIHB1cnBvc2UuCisgICBUaGUgZmlyc3QsICIkbWUiIGlzIGFsd2F5cyBzZXQgdG8gdGhlIG9uZSB3aG8gb3ducyB0aGUgWHRvb2wuIFRoZSBvdGhlciwKKyAgICIkaGVyZSIgcmVwcmVzZW50cyB0aGUgY3VycmVudCByb29tLgorCisgICAoSW5zdGVhZCBvZiAiJG1lIiBhbmQgIiRoZXJlIiB5b3UgY2FuIGFsc28gdXNlICIkbSIgYW5kICIkaCIuKQorCisgICBJZiBhIGNvbW1hbmQgbmVlZHMgYSBmaWxlIGFzIGFyZ3VtZW50IGFuZCBnZXRzIGEgdmFyaWFibGUgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgaW50byB0aGUgc291cmNlIGZpbGUgb2YgdGhlIG9iamVjdC4KKyAgIChUaGlzIGlzIGRvbmUgYnkgdGFraW5nIHRoZSB1bmlxdWUgb2JqZWN0IGlkZW50aWZpZXIgYW5kIHJlcGxhY2luZyB0aGUKKyAgICIjLi4uIiBieSBhICIuYyIuKQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Rvb2wuaCBiL29iai90b29scy9NR3Rvb2wvdG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZmYyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2wuaApAQCAtMCwwICsxLDI0NiBAQAorI2lmbmRlZiBfX1RPT0xfSF9fCisjZGVmaW5lIF9fVE9PTF9IX18KKworLyoKKyAqIE1HdG9vbC0xLjMKKyAqIEZpbGU6IHRvb2wuaAorICogTWFpbnRhaW5lcjogS2lya0BNb3JnZW5HcmF1ZW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgb3JpZ2luYWwgWHRvb2wgaXMgY29weXJpZ2h0ZWQgYnkgSHlwICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgTUFTVEVSCisjZGVmaW5lIE1BU1RFUiBfX01BU1RFUl9PQkpFQ1RfXworI2VuZGlmCisKKyNkZWZpbmUgVk9JRCAiL3Jvb20vdm9pZCIKKworI2RlZmluZSBOVUxMICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIEZBTFNFICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVFJVRSAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBFUlJPUiAgICAgICAgICAgICAgKC0xKQorI2RlZmluZSBQUkVWICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkKKyNkZWZpbmUgVFAgICAgICAgICAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKKyNkZWZpbmUgUlRQICAgICAgICAgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBUT09MX05BTUUgICAgICAgICAgIk1HdG9vbCIKKyNkZWZpbmUgVE9PTF9WRVJTSU9OICAgICAgICIxLjMuMyIKKyNkZWZpbmUgVE9PTF9USVRMRSAgICAgICAgIFRPT0xfTkFNRSsiIHYiK1RPT0xfVkVSU0lPTgorI2RlZmluZSBUT09MX0lOVEVSTkFMICAgICAgIjEuMy4zLTEwLjA3Ljk3IgorCisjZGVmaW5lIFRPT0xfUEFUSCAgICAgICAgICAiL29iai90b29scy9NR3Rvb2wiCisKKyNkZWZpbmUgVE9PTF9NQU5QQUdFICAgICAgIFRPT0xfUEFUSCsiL3Rvb2wuZG9jIgorI2RlZmluZSBUT09MX05FV1MgICAgICAgICAgVE9PTF9QQVRIKyIvdG9vbC5uZXdzIgorI2RlZmluZSBUT09MX0xPRyAgICAgICAgICAgIi9sb2cveHRvb2wiCisjZGVmaW5lIFhQUk9GX01BQ1JPICAgICAgICBUT09MX1BBVEgrIi9wcm9mLmgiCisjZGVmaW5lIExBR19PX0RBRU1PTiAgICAgICAiL3AvZGFlbW9uL2xhZy1vLWRhZW1vbiIKKworI2RlZmluZSBUT09MX0xFVkVMICAgICAgICAgKDQwKQorCisjZGVmaW5lIE1PUkVfTElORVMgICAgICAgICAoMjApCisjZGVmaW5lIE1BWF9ISVNUT1JZICAgICAgICAoMjUpCisjZGVmaW5lIE1BWF9SRUNVUlNJT04gICAgICAoNikKKyNkZWZpbmUgVFJBQ0VfTEVWRUwgICAgICAgICgxfDJ8NHw4KQorI2RlZmluZSBBVVRPTE9BRF9BUkdTICAgICAgKHtUT09MX0lOVEVSTkFMLCBtb2RpLCBtb3JlbGluZXN9KQorI2RlZmluZSBFWEVDX0xJTkVTICAgICAgICAgKDEwKQorI2RlZmluZSBFWEVDX1RJTUUgICAgICAgICAgKDEpCisKKyNkZWZpbmUgSUEoeCkgICAgICAgICAgICAgIGludGVyYWN0aXZlKHgpCisjZGVmaW5lIEVOVih4KSAgICAgICAgICAgICBlbnZpcm9ubWVudCh4KQorI2RlZmluZSBMT1dFUih4KSAgICAgICAgICAgbG93ZXJfY2FzZSh4KQorI2RlZmluZSBOQU1FKHgpICAgICAgICAgICAgKChzdHJpbmcpeC0+cXVlcnlfbmFtZSgpKQorI2RlZmluZSBDTkFNRSh4KSAgICAgICAgICAgQ0FQKChzdHJpbmcpTkFNRSh4KSkKKworI2RlZmluZSBSTkFNRSh4KSAgICAgICAgICAgZ2V0dWlkKHgpCisjZGVmaW5lIENSTkFNRSh4KSAgICAgICAgICBDQVAoUk5BTUUoeCkpCisKKyNkZWZpbmUgTEVWRUwoeCkgICAgICAgICAgIHF1ZXJ5X3dpel9sZXZlbCh4KQorCisjZGVmaW5lIEZPUkFMTCh4LCB5KSAgICAgICBmb3IoeD1maXJzdF9pbnZlbnRvcnkoeSk7eDt4PW5leHRfaW52ZW50b3J5KHgpKQorI2RlZmluZSBERVNUUlVDVCh4KSAgICAgICAgRGVzdHJ1Y3QoeCkKKyNkZWZpbmUgQUxFRlQoeCx5LHopICAgICAgIHNwcmludGYoIiUtKiciK3orIidzIiwgeSwgKCIiKyh4KSlbMC4ueS0xXSkKKyNkZWZpbmUgQVJJR0hUKHgseSx6KSAgICAgIHNwcmludGYoIiUqJyIreisiJ3MiICwgeSwgKCIiKyh4KSlbMC4ueS0xXSkKKyNkZWZpbmUgVyh4KSAgICAgICAgICAgICAgIFdyaXRlKHgpCisjZGVmaW5lIFdMTih4KSAgICAgICAgICAgICBXKHgrIlxuIikKKyNkZWZpbmUgV0RMTih4KSAgICAgICAgICAgIFcoeCsiLlxuIikKKworI2RlZmluZSBNT0RFX09OKHgpICAgICAgICAgKG1vZGl8PXgpCisjZGVmaW5lIE1PREVfT0ZGKHgpICAgICAgICAobW9kaSY9fngpCisjZGVmaW5lIE1PREUoeCkgICAgICAgICAgICAobW9kaSZ4KQorI2RlZmluZSBNT0RFX0hFQVJUICAgICAgICAgKDEpCisjZGVmaW5lIE1PREVfRklSU1QgICAgICAgICAoMikKKyNkZWZpbmUgTU9ERV9QUk9URUNUICAgICAgICg0KQorI2RlZmluZSBNT0RFX0lOVkNIRUNLICAgICAgKDgpCisjZGVmaW5lIE1PREVfRU5WQ0hFQ0sgICAgICAoMTYpCisjZGVmaW5lIE1PREVfTkRDSEVDSyAgICAgICAoMzIpCisjZGVmaW5lIE1PREVfVkFSQ0hFQ0sgICAgICAoNjQpCisjZGVmaW5lIE1PREVfRUNITyAgICAgICAgICAoMTI4KQorI2RlZmluZSBNT0RFX1NIT1JUICAgICAgICAgKDI1NikKKyNkZWZpbmUgTU9ERV9TTk9PUENISyAgICAgICg1MTIpCisjZGVmaW5lIE1PREVfSU5WSVNDSEsgICAgICAoMTAyNCkKKyNkZWZpbmUgTU9ERV9TQ0FOQ0hLICAgICAgICgyMDQ4KQorCisjZGVmaW5lIEVSUl9GSUxFICAgICAgICAgICAiL3BsYXllcnMvIitSTkFNRShjbG9uZXIpKyIvLmVyciIKKyNkZWZpbmUgTFBDX0ZJTEUgICAgICAgICAgICIvcGxheWVycy8iK1JOQU1FKGNsb25lcikrIi8udG9vbC5scGMiCisjZGVmaW5lIFRNUF9GSUxFICAgICAgICAgICAiL3BsYXllcnMvIitSTkFNRShjbG9uZXIpKyIvLnRvb2wudG1wIgorI2RlZmluZSBTQVZFX0ZJTEUgICAgICAgICAgIi9wbGF5ZXJzLyIrUk5BTUUoY2xvbmVyKSsiLy50b29scmMiCisjZGVmaW5lIFhQUk9GX0ZJTEUgICAgICAgICAiL3BsYXllcnMvIitSTkFNRShjbG9uZXIpKyIvcHJvZi5jIgorI2RlZmluZSBQSVBFX0ZJTEUgICAgICAgICAgIi9wbGF5ZXJzLyIrUk5BTUUoY2xvbmVyKSsiLy50b29sLnBpcGUiCisjZGVmaW5lIFBSSVZBVEVfSEVBREVSICAgICAiL3BsYXllcnMvIitSTkFNRShjbG9uZXIpKyIvLnh0b29sLmgiCisjZGVmaW5lIFBJUEVfREVMRVRFKHgpICAgICBpZihwaXBlX291dCYmcGlwZV9vdnImJmZpbGVfc2l6ZSh4KT49MCkgcm0oeCkKKworI2RlZmluZSBQSVBFX0lOICAgICAgICAgICAgMQorI2RlZmluZSBQSVBFX09VVCAgICAgICAgICAgMgorI2RlZmluZSBQSVBFX01BWCAgICAgICAgICAgMTAwMDAKKworI2RlZmluZSBYR1JFUF9SRVZFUlQgICAgICAgMQorI2RlZmluZSBYR1JFUF9JQ0FTRSAgICAgICAgMgorCisjZGVmaW5lIFNFQ1VSRTEoKSAgICBpZighc2VjdXJpdHkoKSkgcmV0dXJuOworI2RlZmluZSBTRUNVUkUyKHgpICAgaWYoIXNlY3VyaXR5KCkpIHJldHVybiB4OworI2RlZmluZSBVU0FHRTEoeCx5KSAgbm90aWZ5X2ZhaWwoIlVzYWdlOiAiKyh5KSsiXG4iKTtcCisgICAgICAgICAgICAgICAgICAgICBpZigoeCk9PSI/IikgcmV0dXJuIEZBTFNFOworI2RlZmluZSBVU0FHRTIoeCx5KSAgbm90aWZ5X2ZhaWwoIlVzYWdlOiAiKyh5KSsiXG4iKTtcCisgICAgICAgICAgICAgICAgICAgICBpZigoISh4KSl8fCgoeCk9PSI/IikpIHJldHVybiBGQUxTRTsKKyNkZWZpbmUgVVNBR0UzKHgpICAgIHJldHVybiBXTE4oIlVzYWdlOiAiKyh4KSkKKworc3RhdGljIGludCBDYXRGaWxlKCk7CitzdGF0aWMgaW50IENvbW1hbmQoc3RyaW5nIHN0cik7CitpbnQgQ29tbWFuZFNjYW4oc3RyaW5nIGFyZyk7CitpbnQgRG9BbGlhcyhzdHJpbmcgdmVyYiwgc3RyaW5nIGFyZyk7CitpbnQgRG9IaXN0b3J5KHN0cmluZyBsaW5lKTsKK3N0YXRpYyBpbnQgTW92ZU9iaihvYmplY3Qgb2JqMSwgb2JqZWN0IG9iajIsIGludCBzaWxlbnQpOworc3RhdGljIGludCBYR3JlcEZpbGUoc3RyaW5nIHBhdCwgc3RyaW5nIGZpbGUsIGludCByZXZlcnQpOworaW50IFhjYWxsKHN0cmluZyBzdHIpOworaW50IFhjYWxsb3V0cyhzdHJpbmcgc3RyKTsKK2ludCBYY2F0KHN0cmluZyBzdHIpOworaW50IFhjaW5kZW50KHN0cmluZyBzdHIpOworaW50IFhjbGVhbihzdHJpbmcgc3RyKTsKK2ludCBYY2xvbmUoc3RyaW5nIHN0cik7CitpbnQgWHVjbG9uZShzdHJpbmcgc3RyKTsKK2ludCBYY21kcyhzdHJpbmcgc3RyKTsKK2ludCBYZGF0ZShzdHJpbmcgc3RyKTsKK2ludCBYZGJnKHN0cmluZyBzdHIpOworaW50IFhkY2xlYW4oc3RyaW5nIHN0cik7CitpbnQgWGRkZXMoc3RyaW5nIHN0cik7CitpbnQgWGRlcyhzdHJpbmcgc3RyKTsKK2ludCBYZGxvb2soc3RyaW5nIHN0cik7CitpbnQgWGRvKHN0cmluZyBzdHIpOworaW50IFhkdXBkYXRlKHN0cmluZyBzdHIpOworaW50IFhlY2hvKHN0cmluZyBzdHIpOworaW50IFhldmFsKHN0cmluZyBzdHIpOworaW50IFhmb3JhbGwoc3RyaW5nIHN0cik7CitpbnQgWGdvdG8oc3RyaW5nIHN0cik7CitpbnQgWGdyZXAoc3RyaW5nIHN0cik7CitpbnQgWGhiZWF0cyhzdHJpbmcgc3RyKTsKK2ludCBYaGVhZChzdHJpbmcgc3RyKTsKK2ludCBYaGVscChzdHJpbmcgc3RyKTsKK2ludCBYaWRzKHN0cmluZyBzdHIpOworaW50IFhpbmZvKHN0cmluZyBzdHIpOworaW50IFhpbmhlcml0KHN0cmluZyBzdHIpOworaW50IFhpbnZlbnRvcnkoc3RyaW5nIHN0cik7CitpbnQgWGxhZyhzdHJpbmcgc3RyKTsKK2ludCBYbGlnaHQoc3RyaW5nIHN0cik7CitpbnQgWGxvYWQoc3RyaW5nIHN0cik7CitpbnQgWGxvb2soc3RyaW5nIHN0cik7CitpbnQgWGxwYyhzdHJpbmcgc3RyKTsKK2ludCBYbWFuKHN0cmluZyBzdHIpOworaW50IFhtb3JlKHN0cmluZyBzdHIpOworaW50IFhtb3ZlKHN0cmluZyBzdHIpOworaW50IFhtc2coc3RyaW5nIHN0cik7CitpbnQgWG10cChzdHJpbmcgc3RyKTsKK2ludCBYcHJvYyhzdHJpbmcgc3RyKTsKK2ludCBYcHJvcHMoc3RyaW5nIHN0cik7CitpbnQgWHByb2Yoc3RyaW5nIHN0cik7CitpbnQgWHF1aXQoc3RyaW5nIHN0cik7CitpbnQgWHNjYW4oc3RyaW5nIHN0cik7CitpbnQgWHNldChzdHJpbmcgc3RyKTsKK2ludCBYc2goc3RyaW5nIHN0cik7CitpbnQgWHNvcnQoc3RyaW5nIHN0cik7CitpbnQgWHN0b3Aoc3RyaW5nIHN0cik7CitpbnQgWHRvb2woc3RyaW5nIHN0cik7CitpbnQgWHRyYWNlKHN0cmluZyBzdHIpOworaW50IFh0cmFucyhzdHJpbmcgc3RyKTsKK2ludCBYdXBkYXRlKHN0cmluZyBzdHIpOworaW50IFh3YyhzdHJpbmcgc3RyKTsKK2ludCBYd2hvKHN0cmluZyBvcHQpOworc3RhdGljIHN0cmluZyBjcm5hbWUob2JqZWN0IHdobyk7CitpbnQgaWQoc3RyaW5nIHN0cik7CitpbnQgbW92ZShtaXhlZCBkZXN0KTsKK3N0YXRpYyBpbnQgc2VjdXJpdHkoKTsKK2ludCB3cml0ZV9uZXdpbnZvYmoob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfbmV3ZW52b2JqKG9iamVjdCB3aG8pOworaW50IHdyaXRlX25ldGRlYWQob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfYWxpdmUob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfc25vb3BlZShvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9ub3Nub29wKG9iamVjdCB3aG8pOworaW50IHdyaXRlX2ludmlzb2JqKG9iamVjdCB3aG8pOworaW50IHdyaXRlX2ludmlzbHZnKG9iamVjdCB3aG8pOworaW50IHdyaXRlX2ludmlzcGx5KG9iamVjdCB3aG8pOworaW50IHdyaXRlX3Zpc2lib2JqKG9iamVjdCB3aG8pOworaW50IHdyaXRlX3Zpc2libHZnKG9iamVjdCB3aG8pOworaW50IHdyaXRlX3Zpc2licGx5KG9iamVjdCB3aG8pOworc3RhdGljIG9iamVjdCAqU3ViTm9kZXMob2JqZWN0IG9iaik7CitzdGF0aWMgdmFyYXJncyBvYmplY3QgRmluZE9iaihzdHJpbmcgc3RyLCBvYmplY3QgZW52LCBpbnQgc2lsZW50KTsKK3N0YXRpYyBvYmplY3QgVmFyVG9PYmooc3RyaW5nIHN0cik7CitzdGF0aWMgdmFyYXJncyBvYmplY3QgWEZpbmRPYmooc3RyaW5nIHN0ciwgaW50IHNpbGVudCk7CitzdGF0aWMgc3RyaW5nIE9iakZpbGUob2JqZWN0IG9iaik7CitzdGF0aWMgc3RyaW5nIFBsYXllckFnZShvYmplY3Qgb2JqKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVyRG9tYWluKG9iamVjdCBvYmosIGludCBmbGFnKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVySVAob2JqZWN0IG9iaiwgaW50IGZsYWcpOworc3RhdGljIHN0cmluZyBQbGF5ZXJJZGxlKG9iamVjdCBvYmopOworc3RhdGljIHN0cmluZyBQbGF5ZXJNYWlsKG9iamVjdCBvYmosIGludCBmbGFnKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVyUmFjZShvYmplY3Qgb2JqLCBpbnQgZmxhZyk7CitzdGF0aWMgc3RyaW5nIFBsYXllclNub29wKG9iamVjdCBvYmosIGludCBmbGFnKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVyU3RhdHMob2JqZWN0IG9iaiwgaW50IGZsYWcpOworc3RhdGljIHN0cmluZyBQbGF5ZXJXaG8ob2JqZWN0IG9iaik7CitzdGF0aWMgc3RyaW5nIFZhclRvRmlsZShzdHJpbmcgc3RyKTsKK3N0YXRpYyBzdHJpbmcgVmFyVG9QdXJlRmlsZShzdHJpbmcgc3RyKTsKK3N0YXRpYyBzdHJpbmcgWEZpbGUoc3RyaW5nIGZpbGUpOworc3RhdGljIHN0cmluZyBYRmluZEZpbGUoc3RyaW5nIGZpbGUpOworc3RhdGljIHZhcmFyZ3Mgdm9pZCBEZWVwUHJpbnRTaG9ydChvYmplY3QgZW52LCBpbnQgaW5kZW50LCBzdHJpbmcgcHJlLCBzdHJpbmcgZmlsZSk7CitzdGF0aWMgdm9pZCBEZXN0cnVjdChvYmplY3Qgb2JqKTsKK3N0YXRpYyB2b2lkIER1bXBQcm9wZXJ0aWVzKG9iamVjdCBvYmosIGludCBmbGFnKTsKK3N0YXRpYyB2b2lkIEluaGVyaXRhbmNlKG9iamVjdCBvYmosIHN0cmluZyBmdW5jLCBzdHJpbmcgcHJlKTsKK3ZvaWQgSW52aXNDaGVjaygpOworc3RhdGljIHZvaWQgTW9yZUZpbGUoc3RyaW5nIHN0cik7Cit2b2lkIE5ldERlYWRDaGVjayhpbnQgc2hvdyk7CitzdGF0aWMgdm9pZCBQcmludE9iaihvYmplY3Qgb2JqLCBzdHJpbmcgZmlsZSk7CitzdGF0aWMgdmFyYXJncyB2b2lkIFByaW50U2hvcnQoc3RyaW5nIHByZSwgb2JqZWN0IG9iaiwgc3RyaW5nIGZpbGUpOwordm9pZCBTbm9vcENoZWNrKCk7CitzdGF0aWMgdm9pZCBWYXJDaGVjayhpbnQgc2hvdyk7CitzdGF0aWMgaW50ICBXcml0ZShzdHJpbmcgc3RyKTsKK3N0YXRpYyB2b2lkIFhFeGVjRmlsZShpbnQgbGluZSk7CitzdGF0aWMgdm9pZCBYTW9yZUZpbGUoc3RyaW5nIGZpbGUsIGludCBmbGFnKTsKK3N0YXRpYyB2b2lkIFhNc2dTYXkoc3RyaW5nIHN0cik7CitzdGF0aWMgdm9pZCBYTXNnU2hvdXQoc3RyaW5nIHN0cik7CitzdGF0aWMgdm9pZCBYTXNnVGVsbChzdHJpbmcgc3RyKTsKK3N0YXRpYyB2b2lkIFhtdHBTY3JpcHQoc3RyaW5nIGRpciwgc3RyaW5nIGZpbGUsIHN0cmluZyBvcHQpOwordm9pZCBhY3Rpb25zKCk7Cit2b2lkIGluaXQoKTsKK3ZvaWQgdXBkYXRlX3Rvb2wobWl4ZWQgKmFyZ3MsIG9iamVjdCBvYmopOworc3RyaW5nIF9xdWVyeV9sb25nKCk7CitzdHJpbmcgX3F1ZXJ5X3Nob3J0KCk7CisKK3N0YXRpYyBpbnQgQ2FsbEZ1bmMoc3RyaW5nIHZlcmIsIHN0cmluZyBzdHIpOworc3RhdGljIHN0cmluZyBHZXRGdW5jKHN0cmluZyB2ZXJiLCBpbnQgdGVzdCk7CisKK3N0YXRpYyBzdHJpbmcgUHJlcGFyZUxpbmUoc3RyaW5nIHN0cik7CitzdGF0aWMgc3RyaW5nIFF1b3RlTGluZShzdHJpbmcgc3RyKTsKK3N0YXRpYyBzdHJpbmcgVW5xdW90ZUxpbmUoc3RyaW5nIHN0cik7CitpbnQgUXVvdGVPayhzdHJpbmcgc3RyKTsKK3N0YXRpYyBzdHJpbmcgKkV4cGxvZGVDbWRzKHN0cmluZyBzdHIpOworCitzdHJpbmcgcmVhZF9idWZmZXIoc3RyaW5nIGZpbGVuYW1lLCBpbnQgc3RhcnQsIGludCBudW1iZXIpOworc3RyaW5nIGxvYWRfYnVmZmVyKGludCBsaW5lKTsKK2ludCByZWFkX2xpbmUoaW50IG9mZnNldCk7CisKKy8qCisgKiBkZWJ1ZyBzdHVmZgorICovCit2b2lkIFRLKHN0cmluZyBzdHIpOworaW50IFh0ayhzdHJpbmcgc3RyKTsKKworI2VuZGlmIC8qIF9fVE9PTF9IX18gKi8KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvdG9vbC5uZXdzIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sLm5ld3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhZGJkOQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvdG9vbC5uZXdzCkBAIC0wLDAgKzEsMTQzIEBACitbMTAuMDcuOTddCisKKy0gZml4ZWQgbWlub3IgYnVnIGluIGNvbW1hbmQgbG9va3VwOgorICAneGRvc29tZXRoaW5nb3Jzb21ldGhpbmdlbHNlJyB3YXMgcHJldmlvdXNseSBleGVjdXRlZCBhcyAneGRvJworICBUaGlzIGlzIHRyZWF0ZWQgYXMgYW4gdW5rbm93biBjb21tYW5kIG5vdy4gQW55d2F5IGNvbW1hbmRzIG1heSBiZQorICBhYmJyZXZpYXRlZCBhcyBsb25nIGFzIHRoZXkgYXJlIG5vdCBhbWJpZ3VvdXMuCisKK1sxMi4wMy45N10KKworLSB4bHBjIGluY2x1ZGVzIHNvbWUgbW9yZSBzdGQtaW5jbHVkZS1maWxlcyBhbmQgLnh0b29sLmggKGlmIHByZXNlbnQpCisKK1swNC4wMy45N10KKworLSBuZXcgY29tbWFuZDogeHByb2MKKyAgZGlzcGxheSBzb21lIGluZm9ybWF0aW9uIGZyb20gdGhlIC9wcm9jIGZpbGVzeXN0ZW0gaW4gYSB2ZXJ5IHJhdyBmYXNoaW9uLgorCitbMDguMDUuOTZdCisKKy0gWG1vcmUvWHRhaWw6IG1vZGlmaWVkIE1vcmVGaWxlL0NhdEZpbGUgdXNpbmcgbmV3IHJlYWRfYnVmZmVyKCkgaW5zdGVhZCBvZgorICByZWFkX2ZpbGUoKSBmdW5jdGlvbiB3aGljaCBpcyBWRVJZIHNsb3cgd2hlbiBnaXZpbmcgb2Zmc2V0cyBhcyBhcmd1bWVudC4KKworWzEzLjAyLjk2XQorCistIHNlZSBiZWxvdyAuLi4KKworWzAzLjAxLjk2XQorCistIG5ldyBjb21tYW5kIGxpbmUgcGFyc2VyIHVuZGVyIGRldmVsb3BtZW50IChBTFBIQSEpCisKK1syMS4xMS45NV0KKworLSBNR3Rvb2wgd2lsbCBiZSBkZXN0cnVjdGVkIGR1cmluZyBjcmVhdGlvbiwgd2hlbiAhSVNfTEVBUk5FUig8Y2xvbmVyPikgaXMgdHJ1ZQorCistIG5ldyBvcHRpb24gIi1zIiB0byB4aVtudmVudG9yeV0gcHJpbnRzIHNob3J0IGludmVudG9yeSBsaXN0IChmaWxlbmFtZXMgb25seSkuCisgIFRoaXMgaXMgdXNlZnVsIGZvciBhbGVydCBvYmplY3QgIi4uLiBzY2FubmVkIHlvdXIgaW52ZW50b3J5IiBldGMuCisgIHhpIGFjY2VwdHMgPHVzZXJuYW1lPiBhcyBvcHRpb25hbCBhcmd1bWVudCB0byByZXRyaWV2ZSA8dXNlcm5hbWU+J3MgCisgIGludmVudG9yeSBpbnN0ZWFkIG9mIHRoZSBjbG9uZXIncyBvd24gaW52ZW50b3J5IGFuZCBtYXkgd3JpdGUgaW50byBwaXBlcworICB0byBjcmVhdGUgY29tbWFuZCBjaGFpbnMgbGlrZTogeGkgLXMga2lya3x4Z3JlcCBNR3Rvb2wKKworLSBuZXcgY29tbWFuZCB4bGFnIDotKSAKKworWzA5LjExLjk1XQorCistIGJ1Z2ZpeDogeGluaGVyaXQgbm93IGNhbGxzIHhpbmhlcml0IGFuZCBOT1QgeGludmVudG9yeQorCitbMjMuMDguOTVdCisKKy0geGNhbGwgYW5kIHhldmFsIHRyeSB0byBpbmNsdWRlIGEgcHJpdmF0ZSBoZWFkZXIgZmlsZSB+Ly54dG9vbC5oIGlmIG9uZSAKKyAgZXhpc3RzLiBZb3UgbWF5IGRlZmluZSBvd24gbWFjcm9zIG9yIHdoYXRldmVyIHRvIG1ha2UgdGhpbmdzIGVhc2llcgorCitbMjEuMDYuOTVdCisKKy0gbmV3IG9wdGlvbiAiY21kYXZnIiB0byB4d2hvLCBzaG93cyBjb21tYW5kX2F2ZXJhZ2UgaW4gYXNjZW5kaW5nIG9yZGVyCisKK1syMC4wNi45NV0KKworLSByZW1vdmVkIHJlZGlyZWN0aW5nIG9mIHhjYWxsIGFuZCB4ZXZhbCAodG9vIGJ1Z2d5KQorCistIGFkZGVkIG9wdGlvbnMgLWYgYW5kIC1tIHRvIHhwcm9wcyAoc2hvdyBwcm9wZmxhZ3MgYW5kIHByb3BtZXRob2RzKQorCitbMDYuMDYuOTVdCisKKyAgKiogSU1QT1JUQU5UICoqIChub3QgYmFja3dhcmQgY29tcGF0aWJsZSBjaGFuZ2UpCistIHhjYWxsIGFuZCB4ZXZhbCBub3cgd3JpdGUgdG8gYSBmaWxlLCB3aGVuIHJlZGlyZWN0aW5nIHRoZWlyIG91dHB1dAorICB1c2luZyAnPicuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcGlwZSBvdXRwdXQgaW50byBvdGhlciBjb21tYW5kcworCitbMzAuMDUuOTVdCisKKy0geGxvb2sveGRsb29rIGFyZSBub3cgYWJsZSB0byB3cml0ZSBpbnRvIHBpcGVzCisKKy0geHdobyBzaG93cyB0aGUgbmFtZSBvZiBhbnkgdXNlciBjdXJyZW50bHkgbG9nZ2luZyBpbgorICBpbnN0ZWFkIG9mIHNpbXBseSAiIFIgTyBPIFQgIgorCitbMTAuMDQuOTVdCisKKy0gYWRkZWQgb3B0aW9uIC1pIHRvIHhncmVwIChpZ25vcmUgY2FzZSkKKworLSBidWdmaXggaW4gY29tbWFuZCBwaXBlbGluZXMKKworWzI4LjAzLjk1XQorCistIHhpbmhlcml0IGlzIG5vdyBhYmxlIHRvIHdyaXRlIGludG8gcGlwZXMKKworWzIwLjAzLjk1XQorCistIGFkZGVkIElPIHJlZGlyZWN0aW9uIGxpa2U6ICB4d2hvIGlwID4gdGVzdGZpbGUgIG9yICB4d2hvID4+IHRlc3RmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQ6ICB4bW9yZSA8IHRlc3RmaWxlCisgICh0aGlzIGlzIHZlcnkgQUxQSEEhISEpCisKK1swMS4wMy45NV0KKworLSBuZXcgY29tbWFuZCB4d2MuIENvdW50IGxpbmVzLCB3b3JkcyBhbmQgY2hhcnMgaW4gZmlsZQorICBTeW50YXggeHdjIFstY2x3XSBbZmlsZV0gIChpcyBhYmxlIHRvIHJlYWQgZnJvbSBwaXBlKQorCitbMTcuMDIuOTVdCisKKy0gY2hhbmdlZCBmb3JtYXR0aW5nIG9mIHhwcm9wcyBvdXRwdXQKKworWzE1LjAyLjk1XQorCistIGxvdHMgb2YgY29kZSBhZGRlZCwgc29tZSByZXdyaXR0ZW4KKworLSByZW1vdmVkIHhhbGlhcyBjYXBhYmlsaXR5ICh0aGUgc2hlbGwgYWxpYXMgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSkKKworLSByZW1vdmVkIHhjaW5kZW50LCB4ZGF0ZSwgeHF1aXQgCisKKy0gYnVncyBmaXhlZCBpbiB4Y2FsbG91dHMsIHhwcm9wcywgeG1hbiAod2hlbiB1c2luZyB4eHRvb2wpCisKKy0gYWRkZWQgY29tbWFuZCBwaXBlbGluZXMgZm9yIHNlbGVjdGVkIGNvbW1hbmRzOgorCisgIC0+IGNtZCA6IGlzIGFibGUgdG8gcmVhZCBmcm9tIHBpcGUKKyAgY21kIC0+IDogaXMgYWJsZSB0byB3cml0ZSBpbnRvIHBpcGUKKworICB4Y2FsbG91dHMgLT4KKyAgLT4geGNhdCAtPgorICB4Y21kcyAtPgorICAtPiB4Z3JlcCAtPgorICB4aGJlYXRzIC0+CisgIC0+IHhoZWFkIC0+CisgIC0+IHhtb3JlCisgIC0+IHhtc2cKKyAgeHByb3BzIC0+CisgIC0+IHhzb3J0IC0+CisgIC0+IHh0YWlsIC0+CisgIHh3aG8gLT4KKworICB0aGUgZ2VuZXJhbCBzeW50YXggdXNpbmcgcGlwZXMgaXM6CisKKyAgICBjbWRfYSBbYXJnX2FdIHwgY21kX2IgW2FyZ19iXSB8IC4uLgorCisgIG9ubHkgdGhlIGZpcnN0IHNwYWNlIGJldHdlZW4gY21kX2EgYW5kIGFyZ19hIG9yIGJldHdlZW4gY21kX2EgYW5kIHRoZQorICBmaXJzdCBwaXBlIHN5bWJvbCBpcyBuZWNlc3NhcnkuCisKKyAgQWxsIGZ1bmN0aW9ucyB3aGljaCBhbGxvdyBkaXJlY3Qgb3V0cHV0IGludG8gYSBwaXBlIGRvbid0IHVzZSBhIHBhZ2VyCisgIHRvIHNob3cgaXRzIG91dHB1dCBldmVuIGlmIG5vIHBpcGUgZm9sbG93cyB0aGlzIGNvbW1hbmQuIFlvdSBtYXkgdXNlCisgIGNtZCBbYXJnXXx4bW9yZSB0byBvYnRhaW4gdGhlIG9sZCByZXN1bHRzLgorCistIG5ldyBjb21tYW5kcyB4dGFpbCwgeGhlYWQsIHhjYXQgYW5kIHhzb3J0CisKKy0gY29tbWFuZCBsaW5lIG9wdGlvbiAtdiBhZGRlZCB0byB4Z3JlcCB0byBwcmludCBsaW5lcyBub3QgbWF0Y2hpbmcgdGhlIHNlYXJjaAorICBwYXR0ZXJuCisKKy0gaS9vIHJlZGlyZWN0aW9uIGlzIGNvbWluZyBzb29uCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Rvb2xjbWQuYyBiL29iai90b29scy9NR3Rvb2wvdG9vbGNtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTA0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2xjbWQuYwpAQCAtMCwwICsxLDIwMzMgQEAKKy8qCisgKiBNR3Rvb2wtMS4wCisgKiBGaWxlOiB0b29sY21kcy5jCisgKiBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHRoZSBvcmlnaW5hbCBYdG9vbCBpcyBjb3B5cmlnaHRlZCBieSBIeXAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgInRvb2wuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjb21tYW5kIGZ1bmN0aW9ucworICovCisKK2ludCBYY2FsbChzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqLCBjYWxsb2JqOworICBzdHJpbmcgZmlsZSwgY2FsbHN0ciwgY2FsbGZ1biwgY2FsbGV4cHIsIGVycm9yLCBlcnJsb2c7CisgIGludCAqcnUxLCAqcnUyLCB4dGltZTsKKyAgbWl4ZWQgcmVzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhjYWxsIDxvYmplY3Q+LT48ZnVuY3Rpb24+KDxhcmd1bWVudHM+KSIpOworICBUSygiWGNhbGw6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZihzc2NhbmYoc3RyLCAiJXMtPiVzKCVzIiwgY2FsbHN0ciwgY2FsbGZ1biwgY2FsbGV4cHIpIT0zKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYoIShjYWxsb2JqPVhGaW5kT2JqKGNhbGxzdHIpKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICB7CisjaWYgMAorICAgIHdyaXRlX2ZpbGUoVE9PTF9MT0csCisJICAgICAgIHNwcmludGYoIiVzICglcykgeGNhbGwgJXMgKGVudjogJXMpXG4iLGN0aW1lKHRpbWUoKSksCisJCSAgICAgICBnZXR1aWQoY2xvbmVyKSxzdHIsb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoY2xvbmVyKSkpKTsKKyNlbmRpZgorICAgIGZpbGU9TFBDX0ZJTEUrIi5jIjsKKyAgICBpZihmaWxlX3NpemUoZmlsZSk+MCkKKyAgICAgIHJtKGZpbGUpOworICAgIGlmKG9iaj1maW5kX29iamVjdChMUENfRklMRSkpCisgICAgICBEZXN0cnVjdChvYmopOworICAgIG9iaj0wOworICAgIHdyaXRlX2ZpbGUoZmlsZSwKKwkgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG4iKworCSAgICAgICAiI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD5cbiIrCisJICAgICAgICIjaW5jbHVkZSA8ZGVmaW5lcy5oPlxuIisKKwkgICAgICAgIiNpbmNsdWRlIDx3aXpsaXN0Lmg+XG4iKworCSAgICAgICAiI2luY2x1ZGUgPG1vdmluZy5oPlxuIisKKwkgICAgICAgIiNpbmNsdWRlIFwiL3NlY3VyZS93aXpsZXZlbHMuaFwiXG4iKworCSAgICAgICAoZmlsZV9zaXplKFBSSVZBVEVfSEVBREVSKT49MD8iI2luY2x1ZGUgXCIiK1BSSVZBVEVfSEVBREVSKyJcIlxuIjoiIikrCisJICAgICAgICJtaXhlZCBnZXQoc3RyaW5nIHN0cil7cmV0dXJuIHByZXZpb3VzX29iamVjdCgpLT5YRmluZE9iaihzdHIpO31cbiIrCisJICAgICAgICJtaXhlZCBldmFsKG9iamVjdCBvYmosbWl4ZWQgbWUsbWl4ZWQgaGVyZSl7cmV0dXJuIG9iai0+IitjYWxsZnVuKyIoIitjYWxsZXhwcisiO31cbiIpOworICAgIGVycmxvZyA9IEVSUl9GSUxFOworICAgIGlmKGZpbGVfc2l6ZShlcnJsb2cpPjApCisgICAgICBybShlcnJsb2cpOworICAgIGlmKGVycm9yPWNhdGNoKChMUENfRklMRSktPl9fbml4Z2lidHNfXygpKSkKKyAgICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICAgIGVsc2UKKyAgICB7CisgICAgICBvYmo9ZmluZF9vYmplY3QoTFBDX0ZJTEUpOworICAgICAgcnUxPXJ1c2FnZSgpOworICAgICAgZXJyb3I9Y2F0Y2gocmVzPShtaXhlZClvYmotPmV2YWwoY2FsbG9iaiwgY2xvbmVyLCBFTlYoY2xvbmVyKSkpOworICAgICAgcnUyPXJ1c2FnZSgpOworICAgICAgaWYoZXJyb3IpCisJVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgICAgICBlbHNlCisgICAgICB7CisJeHRpbWU9cnUyWzBdLXJ1MVswXStydTJbMV0tcnUxWzFdOworCVdETE4oIkV2YWx1YXRpb24gdGltZTogIisoeHRpbWU8MCA/IDAgOiB4dGltZSkrIiBtcyIpOworCVBJUEVfREVMRVRFKHBpcGVfb2YpOworCWlmKHBpcGVfb3V0JiZwaXBlX29mKQorCSAgd3JpdGVfZmlsZShwaXBlX29mLG1peGVkX3RvX3N0cmluZyhyZXMsIE1BWF9SRUNVUlNJT04pKyJcbiIpOworCWVsc2UKKwlXTE4oIlJlc3VsdDogIittaXhlZF90b19zdHJpbmcocmVzLCBNQVhfUkVDVVJTSU9OKSk7CisJaWYob2JqZWN0cChyZXMpKQorICAgIG1fYWRkKHZhcmlhYmxlLCAicmVzdWx0IiwgcmVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgcm0oZmlsZSk7CisgIH0KKyAgaWYob2JqKSBEZXN0cnVjdChvYmopOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhjYWxsb3V0cyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBtaXhlZCBjYWxsb3V0cywgYXJnczsKKyAgc3RyaW5nIGZ1biwgdG1wLCBmaWxlOworICBpbnQgZGVsYXksIGksIHM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWGNhbGxvdXRzOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXBpcGVfb3V0KQorICB7CisgICAgVVNBR0UxKHN0ciwgInhjYWxsbyh1dHMpIFtzZWFyY2ggcGF0dGVybl0iKTsKKyAgICBmaWxlPVRNUF9GSUxFOworICAgIGlmKGZpbGVfc2l6ZShmaWxlKT4wKQorICAgICAgcm0oZmlsZSk7CisgICAgaWYoIXN0cikKKyAgICAgIHN0cj0iXlxcW34vIjsKKyAgICBlbHNlIGlmKCFyZWdleHAoKHsiZHVtbXkifSksIHN0cikpCisgICAgeworICAgICAgV0RMTigiQmFkIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSAKKyAgfQorICBlbHNlCisgIHsKKyAgICBVU0FHRTEoc3RyLCAieGNhbGxvKHV0cykiKTsKKyAgICBpZihzdHImJnN0ciE9IiIpCisgICAgeworICAgICAgV0RMTigiTW9yZSBhcmd1bWVudHMgdGhhbiBleHBlY3RlZCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGNhbGxvdXRzPWNhbGxfb3V0X2luZm8oKTsKKyAgcz1zaXplb2YoY2FsbG91dHMpOworICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgZm9yKGk9MDsgaTxzOyBpKyspCisgIHsKKyAgICBpZihjYWxsb3V0c1tpXSYmcG9pbnRlcnAoY2FsbG91dHNbaV0pKQorICAgIHsKKyAgICAgIHRtcD1zcHJpbnRmKCIlTyAlT3MgJU8gKCVzKSIsY2FsbG91dHNbaV1bMF0sY2FsbG91dHNbaV1bMl0sCisJCSAgY2FsbG91dHNbaV1bMV0sKHNpemVvZihjYWxsb3V0c1tpXSk+Mz8KKwkJCQkgIG1peGVkX3RvX3N0cmluZyhjYWxsb3V0c1tpXVszXSwKKwkJCQkJCSAgTUFYX1JFQ1VSU0lPTik6IjAiKSk7CisgICAgICBpZihwaXBlX291dCYmcGlwZV9vZikKKwl3cml0ZV9maWxlKHBpcGVfb2YsdG1wKyJcbiIpOworICAgICAgZWxzZQorCWlmKHNpemVvZihyZWdleHAoKHt0bXB9KSwgc3RyKSkpCisJICBXTE4odG1wKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYY2F0KHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqdG1wLGZpbGU7CisgIGludCBzOworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYY2F0OiBzdHI6ICIrc3RyKTsKKyAgaWYoIXBpcGVfaW4pCisgIHsKKyAgICBVU0FHRTIoc3RyLCAieGNhdCA8ZmlsZT4iKTsKKyAgICBpZighKGZpbGU9WEZpbmRGaWxlKHN0cikpKQorICAgIHsKKyAgICAgIFdETE4oIkNhbid0IGZpbmQgZmlsZSIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmKHN0ciYmc3RyIT0iLSIpCisgICAgICBVU0FHRTMoInhjYXQgLSIpOworCisgICAgaWYgKGZpbGVfc2l6ZShmaWxlPXBpcGVfaWYpPDApCisgICAgeworICAgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4Y2F0Iik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgdG1wPW9sZF9leHBsb2RlKHJlYWRfZmlsZShmaWxlLDAsUElQRV9NQVgpLCJcbiIpOworICBpZihwaXBlX2luJiZwaXBlX2lmPT1QSVBFX0ZJTEUpCisgICAgcm0oUElQRV9GSUxFKTsKKyAgaWYgKHBpcGVfb3V0JiZwaXBlX29mKQorICAgIHdyaXRlX2ZpbGUocGlwZV9vZixpbXBsb2RlKHRtcCwiXG4iKSsiXG4iKTsKKyAgZWxzZQorICAgIFdMTihpbXBsb2RlKHRtcCwiXG4iKSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGNkKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBkZXN0OworICBzdHJpbmcgcGF0aDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4Y2QgW29iamVjdF0iKTsKKyAgVEsoIlhjZDogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFzdHIpCisgIHsKKyAgICBpZighKHBhdGg9KHN0cmluZyljbG9uZXItPlF1ZXJ5UHJvcCgic3RhcnRfaG9tZSIpKSkKKyAgICAgIHBhdGg9Ii8iOworICB9CisgIGVsc2UgaWYoKGRlc3Q9WEZpbmRPYmooc3RyLDEpKSkKKyAgICBwYXRoPSIvIitpbXBsb2RlKG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKGRlc3QpLCIvIilbMC4uPDJdLCIvIik7CisgIGVsc2UKKyAgICBwYXRoPSIiOworCisgIFRLKCJYY2Q6IHBhdGg6ICIrKHBhdGg/cGF0aDoiKE5VTEwpIikpOworICBpZighc2l6ZW9mKHBhdGgpKQorICAgIHBhdGg9c3RyOworICBQTC0+X2NkKHBhdGgpOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGNsZWFuKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBlbnY7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGNsZShhbikgW29iamVjdF0iKTsKKyAgVEsoIlhjbGVhbjogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFzdHIpCisgICAgZW52PUVOVihjbG9uZXIpOworICBpZihlbnZ8fChlbnY9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBQcmludFNob3J0KCJDbGVhbmluZzogIiwgZW52KTsKKyAgICBmaWx0ZXIoZmlsdGVyKGFsbF9pbnZlbnRvcnkoZW52KSwgIydpc19ub3RfcGxheWVyKSwvLycKKwkJICJEZXN0cnVjdCIsIE1FKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhjbG9uZShzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZmlsZSwgZXJybG9nLCBlcnJvcjsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4Y2xvKG5lKSA8ZmlsZW5hbWU+Iik7CisgIGlmKCEoZmlsZT1YRmluZEZpbGUoc3RyKSkpIHJldHVybiBUUlVFOworICBlcnJsb2c9RVJSX0ZJTEU7CisgIGlmKGZpbGVfc2l6ZShlcnJsb2cpPjApIHJtKGVycmxvZyk7CisgIFdMTigiQ2xvbmU6ICIrc2hvcnRfcGF0aChmaWxlKSk7CisgIGlmKCEoZXJyb3I9Y2F0Y2gob2JqPWNsb25lX29iamVjdChmaWxlKSkpKQorICB7IAorICAgIG1fYWRkKHZhcmlhYmxlLCAiY2xvbmUiLCBvYmopOworICAgIGlmKCFNb3ZlT2JqKG9iaiwgRU5WKGNsb25lciksIFRSVUUpKQorICAgICAgV0RMTigiQ2Fubm90IG1vdmUgb2JqZWN0IGludG8gdGhpcyByb29tIik7CisgICAgZWxzZSBpZighb2JqLT5RdWVyeU5vR2V0KCkpCisgICAgeworICAgICAgaWYoIU1vdmVPYmoob2JqLCBjbG9uZXIsIFRSVUUpKQorCVdETE4oIkNhbm5vdCBtb3ZlIG9iamVjdCBpbnRvIHlvdXIgaW52ZW50b3J5Iik7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYdWNsb25lKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBmaWxlLCBlcnJsb2csIGVycm9yOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInh1Y2xvKG5lKSA8ZmlsZW5hbWU+Iik7CisgIGlmKCEoZmlsZT1YRmluZEZpbGUoc3RyKSkpIHJldHVybiBUUlVFOworICBlcnJsb2c9RVJSX0ZJTEU7CisgIGlmKGZpbGVfc2l6ZShlcnJsb2cpPjApIHJtKGVycmxvZyk7CisgIGlmKG9iaj1maW5kX29iamVjdChmaWxlKSkgeworICAgIERlc3RydWN0KG9iaik7CisgICAgV0xOKCJVcGRhdGUgYW5kIGNsb25lOiAiK3Nob3J0X3BhdGgoZmlsZSkpOworICB9CisgIGVsc2UKKyAgICBXTE4oIkNsb25lOiAiK3Nob3J0X3BhdGgoZmlsZSkpOworICBpZighKGVycm9yPWNhdGNoKG9iaj1jbG9uZV9vYmplY3QoZmlsZSkpKSkKKyAgeworICAgIHZhcmlhYmxlWyJjbG9uZSJdID0gb2JqOworICAgIGlmKCFNb3ZlT2JqKG9iaiwgRU5WKGNsb25lciksIFRSVUUpKQorICAgICAgV0RMTigiQ2Fubm90IG1vdmUgb2JqZWN0IGludG8gdGhpcyByb29tIik7CisgICAgZWxzZSBpZighb2JqLT5RdWVyeU5vR2V0KCkpCisgICAgeworICAgICAgaWYoIU1vdmVPYmoob2JqLCBjbG9uZXIsIFRSVUUpKQorCVdETE4oIkNhbm5vdCBtb3ZlIG9iamVjdCBpbnRvIHlvdXIgaW52ZW50b3J5Iik7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYY21kcyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBtaXhlZCAqY21kczsKKyAgaW50IGksIHM7CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhjbShkcykgW29iamVjdF0iKTsKKyAgVEsoIlhjbWRzOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXN0cikKKyAgICBvYmo9RU5WKGNsb25lcik7CisgIGVsc2UgaWYoIShvYmo9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBXRExOKCJDYW4ndCBmaW5kIG9iamVjdCIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHM9c2l6ZW9mKGNtZHM9cXVlcnlfYWN0aW9ucyhjbG9uZXIsMXwyfDR8OHwxNikpOworICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgZm9yKGk9MDsgaTxzOyBpKz01KQorICAgIGlmKGNtZHNbaSszXT09b2JqKQorICAgICAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisJd3JpdGVfZmlsZShwaXBlX29mLEFMRUZUKGNtZHNbaV0rIiAiLCAxNSwgIi4iKSsKKwkJICAgKGNtZHNbaSsyXSA/ICIgKiAiIDogIiAuICIpK2NtZHNbaSs0XSsiKClcbiIpOworICAgICAgZWxzZQorCVdMTihBTEVGVChjbWRzW2ldKyIgIiwgMTUsICIuIikrCisJICAgIChjbWRzW2krMl0gPyAiICogIiA6ICIgLiAiKStjbWRzW2krNF0rIigpIik7CisgIHJldHVybiBUUlVFOworfQorICAKK2ludCBYZGJnKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGRiKGcpIDxvYmplY3Q+Iik7CisgIFRLKCJYZGJnOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIGRlYnVnX2luZm8oMSwgb2JqKTsKKyAgICBkZWJ1Z19pbmZvKDAsIG9iaik7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZGNsZWFuKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBlbnY7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGRjKGxlYW4pIFtvYmplY3RdIik7CisgIFRLKCJYZGNsZWFuOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXN0cikKKyAgICBlbnY9RU5WKGNsb25lcik7CisgIGlmKGVudnx8KGVudj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIFByaW50U2hvcnQoIkRlZXAgY2xlYW5pbmc6ICIsIGVudik7CisgICAgZmlsdGVyKGZpbHRlcihhbGxfaW52ZW50b3J5KGVudiksICMnaXNfbm90X3BsYXllciwgTUUpLC8vJworCQkgIkRlZXBDbGVhbiIsIE1FKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhkZGVzKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGRkKGVzKSA8b2JqZWN0PiIpOworICBUSygiWGRkZXM6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZigob2JqPVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgUHJpbnRTaG9ydCgiRGVlcCBkZXN0cnVjdDogIiwgb2JqKTsKKyAgICBmaWx0ZXIoZGVlcF9pbnZlbnRvcnkob2JqKSwgIkRlc3RydWN0IiwgTUUpOworICAgIERlc3RydWN0KG9iaik7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZGVzKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGRlKHMpIDxvYmplY3Q+Iik7CisgIFRLKCJYZGVzOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIFByaW50U2hvcnQoIkRlc3RydWN0OiAiLG9iaik7CisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhkbG9vayhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhkbChvb2spIFtvYmplY3RdIik7CisgIFRLKCJYZGxvb2s6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighc3RyKQorICAgIG9iaj1jbG9uZXI7CisgIGlmKG9ianx8KG9iaj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICAgIERlZXBQcmludFNob3J0KG9iaixOVUxMLE5VTEwsKHBpcGVfb3V0JiZwaXBlX29mKT9waXBlX29mOiIiKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhkbyhzdHJpbmcgc3RyKQoreworICBpbnQgaSwgbiwgczsKKyAgc3RyaW5nICpzdHJzLCBjbWQ7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGRvIFs8bnVtYmVyMT4jXTxjb21tYW5kMT5bO1s8bnVtYmVyMj4jXTxjb21tYW5kMj5dIC4uLiIpOworICBpZighc3RyfHxzdHI9PSIifHwhKHM9c2l6ZW9mKHN0cnM9c3RyaXBfZXhwbG9kZShzdHIsICI7IikpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGZvcihpPTA7IGk8czsgaSsrKQorICB7CisgICAgaWYoc3Ryc1tpXSkKKyAgICB7CisgICAgICBzd2l0Y2goc3NjYW5mKHN0cnNbaV0sICIlZCMlcyIsIG4sIGNtZCkpCisgICAgICB7CisJY2FzZSAwOgorCWlmKCFDb21tYW5kKHN0cnNbaV0pKSByZXR1cm4gVFJVRTsKKwlicmVhazsKKwljYXNlIDE6CisJaWYoY21kJiYoIUNvbW1hbmQoY21kKSkpIHJldHVybiBUUlVFOworCWJyZWFrOworCWNhc2UgMjoKKwluPSBuPDEgPyAxIDogbjsKKwlpZihjbWQpCisJeworCSAgd2hpbGUobi0tKQorCSAgICBpZighQ29tbWFuZChjbWQpKSByZXR1cm4gVFJVRTsKKwl9CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGR1cGRhdGUoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIHM7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBmaWxlLCAqbGlzdDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4ZHUocGRhdGUpIDxmaWxlbmFtZT4iKTsKKyAgaWYoIShmaWxlPVhGaW5kRmlsZShzdHIpKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYoZmlsZVs8Mi4uPDFdPT0iLmMiKQorICAgIGZpbGU9ZmlsZVswLi48M107CisgIGlmKG9iaj1YRmluZE9iaihmaWxlKSkKKyAgeworICAgIFByaW50U2hvcnQoIkRlZXAgdXBkYXRpbmc6ICIsIG9iaik7CisgICAgbGlzdD1pbmhlcml0X2xpc3Qob2JqKTsKKyAgICBmb3Iocz1zaXplb2YobGlzdCk7IGk8czsgaSsrKQorICAgIHsKKyAgICAgIGlmKG9iaj1maW5kX29iamVjdChsaXN0W2ldKSkKKwlEZXN0cnVjdChvYmopOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhlY2hvKHN0cmluZyBzdHIpCit7CisgIFRLKCJYZWNobzogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIFdMTihzdHIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhldmFsKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBmaWxlLCBlcnJvcjsKKyAgaW50ICpydTEsICpydTIsIHh0aW1lOworICBtaXhlZCByZXM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGV2KGFsKSA8ZXhwcmVzc2lvbj4iKTsKKyAgZmlsZT1MUENfRklMRSsiLmMiOworICBpZihmaWxlX3NpemUoZmlsZSk+MCkKKyAgICBybShmaWxlKTsKKyAgaWYob2JqPWZpbmRfb2JqZWN0KExQQ19GSUxFKSkKKyAgICBEZXN0cnVjdChvYmopOworI2lmIDAKKyAgd3JpdGVfZmlsZShUT09MX0xPRywKKwkgICAgIHNwcmludGYoIiVzICglcykgeGV2YWwgJXNcbiIsCisJCSAgICAgY3RpbWUodGltZSgpKSxnZXR1aWQoY2xvbmVyKSxzdHIpKTsKKyNlbmRpZgorICB3cml0ZV9maWxlKGZpbGUsCisJICAgICAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiIrCisJICAgICAiI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD5cbiIrCisJICAgICAiI2luY2x1ZGUgPGRlZmluZXMuaD5cbiIrCisgICAgICAgICAgICAgIiNpbmNsdWRlIDx3aXpsaXN0Lmg+XG4iKworCSAgICAgIiNpbmNsdWRlIDxtb3ZpbmcuaD5cbiIrCisJICAgICAiI2luY2x1ZGUgXCIvc2VjdXJlL3dpemxldmVscy5oXCJcbiIrCisJICAgICAoZmlsZV9zaXplKFBSSVZBVEVfSEVBREVSKT49MD8iI2luY2x1ZGUgXCIiK1BSSVZBVEVfSEVBREVSKyJcIlxuIjoiIikrCisJICAgICAiZ2V0KHN0cil7cmV0dXJuIHByZXZpb3VzX29iamVjdCgpLT5YRmluZE9iaihzdHIpO31cbiIrCisJICAgICAiZXZhbChtZSxoZXJlKXtyZXR1cm4gIitzdHIrIjt9Iik7CisgIGlmKGVycm9yPWNhdGNoKG9iaj1jbG9uZV9vYmplY3QoZmlsZSkpKQorICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICBlbHNlCisgIHsKKyAgICBydTE9cnVzYWdlKCk7CisgICAgZXJyb3I9Y2F0Y2gocmVzPShtaXhlZClvYmotPmV2YWwoY2xvbmVyLCBFTlYoY2xvbmVyKSkpOworICAgIHJ1Mj1ydXNhZ2UoKTsKKyAgICBpZihlcnJvcikKKyAgICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICAgIGVsc2UKKyAgICB7CisgICAgICB4dGltZT1ydTJbMF0tcnUxWzBdK3J1MlsxXS1ydTFbMV07CisgICAgICBXRExOKCJFdmFsdWF0aW9uIHRpbWU6ICIrKHh0aW1lPDAgPyAwIDogeHRpbWUpKyIgbXMiKTsKKyAgICAgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICAgICAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgICAgIHdyaXRlX2ZpbGUocGlwZV9vZixtaXhlZF90b19zdHJpbmcocmVzLE1BWF9SRUNVUlNJT04pKyJcbiIpOworICAgICAgZWxzZQorICAgICAgICBXTE4oIlJlc3VsdDogIittaXhlZF90b19zdHJpbmcocmVzLCBNQVhfUkVDVVJTSU9OKSk7CisgICAgICBpZihvYmplY3RwKHJlcykpCisgICAgICAgIHZhcmlhYmxlWyJyZXN1bHQiXSA9IHJlczsKKyAgICB9CisgIH0KKyAgcm0oZmlsZSk7CisgIGlmKG9iaikKKyAgICBEZXN0cnVjdChvYmopOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhmb3JhbGwoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIHMsIHQsIHU7CisgIHN0cmluZyBwYXQsIGNtZCwgYXJnLCAqc3RycywgKmZpbGVzLCBmaCwgZnIsIGZlLCBmdCwgZmY7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGZvKHJhbGwpIDxmaWxlcGF0dGVybj4gPGNvbW1hbmQ+Iik7CisgIGlmKHNzY2FuZihzdHIsICIlcyAlcyIsIHBhdCwgYXJnKSE9MikKKyAgICByZXR1cm4gRkFMU0U7CisgIGZpbGVzPWxvbmdfZ2V0X2RpcihwYXQsIEZBTFNFKTsKKyAgaWYoIShzPXNpemVvZihmaWxlcykpKQorICB7CisgICAgV0RMTigiTm8gbWF0Y2hpbmcgZmlsZXMgZm91bmQiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBzdHJzPW9sZF9leHBsb2RlKGZpbGVzWzBdLCAiLyIpOworICBmaD0iLyI7CisgIGlmKHQ9c2l6ZW9mKHN0cnMpLTEpCisgICAgZmgrPWltcGxvZGUoc3Ryc1swLi50LTFdLCAiLyIpOworICBmb3IoaT0wOyBpPHM7IGkrKykKKyAgeworICAgIGZ0PW9sZF9leHBsb2RlKGZpbGVzW2ldLCAiLyIpW3RdOworICAgIGlmKCh1PXNpemVvZihzdHJzPW9sZF9leHBsb2RlKGZ0LCAiLiIpKSkmJi0tdSkKKyAgICB7CisgICAgICBmZj1pbXBsb2RlKHN0cnNbMC4udS0xXSwgIi4iKTsKKyAgICAgIGZyPWZoKyIvIitmZjsKKyAgICAgIGZlPXN0cnNbdV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBmZT0iIjsKKyAgICAgIGZmPWZ0OworICAgICAgZnI9ZmlsZXNbaV07CisgICAgfQorICAgIGNtZD1zdHJpbmdfcmVwbGFjZShhcmcsICIhISIsIGZpbGVzW2ldKTsKKyAgICBjbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCAiIWUiLCBmZSk7CisgICAgY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgIiFmIiwgZmYpOworICAgIGNtZD1zdHJpbmdfcmVwbGFjZShjbWQsICIhaCIsIGZoKTsKKyAgICBjbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCAiIXIiLCBmcik7CisgICAgY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgIiF0IiwgZnQpOworICAgIGlmKCEoQ29tbWFuZChjbWQpKSkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGdvdG8oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iaiwgdG1wOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhnbyh0bykgW29iamVjdF0iKTsKKyAgaWYoIXN0cikgc3RyPSJ+L3dvcmtyb29tIjsKKyAgaWYoIShvYmo9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBpZighKHN0cj1YRmluZEZpbGUoc3RyKSkpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZihjYXRjaChjYWxsX290aGVyKHN0ciwgIj8/PyIpKSkKKyAgICAgIHJldHVybiBUUlVFOworICAgIG9iaj1maW5kX29iamVjdChzdHIpOworICB9CisgIHRtcD1vYmo7CisgIHdoaWxlKG9iaiYmbGl2aW5nKG9iaikpCisgICAgb2JqPUVOVihvYmopOworICBjbG9uZXItPm1vdmUob2JqID8gb2JqIDogdG1wLCBNX1RQT1JUKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZ3JlcChzdHJpbmcgc3RyKQoreworICBpbnQgaSwgcywgdCwgbW9kZTsKKyAgc3RyaW5nICpmaWxlcywgKnRzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhncmVwOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgbW9kZT0wOworICBpZighcGlwZV9pbikKKyAgeworICAgIFVTQUdFMihzdHIsICJ4Z3IoZXApIFstaV0gWy12XSA8cmVnZXhwPiA8ZmlsZXBhdHRlcm4+Iik7CisgICAgaWYoISh0cz1vbGRfZXhwbG9kZShzdHIsICIgIikpfHwhKHM9c2l6ZW9mKHRzKSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgd2hpbGUodHNbMF1bMF09PSctJykKKyAgICB7CisgICAgICBpZihzPDMpCisgICAgICB7CisJV0RMTigiVG9vIGZldyBhcmd1bWVudHMgdG8geGdyZXAiKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBzd2l0Y2godHNbMF0pCisgICAgICB7CisJY2FzZSAiLXYiOgorCSAgbW9kZXw9WEdSRVBfUkVWRVJUOworCSAgdHM9dHNbMS4uXTsKKwkgIHMtLTsKKwkgIGJyZWFrOworCWNhc2UgIi1pIjoKKwkgIG1vZGV8PVhHUkVQX0lDQVNFOworCSAgdHM9dHNbMS4uXTsKKwkgIHMtLTsKKwkgIGJyZWFrOworCWNhc2UgIi12aSI6CisJY2FzZSAiLWl2IjoKKwkgIG1vZGV8PVhHUkVQX1JFVkVSVDsKKwkgIG1vZGV8PVhHUkVQX0lDQVNFOworCSAgdHM9dHNbMS4uXTsKKwkgIHMtLTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBXRExOKCJVbmtub3duIG9wdGlvbiAiK3RzWzBdKyIgZ2l2ZW4gdG8geGdyZXAiKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RyPWltcGxvZGUodHNbMC4ucy0yXSwgIiAiKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZighKCh0cz1vbGRfZXhwbG9kZShzdHIsICIgIikpJiYocz1zaXplb2YodHMpKSkpCisgICAgICBVU0FHRTMoInhncihlcCkgWy1pXSBbLXZdIDxyZWdleHA+Iik7CisgICAgd2hpbGUodHNbMF1bMF09PSctJykKKyAgICB7CisgICAgICBpZihzPDIpCisgICAgICB7CisJV0RMTigiVG9vIGZldyBhcmd1bWVudHMgdG8geGdyZXAiKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBzd2l0Y2godHNbMF0pCisgICAgICB7CisJY2FzZSAiLXYiOgorCSAgbW9kZXw9WEdSRVBfUkVWRVJUOworCSAgdHM9dHNbMS4uXTsKKwkgIHMtLTsKKwkgIGJyZWFrOworCWNhc2UgIi1pIjoKKwkgIG1vZGV8PVhHUkVQX0lDQVNFOworCSAgdHM9dHNbMS4uXTsKKwkgIHMtLTsKKwkgIGJyZWFrOworCWNhc2UgIi1pdiI6CisJY2FzZSAiLXZpIjoKKwkgIG1vZGV8PVhHUkVQX1JFVkVSVDsKKwkgIG1vZGV8PVhHUkVQX0lDQVNFOworCSAgdHM9dHNbMS4uXTsKKwkgIHMtLTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBXRExOKCJVbmtub3duIG9wdGlvbiAiK3RzWzBdKyIgZ2l2ZW4gdG8geGdyZXAiKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RyPWltcGxvZGUodHNbMC4ucy0xXSwgIiAiKTsKKyAgfQorICAKKyAgaWYobW9kZSZYR1JFUF9JQ0FTRSkKKyAgICBzdHI9bG93ZXJfY2FzZShzdHIpOworICBpZighKHJlZ2V4cCgoeyJkdW1teSJ9KSwgc3RyKSkpCisgIHsKKyAgICBXRExOKCJCYWQgcmVndWxhciBleHByZXNzaW9uIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYoIXBpcGVfaW4pCisgIHsKKyAgICBpZihmaWxlX3NpemUoVE1QX0ZJTEUpPjApCisgICAgICBybShUTVBfRklMRSk7CisgICAgaWYoKHQ9c2l6ZW9mKGZpbGVzPWxvbmdfZ2V0X2RpcihYRmlsZSh0c1tzLTFdKSwgRkFMU0UpKSkmJgorICAgICAgIChmaWxlX3NpemUoZmlsZXNbMF0pPj0wKSkKKyAgICB7CisgICAgICBmb3IoaT0wOyBpPHQ7IGkrKykKKwlYR3JlcEZpbGUoc3RyLCBmaWxlc1tpXSwgbW9kZSk7CisgICAgICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICAgIHsKKwlQSVBFX0RFTEVURShwaXBlX29mKTsKKwlpZighcGlwZV9vdnIpCisJeworCSAgd3JpdGVfZmlsZShwaXBlX29mLHJlYWRfZmlsZShUTVBfRklMRSwwLFBJUEVfTUFYKSk7CisJICBybShUTVBfRklMRSk7CisJfQorCWVsc2UKKwkgIHJlbmFtZShUTVBfRklMRSxwaXBlX29mKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlXKHJlYWRfZmlsZShUTVBfRklMRSwwLFBJUEVfTUFYKSk7CisJcm0oVE1QX0ZJTEUpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBXRExOKCJDYW5ub3QgcmVhZCBmaWxlKHMpIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RyaW5nICp0bXA7CisgICAgaWYoZmlsZV9zaXplKHBpcGVfaWYpPDApCisgICAgeworICAgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4Z3JlcCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIFRLKCJYZ3JlcDogc3RyOiAiK3N0cisiIG1vZGU6ICIrbW9kZSk7CisgICAgcz1zaXplb2YodG1wPW9sZF9leHBsb2RlKHJlYWRfZmlsZShwaXBlX2lmLDAsUElQRV9NQVgpLCJcbiIpKTsKKyAgICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgICBmb3IoaT0wO2k8cztpKyspCisgICAgeworICAgICAgLy8gVEsodG1wW2ldKyI8LT4iK3N0cik7CisgICAgICBpZihzaXplb2YocmVnZXhwKCh7KG1vZGUmWEdSRVBfSUNBU0U/bG93ZXJfY2FzZSh0bXBbaV0pOnRtcFtpXSl9KSxzdHIpKSkKKyAgICAgIHsKKwkvLyBUSygiWGdyZXA6IG1hdGNoZWQhIik7CisJaWYoIShtb2RlJlhHUkVQX1JFVkVSVCkpCisJICBpZihwaXBlX291dCYmcGlwZV9vZikKKwkgICAgd3JpdGVfZmlsZShwaXBlX29mLHRtcFtpXSsiXG4iKTsKKwkgIGVsc2UKKwkgICAgV0xOKHRtcFtpXSk7CisgICAgICB9CisgICAgICBlbHNlCisJaWYobW9kZSZYR1JFUF9SRVZFUlQpCisJICBpZihwaXBlX291dCYmcGlwZV9vZikKKwkgICAgd3JpdGVfZmlsZShwaXBlX29mLHRtcFtpXSsiXG4iKTsKKwkgIGVsc2UKKwkgICAgV0xOKHRtcFtpXSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGhiZWF0cyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBvYmplY3QgKmhiZWF0aW5mbzsKKyAgc3RyaW5nIHRtcCwgZmlsZTsKKyAgaW50IGksIHM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWGhiZWF0czogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFwaXBlX291dCkKKyAgeworICAgIFVTQUdFMShzdHIsICJ4aGIoZWF0cykgW3NlYXJjaCBwYXR0ZXJuXSIpOworICAgIGlmKCFzdHIpCisgICAgICBzdHI9Uk5BTUUoY2xvbmVyKTsKKyAgICBlbHNlIGlmKCFyZWdleHAoKHsiZHVtbXkifSksIHN0cikpCisgICAgeworICAgICAgV0RMTigiQmFkIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIFVTQUdFMShzdHIsInhoYihlYXRzKSIpOworICAgIGlmKHN0ciYmc3RyIT0iIikKKyAgICB7CisgICAgICBXRExOKCJNb3JlIGFyZ3VtZW50cyB0aGFuIGV4cGVjdGVkIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcz1zaXplb2YoaGJlYXRpbmZvPWhlYXJ0X2JlYXRfaW5mbygpKTsKKyAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgIGZvcihpPTA7IGk8czsgaSsrKQorICAgIGlmKGhiZWF0aW5mb1tpXSYmb2JqZWN0cChoYmVhdGluZm9baV0pKQorICAgIHsKKyAgICAgIHRtcD1PYmpGaWxlKGhiZWF0aW5mb1tpXSk7CisgICAgICBpZihzaXplb2YocmVnZXhwKCh7dG1wfSksIHN0cikpKQorCWlmKHBpcGVfb3V0JiZwaXBlX29mKQorCSAgd3JpdGVfZmlsZShwaXBlX29mLCB0bXArIlxuIik7CisJZWxzZQorCSAgV0xOKHRtcCk7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhoZWFkKHN0cmluZyBzdHIpCit7CisgIGludCBsaW5lczsKKyAgc3RyaW5nICp0bXAsIGZpbGU7CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhoZWFkOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXBpcGVfaW4pCisgIHsKKyAgICBVU0FHRTIoc3RyLCAieGhlYWQgPC0jPiA8ZmlsZT4iKTsKKyAgICBpZihzc2NhbmYoc3RyLCItJWQgJXMiLGxpbmVzLGZpbGUpIT0yKQorCXJldHVybiBGQUxTRTsKKyAgICBpZighKGZpbGU9WEZpbmRGaWxlKGZpbGUpKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBVU0FHRTIoc3RyLCAieGhlYWQgPC0jPiIpOworICAgIGlmKHNzY2FuZihzdHIsIi0lZCIsbGluZXMpIT0xKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChmaWxlX3NpemUoZmlsZT1waXBlX2lmKTwwKQorICAgIHsKKyAgICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geGhlYWQiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICB0bXA9b2xkX2V4cGxvZGUocmVhZF9maWxlKGZpbGUsMCxQSVBFX01BWCksIlxuIilbMC4ubGluZXMtMV07CisgIGlmKHBpcGVfaW4mJnBpcGVfaWY9PVBJUEVfRklMRSkKKyAgICBybShQSVBFX0ZJTEUpOworICBpZiAocGlwZV9vdXQmJnBpcGVfb2YpCisgIHsKKyAgICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgICB3cml0ZV9maWxlKHBpcGVfb2YsaW1wbG9kZSh0bXAsIlxuIikrIlxuIik7CisgIH0KKyAgZWxzZQorICAgIFdETE4oaW1wbG9kZSh0bXAsIlxuIikpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhoZWxwKHN0cmluZyBzdHIpCit7CisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4aGUobHApIik7CisgIFhNb3JlRmlsZShUT09MX01BTlBBR0UsIEZBTFNFKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYaWRzKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGlkKHMpIDxvYmplY3Q+Iik7CisgIFRLKCJYaWRzOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgICBXTE4oIlVJRD1cIiIrZ2V0dWlkKG9iaikrIlwiIC8gRVVJRD1cIiIrZ2V0ZXVpZChvYmopKyJcIiIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhpbmZvKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGluZihvKSA8b2JqZWN0PiIpOworICBUSygiWGluZm86IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZigob2JqPVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgaWYoaXNfcGxheWVyKG9iaikpCisgICAgeworICAgICAgV0xOKFBsYXllcldobyhvYmopKTsKKyAgICAgIFdMTihQbGF5ZXJNYWlsKG9iaiwgRkFMU0UpKTsKKyAgICAgIFdMTihQbGF5ZXJJUChvYmosIEZBTFNFKSk7CisgICAgICBXTE4oUGxheWVyUmFjZShvYmosIEZBTFNFKSk7CisgICAgICBXTE4oUGxheWVyRG9tYWluKG9iaiwgRkFMU0UpKTsKKyAgICAgIFdMTihQbGF5ZXJTdGF0cyhvYmosIEZBTFNFKSk7CisgICAgICBXTE4oUGxheWVyU25vb3Aob2JqLCBGQUxTRSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICBXRExOKCJTb3JyeSwgdGhpcyBpcyBub3QgYSBwbGF5ZXIiKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhpbmhlcml0KHN0cmluZyBzdHIpCit7CisgIGludCBzOworICBvYmplY3Qgb2JqOworICBzdHJpbmcgKnN0cnMsICppbmxpc3Q7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGluaChlcml0KSA8b2JqZWN0PiBbZnVuY3Rpb25dIik7CisgIFRLKCJYaW5oZXJpdDogc3RyOiAiK3N0cik7CisgIGlmKCEoc3Rycz1zdHJpcF9leHBsb2RlKHN0ciwgIiAiKSkpCisgICAgcmV0dXJuIEZBTFNFOworICBpZihvYmo9WEZpbmRPYmooc3Ryc1swXSkpCisgIHsKKyAgICBpbmxpc3Q9aW5oZXJpdF9saXN0KG9iaik7CisgICAgcz1zaXplb2YoaW5saXN0KTsKKyAgICB3aGlsZShzLS0pCisgICAgeworICAgICAgaWYoY2F0Y2goY2FsbF9vdGhlcihpbmxpc3Rbc10sICI/Pz8iKSkpCisgICAgICB7CisJV0RMTigiRmFpbGVkIHRvIGxvYWQgYWxsIGluaGVyaXRhbmNlIG9iamVjdHMiKTsKKwlyZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgb2JqPWZpbmRfb2JqZWN0KGlubGlzdFswXSk7CisgICAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgICAgaWYoc2l6ZW9mKHN0cnMpPT0xKQorICAgICAgSW5oZXJpdGFuY2Uob2JqICwwICwiIik7CisgICAgZWxzZQorICAgICAgSW5oZXJpdGFuY2Uob2JqLCBzdHJzWzFdLCAiIik7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYaW52ZW50b3J5KHN0cmluZyBzdHIpCit7CisgIGludCBpLCBzaG9ydDsKKyAgb2JqZWN0IGl0ZW07CisgIG1peGVkIHdobzsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4aSBbLXNdIFtwbGF5ZXJdIik7CisgIFRLKCJYaW52ZW50b3J5OiBzdHI6ICIrc3RyKTsKKyAgc2hvcnQ9MDsKKyAgd2hvPWNsb25lcjsKKyAgaWYoc3RyJiZzdHIhPSIiKQorICB7CisgICAgaWYoc3RyPT0iLXMiKQorICAgIHsKKyAgICAgIHNob3J0PTE7CisgICAgICB3aG89Y2xvbmVyOworICAgIH0KKyAgICBlbHNlIGlmKHNzY2FuZihzdHIsIi1zICVzIix3aG8pKQorICAgIHsKKyAgICAgIHNob3J0PTE7CisgICAgICB3aG89WEZpbmRPYmood2hvKTsKKyAgICB9CisgICAgZWxzZSBpZihzc2NhbmYoc3RyLCIlcyIsd2hvKSkKKyAgICB7CisgICAgICBzaG9ydD0wOworICAgICAgd2hvPVhGaW5kT2JqKHdobyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHdobz1jbG9uZXI7CisgIH0KKyAgaWYoIXdobykKKyAgICByZXR1cm4gRkFMU0U7CisgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICBpZighKHBpcGVfb3V0JiZwaXBlX29mKSkKKyAgICBXTE4od2hvLT5uYW1lKFdFU1NFTikrIiBJbnZlbnRvcnk6Iisoc2hvcnQ/IiAoc2hvcnQpIjoiIikpOworICBpZighc2hvcnQpCisgICAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgICBGT1JBTEwoaXRlbSwgd2hvKSBQcmludFNob3J0KEFSSUdIVCgrK2krIi4gIiwgNCwgIiAiKSwgaXRlbSwgcGlwZV9vZik7CisgICAgZWxzZQorICAgICAgRk9SQUxMKGl0ZW0sIHdobykgUHJpbnRTaG9ydChBUklHSFQoKytpKyIuICIsIDQsICIgIiksIGl0ZW0pOworICBlbHNlCisgICAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgICBGT1JBTEwoaXRlbSwgd2hvKSB3cml0ZV9maWxlKHBpcGVfb2YsKytpKyIuIFsiK29iamVjdF9uYW1lKGl0ZW0pKyJdXG4iKTsKKyAgICBlbHNlCisgICAgICBGT1JBTEwoaXRlbSwgd2hvKSBXTE4oKytpKyIuIFsiK29iamVjdF9uYW1lKGl0ZW0pKyJdIik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGxhZyhzdHJpbmcgc3RyKQoreworICBpbnQgaTsKKyAgZmxvYXQgKmxhZzsKKyAgb2JqZWN0IGRhZW1vbjsKKyAgc3RyaW5nIGxhZ3M7CisKKyAgaWYoZmlsZV9zaXplKExBR19PX0RBRU1PTisiLmMiKTw9MCkKKyAgeworICAgIFdMTigiU29ycnksIGxhZy1vLWRhZW1vbiBpcyBtaXNzaW5nISIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIAorICBMQUdfT19EQUVNT04tPk1hY2hIaW4oKTsKKyAgaWYoIShkYWVtb249ZmluZF9vYmplY3QoTEFHX09fREFFTU9OKSkpCisgICAgbGFnPSh7LTEuMCwtMS4wLC0xLjB9KTsKKyAgZWxzZQorICAgIGxhZz0oZmxvYXQgKilkYWVtb24tPnJlYWRfbGFnX2RhdGEoKTsKKyAgbGFncz0iTGV0enRlIDYwIG1pbjogIjsKKyAgaWYobGFnWzBdPj0wLjApCisgIHsKKyAgICBmb3IoaT1yb3VuZChsYWdbMF0pLTE7aT49MDtpLS0pCisgICAgICBsYWdzKz0iIyI7CisgICAgbGFncys9IiAoIitzcHJpbnRmKCIlLjFmIixsYWdbMF0pKyIlKSI7CisgIH0KKyAgZWxzZQorICAgIGxhZ3MrPSJOL0EiOworICBsYWdzKz0iXG5MZXR6dGUgMTUgbWluOiAiOworICBpZihsYWdbMV0+PTAuMCkKKyAgeworICAgIGZvcihpPXJvdW5kKGxhZ1sxXSktMTtpPj0wO2ktLSkKKyAgICAgIGxhZ3MrPSIjIjsKKyAgICBsYWdzKz0iICgiK3NwcmludGYoIiUuMWYiLGxhZ1sxXSkrIiUpIjsKKyAgfQorICBlbHNlCisgICAgbGFncys9Ik4vQSI7CisgIGxhZ3MrPSJcbkxldHp0ZSBNaW51dGU6ICI7CisgIGlmKGxhZ1syXT49MC4wKQorICB7CisgICAgZm9yKGk9cm91bmQobGFnWzJdKS0xO2k+PTA7aS0tKQorICAgICAgbGFncys9IiMiOworICAgIGxhZ3MrPSIgKCIrc3ByaW50ZigiJS4xZiIsbGFnWzJdKSsiJSkiOworICB9CisgIGVsc2UKKyAgICBsYWdzKz0iTi9BIjsKKyAgV0xOKGxhZ3MpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhsaWdodChzdHJpbmcgc3RyKQoreworICBpbnQgcywgYWRkbGlnaHQ7CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhsaShnaHQpIFtsaWdodF0iKTsKKyAgaWYoc3RyKQorICB7CisgICAgaWYoIXNzY2FuZihzdHIsICIlZCIsIGFkZGxpZ2h0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB4bGlnaHQrPWFkZGxpZ2h0OworICAgIGNsb25lci0+QWRkSW50TGlnaHQoYWRkbGlnaHQpOworICB9CisgIFdETE4oIkN1cnJlbnQgbGlnaHQgbGV2ZWxzOiAiK1RPT0xfTkFNRSsiPSIreGxpZ2h0KyIsIHJvb209IisKKyAgICAgICBFTlYoY2xvbmVyKS0+UXVlcnlJbnRMaWdodCgpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbG9hZChzdHJpbmcgc3RyKQoreworICBpbnQgaSwgZjsKKyAgb2JqZWN0IG9iaiwgKmludiwgdnJvb207CisgIHN0cmluZyBmaWxlLCBlcnJsb2csIGVycm9yLCAqc3RyczsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4bG9hKGQpIDxmaWxlbmFtZT4iKTsKKyAgaWYoIShmaWxlPVhGaW5kRmlsZShzdHIpKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZXJybG9nPUVSUl9GSUxFOworICBpZihmaWxlX3NpemUoZXJybG9nKT4wKQorICAgIHJtKGVycmxvZyk7CisgIGlmKG9iaj1maW5kX29iamVjdChmaWxlKSkKKyAgeworICAgIGlmKGNhdGNoKGNhbGxfb3RoZXIoVk9JRCwgIj8/PyIpKSkKKyAgICB7CisgICAgICBXRExOKCJFcnJvcjogY2Fubm90IGZpbmQgIitWT0lEKyIgdG8gcmVzY3VlIHBsYXllcnMiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgICB2cm9vbSA9IGZpbmRfb2JqZWN0KFZPSUQpOworICAgIGlmKGludj1maWx0ZXIoYWxsX2ludmVudG9yeShvYmopLCAjJ2lzX3BsYXllciwgTUUpKS8vJworICAgICAgZm9yKGk9MDsgaTxzaXplb2YoaW52KTsgaSsrKQorCU1vdmVPYmooaW52W2ldLCB2cm9vbSwgVFJVRSk7CisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgICBXTE4oIlVwZGF0ZSBhbmQgbG9hZDogIitmaWxlKTsKKyAgfQorICBlbHNlCisgICAgV0xOKCJMb2FkOiAiK2ZpbGUpOworICBpZihlcnJvcj1jYXRjaChjYWxsX290aGVyKGZpbGUsICI/Pz8iKSkpCisgIHsKKyAgICBXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgICBpZih2cm9vbSkKKyAgICAgIHRlbGxfb2JqZWN0KHZyb29tLCAiKioqIEZhaWxlZCB0byBsb2FkIHJvb20uIFlvdSBhcmUgaW4gdGhlIHZvaWQhXG4iKTsKKyAgfQorICBlbHNlIGlmKGludikKKyAgeworICAgIG9iaj1maW5kX29iamVjdChmaWxlKTsKKyAgICBmb3IoaT0wOyBpPHNpemVvZihpbnYpOyBpKyspCisgICAgICBpZihpbnZbaV0pCisJTW92ZU9iaihpbnZbaV0sIG9iaiwgVFJVRSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbG9vayhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgc3Q7CisgIHN0cmluZyBmaWxlOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhsb28oaykgW29iamVjdF0iKTsKKyAgVEsoIlhsb29rOiBzdHI6ICIrc3RyKTsKKyAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgIGZpbGUgPSBwaXBlX291dCYmcGlwZV9vZiA/IHBpcGVfb2YgOiAiIjsKKyAgaWYoc3RyJiZzdHIhPSIiKQorICB7CisgICAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgICAgIFByaW50T2JqKG9iaixmaWxlKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBvYmo9RU5WKGNsb25lcik7CisgICAgUHJpbnRPYmoob2JqLGZpbGUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGxwYyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZmlsZSwgZXJyb3I7CisgIGludCAqcnUxLCAqcnUyLCB0aW1lOworICBtaXhlZCByZXM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGxwKGMpIDxscGMgY29kZT4iKTsKKyAgZmlsZT1MUENfRklMRSsiLmMiOworICBpZihmaWxlX3NpemUoZmlsZSk+MCkKKyAgICBybShmaWxlKTsKKyAgaWYob2JqPWZpbmRfb2JqZWN0KExQQ19GSUxFKSkKKyAgICBEZXN0cnVjdChvYmopOworICB3cml0ZV9maWxlKGZpbGUsCisgICAgICAiI3ByYWdtYSBub193YXJuX21pc3NpbmdfcmV0dXJuLHN0cm9uZ190eXBlcyx3YXJuX2RlcHJlY2F0ZWQscnR0X2NoZWNrc1xuIgorICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG4iCisgICAgICAiI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD5cbiIKKyAgICAgICIjaW5jbHVkZSA8ZGVmaW5lcy5oPlxuIgorICAgICAgIiNpbmNsdWRlIDx3aXpsaXN0Lmg+XG4iCisgICAgICAiI2luY2x1ZGUgPG1vdmluZy5oPlxuIgorICAgICAgIiNpbmNsdWRlIFwiL3NlY3VyZS93aXpsZXZlbHMuaFwiXG4iCisgICAgICArKGZpbGVfc2l6ZShQUklWQVRFX0hFQURFUik+PTA/IiNpbmNsdWRlIFwiIitQUklWQVRFX0hFQURFUisiXCJcbiI6IiIpKworICAgICAgIm9iamVjdCBnZXQoc3RyaW5nIHN0cil7cmV0dXJuIHByZXZpb3VzX29iamVjdCgpLT5YRmluZE9iaihzdHIpO31cbiIrCisgICAgICAibWl4ZWQgZXZhbChtaXhlZCBtZSwgbWl4ZWQgaGVyZSl7IitzdHIrIn0iKTsKKyAgaWYoZXJyb3I9Y2F0Y2gob2JqPWNsb25lX29iamVjdChmaWxlKSkpCisgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uMF0pOworICBlbHNlCisgIHsKKyAgICBydTE9cnVzYWdlKCk7CisgICAgZXJyb3I9Y2F0Y2gocmVzPShtaXhlZClvYmotPmV2YWwoY2xvbmVyLCBFTlYoY2xvbmVyKSkpOworICAgIHJ1Mj1ydXNhZ2UoKTsKKyAgICBpZihlcnJvcikKKyAgICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICAgIGVsc2UKKyAgICB7CisgICAgICB0aW1lPXJ1MlswXS1ydTFbMF0rcnUyWzFdLXJ1MVsxXTsKKyAgICAgIFdETE4oIkV2YWx1YXRpb24gdGltZTogIisodGltZTwwID8gMCA6IHRpbWUpKyIgbXMiKTsKKyAgICAgIFdMTigiUmVzdWx0OiAiK21peGVkX3RvX3N0cmluZyhyZXMsIE1BWF9SRUNVUlNJT04pKTsKKyAgICAgIGlmKG9iamVjdHAocmVzKSkKKyAgICAgICAgdmFyaWFibGVbInJlc3VsdCJdID0gcmVzOworICAgIH0KKyAgfQorICBybShmaWxlKTsKKyAgaWYob2JqKQorICAgIERlc3RydWN0KG9iaik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWG1hbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbWFucGFnZTsKKyAgaW50IGksIGZvdW5kOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhtYShuKSA8bWFucGFnZT4iKTsKKyAgVygiTWFuOiAiKTsKKyAgZm9yKGk9MCwgZm91bmQ9MDsgaTxzaXplb2YobWFucGF0aCk7IGkrKykKKyAgeworICAgIG1hbnBhZ2U9bWFucGF0aFtpXStzdHI7CisgICAgaWYoZmlsZV9zaXplKG1hbnBhZ2UpPj0wKQorICAgIHsKKyAgICAgIFdMTihtYW5wYWdlKTsKKyAgICAgIFhNb3JlRmlsZShtYW5wYWdlLCBGQUxTRSk7CisgICAgICBmb3VuZD0xOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCFmb3VuZCkKKyAgICBXTE4oIi0gbm8gaGVscCBhdmFpbGFibGUgLSIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhtb3JlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqYXJncywgZmlsZTsKKyAgaW50IGxpbmU7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWG1vcmU6IHN0cjogIitzdHIpOworICBpZiAoIXBpcGVfaW4pCisgIHsKKyAgICBVU0FHRTIoc3RyLCAieG1vcihlKSA8ZmlsZW5hbWU+IFtzdGFydF0iKTsKKyAgICBzd2l0Y2goc2l6ZW9mKGFyZ3M9c3RyaXBfZXhwbG9kZShzdHIsICIgIikpKQorICAgIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIG1vcmVvZmZzZXQ9MTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgc3NjYW5mKGFyZ3NbMV0sICIlZCIsIGxpbmUpOworICAgICAgbW9yZW9mZnNldD0gbGluZT4wID8gbGluZSA6IDE7CisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmKGZpbGU9WEZpbmRGaWxlKGFyZ3NbMF0pKQorICAgICAgWE1vcmVGaWxlKGZpbGUsIFRSVUUpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKGZpbGVfc2l6ZShwaXBlX2lmKTwwKQorICAgIHsKKyAgICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geG1vcmUiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoIXN0cnx8c3RyPT0iIikKKyAgICAgIGxpbmU9MTsKKyAgICBlbHNlIGlmIChzc2NhbmYoc3RyLCAiJWQiLCBsaW5lKSE9MSkKKyAgICAgIFVTQUdFMygieG1vcihlKSBbc3RhcnRdIik7CisgICAgbW9yZW9mZnNldD0gbGluZT4wID8gbGluZSA6IDE7CisgICAgWE1vcmVGaWxlKHBpcGVfaWYsIFRSVUUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWG1vdmUoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajEsIG9iajI7CisgIHN0cmluZyB3aGF0LCBpbnRvOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhtb3YoZSkgPG9iamVjdD4gaW50byA8b2JqZWN0PiIpOworICBpZigoc3NjYW5mKHN0ciwgIiVzIGludG8gJXMiLCB3aGF0LCBpbnRvKT09MikmJgorICAgICAob2JqMT1YRmluZE9iaih3aGF0KSkmJihvYmoyPVhGaW5kT2JqKGludG8pKSkKKyAgICBNb3ZlT2JqKG9iajEsIG9iajIsIEZBTFNFKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbXNnKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB0bXA7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWG1zZzogc3RyOiAiK3N0cik7CisgIFVTQUdFMShzdHIsICJ4bXMoZykgW3RvIDxvYmplY3Q+fGFsbF0iKTsKKyAgaWYoIXN0cnx8c3RyPT0iIikKKyAgeworICAgIFdETE4oIlNlbmQgbWVzc2FnZSBpbnRvIHJvb20iKTsKKyAgICBzYXkoIk1lc3NhZ2UgZnJvbSAiK0NSTkFNRShjbG9uZXIpKyI6XG4iKTsKKyAgICBpZihwaXBlX2luJiZwaXBlX2lmKQorICAgICAgc2F5KHJlYWRfZmlsZShwaXBlX2lmLDAsUElQRV9NQVgpKTsKKyAgICBlbHNlCisgICAgeworICAgICAgV0RMTigiRW5kIG1lc3NhZ2Ugd2l0aCBcIi5cIiBvciBcIioqXCIiKTsKKyAgICAgIGlucHV0X3RvKCJYTXNnU2F5Iik7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgaWYoc3NjYW5mKHN0ciwgInRvICVzIiwgdG1wKSkKKyAgeworICAgIGlmKG1zZ3RvPVhGaW5kT2JqKHRtcCkpCisgICAgeworICAgICAgUHJpbnRTaG9ydCgiU2VuZCBtZXNzYWdlIHRvOiAiLCBtc2d0byk7CisgICAgICB0ZWxsX29iamVjdChtc2d0bywgIk1lc3NhZ2UgZnJvbSAiK0NSTkFNRShjbG9uZXIpKyIgdG8geW91OlxuIik7CisgICAgICBpZihwaXBlX2luJiZwaXBlX2lmKQorCXRlbGxfb2JqZWN0KG1zZ3RvLHJlYWRfZmlsZShwaXBlX2lmLDAsUElQRV9NQVgpKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKwlXRExOKCJFbmQgbWVzc2FnZSB3aXRoIFwiLlwiIG9yIFwiKipcIiIpOworCWlucHV0X3RvKCJYTXNnVGVsbCIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBlbHNlIGlmKHN0cj09ImFsbCIpCisgIHsKKyAgICBXRExOKCJTZW5kIG1lc3NhZ2UgdG8gYWxsIHBsYXllcnMiKTsKKyAgICBzaG91dCgiTWVzc2FnZSBmcm9tICIrQ1JOQU1FKGNsb25lcikrIiB0byBhbGw6XG4iKTsKKyAgICBpZihwaXBlX2luJiZwaXBlX2lmKQorICAgICAgc2hvdXQocmVhZF9maWxlKHBpcGVfaWYsMCxQSVBFX01BWCkpOworICAgIGVsc2UKKyAgICB7CisgICAgICBXRExOKCJFbmQgbWVzc2FnZSB3aXRoIFwiLlwiIG9yIFwiKipcIiIpOworICAgICAgaW5wdXRfdG8oIlhNc2dTaG91dCIpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2ludCBYbXRwKHN0cmluZyBzdHIpCit7CisgIGludCBzOworICBzdHJpbmcgKnN0cnMsIG9wdCwgZGlyLCBmaWxlOworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4bXQocCkgW29wdGlvbnNdIDxkaXJlY3Rvcnk+IDxmaWxlbmFtZT4iKTsKKyAgcz1zaXplb2Yoc3Rycz1vbGRfZXhwbG9kZShzdHIsICIgIikpOworICBpZihzPDIpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlIGlmKHM9PTIpCisgICAgb3B0PSIiOworICBlbHNlCisgICAgb3B0PWltcGxvZGUoc3Ryc1swLi5zLTNdLCAiICIpOworICBpZighKGRpcj0iLyIrKHN0cmluZylNQVNURVItPnZhbGlkX3JlYWQoc3Ryc1tzLTJdLCBnZXRldWlkKCksCisJCQkJCSAgImdldF9kaXIiLCBNRSkpKSB7CisgICAgV0RMTigiTm8gcGVybWlzc2lvbiB0byBvcGVuIGRpcmVjdG9yeSBmb3IgcmVhZGluZyIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmKCEoZmlsZT0iLyIrKHN0cmluZylNQVNURVItPnZhbGlkX3dyaXRlKHN0cnNbcy0xXSwgZ2V0ZXVpZCgpLAorCQkJCQkgICAgIndyaXRlX2ZpbGUiLCBNRSkpKSB7CisgICAgV0RMTigiTm8gcGVybWlzc2lvbiB0byBvcGVuIHNjcmlwdCBmaWxlIGZvciB3cml0aW5nIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYoZmlsZV9zaXplKGRpcikhPS0yIHx8IGZpbGVfc2l6ZShmaWxlKT09LTIpCisgICAgcmV0dXJuIEZBTFNFOworICBYbXRwU2NyaXB0KGRpciwgZmlsZSwgb3B0KTsKKyAgV0RMTigiRG9uZSIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhwcm9jKHN0cmluZyBzdHIpCit7CisgIGludCBzOworICBzdHJpbmcgKnN0cnM7CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhwcm9jIFstY10gWy1sXSBbLW1dIFstdV0gWy12XSIpOworCisgIGlmKGZpbGVfc2l6ZShUT09MX1BBVEgrIi9wcm9jIikhPS0yKQorICB7CisgICAgV0xOKCJTb3JyeSwgbm8gL3Byb2MgaW5mb3JtYXRpb24gYXZhaWxhYmxlISIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIAorICBpZighc3RyfHxzdHI9PSIifHwhKHM9c2l6ZW9mKHN0cnM9b2xkX2V4cGxvZGUoc3RyLCAiICIpKSkpCisgIHsKKyAgICBXTE4oIkxvYWQgYXZlcmFnZXM6Iik7CisgICAgY2F0KFRPT0xfUEFUSCsiL3Byb2MvbG9hZGF2ZyIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIAorICB3aGlsZShzPXNpemVvZihzdHJzKSkKKyAgeworICAgIHN3aXRjaChzdHJzWzBdKQorICAgIHsKKyAgICAgIGNhc2UgIi1jIjoKKyAgICAgIFdMTigiQ1BVIGluZm86Iik7CisgICAgICBjYXQoVE9PTF9QQVRIKyIvcHJvYy9jcHVpbmZvIik7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi1sIjoKKyAgICAgIFdMTigiTG9hZCBhdmVyYWdlczoiKTsKKyAgICAgIGNhdChUT09MX1BBVEgrIi9wcm9jL2xvYWRhdmciKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiLW0iOgorICAgICAgV0xOKCJNZW1vcnkgdXNhZ2U6Iik7CisgICAgICBjYXQoVE9PTF9QQVRIKyIvcHJvYy9tZW1pbmZvIik7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi11IjoKKyAgICAgIFdMTigiVXB0aW1lOiIpOworICAgICAgY2F0KFRPT0xfUEFUSCsiL3Byb2MvdXB0aW1lIik7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi12IjoKKyAgICAgIFdMTigiVmVyc2lvbjoiKTsKKyAgICAgIGNhdChUT09MX1BBVEgrIi9wcm9jL3ZlcnNpb24iKTsKKyAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIFdMTigiVW5rbm93biBvcHRpb246ICIrc3Ryc1swXSk7CisgICAgfQorICAgIHN0cnM9c3Ryc1sxLi5dOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHByb2Yoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpmdW5jcywgaW5oLCB0bXA7CisgIG1peGVkICpkYXRhLCAqZDsKKyAgbWFwcGluZyB4cHI7CisgIG9iamVjdCBvYmo7CisgIGludCBpLCBybjsKKworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieHByb2YgPDwtYz58PC1DPiA8ZmlsZT4+fDxvYmplY3Q+Iik7CisgIGlmKHN0clswLi4yXT09Ii1jICJ8fHN0clswLi4yXT09Ii1DICIpCisgIHsKKyAgICBybj0oc3RyWzFdPT0nQycpOworICAgIGlmKHN0cj1YRmluZEZpbGUoc3RyWzMuLl0pKQorICAgIHsKKyAgICAgIGluaD1zdHI9c3RyWzAuLjwzXTsKKyAgICAgIGlmKG9iaj1maW5kX29iamVjdChpbmgpKQorCURlc3RydWN0KG9iaik7CisgICAgICBpZihjYXRjaChjYWxsX290aGVyKGluaCwiPz8/IikpKQorCXJldHVybiBUUlVFOworICAgICAgb2JqPWZpbmRfb2JqZWN0KGluaCk7CisgICAgICBpZihybikKKyAgICAgIHsKKwlpbmgrPSIueHByb2YuYyI7CisJcm0oaW5oKTsKKwlzdHIrPSIuYyI7CisJcmVuYW1lKHN0ciwgaW5oKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlzdHI9WFBST0ZfRklMRTsKKwlybShzdHIpOworICAgICAgfQorICAgICAgdG1wPSJpbmhlcml0IFwiIitpbmgrIlwiO1xuI2luY2x1ZGUgXCIiK1hQUk9GX01BQ1JPKyJcIlxuIjsKKyAgICAgIGZ1bmNzPW1faW5kaWNlcyhta21hcHBpbmcoZnVuY3Rpb25saXN0KG9iaiwgMHgwODAwMDAwMSkpKS0oeyJfX0lOSVQifSk7CisgICAgICBmb3IoaT1zaXplb2YoZnVuY3MpOyBpLS07KQorCXRtcCs9IkYoIitmdW5jc1tpXSsiLFwiIitmdW5jc1tpXSsiXCIsIisKKwkgICIoQTAsQTEsQTIsQTMsQTQsQTUsQTYsQTcsQTgsQTkpKVxuIjsKKyAgICAgIHdyaXRlX2ZpbGUoc3RyLCB0bXApOworICAgICAgV0RMTigiRG9uZSIpOworICAgIH0KKyAgfQorICBlbHNlIGlmKG9iaj1YRmluZE9iaihzdHIpKQorICB7CisgICAgaWYoeHByPShtYXBwaW5nKW9iai0+X19xdWVyeV94cHJvZl9kYXRhX18oKSkKKyAgICB7CisgICAgICBmdW5jcz1tX2luZGljZXMoeHByKTsKKyAgICAgIGRhdGE9bV92YWx1ZXMoeHByKTsKKyAgICAgIHJtKFRNUF9GSUxFKTsKKyAgICAgIHN0cj0iRXZhbHVhdGlvbiBjb3N0IHBlciBmdW5jdGlvbjpcbk5BTUUJCQkgICAiKworCSIgQ0FMTFMgfCAgVE9ULkVYQ0wuICBUT1QuSU5DTC4gfCBSRUwuRVhDTC4gUkVMLklOQ0wuXG4iOworICAgICAgZm9yKGk9c2l6ZW9mKGZ1bmNzKTsgaS0tOykKKyAgICAgIHsKKwlpZihkPWRhdGFbaV0pIHsKKwkgIGZ1bmNzW2ldPUFMRUZUKCIiK2Z1bmNzW2ldKyIgIiwyNSwiLiIpK0FSSUdIVCgiICIrZFswXSwgNiwiLiIpKyIgfCAiKworCSAgICBBUklHSFQoIiAiK2RbMV0sMTAsIi4iKQkrIiAiK0FSSUdIVCgiICIrZFszXSwxMCwiLiIpKyIgfCAiKworCSAgICBBUklHSFQoIiAiK2RbMV0vZFswXSw5LCIuIikgKyIgIitBUklHSFQoIiAiK2RbM10vZFswXSw5LCIuIik7CisJfQorICAgICAgfQorICAgICAgc3RyKz1pbXBsb2RlKHNvcnRfYXJyYXkoZnVuY3MsICJzdHJpbmdfY29tcGFyZSIsIE1FKSwiXG4iKSsiXG4iOworICAgICAgd3JpdGVfZmlsZShUTVBfRklMRSxzdHIpOworICAgICAgc3RyPSJcbkVsYXBzZWQgdGltZSBwZXIgZnVuY3Rpb246XG5OQU1FCQkJICAiKworCSIgQ0FMTFMgfCAgVE9ULkVYQ0wuICBUT1QuSU5DTC4gfCBSRUwuRVhDTC4gUkVMLklOQ0wuXG4iOworICAgICAgZnVuY3M9bV9pbmRpY2VzKHhwcik7CisgICAgICBmb3IoaT1zaXplb2YoZnVuY3MpOyBpLS07KQorICAgICAgeworCWlmKGQ9ZGF0YVtpXSkKKwl7CisJICBmdW5jc1tpXT1BTEVGVCgiIitmdW5jc1tpXSsiICIsMjUsIi4iKStBUklHSFQoIiAiK2RbMF0sIDYsIi4iKSsiIHwgIisKKwkgICAgQVJJR0hUKCIgIisoZFsyXSs1KS8xMCsibXMiLDEwLCIuIikrIiAiKworCSAgICBBUklHSFQoIiAiKyhkWzRdKzUpLzEwKyJtcyIsMTAsIi4iKSsiIHwgIisKKwkgICAgQVJJR0hUKCIgIitkWzJdL2RbMF0rInVzIiw5LCIuIikrIiAiKworCSAgICBBUklHSFQoIiAiK2RbNF0vZFswXSsidXMiLDksIi4iKTsKKwl9CisgICAgICB9CisgICAgICBzdHIrPWltcGxvZGUoc29ydF9hcnJheShmdW5jcywgInN0cmluZ19jb21wYXJlIiwgTUUpLCJcbiIpKyJcbiI7CisgICAgICB3cml0ZV9maWxlKFRNUF9GSUxFLHN0cik7CisgICAgICBYTW9yZUZpbGUoVE1QX0ZJTEUsIEZBTFNFKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgV0RMTigiTm8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZSIpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHByb3BzKHN0cmluZyBzdHIpCit7CisgIGludCBpLCBzLCBmbGFnOworICBvYmplY3Qgb2JqOworICBzdHJpbmcgKnRtcDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4cHJvcChzKSBbLWZ8LW1dIDxvYmplY3Q+Iik7CisgIFRLKCJYcHJvcHM6IHN0cjogIitzdHIpOworICB0bXA9b2xkX2V4cGxvZGUoc3RyLCIgIik7CisgIHN3aXRjaCh0bXBbMF0pCisgIHsKKyAgICBjYXNlICItZiI6CisgICAgeworICAgICAgZmxhZyA9IDE7CisgICAgICB0bXA9dG1wWzEuLl07CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAiLW0iOgorICAgIHsKKyAgICAgIGZsYWcgPSAyOworICAgICAgdG1wPXRtcFsxLi5dOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHN0cj1pbXBsb2RlKHRtcCwiICIpOworICBpZigob2JqPVhGaW5kT2JqKHN0cikpKQorICAgIER1bXBQcm9wZXJ0aWVzKG9iaixmbGFnKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYcXVpdChzdHJpbmcgc3RyKQoreworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieHF1KGl0KSIpOworICBzdHI9b2JqZWN0X25hbWUoRU5WKGNsb25lcikpOworICBpZihtZW1iZXIoc3RyLCAnIycpPDApCisgICAgY2xvbmVyLT5zZXRfaG9tZShzdHIpOworICBjbG9uZXItPnF1aXQoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYc2NhbihzdHJpbmcgc3RyKQoreyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4c2MoYW4pIik7CisgIFcoIkRlc3RydWN0ZWQgdmFyaWFibGUocyk6ICIpOworICBzdHJpbmcqIG9sZHZhcnM9bV9pbmRpY2VzKHZhcmlhYmxlKTsKKyAgVmFyQ2hlY2soRkFMU0UpOworICBzdHJpbmcqIGRlc3ZhcnM9b2xkdmFycy1tX2luZGljZXModmFyaWFibGUpOworICBkZXN2YXJzID0gbWFwKGRlc3ZhcnMsIGZ1bmN0aW9uIHN0cmluZyAoc3RyaW5nIGspCisgICAgICB7cmV0dXJuICIkIitrO30gKTsKKyAgVyhDb3VudFVwKGRlc3ZhcnMpKTsKKyAgV0xOKCIiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYc2V0KHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBtaXhlZCBvYmo7CisgIHN0cmluZyBuYW1lLCB0bXA7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieHNlKHQpIFskPG5hbWU+PTxvYmplY3Q+XSIpOworICBpZihzdHIpIHsKKyAgICBpZihtZW1iZXIoKHsiJG1lIiwiJG0iLCIkaGVyZSIsIiRoIn0pLHN0cikhPS0xKQorICAgICAgV0RMTigiU29ycnksIHRoaXMgaXMgYSByZXNlcnZlZCB2YXJpYWJsZSBbIitzdHIrIl0iKTsKKyAgICBlbHNlIGlmKHNzY2FuZihzdHIsICIkJXM9JXMiLCBuYW1lLCB0bXApKQorICAgIHsKKyAgICAgIGlmKG9iaj1YRmluZE9iaih0bXApKQorICAgICAgeworICAgICAgICB2YXJpYWJsZVtuYW1lXSA9IG9iajsKKyAgICAgICAgV0xOKCIgJCIrbmFtZSsiPSIrT2JqRmlsZShvYmopKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGVsc2UKKyAgeworICAgIFZhckNoZWNrKEZBTFNFKTsKKyAgICBXTE4oIkN1cnJlbnQgc2V0dGluZ3M6Iik7CisgICAgZm9yZWFjaChzdHJpbmcga2V5LCBtaXhlZCB2YWwgOiB2YXJpYWJsZSkKKyAgICB7CisgICAgICBpZiAodmFsKQorICAgICAgICBXTE4oIiAkIitrZXkrIj0iK09iakZpbGUodmFsKSk7CisgICAgICBlbHNlCisgICAgICAgIG1fZGVsZXRlKHZhcmlhYmxlLCBrZXkpOworICAgIH0KKyAgICBXTE4oIiAkbWU9IitPYmpGaWxlKGNsb25lcikpOworICAgIFdMTigiICRoZXJlPSIrT2JqRmlsZShFTlYoY2xvbmVyKSkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHNoKHN0cmluZyBzdHIpCit7CisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4c2ggPGZpbGVuYW1lPiIpOworICBpZihzY3JpcHRsaW5lKQorICB7CisgICAgV0RMTigiQ2Fubm90IGV4ZWN1dGUgYW5vdGhlciBzY3JpcHQgZmlsZSB1bnRpbCBsYXN0IGV4ZWN1dGlvbiBoYXMgZW5kZWQiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZighKHN0cj1YRmluZEZpbGUoc3RyKSkpCisgICAgcmV0dXJuIFRSVUU7CisgIHN0cj1yZWFkX2ZpbGUoc3RyLCAxLCAxMDAwKTsKKyAgaWYoIShzY3JpcHRsaW5lPW9sZF9leHBsb2RlKHN0ciwgIlxuIikpKQorICB7CisgICAgV0RMTigiQmFkIHNjcmlwdCBmaWxlIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgc2NyaXB0c2l6ZT1zaXplb2Yoc2NyaXB0bGluZSk7CisgIFhFeGVjRmlsZShOVUxMKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYc29ydChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnRtcCxmaWxlOworICBpbnQgcyxyZXZlcnNlOworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYc29ydDogc3RyOiAiK3N0cik7CisgIGlmKCFwaXBlX2luKQorICB7CisgICAgVVNBR0UyKHN0ciwgInhzbyhydCkgWy1yXSBbZmlsZV0iKTsKKyAgICBpZighKHRtcD1vbGRfZXhwbG9kZShzdHIsICIgIikpfHwocz1zaXplb2YodG1wKSk+MikKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZih0bXBbMF09PSItciIpCisgICAgICBpZihzPT0xKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKwlyZXZlcnNlPVRSVUU7CisJdG1wPXRtcFsxLi5dOworICAgICAgfQorICAgIGVsc2UgaWYocz4xKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmKCEoZmlsZT1YRmluZEZpbGUodG1wWzBdKSkpCisgICAgeworICAgICAgV0RMTigiQ2FuJ3QgZmluZCBmaWxlIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoc3RyJiZzdHIhPSIiKQorICAgICAgaWYoc3RyPT0iLXIiKQorCXJldmVyc2U9VFJVRTsKKyAgICAgIGVsc2UKKwlVU0FHRTMoInhzbyhydCkgWy1yXSIpOworICAgIGlmIChmaWxlX3NpemUoZmlsZT1waXBlX2lmKTwwKQorICAgIHsKKyAgICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geHNvcnQiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICB0bXA9b2xkX2V4cGxvZGUocmVhZF9maWxlKGZpbGUsMCxQSVBFX01BWCksIlxuIik7CisgIGlmKHBpcGVfaW4mJnBpcGVfaWY9PVBJUEVfRklMRSkKKyAgICBybShQSVBFX0ZJTEUpOworICB0bXA9c29ydF9hcnJheSh0bXAscmV2ZXJzZT8jJzw6Iyc+KTsKKyAgICBpZiAocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgICB3cml0ZV9maWxlKHBpcGVfb2YsaW1wbG9kZSh0bXAsIlxuIikrIlxuIik7CisgICAgZWxzZQorICAgICAgV0RMTihpbXBsb2RlKHRtcCwiXG4iKSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHRhaWwoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp0bXAsZmlsZSxzaWduOworICBpbnQgbGluZXM7CisKKyAgaWYgKCFzdHIpIHsKKyAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHh0YWlsIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBzaWduPSItIjsKKyAgbGluZXM9MTA7CisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYdGFpbDogc3RyOiAiK3N0cik7CisgIGlmKCFwaXBlX2luKQorICB7CisgICAgaWYoc3NjYW5mKHN0ciwiLSVkICVzIixsaW5lcyxmaWxlKT09MikKKyAgICAgIHNpZ249Ii0iOworICAgIGVsc2UgaWYoc3NjYW5mKHN0ciwiKyVkICVzIixsaW5lcyxmaWxlKT09MikKKyAgICAgIHNpZ249IisiOworICAgIGVsc2UKKyAgICAgIGZpbGU9c3RyOworCisgICAgaWYoIShmaWxlPVhGaW5kRmlsZShmaWxlKSkpCisgICAgeworICAgICAgV0RMTigiQ2FuJ3QgZmluZCBmaWxlIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoc3NjYW5mKHN0ciwiLSVkIixsaW5lcyk9PTEpCisgICAgICBzaWduPSItIjsKKyAgICBlbHNlIGlmKHNzY2FuZihzdHIsIislZCIsbGluZXMpPT0xKQorICAgICAgc2lnbj0iKyI7CisgICAgaWYgKGZpbGVfc2l6ZShmaWxlPXBpcGVfaWYpPDApCisgICAgeworICAgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4dGFpbCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgaWYoc2lnbj09Ii0iKQorICB7CisgICAgaWYoIWxpbmVzKQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBpZihmaWxlX3NpemUoZmlsZSk+NTAwMDApCisgIHsKKyAgICBXRExOKCJGaWxlIHRvbyBsYXJnZSIpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYoc2lnbj09IisiKQorICAgIHRtcD1vbGRfZXhwbG9kZShyZWFkX2ZpbGUoZmlsZSwwLFBJUEVfTUFYKSwiXG4iKVtsaW5lcy4uXTsKKyAgZWxzZQorICAgIHRtcD1vbGRfZXhwbG9kZShyZWFkX2ZpbGUoZmlsZSwwLFBJUEVfTUFYKSwiXG4iKVs8bGluZXMuLl07CisgIGlmKHBpcGVfaW4mJnBpcGVfaWY9PVBJUEVfRklMRSkKKyAgICBybShQSVBFX0ZJTEUpOworICBpZiAocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgd3JpdGVfZmlsZShwaXBlX29mLGltcGxvZGUodG1wLCJcbiIpKyJcbiIpOworICBlbHNlCisgICAgV0xOKGltcGxvZGUodG1wLCJcbiIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYdG9vbChzdHJpbmcgc3RyKQoreworICBpbnQgbTsKKyAgc3RyaW5nIHRtcDsKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYdG9vbDogc3RyOiAiK3N0cik7CisgIFVTQUdFMShzdHIsICJ4dG8ob2wpIFt1cGRhdGV8Zmlyc3Q9PG9ufG9mZj58cHJvdGVjdD08b258b2ZmPnwiKworCSAiaW52Y2hlY2s9PG9ufG9mZj58XG4iKworCSAiXHRcdHZhcmNoZWNrPTxvbnxvZmY+fHNjYW5jaGs9PG9ufG9mZj58c2hvcnQ9PG9ufG9mZj58XG4iKworCSAiXHRcdGVjaG89PG9ufG9mZj58bW9yZT08YW1vdW50PnxraWxsfG5ld3N8c2F2ZXxsb2FkfHJlc2V0XSIpOworICBpZihzdHImJnN0ciE9IiIpCisgIHsKKyAgICBpZihzc2NhbmYoc3RyLCAibW9yZT0lZCIsIG0pKQorICAgIHsKKyAgICAgIGlmKG08NSkKKwlXRExOKCJTb3JyeSwgYW1vdW50IG9mIGxpbmVzIHNob3VsZCBiZSBtb3JlIHRoZW4gNSIpOworICAgICAgZWxzZQorICAgICAgeworCVdETE4oIlNldHRpbmcgYW1vdW50IG9mIGRpc3BsYXllZCBsaW5lcyB0byAiK20pOworCW1vcmVsaW5lcz1tOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBzd2l0Y2goc3RyKQorICAgICAgeworCWNhc2UgInVwZGF0ZSI6CisJaWYob2JqPWZpbmRfb2JqZWN0KFRPT0xfUEFUSCkpCisJICBEZXN0cnVjdChvYmopOworCWlmKGNhdGNoKG9iaj1jbG9uZV9vYmplY3QoVE9PTF9QQVRIKSkpCisJICBXTE4oIlVwZGF0aW5nICIrVE9PTF9USVRMRSsiIGZhaWxlZCEiKTsKKwllbHNlCisJICBvYmotPnVwZGF0ZV90b29sKEFVVE9MT0FEX0FSR1MsIGNsb25lcik7CisJcmV0dXJuIFRSVUU7CisJYnJlYWs7CisJY2FzZSAiZmlyc3Q9b24iOgorCU1PREVfT04oTU9ERV9GSVJTVCk7CisJbW92ZShjbG9uZXIpOworCVdETE4oIkF1dG9tYXRpYyBtb3ZpbmcgaW50byBwb2xlIHBvc2l0aW9uIG9mIGludmVudG9yeSB0dXJuZWQgb24iKTsKKwlicmVhazsKKwljYXNlICJmaXJzdD1vZmYiOgorCU1PREVfT0ZGKE1PREVfRklSU1QpOworCVdETE4oIkF1dG9tYXRpYyBtb3ZpbmcgaW50byBwb2xlIHBvc2l0aW9uIG9mIGludmVudG9yeSB0dXJuZWQgb2ZmIik7CisJYnJlYWs7CisJY2FzZSAicHJvdGVjdD1vbiI6CisJTU9ERV9PTihNT0RFX1BST1RFQ1QpOworCVdETE4oIlByb3RlY3Rpb24gZnJvbSBmb3JjZXMgYW5kIGlsbGVnYWwgbW92ZXMgdHVybmVkIG9uIik7CisJYnJlYWs7CisJY2FzZSAicHJvdGVjdD1vZmYiOgorCU1PREVfT0ZGKE1PREVfUFJPVEVDVCk7CisJV0RMTigiUHJvdGVjdGlvbiBmcm9tIGZvcmNlcyBhbmQgaWxsZWdhbCBtb3ZlcyB0dXJuZWQgb2ZmIik7CisJYnJlYWs7CisJY2FzZSAiaW52Y2hlY2s9b24iOgorCU1PREVfT04oTU9ERV9JTlZDSEVDSyk7CisJV0RMTigiQXV0b21hdGljIGNoZWNraW5nIGZvciBuZXcgb2JqZWN0cyBpbiBpbnZlbnRvcnkgdHVybmVkIG9uIik7CisJYnJlYWs7CisJY2FzZSAiaW52Y2hlY2s9b2ZmIjoKKwlNT0RFX09GRihNT0RFX0lOVkNIRUNLKTsKKwlXRExOKCJBdXRvbWF0aWMgY2hlY2tpbmcgZm9yIG5ldyBvYmplY3RzIGluIGludmVudG9yeSB0dXJuZWQgb2ZmIik7CisJYnJlYWs7CisJY2FzZSAidmFyY2hlY2s9b24iOgorCU1PREVfT04oTU9ERV9WQVJDSEVDSyk7CisJVmFyQ2hlY2soVFJVRSk7CisJV0RMTigiQXV0b21hdGljIHZhcmlhYmxlIGNoZWNraW5nIHR1cm5lZCBvbiIpOworCWJyZWFrOworCWNhc2UgInZhcmNoZWNrPW9mZiI6CisJTU9ERV9PRkYoTU9ERV9WQVJDSEVDSyk7CisJV0RMTigiQXV0b21hdGljIHZhcmlhYmxlIGNoZWNraW5nIHR1cm5lZCBvZmYiKTsKKwlicmVhazsKKwljYXNlICJzY2FuY2hrPW9uIjoKKwlNT0RFX09OKE1PREVfU0NBTkNISyk7CisJV0RMTigiU2NhbiBjaGVjayB0dXJuZWQgb24iKTsKKwlicmVhazsKKwljYXNlICJzY2FuY2hrPW9mZiI6CisJTU9ERV9PRkYoTU9ERV9TQ0FOQ0hLKTsKKwlXRExOKCJTY2FuIGNoZWNrIHR1cm5lZCBvZmYiKTsKKwlicmVhazsKKwljYXNlICJlY2hvPW9uIjoKKwlNT0RFX09OKE1PREVfRUNITyk7CisJV0RMTigiRWNob2luZyBvZiBtdWx0aXBsZSBjb21tYW5kIGV4ZWN1dGlvbiB0dXJuZWQgb24iKTsKKwlicmVhazsKKwljYXNlICJlY2hvPW9mZiI6CisJTU9ERV9PRkYoTU9ERV9FQ0hPKTsKKwlXRExOKCJFY2hvaW5nIG9mIG11bHRpcGxlIGNvbW1hbmQgZXhlY3V0aW9uIHR1cm5lZCBvZmYiKTsKKwlicmVhazsKKwljYXNlICJzaG9ydD1vbiI6CisJTU9ERV9PTihNT0RFX1NIT1JUKTsKKwlXRExOKCJVc2Ugb2Ygc2hvcnQgZGVzY3JpcHRpb25zIHR1cm5lZCBvbiIpOworCWJyZWFrOworCWNhc2UgInNob3J0PW9mZiI6CisJTU9ERV9PRkYoTU9ERV9TSE9SVCk7CisJV0RMTigiVXNlIG9mIHNob3J0IGRlc2NyaXB0aW9ucyB0dXJuZWQgb2ZmIik7CisJYnJlYWs7CisJY2FzZSAia2lsbCI6CisJV0RMTihUT09MX05BTUUrIiBzZWxmZGVzdHJ1Y3RzIik7CisJZGVzdHJ1Y3QoTUUpOworCWJyZWFrOworCWNhc2UgIm5ld3MiOgorCVhNb3JlRmlsZShUT09MX05FV1MsIEZBTFNFKTsKKwlicmVhazsKKwljYXNlICJyZXNldCI6CisJV0RMTigiUmVzZXR0aW5nICIrVE9PTF9USVRMRSk7CisJTUUtPl9fSU5JVCgpOworCWJyZWFrOworCWNhc2UgImxvYWQiOgorCWlmKGZpbGVfc2l6ZShTQVZFX0ZJTEUrIi5vIik+MCkKKwl7CisJICBXRExOKCJMb2FkaW5nICIrVE9PTF9USVRMRSsiIHNldHRpbmdzIik7CisJICByZXN0b3JlX29iamVjdChTQVZFX0ZJTEUpOworCX0KKwllbHNlCisJICBXRExOKCJTb3JyeSwgY2Fubm90IGZpbmQgZmlsZSB0byBsb2FkIHNldHRpbmdzIik7CisJYnJlYWs7CisJY2FzZSAic2F2ZSI6CisJV0RMTigiU2F2aW5nICIrVE9PTF9USVRMRSsiIHNldHRpbmdzIik7CisJc2F2ZV9vYmplY3QoU0FWRV9GSUxFKTsKKwlicmVhazsKKwlkZWZhdWx0OgorCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBXTE4oVE9PTF9USVRMRSsiIHNldHRpbmdzOiIpOworICAgIHRtcD0gKCIgZmlyc3QgLi4uLiA9ICIrKE1PREUoTU9ERV9GSVJTVCkgPyAib25cbiIgOiAib2ZmXG4iKSk7CisgICAgdG1wKz0oIiBwcm90ZWN0IC4uID0gIisoTU9ERShNT0RFX1BST1RFQ1QpID8gIm9uXG4iIDogIm9mZlxuIikpOworICAgIHRtcCs9KCIgaW52Y2hlY2sgLiA9ICIrKE1PREUoTU9ERV9JTlZDSEVDSykgPyAib25cbiIgOiAib2ZmXG4iKSk7CisgICAgdG1wKz0oIiB2YXJjaGVjayAuID0gIisoTU9ERShNT0RFX1ZBUkNIRUNLKSA/ICJvblxuIiA6ICJvZmZcbiIpKTsKKyAgICB0bXArPSgiIHNjYW5jaGsgLi4gPSAiKyhNT0RFKE1PREVfU0NBTkNISykgPyAib25cbiIgOiAib2ZmXG4iKSk7CisgICAgdG1wKz0oIiBlY2hvIC4uLi4uID0gIisoTU9ERShNT0RFX0VDSE8pID8gIm9uXG4iIDogIm9mZlxuIikpOworICAgIHRtcCs9KCIgc2hvcnQgLi4uLiA9ICIrKE1PREUoTU9ERV9TSE9SVCkgPyAib25cbiIgOiAib2ZmXG4iKSk7CisgICAgdG1wKz0oIiBtb3JlIC4uLi4uID0gIittb3JlbGluZXMpOworICAgIFdMTihzcHJpbnRmKCIlLTgwI3MiLCB0bXApKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFh0cmFjZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgZmlsZTsKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4dHJhYyhlKSA8b2JqZWN0PiIpOworICBpZighc3RyfHxzdHI9PSIiKQorICB7CisgICAgdHJhY2UoMCk7CisgICAgV0RMTigiRW5kaW5nIHRyYWNlIFsiK3Nob3J0X3BhdGgoIi8iK3RyYWNlcHJlZml4KDApKSsiXSIpOworICB9CisgIGVsc2UgaWYob2JqPVhGaW5kT2JqKHN0cikpCisgIHsKKyAgICBQcmludFNob3J0KCJUcmFjaW5nOiAiLCBvYmopOworICAgIGZpbGU9b2JqZWN0X25hbWUob2JqKTsKKyAgICBmaWxlPWZpbGVbMS4uPDFdOworICAgIHRyYWNlcHJlZml4KGZpbGUpOworICAgIHRyYWNlKFRSQUNFX0xFVkVMKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFh0cmFucyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInh0cmFuKHMpIDxvYmplY3Q+Iik7CisgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkmJkVOVihvYmopKQorICB7CisgICAgdGVsbF9yb29tKEVOVihvYmopLCBDUk5BTUUob2JqKSsiIHZhbmlzaGVzLlxuIik7CisgICAgdGVsbF9yb29tKEVOVihjbG9uZXIpLCBDUk5BTUUob2JqKSsKKwkgICAgICAiIGlzIHRlbGVwb3J0ZWQgaW50byB0aGlzIHJvb20gYnkgIitDUk5BTUUoY2xvbmVyKSsiLlxuIik7CisgICAgTW92ZU9iaihvYmosIEVOVihjbG9uZXIpLCBUUlVFKTsKKyAgICB0ZWxsX29iamVjdChvYmosICJZb3UndmUgYmVlbiB0ZWxlcG9ydGVkIHRvICIrQ1JOQU1FKGNsb25lcikrIi5cbiIpOworICB9CisgIGVsc2UKKyAgICBXRExOKCJGYWlsZWQgdG8gdGVsZXBvcnQgb2JqZWN0Iik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHVwZGF0ZShzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqOworICBzdHJpbmcgZmlsZTsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4dXAoZGF0ZSkgPGZpbGVuYW1lPiIpOworICBpZighKGZpbGU9WEZpbmRGaWxlKHN0cikpKQorICAgIHJldHVybiBUUlVFOworICBpZihmaWxlWzwyLi4gPDFdPT0iLmMiKQorICAgIGZpbGU9ZmlsZVswLi4gPDNdOworICBpZigob2JqPVhGaW5kT2JqKGZpbGUpKSYmKG9iaj1maW5kX29iamVjdChwdXJlX2ZpbGVfbmFtZShvYmopKSkpCisgIHsKKyAgICBQcmludFNob3J0KCJVcGRhdGluZzogIiwgb2JqKTsKKyAgICBEZXN0cnVjdChvYmopOworICB9CisgIGVsc2UKKyAgICBXRExOKCJPYmplY3Qgbm90IGZvdW5kIik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHVwdGltZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gVFJVRTsKK30KKworaW50IFh3YyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgZmlsZTsKKyAgc3RyaW5nIHRtcCwgKnRtcDI7CisgIGludCBpLCBjaGFycywgd29yZHMsIGxpbmVzLCBuY2hhcnMsIG53b3JkcywgbmxpbmVzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlh3Yzogc3RyOiAiK3N0cik7CisgIGNoYXJzPXdvcmRzPWxpbmVzPUZBTFNFOworICBpZighcGlwZV9pbikKKyAgeworICAgIFVTQUdFMihzdHIsICJ4d2MgWy1jd2xdIDxmaWxlPiIpOworICAgIGlmKHN0clswXT09Jy0nKQorICAgIHsKKyAgICAgIHdoaWxlKChzdHI9c3RyWzEuLl0pWzBdIT0nICcmJnNpemVvZihzdHIpKQorCXN3aXRjaChzdHJbMF0pCisJeworCSAgY2FzZSAnYyc6CisJICBjaGFycz1UUlVFOworCSAgYnJlYWs7CisJICBjYXNlICd3JzoKKwkgIHdvcmRzPVRSVUU7CisJICBicmVhazsKKwkgIGNhc2UgJ2wnOgorCSAgbGluZXM9VFJVRTsKKwkgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgIHJldHVybiBGQUxTRTsKKwl9CisgICAgICBzdHI9c3RyWzEuLl07CisgICAgfQorICAgIGlmKCEoZmlsZT1YRmluZEZpbGUoc3RyKSkpCisgICAgeworICAgICAgV0RMTigiQ2FuJ3QgZmluZCBmaWxlIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgVVNBR0UxKHN0ciwieHdjIFstY3dsXSIpOworICAgIGlmKHN0cikKKyAgICAgIGlmKHN0clswXT09Jy0nKQorICAgICAgeworCXdoaWxlKChzdHI9c3RyWzEuLl0pWzBdIT0nICcmJnNpemVvZihzdHIpKQorCSAgc3dpdGNoKHN0clswXSkKKwkgIHsKKwkgICAgY2FzZSAnYyc6CisJICAgIGNoYXJzPVRSVUU7CisJICAgIGJyZWFrOworCSAgICBjYXNlICd3JzoKKwkgICAgd29yZHM9VFJVRTsKKwkgICAgYnJlYWs7CisJICAgIGNhc2UgJ2wnOgorCSAgICBsaW5lcz1UUlVFOworCSAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgcmV0dXJuIEZBTFNFOworCSAgfQorICAgICAgfQorICAgICAgZWxzZQorCXJldHVybiBGQUxTRTsKKyAgICBpZihmaWxlX3NpemUoZmlsZT1waXBlX2lmKTwwKQorICAgIHsKKyAgICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geHdjIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgaWYoIShjaGFyc3x3b3Jkc3xsaW5lcykpCisgICAgY2hhcnM9d29yZHM9bGluZXM9VFJVRTsKKyAgbmxpbmVzPW53b3Jkcz1uY2hhcnM9MDsKKyAgdG1wPXJlYWRfZmlsZShmaWxlLDAsUElQRV9NQVgpOworICB0bXAyPWV4cGxvZGUodG1wLCJcbiIpOworICBpZihsaW5lcykKKyAgeworICAgIG5saW5lcz1zaXplb2YodG1wMik7CisgICAgaWYodG1wMls8MV09PSIiJiZubGluZXM+MSkKKyAgICAgIG5saW5lcy0tOworICB9CisgIGlmKHdvcmRzKQorICAgIGZvcihpPXNpemVvZih0bXAyKS0xO2k+PTA7aS0tKQorICAgIHsKKyAgICAgIFRLKHNwcmludGYoIiVPIix0bXAyW2ldKSk7CisgICAgICBpZih0bXAyW2ldIT0iIikKKwlud29yZHMrPXNpemVvZihyZWdleHBsb2RlKHRtcDJbaV0sIlsJXSIpLSh7IiIsIiAiLCIJIn0pKTsKKyAgICAgIFRLKHNwcmludGYoIiVPIixyZWdleHBsb2RlKHRtcDJbaV0sIlsJXSIpLSh7IiIsIiAiLCIJIn0pKSk7CisgICAgICBUSygibndvcmRzOiAiK253b3Jkcyk7CisgICAgfQorICBpZihjaGFycykKKyAgICBmb3IoaT1zaXplb2YodG1wMiktMTtpPj0wO2ktLSkKKyAgICAgIG5jaGFycys9c2l6ZW9mKHRtcDJbaV0pKzE7CisgIHRtcDI9MDsKKyAgdG1wPSIiOworICBpZihsaW5lcykKKyAgICB0bXArPXNwcmludGYoIiU3ZCIsbmxpbmVzKSsiICI7CisgIGlmKHdvcmRzKQorICAgIHRtcCs9c3ByaW50ZigiJTdkIixud29yZHMpKyIgIjsKKyAgaWYoY2hhcnMpCisgICAgdG1wKz1zcHJpbnRmKCIlN2QiLG5jaGFycykrIiAiOworICBpZihmaWxlIT1waXBlX2lmKQorICAgIHRtcCs9ZmlsZTsKKyAgV0xOKHRtcCk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgY21kYXZnX2NvbXBhcmUoc3RyaW5nIGEsIHN0cmluZyBiKQoreworICBpbnQgeCx5OworICBzdHJpbmcgZHVtOworICBzc2NhbmYoYSwiJXMgY21kYXZnOiAlZCIsZHVtLHgpOworICBzc2NhbmYoYiwiJXMgY21kYXZnOiAlZCIsZHVtLHkpOworICByZXR1cm4geD09eT8wOih4Pnk/MTotMSk7Cit9CisKK2ludCBYd2hvKHN0cmluZyBvcHQpCit7CisgIHN0cmluZyAqc3RycyxzdHIsZnVuYzsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYd2hvOiBvcHQ6IFwiIitvcHQrIlwiIik7CisgIFVTQUdFMShvcHQsICJ4d2gobykgW21haWx8aXB8cmFjZXxndWlsZHxkb21haW58c3RhdHN8c25vb3BdIik7CisgIGZ1bmM9InN0cmluZ19jb21wYXJlIjsKKyAgaWYoIW9wdHx8b3B0PT0iIikKKyAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVyV2hvIiwgTUUpOworICBlbHNlCisgICAgc3dpdGNoKG9wdCkKKyAgICB7CisgICAgICBjYXNlICJtYWlsIjoKKyAgICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJNYWlsIiwgTUUsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJpcCI6CisgICAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVySVAiLCBNRSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgInJhY2UiOgorICAgICAgY2FzZSAiZ3VpbGQiOgorICAgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllclJhY2UiLCBNRSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgImRvbWFpbiI6CisgICAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVyRG9tYWluIiwgTUUsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJzdGF0IjoKKyAgICAgIGNhc2UgInN0YXRzIjoKKyAgICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJTdGF0cyIsIE1FLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAic25vb3AiOgorICAgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllclNub29wIiwgTUUsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJjbWRhdmciOgorICAgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllckNtZEF2ZyIsIE1FLCBUUlVFKTsKKyAgICAgIGZ1bmM9ImNtZGF2Z19jb21wYXJlIjsKKyAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHN0cnM9c29ydF9hcnJheShzdHJzLCBmdW5jLCBNRSk7CisgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgIHdyaXRlX2ZpbGUocGlwZV9vZixpbXBsb2RlKHN0cnMsIlxuIikrIlxuIik7CisgIGVsc2UKKyAgICBXTE4oaW1wbG9kZShzdHJzLCJcbiIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Rvb2xsaWIuYyBiL29iai90b29scy9NR3Rvb2wvdG9vbGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NjQwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2xsaWIuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIE1HdG9vbC0xLjAKKyAqIEZpbGU6IHRvb2xsaWIuYworICogTWFpbnRhaW5lcjogS2lya0BNb3JnZW5HcmF1ZW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgb3JpZ2luYWwgWHRvb2wgaXMgY29weXJpZ2h0ZWQgYnkgSHlwICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJ0b29sbGliLmgiCisjaW5jbHVkZSA8bHBjdHlwZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisvKgorc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKQoreworICBpbnQgcywgdDsKKyAgc3RyaW5nICpzdHJzOworICAKKyAgaWYoZGVsID09ICIiKQorICAgIHJldHVybiAoe3N0cn0pOworICBzdHJzPWV4cGxvZGUoc3RyLCBkZWwpOworICBzPTA7CisgIHQ9c2l6ZW9mKHN0cnMpLTE7CisgIHdoaWxlKHM8PXQgJiYgc3Ryc1tzKytdID09ICIiKQorICAgIDsKKyAgcy0tOworICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIikKKyAgICA7CisgIHQrKzsKKyAgaWYoczw9dCkKKyAgICByZXR1cm4gc3Ryc1tzLi50XTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyAqZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKQoreworICByZXR1cm4gZXhwbG9kZShzdHIsIGRlbCk7Cit9CisqLworc3RyaW5nICpzdHJpcF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpCit7CisgIHJldHVybiBleHBsb2RlKHN0ciwgZGVsKS0oeyIifSk7Cit9CisKK3N0cmluZyBzdHJpcF9zdHJpbmcoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIGltcGxvZGUoc3RyaXBfZXhwbG9kZShzdHIsIiAiKSwiICIpOworfQorCitpbnQgc3RyaW5nX2NvbXBhcmUoc3RyaW5nIGEsIHN0cmluZyBiKQoreworICByZXR1cm4gYT09Yj8wOihhPmI/MTotMSk7Cit9CisKK3N0cmluZyBjYXBfc3RyaW5nKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBjYXBpdGFsaXplKHN0cik7Cit9CisKK3N0cmluZyBzaG9ydF9wYXRoKHN0cmluZyBmaWxlKQoreworICBpbnQgczsKKyAgc3RyaW5nIHRtcDsKKyAgCisgIGlmKCFmaWxlKQorICAgIHJldHVybiAwOworICBpZihQTCkKKyAgeworICAgIGlmKGZpbGVbMC4uIDhdPT0iL3BsYXllcnMvIikKKyAgICB7CisgICAgICBzPXNpemVvZihnZXR1aWQoUEwpKSs4OworICAgICAgcmV0dXJuICJ+IisoZmlsZVs5Li4gc109PWdldHVpZChQTCkgPworCQkgIGZpbGVbcysxLi4gPDFdIDogZmlsZVs5Li4gPDFdKTsKKyAgICB9CisgIH0KKyAgaWYoZmlsZVswLi4gMl09PSIvZC8iKQorICAgIHJldHVybiAiKyIrZmlsZVszLi4gPDFdOworICBlbHNlCisgICAgcmV0dXJuIGZpbGU7ICAKK30KKworc3RyaW5nIGxvbmdfcGF0aChzdHJpbmcgZmlsZSkKK3sKKyAgcmV0dXJuIChzdHJpbmcpTUFTVEVSLT5tYWtlX3BhdGhfYWJzb2x1dGUoZmlsZSk7Cit9CisKK3N0cmluZyAqbG9uZ19nZXRfZGlyKHN0cmluZyBwYXQsIGludCBhbGwpCit7CisgIGludCBpLCBzOworICBzdHJpbmcgc3RyLCBkaXIsICpmaWxlLCAqdG1wOworICAKKyAgaWYoIXBhdCkKKyAgICByZXR1cm4gKHt9KTsKKyAgcGF0PWxvbmdfcGF0aChwYXQpOworICBpZih0bXA9b2xkX2V4cGxvZGUocGF0LCAiLyIpKQorICAgIGRpcj0iLyIraW1wbG9kZSh0bXBbMC4uc2l6ZW9mKHRtcCktMl0sICIvIikrIi8iOworICBlbHNlCisgICAgZGlyPSIvIjsKKyAgcz1zaXplb2YodG1wPWdldF9kaXIocGF0KSk7CisgIGZpbGU9KHt9KTsKKyAgZm9yKGk9MDtpPHM7aSsrKQorICB7CisgICAgc3RyPWRpcit0bXBbaV07CisgICAgaWYoYWxsfHxmaWxlX3NpemUoc3RyKT49MCkKKyAgICAgIGZpbGUrPSh7c3RyfSk7CisgIH0KKyAgcmV0dXJuIGZpbGU7Cit9CisKK3N0cmluZyBsaXRfc3RyaW5nKHN0cmluZyBzdHIpCit7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXCIsICJcXFxcIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcYiIsICJcXGIiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxuIiwgIlxcbiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXHIiLCAiXFxyIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcdCIsICJcXHQiKTsKKyAgcmV0dXJuIHN0cmluZ19yZXBsYWNlKHN0ciwgIlwiIiwgIlxcXCIiKTsKK30KKworc3RyaW5nIG1peGVkX3RvX3N0cmluZyhtaXhlZCBtaXgsIGludCBsdmwpCit7CisgIGludCBpLCBqLCBzLCB0OworICBzdHJpbmcgc3RyOworICBtaXhlZCAqa2V5czsKKworICBpZihsdmwpCisgIHsKKyAgICBzd2l0Y2godHlwZW9mKG1peCkpCisgICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgVF9JTlZBTElEOgorICAgICAgcmV0dXJuICI8aW52YWxpZD4iOworICAgICAgY2FzZSBUX1NUUlVDVDoKKyAgICAgIHJldHVybiB0b19zdHJpbmcobWl4KTsKKyAgICAgIGNhc2UgVF9MVkFMVUU6CisgICAgICByZXR1cm4gIiYiK21peGVkX3RvX3N0cmluZyhtaXgsIGx2bC0xKTsKKyAgICAgIGNhc2UgVF9OVU1CRVI6CisgICAgICBjYXNlIFRfRkxPQVQ6CisgICAgICByZXR1cm4gdG9fc3RyaW5nKG1peCk7CisgICAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgcmV0dXJuICJcIiIrbGl0X3N0cmluZyhtaXgpKyJcIiI7CisgICAgICBjYXNlIFRfUE9JTlRFUjoKKyAgICAgIHJldHVybiAiKHsiK2ltcGxvZGUobWFwKG1peCwibWl4ZWRfdG9fc3RyaW5nIixNRSxsdmwtMSksIiwiKSsifSkiOworICAgICAgY2FzZSBUX09CSkVDVDoKKyAgICAgIHJldHVybiAiWyIrc2hvcnRfcGF0aChvYmplY3RfbmFtZSgob2JqZWN0KW1peCkpKyJdIjsKKyAgICAgIGNhc2UgVF9NQVBQSU5HOgorICAgICAgcz1zaXplb2Yoa2V5cz1tX2luZGljZXMobWl4KSk7CisgICAgICB0PWdldF90eXBlX2luZm8obWl4LCAxKTsKKyAgICAgIHN0cj0iKFsiOworICAgICAgZm9yKGk9MDtpPHM7aSsrKQorICAgICAgeworCXN0cis9bWl4ZWRfdG9fc3RyaW5nKGtleXNbaV0sIGx2bC0xKTsKKwlpZih0KQorCXsKKwkgIHN0cis9IjoiK21peGVkX3RvX3N0cmluZyhtaXhba2V5c1tpXSwwXSwgbHZsLTEpOworCSAgZm9yKGo9MTtqPHQ7aisrKQorCSAgICBzdHIrPSI7IittaXhlZF90b19zdHJpbmcobWl4W2tleXNbaV0sal0sIGx2bC0xKTsKKwl9CisJaWYoaTxzLTEpIHN0cis9IiwiOworICAgICAgfQorICAgICAgcmV0dXJuIHN0cisiXSkiOworICAgICAgY2FzZSBUX0NMT1NVUkU6CisgICAgICBjYXNlIFRfU1lNQk9MOgorICAgICAgcmV0dXJuIHNwcmludGYoIiVPIiwgbWl4KTsKKyAgICAgIGNhc2UgVF9RVU9URURfQVJSQVk6CisgICAgICByZXR1cm4gIiciK21peGVkX3RvX3N0cmluZyhmdW5jYWxsKGxhbWJkYSgwLCBtaXgpKSwgbHZsLTEpOworICAgIH0KKyAgfQorICByZXR1cm4gIi4uLiI7Cit9CisKK2ludCBpc19wbGF5ZXIob2JqZWN0IG9iaikKK3sKKyAgcmV0dXJuIGlzX29iaihvYmopJiZxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iaik7Cit9CisKK2ludCBpc19ub3RfcGxheWVyKG9iamVjdCBvYmopCit7CisgIHJldHVybiBpc19vYmoob2JqKSYmIWlzX3BsYXllcihvYmopOworfQorCitpbnQgcm91bmQoZmxvYXQgdmFsKQoreworICBpbnQgdG1wOworCisgIHRtcD0oaW50KXZhbDsKKyAgLy8gb25seSBwb3NpdGl2ZSB2YWwKKyAgaWYoIHZhbCAtIHRtcCA+PSAwLjUgKQorICAgIHJldHVybiB0bXArMTsKKyAgcmV0dXJuIHRtcDsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvdG9vbGxpYi5oIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllODI2NAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvdG9vbGxpYi5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBNR3Rvb2wtMS4wCisgKiBGaWxlOiB0b29sbGliLmgKKyAqIE1haW50YWluZXI6IEtpcmtATW9yZ2VuR3JhdWVuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fVE9PTExJQl9IX18KKyNkZWZpbmUgX19UT09MTElCX0hfXyAxCisKKyNpZm5kZWYgTUFTVEVSCisjZGVmaW5lIE1BU1RFUiBfX01BU1RFUl9PQkpFQ1RfXworI2VuZGlmCisKKyNkZWZpbmUgaXNfb2JqKHgpICAgICAgICAgKCh4KSYmb2JqZWN0cCh4KSkKKworI2RlZmluZSBpc19saXZpbmcoeCkgICAgICAoaXNfb2JqKHgpJiZsaXZpbmcoeCkpCisjZGVmaW5lIGlzX25vdF9saXZpbmcoeCkgIChpc19vYmooeCkmJiFpc19saXZpbmcoeCkpCisjZGVmaW5lIGlzX25ldGRlYWQoeCkgICAgIChpc19vYmooeCkmJmlzX3BsYXllcih4KSYmIWludGVyYWN0aXZlKHgpKQorI2RlZmluZSBpc19hbGl2ZSh4KSAgICAgICAoaXNfb2JqKHgpJiZpc19wbGF5ZXIoeCkmJmludGVyYWN0aXZlKHgpKQorI2RlZmluZSBpc19zbm9vcGVkKHgpICAgICAoaXNfb2JqKHgpJiZvYmplY3RwKHF1ZXJ5X3Nub29wKHgpKSkKKyNkZWZpbmUgaXNfbm90X3Nub29wZWQoeCkgKGlzX29iaih4KSYmIWlzX3Nub29wZWQoeCkpCisjZGVmaW5lIGlzX2ludmlzKHgpICAgICAgIChpc19vYmooeCkmJigoeCktPlF1ZXJ5UHJvcChQX0lOVklTKXx8ISh4KS0+UXVlcnlQcm9wKFBfU0hPUlQpKSkpCisjZGVmaW5lIGlzX25vdF9pbnZpcyh4KSAgIChpc19vYmooeCkmJiFpc19pbnZpcyh4KSkKKworI2RlZmluZSBwdXJlX2ZpbGVfbmFtZSh4KSAgICAgKGlzX29iaih4KT9vbGRfZXhwbG9kZShvYmplY3RfbmFtZSh4KSwiIyIpWzBdOjApCisjZGVmaW5lIHNvdXJjZV9maWxlX25hbWUoeCkgICAoaXNfb2JqKHgpP3B1cmVfZmlsZV9uYW1lKCh4KSkrIi5jIjowKQorI2RlZmluZSBzdHJpbmdfcmVwbGFjZSh4LHkseikgaW1wbG9kZShleHBsb2RlKCh4KSwoeSkpLCh6KSkKKworaW50IHN0cmluZ19jb21wYXJlKHN0cmluZyBhLCBzdHJpbmcgYik7CitzdHJpbmcgY2FwX3N0cmluZyhzdHJpbmcgc3RyKTsgIAorc3RyaW5nIHNob3J0X3BhdGgoc3RyaW5nIGZpbGUpOworc3RyaW5nIGxvbmdfcGF0aChzdHJpbmcgZmlsZSk7CisvL3N0cmluZyAqb2xkX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCk7CisvL3N0cmluZyAqZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKTsKK3N0cmluZyAqc3RyaXBfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKTsKK3N0cmluZyBzdHJpcF9zdHJpbmcoc3RyaW5nIHN0cik7CitzdHJpbmcgKmxvbmdfZ2V0X2RpcihzdHJpbmcgcGF0LCBpbnQgYWxsKTsKK3N0cmluZyBsaXRfc3RyaW5nKHN0cmluZyBzdHIpOworc3RyaW5nIG1peGVkX3RvX3N0cmluZyhtaXhlZCBtaXgsIGludCBsZXZlbCk7CitpbnQgaXNfcGxheWVyKG9iamVjdCBvYmopOworaW50IGlzX25vdF9wbGF5ZXIob2JqZWN0IG9iaik7CitpbnQgcm91bmQoZmxvYXQgdmFsKTsKKworI2VuZGlmIC8qIF9fVE9PTExJQl9IX18gKi8KZGlmZiAtLWdpdCBhL29iai90b29scy9SRUFETUUgYi9vYmovdG9vbHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGNlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK1RoZSBmaWxlcyBjb250YWluZWQgaW4gdGhpcyBzdWJ0cmVlIGFyZSB1bnN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL29iai90b29scy9idG9vbC5jIGIvb2JqL3Rvb2xzL2J0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2M2U4OAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9idG9vbC5jCkBAIC0wLDAgKzEsMTIxIEBACisjcHJhZ21hIG5vX3NoYWRvdywgbm9faW5oZXJpdAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIHBlZGFudGljLHJhbmdlX2NoZWNrLHdhcm5fZGVwcmVjYXRlZAorI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLHdhcm5fbWlzc2luZ19yZXR1cm4sd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCisjZGVmaW5lIEJBUkNISVYgIi9kL2Vyem1hZ2llci9ib2luZy9iYWxhbmNlL2JhcmNoaXZlcyIKKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCw3OCwwLEJTX0xFQVZFX01ZX0xGUykKKworcHJpdmF0ZSB2YXJhcmdzIHZvaWQgcHJpbnRfbWFwKG1hcHBpbmcgdG1wLGludCBzaG9ydCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCJCYWxhbmNlLVRvb2wiKTsKKyAgQWRkSWQoKHsiYnRvb2wiLCJiYWxhbmNldG9vbCIsImJhbGFuY2UtdG9vbCJ9KSk7CisgIFNldFByb3AoUF9TSE9SVCwiRWluIEJhbGFuY2UtVG9vbCBsaWdodCIpOworICBTZXRQcm9wKFBfTE9ORywKKyAgICBCUygiRGllcyBpc3QgZGFzIEJhbGFuY2UtVG9vbCBsaWdodC4gRXMgdmVyc3RlaHQgZm9sZ2VuZGUgQmVmZWhsZTpcbiIKKyAgICAiLSBidG9wIDxuPjogWmVpZ3QgZGVuIGxldHp0ZW4gZ2VuZWhtaWd0ZW4gQW50cmFnIHp1IFRvcCBuLlxuIgorICAgICItIGJzdWNoIFstc10gPHN0cj46IFN1Y2h0IGNhc2Utc2Vuc2l0aXYgbmFjaCBzdHIsIC1zIGJyaWNodCBqZWRlbiAiCisgICAgIkVpbnRyYWcgbmFjaCA3OCBaZWljaGVuIGFiLlxuIgorICAgICItIGJpbmhhbHQgWy1zXTogWmVpZ3QgZGVuIGdlc2FtdGVuIEluaGFsdCBkZXMgQmFsYW5jZWFyY2hpdmVzLCAtcyAiCisgICAgImJyaWNodCBqZWRlbiBFaW50cmFnIG5hY2ggNzggWmVpY2hlbiBhYi5cblxuIgorICAgICJFcyBrYW5uIHZvcmtvbW1lbiwgZGFzcyBFaW50cmFlZ2UgZGVyIGZhbHNjaGVuIFVJRCB6dWdlb3JkbmV0IHNpbmQsICIKKyAgICAib2RlciBkYXNzIGRpZSBHZW5laG1pZ3VuZyBuaWNodCBzZWhyIGF1c3NhZ2VrcmFlZnRpZyBpc3QsIGluIGRpZXNlbSAiCisgICAgIkZhbGwgYml0dGUgZWluZSBNYWlsIGFuIGRhcyBCYWxhbmNldGVhbSBzY2hyZWliZW4uIikpOworICBBZGRDbWQoImJ0b3AiLAorICAgIGZ1bmN0aW9uIGludChzdHJpbmcgc3RyKQorICAgIHsKKyAgICAgIGludCBuOworICAgICAgaWYoIXN0ciB8fCBzc2NhbmYoc3RyLCIlZCIsbikhPTEpCisgICAgICB7CisgICAgICAgIG5vdGlmeV9mYWlsKAorICAgICAgICAgIEJTKCJTeW50YXg6IGJ0b3AgPG4+IikpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKS0+UmVjZWl2ZU1zZygKKyAgICAgICAgQkFSQ0hJVi0+R2V0TGlnaHRBbm5vdW5jZShuKSwKKyAgICAgICAgTVRfTk9USUZJQ0FUSU9OfE1TR19CU19MRUFWRV9MRlMpOworICAgICAgcmV0dXJuIDE7CisgICAgfSk7CisgIEFkZENtZCgiYnN1Y2giLAorICAgIGZ1bmN0aW9uIGludCgpCisgICAgeworICAgICAgc3RyaW5nIHN0cj10aGlzX2ludGVyYWN0aXZlKCktPl91bnBhcnNlZF9hcmdzKCk7CisgICAgICBpZighc3RyIHx8ICFzaXplb2Yoc3RyKSkKKyAgICAgIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoCisgICAgICAgICAgQlMoIlN5bnRheDogYnN1Y2ggPHN0cj4iKSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaW50IHNob3J0OworICAgICAgc3RyaW5nKiBhcnI9b2xkX2V4cGxvZGUoc3RyLCIgIik7CisgICAgICAKKyAgICAgIGlmKGFyclswXT09Ii1zIikKKyAgICAgIHsKKyAgICAgICAgc2hvcnQ9MTsKKyAgICAgICAgc3RyPWltcGxvZGUoYXJyWzEuLl0sIiAiKTsKKyAgICAgIH0KKyAgICAgIG1hcHBpbmcgdG1wPUJBUkNISVYtPlNlYXJjaEluZGV4KHN0cik7CisgICAgICBpZighc2l6ZW9mKHRtcCkpCisgICAgICB7CisgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKS0+UmVjZWl2ZU1zZygKKyAgICAgICAgICAiS2VpbmUgRWludHJhZWdlIGdlZnVuZGVuLiIsCisgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRfbWFwKHRtcCxzaG9ydCk7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9KTsKKyAgQWRkQ21kKCJiaW5oYWx0IiwKKyAgICBmdW5jdGlvbiBpbnQoc3RyaW5nIHN0cikKKyAgICB7CisgICAgICBpbnQgc2hvcnQ7CisgICAgICBpZihzaXplb2Yoc3RyKSkKKyAgICAgIHsKKyAgICAgICAgc3RyaW5nKiBhcnI9b2xkX2V4cGxvZGUoc3RyLCIgIik7CisgICAgICAKKyAgICAgICAgaWYoYXJyWzBdPT0iLXMiKQorICAgICAgICB7CisgICAgICAgICAgc2hvcnQ9MTsKKyAgICAgICAgfQorICAgICAgfQorICAgIAorICAgICAgcHJpbnRfbWFwKEJBUkNISVYtPkdldEluZGV4Rm9yV2l6YXJkcygpLHNob3J0KTsKKyAgICAgIHJldHVybiAxOworICAgIH0pOworfQorCitwcml2YXRlIHZhcmFyZ3Mgdm9pZCBwcmludF9tYXAobWFwcGluZyB0bXAsaW50IHNob3J0KQoreworCWlmICghbWFwcGluZ3AodG1wKSkKKwl7CisJCXRoaXNfaW50ZXJhY3RpdmUoKS0+UmVjZWl2ZU1zZygiS2VpbmUgRGF0ZW4gdm9yaGFuZGVuLlxuIik7CisJCXJldHVybjsKKwl9CisgIGludCogc29ydD1zb3J0X2FycmF5KG1faW5kaWNlcyh0bXApLCMnPik7CisgIHN0cmluZyByZXQ9IiI7CisgIGZvcmVhY2goaW50IGkgOiBzb3J0KQorICB7CisgICAgc3RyaW5nIHN0cj1zcHJpbnRmKCIgJTRkOiAgJXMgeyVzfSAoJXMpIixpLHRtcFtpLDBdLHRtcFtpLDJdLAorICAgICAgc3RyZnRpbWUoIiVkLiVtLiV5Iix0bXBbaSwxXSkpOworICAgIGlmKHNob3J0KQorICAgIHsKKyAgICAgIHJldCs9QlMoc3RyWzAuLjc3XSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXQrPUJTKHN0cik7CisgICAgfQorICB9CisgIHRoaXNfaW50ZXJhY3RpdmUoKS0+TW9yZShyZXQpOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2RhbmNldG9vbC5jIGIvb2JqL3Rvb2xzL2RhbmNldG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjNiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvZGFuY2V0b29sLmMKQEAgLTAsMCArMSwzMjEgQEAKKy8vIERBTkNFVE9PTC5DICAgU3RhbmQ6IDEwLjEyLjk0IERhbmNlciAKKy8vCisvLyBLbGVpbmVzIFRvb2wgenVtIFNjaHJlaWJlbiB1bmQgTmFjaHNlaGVuIHZvbiBEZXRhaWxzLgorLy8KKy8vCisgCitpbmhlcml0ICJzdGQvdGhpbmciOworIAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisgCisjZGVmaW5lIGJzKCB4ICkgYnJlYWtfc3RyaW5nKCB4LCA3OCApCisgCitwcml2YXRlIGludCBpLCBjb3VudGVyLCBmaXJzdF9kZXRhaWxfbGluZSwgc3RhcnRsaW5lLCBlbmRsaW5lOyAKK3ByaXZhdGUgc3RyaW5nICpkZXRhaWxfc2hvcnRzLCAqbmV3c3RyaW5nLCAqZmlsZV9saW5lcywgKm5ld19saW5lczsKK3ByaXZhdGUgc3RyaW5nIGRldGFpbF9sb25nLCBzYXZlX3N0cmluZywgb2xkX2ZpbGUsIG5ld19maWxlLCBhY3R1YWxfZmlsZSwKKyAgICAgICAgICAgICAgIGRldGFpbF90ZXh0OworICAgICAgIAordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoIFBfQVVUT0xPQURPQkosMSApOworICAgU2V0UHJvcCggUF9OQU1FLCAiRGFuY2VycyBTYW5kdGlnZXJrcmFsbGUiICk7CisgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICBTZXRQcm9wKCBQX1NIT1JULCAiRGFuY2VycyBTYW5kdGlnZXJrcmFsbGUiICk7CisgICBTZXRQcm9wKCBQX0xPTkcsIGJzKCAiRGllIFNhbmR0aWdlcmtyYWxsZSB2b24gRGFuY2VyIGlzdCAiKworICAgICAgICAgICAgICAiZWluIGtsZWluZXMgVG9vbCwgbWl0IGRlbSBEdSBnZXdvZWhubGljaGUgRGV0YWlscyAiKworICAgICAgICAgICAgICAiaW4gYWxsZW4gUmFldW1lbiBuYWNoc2NoYXVlbiB1bmQgaW4gRGVpbmVuIGVpZ2VuZW4gIisKKyAgICAgICAgICAgICAgImhpbnp1ZnVlZ2VuIGthbm5zdC4gV2VpdGVyZSBJbmZvcm1hdGlvbmVuIGthbm5zdCBEdSAiKworICAgICAgICAgICAgICAibWl0IGRlbSBCZWZlaGwgPGRhbmNldG9vbD4gYmVrb21tZW4uIiApICk7CisgICBTZXRQcm9wKCBQX0FSVElDTEUsIDIgKTsKKyAgIFNldFByb3AoIFBfV0VJR0hULCA1MDAgKTsKKyAgIFNldFByb3AoIFBfVkFMVUUsIDEwMDAwICk7CisgICBTZXRQcm9wKCBQX05PQlVZLCAxICk7CisgICBTZXRQcm9wKCBQX05PRFJPUCwgMSApOworICAgQWRkSWQoICJrcmFsbGUiICk7CisgICBBZGRJZCggInNhbmR0aWdlcmtyYWxsZSIgKTsKKyAgIEFkZElkKCAidGlnZXJrcmFsbGUiICk7CisgICBBZGRJZCggImRhbmNldG9vbCIgKTsKKyAgIEFkZElkKCAiZGFuY2VydG9vbCIgKTsKKyAgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKK30KKyAKKyAKK3ZvaWQgaW5pdCgpCit7CisgIGlmICghSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkgcmV0dXJuOworICA6OmluaXQoKTsKKyAgYWRkX2FjdGlvbigicXVlcnlfYWRkX2RldGFpbHMiLCAic2hvd19kZXRhaWwiICk7CisgIGFkZF9hY3Rpb24oInF1ZXJ5X2FkZF9kZXRhaWxzIiwgInNob3dfZGV0YWlscyIgKTsKKyAgYWRkX2FjdGlvbigicXVlcnlfYWRkX2RldGFpbHMiLCAic2QiICk7CisgIGFkZF9hY3Rpb24oInNldF9hZGRfZGV0YWlsIiwgImFkZF9kZXRhaWwiICk7CisgIGFkZF9hY3Rpb24oInNldF9hZGRfZGV0YWlsIiwgImFkZF9kZXRhaWxzIiApOworICBhZGRfYWN0aW9uKCJzZXRfYWRkX2RldGFpbCIsICJhZCIgKTsKKyAgYWRkX2FjdGlvbigiZ2l2ZV9pbmZvIiwgImRhbmNldG9vbCIgKTsKK30KKyAKKyAKK2ludCBnaXZlX2luZm8oKQoreworICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgd3JpdGUoICJEaWUgU2FuZHRpZ2Vya3JhbGxlIGVybW9lZ2xpY2h0IGZvbGdlbmRlIEJlZmVobGU6XG4iICk7CisgICB3cml0ZSggIlxuYWRkX2RldGFpbCwgYWRkX2RldGFpbHMgb2RlciBhZDpcbiIgKTsKKyAgIHdyaXRlKCBicyggIlJ1ZnQgZWluZW4ga2xlaW5lbiBBZGREZXRhaWwtRWRpdG9yIGF1ZiwgbWl0IGRlbSBEdSAiKworICAgICAgIkRldGFpbHMgaW4gRGVpbmUgZWlnZW5lbiBSYWV1bWUgZWluZnVlZ2VuIGthbm5zdC4gQWxzIEFyZ3VtZW50ICIrCisgICAgICAia2FubiBoaW50ZXIgZGVuIEJlZmVobCBkZXIgRmlsZW5hbWUgZWluZXMgUmF1bWVzIGVpbmdlZ2ViZW4gIisKKyAgICAgICJ3ZXJkZW4uIFdpcmQga2VpbiBBcmd1bWVudCBlaW5nZWdlYmVuLCBzbyB3aXJkIGRlciBSYXVtICIrCisgICAgICAiZ2Vub21tZW4sIGluIGRlbSBEdSBnZXJhZGUgc3RlaHN0LiBBY2h0dW5nOiBFcyBrb2VubmVuICIrCisgICAgICAibnVyIERldGFpbHMgaW4gUmFldW1lIGVpbmdlZnVlZ3QgaGFiZW4sIGRpZSBiZXJlaXRzIGVpbiAiKworICAgICAgIkFkZERldGFpbCBpbiBpaHJlbSBjcmVhdGUoKSBoYWJlbi4gRHUgbXVzc3QgZGllIEx1cGUgaGFiZW4sICIrCisgICAgICAiZGEgZGVyIFJhdW0gbmFjaCBkZW0gRWluZnVlZ2VuIGRlcyBEZXRhaWxzIGF1dG9tYXRpc2NoICIrCisgICAgICAibmV1IGdlbGFkZW4gd2lyZC4iICkgKTsKKyAgIHdyaXRlKCAiXG5zaG93X2RldGFpbCwgc2hvd19kZXRhaWxzIG9kZXIgc2Q6XG4iICk7CisgICB3cml0ZSggYnMoICJaZWlndCBEaXIgYWxsZSBaZWlsZW4gZGVzIGFuZ2VzcHJvY2hlbmVuIFJhdW1lcyBiencuICIrCisgICAgICAiZGVzIFJhdW1lcyBpbiBkZW0gRHUgc3RlaHN0LCBkaWUgZWluIEFkZERldGFpbCAiKworICAgICAgImJlaW5oYWx0ZW4uIFNvIGthbm5zdCBEdSBrb250cm9sbGllcmVuLCB3ZWxjaGUgRGV0YWlscyAiKworICAgICAgIkR1IHNjaG9uIGVpbmdlYmF1dCBoYXN0LiIgKSApOworICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgcmV0dXJuIDE7Cit9CisgCisgCitpbnQgcmVuZXdfdmFyaWFibGVzKCkKK3sKKyAgIGkgPSBjb3VudGVyID0gZmlyc3RfZGV0YWlsX2xpbmUgPSBzdGFydGxpbmUgPSBlbmRsaW5lID0gMDsgCisgICBkZXRhaWxfc2hvcnRzID0gbmV3c3RyaW5nID0gZmlsZV9saW5lcyA9IG5ld19saW5lcyA9ICh7fSk7CisgICBkZXRhaWxfbG9uZyA9IHNhdmVfc3RyaW5nID0gb2xkX2ZpbGUgPSBuZXdfZmlsZSA9IGFjdHVhbF9maWxlID0gZGV0YWlsX3RleHQgPSAwOworICAgcmV0dXJuIDE7Cit9IAorIAorIAorIAoraW50IHF1ZXJ5X2FkZF9kZXRhaWxzKCBzdHJpbmcgc3RyICkKK3sKKyAgIHN0cmluZyBvbGRfZmlsZSwgKmZpbGVfbGluZXMsIG5ld19maWxlLCAqbmV3X2xpbmVzLCBhY3R1YWxfZmlsZTsgICAgICAgIAorICAgaW50IGksIGNvdW50ZXIsIGZpcnN0X2RldGFpbF9saW5lLCBzdGFydGxpbmUsIGVuZGxpbmU7ICAgICAgCisgCisgICBhY3R1YWxfZmlsZSA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgaWYgKCAhc3RyICkgYWN0dWFsX2ZpbGUgPSBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQoIHRoaXNfcGxheWVyKCkgKSApKyIuYyI7CisgICBlbHNlICAgICAgIAorICAgeworICAgICAgaWYgKCBzdHJbMC4uMF0gPT0gIi8iICkKKyAgICAgIHsKKyAgICAgICAgIGlmICggc3RyWzwyLi5dICE9ICIuYyIgKQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gc3RyKyIuYyI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSBzdHI7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAoIHN0cls8Mi4uXSAhPSAiLmMiICkKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcCggUF9DVVJSRU5URElSICkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIrc3RyKyIuYyI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoIFBfQ1VSUkVOVERJUiApKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iK3N0cjsKKyAgICAgIH0KKyAgIH0KKyAgIGlmICggZmlsZV9zaXplKCBhY3R1YWxfZmlsZSApPT0tMSApCisgICB7CisgICAgIHdyaXRlKCAiRmlsZTogIithY3R1YWxfZmlsZSsiIG5pY2h0IGdlZnVuZGVuIVxuIiApOworICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIGNhbGxfb3RoZXIoIGFjdHVhbF9maWxlLCAiPz8/IiApOworICAgd3JpdGUoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICB3cml0ZSggIkFrdHVlbGxlcyBGaWxlOiAgICIrYWN0dWFsX2ZpbGUrIlxuIiApOworICAgd3JpdGUoICJGaWxlZ3JvZXNzZTogICAgICAiK2ZpbGVfc2l6ZSggYWN0dWFsX2ZpbGUgKSsiXG4iICk7CisgICB3cml0ZSggIlVzZXJpZCBkZXMgRmlsZXM6ICIrZ2V0dWlkKCBmaW5kX29iamVjdCggYWN0dWFsX2ZpbGUgKSApKyJcbiIgKTsKKyAgIG5ld19maWxlID0gIiI7CisgICBjb3VudGVyID0gMDsKKyAgIGZpcnN0X2RldGFpbF9saW5lID0gMDsKKyAgIG9sZF9maWxlID0gcmVhZF9maWxlKCBhY3R1YWxfZmlsZSApOworICAgZmlsZV9saW5lcyA9ICh7ICJkdW1teSIgfSkgKyBvbGRfZXhwbG9kZSggb2xkX2ZpbGUsICJcbiIgKTsgICAgICAgICAgCisgICBzdGFydGxpbmUgPSAxOworICAgZW5kbGluZSA9IHNpemVvZiggZmlsZV9saW5lcyApLTE7ICAgICAgICAKKyAgIGZvciggaSA9IHN0YXJ0bGluZTsgaSA8PSBlbmRsaW5lOyBpKysgKQorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBuZXdfZmlsZSA9IG5ld19maWxlK2ZpbGVfbGluZXNbIGkgXSsiXG4iOworICAgICAgaWYgKCBzdHJzdHIoIGZpbGVfbGluZXNbaV0sICJBZGREZXRhaWwiICkgIT0gLTEgKQorICAgICAgeworICAgICAgICAgd3JpdGUoIGZpbGVfbGluZXNbaV0rIlxuIiApOworICAgICAgICAgaWYgKCAhZmlyc3RfZGV0YWlsX2xpbmUgKSBmaXJzdF9kZXRhaWxfbGluZSA9IGk7CisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxOworICAgICAgfQorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICB3cml0ZSggIkRldGFpbHMgZm91bmQ6ICIrY291bnRlcisiLlxuIiApOyAKKyAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgIHJldHVybiAxOworfSAgICAKKyAKKyAKK2ludCBzZXRfYWRkX2RldGFpbCggc3RyaW5nIHN0ciApCit7CisgCisgICByZW5ld192YXJpYWJsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGlmICggIXN0ciApIGFjdHVhbF9maWxlID0gb2JqZWN0X25hbWUoIGVudmlyb25tZW50KCB0aGlzX3BsYXllcigpICkgKSsiLmMiOworICAgZWxzZSAgICAgICAKKyAgIHsKKyAgICAgIGlmICggc3RyWzAuLjBdID09ICIvIiApCisgICAgICB7CisgICAgICAgICBpZiAoIHN0cls8Mi4uXSAhPSAiLmMiICkKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHN0cisiLmMiOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gc3RyOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKCBzdHJbPDIuLl0gIT0gIi5jIiApCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoIFBfQ1VSUkVOVERJUiApKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iK3N0cisiLmMiOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKCBQX0NVUlJFTlRESVIgKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIitzdHI7CisgICAgICB9CisgICB9CisgICBpZiAoIGZpbGVfc2l6ZSggYWN0dWFsX2ZpbGUgKT09LTEgKQorICAgeworICAgICB3cml0ZSggIkZpbGU6ICIrYWN0dWFsX2ZpbGUrIiBuaWNodCBnZWZ1bmRlbiFcbiIgKTsKKyAgICAgcmV0dXJuIDE7CisgICB9CisgICBjYWxsX290aGVyKCBhY3R1YWxfZmlsZSwgIj8/PyIgKTsKKyAgIHdyaXRlKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgd3JpdGUoICJBa3R1ZWxsZXMgRmlsZTogICAiK2FjdHVhbF9maWxlKyJcbiIgKTsKKyAgIHdyaXRlKCAiRmlsZWdyb2Vzc2U6ICAgICAgIitmaWxlX3NpemUoIGFjdHVhbF9maWxlICkrIlxuIiApOworICAgd3JpdGUoICJVc2VyaWQgZGVzIEZpbGVzOiAiK2dldHVpZCggZmluZF9vYmplY3QoIGFjdHVhbF9maWxlICkgKSsiXG4iICk7CisgICBuZXdfZmlsZSA9ICIiOworICAgbmV3X2xpbmVzID0gKHsgImR1bW15IiB9KTsKKyAgIGNvdW50ZXIgPSAwOworICAgZmlyc3RfZGV0YWlsX2xpbmUgPSAwOworICAgb2xkX2ZpbGUgPSByZWFkX2ZpbGUoIGFjdHVhbF9maWxlICk7CisgICBmaWxlX2xpbmVzID0gKHsgImR1bW15IiB9KSArIG9sZF9leHBsb2RlKCBvbGRfZmlsZSwgIlxuIiApOyAgICAgICAgICAKKyAgIHN0YXJ0bGluZSA9IDE7CisgICBlbmRsaW5lID0gc2l6ZW9mKCBmaWxlX2xpbmVzICktMTsgICAgICAgIAorICAgZm9yKCBpID0gc3RhcnRsaW5lOyBpIDw9IGVuZGxpbmU7IGkrKyApCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIG5ld19maWxlID0gbmV3X2ZpbGUrZmlsZV9saW5lc1sgaSBdKyJcbiI7CisgICAgICBpZiAoIHN0cnN0ciggZmlsZV9saW5lc1tpXSwgIkFkZERldGFpbCIgKSAhPSAtMSApCisgICAgICB7CisgICAgICAgIGlmICggIWZpcnN0X2RldGFpbF9saW5lICkgZmlyc3RfZGV0YWlsX2xpbmUgPSBpOworICAgICAgICBjb3VudGVyID0gY291bnRlciArIDE7CisgICAgICB9CisgICB9CisgICBpZiAoICFmaXJzdF9kZXRhaWxfbGluZSApCisgICB7CisgICAgICB3cml0ZSggYnMoICJFcyB3dXJkZW4gaW0gRmlsZSAiK2FjdHVhbF9maWxlKyIga2VpbmUgIisKKyAgICAgICAgICJEZXRhaWxzIGdlZnVuZGVuISBVbSBEZXRhaWxzIGhpbnp1ZnVlZ2VuIHp1IGtvZW5uZW4sICIrCisgICAgICAgICAibXVzcyBtaW5kZXN0ZW5zIGVpbiBBZGREZXRhaWwgYmVyZWl0cyB2b3JoYW5kZW4gc2VpbiEiICkgKTsKKyAgICAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgd3JpdGUoICJEZXRhaWxzIGZvdW5kOiAgICAiK2NvdW50ZXIrIi5cbiIgKTsKKyAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsgCisgICB3cml0ZSggIkJpdHRlIGRpZSBEZXRhaWwtS3VlcnplbCBlaW5nZWJlbjpcbihCZW1lcmt1bmc6ICIrCisgICAgICAgICAgImRpZSBLdWVyemVsIG11ZXNzZW4gbWl0IExlZXJ6ZWljaGVuIGdldHJlbm50IHNlaW4sICIrCisgICAgICAgICAgIkFiYnJ1Y2ggbWl0ICdxJy4pXG4tPiIgKTsKKyAgIGlucHV0X3RvKCAiZ2V0X2RldGFpbF9zaG9ydCIgKTsKKyAgIHJldHVybiAxOworfSAgICAKKyAKKyAKK2ludCBnZXRfZGV0YWlsX3Nob3J0KCBzdHJpbmcgc3RyICkKK3sKKyAgIHN0cmluZyBkdW1teTsKKyAgIGlmICggc3RyID09ICJxIiApCisgICB7CisgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpLCAiQWJnZWJyb2NoZW4hXG4iICk7CisgICAgIHJldHVybiAxOworICAgfQorICAgZGV0YWlsX3Nob3J0cyA9IG1hcCggb2xkX2V4cGxvZGUoIHN0ciwgIiAiICksIydsb3dlcl9jYXNlKTsKKyAgIGR1bW15ID0gYnJlYWtfc3RyaW5nKGltcGxvZGUoc29ydF9hcnJheShtYXAoZGV0YWlsX3Nob3J0cywjJ2xvd2VyX2Nhc2UpLCMnPiksIiwgIikrIjoiLDc4KTsKKyAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgIHdyaXRlKCBicyAoICJCaXR0ZSBCZXNjaHJlaWJ1bmcgZWluZ2ViZW4gZnVlciBkYXMgRGV0YWlsIG1pdCBkZW4gTmFtZW4gXG4iICkgKTsKKyAgIHdyaXRlKCBkdW1teSsiKCBBYmJydWNoIG1pdCAncScuKVxuLT4iICk7CisgICBpbnB1dF90byggImdldF9kZXRhaWxfbG9uZyIgKTsKKyAgIHJldHVybiAxOworfQorIAorIAoraW50IGdldF9kZXRhaWxfbG9uZyggc3RyaW5nIHN0ciApCit7CisgICBpZiAoIHN0ciA9PSAicSIgKQorICAgeworICAgICB3cml0ZSggIkFiZ2Vicm9jaGVuIVxuIiApOworICAgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgIHJldHVybiAxOworICAgfQorICAgZGV0YWlsX2xvbmcgPSBicmVha19zdHJpbmcoICJicmVha19zdHJpbmcoIFwiIitzdHIsIDYwICk7IAorICAgc2F2ZV9zdHJpbmcgPSAiICBBZGREZXRhaWwoICh7ICI7ICAgICAgICAKKyAgIGZvciggaSA9IDA7IGkgPCBzaXplb2YoIGRldGFpbF9zaG9ydHMgKTsgaSArKyApCisgICB7CisgICAgICBpZiAoICEoaSUzKSAmJiBpICkKKyAgICAgICAgc2F2ZV9zdHJpbmcgPSBzYXZlX3N0cmluZyArICJcbiAgICAgICAgICAgICAgICAiOworICAgICAgaWYgKCBpIDwgc2l6ZW9mKCBkZXRhaWxfc2hvcnRzICkgLSAxICkgCisgICAgICAgICBkZXRhaWxfc2hvcnRzWyBpIF0gPSAiXCIiK2RldGFpbF9zaG9ydHNbIGkgXSsiXCIsICI7CisgICAgICBlbHNlCisgICAgICAgICBkZXRhaWxfc2hvcnRzWyBpIF0gPSAiXCIiK2RldGFpbF9zaG9ydHNbIGkgXSsiXCIgIjsKKyAgICAgIHNhdmVfc3RyaW5nID0gc2F2ZV9zdHJpbmcgKyBkZXRhaWxfc2hvcnRzWyBpIF07ICAgICAgCisgICAgICB3cml0ZSggZGV0YWlsX3Nob3J0c1sgaSBdKyJcbiIgKTsKKyAgIH0KKyAgIHNhdmVfc3RyaW5nID0gc2F2ZV9zdHJpbmcgKyAifSksIFxuIjsKKyAgIG5ld3N0cmluZyA9IG9sZF9leHBsb2RlKCBkZXRhaWxfbG9uZywiXG4iKTsKKyAgIGkgPSAwOyAKKyAgIGZvciggaSA9IDA7IGk8c2l6ZW9mKG5ld3N0cmluZyk7IGkrKykgCisgICB7CisgICAgICBpZiAoIGkgPCBzaXplb2YobmV3c3RyaW5nKS0xICkKKyAgICAgIHsKKyAgICAgICAgIGlmICggaT09MHx8IWkgKQorICAgICAgICAgIHNhdmVfc3RyaW5nID0gc2F2ZV9zdHJpbmcgKyIgICAgICAgICAgICAgICAgIituZXdzdHJpbmdbaV0rIiBcIitcbiI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgc2F2ZV9zdHJpbmcgPSBzYXZlX3N0cmluZyArIiAgICAgICAgICAgICAgICBcIiIrIG5ld3N0cmluZ1tpXSsiIFwiK1xuIjsKKyAKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmICggaT09MHx8IWkgKQorICAgICAgICAgIHNhdmVfc3RyaW5nID0gc2F2ZV9zdHJpbmcgKyIgICAgICAgICAgICAgICAgIisgbmV3c3RyaW5nW2ldKyJcIiwgNzggKSApOyI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgc2F2ZV9zdHJpbmcgPSBzYXZlX3N0cmluZyArIiAgICAgICAgICAgICAgICBcIiIrIG5ld3N0cmluZ1tpXSsiXCIsIDc4ICkgKTsiOworICAgICAgfQorICAgfQorICAgbmV3X2xpbmVzICs9ICh7ICJkdW1teSIgfSk7CisgICBmb3IgKCBpID0gMTsgaSA8IGZpcnN0X2RldGFpbF9saW5lOyBpKysgKQorICAgeworICAgICBuZXdfbGluZXMgKz0gKHsgZmlsZV9saW5lc1tpXSB9KTsKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBuZXdfbGluZXMgKz0gKHsgc2F2ZV9zdHJpbmcgfSk7CisgICBmb3IgKCBpID0gZmlyc3RfZGV0YWlsX2xpbmUgKyAxOyBpIDw9IGVuZGxpbmUrMTsgaSsrICkKKyAgICAgbmV3X2xpbmVzICs9ICh7IGZpbGVfbGluZXNbIGkgLSAxIF0gfSk7CisgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICB3cml0ZSggYnMoICJGb2xnZW5kZSBaZWlsZW4gd2VyZGVuIGluIGRpZSBEYXRlaSAiK2FjdHVhbF9maWxlKyIgZ2VzY2hyaWViZW4sIGZhbGxzIGBqYCBlaW5nZWdlYmVuIHdpcmQ6XG4iICkgKTsKKyAgIHdyaXRlKCBzYXZlX3N0cmluZysiXG4iICk7CisgICB3cml0ZSggIlxuRGV0YWlsIHNwZWljaGVybj8gKGovbilcbi0+IiApOworICAgaW5wdXRfdG8oICJzYXZlX2RldGFpbCIgKTsKKyAgIHJldHVybiAxOworfQorIAorIAoraW50IHNhdmVfZGV0YWlsKCBzdHJpbmcgc3RyICkKK3sgIAorICAgaWYgKCBzdHIgIT0gImoiICYmIHN0ciAhPSAiamEiICYmIHN0ciAhPSAiSmEiICYmIHN0ciAhPSAiSiIgKQorICAgeworICAgICB3cml0ZSggIkFiZ2Vicm9jaGVuIVxuIiApOworICAgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgIHJldHVybiAxOworICAgfSAgIAorICAgaWYgKCAhcm0oIGFjdHVhbF9maWxlICkgKQorICAgeworICAgICAgd3JpdGUoICJGaWxlOiAiK2FjdHVhbF9maWxlKyIgd3VyZGUgbmljaHQgZ2VmdW5kZW4hXG4iICk7CisgICAgICByZXR1cm4gMTsKKyAgIH0gICAgICAgICAgICAgICAgICAgCisgICBmb3IgKCBpID0gMjsgaSA8PSBlbmRsaW5lKzI7IGkrKyApCisgICAgIHdyaXRlX2ZpbGUoIGFjdHVhbF9maWxlLCBuZXdfbGluZXNbaV0rIlxuIiApOyAKKyAgICAgLy93cml0ZSggbmV3X2xpbmVzW2ldKyJcbiIgKTsgCisgICB3cml0ZSggIkRhcyBEZXRhaWwgd3VyZGUgaW4gZGllIERhdGVpIGdlc2NocmllYmVuLlxuIiApOworICAgdGhpc19wbGF5ZXIoKS0+Y29tbWFuZF9tZSggImhlcmUgbWFrZSIgKTsKKyAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsgIAorICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvZXhwbG9yZXIuYyBiL29iai90b29scy9leHBsb3Jlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZGE4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvZXhwbG9yZXIuYwpAQCAtMCwwICsxLDQ0NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGV4cGxvcmVyLmMgLS0gVG9vbCB6dXIgRlAtVmVyd2FsdHVuZworLy8KKy8vICRJZDogZXhwbG9yZXIuYyA4MzU3IDIwMTMtMDItMDkgMTE6MTY6MTRaIFplc3N0cmEgJAorCitpbmhlcml0ICIvc3RkL3NlY3VyZV90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRGVyIEVyZm9yc2NoZXIiKTsKKyAgU2V0UHJvcChQX05BTUUsICJFcmZvcnNjaGVyIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfTE9ORywgIkRpZXMgaXN0IGRlciBiZXJ1ZWhtdGUgRXJmb3JzY2hlciBkZXMgTW9yZ2VuR3JhdWVucy4gRXJcbiIKKwkgICsic3RlbGx0IGZvbGdlbmRlIEJlZmVobGUgenVyIFZlcmZ1ZWd1bmc6XG4iCisJICArIiAgZXBhZGQgPHdhcz46IDxib251cz4gPHR5cD4gPGtleXM+XG4iCisJICArIiAgZXBjaGFuZ2UgPHdhcz46IDx3aWU+IDxuZXU+XG4iCisJICArIiAgZXBkZWwgPHdhcz5cbiIKKwkgICsiICBlcGluZm8gPHdhcz5cbiIKKwkgICsiICBlcGNvdW50IDxzcGllbGVybmFtZT4gICAgICAgICAgICAgICAgICAgLSBBbnphaGwgZGVyIEVQcyBkZXMgU3BpZWxlcnNcbiIKKwkgICsiICBlcHNjYW4gPHNwaWVsZXJuYW1lPiBbZmlsZW5hbWVucGF0dGVybl0gLSBaZWlnZSBkZXNzZW4gRVBzIGdlZmlsdGVydCBhblxuIgorCSAgKyIgIGVwcGxhZGQgPHNwaWVsZXJuYW1lPiA8ZXAtYW56YWhsPiAgICAgICAtIEdpYiBpaG0gZXAtYW56YWhsIEVQcyAoenVmYWVsbGlnKVxuIgorCSAgKyIgIGVwcGxkZWwgPHNwaWVsZXJuYW1lPiA8ZXAtYW56YWhsPiAgICAgICAtIExvZXNjaGUgaWhtIGVwLWFuemFobCBFUHMgKHp1ZmFlbC4pXG4iCisJICArIiAgZXBwbHNldCA8c3BpZWxlcm5hbWU+IDxlcC1udW1tZXI+ICAgICAgIC0gU2V0emUgaWhtIEVQIGVwLW51bW1lclxuIgorCSAgKyIgIGVwcGxjbHIgPHNwaWVsZXJuYW1lPiA8ZXAtbnVtbWVyPiAgICAgICAtIExvZXNjaGUgaWhtIEVQIGVwLW51bW1lclxuIgorCSAgKyJEYWJlaSBiZWRldXRldDpcbiIKKwkgICsiPHdhcz4gICAtIERhcyBPYmpla3QgKGVpbmUgSUQgYmVpIE9iamVrdGVuIGluIGRlciBOYWVoZSwgaGllciBvZGVyXG4iCisJICArIiAgICAgICAgICBoZXJlIGZ1ZXIgZGVuIGFrdHVlbGxlbiBSYXVtLCBvZGVyIGVpbiBEYXRlaW5hbWUpXG4iCisJICArIjxib251cz4gLSBuIGZ1ZXIgbm9ybWFsZSBFUHMsIGIgZnVlciBCb251cy1FUHMgKHouQi4gUGFyYS1FUHMpXG4iCisJICArIjx0eXA+ICAgLSBkZXRhaWwsIHJkZXRhaWwsIGV4aXQvYXVzZ2FuZywgY21kL2JlZmVobC9rb21tYW5kbywgaW5mbywgcHViLCBtaXNjLFxuIgorCSAgKyIgICAgICAgICAgc21lbGwvZ2VydWNoLCBzb3VuZC9ub2lzZSwgdGFzdGUvdG91Y2hcbiIKKwkgICsiPGtleT4gICAtIExpc3RlIGRlciBTY2hsdWVzc2Vsd29lcnRlciwgbWl0IEtvbW1hdGEgZ2V0cmVubnRcbiIKKwkgICsiPHdpZT4gICAtIG9iaiwga2V5LCBib251cyBvZGVyIHR5cCAxXG4iCisJICArIjxuZXU+ICAgLSBKZSBuYWNoIDx3aWU+OyBzaWVoZSA8d2FzPiwgPGtleT4sIDx0eXA+XG4iCisJICApOworICBTZXRQcm9wKFBfTk9EUk9QLCAxKTsKKyAgU2V0UHJvcChQX05FVkVSRFJPUCwgMSk7CisgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwxKTsKKyAgQWRkSWQoKHsiZXhwbG9yZXIiLCJlcmZvcnNjaGVyIn0pKTsKKworICBBZGRDbWQoKHsiZXBhZGQifSksICJhZGQiKTsKKyAgQWRkQ21kKCh7ImVwY2hhbmdlIn0pLCAiY2hhbmdlIik7CisgIEFkZENtZCgoeyJlcGRlbCJ9KSwgImRlbCIpOworICBBZGRDbWQoKHsiZXBpbmZvIn0pLCAiaW5mbyIpOworICBBZGRDbWQoKHsiZXBjb3VudCJ9KSwgImVwY291bnQiKTsKKyAgQWRkQ21kKCh7ImVwc2NhbiJ9KSwgImVwc2NhbiIpOworICBBZGRDbWQoKHsiZXBwbGFkZCJ9KSwgImVwcGxhZGQiKTsKKyAgQWRkQ21kKCh7ImVwcGxkZWwifSksICJlcHBsZGVsIik7CisgIEFkZENtZCgoeyJlcHBsc2V0In0pLCAiZXBwbHNldCIpOworICBBZGRDbWQoKHsiZXBwbGNsciJ9KSwgImVwcGxjbHIiKTsKK30KKworc3RhdGljIHN0cmluZyBzdHJBcnIoc3RyaW5nICpzKQoreworICBzdHJpbmcgcmV0OworICBpbnQgaTsKKworICByZXQgPSAoIlwiIiArIHNbPDFdICsgIlwiIik7CisgIGZvciAoaT1zaXplb2YocyktMjsgaT49MDsgaS0tKQorICAgIHJldCArPSAoIiwgXCIiK3NbaV0rIlwiIik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRUeXBlKHN0cmluZyBzKQoreworICBzd2l0Y2goc1swLi4yXSkgeworICBjYXNlICJkZXQiOgorICAgIHJldHVybiBFUF9ERVRBSUw7CisgIGNhc2UgInJkZSI6CisgICAgcmV0dXJuIEVQX1JERVQ7CisgIGNhc2UgImF1cyI6CisgIGNhc2UgImV4aSI6CisgICAgcmV0dXJuIEVQX0VYSVQ7CisgIGNhc2UgImNtZCI6CisgIGNhc2UgImJlZiI6CisgIGNhc2UgImtvbSI6CisgICAgcmV0dXJuIEVQX0NNRDsKKyAgY2FzZSAiaW5mIjoKKyAgICByZXR1cm4gRVBfSU5GTzsKKyAgY2FzZSAicHViIjoKKyAgICByZXR1cm4gRVBfUFVCOworICBjYXNlICJtaXMiOgorICBjYXNlICJ2ZXIiOgorICAgIHJldHVybiBFUF9NSVNDOworICBjYXNlICJzbWUiOgorICBjYXNlICJnZXIiOgorICAgIHJldHVybiBFUF9TTUVMTDsKKyAgY2FzZSAic291IjoKKyAgY2FzZSAibm9pIjoKKyAgICByZXR1cm4gRVBfU09VTkQ7CisgIGNhc2UgInRhcyI6CisgIGNhc2UgInRvdSI6CisgICAgcmV0dXJuIEVQX1RPVUNIOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIG9iamVjdCBnZXRPYihzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2I7CisKKyAgaWYgKHN0ciA9PSAiaGllciIgfHwgc3RyID09ICJoZXJlIiApCisgICAgcmV0dXJuIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpOworCisgIG9iID0gcHJlc2VudChzdHIsIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgaWYgKCFvYikKKyAgICBvYiA9IHByZXNlbnQoc3RyLCB0aGlzX3BsYXllcigpKTsKKworICBpZiAoIW9iKSB7CisgICAgc3RyID0gIi9zZWN1cmUvbWFzdGVyIi0+X2dldF9wYXRoKHN0ciwgZ2V0dWlkKHRoaXNfcGxheWVyKCkpKTsKKyAgICBjYXRjaChjYWxsX290aGVyKHN0ciwgIj8/PyIpKTsKKyAgICBvYiA9IGZpbmRfb2JqZWN0KHN0cik7CisgIH0KKyAgcmV0dXJuIG9iOworfQorCitzdGF0aWMgc3RyaW5nICpnZXRLZXlzKHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBzdHJpbmcgKnQxLCAqdDI7CisKKyAgdDEgPSByZWdleHBsb2RlKHN0ciwgIiwgKiIpOworICBmb3IgKHQyID0gKHt9KSwgaT1zaXplb2YodDEpLTE7IGk+PTA7IGktPTIpCisgICAgdDIgPSAoeyB0MVtpXSB9KSArIHQyOworICByZXR1cm4gdDI7Cit9CisKK3N0YXRpYyBzdHJpbmcgZXJyTXNnKGludCBjb2RlKQoreworICBpZiAoY29kZSA+PSAwIHx8IGNvZGUgPCBFUEVSUl9JTlZBTElEX0FSRykKKyAgICByZXR1cm4gIlVuYmVrYW5udGVyIEZlaGxlciI7CisKKyAgY29kZSA9IC0oY29kZSsxKTsKKyAgcmV0dXJuICh7ICJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIiwgIlVuZ3VlbHRpZ2VzIE9iamVrdCIsCisJICAgICJPYmpla3Qgc3RlaHQgbmljaHQgaW4gZGVyIExpc3RlIiwgIlVuZ3VlbHRpZ2VzIEFyZ3VtZW50In0pW2NvZGVdOworfQorCitzdGF0aWMgaW50IGFkZChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2FzLCB0LCBrLCAqa2V5cywgYjsKKyAgaW50IHR5cGUsIGJvbnVzOworICBvYmplY3Qgb2I7CisKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZXBhZGQgPHdhcz46IDx0eXA+XG4iKTsKKyAgaWYgKCEoc3RyID0gdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHNzY2FuZihzdHIsICIlczogJXMgJXMgJXMiLCB3YXMsIGIsIHQsIGspICE9NCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIShvYiA9IGdldE9iKHdhcykpKSB7CisgICAgcHJpbnRmKCJLYW5uICclcycgbmljaHQgZmluZGVuIVxuIiwgd2FzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoKHR5cGUgPSBnZXRUeXBlKHQpKSA8IDApIHsKKyAgICB3cml0ZSgiVW5ndWVsdGlnZXIgVHlwIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGI9PSJuIikgYm9udXM9MDsgZWxzZSBpZiAoYj09ImIiKSBib251cz0xOworICBlbHNlIHsKKyAgICB3cml0ZSgiVW5ndWVsdGlnZSBCb251c2FydCFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGtleXMgPSBnZXRLZXlzKGspOworCisgIHR5cGUgPSBFUE1BU1RFUi0+QWRkRVBPYmplY3Qob2IsIGtleXMsIHR5cGUsIGJvbnVzKTsKKyAgaWYgKHR5cGUgPCAwKQorICAgIHByaW50ZigiRmVobGVyOiAlc1xuIiwgZXJyTXNnKHR5cGUpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhbmdlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB3YXMsIHdpZSwgbmV1OworICBvYmplY3Qgb2I7CisgIGludCB0eXBlOworICBtaXhlZCBuZXc7CisKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBub3RpZnlfZmFpbCgiU3ludGF4OiBlcGNoYW5nZSA8d2FzPjogPHdpZT4gPG5ldT5cbiIpOworICBpZiAoIShzdHIgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3NjYW5mKHN0ciwgIiVzOiAlcyAlcyIsIHdhcywgd2llLCBuZXUpICE9IDMpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCEob2IgPSBnZXRPYih3YXMpKSkgeworICAgIHByaW50ZiggIkthbm4gJyVzJyBuaWNodCBmaW5kZW4hXG4iLCB3YXMpOworICAgIHJldHVybiAxOworICB9CisgIHN3aXRjaCh3aWVbMC4uMl0pIHsKKyAgY2FzZSAib2JqIjoKKyAgICB0eXBlID0gQ0hBTkdFX09COworICAgIG5ldyA9IGdldE9iKG5ldSk7CisgICAgaWYgKCFuZXcpIHsKKyAgICAgIHByaW50ZiggIkthbm4gJyVzJyBuaWNodCBmaW5kZW4hXG4iLCBuZXUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICJrZXkiOgorICAgIHR5cGUgPSBDSEFOR0VfS0VZOworICAgIG5ldyA9IGdldEtleXMobmV1KTsKKyAgICBicmVhazsKKyAgY2FzZSAidHlwIjoKKyAgICB0eXBlID0gQ0hBTkdFX1RZUEU7CisgICAgaWYgKChuZXcgPSBnZXRUeXBlKG5ldSkpIDwgMCkgeworICAgICAgd3JpdGUoIlVuZ3VlbHRpZ2VyIFR5cCFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlICJib24iOgorICAgIHR5cGUgPSBDSEFOR0VfQk9OVVM7CisgICAgaWYgKG5ldT09Im4iKSBuZXc9MDsgZWxzZSBpZiAobmV1PT0iYiIpIG5ldz0xOworICAgIGVsc2UgeworICAgICAgd3JpdGUoIlVuZ3VlbHRpZ2UgQm9udXNhcnQhXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB3cml0ZSgiRGFzIGxhZXNzdCBzaWNoIG5pY2h0IGFlbmRlcm4uLi5cbiIpOworICAgIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIHR5cGUgPSBFUE1BU1RFUi0+Q2hhbmdlRVBPYmplY3QoIG9iLCB0eXBlLCBuZXcgKTsKKyAgaWYgKHR5cGUgPCAwKQorICAgIHByaW50ZigiRmVobGVyOiAlc1xuIixlcnJNc2codHlwZSkpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlbChzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2I7CisgIGludCByZXQ7CisKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFzdHIpIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBlcGRlbCA8d2FzPlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCEob2IgPSBnZXRPYihzdHIpKSkgeworICAgIHdyaXRlKCJLYW5uIGRhcyBPYmpla3QgbmljaHQgZmluZGVuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0ID0gRVBNQVNURVItPlJlbW92ZUVQT2JqZWN0KG9iKTsKKyAgaWYgKHJldCA8IDApCisgICAgcHJpbnRmKCJGZWhsZXI6ICVzXG4iLCBlcnJNc2cocmV0KSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaW5mbyhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2I7CisgIG1peGVkIGluZm87CisKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIXN0cikgeworICAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGVwaW5mbyA8d2FzPlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIShvYiA9IGdldE9iKHN0cikpKSB7CisgICAgd3JpdGUoIkRhcyBmaW5kZSBpY2ggbGVpZGVyIG5pY2h0Li4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIShpbmZvID0gRVBNQVNURVItPlF1ZXJ5RVBPYmplY3Qob2IpKSkKKyAgICB3cml0ZSAoIkRhcyBPYmpla3QgaXN0IG5pY2h0IGVpbmdldHJhZ2VuIVxuIik7CisgIGVsc2UKKyAgICBwcmludGYoIk51bW1lcjogJWRcbkJvbnVzOiAlZFxuVHlwOiAlc1xuU2NobHVlc3NlbDogJXNcbiIsCisJICAgaW5mb1tNUE9TX05VTV0sCisJICAgaW5mb1tNUE9TX1RZUEUrMV0sCisJICAgKHsgIkRldGFpbCIsICJBdXNnYW5nIiwgIktvbW1hbmRvIiwgIkluZm8iLCAiTWlzYyIsICJSZWFkRGV0YWlsIiwKKyAgICAgICAgICJLbmVpcGUiLCAiR2VydWNoIiwgIkdlcmFldXNjaCIsICJUYXN0ZGV0YWlsIn0pW2luZm9bTVBPU19UWVBFXV0sCisJICAgc3RyQXJyKGluZm9bTVBPU19LRVldICkpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgb2JqZWN0IGZpbmRfcGxheWVyb2IoIHN0cmluZyBuYW1lICkgeworICByZXR1cm4gZmluZF9wbGF5ZXIobmFtZSl8fGZpbmRfbmV0ZGVhZChuYW1lKTsKK30KKworc3RhdGljIGludCBlcGNvdW50KCBzdHJpbmcgc3RyICkgeworICBvYmplY3QgcGwsZXBtOworICAKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGlmICghc3RyIHx8IHN0cj09IiIpIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBlcGNvdW50IDxzcGllbGVybmFtZT5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgcHJpbnRmKCAiJXMgaGF0ICVkIHZvbiAlZCBGUHMuIChEdXJjaHNjaG5pdHQgPSAlZClcbiIsCisJICBjYXBpdGFsaXplKHN0ciksCisJICBFUE1BU1RFUi0+UXVlcnlFeHBsb3JhdGlvblBvaW50cyhzdHIpLAorCSAgRVBNQVNURVItPlF1ZXJ5TWF4RVAoKSwKKwkgIEVQTUFTVEVSLT5RdWVyeUF2ZXJhZ2UoKQorCSAgKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXBzY2FuKCBzdHJpbmcgc3RyICkgeworICBvYmplY3QgcGw7CisgIGludCBlcmc7CisgIHN0cmluZyAqYXN0cjsKKworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYgKCFzdHIgfHwgc3RyPT0iIikgeworICAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGVwc2NhbiA8c3BpZWxlcm5hbWU+IFtUZWlsIGRlcyBGaWxlbmFtZW5zXVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhc3RyPW9sZF9leHBsb2RlKHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCksIiAiKTsKKyAgCisgIGlmIChzaXplb2YoYXN0cik8MikKKyAgICBlcmcgPSBFUE1BU1RFUi0+U2hvd1BsYXllckVQcyhhc3RyWzBdKTsKKyAgZWxzZQorICAgIGVyZyA9IEVQTUFTVEVSLT5TaG93UGxheWVyRVBzKGFzdHJbMF0sYXN0clsxXSk7CisgIGlmIChlcmcgPCAwKQorICAgIHByaW50ZigiRmVobGVyOiAlc1xuIixlcnJNc2coZXJnKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgZXBwbGRlbCggc3RyaW5nIHN0ciApIHsKKwlzdHJpbmcgcGxheWVyLCByZXN0OworCWludCBlcG51bTsKKwlvYmplY3QgdG1wOworCisJaWYoICFBUkNIX1NFQ1VSSVRZICkgeworCSAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKwkgIHJldHVybiAwOworCX0KKworCW5vdGlmeV9mYWlsKCAiZXBwbGRlbCA8c3BpZWxlcj4gPGFuemFobF9lcHM+IDxncnVuZD5cbiIgKTsKKwlpZiggIXN0ciB8fCBzc2NhbmYoIHN0ciwgIiVzICVkICVzIiwgcGxheWVyLCBlcG51bSwgcmVzdCApPDIgKQorCQlyZXR1cm4gMDsKKworCWlmKCBlcG51bSA8PSAwICkgeworCQl3cml0ZSggIkFuemFobCBkZXIgRlBzIDw9IDAgP1xuIiApOworCQlyZXR1cm4gMTsKKwl9CisJaWYoICFyZXN0IHx8IHJlc3Q9PSIiICkgeworCQl3cml0ZSggIkJpdHRlIEdydW5kIGFuZ2ViZW4hXG4iICk7CisJCXJldHVybiAxOworCX0KKworCXByaW50ZiggIiVPICVPICVPXG4iLCBlcG51bSwgcGxheWVyLCBzZWN1cmVfbGV2ZWwoKSApOworCWVwbnVtID0JIi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIiLT5SZW1vdmVGUCggZXBudW0sIHBsYXllciwgcmVzdCApOworCXByaW50ZiggIkVyZ2VibmlzIChhYmdlem9nZW5lIEVQcykgPSAlT1xuIiwgZXBudW0gKTsKKwlyZXR1cm4gMTsKKworfQorCitzdGF0aWMgZXBwbGFkZCggc3RyaW5nIHN0ciApIHsKKwlzdHJpbmcgcGxheWVyLCByZXN0OworCWludCBlcG51bTsKKwlvYmplY3QgcGwsdG1wOworCisJaWYoICFBUkNIX1NFQ1VSSVRZICkgeworCSAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKwkgIHJldHVybiAwOworCX0KKworCW5vdGlmeV9mYWlsKCAiZXBwbGFkZCA8c3BpZWxlcj4gPGFuemFobF9lcHM+XG4iICk7CisJaWYoICFzdHIgfHwgc3NjYW5mKCBzdHIsICIlcyAlZCIsIHBsYXllciwgZXBudW0gKTwyICkKKwkJcmV0dXJuIDA7CisKKwlpZiggZXBudW0gPD0gMCApIHsKKwkJd3JpdGUoICJBbnphaGwgZGVyIEZQcyA8PSAwID9cbiIgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXBudW0gPQkiL3NlY3VyZS9leHBsb3JhdGlvbm1hc3RlciItPkFkZEZQKCBlcG51bSwgcGxheWVyICk7CisJcHJpbnRmKCAiRXJnZWJuaXMgKGhpbnp1Z2VmdWVndGUgRlBzKSA9ICVPXG4iLCBlcG51bSApOworCXJldHVybiAxOworCit9CisKK3N0YXRpYyBlcHBsc2V0KCBzdHJpbmcgc3RyICkgeworICBzdHJpbmcgcGxheWVyLCByZXN0OworICBpbnQgZXBudW07CisgIG9iamVjdCBwbCx0bXA7CisgIAorICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgbm90aWZ5X2ZhaWwoICJlcHBsc2V0IDxzcGllbGVyPiA8ZXAtbnVtbWVyPlxuIiApOworICBpZiggIXN0ciB8fCBzc2NhbmYoIHN0ciwgIiVzICVkIiwgcGxheWVyLCBlcG51bSApPDIgKQorICAgIHJldHVybiAwOworICAKKyAgZXBudW0gPSAiL3NlY3VyZS9leHBsb3JhdGlvbm1hc3RlciItPlNldEZQKCBlcG51bSwgcGxheWVyICk7CisgIHByaW50ZiggIkVyZ2VibmlzIChnZXNldHp0ZXIgRlApID0gJU9cbiIsIGVwbnVtICk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgZXBwbGNsciggc3RyaW5nIHN0ciApIHsKKyAgc3RyaW5nIHBsYXllciwgcmVzdDsKKyAgaW50IGVwbnVtOworICBvYmplY3QgcGwsdG1wOworICAKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgeworICAgIG5vdGlmeV9mYWlsKCJEdSBiaXN0IGtlaW4gRXJ6bWFnaWVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIG5vdGlmeV9mYWlsKCAiZXBwbGNsciA8c3BpZWxlcj4gPGVwLW51bW1lcj5cbiIgKTsKKyAgaWYoICFzdHIgfHwgc3NjYW5mKCBzdHIsICIlcyAlZCIsIHBsYXllciwgZXBudW0gKTwyICkKKyAgICByZXR1cm4gMDsKKyAgCisgIGVwbnVtID0gIi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIiLT5DbGVhckZQKCBlcG51bSwgcGxheWVyICk7CisgIHByaW50ZiggIkVyZ2VibmlzIChnZWxvZXNjaHRlciBGUCkgPSAlT1xuIiwgZXBudW0gKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvZmVobGVydGV1ZmVsLmMgYi9vYmovdG9vbHMvZmVobGVydGV1ZmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1ZmVjMQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9mZWhsZXJ0ZXVmZWwuYwpAQCAtMCwwICsxLDk5MyBAQAorLyogL29iai90b29zdGVscy9mZWhsZXJ0ZXVmZWwuYworICAgRmVobGVydGV1ZmVsIC0gTWFnaWVydG9vbCB6dXIgQWJmcmFnZSBkZXMgRmVobGVyLURhZW1vbnMgZGVyIE11ZGxpYgorICAgQXV0b3I6IFplc3N0cmEKKyAgIENoYW5nZWxvZzoKKyovCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisKK2luaGVyaXQgIi9zdGQvc2VjdXJlX3RoaW5nIjsKK2luaGVyaXQgIi9zZWN1cmUvZXJyb3JkLXN0cnVjdHMiOworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxlcnJvcmQuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKKyNkZWZpbmUgVEkgdGhpc19pbnRlcmFjdGl2ZSgpCisKKyNkZWZpbmUgREVCVUcoeCkgIGlmIChmdW5jYWxsKHN5bWJvbF9mdW5jdGlvbignZmluZF9wbGF5ZXIpLCJ6ZXNzdHJhIikpXAorICAgICAgICB0ZWxsX29iamVjdChmdW5jYWxsKHN5bWJvbF9mdW5jdGlvbignZmluZF9wbGF5ZXIpLCJ6ZXNzdHJhIiksXAorICAgICAgICAiRURCRzogIit4KyJcbiIpCisKKy8vIHZhcmlhYmxlcworcHJpdmF0ZSBzdHJpbmcgb3duZXI7ICAvLyBVSUQgdm9tIEVpZ2VudHVlbWVyCitwcml2YXRlIHN0cmluZyAqdWlkcz0oe30pOyAvLyBVSURzLCBhdWYgZGllIG1hbiBzY2hyZWlicmVjaHRlIGhhdAorcHJpdmF0ZSBzdHJpbmcgKmZpbHRlcnVpZHM9KHt9KTsgLy8gd2VubiBuaWNodC1sZWVyLCBudXIgZGllc2UgVUlEcyB6ZWlnZW4KK3ByaXZhdGUgc3RyaW5nICptb25pdG9ydWlkcz0oe30pOyAvLyBkaWVzZSBVSURzIGluIGRpZSBMaXN0ZSBlaW5zY2hsaWVzc2VuCitwcml2YXRlIGludCBmaWx0ZXJzdGF0dXM9MDsgICAgICAgLy8gRmlsdGVyIGFuIG9kZXIgYXVzPworcHJpdmF0ZSBtYXBwaW5nIGlzc3VlbGlzdCA9IChbXSk7CisvKiAoWyB0eXBlMTogKFt1aWQxOiA8aXNzdWVsaXN0PiwgdWlkMjogPGlzc3VlbGlzdD4gXSksCisgICAgICB0eXBlMjogLi4uIF0pCisgICA8aXNzdWVsaXN0PiBpc3QgZWluIDwgPGludHxzdHJpbmc+KiA+KiB2b20gRXJyb3JEICovCisKKy8vV2VsY2hlIEFydCB2b24gRmVobGVyIGFuemVpZ2VuPworcHJpdmF0ZSBpbnQgbW9kdXM9VF9SVEVSUk9SIHwgVF9SVFdBUk4gfCBUX1JFUE9SVEVEX0VSUjsKK3ByaXZhdGUgc3RyaW5nICp4bW9uaXRvcnVpZHMgPSAoe30pOyAvLyBleHBhbmRlZCBNb25pdG9yLVVJRHMKK3ByaXZhdGUgaW50IGxmZWhsZXI7ICAgICAgICAgICAgICAvLyBsZXR6dGVyICdiZW51dHp0ZXInIEZlaGxlci4KK3ByaXZhdGUgaW50IGZlaGxlcnphaGw7ICAgICAgIC8vIGZlaGxlcnphaGwgaW0gbGV0enRlbiBSZXNldC4KK3ByaXZhdGUgbWFwcGluZyBmZWluZ2FiZTsgICAgICAgICAvLyBnZXJhZGUgZWluZ2VnZWJlbmVyIEZlaGxlcgorCisvLyAqKioqKioqKioqKioqKiBwcml2YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioKK3ByaXZhdGUgdmFyYXJncyBpbnQgZ2V0X2lzc3VlbGlzdChpbnQgbG1vZHVzKTsKK3ByaXZhdGUgdm9pZCBnZXRfdWlkcygpOworCisvLyBpcmdlbmRlaW5lbiBGZWhsZXIgb2RlciBXYXJudW5nIGFuemVpZ2VuLgorcHJpdmF0ZSBpbnQgc2hvd19lbnRyeShzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUpCit7CisgIGlmICghaXNzdWUpIHJldHVybiAwOworCisgIHN0cmluZyB0eHQ9RVJST1JELT5mb3JtYXRfZXJyb3IoaXNzdWUsIDApOworCisgIGlmICghc3RyaW5ncCh0eHQpIHx8ICFzaXplb2YodHh0KSkKKyAgICAgIHJldHVybiAwOworCisgIHRlbGxfb2JqZWN0KFBMLHR4dCsiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3Byb3RlY3RlZCBpbnQgX2ZlaW5nYWJlX2ZlcnRpZyhzdHJpbmcgYXJnKSB7CisKKyAgaWYgKGFyZyA9PSAiaiIpCisgIHsKKyAgICBpZiAoIWZlaW5nYWJlW0ZfTVNHXSkKKyAgICB7CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgIkFsc28sIGVpbmUgRmVobGVyYmVzY2hyZWlidW5nIHNvbGx0ZXN0IER1IHNjaG9uIGVpbmdlYmVuISBBYmdlYnJvY2hlbi5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RyaW5nIGhhc2hrZXkgPSAoc3RyaW5nKUVSUk9SRC0+TG9nUmVwb3J0ZWRFcnJvcihmZWluZ2FiZSk7CisgICAgICB0ZWxsX29iamVjdChQTCwgc3ByaW50ZigKKyAgICAgICAgICJWaWVsZW4gRGFuayEgRGllIElEIGRlcyBlaW5nZWdlYmVuZW4gRmVobGVycyBsYXV0ZXQ6ICVzXG4iLAorICAgICAgICAgaGFzaGtleSB8fCAiTi9BIikpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwgIkZlaGxlcmVpbmdhYmUgYWJnZWJyb2NoZW4uXG4iKTsKKyAgfQorCisgIGZlaW5nYWJlID0gMDsKKworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBDbWRGZWhsZXJFaW5nYWJlKHN0cmluZyBhcmcpIHsKKyAgb2JqZWN0IHRhcmdldDsKKworICBpZiAoZmVpbmdhYmUpCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwgIkR1IGdpYnRzIGRvY2ggYmVyZWl0cyBlaW5lbiBGZWhsZXIgZWluIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZmVpbmdhYmUgPSAoW10pOworCisgIGlmIChhcmcpCisgIHsKKyAgICB0YXJnZXQgPSBwcmVzZW50KGFyZyk7CisgICAgaWYgKCF0YXJnZXQpCisgICAgICB0YXJnZXQgPSBmaW5kX29iamVjdChhcmcpOyAvLyB2aWVsbGVpY2h0IGRpcmVrdCBhbmdlZ2ViZW4/CisgIH0KKyAgLy8gd2VubiBuaXggZ2VmdW5kZW4sIEVudmlyb25tZW50IGRlcyBNYWdpZXJzIG5laG1lbi4KKyAgaWYgKCF0YXJnZXQpCisgICAgdGFyZ2V0ID0gZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSk7CisKKyAgZmVpbmdhYmVbRl9PQkpdID0gdGFyZ2V0OworCisgIHRlbGxfb2JqZWN0KFBMLCBicmVha19zdHJpbmcoc3ByaW50ZigKKyAgICAgICAgICAiRHUgYmVnaW5uc3QgZWluZW4gRmVobGVyZWludHJhZyBmdWVyIGRhcyBPYmpla3Q6ICVPXG4iLCB0YXJnZXQpLDc4KSk7CisKKyAgaW5wdXRfdG8oZnVuY3Rpb24gdm9pZCAoc3RyaW5nIHN0cikKKyAgICAgIHsKKyAgICAgICAgaWYgKHNpemVvZihzdHIpKSBmZWluZ2FiZVtGX01TR10gPSBzdHI7CisgICAgICB9LCBJTlBVVF9QUk9NUFQsICJGZWhsZXJiZXNjaHJlaWJ1bmcgZWluZ2ViZW46XG4iKTsKKworICBpbnB1dF90byhmdW5jdGlvbiB2b2lkIChzdHJpbmcgc3RyKQorICAgICAgeworICAgICAgICBpZiAoc2l6ZW9mKHN0cikpIGZlaW5nYWJlW0ZfUFJPR10gPSBzdHI7CisgICAgICAgIGVsc2UgZmVpbmdhYmVbRl9QUk9HXSA9ICJ1bmJla2FubnQiOworICAgICAgfSwgSU5QVVRfUFJPTVBUfElOUFVUX0FQUEVORCwgCisgICAgICJQcm9ncmFtbSBlaW5nZWJlbiwgaW4gZGVtIGRlciBGZWhsZXIgYXVmdHJpdHQgKGZhbGxzIGJla2FubnQpOlxuIik7CisKKyAgaW5wdXRfdG8oZnVuY3Rpb24gdm9pZCAoc3RyaW5nIHN0cikKKyAgICAgIHsKKyAgICAgICAgaWYgKHNpemVvZihzdHIpKSBmZWluZ2FiZVtGX0xJTkVdID0gdG9faW50KHN0cik7CisgICAgICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZyhzcHJpbnRmKAorICAgICAgICAgICJEdSBoYXN0IGRpZSBmb2xnZW5kZW4gRGF0ZW4gZWluZ2VnZWJlbjpcbiIKKyAgICAgICAgICAiT2JqZWt0OiAlT1xuIgorICAgICAgICAgICJGZWhsZXJiZXNjaHJlaWJ1bmc6ICVzXG4iCisgICAgICAgICAgIlByb2dyYW1tOiAlc1xuIgorICAgICAgICAgICJaZWlsZW5uci46ICVkXG4iLAorICAgICAgICAgIGZlaW5nYWJlW0ZfT0JKXSwgZmVpbmdhYmVbRl9NU0ddIHx8ICIiLCBmZWluZ2FiZVtGX1BST0ddLAorICAgICAgICAgIGZlaW5nYWJlW0ZfTElORV0pLCA3OCwgIiIsIEJTX0xFQVZFX01ZX0xGUykpOworICAgICAgfSwgSU5QVVRfUFJPTVBUfElOUFVUX0FQUEVORCwKKyAgICAgICJaZWlsZW5uci4gZWluZ2ViZW4sIGluIGRlciBkZXIgRmVobGVyIGF1ZnRyaXR0IChmYWxscyBiZWthbm50KTpcbiIpOworCisgIGlucHV0X3RvKCMnX2ZlaW5nYWJlX2ZlcnRpZywKKyAgICAgIElOUFVUX1BST01QVHxJTlBVVF9BUFBFTkQsICJFaW5nYWJlbiBrb3JyZWt0PyAoai9uKVxuIik7CisKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgQ21kRmVobGVyWmVpZ2VuKHN0cmluZyBhcmcpCit7CisgIGludCBpc3N1ZWlkOworCisgIGlmIChzdHJpbmdwKGFyZykgJiYgc2l6ZW9mKGFyZykpCisgIHsKKyAgICAgIGFyZyA9IHRyaW0oYXJnLCBUUklNX0JPVEgpOworICAgICAgaXNzdWVpZCA9IHRvX2ludChhcmcpOworICB9CisgIGVsc2UKKyAgeworICAgICAgaXNzdWVpZCA9IGxmZWhsZXI7CisgICAgICBhcmcgPSB0b19zdHJpbmcoaXNzdWVpZCk7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIkVpbmVuIEVpbnRyYWcgbWl0IGRpZXNlciBJRCBnaWJ0IGVzIG5pY2h0IVxuIik7CisKKyAgLy8gTWl0IGVpbmVtIC8gYW0gQW5mYW5nIGlzdCBhcmcgd29obCBlaW4gRmlsZW5hbWUsIHdlbm4gdG9fc3RyaW5nKGlzc3VlaWQpCisgIC8vID09IGFyZyB3aXJkIGRpZSBJc3N1ZWlkIHZvbiBvYmVuIGdlbm9tbWVuLgorICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWU7CisgIHN0cnVjdCBmdWxsaXNzdWVfcyAqaXNzdWVzOworICBpZiAoYXJnWzBdID09ICcvJykKKyAgeworICAgIGlzc3Vlcz0oe30pOworICAgIGZvcmVhY2goaW50IG06IEFMTF9FUlJfVFlQRVMpCisgICAgeworICAgICAgaWYgKCEobSAmIG1vZHVzKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgKnRtcCA9IAorICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGZ1bGxpc3N1ZV9zICopRVJST1JELT5RdWVyeUlzc3Vlc0J5RmlsZShhcmcsIG0pOworICAgICAgaWYgKHRtcCkKKyAgICAgICAgaXNzdWVzKz10bXA7CisgICAgfQorICAgIGlmICghc2l6ZW9mKGlzc3VlcykpCisgICAgICBpc3N1ZXM9MDsKKyAgfQorICBlbHNlIGlmICh0b19zdHJpbmcoaXNzdWVpZCkgPT0gYXJnKQorICAgIGlzc3VlID0gKHN0cnVjdCBmdWxsaXNzdWVfcylFUlJPUkQtPlF1ZXJ5SXNzdWVCeUlEKGlzc3VlaWQpOworICBlbHNlCisgICAgaXNzdWUgPSAoc3RydWN0IGZ1bGxpc3N1ZV9zKUVSUk9SRC0+UXVlcnlJc3N1ZUJ5SGFzaChhcmcpOworCisgIGlmIChzdHJ1Y3RwKGlzc3VlKSkKKyAgeworICAgIHNob3dfZW50cnkoaXNzdWUpOworICAgIC8vIGxldHp0ZW4gRmVobGVyIG1lcmtlbi4KKyAgICBsZmVobGVyID0gaXNzdWVpZDsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBXZW5uIGRhcyBuaWNodCBlcmZvbGdyZWljaCBpc3QsIGlzdCBkYXMgQXJndW1lbnQgZXZ0bC4gZWluIE9iamVrdC0sCisgIC8vIFByb2dyYW1tLSBvZGVyIExhZGVuYW1lLiBJbiBkZW0gRmFsbCBhbGxlIHZvbiBkZW5lbiBhbnplaWdlbiwgZGllIHBhc3NlbgorICAvLyBoaWVyYmVpIHdpcmQgZGVyIFR5cCBOSUNIVCBiZXJ1ZWNrc2ljaHRpZ3QuCisgIGVsc2UgaWYgKHBvaW50ZXJwKGlzc3VlcykpCisgIHsKKyAgICBmb3JlYWNoKGlzc3VlIDogaXNzdWVzKQorICAgIHsKKyAgICAgIHNob3dfZW50cnkoaXNzdWUpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIG5vdGlmeV9mYWlsKCJLZWluZSBFaW50cmFlZ2UgZnVlciBkaWVzZW4gRGF0ZWluYW1lbi9kaWVzZSBJRCBnZWZ1bmRlbi5cbiIpOworICByZXR1cm4gMDsKK30KKworLy8gTG9lc2NodCBhbGxlIEZlaGxlciB1bmQgV2FybnVuZ2VuIGVpbmVzIE9iamVrdHMgKHNvd2VpdCBwZXIgbW9kdXMKKy8vIGF1c2dld2FlaGx0KS4gRW50c2NoZWlkZW5kIGlzdCBkZXIgX0xvYWRuYW1lXyEKK3ByaXZhdGUgaW50IERlbGV0ZUVycm9yc0ZvckxvYWRuYW1lKHN0cmluZyBsb2FkbmFtZSkKK3sKKyAgaW50IHN1bV9kZWxldGVkOworICAvLyBCZWkgPT0gMCB3aXJkIHNvbnN0IGFsbGVzIGdlbG9lc2NodC4gOy0pCisgIGlmICghbG9hZG5hbWUpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yZWFjaChpbnQgbTogQUxMX0VSUl9UWVBFUykKKyAgeworICAgIGlmICghKG0gJiBtb2R1cykpCisgICAgICBjb250aW51ZTsKKyAgICA8IDxpbnR8c3RyaW5nPiogPiogbGlzdCA9IEVSUk9SRC0+UXVlcnlJc3N1ZUxpc3RCeUxvYWRuYW1lKGxvYWRuYW1lLG0pOworICAgIGlmIChwb2ludGVycChsaXN0KSkKKyAgICB7CisgICAgICBmb3JlYWNoKDxpbnR8c3RyaW5nPiogcm93IDogbGlzdCkKKyAgICAgIHsKKyAgICAgICAgICBpZiAoKGludClFUlJPUkQtPlRvZ2dsZURlbGV0ZUVycm9yKHJvd1swXSkgPT0gMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICAgICAgICByb3dbMF0gKyAiIGFscyBnZWxvZXNjaHQgbWFya2llcnQuXG4iKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBzdW1fZGVsZXRlZCs9c2l6ZW9mKGxpc3QpOworICAgIH0KKyAgfQorICByZXR1cm4gc3VtX2RlbGV0ZWQ7Cit9CisKK3B1YmxpYyBpbnQgQ21kRmVobGVyTG9lc2NoZW4oc3RyaW5nIGFyZykKK3sKKyAgaW50IGlzc3VlaWQ7CisgIGFyZyA9IChzdHJpbmcpdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoMCk7CisKKyAgaWYgKHN0cmluZ3AoYXJnKSAmJiBzaXplb2YoYXJnKSkKKyAgICAgIGlzc3VlaWQgPSB0b19pbnQoYXJnKTsKKyAgZWxzZQorICAgICAgaXNzdWVpZCA9IGxmZWhsZXI7CisKKyAgbm90aWZ5X2ZhaWwoIkVpbmVuIEVpbnRyYWcgbWl0IGRpZXNlciBJRC9kaWVzZW0gTG9hZG5hbWUgZ2lidCBlcyBuaWNodCFcbiIpOworCisgIGludCByZXMgPSAoaW50KUVSUk9SRC0+VG9nZ2xlRGVsZXRlRXJyb3IoaXNzdWVpZCk7CisgIGlmIChyZXMgPT0gMSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIkZlaGxlci9XYXJudW5nIHd1cmRlIHp1bSBMb2VzY2hlbiBtYXJraWVydCB1bmQgd2lyZCBpbiBLdWVyemUgIgorICAgICAgImdlbG9lc2NodC5cbiIpOworICAgIGxmZWhsZXIgPSBpc3N1ZWlkOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKHJlcz09MCkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLCJMb2VzY2htYXJraWVydW5nIHd1cmRlIGVudGZlcm50LlxuIik7CisgICAgbGZlaGxlciA9IGlzc3VlaWQ7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAocmVzIDwgLTEpCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwgIklyZ2VuZHdhcyBpc3QgYmVpbSBMb2VzY2hlbiBzY2hpZWZnZWdhbmdlbi4gIgorICAgICAgICAgICAgICAgICAgICAiS2VpbmUgU2NocmVpYnJlY2h0ZT9cbiIpOworICAgIGxmZWhsZXIgPSBpc3N1ZWlkOworICAgIHJldHVybiAxOworICB9CisgIC8vIHJlcyB3YXIgPT0gLTEgLT4gRmVobGVyIG5pY2h0IGdlZnVuZGVuLiBWaWVsbGVpY2h0IGlzdCBlcyBuZW4gTG9hZG5hbWUKKyAgcmV0dXJuIERlbGV0ZUVycm9yc0ZvckxvYWRuYW1lKGFyZyk7Cit9CisKK3B1YmxpYyBpbnQgQ21kUmVmcmVzaChzdHJpbmcgYXJnKSB7CisgICAgcmVzZXQoKTsKKyAgICB0ZWxsX29iamVjdChQTCwiRmVobGVyZGF0ZW4gd3VyZGVuIG5ldSBlaW5nZWxlc2VuLlxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IHNlbGVjdF9tb2R1cyhzdHJpbmcgYXJnKSB7CisgICAgaW50IGxtb2R1czsKKyAgICBzd2l0Y2goYXJnKSB7CisgICAgY2FzZSAiYWxsZXMiOgorICAgIGNhc2UgImFsbGUiOgorICAgICAgbG1vZHVzID0gVF9SVEVSUk9SIHwgVF9SVFdBUk4gfCBUX0NURVJST1IgfCBUX0NUV0FSTiB8IFRfUkVQT1JURURfRVJSCisgICAgICAgICAgICAgICB8IFRfUkVQT1JURURfSURFQSB8IFRfUkVQT1JURURfVFlQTyB8IFRfUkVQT1JURURfTUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICJmZWhsZXIiOgorICAgIGNhc2UgImVycm9yIjoKKyAgICBjYXNlICJlcnJvcnMiOgorICAgICAgbG1vZHVzPVRfUlRFUlJPUiB8IFRfQ1RFUlJPUiB8IFRfUkVQT1JURURfRVJSOworICAgICAgYnJlYWs7CisgICAgY2FzZSAid2FybnVuZ2VuIjoKKyAgICBjYXNlICJ3YXJudW5nIjoKKyAgICBjYXNlICJ3YXJuaW5nIjoKKyAgICBjYXNlICJ3YXJuaW5ncyI6CisgICAgICBsbW9kdXM9VF9SVFdBUk4gfCBUX0NUV0FSTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImxhdWZ6ZWl0ZmVobGVyIjoKKyAgICAgIGxtb2R1cz1UX1JURVJST1I7CisgICAgICBicmVhazsKKyAgICBjYXNlICJsYWRlemVpdGZlaGxlciI6CisgICAgICBsbW9kdXM9VF9DVEVSUk9SOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiZmVobGVyaGlud2VpcyI6CisgICAgY2FzZSAiZmVobGVyaGlud2Vpc2UiOgorICAgIGNhc2UgImhpbndlaXNlIjoKKyAgICAgIGxtb2R1cz1UX1JFUE9SVEVEX0VSUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImlkZWVuIjoKKyAgICBjYXNlICJpZGVlIjoKKyAgICAgIGxtb2R1cz1UX1JFUE9SVEVEX0lERUE7CisgICAgICBicmVhazsKKyAgICBjYXNlICJtZCI6CisgICAgICBsbW9kdXM9VF9SRVBPUlRFRF9NRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgInR5cG8iOgorICAgIGNhc2UgInR5cG9zIjoKKyAgICAgIGxtb2R1cz1UX1JFUE9SVEVEX1RZUE87CisgICAgICBicmVhazsKKyAgICBjYXNlICJsYXVmemVpdHdhcm51bmdlbiI6CisgICAgY2FzZSAicnVudGltZXdhcm5pbmdzIjoKKyAgICAgIGxtb2R1cz1UX1JUV0FSTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImxhZGV6ZWl0d2FybnVuZ2VuIjoKKyAgICBjYXNlICJjb21waWxldGltZXdhcm5pbmdzIjoKKyAgICAgIGxtb2R1cz1UX0NUV0FSTjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBsbW9kdXM9bW9kdXM7CisgICAgfQorICAgIHJldHVybiBsbW9kdXM7Cit9CisKK3ByaXZhdGUgc3RyaW5nICAqIGVycm9ybGFiZWwoaW50IHQpCit7CisgIHN3aXRjaCh0KSB7CisgICAgY2FzZSBUX1JURVJST1I6CisgICAgICByZXR1cm4gKHsiTGF1ZnplaXRmZWhsZXIiLCJMYXVmemVpdGZlaGxlciIsIkRpZXNlciBMYXVmemVpdGZlaGxlciJ9KTsKKyAgICBjYXNlIFRfUkVQT1JURURfRVJSOgorICAgICAgcmV0dXJuICh7IkZlaGxlcmhpbndlaXMiLCJGZWhsZXJoaW53ZWlzZSIsIkRpZXNlciBGZWhsZXJoaW53ZWlzIn0pOworICAgIGNhc2UgVF9SRVBPUlRFRF9JREVBOgorICAgICAgcmV0dXJuICh7IklkZWUiLCJJZGVlbiIsIkRpZXNlIElkZWUifSk7CisgICAgY2FzZSBUX1JFUE9SVEVEX01EOgorICAgICAgcmV0dXJuICh7ImZlaGxlbmRlIERldGFpbCIsImZlaGxlbmRlIERldGFpbHMiLCJEaWVzZXMgZmVobGVuZGUgRGV0YWlsIn0pOworICAgIGNhc2UgVF9SRVBPUlRFRF9UWVBPOgorICAgICAgcmV0dXJuICh7IlR5cG8iLCJUeXBvcyIsIkRpZXNlciBUeXBvIn0pOworICAgIGNhc2UgVF9SVFdBUk46CisgICAgICByZXR1cm4gKHsiTGF1ZnplaXR3YXJudW5nIiwiTGF1ZnplaXR3YXJudW5nZW4iLCJEaWVzZSBMYXVmemVpdHdhcm51bmcifSk7CisgICAgY2FzZSBUX0NUV0FSTjoKKyAgICAgIHJldHVybiAoeyJMYWRlemVpdHdhcm51bmciLCAiTGFkZXplaXR3YXJudW5nZW4iLCJEaWVzZSBMYWRlemVpdHdhcm51bmcifSk7CisgICAgY2FzZSBUX0NURVJST1I6CisgICAgICByZXR1cm4gKHsiTGFkZXplaXRmZWhsZXIiLCJMYWRlemVpdGZlaGxlciIsIkRpZXNlciBMYWRlemVpdGZlaGxlciJ9KTsKKyAgfQorICByYWlzZV9lcnJvcigiVW5rYW5udGVyIEZlaGxlcnR5cDogIit0KyJcbiIpOworICByZXR1cm4gMDsKK30KKworcHVibGljIGludCBDbWRGZWhsZXJMaXN0ZShzdHJpbmcgYXJnKSB7CisgIHN0cmluZyB0eHQ7CisgIC8vc3RyaW5nICpsdWlkczsKKyAgaW50IGxtb2R1czsgLy8gbW9kdXMgZnVlciBkaWVzZSBMaXN0ZQorICBtYXBwaW5nIGZlaGxlcmJhY2t1cDsKKworICBpZiAoc3RyaW5ncChhcmcpICYmIHNpemVvZihhcmcpKQorICB7CisgICAgbG1vZHVzPXNlbGVjdF9tb2R1cyhhcmcpOworICAgIGlmIChsbW9kdXMgIT0gbW9kdXMpCisgICAgeworICAgICAgZmVobGVyYmFja3VwPWlzc3VlbGlzdDsgLy8gRmVobGVybGlzdGUgdm9uICdtb2R1cycgYXVmaGViZW4KKyAgICAgIGdldF9pc3N1ZWxpc3QobG1vZHVzKTsgIC8vIG5ldWUgRmVobGVybGlzdGUgaG9sZW4KKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGxtb2R1cz1tb2R1czsKKy8qCisgIGlmICghZmVobGVyemFobCkKKyAgeworICAgIHR4dD0iRnVlciBEZWluZSBVSURzIHNpbmQga2VpbmUgRmVobGVyL1dhcm51bmdlbiBiZWthbm50LiA6LSlcbiI7CisgICAgdGVsbF9vYmplY3QoUEwsdHh0KTsKKyAgICByZXR1cm4gMTsKKyAgfQorKi8KKyAgZm9yZWFjaChpbnQgdHlwLCBtYXBwaW5nIHR5cGVtYXAgOiBpc3N1ZWxpc3QpCisgIHsKKyAgICBpZiAoISh0eXAgJiBsbW9kdXMpKQorICAgICAgY29udGludWU7IC8vIFR5cGUgbmljaHQgZ2V3YWVobHQuCisgICAgdHh0PSIiOworICAgIGlmICghc2l6ZW9mKHR5cGVtYXApKSB7CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgIkVzIHNpbmQga2VpbmUgIiArIGVycm9ybGFiZWwodHlwKVsxXSArICJEZWluZXIgVUlEcyBiZWthbm50LiA6LSkiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3JlYWNoKHN0cmluZyB1aWQsIDwgPGludHxzdHJpbmc+KiA+KiBsaXN0IDogdHlwZW1hcCkKKyAgICB7CisgICAgICBpZiAoIXNpemVvZihsaXN0KSkgY29udGludWU7CisgICAgICBpZiAoZmlsdGVyc3RhdHVzICYmIG1lbWJlcihmaWx0ZXJ1aWRzLCB1aWQpID4gLTEpIGNvbnRpbnVlOworICAgICAgLy90eHQrPXNwcmludGYoIiVzOlxuIiwgdWlkKTsKKyAgICAgIGZvcmVhY2goPGludHxzdHJpbmc+KiByb3cgOiBsaXN0KQorICAgICAgeworICAgICAgICB0eHQrPXNwcmludGYoIiU6NmQgfCAlOjQwLXMgfCAlOjI2LXNcbiIsCisgICAgICAgICAgICAgIHJvd1swXSwgcm93WzFdLCByb3dbMl0pOworICAgICAgfQorICAgIH0KKyAgICBpZiAodHh0ICYmIHNpemVvZih0eHQpKQorICAgIHsKKyAgICAgIHR4dCA9IHNwcmludGYoIlxuRnVlciBEZWluZSBVSURzIHNpbmQgZm9sZ2VuZGUgJXMgYmVrYW5udCAoRmlsdGVyOiAlcyk6XG4iCisgICAgICAgICAgICAgICAgICAgICIlOjZ8cyB8ICU6NDB8cyB8ICAgJXNcbiIsCisgICAgICAgICAgICAgICAgIGVycm9ybGFiZWwodHlwKVsxXSwgKGZpbHRlcnN0YXR1cyA/ICJhbiIgOiAiYXVzIiksCisgICAgICAgICAgICAgICAgICJJRCIsICJMb2FkbmFtZSIsICJVSUQiKQorICAgICAgICAgICsgdHh0OworICAgICAgdGVsbF9vYmplY3QoUEwsIHR4dCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0ZWxsX29iamVjdChQTCwgc3ByaW50ZigKKyAgICAgICAgICAgICJcbkZ1ZXIgRGVpbmUgVUlEcyBzaW5kIGtlaW5lICVzIGJla2FubnQgKEZpbHRlcjogJXMpOlxuIiwKKyAgICAgICAgICAgIGVycm9ybGFiZWwodHlwKVsxXSwgKGZpbHRlcnN0YXR1cyA/ICJhbiIgOiAiYXVzIikpKTsKKyAgICB9CisgIH0KKworICBpZiAobWFwcGluZ3AoZmVobGVyYmFja3VwKSAmJiBtb2R1cyE9bG1vZHVzKQorICAgIGlzc3VlbGlzdD1mZWhsZXJiYWNrdXA7IC8vIGZlaGxlcmxpc3RlIGZ1ZXIgJ21vZHVzJyByZXN0YXVyaWVyZW4KKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgQ21kRmlsdGVyKHN0cmluZyBhcmcpIHsKKworICBhcmc9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7ICAKKworICBpZiAoIXN0cmluZ3AoYXJnKSB8fCAhc2l6ZW9mKGFyZykpIHsKKyAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICAgIk1vbWVudGFuIGludGVyZXNzaWVyZW4gRGljaCBmb2xnZW5kZSBVSURzIG5pY2h0IgorICAgICAgICAgICsoZmlsdGVyc3RhdHVzID8gIiAoRmlsdGVyIGFuKTpcbiIgOiAiIChGaWx0ZXIgYXVzKTpcbiIpCisgICAgICAgICAgK0NvdW50VXAoZmlsdGVydWlkcykrIlxuIiwgNzgsIiIsQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoYXJnPT0ia2VpbmUiKSB7CisgICAgZmlsdGVydWlkcz0oe30pOworICAgIGZpbHRlcnN0YXR1cz0xOworICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHdpcmQgRGlyIG51biBudXIgbm9jaCBhdXNnZXdhZWhsdGUgIgorICAgICAgICAiRmVobGVyIGJlcmljaHRlbi4gTW9tZW50YW4gaGFzdCBEdSBrZWluZSBVSURzIGF1c2dlYmxlbmRldC4gIgorICAgICAgICAiKEZpbHRlciBhbikiLDc4KSk7CisgIH0KKyAgZWxzZSBpZiAoYXJnPT0iYWxsZSIpIHsKKyAgICBmaWx0ZXJzdGF0dXM9MTsKKyAgICBmaWx0ZXJ1aWRzPXVpZHM7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgd2lyZCBEaXIgbnVuIG51ciBub2NoIGF1c2dld2FlaGx0ZSAiCisgICAgICAgICJGZWhsZXIgYmVyaWNodGVuLiBEdSBibGVuZGVzdCBtb21lbnRhbiBhbGxlIFVJRHMgYXVzLiAiCisgICAgICAgICIoRmlsdGVyIGFuKSIsNzgpKTsKKyAgfQorICBlbHNlIGlmIChhcmc9PSJhdXMiKSB7CisgICAgZmlsdGVyc3RhdHVzPTA7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgd2lyZCBEaXIgbnVuIHdpZWRlciBhbGxlIEZlaGxlciBiZXJpY2h0ZW4uICIsCisgICAgICAgIDc4KSk7CisgIH0KKyAgZWxzZSBpZiAoYXJnPT0iYW4iIHx8IGFyZz09ImVpbiIpIHsKKyAgICBmaWx0ZXJzdGF0dXM9MTsKKyAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCB3aXJkIERpciBudW4gbnVyIG5vY2ggYXVzZ2V3YWVobHRlICIKKyAgICAgICAgIkZlaGxlciBiZXJpY2h0ZW4uIiw3OCkpOworICB9CisgIGVsc2UgeworICAgIGZvcmVhY2goc3RyaW5nIHVpZDogZXhwbG9kZShhcmcsIiAiKS0oeyIifSkpIHsKKyAgICAgIGlmIChzaXplb2YodWlkKT4xICYmIHVpZFswXT09JysnKSB7CisgICAgICAgIGlmIChtZW1iZXIoZmlsdGVydWlkcyx1aWRbMS4uXSk9PS0xKQorICAgICAgICAgIGZpbHRlcnVpZHMrPSh7dWlkWzEuLl19KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNpemVvZih1aWQpPjEgJiYgdWlkWzBdPT0nLScpIHsKKyAgICAgICAgICBmaWx0ZXJ1aWRzLT0oe3VpZFsxLi5dfSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1lbWJlcihmaWx0ZXJ1aWRzLHVpZCk9PS0xKQorICAgICAgICAgIGZpbHRlcnVpZHMrPSh7dWlkfSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmaWx0ZXJ1aWRzLT0oe3VpZH0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiTW9tZW50YW4gaW50ZXJlc3NpZXJlbiBEaWNoIGZvbGdlbmRlIFVJRHMgbmljaHQiCisgICAgICAgICAgKyhmaWx0ZXJzdGF0dXMgPyAiIChGaWx0ZXIgYW4pOlxuIiA6ICIgKEZpbHRlciBhdXMpOlxuIikKKyAgICAgICAgICArQ291bnRVcChmaWx0ZXJ1aWRzKSsiXG4iLCA3OCwiIixCU19MRUFWRV9NWV9MRlMpKTsKKworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBDbWRNb25pdG9yKHN0cmluZyBhcmcpIHsKKworICBhcmc9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7ICAKKworICBpZiAoIXN0cmluZ3AoYXJnKSB8fCAhc2l6ZW9mKGFyZykpIHsKKyAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICAgIk1vbWVudGFuIGludGVyZXNzaWVyZW4gRGljaCBmb2xnZW5kZSBVSURzIHp1c2FldHpsaWNoIHp1IERlaW5lbjogXG4iCisgICAgICAgICAgKyhzaXplb2YobW9uaXRvcnVpZHMpID8gQ291bnRVcChtb25pdG9ydWlkcykgOiAiIikKKyAgICAgICAgICArIlxuIiwgNzgsIiIsQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoYXJnPT0ia2VpbmUiKSB7CisgICAgbW9uaXRvcnVpZHM9KHt9KTsKKyAgICB4bW9uaXRvcnVpZHM9KHt9KTsKKyAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCB3aXJkIERpciBudW4gbnVyIG5vY2ggIgorICAgICAgICAiRmVobGVyIERlaW5lciBlaWdlbmVuIFVJRHMgYmVyaWNodGVuLiIsNzgpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIHsKKyAgICBmb3JlYWNoKHN0cmluZyB1aWQ6IGV4cGxvZGUoYXJnLCIgIiktKHsiIn0pKSB7CisgICAgICBpZiAoc2l6ZW9mKHVpZCk+MSAmJiB1aWRbMF09PScrJykgeworICAgICAgICBpZiAobWVtYmVyKG1vbml0b3J1aWRzLHVpZFsxLi5dKT09LTEpCisgICAgICAgICAgbW9uaXRvcnVpZHMrPSh7dWlkWzEuLl19KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNpemVvZih1aWQpPjEgJiYgdWlkWzBdPT0nLScpIHsKKyAgICAgICAgICBtb25pdG9ydWlkcy09KHt1aWRbMS4uXX0pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChtZW1iZXIobW9uaXRvcnVpZHMsdWlkKT09LTEpCisgICAgICAgICAgbW9uaXRvcnVpZHMrPSh7dWlkfSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtb25pdG9ydWlkcy09KHt1aWR9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZ2V0X3VpZHMoKTsKKyAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAiTW9tZW50YW4gaW50ZXJlc3NpZXJlbiBEaWNoIGZvbGdlbmRlIFVJRHMgenVzYWV0emxpY2ggenUgRGVpbmVuOiBcbiIKKyAgICAgICAgKyhzaXplb2YobW9uaXRvcnVpZHMpID8gQ291bnRVcChtb25pdG9ydWlkcykgOiAiIikKKyAgICAgICAgKyJcbiIsIDc4LCIiLEJTX0xFQVZFX01ZX0xGUykpOworCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IENtZE1vZHVzKHN0cmluZyBhcmcpIHsKKyAgc3RyaW5nIHR4dDsKKworICAvLyBBcmd1bWVudCB2ZXJ3dXJzdGVuCisgIGlmIChzdHJpbmdwKGFyZykgJiYgc2l6ZW9mKGFyZykpIHsKKyAgICBtb2R1cyA9IHNlbGVjdF9tb2R1cyhhcmcpOworICAgIHJlc2V0KCk7ICAvLyBuZXVlIEZlaGxlcmxpc3RlIGhvbGVuCisgIH0KKyAgLy8gYWt0dWVsbGUgRWluc3RlbGx1bmcgYXVzZ2ViZW4uCisgIHN0cmluZyAqbW9kc3RyPSh7fSk7CisgIGlmIChtb2R1cyAmIFRfUlRFUlJPUikKKyAgICAgIG1vZHN0cis9KHsiRmVobGVyIChMYXVmemVpdCkifSk7CisgIGlmIChtb2R1cyAmIFRfUlRXQVJOKQorICAgICAgbW9kc3RyKz0oeyJXYXJudW5nZW4gKExhdWZ6ZWl0KSJ9KTsKKyAgaWYgKG1vZHVzICYgVF9DVEVSUk9SKQorICAgICAgbW9kc3RyKz0oeyJGZWhsZXIgKExhZGV6ZWl0KSJ9KTsKKyAgaWYgKG1vZHVzICYgVF9DVFdBUk4pCisgICAgICBtb2RzdHIrPSh7Ildhcm51bmdlbiAoTGFkZXplaXQpIn0pOworICBpZiAobW9kdXMgJiBUX1JFUE9SVEVEX0VSUikKKyAgICAgIG1vZHN0cis9KHsiRmVobGVyaGlud2Vpc2UifSk7CisgIGlmIChtb2R1cyAmIFRfUkVQT1JURURfSURFQSkKKyAgICAgIG1vZHN0cis9KHsiSWRlZSJ9KTsKKyAgaWYgKG1vZHVzICYgVF9SRVBPUlRFRF9NRCkKKyAgICAgIG1vZHN0cis9KHsiZmVobGVuZGUgRGV0YWlscyJ9KTsKKyAgaWYgKG1vZHVzICYgVF9SRVBPUlRFRF9UWVBPKQorICAgICAgbW9kc3RyKz0oeyJUeXBvIn0pOworCisgIHRlbGxfb2JqZWN0KFBMLCBicmVha19zdHJpbmcoCisgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgd2lyZCBEaXIgbnVuIHVlYmVyIGF1ZmdldHJldGVuZSAiCisgICAgICArQ291bnRVcChtb2RzdHIpKyIgQmVyaWNodCBlcnN0YXR0ZW4uIiw3OCkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBDbWRBZGROb3RlKHN0cmluZyBzdHIpIHsKKyAgc3RyaW5nICphcnI7CisKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIGVpbmVuIFRleHQgYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuIDA7CisKKyAgYXJyPWV4cGxvZGUoc3RyLCIgIiktKHsiIn0pOworICBpZiAoc2l6ZW9mKGFycik8MikKKyAgICByZXR1cm4gMDsKKyAgaW50IGlzc3VlaWQgPSB0b19pbnQoYXJyWzBdKTsKKworICBzdHI9aW1wbG9kZShhcnJbMS4uXSwiICIpOyAgLy90ZXh0IHdpZWRlcmhlcnN0ZWxsZW4sIGFiZXIgb2huZSBJRAorCisgIHN3aXRjaCgoaW50KUVSUk9SRC0+QWRkTm90ZShpc3N1ZWlkLHN0cikpCisgIHsKKyAgICBjYXNlIC0xOgorICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZW4gRmVobGVyIG1pdCBkZXIgSUQ6ICVkXG4iLGlzc3VlaWQpKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgLTM6CisgICAgICByZXR1cm4gMDsgLy9vZmZlbmJhciBrZWluZSBOb3RpeiBhbmdlZ2ViZW4uCisgIH0KKyAgLy8gbGV0enRlbiBGZWhsZXIgbWVya2VuLgorICBsZmVobGVyID0gaXNzdWVpZDsKKworICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkRlaW5lIE5vdGl6IHd1cmRlIHp1ICVkIGhpbnp1Z2VmdWVndC5cbiIsCisgICAgICAgIGlzc3VlaWQpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDbWRGaXgoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICphcnI7CisgIGludCBmaXhpbmcsIHJlczsKKworICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgb3B0aW9uYWwgZWluZSBOb3RpeiBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkKKyAgICByZXR1cm4gMDsKKworICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gMDsKKworICBhcnI9ZXhwbG9kZShzdHIsIiAiKS0oeyIifSk7CisgIGlmICghc2l6ZW9mKGFycikpCisgICAgcmV0dXJuIDA7CisKKyAgaW50IGlzc3VlaWQ9dG9faW50KGFyclswXSk7CisgIGlmIChzaXplb2YoYXJyKT4xKQorICAgIHN0cj1pbXBsb2RlKGFyclsxLi5dLCIgIik7ICAvL3RleHQgd2llZGVyaGVyc3RlbGxlbiwgYWJlciBvaG5lIEtleQorICBlbHNlIHN0cj0wOworCisgIGlmIChxdWVyeV92ZXJiKCk9PSJmZml4IiB8fCBxdWVyeV92ZXJiKCk9PSJmZWhsZXJmaXgiKQorICB7CisgICAgICBmaXhpbmc9MTsKKyAgICAgIHJlcyA9IChpbnQpRVJST1JELT5SZXNvbHZlSXNzdWUoaXNzdWVpZCwgc3RyKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIHJlcyA9IChpbnQpRVJST1JELT5SZU9wZW5Jc3N1ZShpc3N1ZWlkLCBzdHIpOworICB9CisKKyAgaWYgKHJlcz09LTEpCisgIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmVuIEZlaGxlciBtaXQgZGVyIElEOiAlZFxuIixpc3N1ZWlkKSk7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0tMTApCisgIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAiRHUgaGFzdCBsZWlkZXIga2VpbmVuIFNjaHJlaWJ6dWdyaWZmIGRpZXNlbiBGZWhsZXIuXG4iCisgICAgICAgICJBYmVyIHZpZWxsZWljaHQgbW9lY2h0ZXN0IER1IG1pdCBmbm90aXogZWluZSBOb3RpeiBhbmhhZW5nZW4/XG4iKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PS0zKQorICB7CisgICAgaWYgKGZpeGluZykKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCJEaWVzZXIgRmVobGVyIGlzdCBiZXJlaXRzIGdlZml4dC5cbiIpOworICAgIGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCJEaWVzZXIgRmVobGVyIGlzdCBub2NoIG5pY2h0IGdlZml4dC5cbiIpOworICB9CisgIGVsc2UgaWYgKHJlcz09MSkKKyAgeworICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgc3ByaW50ZigiRmVobGVyICVkIGFscyBnZWZpeHQgbWFya2llcnQuXG4iLGlzc3VlaWQpKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PTApCisgIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgIHNwcmludGYoIkZlaGxlciAlZCBhbHMgbmljaHQgZ2VmaXh0IG1hcmtpZXJ0LlxuIixpc3N1ZWlkKSk7CisgIH0KKyAgLy8gbGV0enRlbiBGZWhsZXIgbWVya2VuLgorICBsZmVobGVyID0gaXNzdWVpZDsKKworICByZXR1cm4gMTsKK30KKworaW50IENtZExvY2soc3RyaW5nIHN0cikgeworICBzdHJpbmcgKmFycjsKKyAgaW50IGxvY2tpbmc7CisgIGludCByZXM7CisKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIG9wdGlvbmFsIGVpbmUgTm90aXogYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuIDA7CisKKyAgYXJyPWV4cGxvZGUoc3RyLCIgIiktKHsiIn0pOworICBpZiAoIXNpemVvZihhcnIpKQorICAgIHJldHVybiAwOworCisgIGludCBpc3N1ZWlkPXRvX2ludChhcnJbMF0pOworICBpZiAoc2l6ZW9mKGFycik+MSkKKyAgICBzdHI9aW1wbG9kZShhcnJbMS4uXSwiICIpOyAgLy90ZXh0IHdpZWRlcmhlcnN0ZWxsZW4sIGFiZXIgb2huZSBLZXkKKyAgZWxzZSBzdHI9MDsKKworICBpZiAocXVlcnlfdmVyYigpPT0iZmxvY2siIHx8IHF1ZXJ5X3ZlcmIoKT09ImZlaGxlcmxvY2siKQorICB7CisgICAgICBsb2NraW5nPTE7CisgICAgICByZXM9KGludClFUlJPUkQtPkxvY2tJc3N1ZShpc3N1ZWlkLHN0cik7CisgIH0KKyAgZWxzZQorICB7CisgICAgICByZXM9KGludClFUlJPUkQtPlVubG9ja0lzc3VlKGlzc3VlaWQsc3RyKTsKKyAgfQorCisgIGlmIChyZXM9PS0xKQorICB7CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lbiBGZWhsZXIgbWl0IGRlciBJRDogJWRcbiIsaXNzdWVpZCkpOworICB9CisgIGVsc2UgaWYgKHJlcz09LTEwKQorICB7CisgICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgICJEdSBoYXN0IGxlaWRlciBrZWluZW4gU2NocmVpYnp1Z3JpZmYgZGllc2VuIEZlaGxlci5cbiIpOworICB9CisgIGVsc2UgaWYgKHJlcz09LTMpCisgIHsKKyAgICAgIGlmIChsb2NraW5nKQorICAgICAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgICAgICAiRGllc2VyIEZlaGxlciBpc3QgYmVyZWl0cyB2b3IgYXV0b20uIExvZXNjaGVuIGdlc2NodWV0enQuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICAgICAgIkRpZXNlciBGZWhsZXIgaXN0IGJlcmVpdHMgenVtIGF1dG9tLiBMb2VzY2hlbiBmcmVpZ2VnZWJlbi5cbiIpOworICB9CisgIGVsc2UgaWYgKHJlcz09LTIpCisgIHsKKyAgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICAgIkRpZXNlciBGZWhsZXIgaXN0IGJlcmVpdHMgZ2VmaXh0IHVuZCB3aXJkIGJhbGQgZ2Vsb2VzY2h0LlxuIik7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0xKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgIHNwcmludGYoIkZlaGxlciAlZCB2b3IgYXV0b20uIExvZXNjaGVuIGdlc2NodWV0enQuXG4iLGlzc3VlaWQpKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PTApCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgc3ByaW50ZigiRmVobGVyICVkIHp1bSBhdXRvbS4gTG9lc2NoZW4gZnJlaWdlZ2ViZW4uXG4iLGlzc3VlaWQpKTsKKyAgfQorICAvLyBsZXR6dGVuIEZlaGxlciBtZXJrZW4uCisgIGxmZWhsZXIgPSBpc3N1ZWlkOworCisgIHJldHVybiAxOworfQorCitpbnQgQ21kUmVhc3NpZ24oc3RyaW5nIHN0cikgeworCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElELCBkaWUgbmV1ZSBVSUQgdW5kIGdnZi4gZWluZSBOb3RpeiBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkKKyAgICByZXR1cm4gMDsKKworICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gMDsKKworICBzdHJpbmcgKmFycj1leHBsb2RlKHN0ciwiICIpLSh7IiJ9KTsKKyAgaWYgKHNpemVvZihhcnIpPDIpCisgICAgcmV0dXJuIDA7CisgIGludCBpc3N1ZWlkPXRvX2ludChhcnJbMF0pOworICBzdHJpbmcgbmV3dWlkPWFyclsxXTsKKworICAvL3RleHQgd2llZGVyaGVyc3RlbGxlbiwgYWJlciBvaG5lIEtleSB1bmQgVUlECisgIGlmIChzaXplb2YoYXJyKSA+IDIpCisgICAgc3RyID0gaW1wbG9kZShhcnJbMi4uXSwiICIpOworICBlbHNlCisgICAgc3RyID0gMDsKKworICBzd2l0Y2goKGludClFUlJPUkQtPlJlYXNzaWduSXNzdWUoaXNzdWVpZCwgbmV3dWlkLCBzdHIpKQorICB7CisgICAgY2FzZSAtMToKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmVuIEZlaGxlciBtaXQgZGVyIElEOiAlZFxuIixpc3N1ZWlkKSk7CisgICAgICByZXR1cm4oMSk7CisgICAgY2FzZSAtMTA6CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICBzcHJpbnRmKCJEdSBoYXN0IGtlaW5lIFNjaHJlaWJyZWNodGUgYXVmIEZlaGxlciAlZFxuIixpc3N1ZWlkKSk7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIC0yOgorICAgICAgcmV0dXJuKDApOyAvL29mZmVuYmFyIGtlaW5lIG5ldWUgdWlkIGFuZ2VnZWJlbi4gKGthbm4gbmljaHQpCisgICAgY2FzZSAtMzoKKyAgICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiQWx0ZSA9PSBOZXVlIFVJRCBpc3QgaXJnZW5kd2llIHVuc2lubmlnLi4uIiw3OCkpOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gbGV0enRlbiBGZWhsZXIgbWVya2VuLgorICBsZmVobGVyID0gaXNzdWVpZDsKKworICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICBzcHJpbnRmKCJEZXIgRmVobGVyIGRlciBJRCAlZCB3dXJkZSBhbiBkaWUgVUlEICVzICIKKyAgICAgICAgInVlYmVydHJhZ2VuLlxuIiwgaXNzdWVpZCwgbmV3dWlkKSw3OCkpOworICByZXR1cm4gMTsKK30KKworLy8gKioqKioqKioqKioqKiogcHVibGljICdpbnRlcm5hbCcgZnVuY3Rpb25zICoqKioqKioqKioqKioqCitwdWJsaWMgc3RyaW5nIFF1ZXJ5T3duZXIoKSB7cmV0dXJuIG93bmVyO30KK3B1YmxpYyBtaXhlZCBRdWVyeUlzc3VlTGlzdCgpIHtyZXR1cm4gaXNzdWVsaXN0O30KKwordm9pZCBjcmVhdGUoKSB7CisgICAgaWYgKCFjbG9uZXAoTUUpKQorICAgICAgICByZXR1cm47CisgICAgOjpjcmVhdGUoKTsgCisKKyAgICBTZXRQcm9wKFBfU0hPUlQsIkRlciBGZWhsZXJ0ZXVmZWwiKTsKKyAgICBTZXRQcm9wKFBfTE9ORyxicmVha19zdHJpbmcoCisgICAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHNvbGwgRGlyIGhlbGZlbiwgSW5mb3JtYXRpb25lbiAiCisgICAgICAgICAgInVlYmVyIGF1ZmdldHJldGVuZSBGZWhsZXIgenUgZXJoYWx0ZW4uIEhpZXJ6dSBmcmFndCBlciBkaWUgIgorICAgICAgICAgICJpbiBcIkRlaW5lblwiIFVJRHMgYXVmZ2V0cmV0ZW5lbiBGZWhsZXIgdW5kIGRlcmVuIERldGFpbHMgdm9tICIKKyAgICAgICAgICAiRmVobGVyc3BlaWNoZXIgZGVyIE11ZGxpYiBhYi4gRm9sZ2VuZGUgS29tbWFuZG9zIGtlbm50IGVyOiIsNzgpCisgICAgKyJmZWhsZXJhYmZyYWdlIDxpZD4gIC0gRnJhZ3QgRGV0YWlscyB1ZWJlciBGZWhsZXIgbWl0IGRlciBJRCBhYi5cbiIKKyAgICAiZmVobGVybG9lc2NoZW4gPGlkPiAtIEZlaGxlciB6dW0gTG9lc2NoZW4gbWFya2llcmVuLlxuIgorICAgICJmZWhsZXJsaXN0ZSAgICAgICAgIC0gRmVobGVybGlzdGUgZGVyIGVpZ2VuZW4gVUlEcyBhbnplaWdlblxuIgorICAgICJmZWhsZXJyZWZyZXNoICAgICAgIC0gRmVobGVyZGF0ZW4gdW5kIFVJRHMgbmV1IGVpbmxlc2VuXG4iCisgICAgImZlaGxlcmZpbHRlciAgICAgICAgLSBVSURzIGZ1ZXIgZGVuIEZpbHRlciBhbmdlYmVuIChzLiBtYW5wYWdlISlcbiIKKyAgICAiZmVobGVybW9kdXMgICAgICAgICAtIEZlaGxlciBvZGVyIFdhcm51bmdlbiBhdXNnZWJlbj8gKHMuIG1hbnBhZ2UpXG4iCisgICAgImZlaGxlcm1vbml0b3IgICAgICAgLSB6dXMuIFVJRHMgYmVvYmFjaHRlbiAocy4gbWFucGFnZSlcbiIKKyAgICAiZm5vdGl6IDxpZD4gPG5vdGU+ICAtIGVpbmUgTm90aXogYW5oYWVuZ2VuXG4iCisgICAgImZsb2NrIDxpZD4gIDxub3RlPiAgLSBGZWhsZXIgdm9yIGF1dG9tLiBMb2VzY2hlbiBzY2h1ZXR6ZW5cbiIKKyAgICAiZnVubG9jayA8aWQ+IDxub3RlPiAtIEZlaGxlciB6dW0gYXV0b20uIExvZXNjaGVuIGZyZWlnZWJlblxuIgorICAgICJmZml4IDxpZD4gPG5vdGU+ICAgIC0gRmVobGVyIGFscyBnZWZpeHQga2VubnplaWNobmVuXG4iCisgICAgImZ1bmZpeCA8aWQ+IDxub3RlPiAgLSBnZWZpeHRlbiBGZWhsZXIgYWxzIG5pY2h0LWdlZml4dCBtYXJraWVyZW5cbiIKKyAgICAiZnVlYmVydHJhZ2UgPGlkPiA8bmV3dWlkPiA8bm90ZT5cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAtIEZlaGxlciBhbiBkaWUgVUlEIHVlYmVydHJhZ2VuXG4iCisgICAgKTsKKyAgICBTZXRQcm9wKFBfTkFNRSwiRmVobGVydGV1ZmVsIik7CisgICAgU2V0UHJvcChQX0dFTkRFUixNQUxFKTsKKyAgICBTZXRQcm9wKFBfV0VJR0hULDApOworICAgIFNldFByb3AoUF9WQUxVRSwwKTsKKyAgICBTZXRQcm9wKFBfU0laRSwxMCk7CisgICAgU2V0UHJvcChQX05PRFJPUCwiRGVuIEZlaGxlcnRldWZlbCBiZWhhZWxzdCBEdSBsaWViZXIgYmVpIERpci5cbiIpOworICAgIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisKKyAgICBBZGRJZCggKHsiZmVobGVydGV1ZmVsIiwidGV1ZmVsIn0pICk7CisKKyAgICBBZGRDbWQoKHsiZmVobGVyYWJmcmFnZSIsImZhYmZyYWdlIn0pLCAiQ21kRmVobGVyWmVpZ2VuIiApOworICAgIEFkZENtZCgoeyJmZWhsZXJsb2VzY2hlbiIsImZsb2VzY2hlbiJ9KSwgIkNtZEZlaGxlckxvZXNjaGVuIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcmxpc3RlIiwiZmxpc3RlIiwgImZlaGxlcnVlYmVyc2ljaHQiLCJmdWViZXJzaWNodCJ9KSwgCisgICAgICAgICJDbWRGZWhsZXJMaXN0ZSIpOworICAgIEFkZENtZCgoeyJmZWhsZXJyZWZyZXNoIiwiZnJlZnJlc2gifSksIkNtZFJlZnJlc2giKTsKKyAgICBBZGRDbWQoKHsiZmVobGVyZmlsdGVyIiwiZmZpbHRlciJ9KSwiQ21kRmlsdGVyIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcm1vZHVzIiwiZm1vZHVzIn0pLCJDbWRNb2R1cyIpOworICAgIEFkZENtZCgoeyJmZWhsZXJtb25pdG9yIiwiZm1vbml0b3IifSksIkNtZE1vbml0b3IiKTsKKyAgICBBZGRDbWQoKHsiZmVobGVybm90aXoiLCJmbm90aXoifSksIkNtZEFkZE5vdGUiKTsKKyAgICBBZGRDbWQoKHsiZmVobGVybG9jayIsImZsb2NrIiwiZmVobGVydW5sb2NrIiwiZnVubG9jayJ9KSwKKyAgICAgICAgIkNtZExvY2siKTsKKyAgICBBZGRDbWQoKHsiZmVobGVyZml4IiwiZmZpeCIsImZlaGxlcnVuZml4IiwiZnVuZml4In0pLAorICAgICAgICAiQ21kRml4Iik7CisgICAgQWRkQ21kKCh7ImZlaGxlcnVlYmVydHJhZ2UiLCJmdWViZXJ0cmFnZSJ9KSwiQ21kUmVhc3NpZ24iKTsKKyAgICBBZGRDbWQoKHsiZmVobGVyZWluZ2FiZSIsICJmZWluZ2FiZSJ9KSwgIkNtZEZlaGxlckVpbmdhYmUiKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgICBpZiAoZmluZF9jYWxsX291dCgicmVtb3ZlIikgIT0gLTEpIHJldHVybjsKKworICAgIC8vIHBydWVmdW5nIGF1ZiBlbnYgbmljaHQgbm9ldGlnLCBtb3ZlIGdlaHQgbnVyIGluIGVpbiBlbnYgdW5kIG9obmUgZW52CisgICAgLy8gYXVjaCBrZWluIGluaXQoKS4KKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpIHx8IAorICAgICAgICAhSVNfTEVBUk5FUihlbnZpcm9ubWVudCgpKSkgeworICAgICAgICAvLyBpbiBpbnRlcmFjdGl2ZSwgYWJlciBrZWluIG1hZ2llciAtPiBkaXJla3Qgd2VnLgorICAgICAgICBjYWxsX291dCgicmVtb3ZlIiwwLDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKCFzaXplb2Yob3duZXIpKQorICAgICAgICAvLyBFbnYgaXN0IEludGVyYWN0aXYgdW5kIE1hZ2llciAoc29uc3Qgd2FlciBtYW4gb2JlbiByYXVzZ2VmbG9nZW4pCisgICAgICAgIG93bmVyPWdldHVpZChlbnZpcm9ubWVudCgpKTsKKyAgICBlbHNlIGlmIChvd25lciE9Z2V0dWlkKGVudmlyb25tZW50KCkpKSB7CisgICAgICAgLy9vaywgbmljaHQgZGVyIEVpZ2VudHVlbWVyLCBkaXJla3Qgd2VnLgorICAgICAgIGNhbGxfb3V0KCJyZW1vdmUiLDApOworICAgICAgIHJldHVybjsKKyAgIH0KKyAgIFNldFByb3AoUF9FWFRSQV9MT09LLGJyZWFrX3N0cmluZygKKyAgICAgICAgICJBdWYgIitlbnZpcm9ubWVudCgpLT5OYW1lKFdFU1NFTikrIiBTY2h1bHRlciBzaXR6dCBlaW4ga2xlaW5lciAiCisgICAgICAgICAiRmVobGVydGV1ZmVsLCBkZXIgIgorICAgICAgICAgK2Vudmlyb25tZW50KCktPlF1ZXJ5UHJvbm91bihXRU0pCisgICAgICAgICArIiBpbW1lciB3aWVkZXIgZXR3YXMgaW5zIE9ociBmbHVlc3RlcnQuIiw3OCkpOworCisgICBjYWxsX291dCgicmVzZXQiLDEpOworCisgICA6OmluaXQoKTsKK30KKworcHVibGljIG1peGVkIENvbmZpZ3VyZShtaXhlZCBkYXRhKQoreworICBpZiAoIWRhdGEpCisgIHsKKyAgICByZXR1cm4gKFsiZmlsdGVydWlkcyI6ZmlsdGVydWlkcywKKyAgICAgICAgICAgICAiZmlsdGVyc3RhdHVzIjpmaWx0ZXJzdGF0dXMsCisgICAgICAgICAgICAgIm1vZHVzIjptb2R1cywKKyAgICAgICAgICAgICAibW9uaXRvcnVpZHMiOm1vbml0b3J1aWRzLAorICAgICAgICAgICAgICJmZWhsZXJ6YWhsIjogZmVobGVyemFobF0pOworICB9CisgIGVsc2UgaWYgKG1hcHBpbmdwKGRhdGEpKQorICB7CisgICAgaWYgKG1lbWJlcihkYXRhLCJmaWx0ZXJ1aWRzIikgJiYgcG9pbnRlcnAoZGF0YVsiZmlsdGVydWlkcyJdKSkKKyAgICAgIGZpbHRlcnVpZHM9ZGF0YVsiZmlsdGVydWlkcyJdOworICAgIGlmIChtZW1iZXIoZGF0YSwiZmlsdGVyc3RhdHVzIikgJiYgaW50cChkYXRhWyJmaWx0ZXJzdGF0dXMiXSkpCisgICAgICBmaWx0ZXJzdGF0dXM9ZGF0YVsiZmlsdGVyc3RhdHVzIl07CisgICAgaWYgKG1lbWJlcihkYXRhLCJtb2R1cyIpICYmIGludHAoZGF0YVsibW9kdXMiXSkpCisgICAgICBtb2R1cz1kYXRhWyJtb2R1cyJdOworICAgIGlmIChtZW1iZXIoZGF0YSwibW9uaXRvcnVpZHMiKSAmJiBwb2ludGVycChkYXRhWyJtb25pdG9ydWlkcyJdKSkKKyAgICAgIG1vbml0b3J1aWRzPWRhdGFbIm1vbml0b3J1aWRzIl07CisgICAgaWYgKG1lbWJlcihkYXRhLCJmZWhsZXJ6YWhsIikgJiYgaW50cChkYXRhWyJmZWhsZXJ6YWhsIl0pKQorICAgICAgZmVobGVyemFobD1kYXRhWyJmZWhsZXJ6YWhsIl07CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK21hcHBpbmcgX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkKK3sKKyAgcmV0dXJuIENvbmZpZ3VyZSgwKTsKK30KKworbWFwcGluZyBfc2V0X2F1dG9sb2Fkb2JqKG1peGVkIGRhdGEpCit7CisgIENvbmZpZ3VyZShkYXRhKTsKKyAgcmV0dXJuIF9xdWVyeV9hdXRvbG9hZG9iaigpOworfQorCisKK3ZvaWQgcmVzZXQoKQoreworICAgIGdldF91aWRzKCk7CisgICAgaW50IG5ldWVmZWhsZXJ6YWhsPWdldF9pc3N1ZWxpc3QoKTsKKworICAgIGlmIChmZWhsZXJ6YWhsIDwgbmV1ZWZlaGxlcnphaGwpCisgICAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudChNRSksIGJyZWFrX3N0cmluZygKKyAgICAgICAgIkRlaW5lIEZlaGxlcmxpc3RlIGlzdCBzb2ViZW4gbGFlbmdlciBnZXdvcmRlbi4iLDc4LAorICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgdGVpbHQgRGlyIG1pdDogIikpOworICAgIGVsc2UgaWYgKGZlaGxlcnphaGwgPiBuZXVlZmVobGVyemFobCkKKyAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KE1FKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbmUgRmVobGVybGlzdGUgaXN0IHNvZWJlbiBrdWVyemVyIGdld29yZGVuLiIsNzgsCisgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgICAgZmVobGVyemFobCA9IG5ldWVmZWhsZXJ6YWhsOworfQorCisvLyAqKioqKioqKiBwcml2YXRlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioKK3ByaXZhdGUgdm9pZCBnZXRfdWlkcygpCit7CisgICAgdWlkcz0oc3RyaW5nICopbWFzdGVyKCktPlF1ZXJ5VUlEc0ZvcldpemFyZChvd25lcik7CisgICAgeG1vbml0b3J1aWRzPSh7fSk7CisgICAgaWYgKHNpemVvZihtb25pdG9ydWlkcykpCisgICAgeworICAgICAgY2xvc3VyZSBjbD1zeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5VUlEQWxpYXMiLCBtYXN0ZXIoKSk7CisgICAgICBmb3JlYWNoKHN0cmluZyB1aWQ6IG1vbml0b3J1aWRzKSB7CisgICAgICAgIHhtb25pdG9ydWlkcyArPSAoc3RyaW5nKilmdW5jYWxsKGNsLCB1aWQpOworICAgICAgfQorICAgIH0KK30KKworLyogSG9sdCBzaWNoIGF1cyBkZW0gRXJyb3JEIGRpZSBMaXN0ZSB1bmdlbG9lc2NodGVyIHVuZCB1bmdlZml4dGVyIEZlaGxlciBmdWVyCisgKiBmdWVyIGRpZSBVSURzIGRlcyBNYWdpZXIgZnVlciBhbGxlIFR5cGVuCisgKi8KK3ByaXZhdGUgdmFyYXJncyBpbnQgZ2V0X2lzc3VlbGlzdChpbnQgbG1vZHVzKQoreworICAgIGludCBjb3VudDsKKworICAgIGlmICghbG1vZHVzKQorICAgICAgbG1vZHVzPW1vZHVzOworCisgICAgaXNzdWVsaXN0PW1fYWxsb2NhdGUoc2l6ZW9mKEFMTF9FUlJfVFlQRVMpLDEpOworCisgICAgZm9yZWFjaChpbnQgdHlwZTogQUxMX0VSUl9UWVBFUykKKyAgICB7CisgICAgICBpZiAodHlwZSAmIGxtb2R1cykKKyAgICAgIHsKKyAgICAgICAgICAvL0RFQlVHKHNwcmludGYoIlR5cGU6ICVkXG4iLHR5cGUpKTsKKyAgICAgICAgICBmb3JlYWNoKHN0cmluZyB1aWQgOiB1aWRzICsgeG1vbml0b3J1aWRzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vREVCVUcoc3ByaW50ZigiVHlwZTogJWQsIFVJRDogJXNcbiIsdHlwZSx1aWQpKTsKKyAgICAgICAgICAgIDwgPGludHxzdHJpbmc+KiA+KiBsaXN0ID0KKyAgICAgICAgICAgICAgICAgICg8IDxpbnR8c3RyaW5nPiogPiopRVJST1JELT5RdWVyeUlzc3VlTGlzdCh0eXBlLHVpZCk7CisgICAgICAgICAgICBjb3VudCArPSBzaXplb2YobGlzdCk7CisKKyAgICAgICAgICAgIGlmICghbWVtYmVyKGlzc3VlbGlzdCwgdHlwZSkpCisgICAgICAgICAgICAgIGlzc3VlbGlzdCArPSAoWyB0eXBlOiAoWyB1aWQ6IGxpc3QgXSkgXSk7CisgICAgICAgICAgICBlbHNlIGlmICghbWVtYmVyKGlzc3VlbGlzdFt0eXBlXSwgdWlkKSkKKyAgICAgICAgICAgICAgaXNzdWVsaXN0W3R5cGVdICs9IChbdWlkOiBsaXN0IF0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvZXNjYXBlLmMgYi9vYmovdG9vbHMvbGlzcC9lc2NhcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWY1NjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvZXNjYXBlLmMKQEAgLTAsMCArMSwzNyBAQAorLy8gRVNDQVBFLkMgLS0gZXhwYW5kaW5nIGVzY2FwZSBjaGFyYWN0ZXJzCisvLyAoYykgMTk5NCBieSBIYXRlQE1vcmdlbkdyYXVlbiwgVFVCbXVkLCBOaWdodEZhbGwKKy8vIC0tCisvLyBDb3B5LCBjaGFuZ2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyBiaXQgb2Ygc29mdHdhcmUgYXMgbXVjaCBhcyB5b3UgbGlrZSwKKy8vIGJ1dCBrZWVwIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBhdXRob3IgaW4gdGhlIGhlYWRlci4KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworc3RyaW5nIGVzY2FwZShzdHJpbmcgc3RyKQoreworICBzd2l0Y2goc3RyKSAKKyAgeworICAgIGNhc2UgIlxiIiA6IHJldHVybiAiXFxiIjsKKyAgICBjYXNlICJcZiIgOiByZXR1cm4gIlxcZiI7CisgICAgY2FzZSAiXG4iIDogcmV0dXJuICJcXG4iOworICAgIGNhc2UgIlxyIiA6IHJldHVybiAiXFxyIjsKKyAgICBjYXNlICJcdCIgOiByZXR1cm4gIlxcdCI7CisgICAgY2FzZSAiXFwiIDogcmV0dXJuICJcXFxcIjsKKyAgfQorICByZXR1cm4gc3RyOworfQorCitzdHJpbmcgdW5lc2NhcGUoc3RyaW5nIHN0cikKK3sKKyAgc3dpdGNoKHN0cikgCisgIHsKKyAgICBjYXNlICJcXGIiIDogcmV0dXJuICJcYiI7CisgICAgY2FzZSAiXFxmIiA6IHJldHVybiAiXGYiOworICAgIGNhc2UgIlxcbiIgOiByZXR1cm4gIlxuIjsKKyAgICBjYXNlICJcXHIiIDogcmV0dXJuICJcciI7CisgICAgY2FzZSAiXFx0IiA6IHJldHVybiAiXHQiOworICAgIGNhc2UgIlxcXFwiOiByZXR1cm4gIlxcIjsKKyAgICBkZWZhdWx0ICAgOiBpZihzdHIgJiYgc2l6ZW9mKHN0cik+MSAmJiBzdHJbMF09PSdcXCcpIAorICAgICAgICAgICAgICAgIHJldHVybiBzdHJbMS4uXTsgCisgIH0KKyAgcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL2tuZXRlLmMgYi9vYmovdG9vbHMvbGlzcC9rbmV0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzE0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9rbmV0ZS5jCkBAIC0wLDAgKzEsMTkwIEBACisvLyBLTkVURS5DIC0tIENvbW1hbmRMaW5lIEZyb250ZW5kIHRvIHRoZSBMaXNwMkNsb3N1cmUgY29tcGlsZXIKKy8vIChjKSAxOTk0IGJ5IEhhdGVATW9yZ2VuR3JhdWVuLCBUVUJtdWQsIE5pZ2h0RmFsbAorLy8gLS0KKy8vIENvcHksIGNoYW5nZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGJpdCBvZiBzb2Z0d2FyZSBhcyBtdWNoIGFzIHlvdSBsaWtlLAorLy8gYnV0IGtlZXAgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGF1dGhvciBpbiB0aGUgaGVhZGVyLgorCisjaW5jbHVkZSAidHdlYWsuaCIKKworc3RhdGljIGluaGVyaXQgSE9NRSgibGlzcCIpOworCisjaWZkZWYgQUxBVElBCisjICBkZWZpbmUgVFVCTVVECisjZW5kaWYKKy8vIFRVQk1VRCBpcyBhIENPTVBBVCBtb2RlIGdhbWUhICh3ZWxsIHNvcnQgb2YsIGl0cyBhIE5BVElWRS9DT01QQVQgbWl4dHVyZSkKKy8vIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBzaG91bGQgYmUgdGhlIG9ubHkgb25lcyB0byBjaGFuZ2UKKy8vIGRlZmluZSBFTkdMSVNIIGlmIHlvdSBkb24ndCB3YW50IGdlcm1hbiBtZXNzYWdlcyA7KQorI2lmIChkZWZpbmVkKFRVQk1VRCkgfHwgZGVmaW5lZChUQVBQTVVEKSB8fCBkZWZpbmVkKFVOSXRvcGlhKSB8fCBcCisgICAgIGRlZmluZWQoQURBTUFOVCkpCisjIGlmZGVmIEFEQU1BTlQKKyMgICBpbmNsdWRlIDxjb25maWcuaD4KKyAgICBpbmhlcml0ICIvbGliL29iaiI7CisjICAgZGVmaW5lIFdJWkxPQ0FMICIvd2l6LyIKKyMgICBkZWZpbmUgSUQoeCkgICAgICAgIHNldF9uYW1lKHgpCisjICAgZGVmaW5lIFNIT1JUKHgpICAgICBzZXRfc2hvcnQoeCkKKyMgICBkZWZpbmUgTE9ORyh4KSAgICAgIHNldF9sb25nKHgpCisjICAgZGVmaW5lIElTV0laQVJEKHBsKSAoTEVWRUxNQVNURVItPmlzX3dpemFyZChwbC0+cXVlcnlfcmVhbF9uYW1lKCkpKQorIyBlbmRpZgorIyBpZmRlZiBUVUJNVUQKKyMgICBpbmNsdWRlIDxrZXJuZWwuaD4KKyMgICBpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyAgICBpbmhlcml0IEFDQ0VTUzsKKyAgICBpbmhlcml0ICIvY29tcGxleC9pdGVtIjsKKyAgICBpbmhlcml0ICIvYmFzaWMvYXV0b2xvYWQiOworIyAgIGRlZmluZSBXSVpMT0NBTCAiL3BsYXllcnMvIgorIyAgIGRlZmluZSBJRCh4KSAgICAgICAgYWRkX2lkKHgpCisjICAgZGVmaW5lIElTV0laQVJEKHBsKSAocGwtPnF1ZXJ5X2xldmVsKCkgPj0gV0xfV0laQVJEKQorIyBlbmRpZgorIyBpZmRlZiBUQVBQTVVECisjICAgaW5jbHVkZSA8bGV2ZWxzLmg+CisgICAgaW5oZXJpdCAiL29iai90aGluZyI7CisjICAgZGVmaW5lIFdJWkxPQ0FMICIvdy8iCisjICAgZGVmaW5lIElEKHgpICAgICAgICBzZXRfYWxpYXMoeCkKKyMgICBkZWZpbmUgSVNXSVpBUkQocGwpIChwbC0+cXVlcnlfbGV2ZWwoKSA+PSBMVkxfV0laQVJEKQorIyBlbmRpZgorIyBkZWZpbmUgRU5HTElTSAorIyBpZmRlZiBVTkl0b3BpYQorIyAgIHVuZGVmIEVOR0xJU0gKKyMgICBpZmRlZiBGaW5hbEZyb250aWVyCisjICAgICBpbmNsdWRlIDxsZXZlbC5oPgorIyAgIGVsc2UKKyMgICAgIGluY2x1ZGUgPGxldmVscy5oPgorIyAgIGVuZGlmCisgICAgaW5oZXJpdCAiL2kvaXRlbSI7CisgICAgaW5oZXJpdCAiL2kvaW5zdGFsbCI7CisjICAgZGVmaW5lIFdJWkxPQ0FMICIvdy8iCisjICAgZGVmaW5lIElEKHgpICAgICAgICBhZGRfaWQoeCkKKyMgICBkZWZpbmUgSVNXSVpBUkQocGwpIHdpenAocGwpCisjIGVuZGlmCisjIGRlZmluZSBXSVpIT01FICAgICAgICAoV0laTE9DQUwrdGhpc19wbGF5ZXIoKS0+cXVlcnlfcmVhbF9uYW1lKCkpCisjIGRlZmluZSBMT05HKHgpICAgICAgICBzZXRfbG9uZyh4KQorIyBkZWZpbmUgU0hPUlQoeCkgICAgICAgc2V0X3Nob3J0KHgpCisjZWxzZQorICBpbmhlcml0ICIvc3RkL3RoaW5nIjsKKyMgaWZkZWYgTklHSFRGQUxMCisjICAgZGVmaW5lIEVOR0xJU0gKKyMgZW5kaWYKKyMgaW5jbHVkZSA8cHJvcGVydGllcy5oPgorIyBpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyMgZGVmaW5lIFdJWkhPTUUgICAgICAgICgiL3BsYXllcnMvIitnZXR1aWQodGhpc19vYmplY3QoKSkpCisjIGRlZmluZSBJRCh4KSAgICAgICAgICBBZGRJZCh4KTsgU2V0UHJvcChQX05BTUUsIHgpCisjIGRlZmluZSBMT05HKHgpICAgICAgICBTZXRQcm9wKFBfTE9ORywgeCkKKyMgZGVmaW5lIFNIT1JUKHgpICAgICAgIFNldFByb3AoUF9TSE9SVCwgeCk7CisjIGRlZmluZSBJU1dJWkFSRChwbCkgICBJU19XSVpBUkQocGwpCisjZW5kaWYKKworbm9tYXNrIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYoc2l6ZW9mKG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCAiIyIpKSA9PSAxKSByZXR1cm47CisgIGlmKCFpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisjaWZuZGVmIE1PUkdFTkdSQVVFTgorICBpZigodGhpc19wbGF5ZXIoKSAhPSBmaW5kX3BsYXllcigiaGF0ZSIpICYmCisgICAgICBpbnRlcmFjdGl2ZShmaW5kX3BsYXllcigiaGF0ZSIpKSkgJiYKKyAgICAgb2xkX2V4cGxvZGUob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksICIjIilbMF0gPT0gSE9NRSgia25ldGUiKSkKKyAgeworI2lmZGVmIFRVQk1VRAorICAgIGlmKGNoZWNrX3ByaXZpbGVnZSgiaGF0ZSIpKSBzZXRfcHJpdmlsZWdlKCJoYXRlIik7CisgICAgZWxzZSBzZXRfcHJpdmlsZWdlKDApOworI2Vsc2UKKyAgICBwcmludGYoIipFUlJPUjogZG8gbm90IGNsb25lIHRoaXMgZmlsZSFcbiIKKyAgICAgICAgICArIiAgICAgICAgY3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3UgaG9tZTpcbiIKKyAgICAgICAgICArImluaGVyaXQgXCIiK0hPTUUoImtuZXRlIikrIlwiO1xuIik7CisgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgcmV0dXJuOworI2VuZGlmCisgIH0KKyNlbmRpZgorI2lmIChkZWZpbmVkKFRVQk1VRCkgfHwgZGVmaW5lZChVTkl0b3BpYSkpCisgIGl0ZW06OmNyZWF0ZSgpOworI2VsaWYgKGRlZmluZWQoQURBTUFOVCkpCisgIG9iajo6Y3JlYXRlKCk7CisjZWxzZQorICB0aGluZzo6Y3JlYXRlKCk7CisjZW5kaWYKKyNpZmRlZiBFTkdMSVNICisgIElEKCJkb3VnaCIpOworICBJRCgibGlzcCIpOworICBTSE9SVCgiQSBwaWVjZSBvZiBkb3VnaFxuIik7CisgIExPTkcoIlRoaXMgcGllY2Ugb2YgZG91Z2ggY2FuIGJlIGZvcm1lZCB0byB5b3VyIG93biBjb252ZW5pZW5jZS5cbiIpOworI2Vsc2UKKyMgaWZkZWYgVU5JdG9waWEKKyAgICBzZXRfbmFtZSgiS25ldGUiKTsKKyMgZW5kaWYKKyAgSUQoImtuZXRlIik7CisgIElEKCJsaXNwIik7CisgIFNIT1JUKCJFaW4gU3R1ZWNrIEtuZXRlIik7CisgIExPTkcoIAorICAiRGllc2VzIFN0dWVjayBLbmV0ZSBrYW5uIG1hbiBzZWhyIHNjaG9lbiBhbiBzZWluZW4gcGVyc29lbmxpY2hlbiBHZXNjaG1hY2tcbiIKKyArImFucGFzc2VuLlxuIik7CisgdGhpc19vYmplY3QoKS0+U2V0UHJvcCgiYXV0b2xvYWRvYmoiLDEpOworIHRoaXNfb2JqZWN0KCktPlNldFByb3AoImF1dG9sb2FkIiwxKTsKKyNlbmRpZgorICBsaXNwOjpjcmVhdGUoKTsKK30KKwordmFyYXJncyBub21hc2sgdm9pZCBpbml0KGludCB4KQoreworICBsaXNwOjppbml0KHgpOworI2lmIChkZWZpbmVkKFRVQk1VRCkgfHwgZGVmaW5lZChVTkl0b3BpYSkpCisjIGlmbmRlZiBUVUJNVUQKKyAgICBpdGVtOjppbml0KCk7CisjIGVuZGlmCisjZWxpZiAoZGVmaW5lZChBREFNQU5UKSkKKyAgb2JqOjppbml0KCk7CisjZWxzZQorICB0aGluZzo6aW5pdCgpOworI2VuZGlmCisgIGFkZF9hY3Rpb24oImNtZGxpbmUiLCAiIiwgMSk7Cit9CisKKyNpZmRlZiBUQVBQTVVECitxdWVyeV9hdXRvX2xvYWQoKSB7IHJldHVybiAoe19fRklMRV9ffSk7IH0KK2Ryb3AoKSB7IHJldHVybiAxOyB9CisjZW5kaWYKKyNpZiAoKGRlZmluZWQoVFVCTVVEKSkgfHwgKGRlZmluZWQoQURBTUFOVCkpKQorZHJvcCgpIHsgcmV0dXJuIDE7IH0KKyNlbmRpZgorCitub21hc2sgc3RyaW5nIGxvYWQoc3RyaW5nIGZpbGUpCit7CisgIGlmKHByZXZpb3VzX29iamVjdCgpICE9IHRoaXNfb2JqZWN0KCkpIHJldHVybiAiKiBQcml2aWxlZ2UgdmlvbGF0aW9uXG4iOworICByZXR1cm4gbGlzcChyZWFkX2ZpbGUoZmlsZSkpOworfQorCitub21hc2sgaW50IGNtZGxpbmUoc3RyaW5nIHN0cikKK3sKKyAgaW50IGNvc3Q7CisgIGNvc3QgPSBnZXRfZXZhbF9jb3N0KCk7CisgIGlmKHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSByZXR1cm4gMDsKKworI2lmbmRlZiBNT1JHRU5HUkFVRU4KKyMgaWZuZGVmIFRVQk1VRAorICBpZih0aGlzX3BsYXllcigpICYmIGludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpICYmCisgICAgICgodGhpc19wbGF5ZXIoKSAhPSBmaW5kX3BsYXllcigiaGF0ZSIpKSB8fAorICAgICAgKHRoaXNfcGxheWVyKCkgIT0gZmluZF9wbGF5ZXIoImV0YWgiKSkpKQorIyBlbmRpZgorI2Vsc2UKKyAgaWYodGhpc19wbGF5ZXIoKSAmJiBpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkKKyNlbmRpZgorICB7CisgICAgbWl4ZWQgcmVzdWx0OworICAgIGlmKCFJU1dJWkFSRCh0aGlzX3BsYXllcigpKSkgcmV0dXJuIDA7CisjaWZkZWYgVEFQUE1VRAorICAgIG5vdGlmeV9mYWlsKGxhbWJkYSgoe30pLCAoeyMnbGlzcC8qJyovLCAKKwkJCQkgIHF1ZXJ5X3ZlcmIoKSsoc3RyPygiICIrc3RyKToiIiksIDF9KSkpOworI2Vsc2UKKyMgaWZkZWYgTU9SR0VOR1JBVUVOCisgICAgc3RyID0gdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsKKyMgZW5kaWYgCisgICAgcmVzdWx0ID0gbGlzcChxdWVyeV92ZXJiKCkrKHN0cj8oIiAiK3N0cik6IiIpLCAxKTsKKyAgICBpZihyZXN1bHQgIT0gLTEgJiYgY29zdCA+PSA5OTAwMDApIHsKKyAgICAgIGlmKHN0cmluZ3AocmVzdWx0KSkKKyAgICAgICAgbm90aWZ5X2ZhaWwocmVzdWx0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYocmVzdWx0KSBub3RpZnlfZmFpbChzcHJpbnRmKCIlT1xuIiwgcmVzdWx0KSk7CisJZWxzZSByZXR1cm4gMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9rbmV0ZS5sIGIvb2JqL3Rvb2xzL2xpc3Ava25ldGUubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ1NDhlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3Ava25ldGUubApAQCAtMCwwICsxLDExIEBACisod3JpdGUgIkxvYWRpbmcgL3cvbWFyY3VzL2tuZXRlLmw6ICIpCisoc2V0X2FsaWFzICJrbmV0ZSIpCisoc2V0X2FsaWFzICJ4eXoiKQorKHNldF9zaG9ydCAiRWluIFN0dWVjayBLbmV0ZSIpCisoc2V0X2xvbmcgIkR1IHNpZWhzdCBoaWVyIGVpbiBTdHVlY2sgS25ldGUsIGRhcyBtYW4gd3VuZGVyYmFyIHZlcmZvcm1lbiwgdmVyZ3JvZXNzZXJuIG9kZXIgdmVya2x1bXBlbiBrYW5uLiBJcmdlbmR3aWUgZGVua3N0IGR1IGJlaSBzZWluZW0gQW5ibGljayBwbG9ldHpsaWNoIGFuIHNlaHIgdmllbGUgS2xhbW1lcm4gYXVmIHVuZCB6dSAuLi4gZ2FueiB3aWUgaW4gZGVuIGFsdGVuIExJU1AgVGFnZW5cbiIpCisoZGVmaW5lIF93YWRkcl9saW5lIChsYW1iZGEgKG9iKSAoc3ByaW50ZiAiJS0xNXMgJTNkICUtMTZzICVzIiAoY2FsbF9vdGhlciBvYiAicXVlcnlfdmlzX25hbWUiKSAoY2FsbF9vdGhlciBvYiAicXVlcnlfbGV2ZWwiKSAocXVlcnlfaXBfbnVtYmVyIG9iKSAocXVlcnlfaXBfbmFtZSBvYikpKSkKKyh3cml0ZSAiLiIpCisoZGVmaW5lIF93YWRkciAobGFtYmRhICgpICh3cml0ZSAoaW1wbG9kZSAobWFwIChjYWxsX290aGVyICh0aGlzX3BsYXllcikgInNvcnRfYnlfbGV2ZWwiICh1c2VycykpIChbIChtZW1vcnkpICdfd2FkZHJfbGluZSkpICJcbiIpKSkpICh3cml0ZSAiX3dhZGRyLiIpCisoZGVmaW5lIHJlbG9hZCAobGFtYmRhICgpICgsIChtYXAgKGV4cGxvZGUgKHJlYWRfZmlsZSAiL3cvbWFyY3VzLy5rbmV0ZS5sIikgIlxuIikgJ2xpc3ApICJEb25lLlxuIikpKSAod3JpdGUgInJlbG9hZC4iKQorKGRlZmluZSBwa2lsbCAobGFtYmRhICh4KSAoLCAobV9kZWxldGUgKGNhbGxfb3RoZXIgIi9vYmovc3RhdGljL3Byb3Bsb2ciICJRVUVSWSIpIHgpIChjYWxsX290aGVyICIvb2JqL3N0YXRpYy9wcm9wbG9nIiAiU0FWRSIpIChtX2RlbGV0ZSAoY2FsbF9vdGhlciAiL29iai9zdGF0aWMvcHJvcG1hc3RlciIgIlFVRVJZIikgeCkgKGNhbGxfb3RoZXIgIi9vYmovc3RhdGljL3Byb3BtYXN0ZXIiICJTQVZFIikgIkRlbGV0ZWQuIikpKSAod3JpdGUgInBraWxsLiIpCisod3JpdGUgIi5cbiIpCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9sZXguYyBiL29iai90b29scy9saXNwL2xleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MjVjODYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9sZXguYwpAQCAtMCwwICsxLDczIEBACisvLyBMRVguQyAtLSBjcmVhdGluZyB0b2xrZW5zIGZyb20gaW5wdXQgc3RyaW5nCisvLyAoYykgMTk5NCBieSBIYXRlQE1vcmdlbkdyYXVlbiwgVFVCbXVkLCBOaWdodEZhbGwKKy8vIC0tCisvLyBDb3B5LCBjaGFuZ2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyBiaXQgb2Ygc29mdHdhcmUgYXMgbXVjaCBhcyB5b3UgbGlrZSwKKy8vIGJ1dCBrZWVwIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBhdXRob3IgaW4gdGhlIGhlYWRlci4KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworI2luY2x1ZGUgInR3ZWFrLmgiCisKK3ByaXZhdGUgaW5oZXJpdCBIT01FKCJtaWNyb2NvZGUiKTsKK3ByaXZhdGUgaW5oZXJpdCBIT01FKCJlc2NhcGUiKTsKKworcHJpdmF0ZSBub3NhdmUgbWl4ZWQgKnRva2VuczsKKworc3RhdGljIHZvaWQgY3JlYXRlKCkgCit7IAorICBtaWNyb2NvZGU6OmNyZWF0ZSgpOworICB0b2tlbnMgPSAoe30pOworfQorCitub21hc2sgcHJpdmF0ZSBtaXhlZCBtYWtlX3N5bWJvbChzdHJpbmcgc3RyKQoreworICBtaXhlZCBzeW07CisKKyAgaWYoIXN0cmluZ3Aoc3RyKSkgcmV0dXJuIHN0cjsKKyAgaWYoc3ltID0gZ2V0X2Z1bmN0aW9uKHN0cikpCQkJCS8vIEZVTkNUSU9OUworICAgIHJldHVybiBzeW07CisgIGlmKHN0ciA9PSAibGlzdCIpCisgICAgcmV0dXJuICMnKHs7CisgIGlmKHN0clswXSA9PSAnIicpCisgICAgcmV0dXJuIGltcGxvZGUobWFwKHJlZ2V4cGxvZGUoc3RyLCAiXFxcXC4iKSwgIyd1bmVzY2FwZSksICIiKTsKKyAgaWYoKHN0clswXSA+PSAnMCcgJiYgc3RyWzBdIDw9ICc5JykgfHwgICAgICAgICAgICAgICAgLy8gTlVNQkVSUworICAgICgoc3RyWzBdID09ICcrJyB8fCBzdHJbMF0gPT0gJy0nKSAmJgorICAgICAoc3RyWzFdID49ICcwJyAmJiBzdHJbMV0gPD0gJzknKSkpCisgICAgaWYobWVtYmVyKHN0ciwgJy4nKSAhPSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZMT0FUUworICAgICAgcmV0dXJuIHRvX2Zsb2F0KHN0cik7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRvX2ludChzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJTlRFR0VSUworCisgIGlmKHN0ciA9PSAiKCIgfHwgc3RyID09ICIpIiB8fCBzdHIgPT0gIiciKSAKKyAgICByZXR1cm4gc3RyOworCisgIHJldHVybiBxdW90ZShzdHIpOyAgICAgICAgICAgIAkJCS8vIFNZTUJPTFMKK30KKworbm9tYXNrIHByaXZhdGUgdm9pZCBnZXRfdG9rZW5zKCkKK3sKKyAgbWl4ZWQgaW5wdXQsIHRtcDsKKworICBkbyB7CisgICAgaWYoIWlucHV0ID0gZ2V0X2xpbmUoKSkgcmV0dXJuIDA7CisgICAgLy8gc3BsaXR0aW5nIHRoZSBpbnB1dCBsaW5lIGluIHN0cmluZyB0b2tlbnMgYW5kIHJlbW92aW5nIGNvbW1lbnRzCisgICAgdG1wID0gcmVnZXhwKHJlZ2V4cGxvZGUoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihcIihcXFxcLnxbXlxcXFxcIl0pKlwiKXxbO10uKnxbKCkgXHQnXSIpLAorICAgICAgICAgICAgICAgICAgICAiXlteO10iKQorICAgICAgICAgICAtICh7IiIsIiAiLCJcdCJ9KTsKKyAgICB0b2tlbnMgKz0gbWFwKHRtcCwgIydtYWtlX3N5bWJvbCk7CisgIH0KKyAgd2hpbGUoIXNpemVvZih0b2tlbnMpKTsKK30KKworbm9tYXNrIHN0YXRpYyBpbnQgbGV4KG1peGVkIHRva2VuKQoreworICBpZighc2l6ZW9mKHRva2VucykpIGdldF90b2tlbnMoKTsKKyAgaWYoc2l6ZW9mKHRva2VucykpCisgIHsKKyAgICB0b2tlbiA9IHRva2Vuc1swXTsKKyAgICB0b2tlbnNbMC4uMF0gPSAoe30pOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvbGlzcC5jIGIvb2JqL3Rvb2xzL2xpc3AvbGlzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTAwODgKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9saXNwLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gTElTUC5DIC0tIExpc3AyQ2xvc3VyZSBjb21waWxlcgorLy8gKGMpIDE5OTQgYnkgSGF0ZUBNb3JnZW5HcmF1ZW4sIFRVQm11ZCwgTmlnaHRGYWxsCisvLyAtLQorLy8gQ29weSwgY2hhbmdlIGFuZCBkaXN0cmlidXRlIHRoaXMgYml0IG9mIHNvZnR3YXJlIGFzIG11Y2ggYXMgeW91IGxpa2UsCisvLyBidXQga2VlcCB0aGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgYXV0aG9yIGluIHRoZSBoZWFkZXIuCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisgCisjaW5jbHVkZSAidHdlYWsuaCIKKworcHJpdmF0ZSBpbmhlcml0IEhPTUUoInBhcnNlciIpOworCitzdGF0aWMgdmFyYXJncyBtaXhlZCBsaXNwKHN0cmluZyBpbnB1dCwgaW50IGludGVyYWN0aXZlLCBpbnQgaW4pCit7CisgIHN0cmluZyBtc2csIGVycm9yOworICBhZGRfaW5wdXQoaW5wdXQpOwkJCQkJLy8gcHV0IGxpbmVzIG9uIHN0YWNrCisgIHN3aXRjaChwYXJzZSgmbXNnLCBpbnRlcmFjdGl2ZSkpCisgIHsgCisgIGNhc2UgIDA6IHJldHVybiBtc2c7CQkJCQkvLyBvaworICBjYXNlIC0xOiBjbGVhcl9pbnB1dCgpOyByZXR1cm4gMDsJCQkvLyBlbXB0eSBsaXN0CisgIGNhc2UgLTI6IGluaXRpYWxpemUoKTsJCQkJLy8gZXhlYyBlcnJvcgorICAgICAgICAgICBjbGVhcl9pbnB1dCgpOworICAgICAgICAgICByZXR1cm4gKGluID8gKHByaW50Zihtc2cpLCAwKTogKGludGVyYWN0aXZlID8gbXNnIDogLTEpKTsKKyAgY2FzZSAtMzogaWYoaW50ZXJhY3RpdmUpIAkJCQkvLyBtaXNzaW5nICkKKyAgICAgICAgICAgeworICAgICAgICAgICAgIHByaW50ZigiJXM/ICIsIG1zZyk7CisgICAgICAgICAgICAgaW5wdXRfdG8oImxpc3AiLCAwLCAxLCAxKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSByZXR1cm4gKGluID8gKHByaW50Zihtc2cpLCAwKTogKGludGVyYWN0aXZlID8gbXNnIDogLTEpKTsKKyAgZGVmYXVsdDogaWYoIW1zZykgbXNnID0iKlVua25vd24gZXJyb3Igb2NjdXJlZFxuIjsJLy8gdW5rbm93biBlcnJvcgorICAgICAgICAgICBjbGVhcl9pbnB1dCgpOworICAgICAgICAgICByZXR1cm4gKGluID8gKHByaW50Zihtc2cpLCAwKTogCisJICAgICAgICAgICAgICAgIChpbnRlcmFjdGl2ZSA/IG1zZyA6IC0xKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZSgpCit7CisgIHBhcnNlcjo6Y3JlYXRlKCk7CisgIGxpc3AocmVhZF9maWxlKF9fRklMRV9fWzAuLjwzXSsiLmwiKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXQoaW50IGFyZykgeyB9CisKZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL2xpc3AuaGVscCBiL29iai90b29scy9saXNwL2xpc3AuaGVscApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQxZjNlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvbGlzcC5oZWxwCkBAIC0wLDAgKzEsODEgQEAKK05BTUU6CisJCSoqKiBLTkVURSAqKioKKworQkVTQ0hSRUlCVU5HOgorCURpZSBLbmV0ZSBpc3QgZWluIGluIExQQyBnZXNjaHJpZWJlbmVyIExpc3AtSW50ZXJwcmV0ZXIuIERpZXNlciBoYXQKKwlkaWUgYmVzb25kZXJlIEVpZ2Vuc2NoYWZ0LCBkaWUgTGlzcC1RdWVsbGVuIGRpcmVrdCBpbiBkZW4gdm9tIAorCUFteWxhYXIgR2FtZURyaXZlciBhbmdlYm90ZW5lbiBjbG9zdXJlcyB6dSB1ZWJlcnNldHplbi4gRGFkdXJjaCBpc3QKKwltaXQgZGVyIEtuZXRlIGFsbGVzIGRhcyBtb2VnbGljaCwgd2FzIGF1Y2ggbWl0IExQQyBtb2VnbGljaCBpc3QuCisJRXMgaXN0IGVpbiBnZW5lcmlzY2hlcywgZnJlaSBwcm9ncmFtbWllcmJhcmVzIEhpbGZzbWl0dGVsLgorCisJRGllIEtuZXRlIGJlZmluZGV0IHNpY2ggdW50ZXI6ICIvb2JqL3Rvb2xzL2xpc3AiCisKK0ZVTktUSU9OU0JFU0NIUkVJQlVORzoKKwlEaWUgS25ldGUga2FubiBpbSBQcmluemlwIGZhc3QgYWxsZXMsIHdhcyBlaW4gZWluZmFjaGVyIExpc3AtCisJSW50ZXJwcmV0ZXIga2Fubi4gQXVzbmFobWVuIHNpbmQgVHVwZWwgKEJzcDogKDEgLiAyKSksIHdlbGNoZSBuaWNodAorCWltcGxlbWVudGllcnQgc2luZC4gRGllIEdydW5kbGVnZW5kZW4gRnVua3Rpb25lbiwgd2llIGRlZmluZSwgc2V0cSwKKwljb25zLCBjZHIsIGNhciBldGMgd2VyZGVuIGJlaW0gTGFkZW4gZGVyIEtuZXRlIGFuZ2V6ZWlndC4gSmUgbmFjaAorCVplaXQsIHdlcmRlbiBldmVudHVlbGxlIGF1Y2ggd2VpdGVyZSBTdGFuZGFyZGZ1bmt0aW9uZW4gaGluenUtCisJa29tbWVuLCB1bSBkaWUgS25ldGUgbW9lZ2xpY2hzdCBjb21tb24tbGlzcCBrb21wYXRpYmVsIHp1IG1hY2hlbi4KKworQkVOVVRaVU5HOgorCVp1IGFsbGVyZXJzdCBzb2xsdGUgbWFuIHdpc3NlbiwgZGFzcyBkaWVzIGhpZXIga2VpbmUgRWluZnVlaHJ1bmcgaW4KKwlMaXNwIGlzdCBvZGVyIHNlaW4gc29sbCEgRGllIHdpY2h0aWdzdGVuIE1lcmttYWwgZGVyIEtuZXRlIHdlcmRlbgorCWF1ZmdlZnVlaHJ0IGFuIGVpbmlnZW4ga2xlaW5lbiBCZWlzcGllbGVuLiBXZXIgTGlzcCBrZW5uZW5sZXJuZW4KKwltb2VjaHRlIGthbm4gZGllcyBtaXQgZGVuIGhhbmRlbHN1ZWJsaWNoZW4gQnVlY2hlcm4gdHVuLgorCisJV2VyIGRlbm5vY2ggYmFzdGVsbiBtb2VjaHRlOiBMaXNwIGlzdCBlaW5lIFNwcmFjaGUgaW4gUHJlZml4bm90YXRpb24sCisJZC5oLiBkZXIgRnVua3Rpb25zbmFtZSBzdGVodCBpbW1lciBhbHMgZXJzdGVzIHVuZCBkYW5uIGtvbW1lbiBkaWUKKwlBcmd1bWVudGUuIEVpbiBBdXNkcnVjayBpc3QgbWl0IGRlbiBpaG4gdW1nZWJlbmRlbiBLbGFtbWVybiBrb21wbGV0dC4KKwkgIEJlaXNwaWVsOiAoKyAxIDEpIDs7OyBlcnJlY2huZXQgZGllIFN1bW1lIGF1cyAxIHVuZCAxCisJU29sY2hlIEtsYW1tZXJhdXNkcnVlY2tlIGtvZW5uZW4gYmVsaWViaWcgZ2VzY2hhY2h0ZWx0IHdlcmRlbi4KKwkgIEJlaXNwaWVsOiAoKyAxICgrICgrIDEgMSkgMSkpCisKKwlFcyBzdGVoZW4gYWxsZSBlZnVucywgc293aWUgZWluaWdlIGxmdW5zIHp1ciBWZXJmdWVndW5nISBadSBkZW4gZWZ1bnMKKwlnZWhvZXJlbiBhdWNoICssLSwqLC8sJSwhLFssWzwsWzwuLiBldGMsIGFsc28gYWxsZSBPcGVyYXRvcmVuIHZvbiBMUEMuCisKKwlEaWUgS25ldGUgaGF0IHp3ZWkgTW9kaToKKwkJYSkgTGFkZW4gdm9uIExpc3AgYXVzIGVpbmVyIERhdGVpCisJCWIpIFZlcmFyYmVpdGVuIHZvbiBFaW5nYWJlbiBhdXMgZGVyIEtvbW1hbmRvemVpbGUKKworCVp1IGEpCisJICBNaXQgZGVyIEZ1bmt0aW9uICJsb2FkIiBrb2VubmVuIERhdGVpZW4gZWluZ2VsZXNlbiB1bmQgaW50ZXJwcmV0aWVydAorCSAgd2VyZGVuLiBEaWUgRnVua3Rpb24gaGF0IG51ciBlaW4gQXJndW1lbnQsIHVuZCBkYXMgaXN0IGRlciBEYXRlaW5hbWUuCisKKwkgIEJlaXNwaWVsOiAobG9hZCAiL3BsYXllcnMvaGF0ZS9saXNwLmwiKQorCQorCVp1IGIpCisJICBXZW5uIGRpZSBLbmV0ZSBnZWNsb25lZCB3dXJkZSwga29lbm5lbiBqZWRlcnplaXQgTGlzcGF1c2RydWVja2UKKwkgIGVpbmdlZ2ViZW4gd2VyZGVuLCB3ZWxjaGUgZGFubiBpbnRlcnByZXRpZXJ0IHdlcmRlbi4gRGFiZWkgc29sbHRlCisJICBiZWFjaHRldCB3ZXJkZW4sIGRhc3MgZGllIGFldXNzZXJzdGUgS2xhbW1lciBuaWNodCBub3R3ZW5kaWcgaXN0IQorCisJICBCZWlzcGllbDogKCsgMSAoKyAxIDEpKSBrb2VubnRlIG1hbiBhdWNoIHNjaHJlaWJlbiBhbHM6CisJICAgICAgICAgICAgKyAxICgrIDEgMSkKKworCSAgRGllcyBpc3Qgdm9yIGFsbGVtIGRhbm4gaW50ZXJlc3NhbnQsIHdlbm4gbWFuIGRpZSBNb2VnbGljaGtlaXRlbgorCSAgZGVyIEtuZXRlIGFscyBhbGlhcy1XZXJremV1ZyBpbiBiZXRyYWNodCB6aWVodC4gU29taXQgaXN0IGVzCisJICBtb2VnbGljaCwgZWluZSBGdW5rdGlvbiB6dSBzY2hyZWliZW4gdW5kIGRpZXNlIGRhbm4gd2llIGVpbiBhbGlhcworCSAgenUgYmVudXR6ZW4uCisKKwkgIEJlaXNwaWVsOiAoZGVmdW4gd2hvICgpICh1c2VycykpIDs7OyBnaWJ0IGRhcyB1c2VycyBhcnJheSBhdXMKKwkgICAgICAgICAgICAgSmV0enQgbXVzcyBudXIgbm9jaCB3aG8gZWluZ2VnZWJlbiB3ZXJkZW4gdW5kIGRhcworCQkgICAgIGFycmF5IHdpcmQgYXVzZ2VnZWJlbi4KKworCSAgRGEgTGlzcCB3ZXNlbnRsaWNoIGtvbXBsZXhlcmUgQXVzZHJ1ZWNrZSBlcm1vZWdsaWNodCwgYWxzIGRlcgorCSAgbm9ybWFsZSBhbGlhcy1JbnRlcnByZXRlciwgbGllZ2VuIGRpZSBWb3J0ZWlsZSBhdWYgZGVyIEhhbmQuCisKK0tPTkZJR1VSQVRJT046CisJRGllIEtuZXRlIGxhZXNzdCBzaWNoIGZ1ZXIgamVkZW4gTnV0emVyIGtvbmZpZ3VyaWVyZW4sIGluZGVtIHNpZSBlaW5lCisJRGF0ZWkgIi9wbGF5ZXJzLzxuYW1lPi9saXNwLmwiIGF1cyBkZXNzZW4gSGVpbWF0dmVyemVpY2huaXMgbGFlZHQuCisKKwlFaW4gQmVpc3BpZWwsIHdhcyBtYW4gZGFtaXQgbWFjaGVuIGthbm4gYmVmaW5kZXQgc2ljaCB1bnRlcjoKKwkgICIvcGxheWVycy9oYXRlL2xpc3AubCIKKwlEaWUgTVVEIFNwZXppZmlzY2hlbiBUZWlsZSB1bmQgQWJmcmFnZW4ga29lbm5lbiBpZ25vZXJpZXJ0IHdlcmRlbi4KKworQlVHUzoKKwlFcyBnaWJ0IG1vbWVudGFuIG5vY2ggZWluIFByb2JsZW0sIHdlbm4gYXVmIGRlciBLb21tYW5kb3plaWxlCisJS2xhbW1lcm4gZmVobGVuLiBEYW5uIGtvbW10IGVpbmUgTWVsZHVuZzogIipNaXNzaW5nIDIgKSIKKwlJbiBkaWVzZW0gRmFsbCBlaW5mYWNoIHp3ZWltYWwgaGludGVyZWluYW5kZXIgKSBhdWYgamV3ZWlscyBlaW5lcgorCWVpbnplbG5lbiBaZWlsZSBlaW5nZWJlbiEgRGllc2VzIFByb2JsZW0gdHJpdHQgdm9yIGFsbGVtIGRhbm4gYXVmLAorCXdlbm4gbWFuIHp1bSBCZWlzcGllbCBlaW4gOiggZWluZ2lidC4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvbGlzcC5sIGIvb2JqL3Rvb2xzL2xpc3AvbGlzcC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDM4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9saXNwLmwKQEAgLTAsMCArMSw5OSBAQAorKHdyaXRlICJMUEMgY2xvc3VyZSBwYXJzZXIgcmVhZHkuLi5cbiIpCisod3JpdGUgIkxMaXNwIFZlcnNpb24gMC42IFsiKQorOzs7Cis7OzsgYXV0b21hZ2ljIHF1b3Rpbmcgb2YgaGFyZGNvZGVkIGZ1bmN0aW9uczoKKzs7OyBlYWNoIGZ1bmN0aW9uIGhhcyAyIGVudHJpZXMgaW4gJ21lbW9yeScKKzs7OyAwIC0tIHRoZSBmdW5jdGlvbiBuYW1lIG9yIGVxdWl2YWxlbnQKKzs7OyAxIC0tIGJpdHMgcmVnYXJkaW5nIGF1dG9xdW90aW5nCis7OzsgICAgICBlYWNoIGFyZ3VtZW50IGZvciB0aGUgZnVuY3Rpb24gaGFzIHR3byBiaXRzIAorOzs7ICAgICAgMCAtLSBub3JtYWwgcXVvdGluZworOzs7ICAgICAgMSAtLSBwcm9ncmFtIGNvZGUgcXVvdGluZyAobGFtZGEgcmVxdWlyZXMgaXQpCis7OzsgICAgICBvbmx5IGJpdCAwIG9yIGJpdCAxIG11c3QgYmUgc2V0LCBuZXZlciBib3RoIChubyBxdW90aW5nIGF0IGFsbCkKKzs7OyBsYW1iZGEgbmVlZHMgbm9ybWFsIHF1b3RlIGZvciB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIHNwZWNpYWwgcXVvdGUgZm9yIDJuZAorOzs7IDEgMCAwIDEKKzs7OyB8MXwgfDJ8IC0+IDkgKGlmIGkgaGF2ZSBjYWxjdWxhdGVkIGl0IHJpZ2h0KQorOzs7Cis7OzsgdGhlIGZ1bmN0aW9uIGxhbWJkYSBoYXMgYXV0b3F1b3RlLCBAIGlzIGEgbm9uLWF1dG9xdW90ZSB2ZXJzaW9uCisoPSAoWyAobWVtb3J5KSAnQCkgbGFtYmRhKQorKD0gKFsgKG1lbW9yeSkgbGFtYmRhIDEpIDkpIAorOzs7Cis7OzsgZXhwbGljaXQgcXVvdGUgb2YgYSBzeW1ib2wgd2l0aCBxdW90ZQorKD0gKFsgKG1lbW9yeSkgcXVvdGUgMSkgMSkgCis7OzsKKzs7OyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyBuZWVkZWQgKG1pY3JvY29kZWQpOgorOzs7IG5vdyB3ZSBkZWZpbmUgYSBzZXQKKyg9IChbIChtZW1vcnkpICdzZXQpIChsYW1iZGEgKG4gdikgKCwgKD0gKFsgKG1lbW9yeSkgbikgdikgbikpKSAKKzs7OyBhbmQgYSBhdXRvcXVvdGUgdmVyc2lvbiBvZiBzZXQgKHNldHEpCisoc2V0ICdzZXRxIHNldCkgKD0gKFsgKG1lbW9yeSkgJ3NldHEgMSkgMSkKKzs7OworOzs7IHNvbWUgcGVvcGxlIHByZWZlciBkZWZpbmUsIGl0IHF1b3RvbWF0aWNhbGx5IHF1b3RlcyBpdHMgZmlyc3QgYXJndW1lbnQKKyhzZXRxIGRlZmluZSAobGFtYmRhIChuIHYgZikgKCwgKD0gKFsgKG1lbW9yeSkgbiAxKSBmKSAoc2V0IG4gdikgbikpKQorKD0gKFsgKG1lbW9yeSkgJ2RlZmluZSAxKSAxKQorOzs7Cis7OzsgZGVmdW4gZm9yIGVhc2llciBkZWZpbml0aW9uIG9mIGZ1bmN0aW9ucworKGRlZmluZSBkZWZ1biAobGFtYmRhIChuIGEgYiBmKSAoLCAoPSAoWyAobWVtb3J5KSBuIDEpIGYpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0IG4gKEAgYSBiKSkgbikpIDM3KQorOzs7Cis7OzsgaWYgd2UgbGlrZSB0byBkZXN0cm95IGEgdmFsdWUgdXNlIHVuZGVmCisoZGVmdW4gdW5kZWYgKGZ1bikgKCwgKD0gbWVtb3J5IChtX2RlbGV0ZSAobWVtb3J5KSBmdW4pKSBmdW4pIDEpCis7OzsKKzs7OyBhbiBlcnJvciBmdW5jdGlvbiAoaW50ZXJuYWwgdXNlKSwgbm90aWZ5IGRlY2xhcmVzIHRoZSBmdW5jdGlvbiB0byB1c2UKKzs7OyB3aGVuIGFuIGVycm9yIG1lc3NhZ2UgaGFzIHRvIGJlIHByaW50ZWQKKyhzZXRxIGVycm9yIHJhaXNlX2Vycm9yKQorOzs7Cis7Ozsgb3RoZXIgaW1wb3J0YW50IGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gYWxpYXNlcworOzs7IHN0YW5kYXJkIGxpc3AgZnVuY3Rpb25hbGl0eSAoY2FyLCBjZHIsIGNvbnMpCisoZGVmdW4gY2FyIChsKSAoPyAocG9pbnRlcnAgbCkgCisJCSAgKD8gKHNpemVvZiBsKSAoWyBsIDApIAorCQkgICAgIChlcnJvciAiY2FyOiBlbXB0eSBsaXN0XG4iKSkgCisJCSAgKGVycm9yICJjYXI6IG5vdCBhIGxpc3RcbiIpKSkKKyhkZWZ1biBjZHIgKGwpICg/IChwb2ludGVycCBsKSAoWy4uIGwgMSkgCisJCSAgKGVycm9yICJjZHI6IG5vdCBhIGxpc3RcbiIpKSkKKyhkZWZ1biBjb25zIChfY2FyIF9jZHIpICgrIChsaXN0IF9jYXIpIF9jZHIpKQorOzs7Cis7Ozsgc29tZSBzcGVjaWFsIGZ1bmN0aW9uYWxpdHkKKyhkZWZ1biBhZGRoaXN0b3J5IChmaWxlKSAod3JpdGVfZmlsZSBmaWxlIChpbXBsb2RlIChoaXN0b3J5KSAiXG4iKSkpCisoZGVmdW4gc2F2ZWhpc3RvcnkgKGZpbGUpICgsIChybSBmaWxlKSAoYWRkaGlzdG9yeSBmaWxlKSkpCisoZGVmdW4gc2hvd2hpc3RvcnkgKCkgKCwgKHByaW50ZiAiJXNcbiIgKGltcGxvZGUgKGhpc3RvcnkpICJcbiIpKQorCQkJICItLSBFTkQgT0YgSElTVE9SWSAtLSIpKQorOzs7CisoZGVmdW4gc2hvd2Z1bmMgKCkgKG1faW5kaWNlcyAobWVtb3J5KSkpCis7OzsKKzs7OyBUcnkgdG8gYXV0b2RldGVjdCBtdWR0eXBlCis7OzsKKyhzZXQgJ211ZHR5cGUgIiIpCisoZGVmdW4gYWRkICh2YXIgdmFsKSAoKz0gKFsgKG1lbW9yeSkgdmFyKSB2YWwpKQorKGFkZCAnbXVkdHlwZSAoPyAoc3ltYm9sX2Z1bmN0aW9uICJnZXR1aWQiKSAiTkFUSVZFIiAiQ09NUEFUIikpCisoYWRkICdtdWR0eXBlICg/IChmdW5jdGlvbl9leGlzdHMgIlNldFByb3AiKQorICAgICAgICAgICAgICAgICAgICg/ICg9PSAoZnVuY3Rpb25fZXhpc3RzICJTZXQiKSAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIikgInxNRyIKKyAgICAgICAgICAgICAgICAgICAgInxORiIpCisgICAgICAgICAgICAgICAgICgmJiAoPT0gKGZpbGVfc2l6ZSAiL2Jhc2ljIikgLTIpIAorCQkgICAgICg9PSAoZmlsZV9zaXplICIvY29tcGxleCIpIC0yKSkKKyAgICAgICAgICAgICAgICAgICAoPyAoPT0gKGZpbGVfc2l6ZSAiL2tlcm5lbCIpIC0yKSAifFRVQk5FVyIgInxUVUIiKQorICAgICAgICAgICAgICAgICAoPT0gKGZ1bmN0aW9uX2V4aXN0cyAicXVlcnlfYWxsX3ZfaXRlbXMiKSAiL2kvaXRlbS92aXJ0dWFsIikKKyAgICAgICAgICAgICAgICAgICAoPyAoZnVuY3Rpb25fZXhpc3RzICJxdWVyeV9ib2R5bG9jYXRpb25fcGljIgorCQkgICAgICAgICAgICAgICAgICAgICAgICgsIChjYWxsX290aGVyICIvb2JqL3BsYXllciIgIj8iKQorCQkJCSAgICAgICAgICAoZmluZF9vYmplY3QgIi9vYmovcGxheWVyIikpKQorCQkJCSAgICAgICAifFVOSS9BVkFMT04iICJ8VU5JIikKKwkgICAgICAgICg/IChmdW5jdGlvbl9leGlzdHMgIlJDU0lkIiAoZmluZF9vYmplY3QgIi9vYmovc2ltdWxfZWZ1biIpKSkKKwkJICJ8VEFQUCIKKyAgICAgICAgICAgICAgICAgInxVTktOT1dOLzIuNC41IgorICAgICAgICAgICAgICAgKSkKKyhzZXRxIG11ZHR5cGUgKGV4cGxvZGUgbXVkdHlwZSAifCIpKQorKGRlZnVuIG11ZD8gKHN0cikgKHNpemVvZiAocmVnZXhwIChbIChtZW1vcnkpICdtdWR0eXBlKSBzdHIpKSkKKyhwcmludGYgIiVzLCVzIiAoWyAoWyAobWVtb3J5KSAnbXVkdHlwZSkgMCkgKFsgKFsgKG1lbW9yeSkgJ211ZHR5cGUpIDEpKQorKHdyaXRlICJdXG4iKQorOzs7IAorOzs7IGxvYWQgbG9jYWwgdXNlciBpbml0Cis7OzsKKyg/IChtdWQ/ICJORnxNRyIpCisgICAoc2V0cSBvd25lciAoZ2V0dWlkICh0aGlzX3BsYXllcikpKQorICAgKHNldHEgb3duZXIgKGNhbGxfb3RoZXIgKHRoaXNfcGxheWVyKSAicXVlcnlfcmVhbF9uYW1lIikpKQorKD8gKG11ZD8gIk1HfE5GfFRVQiIpCisgICAoZGVmaW5lIGxvY2FsaW5pdCAoKyAoKyAiL3BsYXllcnMvIiBvd25lcikgIi9saXNwLmwiKSkKKyAgIChkZWZpbmUgbG9jYWxpbml0ICgrICgrICIvdy8iIG93bmVyKSAiL2xpc3AubCIpKSkKKyg/ICg+IChmaWxlX3NpemUgbG9jYWxpbml0KSAwKQorICAgKD8gKG11ZD8gIlRVQnxVTkl8VU5LTk9XTiIpIAorICAgICAgKGNhbGxfb3V0IGxvYWQgMCBsb2NhbGluaXQpCisgICAgICAobG9hZCBsb2NhbGluaXQpKSkKKyhwcmludGYgIldlbGNvbWUgJXMsIHRvZGF5IGlzICVzIVxuIiAoY2FwaXRhbGl6ZSBvd25lcikgKGN0aW1lICh0aW1lKSkpCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9taWNyb2NvZGUuYyBiL29iai90b29scy9saXNwL21pY3JvY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWRkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9taWNyb2NvZGUuYwpAQCAtMCwwICsxLDEyOSBAQAorLy8gTUlDUk9DT0RFLkMgLS0gbGlzcCBtaWNyb2NvZGUKKy8vIChjKSAxOTk0IGJ5IEhhdGVATW9yZ2VuR3JhdWVuLCBUVUJtdWQsIE5pZ2h0RmFsbAorLy8gLS0KKy8vIENvcHksIGNoYW5nZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGJpdCBvZiBzb2Z0d2FyZSBhcyBtdWNoIGFzIHlvdSBsaWtlLAorLy8gYnV0IGtlZXAgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGF1dGhvciBpbiB0aGUgaGVhZGVyLgorCisjcHJhZ21hIHN0cm9uZ190eXBlcworIAorI2luY2x1ZGUgInR3ZWFrLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBtZW1vcnk7CS8vIGNvbnRhaW5zIGZ1bmN0aW9uIGluZm9ybWF0aW9uCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKkdfaW5wdXQ7CS8vIGdsb2JhbCBpbnB1dCBzdGFjaworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICpoaXN0b3J5OwkvLyBpbnB1dCBoaXN0b3J5CisKK25vbWFzayBzdGF0aWMgcHVibGljIHN0cmluZyBvdXRwdXQobWl4ZWQgcmVzKTsKKworI2RlZmluZSBDT0RFCTAKKyNkZWZpbmUgUVVPVEUJMQorCitzdGF0aWMgdm9pZCBjcmVhdGUoKQoreworICBtZW1vcnkgPSBtX2FsbG9jYXRlKDAsIDIpOworICBHX2lucHV0ID0gKHt9KTsKK30KKworbm9tYXNrIHN0YXRpYyBjbG9zdXJlIGdldF9mdW5jdGlvbihzdHJpbmcgc3RyKQoreworICBjbG9zdXJlIHN5bTsKKyAgaWYoKHN5bSA9IHN5bWJvbF9mdW5jdGlvbihzdHIsIHRoaXNfb2JqZWN0KCkpKSB8fCAgICAgLy8gRlVOQ1RJT05TCisgICAgIChzeW0gPSBzeW1ib2xfZnVuY3Rpb24oc3RyKSkgfHwKKyAgICAgKHN5bSA9IHN5bWJvbF92YXJpYWJsZShzdHIpKSkKKyAgICByZXR1cm4gc3ltOworI2lmIGRlZmluZWQoc3ltYm9sX3ZhcmlhYmxlKQorICBpZihzdHIgPT0gIm1lbW9yeSIpIHJldHVybiAjJ21lbW9yeTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworLy8gcHJlX3BhcnNlKCkgLS0gcGFyc2UgY29kZSBiZWZvcmUgZXhhbWluYXRpb24gYnkgYSBjb2RlIGdlbmVyYXRvcgorbm9tYXNrIHN0YXRpYyBwdWJsaWMgaW50IHByZV9wYXJzZShtaXhlZCBjb2RlKQoreworICBpZihwb2ludGVycChjb2RlKSAmJiBzaXplb2YoY29kZSkgJiYKKyAgICAgKGNsb3N1cmVwKGNvZGVbMF0pIHx8IHN5bWJvbHAoY29kZVswXSkpKQorICB7CisgICAgbWl4ZWQgaWR4LCB0bXA7CisgICAgaWYoc2l6ZW9mKHRtcCA9IG9sZF9leHBsb2RlKHNwcmludGYoIiVPIiwgY29kZVswXSksICItPiIpKSA+IDEpCisgICAgICBpZHggPSB0bXBbMV07CisgICAgZWxzZSBpZHggPSBjb2RlWzBdOworICAgIC8vIHdhcm5pbmcgb25seSB0aGUgc2V0dGluZyBvZiBiaXQgMCBvciAxIGlzIGFsbG93ZWQsIG5vdCAwIGFuZCAxCisgICAgLy8gdGh1cyAwMSBsZWFkcyB0byBub3JtYWwgcXVvdGUsIDEwIGZvciBzcGVjaWFsLCAxMSBub3QgcXVvdGUgYXQgYWxsCisgICAgcmV0dXJuIChtZW1vcnlbaWR4LCBRVU9URV0gJiAoMzw8Miooc2l6ZW9mKGNvZGUpLTEpKSk+PjIqKHNpemVvZihjb2RlKS0xKTsKKyAgfQorfQorCisvLyBwcm9nX3BhcnNlKCkgLS0gZXhhbWluZSBhIHRva2VuIGFuZCB0YWtlIGFjdGlvbnMKKy8vCitub21hc2sgdmFyYXJncyBzdGF0aWMgcHVibGljIG1peGVkIHByb2dfcGFyc2UobWl4ZWQgdG9rZW4sIGludCBmdW5jKQoreworICBpZihzeW1ib2xwKHRva2VuKSkKKyAgICAgIGlmKCFtZW1iZXIobWVtb3J5LCB0b2tlbikpCisgICAgICAgIHRva2VuID0gKHsjJz8sICh7IydtZW1iZXIsICh7IydtZW1vcnl9KSwgcXVvdGUodG9rZW4pfSksCisgICAgICAgICAgICAgICAgICAgICAoeyMnWywgKHsjJ21lbW9yeX0pLCBxdW90ZSh0b2tlbil9KSwKKyAgICAgICAgICAgICAgICAgICAgICh7IydyYWlzZV9lcnJvciwKKwkJICAgICAgIHNwcmludGYoIlN5bWJvbCAlTycgbm90IGJvdW5kXG4iLCB0b2tlbikgfSkgfSk7CisgICAgICBlbHNlIHRva2VuID0gZnVuYyA/IHRva2VuIDogbWVtb3J5W3Rva2VuXTsKKyAgcmV0dXJuIHRva2VuOworfQorCisvLyBldmFsdWF0ZSBjb21waWxlZCBjb2RlCitub21hc2sgc3RhdGljIHB1YmxpYyBtaXhlZCBldmFsKG1peGVkIGNvZGUpCit7CisgIG1hcHBpbmcgc3ltOworICBzeW0gPSBmaWx0ZXJfaW5kaWNlcyhtZW1vcnksICMnc3ltYm9scCk7CisgIHJldHVybiBhcHBseShsYW1iZGEobV9pbmRpY2VzKHN5bSksIGNvZGUpLCBtX3ZhbHVlcyhzeW0pKTsKK30KKworLy8gYWRkIG5ldyBsaW5lcyB0byBpbnB1dCBzdGFjaworbm9tYXNrIHN0YXRpYyBwdWJsaWMgdm9pZCBhZGRfaW5wdXQoc3RyaW5nIGlucHV0KSAKK3sgCisgIGlmKCFzdHJpbmdwKGlucHV0KSkgcmV0dXJuOworICBHX2lucHV0ICs9IG9sZF9leHBsb2RlKGlucHV0LCAiXG4iKTsgCit9CisKKy8vIGNsZWFyIHRoZSBpbnB1dCBzdGFjaworbm9tYXNrIHN0YXRpYyBwdWJsaWMgdm9pZCBjbGVhcl9pbnB1dCgpCit7CisgIEdfaW5wdXQgPSAoe30pOworfQorCisvLyBnZXQgYSBsaW5lIGZyb20gaW5wdXQgc3RhY2sKKy8vIGFuZCBzYXZlIGl0IGludG8gdGhlIGhpc3RvcnkKK25vbWFzayB2YXJhcmdzIHN0cmluZyBnZXRfbGluZSgpCit7CisgIGlmKHNpemVvZihHX2lucHV0KSkKKyAgeworICAgIGlmKCFwb2ludGVycChoaXN0b3J5KSkgaGlzdG9yeSA9ICh7fSk7CisgICAgaGlzdG9yeSArPSAoeyBHX2lucHV0WzBdIH0pOworICAgIEdfaW5wdXRbMC4uMF0gPSAoe30pOworICAgIHJldHVybiBoaXN0b3J5WzwxXTsKKyAgfQorICByZXR1cm4gMDsgIAorfQorCisvLyB0cmFuc2Zvcm0oKSAtLSB0cmFuc2Zvcm1zIHNvbWUgb2YgdGhlIG91dHB1dCBzdHJpbmdzCitub21hc2sgcHJpdmF0ZSBzdHJpbmcgdHJhbnNmb3JtKHN0cmluZyBlKQoreworICBzd2l0Y2goZSkKKyAgeworICBjYXNlICIoeyI6IHJldHVybiAiKCI7CisgIGNhc2UgIn0pIjogcmV0dXJuICIpIjsKKyAgY2FzZSAiKFsiOiByZXR1cm4gIlsiOworICBjYXNlICJdKSI6IHJldHVybiAiXSI7CisgIH0KKyAgaWYoc3Ryc3RyKGUsICIgLyogc2l6ZW9mKCkgPT0gIikgIT0gLTEpIHJldHVybiAiIjsKKyAgaWYoc3Ryc3RyKGUsICJcbiIpICE9IC0xKSBpZihlWzBdID09ICcsJykgcmV0dXJuICIgIjsgZWxzZSByZXR1cm4gIiI7CisgIHJldHVybiBlOworfQorCisvLyBvdXRwdXQoKSAtLSBwcmludHMgZ2l2ZW4gZGF0YSBpbiBhIGNsZWFuIHdheQorbm9tYXNrIHN0YXRpYyBwdWJsaWMgc3RyaW5nIG91dHB1dChtaXhlZCByZXMpCit7CisgIHJlcyA9IHJlZ2V4cGxvZGUoc3ByaW50ZigiJU8iLCByZXMpLAorICAgICAgICAgICAgICAgICAgICJcblsgXSp8WyxdXG5bIF0qfFsoXVt7XFtdfFtcXX1dWyldfFsjXVsnXXwiCisgICAgICAgICAgICAgICAgICArIiBbL11bKl0gc2l6ZW9mWyhdWyldID09IFswLTldWzAtOV0qIFsqXVsvXSIpCisgICAgICAtICh7IlxuIiwgIixcbiIsICIjJyJ9KTsKKyAgcmVzID0gbWFwKHJlcywgIyd0cmFuc2Zvcm0pOworICByZXR1cm4gc3ByaW50ZigiJXNcbiIsIGltcGxvZGUocmVzLCAiIikpOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvcGFyc2VyLmMgYi9vYmovdG9vbHMvbGlzcC9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ3ZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvcGFyc2VyLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8vIFBBUlNFUi5DIC0tIHBhcnNlciBmb3IgcGFyZW50aGVzaXMgZXhwcmVzc2lvbnMKKy8vIChjKSAxOTk0IGJ5IEhhdGVATW9yZ2VuR3JhdWVuLCBUVUJtdWQsIE5pZ2h0RmFsbAorLy8gLS0KKy8vIENvcHksIGNoYW5nZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGJpdCBvZiBzb2Z0d2FyZSBhcyBtdWNoIGFzIHlvdSBsaWtlLAorLy8gYnV0IGtlZXAgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGF1dGhvciBpbiB0aGUgaGVhZGVyLgorCisjcHJhZ21hIHN0cm9uZ190eXBlcworCisjaW5jbHVkZSAidHdlYWsuaCIgCisKK3ByaXZhdGUgaW5oZXJpdCBIT01FKCJsZXgiKTsKKworI2luY2x1ZGUgInN0YWNrLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKworcHJpdmF0ZSBub3NhdmUgbWl4ZWQgY29kZTsKK3ByaXZhdGUgbm9zYXZlIG1peGVkIHN0YWNrOworcHJpdmF0ZSBub3NhdmUgaW50IHF1b3QsIGFzc3VtZTsKKworbm9tYXNrIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKQoreworICBJTklUU1RBQ0soc3RhY2spOworICBjb2RlID0gKHt9KTsKKyAgcXVvdCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZSgpCit7CisgIGxleDo6Y3JlYXRlKCk7CisgIGluaXRpYWxpemUoKTsKK30KKworbm9tYXNrIHByaXZhdGUgbWl4ZWQgQ29kZUdlbihtaXhlZCB0b2tlbikKK3sKKyAgc3dpdGNoKHByZV9wYXJzZSgmY29kZSkpIAorICB7CisgIGNhc2UgMTogUFVTSChzdGFjaywgIiciKTsgICAgICAgICAgLy8gc3RhbmRhcmQgYXV0b3F1b3RlCisJICBxdW90Kys7CisJICBicmVhazsKKyAgY2FzZSAyOiBQVVNIKHN0YWNrLCAiJ0NPREUiKTsgICAgICAgICAgLy8gc3BlY2lhbCBRVU9URSBmb3IgY29kZSBnZW5lcmF0aW9uCisgICAgICAgICAgYnJlYWs7CQorICB9CisgIGlmKHN0cmluZ3AodG9rZW4pKQorICAgIHN3aXRjaCh0b2tlbikKKyAgICB7CisgICAgICBjYXNlICInIjogUFVTSChzdGFjaywgdG9rZW4pOyBxdW90Kys7IHJldHVybjsKKyAgICAgIGNhc2UgIigiOiBQVVNIKHN0YWNrLCBjb2RlKTsgY29kZSA9ICh7fSk7IGJyZWFrOworICAgICAgY2FzZSAiKSI6CisgICAgICB7CisgICAgICAgIG1peGVkIHRtcDsKKwlpZihTUChzdGFjaykgJiYgcG9pbnRlcnAoVE9QKHN0YWNrKSkpIFBPUChzdGFjaywgdG1wKTsKKyAgICAgICAgZWxzZSB0bXAgPSAoe30pOworICAgICAgICBpZihTUChzdGFjaykgJiYgVE9QKHN0YWNrKSA9PSAiJyIpCisJICAvKiBkbyBub3RoaW5nICovIDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmKHNpemVvZihjb2RlKSkKKwkgIHsKKwkgICAgY29kZVswXSA9IHByb2dfcGFyc2UoY29kZVswXSk7CisJICAgIGlmKENMX0xBTUJEQShjb2RlWzBdKSB8fCBzeW1ib2xwKGNvZGVbMF0pIHx8IHBvaW50ZXJwKGNvZGVbMF0pKQorCSAgICAgIGNvZGUgPSAoeyMnZnVuY2FsbH0pICsgY29kZTsKKwkgIH0KKyAgICAgICAgY29kZSA9IHRtcCArICh7IGNvZGUgfSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdCA6IGNvZGUgKz0gKHsgdG9rZW5bMS4uPDJdIH0pOyBicmVhazsKKyAgICB9CisgIGVsc2UKKyAgICBjb2RlICs9ICh7IHF1b3QgPyB0b2tlbiA6IHByb2dfcGFyc2UodG9rZW4sICFzaXplb2YoY29kZSkpIH0pOworCisgIHdoaWxlKFNQKHN0YWNrKSAmJiAoVE9QKHN0YWNrKSA9PSAiJyIgIHx8IFRPUChzdGFjaykgPT0gIidDT0RFIikgJiYgCisgICAgICAgIHNpemVvZihjb2RlKSkgCisgIHsgCisgICAgaW50IHE7CisgICAgaWYoc3RyaW5ncChjb2RlWzwxXSkgfHwgc3ltYm9scChjb2RlWzwxXSkgfHwgcG9pbnRlcnAoY29kZVs8MV0pIHx8IAorICAgICAgIGdldF90eXBlX2luZm8oY29kZVs8MV0pWzBdID09IDEwKSAvLyBxdW90ZWQgYXJyYXkKKyAgICAgICAgY29kZVs8MV0gPSBxdW90ZShjb2RlWzwxXSk7IAorICAgIFBPUFgoc3RhY2spOyAKKyAgfQorfQorCisvLyBwYXJzZSgpIC0tIG5vbi10aHJlYWRlZCBwYXJzaW5nIChjb250aW51ZSBvbiBpbnB1dCkKK25vbWFzayBzdGF0aWMgaW50IHBhcnNlKG1peGVkIG1zZywgaW50IGludGVyYWN0aXZlKQoreworICBtaXhlZCB0b2tlbiwgcmVzOworICBpbnQgbGV4aW5nLCBtaXNzaW5nX3BhcjsKKyAgZG8geworICAgIGlmKGxleGluZyA9IGxleCgmdG9rZW4pKQkKKyAgICB7CQkJCQkvLyB0cnkgdG8gYXNzdW1lIG91dGVyICIoIgorICAgICAgaWYoIVNQKHN0YWNrKSAmJiB0b2tlbiAhPSAiKCIpIHsgQ29kZUdlbigiKCIpOyBhc3N1bWUgPSAxOyB9CisgICAgICBDb2RlR2VuKHRva2VuKTsKKyAgICB9CisgICAgZWxzZSAJCQkJLy8gYWRkICIpIiBpZiAiKCIgaXMgYXNzdW1lZAorICAgICAgaWYoc2l6ZW9mKHN0YWNrKSA9PSAxICYmIGFzc3VtZSkgeyBDb2RlR2VuKCIpIik7IGFzc3VtZSA9IDA7IGxleGluZyA9IDE7IH0KKyAgICBpZihsZXhpbmcgJiYgIVNQKHN0YWNrKSkJCS8vIGNvbXBsZXRlIGV4cHJlc3Npb24gZm91bmQKKyAgICB7CisgICAgICBtaXhlZCBleGVjX2NvZGU7IGV4ZWNfY29kZSA9IGNvZGU7IGluaXRpYWxpemUoKTsKKyAgICAgIGlmKHNpemVvZihleGVjX2NvZGUpICYmIHBvaW50ZXJwKGV4ZWNfY29kZVswXSkpIAorICAgICAgICBleGVjX2NvZGUgPSAoeyMnLH0pICsgZXhlY19jb2RlOy8vIG1vcmUgdGhhbiBvbmUgZXhwciBvbiBvbmUgbGluZQorICAgICAgaWYobXNnID0gY2F0Y2gocmVzID0gZXZhbChleGVjX2NvZGUpKSkgCisgICAgICAgIHJldHVybiAtMjsJCQkvLyBleGVjdXRpb24gZXJyb3IKKyAgICAgIGlmKGludGVyYWN0aXZlKSBwcmludGYob3V0cHV0KHJlcykpOworICAgICAgZWxzZSBtc2cgPSByZXM7CisgICAgfQorICB9CisgIHdoaWxlKGxleGluZyk7CisgIGlmKG1pc3NpbmdfcGFyID0gU1Aoc3RhY2spKSAKKyAgICByZXR1cm4gKG1zZyA9IHNwcmludGYoIipNaXNzaW5nICVkIClcbiIsIG1pc3NpbmdfcGFyKSwgLTMpOyAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9zdGFjay5oIGIvb2JqL3Rvb2xzL2xpc3Avc3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU3OGY0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3Avc3RhY2suaApAQCAtMCwwICsxLDggQEAKKy8vIFNUQUNLLkggLS0gc3RhY2sgbWFjcm9zCisKKyNkZWZpbmUgSU5JVFNUQUNLKHMpCShzID0gKHt9KSkKKyNkZWZpbmUgUFVTSChzLHgpCShzICs9ICh7ICh4KSB9KSkKKyNkZWZpbmUgUE9QKHMseCkJKHggPSBzWzwxXSwgcyA9IHNbMC4uPDJdKQorI2RlZmluZSBQT1BYKHMpCQkocyA9IHNbMC4uPDJdKQorI2RlZmluZSBUT1AocykJCSgocylbPDFdKQorI2RlZmluZSBTUChzKQkJKHNpemVvZihzKSkKZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL3R3ZWFrLmggYi9vYmovdG9vbHMvbGlzcC90d2Vhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MThiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC90d2Vhay5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRXRUFLLkggLS0gc3lzdGVtIGRlcGVuZGVuZCBtYWNyb3MKKworI2RlZmluZSBNT1JHRU5HUkFVRU4KKworI2lmIChkZWZpbmVkKEFWQUxPTikgfHwgZGVmaW5lZChGaW5hbEZyb250aWVyKSkKKyMgIGRlZmluZSBVTkl0b3BpYQorI2VuZGlmCisKKy8vIFRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgbGlzcCBjb21waWxlcnMgZmlsZXMKKyNpZiAoZGVmaW5lZChUQVBQTVVEKSB8fCBkZWZpbmVkKFVOSXRvcGlhKSkKKyMgIGRlZmluZSBIT01FKGZpbGUpCSIvdy9oYXRlL2xpc3AvIitmaWxlCisjZWxpZiAoZGVmaW5lZChBREFNQU5UKSkKKyMgIGRlZmluZSBIT01FKGZpbGUpCSIvd2l6L2hhdGUvbGlzcC8iK2ZpbGUKKyNlbHNlCisjIGlmZGVmIE1PUkdFTkdSQVVFTgorIyAgIGRlZmluZSBIT01FKGZpbGUpCSIvb2JqL3Rvb2xzL2xpc3AvIitmaWxlCisjIGVsc2UKKyMgICBkZWZpbmUgSE9NRShmaWxlKQkiL3BsYXllcnMvaGF0ZS9saXNwLyIrZmlsZQorIyBlbmRpZgorI2VuZGlmCisKKy8vIHN5bWJvbF92YXJpYWJsZSgpIGlzIG5vdCBhdmFpbGFibGUgb24gZHJpdmVycyBiZWxvdyAzLjIuMUAxCisvLyNkZWZpbmUgc3ltYm9sX3ZhcmlhYmxlKHN0cikJMAorCisvLyBERUJVRyBtb2RlCisjaWZkZWYgTU9SR0VOR1JBVUVOCisjICBkZWZpbmUgVVNFUiAiZXRhaCIKKyNlbHNlCisjICBkZWZpbmUgVVNFUiAiaGF0ZSIKKyNlbmRpZgorI2RlZmluZSBERUJVRyh4KQlpZihmaW5kX3BsYXllcihVU0VSKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcihVU0VSKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJbJU9dICVPXG4iLCB0aGlzX29iamVjdCgpLCAoeCkpKQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC90eXBlcy5oIGIvb2JqL3Rvb2xzL2xpc3AvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWVmNWViCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xpc3AvdHlwZXMuaApAQCAtMCwwICsxLDQgQEAKKyNkZWZpbmUgQ0xfTEFNQkRBKHgpICAoZ2V0X3R5cGVfaW5mbyh4KVswXT09OCAmJiBnZXRfdHlwZV9pbmZvKHgpWzFdPT01KQorI2RlZmluZSBDTF9MRlVOKHgpICAgIChnZXRfdHlwZV9pbmZvKHgpWzBdPT04ICYmIGdldF90eXBlX2luZm8oeClbMV09PTApCisjZGVmaW5lIENMX0VGVU4oeCkgICAgKGdldF90eXBlX2luZm8oeClbMF09PTggJiYgZ2V0X3R5cGVfaW5mbyh4KVsxXTwgMCkKKyNkZWZpbmUgQ0xfVkFSKHgpICAgICAoZ2V0X3R5cGVfaW5mbyh4KVswXT09OCAmJiBnZXRfdHlwZV9pbmZvKHgpWzFdPT0xKQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xvZ3Rvb2wuYyBiL29iai90b29scy9sb2d0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5M2I3NQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9sb2d0b29sLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworaW5oZXJpdCAic3RkL3NlY3VyZV90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCisjZGVmaW5lIFNBVkVGSUxFICAiL3BsYXllcnMvIitnZXRldWlkKCkrIi8ubG9ndG9vbCIKKworLy8gZGVmaW5pZXJlbiB2b24gImlubGluZSIgRnVua3Rpb25lbjoKKyNkZWZpbmUgYWxsb3dlZCgpICAgKCFwcm9jZXNzX2NhbGwoKSAmJiBQTD09UlBMICYmIGdldGV1aWQoKT09Z2V0dWlkKFJQTCkpCisKK21hcHBpbmcgbG9nczsKKworc3RhdGljIHZvaWQgY2hlY2tfbG9ncygpCit7CisgIGZpbHRlcihzb3J0X2FycmF5KG1faW5kaWNlcyhsb2dzKSwgIyc+KSwgbGFtYmRhKCAoeyAneCB9KSwgKHsjJz8sIAorICAgICh7IychPSwgKHsjJ1ssIGxvZ3MsICd4LCAyfSksICh7IydmaWxlX3RpbWUsICh7IydbLCBsb2dzLCAneCwgMH0pIH0pIH0pLAorICAgICAgICh7Iyd0ZWxsX29iamVjdCwgKHsjJ2Vudmlyb25tZW50IH0pLCAoeyMnc3ByaW50ZiwKKyAgICAgICAiTmV1ZSBFaW50cmFlZ2UgaW4gPCVzPi5cbiIsICd4IH0pIH0pLCAwfSkpKTsKK30KKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcChNRSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgaWYgKCFyZXN0b3JlX29iamVjdChTQVZFRklMRSkpIHsKKyAgICBsb2dzPShbICJyZXBmaWxlIjogc3ByaW50ZigiL2xvZy9yZXBvcnQvJXMucmVwIiwgZ2V0ZXVpZCgpKTsgMDsgMCBdKTsKKyAgICBpZiAoSVNfQVJDSChnZXRldWlkKCkpKQorICAgICAgbG9ncys9KFsic25vb3Bsb2ciOiAiL2xvZy9TTk9PUCI7IDA7IDAsICJraWxsZXIiOiAiL2xvZy9LSUxMRVIiOyAwOyAwXSk7CisgIH0KKyAgU2V0UHJvcChQX1NIT1JULCB0aGlzX3BsYXllcigpLT5OYW1lKFdFU1NFTikrIiBMb2d0b29sIik7CisgIFNldFByb3AoUF9OQU1FLCBRdWVyeVByb3AoUF9TSE9SVCkpOworICBTZXRQcm9wKFBfTk9EUk9QLCAwKTsKKyAgU2V0UHJvcChQX05FVkVSRFJPUCwgMCk7CisgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwgMSk7CisgIEFkZElkKCJsb2d0b29sIik7CisgIEFkZENtZCgibWFyayIsICJha3R1YWxpc2llcmVuIik7CisgIEFkZENtZChtX2luZGljZXMobG9ncyksICJyZWFkX2xvZyIpOworICBBZGRDbWQoIkFkZExvZyIsICJhZGRfbG9nIik7CisgIEFkZENtZCgiRGVsTG9nIiwgImRlbF9sb2ciKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIDo6cmVzZXQoKTsKKyAgaWYgKCFjbG9uZXAoTUUpIHx8ICFlbnZpcm9ubWVudCgpKSByZXR1cm47CisgIGNhbGxfb3V0KCJjaGVja19sb2dzIiwgMCk7CisgIHNldF9uZXh0X3Jlc2V0KDIqX19SRVNFVF9USU1FX18pOyAvLyBrZWluIFp1ZmFsbCwgbWF4LiBMYWVuZ2UKK30KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aG9kKQoreworICBpbnQgaTsKKyAgaWYgKCFvYmplY3RwKGRlc3QpKSBkZXN0PWZpbmRfb2JqZWN0KGRlc3QpOworICBpZiAoIWRlc3QgfHwgIWludGVyYWN0aXZlKGRlc3QpIHx8IGdldHVpZChkZXN0KSE9Z2V0ZXVpZCgpKSAKKyAgICByZXR1cm4gTUVfQ0FOVF9CRV9UQUtFTjsKKyAgaT06Om1vdmUoZGVzdCwgbWV0aG9kKTsKKyAgaWYgKGkhPTEpIHJldHVybiBpOworICBpZiAoZW52aXJvbm1lbnQoKSkgY2FsbF9vdXQoImNoZWNrX2xvZ3MiLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoKSAKK3sKKyAgIHJldHVybiAiRm9sZ2VuZGUgTG9nZmlsZXMgd2VyZGVuIGRlcnplaXQgdm9uIERlaW5lbSBMb2d0b29sIHZlcndhbHRldDpcblxuIgorICAgICAgICAgK2ltcGxvZGUobWFwKHNvcnRfYXJyYXkobV9pbmRpY2VzKGxvZ3MpLCAjJz4pLAorICAgICAgICAgIGxhbWJkYSggKHsgJ3ggfSksICh7IydzcHJpbnRmLCAiICUxcyAlLTE0cyAtICVzIiwgKHsjJz8sICh7IychPSwKKyAgICAgICAgICAoeyMnWyxsb2dzLCd4LCAyfSksICh7IydmaWxlX3RpbWUsKHsjJ1ssbG9ncywneCwgMH0pfSl9KSwiKiIsIiJ9KSwKKyAgICAgICAgICAoeyMnc3ByaW50ZiwgIjwlcz4iLCAneH0pLCAoeyMnWywgbG9ncywgJ3gsIDB9KX0pICkgKSwgIlxuIikKKyAgICAgICAgICsiXG5cbk1pdCA8bWFyaz4ga29lbm5lbiBhbGxlIEVpbnRyYWVnZSBhbHMgZ2VsZXNlbiBtYXJraWVydCB1bmQgIgorICAgICAgICAgKyJtaXQgQWRkLSB1bmRcbkRlbExvZyBMb2dmaWxlcyBpbiBkaWUgTGlzdGUgYXVmZ2Vub21tZW4gYnp3LiBhdXMgIgorICAgICAgICAgKyJkZXIgTGlzdGUgZW50ZmVybnQgd2VyZGVuLlxuIjsKK30KKworc3RhdGljIGludCBha3R1YWxpc2llcmVuKHN0cmluZyBzdHIpCit7CisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gMDsKKyAgaWYgKHN0ciAmJiBzdHIhPSIiKSB7CisgICAgaWYgKCFsb2dzW3N0cl0pIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJFaW4gc29sY2hlcyBMb2dmaWxlIGlzdCBuaWNodCBpbiBkZXIgTGlzdGUgZW50aGFsdGVuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbG9nc1tzdHIsIDFdPWZpbGVfc2l6ZShsb2dzW3N0ciwgMF0pOworICAgIGxvZ3Nbc3RyLCAyXT1maWxlX3RpbWUobG9nc1tzdHIsIDBdKTsKKyAgfQorICBlbHNlIGZpbHRlcihtX2luZGljZXMobG9ncyksIGxhbWJkYSggKHsgJ3ggfSksKHsjJywgLAorICAgKHsjJz0sICh7IydbLCBsb2dzLCAneCwgMX0pLCAoeyMnZmlsZV9zaXplLCAoeyMnWywgbG9ncywgJ3gsIDB9KSB9KSB9KSwKKyAgICh7Iyc9LCAoeyMnWywgbG9ncywgJ3gsIDJ9KSwgKHsjJ2ZpbGVfdGltZSwgKHsjJ1ssIGxvZ3MsICd4LCAwfSkgfSl9KX0pKSk7CisgIHdyaXRlKCJEb25lIVxuIik7CisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9sb2coc3RyaW5nIHN0cikKK3sKKyAgaW50IHNpOworICBpZiAoIWFsbG93ZWQoKSkgcmV0dXJuIDA7CisgIHNpPWZpbGVfc2l6ZShsb2dzW3F1ZXJ5X3ZlcmIoKSwwXSk7CisgIGlmIChzdHIpCisgICAgUEwtPm1vcmUobG9nc1txdWVyeV92ZXJiKCksMF0pOworICBlbHNlIHsKKyAgICBpZiAoc2k8MCB8fCBmaWxlX3RpbWUobG9nc1txdWVyeV92ZXJiKCksIDBdKT09bG9nc1txdWVyeV92ZXJiKCksIDJdKQorICAgICAgd3JpdGUoIktlaW5lIG5ldWVuIEVpbnRyYWVnZSBpbiA8IitxdWVyeV92ZXJiKCkrIj4uXG4iKTsKKyAgICBlbHNlIHsKKyAgICAgIHdyaXRlKCJGb2xnZW5kZXMgaXN0IG5ldSBpbiA8IitxdWVyeV92ZXJiKCkrIj4uXG4iKTsKKyAgICAgIGlmIChzaTxsb2dzW3F1ZXJ5X3ZlcmIoKSwxXSkKKyAgICAgICAgUEwtPm1vcmUobG9nc1txdWVyeV92ZXJiKCksMF0pOworICAgICAgZWxzZSBQTC0+TW9yZShyZWFkX2J5dGVzKGxvZ3NbcXVlcnlfdmVyYigpLDBdLAorCSAgICBsb2dzW3F1ZXJ5X3ZlcmIoKSwxXSxzaS1sb2dzW3F1ZXJ5X3ZlcmIoKSwxXSkpOworICAgIH0KKyAgfQorICBsb2dzW3F1ZXJ5X3ZlcmIoKSwgMV09c2k7CisgIGxvZ3NbcXVlcnlfdmVyYigpLCAyXT1maWxlX3RpbWUobG9nc1txdWVyeV92ZXJiKCksIDBdKTsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhZGRfbG9nKCkKK3sKKyAgc3RyaW5nIGtleSwgcGF0aCwgc3RyOworICBzdHI9UEwtPl91bnBhcnNlZF9hcmdzKCk7ICAKKyAgaWYgKCFhbGxvd2VkKCkgfHwgIXN0ciB8fCBzc2NhbmYoc3RyLCAiJXMgJXMiLCBrZXksIHBhdGgpIT0yKSB7CisgICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogQWRkTG9nIDxrZXk+IDxwYXRoPlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAga2V5PWxvd2VyX2Nhc2Uoa2V5KTsKKyAgaWYgKGxvZ3Nba2V5XSkgeworICAgIG5vdGlmeV9mYWlsKCJFcyBnaWJ0IHNjaG9uIGVpbiBMb2dmaWxlIG1pdCBkaWVzZW0gS2V5IGluIGRlciBMaXN0ZS5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGxvZ3MrPShbIGtleTogcGF0aDsgMDsgMCBdKTsKKyAgQWRkQ21kKGtleSwgInJlYWRfbG9nIik7CisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgd3JpdGUoIkxvZ2ZpbGUgPCIra2V5KyI+IGluIGRpZSBMaXN0ZSBhdWZnZW5vbW1lbi5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZWxfbG9nKHN0cmluZyBzdHIpCit7CisgIGlmICghYWxsb3dlZCgpIHx8ICFzdHIpIHsKKyAgICBub3RpZnlfZmFpbCgiV0VMQ0hFUyBMb2dmaWxlIHNvbGwgYXVzIGRlciBMaXN0ZSBlbnRmZXJudCB3ZXJkZW4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWxvZ3Nbc3RyXSkgeworICAgIG5vdGlmeV9mYWlsKCJMb2dmaWxlIG5pY2h0IGluIExpc3RlIGVudGhhbHRlbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGxvZ3M9bV9jb3B5X2RlbGV0ZShsb2dzLHN0cik7CisgIFJlbW92ZUNtZChzdHIpOworICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIHdyaXRlKCJMb2dmaWxlIDwiK3N0cisiPiBhdXMgTGlzdGUgZW50ZmVybnQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbHVwZS5jIGIvb2JqL3Rvb2xzL2x1cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDZmMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2x1cGUuYwpAQCAtMCwwICsxLDE4ODggQEAKKy8vIFRoaXMgdG9vbCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1hY2JldGhAVFVCbXVkCisvLworLy8gU29tZSBjaGFuZ2VzL2V4dGVuc2lvbnMgYnkgSm9mQE1vcmdlbkdyYXVlbgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxxdWVzdG1hc3Rlci5oPgorI2luY2x1ZGUgPHVzZXJpbmZvLmg+CisKKyNkZWZpbmUgYWRkKHMpIGNvbW1hbmRzKz0oe3N9KTtmdW5jdGlvbnMrPSh7c30pO25jbWRzKysKKyNkZWZpbmUgYWRkMihzLGYpIGNvbW1hbmRzKz0oe3N9KTtmdW5jdGlvbnMrPSh7Zn0pO25jbWRzKysKKyNkZWZpbmUgTUFYU1RBQ0sgMTAKKyNkZWZpbmUgTUFYVkFSUyAxMAorI2RlZmluZSBNQVhERVBUSCA1CisjZGVmaW5lIE1BWExJTkVTIDQwCisjZGVmaW5lIE1BWExJTkVMRU4gNzkKKworbWl4ZWQgKnN0YWNrLCAqdmFyYXJlYSwgZXJyOworCitzdHJpbmcgKmNvbW1hbmRzLCAqZnVuY3Rpb25zLCB1c2VyLCAqcXVlcnlfbGlzdCwgKmFyZ3Y7CitpbnQgbWF4dmVyYixuY21kcyxhcmdjLHJlY3Vyc2l2ZSxoaWRlX3Nob3J0LGxpbmVzLGZpcnN0bGluZSxsYXN0bGluZTsKK3N0YXRpYyBpbnQgdGVsbChzdHJpbmcgc3RyKTsKK2ludCBldmFsY21kKHN0cmluZyBzdHIpOworaW50IGV2YWwoc3RyaW5nIHN0cik7CitzdHJpbmcgc3RrKHN0cmluZyBhcmcpOworc3RyaW5nIGRlc2Mob2JqZWN0IG9iKTsKK3ZvaWQgY2xlYW4ob2JqZWN0IG9iKTsKK3ZvaWQgY2xlYW5vZihzdHJpbmcgc3RyLG9iamVjdCBvYik7CisKKwordm9pZCBjcmVhdGUoKQoreworICBvYmplY3Qgb3duZXI7CisgIHN0cmluZyBzdHI7CisgIAorICBpZiAoIWNsb25lcChNRSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgb3duZXI9ZW52aXJvbm1lbnQoKXx8dGhpc19wbGF5ZXIoKTsKKyAgaWYgKG93bmVyKQorICAgIHN0cj1jYXBpdGFsaXplKCgoc3RyPWdldGV1aWQob3duZXIpKVs8MV09PSdzJ3x8c3RyWzwxXT09J3gnfHxzdHJbPDFdID09J3onKT9zdHIrPSInIjpzdHIrPSJzIik7IAorICBlbHNlCisgICAgc3RyPSJFaW5lIjsKKyAgU2V0UHJvcCggUF9TSE9SVCxzdHIrIiBMdXBlIiApOworICBTZXRQcm9wKCBQX05BTUUsIHN0cisiIEx1cGUiICk7CisgIFNldFByb3AoIFBfTE9ORywgIk1pdCBkaWVzZXIgTHVwZSBrYW5uIG1hbiBkaWUgRmVpbmhlaXRlbiBkZXMgTFBDIGJlc3NlciBlcmtlbm5lbi5cbiIgKTsKKyAgU2V0UHJvcCggUF9ORVZFUkRST1AsIDEgKTsKKyAgU2V0UHJvcCggUF9OT0RST1AsICJEdSBrYW5uc3QgRGVpbmUgTHVwZSBuaWNodCB3ZWd3ZXJmZW4uIERhenUgaXN0IHNpZSB6dSB3ZXJ0dm9sbC5cbiIpOworICBTZXRQcm9wKCBQX05PQlVZLCAxICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgU2V0UHJvcCggUF9XRUlHSFQsIDAgKTsKKyAgU2V0UHJvcCggUF9BUlRJQ0xFLDApOworICBTZXRQcm9wKCBQX0dFTkRFUiwwKTsKKyAgQWRkSWQoICJsdXBlIiApOworICB1c2VyPSIqIjsKKyAgc3RhY2s9KHt9KTsKKyAgY29tbWFuZHM9KHt9KTsKKyAgZnVuY3Rpb25zPSh7fSk7CisgIG5jbWRzPTA7CisgIGFkZCgiRGVzdCIpOworICBhZGQoIl9nb3RvIik7CisgIGFkZCgiY2xub2YiKTsKKyAgYWRkKCJjbG4iKTsKKyAgYWRkKCJjbHIiKTsKKyAgYWRkKCJjb3B5X2xkZmllZCIpOworICBhZGQoImNyZWF0Iik7CisgIGFkZCgiZGVzdCIpOworICBhZGQoImRpbmZvIik7CisgIGFkZCgiZGlzY28iKTsKKyAgYWRkKCJkdW1wX2xpc3RzIik7CisgIGFkZCgiZHVwIik7CisgIGFkZCgiZW52Iik7CisgIGFkZCgiaGVyZSIpOworICBhZGQoImluZm8iKTsKKyAgYWRkKCJpbnYiKTsKKyAgYWRkKCJsdiIpOworICBhZGQoIm1ha2UiKTsKKyAgYWRkKCJtZSIpOworICBhZGQoIm1pbmZvIik7CisgIGFkZCgibmV3Iik7CisgIGFkZCgibm9yZWMiKTsKKyAgYWRkKCJvYiIpOworICBhZGQoIm92ZXIiKTsKKyAgYWRkKCJwbCIpOworICBhZGQoInJlYyIpOworICBhZGQoInJlc3VsdCIpOworICAvLyBhZGQoInJ1c2FnZSIpOworICBhZGQoInNjYW4iKTsKKyAgYWRkKCJzdGF0Iik7CisgIGFkZCgic3RrIik7CisgIGFkZCgic3dhcCIpOworICBhZGQoInN3aG8iKTsKKyAgYWRkKCJ2YXJzIik7CisgIGFkZDIoIiMiLCJsb2NrIik7CisgIGFkZDIoIi4iLCJzZWwiKTsKKyAgYWRkMigiLyIsImZpbGUiKTsKKyAgYWRkMigiPCIsInJlYWR2YXIiKTsKKyAgYWRkMigiPSIsImR1bXAiKTsKKyAgYWRkMigiPiIsIndyaXRldmFyIik7CisgIGFkZDIoIkAiLCJwaWNrIik7CisgIGFkZDIoIlsiLCJjYWxsIik7CisgIGFkZDIoIl9tbyIsIl9tdiIpOworICBhZGQyKCJfbW92IiwiX212Iik7CisgIGFkZDIoIl9tb3ZlIiwiX212Iik7CisgIGFkZDIoIl9tdiIsIl9tdiIpOworICBhZGQyKCJjYWxsX291dCIsImNhbGxvdXQiKTsKKyAgYWRkMigiZGVidWdfaW5mbyIsICJkYl9pbmZvIik7CisgIGFkZDIoImRlc2MiLCJ0b2dnbGVfc2hvcnQiKTsKKyAgYWRkMigiZHVtcCIsImR1bXBsaXN0cyIpOworICBhZGQyKCJoZWFydF9iZWF0IiwiaGVhcnRiZWF0Iik7CisgIGFkZDIoImlkbGUiLCJpZGxlIik7CisgIGFkZDIoImluaGVyaXRfbGlzdCIsImluaGVyaXRsaXN0Iik7CisgIGFkZDIoIm1vdmUiLCJtdiIpOworICBhZGQyKCJtb3YiLCJtdiIpOworICBhZGQyKCJtbyIsIm12Iik7CisgIGFkZDIoInBvcCIsInhwb3AiKTsKKyAgYWRkMigicHVzaCIsInhwdXNoIik7CisgIGFkZDIoInJlbmV3IiwicmVuZXdfcGxheWVyIik7CisgIGFkZDIoInNjIiwic2NhbiIpOworICBhZGQyKCJ+IiwiZmlsZTIiKTsKKyAgbWF4dmVyYj1uY21kczsKKyAgdmFyYXJlYT1hbGxvY2F0ZShNQVhWQVJTKTsKKyAgcXVlcnlfbGlzdCA9CisgICAgKHsKKyAgICAgICJWQUxVRSIsIi12YWx1ZSIsIkxFVkVMIiwiLWxldmVsIiwiSURTIiwiLWlkcyIsCisgICAgICAiV0VBUE9OIENMQVNTIiwiLXdjIiwiQVJNT1VSIENMQVNTIiwiLWFjIiwKKyAgICAgICJXRUlHSFQiLCItd2VpZ2h0IiwiVFlQRSIsInF1ZXJ5X3R5cGUiLAorICAgICAgIlVJRCIsIi11aWQiLCJFVUlEIiwiLWV1aWQiCisgICAgfSk7Cit9CisKK2ludCBfcXVlcnlfYXV0b2xvYWRvYmooKQoreworICByZXR1cm4gMTsKK30KKwordm9pZCBfc2V0X2F1dG9sb2Fkb2JqKCkKK3sKKyAgY2FsbF9vdXQoIl9sb2FkX3Byb2ZpbGUiLDApOworfQorCit2b2lkIF9sb2FkX3Byb2ZpbGUoKQoreworICBvYmplY3QgcHJvZmlsZTsKKyAgc3RyaW5nIHBmaWxlOworICAKKyAgaWYgKGdldGV1aWQoKSAmJiBlbnZpcm9ubWVudCgpICYmIGdldGV1aWQoZW52aXJvbm1lbnQoKSk9PWdldGV1aWQoKSAmJgorICAgICAgaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgICAgaWYgKGZpbGVfc2l6ZShwZmlsZT0iL3BsYXllcnMvIitnZXRldWlkKCkrIi8ucHJvZmlsZS5jIik+MCkKKyAgICAgIGlmIChwZmlsZT1jYXRjaChjYWxsX290aGVyKHBmaWxlLCJzZXR1cCIsZW52aXJvbm1lbnQoKSkpKQorCXByaW50ZigiRXJyb3Igd2hlbiBsb2FkaW5nIHByb2ZpbGU6ICVPXG4iLHBmaWxlKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgaW50IGksY2g7CisgIAorICA6OmluaXQoKTsKKyAgaWYgKGVudmlyb25tZW50KCkhPXRoaXNfcGxheWVyKCkpIHJldHVybjsKKy8vICBpZiAoIUlTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpIHJldHVybjsKKyAgaWYgKCFJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKSByZXR1cm4gZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIAorICBhZGRfYWN0aW9uKCJjbWRsaW5lIiwiIiwxKTsKK30KKworaW50IGNtZGxpbmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHZlcmI7CisgIGludCBpLHJldDsKKyAgCisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZiAoIXZlcmIpIHJldHVybiAwOworICBzd2l0Y2ggKHZlcmIpCisgIHsKKyAgICBjYXNlICJlcnphZWhsIjogcmV0dXJuIHRlbGwoc3RyKTsKKyAgfQorICBzdHI9UEwtPl91bnBhcnNlZF9hcmdzKCk7CisgIGZvciAoaT0wO2k8bWF4dmVyYjtpKyspCisgICAgaWYgKGNvbW1hbmRzW2ldPT12ZXJiWzAuLnNpemVvZihjb21tYW5kc1tpXSktMV0pCisgICAgICBpZiAocmV0PWV2YWxjbWQoc3RyKSkKKwlyZXR1cm4gcmV0OworICByZXR1cm4oMCk7IC8vIG5vbi12b2lkIGZ1bmN0aW9uLCBaZXNzdHJhCit9CisKK3N0YXRpYyBpbnQgdGVsbChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnRtcDsKKyAgb2JqZWN0IHdobyxzbjsKKyAgaW50IHJldDsKKworICBpZiAoIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkgcmV0dXJuIDA7CisgIGlmICghKHN0cj10aGlzX2ludGVyYWN0aXZlKCktPl91bnBhcnNlZF9hcmdzKCkpKSByZXR1cm4gMDsKKyAgaWYgKHNpemVvZih0bXA9b2xkX2V4cGxvZGUoc3RyLCIgIikpPDIpIHJldHVybiAwOworICBpZiAoISh3aG89ZmluZF9wbGF5ZXIodG1wWzBdKSkpIHJldHVybiAwOworICBpZiAoIShzbj1xdWVyeV9zbm9vcCh3aG8pKSkgcmV0dXJuIDA7CisgIGlmIChxdWVyeV93aXpfZ3JwKHRoaXNfaW50ZXJhY3RpdmUoKSk8PXF1ZXJ5X3dpel9ncnAoc24pIHx8CisgICAgICBxdWVyeV93aXpfZ3JwKHRoaXNfaW50ZXJhY3RpdmUoKSk8PXF1ZXJ5X3dpel9ncnAod2hvKSkgcmV0dXJuIDA7CisgIHNub29wKHNuLDApOworICByZXQ9dGhpc19pbnRlcmFjdGl2ZSgpLT5fZXJ6YWVobGUoc3RyKTsKKyAgc25vb3Aoc24sd2hvKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IHNldF91c2VyKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB3aG87CisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKHN0cj09Im5vIGFjY2VzcyIpCisgIHsKKyAgICB1c2VyPSIqIjsKKyAgICBtb3ZlX29iamVjdCh0aGlzX29iamVjdCgpLGVudmlyb25tZW50KCkpOworICAgIHdyaXRlKCJPay5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzc2NhbmYoc3RyLCJhY2Nlc3MgdG8gJXMiLHdobyk9PTEpCisgIHsKKyAgICBvYmplY3QgcGw7CisgICAgcGw9ZmluZF9wbGF5ZXIod2hvKTsKKyAgICBpZiAoIXBsKQorICAgICAgd3JpdGUoIk5vIHN1Y2ggcGxheWVyLlxuIik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHVzZXIgPSB3aG87CisgICAgICB3cml0ZSgiT2suXG4iKTsKKyAgICAgIG1vdmVfb2JqZWN0KHRoaXNfb2JqZWN0KCkscGwpOworICAgICAgdGVsbF9vYmplY3QocGwsIkR1IGRhcmZzdCBudW4gZHVyY2ggZGllIG1hZ2lzY2hlIEx1cGUgc2NoYXVlbi5cbiIpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RyaW5nIHN0cmlwKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB0ZW1wOworICBpZighc3RyKSByZXR1cm4gIiI7CisgIHdoaWxlIChzc2NhbmYoc3RyLCIgJXMiLHRlbXApPT0xKSBzdHI9dGVtcDsKKyAgcmV0dXJuIHN0cjsKK30KKworaW50IGFyZ2xlbjsKKworc3RyaW5nIGdldGFyZyhzdHJpbmcgYXJncykKK3sKKyAgc3RyaW5nIGFyZzsKKyAgc3RyaW5nIHJlc3Q7CisgIGlmIChzc2NhbmYoYXJncywiXCIlc1wiJXMiLGFyZyxyZXN0KT09MiB8fAorICAgICAgc3NjYW5mKGFyZ3MsIlwnJXNcJyVzIixhcmcscmVzdCk9PTIgfHwKKyAgICAgIHNzY2FuZihhcmdzLCJ8JXN8JXMiLGFyZyxyZXN0KT09MikKKyAgeworICAgIGlmIChhcmc9PSIiKQorICAgICAgYXJnbGVuPTI7CisgICAgZWxzZQorICAgICAgYXJnbGVuPXNpemVvZihhcmcpKzI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBpZiAoc3NjYW5mKGFyZ3MsIiVzICVzIixhcmcscmVzdCk9PTIpCisgICAgYXJncz1hcmc7CisgIGlmIChzc2NhbmYoYXJncywiJXMuJXMiLGFyZyxyZXN0KT09MikKKyAgICBhcmdzPWFyZzsKKyAgaWYgKHNzY2FuZihhcmdzLCIlc1slcyIsYXJnLHJlc3QpPT0yKQorICAgIGFyZ3M9YXJnOworICBpZiAoc3NjYW5mKGFyZ3MsIiVzXSVzIixhcmcscmVzdCk9PTIpCisgICAgYXJncz1hcmc7CisgIGlmIChhcmdzPT0iIikKKyAgICBhcmdsZW49MDsKKyAgZWxzZQorICAgIGFyZ2xlbj1zaXplb2YoYXJncyk7CisgIHJldHVybiBhcmdzOworfQorCitzdHJpbmcgZ2V0cmVzdChzdHJpbmcgc3RyKQoreworICBpZiAoYXJnbGVuPT0wKQorICAgIHJldHVybiBzdHI7CisgIGlmIChhcmdsZW49PXNpemVvZihzdHIpKQorICAgIHJldHVybiAiIjsKKyAgcmV0dXJuIHN0cmlwKHN0clthcmdsZW4uLnNpemVvZihzdHIpLTFdKTsKK30KKworaW50IGludGVyYWN0aXZlTW9kZShzdHJpbmcgc3RyKQoreworICBpZiAoc3RyKQorICAgIHJldHVybiBldmFsKHN0cik7CisgIHN0aygiIik7CisgIHdyaXRlKCInLicgdG8gZXhpdC5cbiIpOworICB3cml0ZSgiPyAiKTsKKyAgaW5wdXRfdG8oIm1vcmUiKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgbW9yZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgY21kOworICBpZiAoc3RyPT0iLiIpIHJldHVybjsKKyAgaWYgKHNzY2FuZihzdHIsIiElcyIsY21kKT09MSkKKyAgICBjb21tYW5kKGNtZCx0aGlzX3BsYXllcigpKTsKKyAgZWxzZQorICB7CisgICAgZXZhbChzdHIpOworICAgIHN0aygiIik7CisgIH0KKyAgd3JpdGUoIj8gIik7CisgIGlucHV0X3RvKCJtb3JlIik7Cit9CisKK2ludCBldmFsY21kKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB2ZXJiOworICBpZiAoIUlTX0xFQVJOSU5HKHRoaXNfcGxheWVyKCkpKSByZXR1cm4gMDsKKyAgdmVyYj1xdWVyeV92ZXJiKCk7CisgIGlmICh2ZXJiPT0iPyIpCisgICAgdmVyYj0iIjsKKyAgaWYgKHN0cikKKyAgICBzdHI9dmVyYisiICIrc3RyOworICBlbHNlCisgICAgc3RyPXZlcmI7CisgIHJldHVybiBldmFsKHN0cik7Cit9CisKK2ludCBldmFsKHN0cmluZyBzdHIpCit7CisgIGludCBpLGZsYWcsb2xkX3NwLGZpcnN0OworICBtaXhlZCAqb2xkX3N0YWNrOworICBzdHJpbmcgYXJnLHRtcDsKKyAgZXJyPTA7CisgIGZpcnN0PTE7CisgIHdoaWxlIChzdHIhPSIiKQorICB7CisgICAgZmxhZz0wOworICAgIHN0cj1zdHJpcChzdHIpOworICAgIGlmIChzc2NhbmYoc3RyLCIjJXMiLGFyZyk9PTEpCisgICAgeworICAgICAgb2xkX3N0YWNrPXN0YWNrWzAuLjwxXTsKKyAgICAgIHN0cj1hcmc7CisgICAgfQorICAgIGVsc2UKKyAgICAgIG9sZF9zdGFjaz0wOworICAgIHN0cj1zdHJpcChzdHIpOworICAgIGlmIChzdHI9PSIiKQorICAgICAgYnJlYWs7CisgICAgZm9yIChpPTA7aTxuY21kcztpKyspCisgICAgeworICAgICAgaWYgKHNzY2FuZihzdHIsY29tbWFuZHNbaV0rIiVzIixhcmcpPT0xKQorICAgICAgeworCWlmIChhcmchPSIiICYmIHN0clswXT49J2EnICYmIHN0clswXTw9J3onICYmCisJICAgIGFyZ1swXT49J2EnICYmIGFyZ1swXTw9J3onKQorCXsKKwkgIGlmIChmaXJzdCkKKwkgICAgcmV0dXJuIDA7CisJICBlbHNlCisJICB7CisJICAgIHByaW50ZigiQ291bGRuJ3QgcGFyc2U6ICVPLlxuIixzdHIpOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwl9CisJYXJnPXN0cmlwKGFyZyk7CisJc3RyPWNhbGxfb3RoZXIodGhpc19vYmplY3QoKSxmdW5jdGlvbnNbaV0sYXJnKTsKKwlmaXJzdD0wOworCWlmIChvbGRfc3RhY2spCisJeworCSAgc3RhY2s9b2xkX3N0YWNrOworCSAgb2xkX3N0YWNrPTA7CisJfQorCWlmIChzdHJpbmdwKGVycikpCisJeworCSAgaWYgKHNzY2FuZihlcnIsIiVzXG4iLHRtcCk9PTEpCisJICAgIGVyciA9IHRtcDsKKwkgIG5vdGlmeV9mYWlsKHNwcmludGYoIkVSUk9SOiAlTy5cbiIsZXJyKSk7CisJICByZXR1cm4gMDsKKwl9CisJZmxhZz0xOworCWJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZsYWcpCisgICAgeworICAgICAgbm90aWZ5X2ZhaWwoc3ByaW50ZigiQ291bGRuJ3QgcGFyc2U6ICVPLlxuIixzdHIpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHB1c2gob2JqZWN0IG9iKQoreworICBzdGFjays9KHtvYn0pOworICBpZiAoc2l6ZW9mKHN0YWNrKT5NQVhTVEFDSykKKyAgICBzdGFjaz1zdGFja1sxLi5NQVhTVEFDS107CisgIHJldHVybiAxOworfQorCittaXhlZCBwb3AoKQoreworICBvYmplY3QgdG1wOworICBpZiAoIXNpemVvZihzdGFjaykpCisgIHsKKyAgICBlcnI9InN0YWNrIHVuZGVyZmxvdyI7CisgICAgdG1wPXRoaXNfb2JqZWN0KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdG1wPXN0YWNrW3NpemVvZihzdGFjayktMV07CisgIHN0YWNrPXN0YWNrWzAuLjwyXTsKKyAgaWYgKCF0bXApCisgICAgZXJyPSJvcGVyYXRpbmcgb24gZGVzdHJ1Y3RlZCBvYmplY3QiOworICByZXR1cm4gdG1wOworfQorCittaXhlZCB4cG9wKHN0cmluZyBhcmcpCit7CisgIGlmICghcG9wKCkpCisgICAgZXJyPTA7CisgIHJldHVybiBhcmc7Cit9CisKK21peGVkIHRvZ2dsZV9zaG9ydChzdHJpbmcgYXJnKQoreworICBoaWRlX3Nob3J0ID0gIWhpZGVfc2hvcnQ7CisgIGlmIChoaWRlX3Nob3J0KQorICAgIHdyaXRlKCJTaG9ydCBkZXNjcmlwdGlvbnMgb2ZmLlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiU2hvcnQgZGVzY3JpcHRpb25zIG9uLlxuIik7CisgIHJldHVybiBhcmc7Cit9CisKK21peGVkIHBsKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyB3aG8scmVzdDsKKyAgb2JqZWN0IHA7CisgIHdobz1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIGlmIChlcnIpIHJldHVybiAwOworICBwPW1hdGNoX2xpdmluZyh3aG8sMSk7CisgIGlmICghc3RyaW5ncChwKSkKKyAgeworICAgIGlmICghcD1maW5kX25ldGRlYWQod2hvKSkKKyAgICAgIGVycj0icGxheWVyICIrd2hvKyIgbm90IGZvdW5kIjsKKyAgICBlbHNlIAorICAgICAgcHVzaChwKTsKKyAgfQorICBlbHNlCisgICAgcHVzaChmaW5kX3BsYXllcihwKSk7CisgIHJldHVybiByZXN0OworfQorCittaXhlZCBsdihzdHJpbmcgYXJnKQoreworICBzdHJpbmcgd2hvLHJlc3Q7CisgIG9iamVjdCBwOworICB3aG89Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBpZiAoZXJyKSByZXR1cm4gMDsKKyAgcD1maW5kX2xpdmluZyh3aG8pOworICBpZiAoIXApCisgICAgZXJyPSJsaXZpbmcgb2JqZWN0ICIrd2hvKyIgbm90IGZvdW5kIjsKKyAgZWxzZQorICAgIHB1c2gocCk7CisgIHJldHVybiByZXN0OworfQorCitzdHJpbmcgbWUoc3RyaW5nIGFyZykKK3sKKyAgcHVzaCh0aGlzX3BsYXllcigpKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIG1ha2VfcGF0aChzdHJpbmcgcGF0aCkKK3sKKyAgcmV0dXJuICJzZWN1cmUvbWFzdGVyIi0+X2dldF9wYXRoKCBwYXRoLCBnZXRldWlkKCB0aGlzX3BsYXllcigpICkgKTsKK30KKworc3RyaW5nIG5ldyhzdHJpbmcgYXJnKQoreworICBzdHJpbmcgd2hhdCxyZXN0LGZpbGU7CisgIG9iamVjdCBvYjsKKyAgd2hhdD1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIGZpbGU9bWFrZV9wYXRoKHdoYXQpOworICBlcnI9Y2F0Y2gob2I9Y2xvbmVfb2JqZWN0KGZpbGUpKTsKKyAgaWYgKCFlcnIpCisgIHsKKyAgICBwdXNoKG9iKTsKKyAgICBvYi0+bW92ZSh0aGlzX3BsYXllcigpLE1fTk9DSEVDSyk7CisgICAgd3JpdGUoIkNyZWF0ZWQgIitkZXNjKG9iKSsiLlxuIik7CisgIH0KKyAgZWxzZQorICAgIGVyciA9ICJ1bmFibGUgdG8gY3JlYXRlIG9iamVjdCwgY2F1c2UgOiAiK2VycjsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0YXRpYyBzdHJpbmcgY3JlYXQoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHdoYXQscmVzdCxmaWxlOworICBvYmplY3Qgb2I7CisgIHdoYXQ9Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBmaWxlPW1ha2VfcGF0aCh3aGF0KTsKKyAgZXJyPWNhdGNoKG9iPWNsb25lX29iamVjdChmaWxlKSk7CisgIGlmICghZXJyKQorICB7CisgICAgcHVzaChvYik7CisgICAgd3JpdGUoIkNyZWF0ZWQgIitkZXNjKG9iKSsiLlxuIik7CisgIH0KKyAgZWxzZQorICAgIGVyciA9ICJ1bmFibGUgdG8gY3JlYXRlIG9iamVjdCwgY2F1c2UgOiAiK2VycjsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyB4cHVzaChzdHJpbmcgYXJnKQoreworICBzdHJpbmcgcmVzdCx3aGF0OworICBvYmplY3Qgb2I7CisKKyAgd2hhdD1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIG9iID0gZmluZF9vYmplY3Qod2hhdCk7CisgIGlmICghb2IpCisgICAgZXJyPSJPYmplY3QgIit3aGF0KyIgbm90IGZvdW5kIVxuIjsKKyAgZWxzZQorICAgIHB1c2gob2IpOworICByZXR1cm4gcmVzdDsKK30KKworc3RhdGljIHN0cmluZyBvYihzdHJpbmcgYXJnKQoreworICBzdHJpbmcgd2hhdCxyZXN0LGZpbGUsdG1wOworICBvYmplY3Qgb2I7CisgIHdoYXQ9Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBmaWxlPW1ha2VfcGF0aCh3aGF0KTsKK3sKKyAgb2I9ZmluZF9vYmplY3QoZmlsZSk7CisgIGlmICghb2IpCisgIHsKKyAgICB0bXAgPSBjYXRjaChjYWxsX290aGVyKGZpbGUsIj8/IikpOworICAgIGlmICghZXJyKQorICAgICAgb2IgPSBmaW5kX29iamVjdChmaWxlKTsKKyAgfQorfQoraWYgKCFvYikKK3sKKyAgZXJyPSJvYmplY3QgIitmaWxlKyIgbm90IGZvdW5kIjsKKyAgaWYgKHRtcCkKKyAgICBlcnIgKz0gIigiK3RtcCsiKSI7Cit9CitlbHNlCitwdXNoKG9iKTsKK3JldHVybiByZXN0OworfQorCitzdHJpbmcgZmlsZShzdHJpbmcgYXJnKQoreworICByZXR1cm4gb2IoIi8iK2FyZyk7Cit9CisKK3N0cmluZyBmaWxlMihzdHJpbmcgYXJnKQoreworICByZXR1cm4gb2IoIn4iK2FyZyk7Cit9CisKK3N0cmluZyBzZWwoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHJlc3Q7bWl4ZWQgd2hhdDsKKyAgb2JqZWN0IG9iLHA7CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBpZiAoc3NjYW5mKGFyZywiJWQlcyIsd2hhdCxyZXN0KT09MikKKyAgeworICAgIGlmICh3aGF0PD0wKQorICAgIHsKKyAgICAgIGVycj0ibmVnYXRpdmUgaW5kZXgiOworICAgICAgcHVzaChvYik7CisgICAgICByZXR1cm4gYXJnOworICAgIH0KKyAgICB3aGF0LS07CisgICAgcD1maXJzdF9pbnZlbnRvcnkob2IpOworICAgIHdoaWxlIChwICYmIHdoYXQpCisgICAgeworICAgICAgcD1uZXh0X2ludmVudG9yeShwKTsKKyAgICAgIHdoYXQtLTsKKyAgICB9CisgICAgaWYgKCFwKQorICAgIHsKKyAgICAgIGVycj0iaW5kZXggdG8gbGFyZ2UiOworICAgICAgcHVzaChvYik7CisgICAgICByZXR1cm4gYXJnOworICAgIH0KKyAgICBwdXNoKHApOworICAgIHJldHVybiByZXN0OworICB9CisgIHdoYXQ9Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBwPXByZXNlbnQod2hhdCxvYik7CisgIGlmIChwKQorICAgIHB1c2gocCk7CisgIGVsc2UKKyAgeworICAgIHB1c2gob2IpOworICAgIGVycj13aGF0KyIgbm90IHByZXNlbnQgaW4gIitkZXNjKG9iKTsKKyAgfQorICByZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIGhlcmUoc3RyaW5nIGFyZykKK3sKKyAgcHVzaChlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSk7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBlbnYoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBvYj1wb3AoKTsKKyAgaWYgKCFlcnIpCisgIHsKKyAgICBpZiAoIWVudmlyb25tZW50KG9iKSkKKyAgICAgIGVycj1kZXNjKG9iKSsiIGhhcyBubyBlbnZpcm9ubWVudCI7CisgICAgZWxzZQorICAgICAgcHVzaChlbnZpcm9ubWVudChvYikpOworICB9CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBkdXAoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IHRvczsKKyAgdG9zPXBvcCgpOworICBpZiAoIWVycikKKyAgeworICAgIHB1c2godG9zKTsKKyAgICBwdXNoKHRvcyk7CisgIH0KKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIHN3YXAoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IHRvczsKKyAgaW50IHN0czsKKworICBpZiAoKHN0cz1zaXplb2Yoc3RhY2spKTwyKQorICB7CisgICAgZXJyPSJzdGFjayB1bmRlcmZsb3ciOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgdG9zPXN0YWNrW3N0cy0xXTsKKyAgc3RhY2tbc3RzLTFdPXN0YWNrW3N0cy0yXTsKKyAgc3RhY2tbc3RzLTJdPXRvczsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIG92ZXIoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBpZiAoc2l6ZW9mKHN0YWNrKTwyKQorICB7CisgICAgZXJyPSJzdGFjayB1bmRlcmZsb3ciOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgcHVzaChzdGFja1tzaXplb2Yoc3RhY2spLTJdKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIHBpY2soc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHJlc3Q7CisgIGludCBubzsKKyAgaWYgKHNzY2FuZihhcmcsIiVkJXMiLG5vLHJlc3QpIT0yIHx8IG5vPDAgfHwgbm8+PXNpemVvZihzdGFjaykpCisgIHsKKyAgICBlcnI9InN0YWNrIHNpemUgZXhjZWVkZWQiOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgZWxzZQorICAgIHB1c2goc3RhY2tbc2l6ZW9mKHN0YWNrKS1uby0xXSk7CisgIHJldHVybiByZXN0OworfQorCitzdHJpbmcgc3RyaW5nX2Rlc2Moc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG91dDsKKyAgb3V0ID0gaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIlxcIiksIlxcXFwiKTsKKyAgb3V0ID0gaW1wbG9kZShvbGRfZXhwbG9kZShvdXQsIlxuIiksIlxcbiIpOworICBvdXQgPSBpbXBsb2RlKG9sZF9leHBsb2RlKG91dCwiXCIiKSwiXFxcIiIpOworICByZXR1cm4gIlwiIitvdXQrIlwiIjsKK30KKworbWl4ZWQgcmVjX2Rlc2MobWl4ZWQgb2IpCit7CisgIGlmIChpbnRwKG9iKSkKKyAgICByZXR1cm4gIiIrb2I7CisgIGlmIChzdHJpbmdwKG9iKSkKKyAgICByZXR1cm4gc3RyaW5nX2Rlc2MoKHN0cmluZylvYik7CisgIGlmIChvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gIk9CSigiK29iamVjdF9uYW1lKG9iKSsiKSI7CisgIGlmICghcG9pbnRlcnAob2IpKQorICAgIHJldHVybiBzcHJpbnRmKCIlTyIsb2IpOworICByZXR1cm4gIih7ICIraW1wbG9kZShtYXAob2IsInJlY19kZXNjIix0aGlzX29iamVjdCgpKSwiLCAiKSsiIH0pIjsKK30KKworc3RyaW5nIGFycmF5X2Rlc2MobWl4ZWQgYXJyKQoreworICBzdHJpbmcgc3RyLGxpbmUscmVzOworICBtaXhlZCB0bXA7CisgIGludCBpLGo7CisgIHN0cj1yZWNfZGVzYyhhcnIpOworICBpZiAoc2l6ZW9mKHN0cik8PU1BWExJTkVMRU4tNCkKKyAgICByZXR1cm4gIi0tPiAiK3N0cisiXG4iOworICB0bXA9b2xkX2V4cGxvZGUoc3RyLCIgIik7CisgIHJlcz0iIjsKKyAgbGluZXM9MDsKKyAgaT0xOworICBsaW5lPSItLT4gIit0bXBbMF0rIiAiOworICBmb3IgKDs7KQorICB7CisgICAgd2hpbGUgKGk8c2l6ZW9mKHRtcCkgJiYgc2l6ZW9mKGxpbmUpK3NpemVvZih0bXBbaV0rMSk8PU1BWExJTkVMRU4tMSkKKyAgICB7CisgICAgICBsaW5lKz10bXBbaV0rIiAiOworICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoc2l6ZW9mKGxpbmUpPT0wKQorICAgIHsKKyAgICAgIGxpbmU9dG1wW2ldKyIgIjsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKGk8c2l6ZW9mKHRtcCkpCisgICAgICBsaW5lKz0ifFxuIjsKKyAgICBlbHNlCisgICAgICBsaW5lKz0iXG4iOworICAgIHJlcys9bGluZTsKKyAgICBsaW5lcysrOworICAgIGlmIChsaW5lcz49TUFYTElORVMpCisgICAgICByZXR1cm4gcmVzKyIqKiogVFJVTkNBVEVEICoqKlxuIjsKKyAgICBpZiAoaT49c2l6ZW9mKHRtcCkpCisgICAgICByZXR1cm4gcmVzOworICAgIGxpbmU9IiI7CisgIH0KKyAgcmV0dXJuKDApOyAvLyBub24tdm9pZCwgWmVzc3RyYSAobmV2ZXIgcmVhY2hlZCkKK30KKworc3RyaW5nIGRlc2Mob2JqZWN0IG9iKQoreworICBpZiAoIW9iKQorICAgIHJldHVybiAiPGRlc3RydWN0ZWQgb2JqZWN0PiI7CisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuICI8Y29ycnVwdGVkIHN0YWNrIGVudHJ5PiI7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICByZXR1cm4gb2JqZWN0X25hbWUob2IpKyIgIitjYXBpdGFsaXplKGdldGV1aWQob2IpKTsKKyAgaWYgKCFoaWRlX3Nob3J0ICYmIG9iLT5zaG9ydCgpKQorICAgIHJldHVybiBvYmplY3RfbmFtZShvYikrIiAiK29iLT5uYW1lKCk7CisgIGVsc2UKKyAgICByZXR1cm4gb2JqZWN0X25hbWUob2IpOworfQorCitzdHJpbmcgc3RrKHN0cmluZyBhcmcpCit7CisgIGludCBpLHN0czsKKyAgaWYgKCEoc3RzPXNpemVvZihzdGFjaykpKQorICAgIHdyaXRlICgiPGVtcHR5IHN0YWNrPlxuIik7CisgIGVsc2UKKyAgICBmb3IgKGk9MTtpPD1zdHM7aSsrKQorICAgIHsKKyAgICAgIHdyaXRlKCJAIisoaS0xKSsiOiAiK2Rlc2Moc3RhY2tbc3RzLWldKSsiXG4iKTsKKyAgICB9CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBjbHIoc3RyaW5nIGFyZykKK3sKKyAgc3RhY2s9KHt9KTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGR1bXAoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgczsKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIHB1c2gob2IpOworICB3cml0ZSgiRklMRU5BTUU6ICIrb2JqZWN0X25hbWUob2IpKyIgIik7CisgIGlmICghaGlkZV9zaG9ydCAmJiAocz1vYi0+c2hvcnQoKSkpCisgICAgd3JpdGUoIiBTSE9SVDogIitvYi0+bmFtZSgpKTsKKyAgd3JpdGUoIlxuIik7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBpbmZvKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgczsKKyAgaW50IGk7CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICB3cml0ZSgiRklMRU5BTUU6ICIrb2JqZWN0X25hbWUob2IpKyIgIik7CisgIGlmIChzPW9iLT5zaG9ydCgpKQorICAgIHdyaXRlKCIgU0hPUlQ6ICIrb2ItPm5hbWUoKSk7CisgIHdyaXRlKCJcbiIpOworICBpZiAoZ2V0dWlkKG9iKSkKKyAgICB3cml0ZSgiQ1JFQVRPUjogIitnZXR1aWQob2IpKyJcbiIpOworICBpZiAocz1xdWVyeV9pcF9udW1iZXIob2IpKQorICB7CisgICAgd3JpdGUoIklQLU5VTUJFUjogIitzKyIgSVAtTkFNRTogIitxdWVyeV9pcF9uYW1lKG9iKSsiIElETEU6ICIKKwkgICsgcXVlcnlfaWRsZShvYikrIlxuIik7CisgIH0KKyAgaWYgKHM9cXVlcnlfc25vb3Aob2IpKQorICAgIHdyaXRlKCJTTk9PUEVEIEJZOiAiK3MtPnF1ZXJ5X3JlYWxfbmFtZSgpKyJcbiIpOworICBzPSIiOworICBpZiAobGl2aW5nKG9iKSkKKyAgICBzICs9ImxpdmluZyAiOworICBpZiAob2ItPnF1ZXJ5X25wYygpKQorICAgIHMrPSJucGMgIjsKKyAgaWYgKG9iLT5xdWVyeV9nZW5kZXJfc3RyaW5nKCkpCisgICAgcys9b2ItPnF1ZXJ5X2dlbmRlcl9zdHJpbmcoKTsKKyAgaWYgKHMhPSIiKQorICAgIHdyaXRlKCJGTEFHUzogIitzKyJcbiIpOworICAvLyAgd3JpdGUoIkxPTkc6XG4iKTsKKyAgLy8gIGlmIChzdHJpbmdwKHM9b2ItPmxvbmcoKSkpCisgIC8vICAgIHdyaXRlKHMpOworICAvLyAgd3JpdGUoIlxuIik7CisgIGZvciAoaT0wO2k8c2l6ZW9mKHF1ZXJ5X2xpc3QpO2krPTIpCisgIHsKKyAgICBpZiAocXVlcnlfbGlzdFtpKzFdWzBdPT0nLScpCisgICAgICBzPW9iLT5RdWVyeVByb3AocXVlcnlfbGlzdFtpKzFdWzEuLl0pOworICAgIGVsc2UKKyAgICAgIHM9Y2FsbF9vdGhlcihvYixxdWVyeV9saXN0W2krMV0pOworICAgIGlmIChzKQorICAgIHsKKyAgICAgIHByaW50ZigiJXM6ICVPXG4iLHF1ZXJ5X2xpc3RbaV0scyk7CisgICAgfQorICB9CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBmaWxsZXIoaW50IG4pCit7CisgIHN0cmluZyBzOworICBpZiAoIXJlY3Vyc2l2ZSkgcmV0dXJuICI6ICI7CisgIHM9IjogIjsKKyAgd2hpbGUgKCsrbjxNQVhERVBUSCkKKyAgICBzPSIgICIrczsKKyAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgbGlzdGludihvYmplY3Qgb2IsaW50IGRlcHRoLHN0cmluZyBwcmVmaXgpCit7CisgIGludCBpOworICBvYmplY3QgcDsKKyAgaWYgKGRlcHRoPE1BWERFUFRIKQorICB7CisgICAgcD1maXJzdF9pbnZlbnRvcnkob2IpOworICAgIGk9MTsKKyAgICBpZiAocCkKKyAgICB7CisgICAgICB3aGlsZSAocCkKKyAgICAgIHsKKwlpZiAobGluZXM+bGFzdGxpbmUpIHJldHVybjsKKwlpZiAobGluZXM+PWZpcnN0bGluZSkKKwkgIHdyaXRlKHByZWZpeCsiLiIraStmaWxsZXIoZGVwdGgpK2Rlc2MocCkrIlxuIik7CisJbGluZXMrKzsKKwlpZiAobGluZXM9PWxhc3RsaW5lKzEgJiYgbmV4dF9pbnZlbnRvcnkocCkpCisJICB3cml0ZSgiKioqIFRSVU5DQVRFRCAqKipcbiIpOworCWlmIChyZWN1cnNpdmUpCisJICBsaXN0aW52KHAsZGVwdGgrMSxwcmVmaXgrIi4iK2kpOworCWkrKzsKKwlwPW5leHRfaW52ZW50b3J5KHApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBpZiAoIWRlcHRoKQorCXdyaXRlKCI8ZW1wdHkgaW52ZW50b3J5PlxuIik7CisgIH0KK30KKworc3RyaW5nIGludihzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIHN0cmluZyByZXN0OworICBpbnQgdG1wOworICBvYj1wb3AoKTsKKyAgbGluZXM9MTsKKyAgZmlyc3RsaW5lPTE7CisgIGxhc3RsaW5lPU1BWExJTkVTOworICBpZiAoIWVycikKKyAgeworICAgIGlmIChzc2NhbmYoYXJnLCI6JWQlcyIsdG1wLHJlc3QpPT0yKQorICAgIHsKKyAgICAgIGZpcnN0bGluZT10bXA7CisgICAgICBsYXN0bGluZT10bXArTUFYTElORVMtMTsKKyAgICAgIGFyZyA9IHJlc3Q7CisgICAgICBpZiAoc3NjYW5mKGFyZywiOiVkJXMiLHRtcCxyZXN0KT09MikKKyAgICAgIHsKKwlsYXN0bGluZT10bXA7CisJaWYgKGxhc3RsaW5lPGZpcnN0bGluZSkKKwkgIGVyciA9ICJmaXJzdCBsaW5lID4gbGFzdCBsaW5lIjsKKwlhcmc9cmVzdDsKKyAgICAgIH0KKyAgICB9CisgICAgcHVzaChvYik7CisgICAgbGlzdGludihvYiwwLCIiKTsKKyAgfQorICByZWN1cnNpdmU9MDsKKyAgcmV0dXJuIGFyZzsKK30KKworb2JqZWN0IGNhbGxfcmVzdWx0OworCitzdHJpbmcgY2FsbChzdHJpbmcgYXJnKQoreworICBzdHJpbmcgZnVuYyxhcmdzOworICBpbnQgdGVtcCxpOworICBzdHJpbmcgcmVzdCx0bXA7CisKKyAgb2JqZWN0IG9iOworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgcHVzaChvYik7CisgIGZ1bmM9Z2V0YXJnKGFyZyk7CisgIGFyZ3M9Z2V0cmVzdChhcmcpOworICBpZiAoZXJyKSByZXR1cm4gYXJnczsKKyAgYXJndj0oe30pOworICBpPTA7CisgIHdoaWxlICgxKQorICB7CisgICAgYXJncz1zdHJpcChhcmdzKTsKKyAgICBpZiAoc3NjYW5mKGFyZ3MsIl0lcyIscmVzdCkpCisgICAgICBicmVhazsKKyAgICBpZiAoc3NjYW5mKGFyZ3MsIiVkJXMiLHRtcCxyZXN0KT09MikKKyAgICB7CisgICAgICBhcmdzPXJlc3Q7CisgICAgICBhcmd2Kz0oe3RtcH0pOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzc2NhbmYoYXJncywiXCIlc1wiJXMiLHRtcCxyZXN0KT09MiB8fAorCXNzY2FuZihhcmdzLCJcJyVzXCclcyIsdG1wLHJlc3QpPT0yIHx8CisJc3NjYW5mKGFyZ3MsInwlc3wlcyIsdG1wLHJlc3QpPT0yKQorICAgIHsKKyAgICAgIGFyZ3M9cmVzdDsKKyAgICAgIGFyZ3YrPSh7dG1wfSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNzY2FuZihhcmdzLCJAJWQlcyIsdGVtcCxyZXN0KT09MikKKyAgICB7CisgICAgICBpZiAodGVtcDwwIHx8IHRlbXA+PXNpemVvZihzdGFjaykpCisgICAgICB7CisJZXJyPSJzdGFja2luZGV4IG91dCBvZiByYW5nZSI7CisJcmV0dXJuIGFyZ3M7CisgICAgICB9CisgICAgICBhcmd2Kz0oe3N0YWNrW3NpemVvZihzdGFjayktdGVtcC0xXX0pOworICAgICAgYXJncz1yZXN0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHRtcD1nZXRhcmcoYXJncyk7CisgICAgcmVzdD1nZXRyZXN0KGFyZ3MpOworICAgIGFyZ3YrPSh7dG1wfSk7CisgICAgaWYgKHRtcCE9IiIpCisgICAgeworICAgICAgYXJncz1yZXN0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGVycj0iYmFkIGFyZ3VtZW50IHRvIFtdIjsKKyAgICByZXR1cm4gYXJnczsKKyAgfQorICBpZiAoc3NjYW5mKGFyZ3MsIl0lcyIscmVzdCkhPTEpCisgIHsKKyAgICBlcnI9InRvbyBtYW55IG9yIHVudGVybWluYXRlZCBhcmd1bWVudChzKSI7CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKyAgY2FsbF9yZXN1bHQ9YXBwbHkoIydjYWxsX290aGVyLG9iLGZ1bmMsYXJndik7CisgIC8vJworICAvLyAgaWYgKG9iamVjdHAoY2FsbF9yZXN1bHQpKQorICAvLyAgICB3cml0ZSgiLS0+ICIrZGVzYyhjYWxsX3Jlc3VsdCkrIlxuIik7CisgIC8vICBlbHNlIGlmIChwb2ludGVycChjYWxsX3Jlc3VsdCkpCisgIC8vICAgIHdyaXRlKGFycmF5X2Rlc2MoY2FsbF9yZXN1bHQpKTsKKyAgLy8gIGVsc2UKKyAgLy8gICAgd3JpdGUoIi0tPiAiK2NhbGxfcmVzdWx0KyJcbiIpOworICBwcmludGYoIi0tPiAlT1xuIixjYWxsX3Jlc3VsdCk7CisgIHBvcCgpOworICBhcmd2PSh7fSk7CisgIHJldHVybiByZXN0OworfQorCitzdHJpbmcgcmVzdWx0KHN0cmluZyBhcmcpCit7CisgIGlmIChvYmplY3RwKGNhbGxfcmVzdWx0KSkKKyAgICBwdXNoKGNhbGxfcmVzdWx0KTsKKyAgZWxzZQorICAgIGVycj0iY2FsbCByZXR1cm5lZCBubyBvYmplY3QiOworICByZXR1cm4gYXJnOworfQorCitpbnQgZGVzdHJveWFibGUob2JqZWN0IG9iKQoreworICBpZiAoIW9iKQorICAgIHJldHVybiAwOworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgICAgcmV0dXJuIDA7CisgIGlmIChvYj09dGhpc19vYmplY3QoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0cmluZyBjbG4oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBvYj1wb3AoKTsKKyAgaWYgKCFlcnIpCisgIHsKKyAgICBjbGVhbihvYik7CisgICAgd3JpdGUoZGVzYyhvYikrIiBjbGVhbmVkIHVwLlxuIik7CisgIH0KKyAgcmVjdXJzaXZlPTA7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBjbG5vZihzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIGludCByZWNzYXZlOworICBzdHJpbmcgbmFtZSxyZXN0OworCisgIHdyaXRlKCJDbG5PZiIpOworICByZWNzYXZlPXJlY3Vyc2l2ZTsKKyAgcmVjdXJzaXZlPTA7CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBuYW1lPWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgcmVjdXJzaXZlPXJlY3NhdmU7CisgIGNsZWFub2YobmFtZSxvYik7CisgIHJlY3Vyc2l2ZT0wOworICByZXR1cm4gcmVzdDsKK30KKwordm9pZCBSZW1vdmUob2JqZWN0IG9iLGludCBhKQoreworICBpZiAoIW9iamVjdHAob2IpKSByZXR1cm47CisgIGlmICghYSkKKyAgeworICAgIHByaW50ZigiUmVtb3ZpbmcgJU8iLG9iKTsKKyAgICBpZiAoIWhpZGVfc2hvcnQpIHByaW50ZigiICVPIixvYi0+bmFtZSgpKTsKKyAgfQorICBjYXRjaChvYi0+cmVtb3ZlKCkpOworICBpZiAob2IpCisgIHsKKyAgICBpZiAoIWEpIHByaW50ZigiIEhBUkQiKTsKKyAgICBkZXN0cnVjdChvYik7CisgIH0KKyAgd3JpdGUoIlxuIik7Cit9CisKK3ZvaWQgY2xlYW4ob2JqZWN0IG9iKQoreworICBvYmplY3QgcCxwMjsKKyAgcD1maXJzdF9pbnZlbnRvcnkob2IpOworICB3aGlsZSAoZGVzdHJveWFibGUocCkpCisgIHsKKyAgICBpZiAocmVjdXJzaXZlKSBjbGVhbihwKTsKKyAgICBSZW1vdmUocCwwKTsKKyAgICBwPWZpcnN0X2ludmVudG9yeShvYik7CisgIH0KKyAgd2hpbGUgKHApCisgIHsKKyAgICBwMj1uZXh0X2ludmVudG9yeShwKTsKKyAgICBpZiAoZGVzdHJveWFibGUocDIpKQorICAgIHsKKyAgICAgIGlmIChyZWN1cnNpdmUpIGNsZWFuKHAyKTsKKyAgICAgIFJlbW92ZShwMiwwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcD1wMjsKKyAgfQorfQorCisgdm9pZCBjbGVhbm9mKHN0cmluZyBzdHIsb2JqZWN0IG9iKQoreworICBvYmplY3QgcCxwMjsKKyAgcD1maXJzdF9pbnZlbnRvcnkob2IpOworICB3aGlsZSAocCAmJiBwLT5pZChzdHIpICYmIGRlc3Ryb3lhYmxlKHApKQorICB7CisgICAgaWYgKHJlY3Vyc2l2ZSkgY2xlYW4ocCk7CisgICAgUmVtb3ZlKHAsMCk7CisgICAgcD1maXJzdF9pbnZlbnRvcnkob2IpOworICB9CisgIHdoaWxlIChwKQorICB7CisgICAgcDI9bmV4dF9pbnZlbnRvcnkocCk7CisgICAgaWYgKHAyICYmIHAyLT5pZChzdHIpICYmIGRlc3Ryb3lhYmxlKHAyKSkKKyAgICB7CisgICAgICBpZiAocmVjdXJzaXZlKSBjbGVhbihwMik7CisgICAgICBSZW1vdmUocDIsMCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHA9cDI7CisgIH0KK30KKworc3RyaW5nIGRlc3Qoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgaWYgKCFkZXN0cm95YWJsZShvYikpCisgIHsKKyAgICBlcnI9ZGVzYyhvYikrIiBtdXN0IG5vdCBiZSBkZXN0cm95ZWQiOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgUmVtb3ZlKG9iLDApOworICByZXR1cm4gYXJnOworfQorCittaXhlZCBkaXNjbyhzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGlmICghaW50ZXJhY3RpdmUob2IpKQorICB7CisgICAgZXJyPWRlc2Mob2IpKyIgaXMgbm90IGludGVyYWN0aXZlIjsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZW1vdmVfaW50ZXJhY3RpdmUob2IpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgRGVzdChzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBpZiAoIWRlc3Ryb3lhYmxlKG9iKSkKKyAgeworICAgIGVycj1kZXNjKG9iKSsiIG11c3Qgbm90IGJlIGRlc3Ryb3llZCI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBkZXN0cnVjdCggb2IgKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIG12KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBmcm9tLHRvOworICB0bz1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgZnJvbT1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgZnJvbS0+bW92ZSh0byxNX05PQ0hFQ0spOworICB3cml0ZSgiQmV3ZWdlICIrZGVzYyhmcm9tKSsiIG5hY2ggIitkZXNjKHRvKSsiLlxuIik7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBfbXYoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IGZyb20sdG87CisgIHRvPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBmcm9tPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBfX3NldF9lbnZpcm9ubWVudChmcm9tLHRvKTsKKyAgd3JpdGUoIkJld2VnZSAiK2Rlc2MoZnJvbSkrIiBuYWNoICIrZGVzYyh0bykrIi5cbiIpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgZGJfaW5mbyhzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGRlYnVnX2luZm8oMCxvYik7CisgIGRlYnVnX2luZm8oMSxvYik7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBpbmhlcml0bGlzdChzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIGludCBpOworICBzdHJpbmcgKmluaGVyaXRlZDsKKworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgaW5oZXJpdGVkPWluaGVyaXRfbGlzdChvYik7CisgIHdyaXRlKG9iKTt3cml0ZSgiIGluaGVyaXRzOlxuIik7CisgIGZvciAoaT0wO2k8c2l6ZW9mKGluaGVyaXRlZCk7aSsrKQorICAgIHdyaXRlKGluaGVyaXRlZFtpXSsiXG4iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworbWl4ZWQgZ2V0X2NhbGxvdXQoKQoreworICBtaXhlZCAqY2FsbHMscmV0OworICBzdHJpbmcgdG1wOworICBpbnQgaSxqOworCisgIGNhbGxzPWNhbGxfb3V0X2luZm8oKTsKKyAgcmV0PSh7fSk7CisgIGlmICghcG9pbnRlcnAoY2FsbHMpIHx8ICFzaXplb2YoY2FsbHMpKSAKKyAgICByZXR1cm4gMDsKKyAgZm9yIChpPTA7aTxzaXplb2YoY2FsbHMpO2krKykKKyAgeworICAgIGlmIChwb2ludGVycChjYWxsc1tpXSkpCisgICAgeworICAgICAgdG1wPSIiOworCQkJaWYgKHNpemVvZihjYWxsc1tpXSk+MykKKwkgICAgICB0bXArPXNwcmludGYoIiUtNTBPICUtMTZPIixjYWxsc1tpXVswXSxjYWxsc1tpXVsxXSkrc3ByaW50ZigiICUtNk8gJS0zT1xuIixjYWxsc1tpXVsyXSxjYWxsc1tpXVszXSk7CisJCQllbHNlIAorCQkJCXRtcCs9c3ByaW50ZigiICoqKiAlT1xuIixjYWxsc1tpXSk7CisgICAgfQorICAgIHJldCs9KHt0bXB9KTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCittaXhlZCBnZXRfaGVhcnRiZWF0KCkKK3sKKyAgbWl4ZWQgKm9iajsKKyAgc3RyaW5nICpyZXQ7CisgIGludCBpOworCisgIG9iaj1oZWFydF9iZWF0X2luZm8oKTsKKyAgcmV0PSh7fSk7CisgIGlmICghcG9pbnRlcnAob2JqKSB8fCBzaXplb2Yob2JqKT09MCkgcmV0dXJuIDA7CisgIGZvciAoaT0wO2k8c2l6ZW9mKG9iaik7aSsrKQorICAgIHJldCs9KHtzcHJpbnRmKCIlTyBpbiAlT1xuIixvYmpbaV0sZW52aXJvbm1lbnQob2JqW2ldKSl9KTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIG1ha2Uoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0ICpsaXN0LCBvYiwgZW52OworICBzdHJpbmcgZmlsZSx0ZW1wLGR1bW15OworICBpbnQgaSxjbG9uZWQ7CisgCisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBpZiAoIWRlc3Ryb3lhYmxlKG9iKSkKKyAgeworICAgIGVycj0iY2FuJ3QgdXBkYXRlICIrZGVzYyhvYik7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBlbnY9ZW52aXJvbm1lbnQob2IpOworICBmaWxlPW9iamVjdF9uYW1lKG9iKTsKKyAgd3JpdGUoIlVwZGF0aW5nICIrb2JqZWN0X25hbWUob2IpKyIuLi5cbiIpOworICBpZiAoc3NjYW5mKGZpbGUsIiVzIyVzIix0ZW1wLGR1bW15KT09MikKKyAgeworICAgIGZpbGU9dGVtcDsKKyAgICBjbG9uZWQ9MTsKKyAgfQorICBlbHNlCisgICAgY2xvbmVkPTA7CisgIGxpc3Q9YWxsX2ludmVudG9yeShvYik7CisgIGZvciAoaT1zaXplb2YobGlzdCktMTtpPj0wO2ktLSkKKyAgICBpZiAobGlzdFtpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGxpc3RbaV0pKQorICAgIHsKKyAgICAgIGxpc3RbaV0tPm1vdmUoInJvb20vdm9pZCIsTV9UUE9SVCB8IE1fU0lMRU5UIHwgTV9OT19TSE9XIHwgTV9OT0NIRUNLKTsKKyAgICB9IGVsc2UKKyAgICAgIGxpc3RbaV09MDsKKyAgbGlzdC09KHswfSk7CisgIAorICBpZiAob2IpCisgIHsKKyAgICBSZW1vdmUob2IsMSk7CisgIH0KKyAgaWYgKGNsb25lZCkKKyAgeworICAgIGlmIChvYj1maW5kX29iamVjdChmaWxlKSkKKyAgICB7CisgICAgICBSZW1vdmUob2IsMSk7CisgICAgfQorICAgIGVycj1jYXRjaChvYj1jbG9uZV9vYmplY3QoZmlsZSkpOworICAgIGlmICghZXJyKQorICAgICAgb2ItPm1vdmUoZW52LE1fVFBPUlQgfCBNX1NJTEVOVCB8IE1fTk9fU0hPVyB8IE1fTk9DSEVDSyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXJyPWNhdGNoKGNhbGxfb3RoZXIoZmlsZSwiPz8/IikpOworICAgIGlmICghZXJyKQorICAgICAgb2I9ZmluZF9vYmplY3QoZmlsZSk7CisgICAgZWxzZQorICAgICAgb2I9MDsKKyAgfQorICBpZiAoIW9iKQorICB7CisgICAgd3JpdGUoIkVycm9yIGluIGxvYWRlZCBvYmplY3QuIFN0YXlpbmcgaW4gdm9pZCAuLi5cbiIpOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgZm9yIChpPXNpemVvZihsaXN0KS0xO2k+PTA7aS0tKQorICAgIGlmIChsaXN0W2ldKQorICAgICAgbGlzdFtpXS0+bW92ZShvYixNX1RQT1JUIHwgTV9TSUxFTlQgfCBNX05PX1NIT1cgfCBNX05PQ0hFQ0spOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgcmVjKHN0cmluZyBhcmcpCit7CisgIHJlY3Vyc2l2ZT0xOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgbm9yZWMoc3RyaW5nIGFyZykKK3sKKyAgcmVjdXJzaXZlPTA7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyByZWFkdmFyKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyByZXN0OworICBpbnQgbm87CisgIGlmIChzc2NhbmYoYXJnLCIlZCVzIixubyxyZXN0KSE9MiB8fCBubzwwIHx8IG5vPj1NQVhWQVJTKQorICB7CisgICAgZXJyPSJpbGxlZ2FsIHZhciBudW1iZXIiOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgaWYgKHZhcmFyZWFbbm9dKQorICAgIHB1c2godmFyYXJlYVtub10pOworICBlbHNlCisgICAgZXJyPSJ2YXIgIyIrbm8rIiBpcyBlbXB0eSI7CisgIHJldHVybiByZXN0OworfQorCitzdHJpbmcgd3JpdGV2YXIoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHJlc3Q7CisgIGludCBubzsKKyAgb2JqZWN0IG9iOworICBpZiAoc3NjYW5mKGFyZywiJWQlcyIsbm8scmVzdCkhPTIgfHwgbm88MCB8fCBubz49TUFYVkFSUykKKyAgeworICAgIGVycj0iaWxsZWdhbCB2YXIgbnVtYmVyIjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gcmVzdDsKKyAgdmFyYXJlYVtub109b2I7CisgIHJldHVybiByZXN0OworfQorCitzdHJpbmcgdmFycyhzdHJpbmcgYXJnKQoreworICBpbnQgaTsKKyAgZm9yIChpPTA7aTxNQVhWQVJTO2krKykKKyAgeworICAgIGlmICh2YXJhcmVhW2ldKQorICAgICAgd3JpdGUoIjwiK2krIjogIitkZXNjKHZhcmFyZWFbaV0pKyJcbiIpOworICB9CisgIHJldHVybiBhcmc7Cit9CisKK3ZvaWQgdmFuaXNoKCkKK3sKKyAvLyBSZW1vdmVBdXRvbG9hZCgpOworICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworfQorCittaXhlZCBydXNhZ2Uoc3RyaW5nIGFyZykKK3sKKyAgbWl4ZWQgKnJlc3VzYWdlOworICBpbnQgaSxqOworLyoKKyAgcmVzdXNhZ2U9KHttaXhlZCAqfSllZnVuOjpydXNhZ2UoKTsKKyAgZm9yIChpPTA7aTwxODtpKyspeworICAgIHdyaXRlKGFsaWduKCh7IlVzZXIgdGltZSIsIlN5c3RlbSB0aW1lIiwiTWF4IHJlcyBzZXQgc2l6ZSIsCisJCSAgIlBhZ2UgcmVjbGFpbXMiLCJQYWdlIGZhdWx0cyIsCisJCSAgIlVuc2hhcmVkIHN0YWNrIHNpemUiLAorCQkgICJTaGFyZWQgdGV4dCBzaXplIiwiVW5zaGFyZWQgZGF0YSBzaXplIiwKKwkJICAiU3lzdGVtIHN3YXBzIiwKKwkJICAiQmxvY2sgaW5wdXQgb3BlcmF0aW9ucyIsIkJsb2NrIG91dHB1dCBvcGVyYXRpb25zIiwKKwkJICAiTWVzc2FnZXMgc2VudCIsIk1lc3NhZ2VzIHJlY2VpdmVkIiwiU2lnbmFscyByZWNlaXZlZCIsCisJCSAgIlZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzIiwiSW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyIsCisJCSAgIlRvdGFsIGludGVybmV0IHBhY2tldHMiLCJUb3RhbCBpbnRlcm5ldCBieXRlcyJ9KVtpXSwKKwkJNDApKyI6ICIrcmVzdXNhZ2VbaV0rIlxuIik7CisgIH0KKyAgcmV0dXJuIGFyZzsKKyAgKi8KKyAgcmV0dXJuICh7fSk7Cit9CisKK3N0cmluZyBhbGlnbihzdHJpbmcgcyxpbnQgeCl7CisgIHJldHVybiAocysiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIilbMC4ueC0xXTsKK30KKworc3RhdGljIHN0cmluZyBzd2hvKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCAqdXNlcmxpc3QsIHNub29wZXIsIGZvdW5kO21peGVkIGFjdGl2ZTsKKyAgaW50IGksaixkb25lOworCisgIGlmIChnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkhPWdldGV1aWQoKSkgcmV0dXJuIGFyZzsKKyAgdXNlcmxpc3Q9dXNlcnMoKTsKKyAgYWN0aXZlPSh7fSk7CisgIGZvciAoaT1zaXplb2YodXNlcmxpc3QpLTE7aT49MDtpLS0pCisgICAgaWYgKHNub29wZXI9cXVlcnlfc25vb3AodXNlcmxpc3RbaV0pKQorICAgIHsKKyAgICAgIGlmIChtZW1iZXIoYWN0aXZlLHNub29wZXIpPT0tMSkKKwlhY3RpdmUrPSh7c25vb3Blcn0pOworICAgICAgaWYgKG1lbWJlcihhY3RpdmUsdXNlcmxpc3RbaV0pPT0tMSkKKwlhY3RpdmUrPSh7dXNlcmxpc3RbaV19KTsKKyAgICB9CisgIGlmICghc2l6ZW9mKGFjdGl2ZSkpCisgIHsKKyAgICBwcmludGYoIktlaW5lIGFrdGl2ZW4gU25vb3BzLlxuIik7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBmb3IgKGk9c2l6ZW9mKGFjdGl2ZSktMTtpPj0wO2ktLSkKKyAgICBhY3RpdmVbaV09KHthY3RpdmVbaV19KTsKKyAgZm9yIChpPXNpemVvZihhY3RpdmUpLTE7aT49MDtpLS0pCisgICAgaWYgKHBvaW50ZXJwKGFjdGl2ZVtpXSkmJnNub29wZXI9cXVlcnlfc25vb3AoYWN0aXZlW2ldWzBdKSkKKyAgICB7CisgICAgICBkb25lPTA7CisgICAgICBmb3IgKGo9c2l6ZW9mKGFjdGl2ZSktMTtqPj0wICYmICFkb25lO2otLSkKKwlpZiAocG9pbnRlcnAoYWN0aXZlW2pdKSAmJiBhY3RpdmVbal1bc2l6ZW9mKGFjdGl2ZVtqXSktMV09PXNub29wZXIpCisJeworCSAgYWN0aXZlW2pdKz1hY3RpdmVbaV07CisJICBhY3RpdmVbaV09MDsKKwkgIGRvbmU9MTsKKwl9CisgICAgfQorICBhY3RpdmUtPSh7MH0pOworICBmb3IgKGk9MDtpPHNpemVvZihhY3RpdmUpO2krKykKKyAgeworICAgIGZvciAoaj0wO2o8c2l6ZW9mKGFjdGl2ZVtpXSk7aisrKQorICAgICAgcHJpbnRmKCIlcyVzIiwoaj09MD8iIjoiIC0+ICIpLGNhcGl0YWxpemUoZ2V0dWlkKGFjdGl2ZVtpXVtqXSkpKTsKKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIHRpbWVmKGludCBzZWMpCit7CisgIHN0cmluZyBzOworCisgIHM9IiI7CisgIGlmIChzZWM+PTg2NDAwKQorICAgIHMrPXNwcmludGYoIiVkIGQsICIsc2VjLzg2NDAwKTsKKyAgaWYgKHNlYz4zNjAwKQorICAgIHMrPXNwcmludGYoIiVkIGgsICIsKHNlYy8zNjAwKSUyNCk7CisgIGlmIChzZWM+NjApCisgICAgcys9c3ByaW50ZigiJWQgbSwgIiwoc2VjLzYwKSU2MCk7CisgIHJldHVybiBzK3NwcmludGYoIiVkIHMiLHNlYyU2MCk7Cit9CisKK3N0cmluZyBpZGxlKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgaW50IGk7CisKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIHdyaXRlKGNhcGl0YWxpemUob2ItPm5hbWUoV0VSKSkrIiAiKTsKKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgeworICAgIHdyaXRlKCJpc3Qga2VpbiBlY2h0ZXIgU3BpZWxlci5cbiIpOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgaWYgKCFxdWVyeV9pcF9udW1iZXIob2IpKQorICB7CisgICAgd3JpdGUoImlzdCBuZXR6dG90LlxuIik7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBwcmludGYoImlzdCBpZGxlIHNlaXQgJWQgU2VrdW5kZW4iLGk9cXVlcnlfaWRsZShvYikpOworICBpZiAoaT42MCkKKyAgICBwcmludGYoIiAoJXMpXG4iLHRpbWVmKGkpKTsKKyAgZWxzZQorICAgIHdyaXRlKCJcbiIpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgc3RhdChzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIG1hcHBpbmcgcXVlc3RzOworICBtaXhlZCBzdGF0cywgKmFyciwgdG1wLHRtcDIsIGxpc3Q7CisgIHN0cmluZyB0aXRlbCwgbGV2ZWwsIHN0YXRfc3RyLHdlYXBvbixhcm1vdXI7CisgIGludCBwbDsKKyAgaW50IGk7CisgIAorICBvYj1wb3AoKTsKKyAgaWYgKGVycikKKyAgICByZXR1cm4gYXJnOworICAKKyAgdGl0ZWw9b2ItPlF1ZXJ5UHJvcChQX1RJVExFKTsKKyAgaWYgKCEocGw9cXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpKQorICAgIGxldmVsPSJNb25zdGVyPSIrb2xkX2V4cGxvZGUob2JqZWN0X25hbWUob2IpLCIjIilbMF07CisgIGVsc2UKKyAgICBpZiAoSVNfR09EKG9iKSkKKyAgICAgIGxldmVsPSJNdWQtR290dCI7CisgICAgZWxzZSBpZiAoSVNfQVJDSChvYikpCisgICAgICBsZXZlbD0iRXJ6bWFnaWVyIjsKKyAgICBlbHNlIGlmIChJU19FTERFUihvYikpCisgICAgICBsZXZlbD0iV2Vpc2VyIjsKKyAgICBlbHNlIGlmIChJU19MT1JEKG9iKSkKKyAgICAgIGxldmVsPSJSZWdpb25zbWFnaWVyIjsKKyAgICBlbHNlIGlmIChJU19ET01BSU5NRU1CRVIob2IpKQorICAgICAgbGV2ZWw9IlJlZ2lvbnNtaXRnbGllZCI7CisgICAgZWxzZSBpZiAoSVNfV0laQVJEKG9iKSkKKyAgICAgIGxldmVsPSJNYWdpZXIiOworICAgIGVsc2UgaWYgKElTX0xFQVJORVIob2IpKQorICAgICAgbGV2ZWw9IkxlaHJsaW5nIjsKKyAgICBlbHNlIGlmIChJU19TRUVSKG9iKSkKKyAgICAgIGxldmVsPSJTZWhlciI7CisgICAgZWxzZSBsZXZlbD0iU3BpZWxlciI7CisgIGlmIChJU19ET01BSU5NRU1CRVIob2IpKQorICAgIGZvciAodG1wPSJzZWN1cmUvbWFzdGVyIi0+Z2V0X2RvbWFpbl9ob21lcyhnZXRldWlkKG9iKSk7CisJIHNpemVvZih0bXApO3RtcD10bXBbMS4uXSkKKyAgICAgIGxldmVsKz0iLSIrY2FwaXRhbGl6ZSh0bXBbMF0pOworICBpZiAocGwpCisgIHsKKyAgICBpZiAoIWludGVyYWN0aXZlKG9iKSkKKyAgICAgIGxldmVsKz0iLCBuZXR6dG90IjsKKyAgICBlbHNlCisgICAgICBpZiAocXVlcnlfaWRsZShvYik+NjAwKQorCWxldmVsKz0iLCBpZGxlIjsKKyAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0dIT1NUKSkKKyAgICAgIGxldmVsKz0iLCB0b3QiOworICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfSU5WSVMpKQorICAgICAgbGV2ZWwrPSIsIHVuc2ljaHRiYXIiOworICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfRlJPRykpCisgICAgICBsZXZlbCs9IiwgZ3J1ZW4gdW5kIGdsaXRzY2hpZyI7CisgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkKKyAgICAgIGxldmVsKz0iLCBUZXN0c3BpZWxlciI7CisgIH0KKyAgdG1wPW9iLT5RdWVyeVByb3AoUF9QUkVTQVkpOworICBpZiAodG1wICYmIHRtcCE9IiIpCisgICAgdG1wPXRtcCsiICI7CisgIGVsc2UKKyAgICB0bXA9IiI7CisgIHRtcDI9b2ItPlF1ZXJ5UHJvcChQX1JBQ0UpOworICBpZighdG1wMikKKyAgICB0bXAyPSJEaW5nc2RhIjsKKyAgYXJyPW9iLT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgaWYgKHBvaW50ZXJwKGFycikpIGFycj1hcnJbMF07CisgIHByaW50ZigiJXMlcyAlcyAoJXMpWyVzXS5cblxuIix0bXB8fCIiLGFycnx8IiIsdGl0ZWx8fCIiLAorCSB0bXAyfHwiPz8iLGxldmVsfHwiPz8iKTsKKyAgaWYgKHBsKQorICAgIHByaW50ZigiICAgICAgICBBbHRlciA6ICVzLiVzXG4iLAorCSAgIHRpbWVmKDIqb2ItPlF1ZXJ5UHJvcChQX0FHRSkpLAorCSAgICh0bXA9b2ItPlF1ZXJ5UHJvcChQX01BUlJJRUQpKT8KKwkgICAoIlZlcmhlaXJhdGV0IG1pdCAiK2NhcGl0YWxpemUodG1wKSsiLiIpOiIiKTsKKyAgZWxzZQorICAgIHByaW50ZigiICAgIEFnZ3Jlc3NpdiA6ICU0cyAgICAgICAgICBHZXNwcmFlY2hpZyA6ICVkJSVcbiIsCisJICAgb2ItPlF1ZXJ5UHJvcChQX0FHR1JFU1NJVkUpPyAiSmEiIDogIk5laW4iLCAKKwkgICBvYi0+UXVlcnlQcm9wKFBfQ0hBVF9DSEFOQ0UpKSA7CisgIHByaW50ZigiIExlYmVuc3B1bmt0ZSA6IFslNGQvJTRkXSAgIE1hZ2llcHVua3RlIDogWyU0ZC8lNGRdICAgIiArCisJICJFcmZhaHJ1bmcgOiAlZFxuIiwKKwkgb2ItPlF1ZXJ5UHJvcChQX0hQKSwgb2ItPlF1ZXJ5UHJvcChQX01BWF9IUCksIAorCSBvYi0+UXVlcnlQcm9wKFBfU1ApLCBvYi0+UXVlcnlQcm9wKFBfTUFYX1NQKSwgCisJIG9iLT5RdWVyeVByb3AoUF9YUCkpOworICBwcmludGYoIiAgICAgIE5haHJ1bmcgOiBbJTNkLyVkXSAgICBGbHVlc3NpZ2tlaXQgOiBbJTNkLyVkXSAgICAgICAiICsKKwkgIkFsa29ob2wgOiBbJTNkLyVkXVxuIiwKKwkgb2ItPlF1ZXJ5UHJvcChQX0ZPT0QpLCBvYi0+UXVlcnlQcm9wKFBfTUFYX0ZPT0QpLAorCSBvYi0+UXVlcnlQcm9wKFBfRFJJTkspLCBvYi0+UXVlcnlQcm9wKFBfTUFYX0RSSU5LKSwKKwkgb2ItPlF1ZXJ5UHJvcChQX0FMQ09IT0wpLCBvYi0+UXVlcnlQcm9wKFBfTUFYX0FMQ09IT0wpKSA7CisgIHN3aXRjaChvYi0+UXVlcnlQcm9wKFBfR0VOREVSKSkgIHsKKyAgICBjYXNlIEZFTUFMRSA6IHRtcDIgPSAid2VpYmxpY2ggIiA7IGJyZWFrIDsKKyAgICBjYXNlIE1BTEUgICA6IHRtcDIgPSAibWFlbm5saWNoIiA7IGJyZWFrIDsKKyAgICBkZWZhdWx0ICAgICA6IHRtcDIgPSAiYm9pbmdpc2NoIiA7IGJyZWFrIDsKKyAgfQorICBwcmludGYoIiAgIEdlc2NobGVjaHQgOiAlcyAgICAgICBDaGFyYWt0ZXIgOiAlLTVkICAgICAgICAgICAgIFN0dWZlIDogJS0zZFxuIiwKKwkgdG1wMiwgb2ItPlF1ZXJ5UHJvcChQX0FMSUdOKSwgb2ItPlF1ZXJ5UHJvcChQX0xFVkVMKSkgOworICBzdGF0cyA9IG9iLT5RdWVyeVByb3AoUF9BVFRSSUJVVEVTKSA7CisJaWYgKCFtYXBwaW5ncChzdGF0cykpIHN0YXRzPShbXSk7CisgIHRtcCAgPSBtX2luZGljZXMoc3RhdHMpOyB0bXAyID0gbV92YWx1ZXMoc3RhdHMpOyBzdGF0X3N0ciA9ICIiIDsKKyAgZm9yKDsgc2l6ZW9mKHRtcCk7IHRtcD10bXBbMS4uXSx0bXAyPXRtcDJbMS4uXSkKKyAgICBzdGF0X3N0ciArPSAodG1wWyAwIF0gKyAiWyIgKyB0bXAyWyAwIF0gKyAiXSAiKSA7CisgIAorICBpZihzdGF0X3N0ciA9PSAiIikKKyAgICBzdGF0X3N0ciA9ICJLZWluZSIgOworICBlbHNlCisgICAgc3RhdF9zdHIgPSBzdGF0X3N0clswLi48Ml07CisgIAorICBwcmludGYoIiAgICAgICAgIEdlbGQgOiAlLTlkICAgICAgICAgICBTdGF0aSA6ICVzXG5cbiIsIG9iLT5RdWVyeU1vbmV5KCksCisJIHN0YXRfc3RyKSA7CisgIAorICB3ZWFwb24gPSAiS2VpbmUiIDsgYXJtb3VyID0gIiIgOworICBmb3IodG1wPWFsbF9pbnZlbnRvcnkob2IpOyBzaXplb2YodG1wKTsgdG1wPXRtcFsxLi5dKQorICB7CisgICAgaWYodG1wWyAwIF0tPlF1ZXJ5UHJvcChQX1dJRUxERUQpKSAvLyBnZXp1ZWNrdGUgV2FmZmUKKyAgICAgIHdlYXBvbiA9ICh0bXBbIDAgXS0+bmFtZShXRVIpKSArICIgKCIgKworICAgICAgICAgb2xkX2V4cGxvZGUob2JqZWN0X25hbWUodG1wWyAwIF0pLCIjIilbMF0gKyAiKVsiICsKKyAgICAgICAgIHRtcFsgMCBdLT5RdWVyeVByb3AoUF9XQykgKyAiXSIgOworCisgICAgaWYodG1wWyAwIF0tPlF1ZXJ5UHJvcChQX1dPUk4pKSAgIC8vIGdldHJhZ2VuZSBSdWVzdHVuZworICAgICAgYXJtb3VyICs9ICh0bXBbIDAgXS0+bmFtZShXRVIpKSArICJbIiArCisgICAgICAgICAgdG1wWyAwIF0tPlF1ZXJ5UHJvcChQX0FDKSArICJdIiArCisgICAgIiwgIiA7CisgIH0KKworICBpZihhcm1vdXIgPT0gIiIpCisgICAgYXJtb3VyID0gIktlaW5lIiA7CisgIGVsc2UKKyAgeworICAgIHRtcCA9IG9sZF9leHBsb2RlKGJyZWFrX3N0cmluZyhhcm1vdXJbMC4uc2l6ZW9mKGFybW91cikgLSAzXSwKKwkJCSAgICAgICA2MyksICJcbiIpIDsKKyAgICBhcm1vdXIgPSB0bXBbIDAgXSA7CisgICAgdG1wPXRtcFsxLi5dOworICAgIGZvciAoO3NpemVvZih0bXApOyB0bXA9dG1wWzEuLl0pCisgICAgICBhcm1vdXIgKz0gIlxuICAgICAgICAgICAgICAgICIgKyB0bXBbIDAgXSA7CisgIH0KKyAgCisgIHByaW50ZigiICAgV2FmZmUoJTNkKSA6ICVzXG5SdWVzdHVuZyglM2QpIDogJXNcbiIsCisJIG9iLT5RdWVyeVByb3AoUF9UT1RBTF9XQyksIHdlYXBvbiwKKwkgb2ItPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKSwgYXJtb3VyKSA7CisgIAorICBsaXN0ID0gb2ItPlF1ZXJ5RW5lbWllcygpOworICBpZiAocG9pbnRlcnAobGlzdCkpIAorICB7CisgICAgbGlzdD1saXN0WzBdOworICAgIHRtcDIgPSAiIiA7CisgICAgZm9yKGk9c2l6ZW9mKGxpc3QpLTEgOyBpPj0wO2ktLSkKKyAgICAgIGlmIChvYmplY3RwKGxpc3RbaV0pKQorICAgICAgICB0bXAyICs9IChsaXN0WyBpIF0tPm5hbWUoV0VSKSArICIsICIpIDsKKyAgICBpZih0bXAyICE9ICIiKQorICAgICAgcHJpbnRmKCIgICAgICAgRmVpbmRlIDogJXMuXG4iLCB0bXAyWzAuLjwzXSk7CisgIH0KKyAgCisgIC8vIDguWmVpbGUgOiBHZWxvZXN0ZSBBdWZnYWJlbgorICBpZihwbCkKKyAgeworICAgIHByaW50ZiggYnJlYWtfc3RyaW5nKCAKKyAgICAgICAgICAgICAgQ291bnRVcChtX2luZGljZXMob2ItPlF1ZXJ5UHJvcChQX1FVRVNUUykpKSwgCisgICAgICAgICAgICAgIDc1LAorICAgICAgICAgICAgICAiICAgICBBdWZnYWJlbiA6ICIsCisgICAgICAgICAgICAgIEJTX0lOREVOVF9PTkNFKSk7CisgICAgaWYoKCh0bXAyID0gb2ItPlF1ZXJ5UHJvcChQX01BSUxBRERSKSkgIT0gIm5vbmUiKSAmJiB0bXAyICYmCisgICAgICAgKHRtcDIgIT0gIiIpKQorICAgICAgdG1wMiA9ICIgKCIgKyB0bXAyICsgIikiIDsKKyAgICBlbHNlCisgICAgICB0bXAyID0gIiIgOworICB9CisgIGVsc2UKKyAgICB0bXAyID0gIiIgOworCisgIGlmKGVudmlyb25tZW50KG9iKSkKKyAgICBwcmludGYoIiAgIEF1ZmVudGhhbHQgOiAlcyVzLlxuIiwKKwkgICBvbGRfZXhwbG9kZShvYmplY3RfbmFtZShlbnZpcm9ubWVudChvYikpLCIjIilbMF0sIHRtcDIpIDsKKworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgc2NhbihzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIG1peGVkIHRtcCx0bXAyLHRtcDM7CisgIGludCBpOworCisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgICAgcHJpbnRmKCJTcGllbGVyOiAlcywgTGV2ZWw6ICVkLCBXaXpsZXZlbDogJWRcbiIsCisJICAgY2FwaXRhbGl6ZShnZXR1aWQob2IpKSwgb2ItPlF1ZXJ5UHJvcChQX0xFVkVMKSwKKwkgICBxdWVyeV93aXpfbGV2ZWwob2IpKTsKKyAgZWxzZQorICAgIHByaW50ZigiTW9uc3RlciwgVUlEOiAlcywgRVVJRDogJXMsIExldmVsOiAlZFxuIiwKKwkgICBnZXR1aWQob2IpLCAoZ2V0ZXVpZChvYik/Z2V0ZXVpZChvYik6IjAiKSwgb2ItPlF1ZXJ5UHJvcChQX0xFVkVMKSk7CisgIHRtcD1vYi0+c2hvcnQoKTsKKyAgaWYgKCFzdHJpbmdwKHRtcCl8fCFzaXplb2YodG1wKSkKKyAgICB0bXA9c3ByaW50ZigiKCVzICVzICVzICVzKSIsb2ItPlF1ZXJ5UHJvcChQX1BSRVNBWSkrIiIsCisJCW9iLT5RdWVyeVByb3AoUF9OQU1FKSsiIixvYi0+UXVlcnlQcm9wKFBfVElUTEUpKyIiLAorCQkoaW50ZXJhY3RpdmUob2IpPyIiOiIobmV0enRvdCIpKTsKKyAgZWxzZQorICAgIHRtcD10bXBbMC4uPDNdOworICBwcmludGYoIiVzLCBSYXNzZTogJXNcbiIsdG1wLCAiIitvYi0+UXVlcnlQcm9wKFBfUkFDRSkpOworICBwcmludGYoIlN0YXRzOiAgICAiKTsKKyAgdG1wPW9iLT5RdWVyeVByb3AoUF9BVFRSSUJVVEVTKTsKKyAgdG1wMz1vYi0+UXVlcnlQcm9wKFBfQVRUUklCVVRFU19PRkZTRVRTKTsKKyAgaWYgKCF0bXApCisgICAgcHJpbnRmKCJrZWluZVxuIik7CisgIGVsc2UKKyAgeworICAgIHRtcDI9bV9pbmRpY2VzKHRtcCk7CisgICAgZm9yIChpPTA7aTxzaXplb2YodG1wMik7aSsrKQorCXsKKyAgICAgIHByaW50ZigiJXMlczogJWQiLChpPjA/IiwgIjoiIiksdG1wMltpXSx0bXBbdG1wMltpXV0pOworCSAgaWYgKHRtcDNbdG1wMltpXV0pCisJICAgIHByaW50ZigiJStkIix0bXAzW3RtcDJbaV1dKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHByaW50ZigiUnVlc3R1bmc6ICUtNmQgICAgV2FmZmVuOiAlLTZkICAgICAgVm9yc2ljaHQ6ICUtNmQgICBHZXNjaGxlY2h0OiAiLAorCSBvYi0+UXVlcnlQcm9wKFBfVE9UQUxfQUMpLG9iLT5RdWVyeVByb3AoUF9UT1RBTF9XQyksCisJIG9iLT5RdWVyeVByb3AoUF9XSU1QWSkpOworICBpZiAoISh0bXA9b2ItPlF1ZXJ5UHJvcChQX0dFTkRFUikpKQorICAgIHByaW50ZigiTlxuIik7CisgIGVsc2UKKyAgeworICAgIGlmICh0bXA9PTIpCisgICAgICBwcmludGYoIkZcbiIpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiTVxuIik7CisgIH0KKyAgaWYgKHRtcD1vYi0+UXVlcnlQcm9wKFBfTUFSUklFRCkpCisgICAgcHJpbnRmKCJWZXJoZWlyYXRldCBtaXQgJXMuXG4iLGNhcGl0YWxpemUodG1wKSk7CisgIHByaW50ZigiTGViZW5zcHVua3RlOiAlNGQgWyU0ZF0sIE1hZ2llcHVua3RlOiAlNGQgWyU0ZF0sIEVyZjogJS04ZFxuIiwKKwkgb2ItPlF1ZXJ5UHJvcChQX0hQKSwgb2ItPlF1ZXJ5UHJvcChQX01BWF9IUCksIAorCSBvYi0+UXVlcnlQcm9wKFBfU1ApLCBvYi0+UXVlcnlQcm9wKFBfTUFYX1NQKSwKKwkgb2ItPlF1ZXJ5UHJvcChQX1hQKSk7CisgIGlmIChsaXZpbmcob2IpKQorICB7CisgICAgdG1wPXByZXNlbnQoImdlbGQiLG9iKTsKKyAgICBpZiAodG1wKQorICAgICAgdG1wPXRtcC0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKyAgICBwcmludGYoIlRyYWVndCAlNmQgKCU2ZCkgZy4gRWlnZW5nZXdpY2h0ICU2ZCBnLiAlNmQgTXVlbnplbi5cbiIsCisJICAgb2ItPnF1ZXJ5X3dlaWdodF9jb250ZW50cygpLG9iLT5RdWVyeVByb3AoUF9NQVhfV0VJR0hUKSwKKwkgICBvYi0+UXVlcnlQcm9wKFBfV0VJR0hUKSx0bXApOworICAgIGlmICh0bXA9b2ItPlNlbGVjdEVuZW15KCkpCisgICAgICBwcmludGYoIkthZW1wZnQgZ2VnZW4gJXMgWyVPXVxuIix0bXAtPm5hbWUoV0VOKSx0bXApOworICB9CisgIHByaW50ZigiRU5WOiAlcyIsCisJICgodG1wPWVudmlyb25tZW50KG9iKSk/b2JqZWN0X25hbWUodG1wKToiLSBmYWJyaWMgb2Ygc3BhY2UgLSIpKTsKKyAgaWYocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgIHsKKyAgICBwcmludGYoIiwgRU1haWw6ICVzXG4iLCBvYi0+UXVlcnlQcm9wKFBfTUFJTEFERFIpKyIiKTsKKyAgICB0bXA9Ii9zZWN1cmUvbWFzdGVyIi0+ZmluZF91c2VyaW5mbyhnZXR1aWQob2IpKTsKKyAgICBpZiAocG9pbnRlcnAodG1wKSAmJiBzaXplb2YodG1wKT5VU0VSX0RPTUFJTikKKyAgICB7CisgICAgICB0bXA9dG1wW1VTRVJfRE9NQUlOXTsKKyAgICAgIGlmIChwb2ludGVycCh0bXApICYmIHNpemVvZih0bXApKQorICAgICAgeworCXByaW50ZigiTG9yZCBpbjogIik7CisJZm9yICh0bXAyPTA7dG1wMjxzaXplb2YodG1wKTt0bXAyKyspCisJICBwcmludGYoIiVzJXMiLCh0bXAyPjA/IiwgIjoiIiksIiIrdG1wW3RtcDJdKTsKKwlwcmludGYoIi5cbiIpOworICAgICAgfQorICAgIH0KKyAgICB0bXA9Ii9zZWN1cmUvbWFzdGVyIi0+Z2V0X2RvbWFpbl9ob21lcyhnZXR1aWQob2IpKTsKKyAgICBpZiAocG9pbnRlcnAodG1wKSYmc2l6ZW9mKHRtcCk+MCkKKyAgICB7CisgICAgICBwcmludGYoIk1pdGdsaWVkIGluOiAiKTsKKyAgICAgIGZvciAodG1wMj0wO3RtcDI8c2l6ZW9mKHRtcCk7dG1wMisrKQorICAgICAJcHJpbnRmKCIlcyVzIiwodG1wMj4wPyIsICI6IiIpLCIiK3RtcFt0bXAyXSk7CisgICAgICBwcmludGYoIi5cbiIpOworICAgIH0KKyAgICBwcmludGYoIlF1ZXN0czogIik7CisgICAgdG1wPW9iLT5RdWVyeVByb3AoUF9RVUVTVFMpOworICAgIGlmICh0bXA9PSh7fSl8fCFwb2ludGVycCh0bXApKQorICAgICAgcHJpbnRmKCJLZWluZS5cbiIpOworICAgIGVsc2UKKyAgICB7CisgICAgICB0bXAyPSIiOworICAgICAgdG1wLT0oeyh7fSksMH0pOworICAgICAgZm9yIChpPTA7IGk8c2l6ZW9mKHRtcCk7IGkrKykKKwl0bXAyKz1zcHJpbnRmKCIlcyVzIiwoaT8iLCAiOiIiKSx0bXBbaV1bMF0pOworICAgICAgdG1wPWJyZWFrX3N0cmluZyh0bXAyLDc5LDgpOworICAgICAgdG1wPXRtcFs4Li5dOworICAgICAgcHJpbnRmKCIlcyIsdG1wKTsKKyAgICB9CisgICAgcHJpbnRmKCJQS2lsbHM6ICVkICIsb2ItPlF1ZXJ5UHJvcChQX0tJTExTKSk7CisgICAgcHJpbnRmKCIsIFF1ZXN0UG9pbnRzOiAlZCAoJWQvJWQpLCBBbHRlcjogJXNcbiIsb2ItPlF1ZXJ5UHJvcChQX1FQKSxvYi0+UXVlcnlQcm9wKFBfTkVFREVEX1FQKSxRTS0+UXVlcnlNYXhRUCgpLHRpbWVmKDIqb2ItPlF1ZXJ5UHJvcChQX0FHRSkpKTsKKyAgICBpZiAoaW50ZXJhY3RpdmUob2IpKQorICAgIHsKKyAgICAgIHByaW50ZigiRnJvbTogJXMgKCVzKSBbJXNdXG4iLHF1ZXJ5X2lwX25hbWUob2IpLHF1ZXJ5X2lwX251bWJlcihvYiksY291bnRyeShxdWVyeV9pcF9uYW1lKG9iKSkpOworICAgICAgdG1wPXF1ZXJ5X2lkbGUob2IpOworICAgICAgcHJpbnRmKCJJZGxlIHNlaXQgJWQgU2VrdW5kZW4iLHRtcCk7CisgICAgICBpZiAodG1wPjYwKQorICAJcHJpbnRmKCIgKCVzKSIsdGltZWYodG1wKSk7CisJCQlwcmludGYoIiwgY21kIGF2ZzogJWQiLG9iLT5RdWVyeVByb3AoImNvbW1hbmRfYXZlcmFnZSIpKTsKKyAgICAgIHByaW50ZigiLCBub2NoICVkIFpUIHp1IGZpbmRlbi5cbkdlc25vb3BlZCB2b246ICVzXG4iLAorCSAgICAgKCh0bXA9b2ItPlF1ZXJ5UHJvcChQX1BPVElPTlJPT01TKSk/c2l6ZW9mKHRtcCk6MCksCisJICAgICAoKHRtcD1xdWVyeV9zbm9vcChvYikpP2NhcGl0YWxpemUoZ2V0dWlkKHRtcCkpOiJOaWVtYW5kZW0iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXA9Z2V0dWlkKG9iKTsKKyAgICAgIHRtcD1maWxlX3RpbWUoInNhdmUvIit0bXBbMC4uMF0rIi8iK3RtcCsiLm8iKTsKKyAgICAgIHRtcD10aW1lKCktdG1wOworICAgICAgcHJpbnRmKCJLYW0gdm9uOiAlcywgdm9yOiAlZCBzKCVzKVxuIiwKKwkgICAgIG9iLT5RdWVyeVByb3AoUF9DQUxMRURfRlJPTV9JUCksdG1wLHRpbWVmKHRtcCkpOyAgCisgICAgfQorICB9CisgIGVsc2UKKyAgICBwcmludGYoIlxuIik7CisgIHJldHVybiBhcmc7Cit9CisKK21peGVkIGRpbmZvKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKworICBvYj1wb3AoKTsKKyAgaWYgKCFvYikKKyAgICByZXR1cm4gMTsKKyAgZGVidWdfaW5mbygwLG9iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworbWl4ZWQgbWluZm8oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworCisgIG9iPXBvcCgpOworICBpZiAoIW9iKQorICAgIHJldHVybiAxOworICBkZWJ1Z19pbmZvKDEsb2IpOworICByZXR1cm4gYXJnOworfQorCit2b2lkIGR1bXBfbGlzdChtaXhlZCB3aGF0KQoreworICBpbnQgaSxzOworCisgIGlmICghcG9pbnRlcnAod2hhdCl8fCEocz1zaXplb2Yod2hhdCkpKQorICAgIHJldHVybjsKKyAgZm9yIChpPTA7aTxzO2krKykKKyAgICB3cml0ZSh3aGF0W2ldKTsKK30KKworc3RyaW5nIGNhbGxvdXQoc3RyaW5nIGFyZ3MpCit7CisgIGR1bXBfbGlzdChnZXRfY2FsbG91dCgpKTsKKyAgcmV0dXJuIGFyZ3M7Cit9CisKK3N0cmluZyBoZWFydGJlYXQoc3RyaW5nIGFyZ3MpCit7CisgIGR1bXBfbGlzdChnZXRfaGVhcnRiZWF0KCkpOworICByZXR1cm4gYXJnczsKK30KKworc3RyaW5nIGR1bXBsaXN0cyhzdHJpbmcgYXJncykKK3sKKyAgc3RyaW5nIGZpbGVuOworICBzdHJpbmcgKmxpc3Q7CisgIGludCBpLHM7CisKKyAgaWYgKCFnZXRldWlkKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBhcmdzOworICBmaWxlbj0iL3BsYXllcnMvIitnZXRldWlkKHRoaXNfb2JqZWN0KCkpKyIvTElTVFMuTFVQRSI7CisgIHdyaXRlKCJEdW1waW5nIHRvICIrZmlsZW4rIiAuLi4gIik7CisgIGlmIChmaWxlX3NpemUoZmlsZW4pPj0wKQorICAgIHJtKGZpbGVuKTsKKyAgd3JpdGVfZmlsZShmaWxlbiwiT0JKRUNUIFdJVEggQUNUSVZFIEhFQVJUX0JFQVQ6XG4iKTsKKyAgbGlzdD1nZXRfaGVhcnRiZWF0KCk7CisgIGlmICghbGlzdCB8fCAhKHM9c2l6ZW9mKGxpc3QpKSkKKyAgICB3cml0ZV9maWxlKGZpbGVuLCJOT05FXG4iKTsKKyAgZm9yIChpPTA7aTxzO2krKykKKyAgICB3cml0ZV9maWxlKGZpbGVuLGxpc3RbaV0pOworICB3cml0ZV9maWxlKGZpbGVuLCJcblxuUlVOTklORyBDQUxMX09VVFM6XG4iKTsKKyAgbGlzdD1nZXRfY2FsbG91dCgpOworICBpZiAoIWxpc3QgfHwgIShzPXNpemVvZihsaXN0KSkpCisgICAgd3JpdGVfZmlsZShmaWxlbiwiTk9ORVxuIik7CisgIGZvciAoaT0wO2k8cztpKyspCisgICAgd3JpdGVfZmlsZShmaWxlbixsaXN0W2ldKTsKKyAgd3JpdGUoImRvbmUuXG4iKTsKKyAgcmV0dXJuIGFyZ3M7Cit9CisKK21peGVkIHJlbmV3X3BsYXllcihzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisKKyAgb2I9cG9wKCk7CisgIGlmICghb2IpCisgICAgcmV0dXJuIDE7CisgIGlmICghb2JqZWN0cChvYikmJiFpbnRlcmFjdGl2ZShvYikpCisgIHsKKyAgICBlcnI9ZGVzYyhvYikrIiBpcyBub3QgYW4gaW50ZXJhY3RpdmUgcGxheWVyIjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGlmICgoZXJyPSIvc2VjdXJlL21hc3RlciItPnJlbmV3X3BsYXllcl9vYmplY3Qob2IpKTwwKQorICAgIGVycj0iZXJyb3IgIitlcnIrIiB3aGVuIHJlbmV3aW5nICIrZGVzYyhvYik7CisgIHJldHVybiBhcmc7Cit9CisKK21peGVkIGNvcHlfbGRmaWVkKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYiwgbmV3OworICBtYXBwaW5nIHByb3BzOworCisgIG9iPXBvcCgpOworICBpZiAoIW9iKQorICAgIHJldHVybiAxOworICBpZiAoIW9iamVjdHAob2IpKQorICB7CisgICAgZXJyPWRlc2Mob2IpKyIgaXMgbm90IGFuIHZhbGlkIG9iamVjdCI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBuZXc9Y2xvbmVfb2JqZWN0KG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdKTsKKyAgcHJvcHM9b2ItPlF1ZXJ5UHJvcGVydGllcygpOworICBuZXctPlNldFByb3BlcnRpZXMob2ItPlF1ZXJ5UHJvcGVydGllcygpKTsKKyAgcHVzaChuZXcpOworICBuZXctPm1vdmUodGhpc19wbGF5ZXIoKSxNX05PQ0hFQ0spOworICByZXR1cm4gYXJnOworfQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbHVwZS5kb2MgYi9vYmovdG9vbHMvbHVwZS5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzOTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9sdXBlLmRvYwpAQCAtMCwwICsxLDE0MCBAQAorVGhlIGxlbnMgb2JqZWN0IHVzZXMgYSBzdGFjayB0byBtYW5pcHVsYXRlIG9iamVjdHMuIFNvbWUgY29tbWFuZHMgcHVzaCBvYmplY3RzCitvbiB0aGUgc3RhY2ssIHNvbWUgcG9wIHRoZW0gYWdhaW4gb2ZmIHRoZSBzdGFjayBhbmQgdXNlIHRoZW0gZm9yIHZhcmlvdXMKK3B1cnBvc2VzLiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSBzaW5nbGUgbGluZSwgc2VwYXJhdGVkIGJ5CitzcGFjZXMuIFRoZSBudW1iZXIgb2Ygc3BhY2VzIGJldHdlZW4gY29tbWFuZHMgb3IgYmV0d2VlbiBjb21tYW5kcyBhbmQKK2FyZ3VtZW50cyBpcyBub3QgY3JpdGljYWwsIGkuZS4gdGhlcmUgbWF5IGFsc28gYmUgdHdvIG9yIG1vcmUgc3BhY2VzLgorCitOb3RhdGlvbjoKKwk8YXJnPgk6IGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB3aGljaCBkb2Vzbid0IGNvbnRhaW4gc3BhY2VzIG9yCisJCSAgZG90cy4gSWYgaXQgZG9lcywgdXNlICIuLi4iLCAnLi4uJyBvciB8Li4ufCB0byBlbmNsb3NlCisJCSAgaXQuCisJPG51bWJlcj46IGFuIGludGVnZXIsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorCTxmaWxlbmFtZT46IHNhbWUgYXMgPGFyZz4gKHVzZSBxdW90ZXMgaWYgaXQgY29udGFpbnMgZG90cykuIE1heSBiZQorCQkgIGFic29sdXRlIChzdGFydGluZyB3aXRoIC8pIHJlbGF0aXZlIHRvIHlvdXIgaG9tZSBkaXJlY3RvcnkKKwkJICAoc3RhcnRpbmcgd2l0aCB+Lykgb3IgcmVsYXRpdmUgdG8gc29tZWJvZHkgZWxzZSdzIGhvbWUKKwkJICBkaXJlY3RvcnkgKHN0YXJ0aW5nIHdpdGggfm5hbWUvKS4KKwk8ZnVuY3Rpb24+OiBOYW1lIG9mIGFuIExQQy1mdW5jdGlvbi4KKworQ29tbWFuZHM6CisJcGwgPGFyZz4JOiBwdXNoIHBsYXllciBvYmplY3Qgd2l0aCBuYW1lIDxhcmc+LgorCWx2IDxhcmc+CTogcHVzaCBsaXZpbmcgb2JqZWN0IHdpdGggbmFtZSA8YXJnPi4KKwltZQkJOiBwdXNoIHlvdXJzZWxmLgorCWhlcmUJCTogcHVzaCB0aGUgbG9jYXRpb24geW91IGFyZSBpbi4KKwlvYiA8ZmlsZW5hbWU+CTogbG9hZCAmIHB1c2ggdGhlIG9iamVjdCBkZW5vdGVkIGJ5IDxmaWxlbmFtZT4uCisJPGZpbGVuYW1lPgk6IHNhbWUgYXMgb2IgPGZpbGVuYW1lPiBpZiBpdCBiZWdpbnMgd2l0aCAvIG9yIH4uCisJbmV3IDxmaWxlbmFtZT4JOiBjbG9uZSAmIHB1c2ggdGhlIG9iamVjdCBkZW5vdGVkIGJ5IDxmaWxlbmFtZT4uCisJCQkgIFRoZXJlYWZ0ZXIgbW92ZSBpdCBpbiB5b3VyIGludmVudG9yeS4KKyAgICAgICAgY3JlYXQgPGZpbGVuYW1lPjogc2FtZSBhcyBuZXcsIGJ1dCBkb24ndCBtb3ZlIGl0IGludG8geW91ciBpbnZlbnRvcnkuCisJZW52CQk6IHB1c2ggdGhlIGVudmlyb25tZW50IG9mIHRoZSBUT1MuCisJLjxudW1iZXI+CTogcHVzaCB0aGUgbnRoIG9iamVjdCBpbiB0aGUgaW52ZW50b3J5IG9mIHRoZSBUT1MuCisJLjxhcmc+CQk6IHB1c2ggdGhlIG9iamVjdCB3aXRoIGlkIDxhcmc+IGluIHRoZSBpbnZlbnRvcnkKKwkJCSAgb2YgdGhlIFRPUy4KKwk9CQk6IGRpc3BsYXkgdGhlIFRPUy4KKwlpbmZvCQk6IHNob3cgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRPUy4KKwlzdGsJCTogc2hvdyB0aGUgZW50aXJlIHN0YWNrLgorCWNscgkJOiBjbGVhciB0aGUgZW50aXJlIHN0YWNrLgorCWR1cAkJOiBkdXBsaWNhdGUgdGhlIHRvcG1vc3Qgc3RhY2sgZW50cnkuCisJcG9wCQk6IGRpc2NhcmQgdGhlIHRvcG1vc3Qgc3RhY2sgZW50cnkuCisJc3dhcAkJOiBleGNoYW5nZSB0aGUgdHdvIHRvcG1vc3Qgc3RhY2sgZW50cmllcy4KKwlvdmVyCQk6IHB1c2ggdGhlIGVudHJ5IHNlY29uZCBmcm9tIHRvcC4KKwlAPG51bWJlcj4JOiBwdXNoIHRoZSBzdGFjayBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBudW1iZXIuCisJCQkgIFRoZSB0b3Btb3N0IG9uZSBoYXMgbnVtYmVyIDAuCisJaW52CQk6IHNob3cgdGhlIGludmVudG9yeSBvZiB0aGUgVE9TLgorCWNsbgkJOiBjbGVhbiB0aGUgaW52ZW50b3J5IG9mIHRoZSBUT1MuIFBsYXllcnMgYXJlIG5vdAorCQkJICBkZXN0cnVjdGVkLgorCWNsbm9mIDxhcmc+CTogY2xlYW4gdGhlIGludmVudG9yeSBvZiB0aGUgVE9TIG9mIGFsbCBvYmplY3RzIHdpdGgKKwkJCSAgaWQgPGFyZz4uCisJcmVjCQk6IHBlcmZvcm0gdGhlIG5leHQgaW52LCBjbG4gb3IgY2xub2YgcmVjdXJzaXZlbHkuCisJbm9yZWMJCTogdXNlIHRoaXMgdG8gdHVybiBvZiByZWMgYWdhaW4gaWYgeW91IGFyZSBub3QgZ29pbmcKKwkJCSAgdG8gdXNlIG9uZSBvZiBpbnYsIGNsbiBvciBjbG5vZi4gaW52LCBjbG4gYW5kIGNsbm9mCisJCQkgIHR1cm4gb2ZmIHJlYyBhdXRvbWF0aWNhbGx5IGFmdGVyIGJlaW5nIHVzZWQuCisJZGVzdAkJOiBkZXN0cnVjdCB0aGUgVE9TLgorCW1ha2UJCTogZGVzdHJ1Y3QgdGhlIFRPUywgdGhlbiByZWJ1aWxkIGl0IGZyb20gdGhlIGZpbGUuCisJCQkgIFZlcnkgdXNlZnVsIHdoZW4gZGV2ZWxvcGluZyByb29tcy4KKwltb3YJCTogbW92ZSB0aGUgb2JqZWN0IGRlbm90ZWQgYnkgdGhlIHN0YWNrIGVudHJ5IHRoYXQgaXMKKwkJCSAgc2Vjb25kIGZyb20gdG9wIGludG8gdGhlIFRPUy4KKwlbPGZ1bmN0aW9uPl0JOiBjYWxsIDxmdW5jdGlvbj4gaW4gdGhlIFRPUy4KKwlbPGZ1bmN0aW9uPiA8YXJnMT4gLi4uIDxhcmduPl0KKwkJCTogY2FsbCA8ZnVuY3Rpb24+IGluIHRoZSBUT1MuIGFyZ3VtZW50cyBhcmUgc2VwYXJhdGVkCisJCQkgIGJ5IHNwYWNlcy4gSWYgdGhlIGFyZ3VtZW50cyB0aGVtc2VsdmVzIGNvbnRhaW4KKwkJCSAgc3BhY2VzLCBlbmNsb3NlIHRoZW0gYnkgIi4uLiIsICcuLi4nIG9yIHwuLi58LgorCQkJICBVc2UgQDxudW1iZXI+IHRvIHN1cHBseSBvYmplY3RzIG9uIHRoZSBzdGFjaworCQkJICBhcyBhcmd1bWVudHMuCisJcmVzdWx0CQk6IHB1c2ggdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbCBpZiBpdCBpcworCQkJICBhbiBvYmplY3QuCisJZGVzYwkJOiB0b2dnbGUgd2hldGhlciBzaG9ydCBkZXNjcmlwdGlvbnMgYXJlIHNob3duIHdoZW4KKwkJCSAgZGlzcGxheWluZyBvYmplY3RzLgorCSMJCTogdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGFjayB3aWxsIGJlIHJlc3RvcmVkIGFmdGVyCisJCQkgIHBlcmZvcm1pbmcgdGhlIG5leHQgY29tbWFuZCBvbiB0aGUgc2FtZSBsaW5lLgorCQkJICBTaW5jZSBhbGwgY29tbWFuZHMgd2hpY2ggbWFuaXB1bGF0ZSBzdGFjayBvYmplY3RzCisJCQkgIGV4Y2VwdCBpbnYgYW5kID0gcG9wIHRoZW0sIHRoaXMgbWlnaHQgY29tZSBpbiBoYW5keS4KKwk8PG51bWJlcj4JOiB1c2VkIHRvIHB1c2ggdmFyaWFibGUgPG51bWJlcj4uIE1heSByYW5nZSBmcm9tCisJCQkgIDAgdG8gOS4KKwk+PG51bWJlcj4JOiBzdG9yZSB0aGUgVE9TIGluIHZhcmlhYmxlIDxudW1iZXI+LgorCXZhcnMJCTogZGlzcGxheSBhbGwgdmFyaWFibGVzLgorCitUaGUgZm9sbG93aW5nIHR3byBjb21tYW5kcyBjYW4gb25seSBiZSB1c2VkIGFzIHRoZSBmaXJzdCBjb21tYW5kIG9uIGEgbGluZS4KKworCT8JCTogdGhlcmUgYXJlIHR3byB1c2FnZXMgZm9yIHRoZSA/LWNvbW1hbmQuIEZvbGxvd2VkCisJCQkgIGJ5IHRleHQgaXQgd2lsbCBleGVjdXRlIHRoZSBjb21tYW5kcyBpbiBpdC4KKwkJCSAgU2ltcGx5IGhpdHRpbmcgPzxDUj4gd2lsbCBwdXQgeW91IGluIGludGVyYWN0aXZlCisJCQkgIG1vZGUuIExlYXZlIHRoaXMgbW9kZSBieSB0eXBpbmcgLjxDUj4uIExpbmVzCisJCQkgIHR5cGVkIGluIHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIGxlbnMgYW5kIHRoZQorCQkJICBzdGFjayBzaG93biBhZnRlcndhcmRzLgorCisJZ3JhbnQJCTogVHdvIGZvcm1zIGFyZSBwb3NzaWJsZToKKwkJCSAgJ2dyYW50IGFjY2VzcyB0byA8bmFtZT4nIGFsbG93cyB0aGUgcGxheWVyIHdpdGgKKwkJCSAgbmFtZSA8bmFtZT4gdG8gdXNlIHRoZSBsZW5zLgorCQkJICAnZ3JhbnQgbm8gYWNjZXNzJyBkZW5pZXMgdGhlIGFjY2VzcyB0byBhbGwgcGxheWVycworCQkJICBiZWxvdyBsZXZlbCAyMS4KKworRXhhbXBsZXM6CisJbWUgL3Jvb20vY2h1cmNoIG1vCisJCTogZ28gdG8gdGhlIGNodXJjaC4KKwlwbCBkZW1vcyBvYiB+ZGVtb3Mvd29ya3Jvb20gbW8KKwkJOiBtb3ZlIHRoZSBwbGF5ZXIgZGVtb3MgdG8gaGlzIHdvcmtyb29tLgorCWhlcmUgbWFrZQorCQk6IHVwZGF0ZSBhbmQgbG9hZCB0aGUgcm9vbSB5b3UgYXJlIGluLCBrZWVwaW5nIHRoZSBpbnZlbnRvcnkKKwkJICB1bnRvdWNoZWQuCisJaGVyZSBkdXAgcmVjIGNsbiBtYWtlCisJCTogc2FtZSwgdGhpcyB0aW1lIGNsZWFuaW5nIHVwIGJlZm9yZS4KKwltZS5iYWcgaW52CisJCTogc2hvdyB0aGUgY29udGVudHMgb2YgdGhlIGJhZyB5b3UgaGF2ZS4KKwltZS4iYmFnIDIiIGludgorCQk6IHNhbWUgZm9yIHRoZSBzZWNvbmQgYmFnLgorCW1lIFtzaG9ydF0KKwkJOiBzaG93cyB5b3VyIHNob3J0IGRlc2NyaXB0aW9uLgorCW1lIFtxdWVyeV9hdHRhY2tdIHJlc3VsdCBbc3RvcF9maWdodF0KKwkJOiBwYWNpZnkgeW91ciBvcHBvbmVudC4KKwlwbCBkZW1vcyBbYXR0YWNrZWRfYnkgQDBdCisJCTogbWFrZSBEZW1vcyBhdHRhY2sgaGltc2VsZi4KKwlsdiB0cm9sbCBwbCBkZW1vcyBbYXR0YWNrZWRfYnkgQDFdCisJCTogZGVtb3MgaXMgYXR0YWNrZWQgYnkgYSB0cm9sbC4KKwloZXJlLnRyb2xsIGhlcmUuZGVtb3MgW2F0dGFja2VkX2J5IEAxXQorCQk6IHNhbWUgZWZmZWN0IGlmIHRoZXkncmUgYm90aCBoZXJlLgorCW5ldyAvb2JqL2xldmVsX2xpc3QKKwkJOiBnZXQgeW91cnNlbGYgYSBjb3B5IG9mIHRoZSB0b3AgdGVuIGxpc3QuCisJcGwgZXJlYm9ybiBjbG5vZiBmbGVhCisJCTogaGVscCBwb29yIGVyZWJvcm4gdG8gZ2V0IHJpZCBvZiB0aG9zZSBmbGVhcy4KKwlwbCBkZW1vcyBlbnYgW2xvbmddCisJCTogc2hvdyB0aGUgcm9vbSB3aGVyZSBkZW1vcyBpcy4KKwloZXJlIHJlYyBpbnYgcG9wCisJCTogc2hvdyB0aGUgaW52ZW50b3J5IG9mIHlvdXIgY3VycmVudCBsb2NhdGlvbiBhbmQgY2xlYW4KKwkJICB1cCB0aGUgc3RhY2sgYWZ0ZXJ3YXJkcy4KKwltZSAjW3NldF9zdHIgMjBdICNbc2V0X2RleCAyMF0gI1tzZXRfaW50IDIwXSAjW3NldF9jb24gMjBdCisJCTogc2V0IGFsbCB5b3VyIHN0YXRzIHRvIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlLgorCW1lIFtzZXRfdGl0bGUgInRoZSBuZXcgd2l6YXJkIl0KKwkJOiBjaGFuZ2VzIHlvdXIgdGl0bGUgYWNjb3JkaW5nbHkuCisJcGwgZGVtb3MgZW52ID40CisJCTogc3RvcmUgdGhlIHJvb20gRGVtb3MgaXMgaW4gaW4gdmFyaWFibGUgNC4KKwk8NCBbcXVlcnlfZGVzdF9kaXJdCisJCTogZ2V0IGl0IGFnYWluIGFuZCBsaXN0IHRoZSBwb3NzaWJsZSBleGl0cy4KKwltZSByZWMgaW52IC40IGludgorCQk6IGdldCBhIHJlY3Vyc2l2ZSBsaXN0aW5nIG9mIHlvdXJzZWxmLCB0aGVuIGEgbm9uLXJlY3Vyc2l2ZQorCQkgIG9uZSBvZiB0aGUgNHRoIGl0ZW0gaW4geW91ciBpbnZlbnRvcnkKKwltZS40LjEgaW5mbworCQk6IHNob3cgc29tZSBpbmZvcm1hdGlvbiBvZiB0aGUgZmlyc3QgaXRlbSB3aXRoaW4gdGhlIGZvdXJ0aAorCQkgIGl0ZW0gaW4geW91ciBpbnZlbnRvcnkuCisJCSAgUGxlYXNlIG5vdGUgdGhhdCB3aGVuIGRvaW5nIGEgcmVjIGludiBhbGwgdGhlIG5lY2Vzc2FyeQorCQkgIGluZm9ybWF0aW9uIHRvIGZpbmQgYW55IG9iamVjdCBpcyBkaXNwbGF5ZWQgaW4gZnJvbnQKKwkJICBvZiBpdC4KZGlmZiAtLWdpdCBhL29iai90b29scy9sdXBlLmRvayBiL29iai90b29scy9sdXBlLmRvawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUyM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2x1cGUuZG9rCkBAIC0wLDAgKzEsMjA5IEBACitBTExHRU1FSU5FUzoKKwlEaWUgTHVwZSBiZW51dHp0IGVpbmVuIFN0YXBlbCAoU3RhY2spLCB1bSBPYmpla3RlIHp1IGJlYXJiZWl0ZW4uCisJRWluaWdlIEJlZmVobGUgc2NoaWViZW4gT2JqZWt0ZSBhdWYgZGVuIFN0YXBlbCwgYW5kZXJlIHdpZWRlcnVtCisJaG9sZW4gc2llIHdpZWRlciB2b20gU3RhcGVsIGhlcnVudGVyIHVuZCBiZW51dHplbiBzaWUgZnVlciBkaWUKKwl2ZXJzY2hpZWRlbnN0ZW4gWndlY2tlLgorCU1hbiBrYW5uIGluIGVpbmVyIFplaWxlIG1laHJlcmUgS29tbWFuZG9zIGdsZWljaHplaXRpZyBhbmdlYmVuCisJKGR1cmNoIExlZXJ6ZWljaGVuIGdldHJlbm50KS4KKwlFaW5lIFplaWxlIHdpcmQgaW1tZXIgdm9uIGxpbmtzIG5hY2ggcmVjaHRzIGFiZ2VhcmJlaXRldC4KKworU0NIUkVJQldFSVNFTjoKKwk8YXJnPgktIEVpbmUgUmVpaGUgdm9uIFplaWNoZW4sIGRpZSB3ZWRlciBMZWVyemVpY2hlbiBub2NoIFB1bmt0ZQorCQkgICguKSBlbnRoYWVsdC4gRmFsbHMgZG9jaCBMZWVyemVpY2hlbiBvZGVyIFB1bmt0ZSBpbiA8YXJnPgorCQkgIGF1ZnRhdWNoZW4sIG11c3MgbWFuIGRpZSBaZWljaGVua2V0dGUgendpc2NoZW4gIi4uLiIsCisJCSAgJy4uLicgb2RlciB8Li4ufCBlaW5zY2hsaWVzc2VuLgorCTxucj4JLSBFaW5lIChwb3NpdGl2ZSBvZGVyIG5lZ2F0aXZlKSBnYW56ZSBaYWhsLgorCTxmaWxlbmFtZT4gLSBFaW4gRGF0ZWluYW1lLiBGdWVyIGlobiBnaWx0IGRhcyBHbGVpY2hlIHdpZSBmdWVyIDxhcmc+OgorCQkgIFdlbm4gZXIgUHVua3RlIGVudGhhZWx0LCBtdXNzIG1hbiBpaG4gendpc2NoZW4gIi4uLiIsCisJCSAgJy4uLicgb2RlciB8Li4ufCBlaW5zY2hsaWVzc2VuLgorCQkgIEVzIHNpbmQgYWxsZSBWYXJpYXRpb25lbiBtb2VnbGljaCwgZGllIG1hbiBhdWNoIGF1cyBkZXIKKwkJICBNYWdpZXJzaGVsbCBrZW5udDogYWJzb2x1dGUgRGF0ZWluYW1lbiAoYmVnaW5uZW4gbWl0ICIvIiksCisJCSAgRGF0ZWluYW1lbiByZWxhdGl2IHp1bSBlaWdlbmVuIEhvbWV2ZXJ6ZWljaG5pcyAoIn4vIikKKwkJICBvZGVyIHp1bSBIb21ldmVyemVpY2huaXMgZWluZXMgYW5kZXJlbiBNYWdpZXJzICgifm5hbWUvIiksCisJCSAgRGF0ZWluYW1lbiBpbiBlaW5lciBSZWdpb24gKCIrcmVnaW9uLyIpIHVuZCBEYXRlaW5hbWVuCisJCSAgcmVsYXRpdiB6dW0gYWt0dWVsbGVuIFZlcnplaWNobmlzIChhbGxlcyBhbmRlcmUgOykuCisJPGZ1bmM+CS0gTmFtZSBlaW5lciBMUEMtRnVua3Rpb24uCisJVE9TCS0gRGFzIE9iamVrdCBnYW56IG9iZW4gYXVmIGRlbSBTdGFwZWwgKFRvcCBPZiBTdGFjaykuCisKK0RFUiBTVEFQRUw6CisJQmVpIGRlbSBTdGFwZWwgaGFuZGVsdCBlcyBzaWNoIHVtIGVpbmVuIExJRk8tU3RhcGVsIChMYXN0IEluIC0gRmlyc3QKKwlPdXQpLCBkLmguIGRhcyBPYmpla3QsIGRhcyB6dWxldHp0IGF1ZiBkZW4gU3RhcGVsIGdlc2Nob2JlbiB3dXJkZSwKKwl3aXJkIGFscyBlcnN0ZXMgYmVhcmJlaXRldC4KKwlCZWkgZGVyIEJlYXJiZWl0dW5nIHdpcmQgZGVyIFRPUyBpbiBkZXIgUmVnZWwgdm9tIFN0YXBlbCBlbnRmZXJudAorCShBdXNuYWhtZW46ID0sIHN0ayB1bmQgIyksIGRlciBTdGFwZWwgd2lyZCBhbHNvIGltIExhdWZlIGRlciBaZWl0CisJd2llZGVyIGtsZWluZXIuCisJRGVyIFN0YXBlbCBrYW5uIG1heGltYWwgemVobiBFbGVtZW50ZSBhdWZuZWhtZW4uIERpZXNlcyBMaW1pdCB3aXJkCisJbWFuIGJlaSAibm9ybWFsZW0gQmV0cmllYiIgYWxsZXJkaW5ncyBzZWx0ZW4gZXJyZWljaGVuLgorCVNvbGx0ZSBlcyB0cm90emRlbSBlaW5tYWwgZW5nIHdlcmRlbiwgc3RlaGVuIGVpbmVtIG5vY2ggemVobgorCVZhcmlhYmxlbiB6dXIgVmVyZnVlZ3VuZywgaW4gZGVuZW4gbWFuIHp1c2FldHpsaWNoIE9iamVrdGUgKHZvbQorCVN0YXBlbCkgYWJsZWdlbiBrYW5uLgorCitCRUZFSExFOgorCUVzIGdpYnQgZHJlaSB1bnRlcnNjaGllZGxpY2hlIEJlZmVobHNncnVwcGVuOgorCWEpIEJlZmVobGUsIGRpZSBlaW4gT2JqZWt0IGF1ZiBkZW4gU3RhcGVsIHNjaGllYmVuOworCWIpIEJlZmVobGUsIGRpZSBtaXQgT2JqZWt0ZW4gYXVmIGRlbSBTdGFwZWwgYXJiZWl0ZW47CisJYykgQmVmZWhsZSwgZGllIG9obmUgZGVuIFN0YXBlbCBhdXNrb21tZW4uCisJRWluaWdlIEJlZmVobGUgc2V0emVuIHZvcmF1cywgZGFzIGRlciBUT1MgZWluIExlYmV3ZXNlbiBvZGVyIGdhciBlaW4KKwlTcGllbGVyb2JqZWt0IGlzdDsgYW5kZXJlIEJlZmVobGUgc2luZCBlcnN0IGFiIGVpbmVtIGJlc3RpbW10ZW4KKwlNYWdpZXJsZXZlbCB6dWdhZW5nbGljaC4gRGllcyBpc3QgYmVpIGRlbiBlbnRzcHJlY2hlbmRlbiBCZWZlaGxlbgorCWpld2VpbHMgdmVybWVya3QuCisKKyAgICBEaWVzZSBCZWZlaGxlIHNjaGllYmVuIGVpbiBuZXVlcyBPYmpla3QgYXVmIGRlbiBTdGFwZWw6CisJY3JlYXQgPGZpbGVuYW1lPiBNYWNodCBkYXMgR2xlaWNoZSB3aWUgJ25ldycsIGRhcyBPYmpla3Qgd2lyZCBhbGxlci0KKwkJCWRpbmdzIG5pY2h0IGluIERlaW4gSW52ZW50b3J5IGdlc3RlY2t0LgorCWhlcmUJCURhcyBPYmpla3QsIGluIGRlbSBtYW4gZ2VyYWRlIHN0ZWh0LCBhdWYgZGVuIFN0YXBlbAorCQkJc2NoaWViZW4uCisJbHYgPGFyZz4JU2NoaWVidCBkYXMgTGViZXdlc2VuIG1pdCBkZW0gbGl2aW5nX25hbWUgPGFyZz4gYXVmCisJCQlkZW4gU3RhcGVsLiBBQ0hUVU5HISBEYXMgbXVzcyBkYW5uIG5pY2h0IHVuYmVkaW5ndAorCQkJZGFzIExlYmV3ZXNlbiBzZWluLCBkYXMgbWFuIGRvcnQgZWlnZW50bGljaCBoYWJlbgorCQkJd2lsbCEgRXMgd2lyZCBlaW5mYWNoIGRhcyBlcnN0ZSBPYmpla3QgZ2Vub21tZW4sCisJCQlkZXNzZW4gbGl2aW5nX25hbWUgcGFzc3QhIFdlbm4gbWFuIGV0d2FzIG1pdCBlaW5lbQorCQkJTlBDIHZvcmhhdCwgZGVyIGltIGdsZWljaGVuIFJhdW0gc3RlaHQsIHNwcmljaHQgbWFuCisJCQlpaG4gYmVzc2VyIG1pdCBoZXJlLm5hbWUgYW4uCisJbWUJCVNpY2ggc2VsYnN0IGF1ZiBkZW4gU3RhcGVsIHNjaGllYmVuLgorCW5ldyA8ZmlsZW5hbWU+CUNsb25lZCBkYXMgbWl0IDxmaWxlbmFtZT4gYW5nZWdlYmVuZSBPYmpla3QgdW5kCisJCQlzY2hpZWJ0IGVzIGF1ZiBkZW4gU3RhcGVsLiBBbnNjaGxpZXNzZW5kIGJlZmluZGV0IGVzCisJCQlzaWNoIGluIERlaW5lbSBJbnZlbnRvcnkuCisJb2IgPGZpbGVuYW1lPglMYWVkdCBkYXMgT2JqZWt0LCBkYXMgbWl0IDxmaWxlbmFtZT4gYW5nZWdlYmVuIGlzdCwKKwkJCXVuZCBzY2hpZWJ0IGVzIGF1ZiBkZW4gU3RhcGVsLgorCXBsIDxhcmc+CVNjaGllYnQgZGFzIFNwaWVsZXJvYmpla3QgbWl0IGRlbSBOYW1lbiA8YXJnPiBhdWYgZGVuCisJCQlTdGFwZWwuCisJCQlFcyB3ZXJkZW4gYXVjaCBuZXR6dG90ZSBTcGllbGVyIGJlcnVja3NpY2h0aWd0LgorCXB1c2ggPGZpbGVuYW1lPiBTY2hpZWJ0IGRhcyBPYmpla3QsIGRhcyBtaXQgPGZpbGVuYW1lPiBhbmdlZ2ViZW4gaXN0LAorCQkJYXVmIGRlbiBTdGFwZWwuCisJPGZpbGVuYW1lPglNYWNodCBkYXMgZ2xlaWNoZSB3aWUgJ29iJywgZmFsbHMgPGZpbGVuYW1lPiBtaXQgIi8iCisJCQlvZGVyICJ+IiBiZWdpbm50LgorCisgICAgRGllIG5hZWNoc3RlbiBCZWZlaGxlIHNjaGFsdGVuIE9wdGlvbmVuIGRlciBMdXBlIGFuL2F1cy91bToKKwlkZXNjCQlEaWUgenVzYWV0emxpY2hlIEFuZ2FiZSBkZXIgS3VyemJlc2NocmVpYnVuZyBkZXMKKwkJCWFrdHVlbGxlbiBPYmpla3RlcyB3aXJkIHVudGVyZHJ1ZWNrdC4KKwlyZWMJCVNjaGFsdGV0IGluIGRlbiAicmVrdXJzaXYiLU1vZHVzIHVtLiBEaWVzZXIgTW9kdXMKKwkJCXdpcmQgdm9uIGZvbGdlbmRlbiBCZWZlaGxlbiBnZW51dHp0OgorCQkJJ2ludicsICdjbG4nIHVuZCAnY2xub2YnCisJCQlOYWNoIEF1c2Z1ZWhydW5nIGVpbmVzIGRpZXNlciBCZWZlaGxlIHdpcmQgZGVyCisJCQkicmVrdXJzaXYiLU1vZHVzIGF1dG9tYXRpc2NoIHdpZWRlciBhYmdlc3RlbGx0LgorCW5vcmVjCQlTdGVsbHQgZGVuICJyZWt1cnNpdiItTW9kdXMgInZvbiBIYW5kIiBhYi4KKworICAgIERpZXNlIEJlZmVobGUgc2NoaWViZW4gZWJlbmZhbGxzIGVpbiBuZXVlcyBPYmpla3QgYXVmIGRlbiBTdGFwZWwuIFNpZQorICAgIGFyYmVpdGVuIGRhYmVpIGFsbGVyZGluZ3MgcmVsYXRpdiB6dW0gVE9TLiBNYW4gbXVzcyBhbHNvIHNjaG9uIG1pbmRlc3RlbnMKKyAgICBlaW4gT2JqZWt0IGF1ZiBkZW4gU3RhcGVsIGdlc2Nob2JlbiBoYWJlbi4gRGVyIGFsdGUgVE9TIHdpcmQgZGFiZWkgaW4gZGVyCisgICAgUmVnZWwgZW50ZmVybnQuCisJLjxucj4JCVNjaGllYnQgZGFzIDxucj50ZSBPYmpla3QgaW0gSW52ZW50b3J5IGRlcyBUT1MgYXVmIGRlbgorCQkJU3RhcGVsLgorCS48YXJnPgkJU2NoaWVidCBkYXMgT2JqZWt0IG1pdCBkZXIgSUQgPGFyZz4gaW0gSW52ZW50b3J5IGRlcworCQkJVE9TIGF1ZiBkZW4gU3RhcGVsLgorCTw8bnI+CQlTY2hpZWJ0IGRpZSBWYXJpYWJsZSA8bnI+IGF1ZiBkZW4gU3RhcGVsLiBBbHMgPG5yPgorCQkJc2luZCBXZXJ0ZSB6d2lzY2hlbiAwIHVuZCA5IG1vZWdsaWNoLgorCUA8bnI+CQlTY2hpZWJ0IGRhcyA8bnI+dGUgT2JqZWt0IHZvbiBvYmVuIG5vY2ggZWlubWFsIGF1ZiBkZW4KKwkJCVN0YXBlbC4gRGVyIGFsdGUgVE9TIGhhdCBkaWUgTnVtbWVyIDAuIFdlZGVyIGRlciBhbHRlCisJCQlUT1Mgbm9jaCBkYXMgdmVyc2Nob2JlbmUgT2JqZWt0IHdlcmRlbiB2b20gU3RhcGVsIGVudC0KKwkJCWZlcm50LgorCQkJQDEgaXN0IGFuYWxvZyB6dSAnb3ZlcicuCisJY29weQkJTGVndCBlaW5lIEtvcGllIGRlcyBUT1MgYW4gKGlua2wuIGFsbGVyIFByb3BlcnR5d2VydGUpCisJCQl1bmQgc2NoaWVidCBkaWVzZSBLb3BpZSBhdWYgZGVuIFN0YXBlbC4gRGllIEtvcGllCisJCQliZWZpbmRldCBzaWNoIGRhbmFjaCBpbiBEZWluZW0gSW52ZW50b3J5LgorCWR1cAkJU2NoaWVidCBkZW4gVE9TIGRvcHBlbHQgYXVmIGRlbiBTdGFwZWwuCisJZW52CQlTY2hpZWJ0IGRhcyBPYmpla3QsIGluIGRlbSBzaWNoIGRlciBUT1MgYmVmaW5kZXQsIGF1ZgorCQkJZGVuIFN0YXBlbC4KKwlvdmVyCQlTY2hpZWJ0IGRhcyBPYmpla3QsIGRhcyBzaWNoIHVudGVyIGRlbSBUT1MgYmVmaW5kZXQsCisJCQlub2NobWFsIGF1ZiBkZW4gU3RhcGVsLiBEYWJlaSB3ZXJkZW4gd2VkZXIgZGVyIGFsdGUKKwkJCVRPUyBub2NoIGRhcyBPYmpla3QgdW50ZXIgaWhtIGVudGZlcm50LgorCXJlc3VsdAkJV2VubiBpbiBlaW5lbSBPYmpla3QgZWluZSBGdW5rdGlvbiBhdWZnZXJ1ZmVuIHd1cmRlLAorCQkJdW5kIGRpZXNlIEZ1bmt0aW9uIHdpZWRlciBlaW4gT2JqZWt0IHp1cnVlY2tnZWdlYmVuCisJCQloYXQsIHNvIHdpcmQgZGllc2VzIE9iamVrdCBhdWYgZGVuIFN0YXBlbCBnZXNjaG9iZW4uCisJc3dhcAkJVGF1c2NodCBUT1MgdW5kIGRhcyBkYXJ1bnRlciBsaWVnZW5kZSBFbGVtZW50IGdlZ2VuLQorCQkJZWluYW5kZXIgYXVzLgorCisgICAgRGllIG5hZWNoc3RlbiBCZWZlaGxlIGFyYmVpdGVuIG1pdCBkZW4gYXVmIGRlbSBTdGFwZWwgbGllZ2VuZGVuIE9iamVrdGVuLgorICAgIERhYmVpIHdlcmRlbiBkaWUgYmVhcmJlaXRldGVuIE9iamVrdGUgaW4gZGVyIFJlZ2VsIHZvbSBTdGFwZWwgZW50ZmVybnQuCisJPjxucj4JCVNwZWljaGVydCBkZW4gVE9TIGluIGRlciBWYXJpYWJsZW4gPG5yPi4gQWxzIDxucj4KKwkJCXNpbmQgV2VydGUgendpc2NoZW4gMCB1bmQgOSBtb2VnbGljaC4KKwk9CQlaZWlndCBkZW4gVE9TLiBEaWVzZXIgYmxlaWJ0IGRhYmVpIHVudmVyYWVuZGVydC4KKwkjCQlEZXIgU3RhY2sgYmxlaWJ0IHVlYmVyIGRhcyBuYWVjaHN0ZSBLb21tYW5kbyBoaW5hdXMKKwkJCWVyaGFsdGVuLgorCWludgkJWmVpZ3QgZGFzIEludmVudG9yeSBkZXMgVE9TLiBEZXIgVE9TIGJsZWlidCBkYWJlaQorCQkJdW52ZXJhZW5kZXJ0LgorCWNsbgkJRW50ZmVybnQgYWxsZSBPYmpla3RlIGF1cyBkZW0gSW52ZW50b3J5IGRlcyBUT1MuIEVzCisJCQl3ZXJkZW4gYWxsZXJkaW5ncyBrZWluZSBTcGllbGVyIGVudGZlcm50LgorCWNsbm9mIDxhcmc+CUVudGZlcm50IGFsbGUgT2JqZWt0ZSwgZGllIGF1ZiBkaWUgSUQgPGFyZz4gYW5zcHJlLQorCQkJY2hlbiwgYXVzIGRlbSBJbnZlbnRhciBkZXMgVE9TLgorCWNscgkJTG9lc2NodCBkZW4gZ2VzYW10ZW4gU3RhY2suCisJRGVzdAkJRGVyIFRPUyB3aXJkIHplcnN0b2VydC4gRGFzIGdlaHQgYWxsZXJkaW5ncyBOSUNIVCwKKwkJCXdlbm4gZGVyIFRPUyBlaW4gU3BpZWxlcm9iamVrdCBvZGVyIGRpZSBMdXBlIHNlbGJzdAorCQkJaXN0LgorCWRlc3QJCVdpZSBEZXN0LCBhbGxlcmRpbmdzIHdpcmQgenVlcnN0IFRPUy0+cmVtb3ZlKCkgYXVmLQorCQkJZ2VydWZlbiwgdW0gZGVtIFRPUyBkaWUgTW9lZ2xpY2hrZWl0IHp1IGdlYmVuLCBub2NoCisJCQloaW50ZXIgc2ljaCBhdWZ6dXJhZXVtZW4uCisJZGluZm8JCUdpYnQgZWluaWdlIEdhbWVEcml2ZXItaW50ZXJuZSBJbmZvcm1hdGlvbmVuIHdpZSB6Qi4KKwkJCWRpZSBaZWl0IGRlcyBuYWVjaHN0ZW4gcmVzZXQoKS1BdWZydWZzIG9kZXIgZGllIGFuLQorCQkJZ2VzYW1tZWx0ZSBldmFsY29zdCBkZXMgVE9TIGF1cy4KKwlkaXNjbwkJVW50ZXJicmljaHQgZGllIFZlcmJpbmR1ZyBkZXMgVE9TIChtdXNzIGVpbiBha3RpdmVyCisJCQlTcGllbGVyIHNlaW4pIHp1bSBNRyAoZGlzY29ubmVjdCkuCisJaGwJCVplaWd0IGRpZSBIaXN0b3J5bGlzdGUgZGVzIFRPUyBhbiAoaGllcmJlaSBtdXNzIGVzCisJCQlzaWNoIHVtIGVpbmVuIFNwaWVsZXIgaGFuZGVsbikuCisJCQlEaWVzZXIgQmVmZWhsIHN0ZWh0IGFiIEVMREVSX0xWTCAoNTApIHp1ciBWZXJmdWVndW5nLgorCQkJISEhRnVlciBkaWUgQmVudXR6dW5nIGdpbHQgZGFzIEdsZWljaGUgd2llIGZ1ZXIgZGFzCisJCQlTbm9vcGVuISEhCisJaWRsZQkJR2lidCBhbiwgd2llIGxhbmdlIGRlciBUT1Mgc2Nob24gaWRsZXQuIChEZXIgVE9TCisJCQlzb2xsdGUgZGFiZWkgbmF0dWVybGljaCBlaW4gU3BpZWxlciBzZWluKS4KKwlpbmZvCQlHaWJ0IGVpbmlnZSBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBUT1MgYXVzLgorCWluaGVyaXRfbGlzdAlHaWJ0IGRlbiBWZXJlcmJ1bmdzYmF1bSBkZXMgVE9TIGF1cyAoYWxsZXJkaW5ncyBuaWNodAorCQkJc2VociBiYXVtZm9lcm1pZyA7KQorCWludgkJWmVpZ3QgZGFzIEludmVudG9yeSBkZXMgVE9TIGFuLgorCisJbWFrZQkJRnVlaHJ0IGVpbiBVcGRhdGUgZGVzIFRPUyBkdXJjaC4gR2VodCBuaWNodCBiZWkKKwkJCVNwaWVsZXJuISBEYWZ1ZXIgZ2lidCBlcyByZW5ldy4KKwltaW5mbwkJR2lidCBlaW5pZ2UgSW5mb3JtYXRpb25lbiB1ZWJlciBkZW4gU3BlaWNoZXJ2ZXJicmF1Y2gKKwkJCWRlcyBUT1MgYXVzLgorCW1vdmUsIG1vdiwgbW8JRGFzIE9iamVrdCwgZGFzIHVudGVyIGRlbSBUT1Mgc3RlaHQsIHdpcmQgaW4gZGVuIFRPUworCQkJZ2Vtb3ZlZC4gQmVpZGUgT2JqZWt0ZSB3ZXJkZW4gZGFiZWkgdm9tIFN0YXBlbCBlbnQtCisJCQlmZXJudC4KKwlfbW92ZSwgX21vdiwgX21vLCBfbXYKKwkJCURhcyBPYmpla3QsIGRhcyB1bnRlciBkZW0gVE9TIHN0ZWh0LCB3aXJkIGluIGRlbiBUT1MKKwkJCWdlbW92ZWQsIG9obmUgZGFzcyBkb3J0IGluaXQoKSBhdWZnZXJ1ZmVuIHdpcmQuIEJlaWRlCisJCQlPYmpla3RlIHdlcmRlbiBkYWJlaSB2b20gU3RhcGVsIGVudGZlcm50LgorCQkJRGllc2VyIEJlZmVobCBzdGVodCBhYiBBUkNIX0xWTCAoNjApIHp1ciBWZXJmdWVndW5nLgorCXBvcAkJRW50ZmVybnQgZGVuIFRPUy4KKwlyZW5ldwkJQWVobmxpY2ggd2llICdtYWtlJywgZGVyIFRPUyBtdXNzIGFsbGVyZGluZ3MgZWluCisJCQlTcGllbGVyIHNlaW4uIEFDSFRVTkchIE1hbiBzb2xsdGUgbmljaHQgImVpbmZhY2ggc28iCisJCQlTcGllbGVyICdyZW5ldydlbiwgc29uZGVybiBudXIgZGFubiwgd2VubiBlcyB3aXJrbGljaAorCQkJZ2VyZWNodGZlcnRpZ3QgaXN0IQorCXNjYW4sIHNjCUtvbWJpbmllcnQgJ3N0YXQnIHVuZCBmaW5nZXIuIERlciBUT1MgbXVzcyBlaW4gTGViZS0KKwkJCXdlc2VuIHNlaW4uCisJc3RhdAkJR2lidCBJbmZvcm1hdGlvbmVuIHVlYmVyIFp1c3RhbmQsIEF1c3J1ZXN0dW5nLCBnZS0KKwkJCWxvZXN0ZSBRdWVzdHMgZXRjLiBkZXMgVE9TIGF1cy4gRGVyIFRPUyBtdXNzIGRhYmVpCisJCQllaW4gTGViZXdlc2VuIHNlaW4uCisJc3RrCQlaZWlndCBkZW4gZ2VzYW10ZW4gU3RhY2suIERpZXNlciBibGVpYnQgZGFiZWkgdW52ZXItCisJCQlhZW5kZXJ0LgorCVs8ZnVuYz5dCVJ1ZnQgaW0gVE9TIGRpZSBGdW5rdGlvbiA8ZnVuYz4gb2huZSBQYXJhbWV0ZXIgYXVmLgorCQkJRmFsbHMgZGllc2UgRnVua3Rpb24gZWluIE9iamVrdCB6dXJ1ZWNrZ2lidCwga2FubiBtYW4KKwkJCWRpZXNlcyBhbnNjaGxpZXNzZW5kIG1pdCByZXN1bHQgYXVmIGRlbiBTdGFwZWwKKwkJCXNjaGllYmVuLgorCVs8ZnVuYz4gPGFyZzE+IC4uLiA8YXJnbj5dCisJCQlSdWZ0IGltIFRPUyBkaWUgRnVua3Rpb24gPGZ1bmM+IG1pdCBkZW4gUGFyYW1ldGVybgorCQkJPGFyZzE+IGJpcyA8YXJnbj4gYXVmLiBEaWUgUGFyYW1ldGVyIHNpbmQgbWl0IExlZXItCisJCQl6ZWljaGVuIHp1IHRyZW5uZW4uIEVudGhhbHRlbiBkaWUgUGFyYW1ldGVyIHNlbGJzdAorCQkJTGVlcnplaWNoZW4sIHNvIHNpbmQgc2llIGluICIuLi4iLCAnLi4uJyBvZGVyIHwuLi58CisJCQllaW56dXNjaGxpZXNzZW4uCisJCQlNaXR0ZWxzIEA8bnI+IGthbm4gbWFuIGF1Y2ggT2JqZWt0ZSwgZGllIHNpY2ggYXVmIGRlbQorCQkJU3RhcGVsIGJlZmluZGVuLCBhbHMgQXJndW1lbnRlIGFuZ2ViZW4uCisKKyAgICBEaWUgZm9sZ2VuZGVuIEJlZmVobGUga29tbWVuIG9obmUgT2JqZWt0ZSBhdWYgZGVtIFN0YWNrIGF1czoKKwljYWxsX291dAlHaWJ0IGVpbmUgTGlzdGUgYWxsZXIgT2JqZWt0ZSBtaXQgZWluZW0gbGF1ZmVuZGVuCisJCQljYWxsX291dCBhdXMuCisJZHVtcAkJU2NocmVpYnQgZGllIExpc3RlbiBhbGxlciBPYmpla3RlIG1pdCBha3RpdmVtCisJCQloZWFydF9iZWF0IHVuZCBhbGxlciBPYmpla3RlIG1pdCBsYXVmZW5kZW0gY2FsbF9vdXQKKwkJCWluIGRpZSBEYXRhaSBMSVNUUy5MVVBFIGluIERlaW4gSG9tZXZlcnplaWNobmlzLgorCWR1bXBoaXN0cwlTY2hyZWlidCBkaWUgQmVmZWhsc2hpc3RvcnkgYWxsZXIgbW9tZW50YW4gZWluZ2UtCisJCQlsb2dndGVuIFNwaWVsZXIgbmFjaCAvbG9nL0FSQ0gvSEQuCisJCQlEaWVzZXIgQmVmZWhsIHN0ZWh0IGVyc3QgYWIgQVJDSF9MVkwgKDYwKSB6dXIKKwkJCVZlcmZ1ZWd1bmcuCisJaGVhcnRfYmVhdAlHaWJ0IGVpbmUgTGlzdGUgYWxsZXIgT2JqZWt0ZSBtaXQgYWt0aXZlbSBoZWFydF9iZWF0CisJCQlhdXMuCisJcnVzYWdlCQlaZWlndCBlaW5pZ2UgSW5mb3MgdWViZXIgZGVuIFJlc3NvdXJjZW5nZS0vLXZlcmJyYXVjaAorCQkJZGVzIE11ZHMgYW4uCisJc3dobwkJWmVpZ3QgKHNvIGd1dCB3aWUpIGFsbGUgYWt0aXZlbiBTbm9vcHMuCisJdmFycwkJWmVpZ3QgZGllIGJlbGVndGVuIFZhcmlhYmxlbiBhbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGFzdCBtb2RpZmllZDogV2VkIEp1biAyNiAxNDo0OTowMiAxOTk2IGJ5IFdhcmdvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29iai90b29scy9tZXJremV0dGVsL21lcmt6ZXR0ZWwuYyBiL29iai90b29scy9tZXJremV0dGVsL21lcmt6ZXR0ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ0N2FiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL21lcmt6ZXR0ZWwvbWVya3pldHRlbC5jCkBAIC0wLDAgKzEsMTEzMCBAQAorLyogIC9vYmovdG9vbHMvbWVya3pldHRlbC5jCisgICAgTWVya3pldHRlbCBmdWVyIE1hZ2llcgorICAgIEF1dG9yOiBaZXNzdHJhCisgICAgZ2dmLiBDaGFuZ2Vsb2c6CisqLworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgIi9zdGQvc2VjdXJlX3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlICJtZXJremV0dGVsLmgiCisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKy8vVmFyaWFibGVuCittYXBwaW5nIG5vdGl6ZW47CisvL21hcHBpbmcgbm90aXplbl9pbmFrdGl2OworaW50IG1heHVzZWRJRDsKK3N0YXRpYyBzdHJpbmcgb3duZXI7IC8vVUlEIGRlcyBCZXNpdHplcnMsIHdpcmQgaW4gUF9BVVRPTE9BRCBnZXNwZWljaGVydAorLy9zdGF0aWMgaW50ICpjYWNoZTsgLy9uYWNoIFByaW9yaXRhZXQgc29ydGllcnRlcyBBcnJheSBkZXIgSURzCisKK3ZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTkFNRSwgIk1lcmt6ZXR0ZWwiKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIE1lcmt6ZXR0ZWwiKTsKKyAgQWRkSWQoKHsibWVya3pldHRlbCIsInpldHRlbCJ9KSk7CisgIC8vQWJzaWNodCwgZGFtaXQgZGllIEJsdWVwcmludCBlaW5lIElELCBQX05BTUUgdW5kIFBfU0hPUlQgaGF0LgorICBpZighY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIAorICBTZXRQcm9wKFBfTE9ORywKKyAgIldhcyB3b2xsdGVzdCBEdSBnbGVpY2ggbm9jaG1hbCBzY2hvZW5lcyBwcm9nZ2VuPyA7LSlcbiIKKyAgIkJlZmVobHNsaXN0ZTpcbiIKKyAgInptZXJrZS96bm90aXogPHN0cmluZz4gIDogRXR3YXMgYXVmIGRlbiBNZXJremV0dGVsIHNjaHJlaWJlblxuIgorICAiemxpc3RlICAgICAgICAgICAgICAgICAgOiAyMCB3aWNodGlnc3RlbiBOb3RpemVuIGFuemVpZ2VuXG4iCisgICJ6bGlzdGUgPGludD4gICAgICAgICAgICA6IDxpbnQ+IHdpY2h0aWdzdGUgTm90aXplbiBhbnplaWdlblxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAodW53aWNodGlnc3RlLCB3ZW5uIDxpbnQ+IG5lZ2F0aXYpXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZ2FiZSB2b24gMCBvZGVyICdhbGxlJyBnaWJ0IGFsbGUgYXVzXG4iCisgICJ6bGlzdGUgPGludD4gPGZpbHRlcj4gICA6IDxpbnQ+IHdpY2h0aWdzdGUgTm90aXplbiBhbnplaWdlblxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAoRmlsdGVyOiAnYWt0aXYnLCAnd2FydGVuZCdcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmFrdGl2JywgJ2FiZ2VoYWt0JywgJ2FsbGUnfCcwJylcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgT2huZSBBbmdhYmUgZWluZXMgRmlsdGVyIGdpbHQgJ2FrdGl2J1xuIgorICAienN0YXR1cyA8aW50PiAgICAgICAgICAgOiBTdGF0dXMgdm9uIE5vdGl6IG1pdCBJRCB1bXNjaGFsdGVuXG4iCisgICJ6c3RhdHVzIDxpbnQ+IDxpbnQyPiAgICA6IFN0YXR1cyB2b24gTm90aXogbWl0IElEIGF1ZiA8aW50PiBzZXR6ZW4gXG4iCisgICJ6bG9lc2NoZS96cm0gPGludD4gICAgICA6IE5vdGl6IG1pdCBJRCA8aW50PiBsb2VzY2hlblxuIgorICAiemxpZXMvemxlc2UgPGludD4gICAgICAgOiBOb3RpeiBtaXQgSUQgPGludD4gYW56ZWlnZW5cbiIKKyAgInpkZXBsaWVzIDxpbnQ+IDxpbnQyPiAgIDogQWJoYWVuZ2lna2VpdGVuIHZvbiA8aW50PiBsZXNlbiwgXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICA6IHJla3Vyc2l2LCB3ZW5uIDxpbnQyPiAhPSAwXG4iCisgICJ6ZmVydGlnL3poYWtlIDxpbnQ+ICAgICA6IE5vdGl6IG1pdCBJRCA8aW50PiBhYmhha2VuIChmZXJ0aWcpXG4iCisgICJ6cHJpbyA8aW50MT4gPGludDI+ICAgICA6IE5vdGl6IG1pdCBJRCA8aW50PiBtaXQgUHJpb3JpdGFldCA8aW50Mj5cbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2VoZW4uXG4iCisgICJ6ZGVwIDxpbnQxPiA8aW50Mj4gICAgICA6IE5vdGl6IG1pdCBJRCA8aW50PiBzb2xsIHZvbiBOb3RpeiBtaXQgSURcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgPGludDI+IGFiaGFlbmdlbi5cbiIKKyAgInpoZWxmZXIgPGludDE+IDxuYW1lbj4gIDogTm90aXogbWl0IElEIDxpbnQ+IHdpcmQgKG1pdCliZWFyYmVpdGV0XG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbiBkZW4gYW5nZWdlYmVuZW4gUGVyc29uZW5cbiIKKyAgInplcmdhZW56ZSA8aW50PiA8dGV4dD4gIDogaGFlbmd0IDx0ZXh0PiBhbiBOb3RpeiA8aW50PiBhblxuIgorICAiemVyc2V0emUgPGludD4gPHRleHQ+ICAgOiBlcnNldHp0IFRleHQgdm9uIE5vdGl6IDxpbnQ+IGR1cmNoIDx0ZXh0PlxuIgorICAiemV4cGlyZSA8aW50PiAgICAgICAgICAgOiBhbGxlIGFiZ2VoYWt0ZW4gTm90aXplbiBhcmNoaXZpZXJlbiB1bmQgbG9lc2NoZW4sXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICA6IGRpZSBhZWx0ZXIgYWxzIDxpbnQ+IFRhZ2Ugc2luZC5cbiIKKyAgInp6ZWlnZSA8bmFtZT4gICAgICAgICAgIDsgemVpZ2UgPG5hbWU+LCB3aWUgZnVyY2h0YmFyIHZpZWwgRHUgenUgdHVuIGhhc3RcbiIKKyAgInp3ZWRlbCA8bmFtZT4JICAgOiA8bmFtZT4gYXVzIGRlciBGZXJuZSB2b3IgZGVyIE5hc2UgcnVtd2VkZWxuLlxuIgorICApOworICBTZXRQcm9wKFBfSU5GTyxicmVha19zdHJpbmcoIkVpbiBNZXJremV0dGVsIGZ1ZXIgTWFnaWVyLiA7LSkuIikpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX0FSVElDTEUsIDEpOworICBTZXRQcm9wKFBfV0VJR0hULCAwKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAwKTsKKyAgU2V0KFBfQVVUT0xPQURPQkosIydxdWVyeV9hdXRvbG9hZG9iaixGX1FVRVJZX01FVEhPRCk7CisgIFNldChQX0FVVE9MT0FET0JKLCMnc2V0X2F1dG9sb2Fkb2JqLEZfU0VUX01FVEhPRCk7CisgIFNldChQX0FVVE9MT0FET0JKLFBST1RFQ1RFRCxGX01PREVfQVMpOworICBTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOworICBTZXRQcm9wKFBfTk9EUk9QLDEpOworICBBZGRDbWQoKHsiem1lcmtlIiwiem5vdGl6In0pLCJBZGROb3RpeiIpOworICBBZGRDbWQoKHsiemxpc3RlIiwienRvZG8ifSksIkxpc3ROb3RpemVuIik7CisgIEFkZENtZCgoeyJ6bG9lc2NoZSIsInpybSJ9KSwiUmVtb3ZlTm90aXoiKTsKKyAgQWRkQ21kKCh7InpmZXJ0aWciLCJ6aGFrZSJ9KSwiRmluaXNoTm90aXoiKTsKKyAgQWRkQ21kKCh7InpsaWVzIiwiemxlc2UifSksIkxpZXNOb3RpeiIpOworICBBZGRDbWQoKHsienByaW8ifSksIkNoYW5nZVByaW8iKTsKKyAgQWRkQ21kKCh7InpkZXAifSksIkNoYW5nZURlcCIpOworICBBZGRDbWQoKHsienN0YXR1cyJ9KSwiQ2hhbmdlU3RhdHVzIik7CisgIEFkZENtZCgoeyJ6ZXJzZXR6ZSJ9KSwiRXJzZXR6ZVRleHQiKTsKKyAgQWRkQ21kKCh7InplcmdhZW56ZSJ9KSwiRXJnYWVuemVUZXh0Iik7CisgIEFkZENtZCgoeyJ6aGVsZmVyIiwiemRlbGVnaWVyZSJ9KSwiQ2hhbmdlSGVscGVyIik7CisgIEFkZENtZCgoeyJ6emVpZ2UifSksIlplaWdlWmV0dGVsIik7CisgIEFkZENtZCgoeyJ6d2VkZWwifSksIldlZGVsWmV0dGVsIik7CisgIEFkZENtZCgoeyJ6ZGVwbGllcyJ9KSwiTGllc0RlcHMiKTsKKyAgQWRkQ21kKCh7InpleHBpcmUifSksIkV4cGlyZSIpOworICAvL2NhY2hlPSh7fSk7CisgIAorfQorCisvLyoqKioqKioqKioqKioqKioqKiBBZGRDbWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludCBBZGROb3RpeihzdHJpbmcgc3RyKSB7CisgIAorICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgLy9nZ2YuIG51ciBFaW5sZXNlbiwgQ2FjaGUgbXVzcyBoaWVyIG5pY2h0IGFrdHVhbGlzaWVydCB3ZXJkZW4gOy0pCisgIGNoZWNrU3RhdHVzKDEpOworICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7ICAvL2tlaW4gcGFyc2luZworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJXYXMgbW9lY2h0ZXN0IER1IERpciBkZW5uIG5vdGllcmVuP1xuIik7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmIChzaXplb2Yoc3RyKT5NQVhfTk9URV9MRU5HVEgpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIkRlaW5lIE5vdGl6IGlzdCBtaXQgJWQgWmVpY2hlbiB6dSBsYW5nISBMZWlkZXIgcGFzc2VuIGF1ZiAiCisgICAgICAgICAgICAgIkRlaW5lbiBNZXJremV0dGVsIG51ciAlIFplaWNoZW4gZHJhdWYuIiwKKyAgICAgICAgc2l6ZW9mKHN0ciksTUFYX05PVEVfTEVOR1RIKSkpOworICAgIHJldHVybigxKTsKKyAgfQorICAKKyAgLy9tX2FsbG9jYXRlIGdpbHQgbnVyIGJpcyBGdW5rdGlvbnNlbmRlLCBkYWhlciBoaWxmdCBkYXMgaW4KKyAgLy9jaGVja1N0YXR1cyBsZWlkZXIgbmljaHQuCisgIGlmICghbWFwcGluZ3Aobm90aXplbikgfHwgIXNpemVvZihub3RpemVuKSkKKyAgICBub3RpemVuPW1fYWxsb2NhdGUoMCw3KTsKKyAgCisgIC8vZnJlaWUgSUQgZmluZGVuIChtYXh1c2VkSUQrMSBzb2xsdGUgZGllIG5hZWNoc3RlIGZyZWkgc2VpbiwgYWJlciBmYWxscworICAvL2RhIG1hbCB3YXMga2FwdXR0Z2VnYW5nZW4gaXN0OiBQcnVlZmVuIDstKSApCisgIHdoaWxlKG1lbWJlcihub3RpemVuLG1heHVzZWRJRCkpIHttYXh1c2VkSUQrKzt9CisgIC8vUmVpaGVuZm9sZ2U6IHMuIG1lcmt6ZXR0ZWwuaAorICBub3RpemVuKz0oW21heHVzZWRJRDpzdHI7MDt0aW1lKCk7KHt9KTsoe30pO05PVEVfQUNUSVZFOzBdKTsKKy8qICBub3RpemVuKz0oW21heHVzZWRJRF0pOworICBub3RpemVuW21heHVzZWRJRCxOT1RFX1RFWFRdPXN0cjsKKyAgbm90aXplblttYXh1c2VkSUQsTk9URV9QUklPXT0wOworICBub3RpemVuW21heHVzZWRJRCxOT1RFX1NUQVJUVElNRV09dGltZSgpOworICBub3RpemVuW21heHVzZWRJRCxOT1RFX0RFUFNdPSh7fSk7CisqLworICAKKyAgLy9jYWNoZT0oe30pOyAvL2NhY2hlIGludmFsaWRpZXJlbgorICAvL2luIEt1ZXJ6ZSBzcGVpY2hlcm4sIGFiZXIgbmljaHQgZnVlciBqZWRlIEFlbmRlcnVuZyBzcGVpY2hlcm4KKyAgc2F2ZV9tZSg2MCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiRHUgc2NocmVpYnN0IHNvcmdmYWVsdGlnIERlaW5lIE5vdGl6IGF1ZiBEZWluZW4gTWVya3pldHRlbC4gIgorICAgICAgICAgICJFcyBpc3QgbnVuIGRpZSAlZC4gTm90aXouIixtYXh1c2VkSUQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgbm90aWVydCBzaWNoIGV0d2FzIGF1ZiAlcyBNZXJremV0dGVsLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBMaWVzTm90aXooc3RyaW5nIHN0cikgeworICBpbnQgaWQ7CisgIAorICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8ICFpZD10b19pbnQoc3RyKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIldlbGNoZSBOb3RpeiBtb2VjaHRlc3QgRHUgbGVzZW4/IEJpdHRlIGVpbmUgSUQgYW5nZWJlbiFcbiIpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJFcyBnaWJ0IGtlaW5lIE5vdGl6LCBkaWUgRHUgbGVzZW4ga29lbm50ZXN0IVxuIik7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIC8vQXVzZ2FiZXRleHQgaG9sZW4gdW5kIGF1c2dlYmVuCisgIHRlbGxfb2JqZWN0KFBMLHNwcmludGYoIlxuRHUgdmVydGllZnN0IERpY2ggaW4gRGVpbmVuIE1lcmt6ZXR0ZWwgdW5kIGxpZXN0OlxuJXNcbiIsX0xpZXNOb3RpeihpZCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBsaWVzdCBldHdhcyBhdWYgJXMgTWVya3pldHRlbC5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgUmVtb3ZlTm90aXooc3RyaW5nIHN0cikgeworICBpbnQgaWQ7CisgIAorICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8ICFpZD10b19pbnQoc3RyKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIldlbGNoZSBOb3RpeiBtb2VjaHRlc3QgRHUgYXVzcmFkaWVyZW4/IEJpdHRlIGVpbmUgSUQgYW5nZWJlbiFcbiIpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICJFcyBnaWJ0IGtlaW5lIE5vdGl6LCBkaWUgRHUgYXVzcmFkaWVyZW4ga29lbm50ZXN0IVxuIik7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIC8vZGlyZWt0IExvZXNjaGVuLCBrZWluZSBLb3BpZSwgZGFoZXIgbV9kZWxldGUoKQorICBtX2RlbGV0ZShub3RpemVuLGlkKTsKKyAgLy9pbiBLdWVyemUgc3BlaWNoZXJuLCBhYmVyIG5pY2h0IGZ1ZXIgamVkZSBBZW5kZXJ1bmcgc3BlaWNoZXJuCisgIHNhdmVfbWUoNjApOworICAvL2NhY2hlIGludmFsaWRpZXJlbgorICAvL2NhY2hlPSh7fSk7CisgIHRlbGxfb2JqZWN0KFBMLAorICAgIHNwcmludGYoIlNvcmdmYWVsdGlnIHJhZGllcnN0IER1IE5vdGl6ICVkIHZvbiBEZWluZW0gTWVya3pldHRlbC5cbiIsCisgICAgICAgICAgIGlkKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgcmFkaWVydCBzb3JnZmFlbHRpZyBldHdhcyB2b24gJXMgTWVya3pldHRlbC5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgRmluaXNoTm90aXooc3RyaW5nIHN0cikgeworICBpbnQgaWQ7CisgIG1peGVkIGxpc3RlOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpIHx8ICFpZD10b19pbnQoc3RyKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIldlbGNoZSBOb3RpeiBtb2VjaHRlc3QgRHUgYWJoYWtlbj8gQml0dGUgZWluZSBJRCBhbmdlYmVuIVxuIik7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIkVzIGdpYnQga2VpbmUgTm90aXosIGRpZSBEdSBhYmhha2VuIGtvZW5udGVzdCFcbiIpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICBpZihub3RpemVuW2lkLE5PVEVfU1RBVFVTXT09Tk9URV9GSU5JU0hFRCkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiTm90aXogJWQgaXN0IHNjaG9uIGFiZ2VoYWt0IVxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICBsaXN0ZT1nZXRVbnJlc29sdmVkRGVwcyhpZCk7ICAvL2xpc3RlIGlzdCBBcnJheSB2b24gaW50cworICBpZiAoc2l6ZW9mKGxpc3RlKSkgeworICAgIGxpc3RlPW1hcChsaXN0ZSwjJ3RvX3N0cmluZyk7ICAvL2xpc3RlIGlzdCBBcnJheSB2b24gc3RyaW5ncworICAgIHRlbGxfb2JqZWN0KFBMLEJTKHNwcmludGYoIkR1IGthbm5zdCBOb3RpeiAlZCBuaWNodCBhYmhha2VuLCBkYSBub2NoICIKKyAgICAgICAgIm5pY2h0IGVybGVkaWd0ZSBBYmhhZW5naWdrZWl0ZW4gZXhpc3RpZXJlbi4gSURzOiAlcy4iLAorICAgICAgICBpZCxDb3VudFVwKGxpc3RlKSkpKTsKKyAgICByZXR1cm4oMSk7IAorICB9CisgIG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdPU5PVEVfRklOSVNIRUQ7CisgIG5vdGl6ZW5baWQsTk9URV9DTE9TRVRJTUVdPXRpbWUoKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgc3ByaW50ZigiRHUgbWFsc3QgenVmcmllZGVuIGVpbmVuIHNjaG9lbmVuIGdyb3NzZW4gSGFrZW4gaGludGVyICIKKyAgICAgICAgImRpZSBOb3RpeiBOci4gJWQuIEhhY2ggLSB3YXMgYmlzdCBEdSBudW4genVmcmllZGVuISA6LSlcbiIsaWQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgaGFrdCBlcmZyZXV0IGV0d2FzIGF1ZiAlcyBNZXJremV0dGVsIGFiLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBMaXN0Tm90aXplbihzdHJpbmcgc3RyKSB7CisgIGludCB6YWhsLG5vdGl6emFobCxpLGlkLGZpbHRlcnN0YXRlOworICBzdHJpbmcgdHh0OworICBzdHJpbmcgKmFycjsKKyAgc3RhdHVzIGludmVyczsKKyAgCisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIGlmICghbm90aXp6YWhsPWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIC8vQXJndW1lbnRlIHBhcnNlbgorICBpZihzdHJpbmdwKHN0cikgJiYgc2l6ZW9mKHN0cikpCisgICAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGlmIChwb2ludGVycChhcnIpKSBhcnItPSh7IiJ9KTsgLy9kb3BwZWx0ZSBsZWVyemVpY2hlbiBpbSBTdHJpbmcKKyAgaWYgKHBvaW50ZXJwKGFycikgJiYgc2l6ZW9mKGFycik+PTIpIHsKKyAgICB6YWhsPXRvX2ludChhcnJbMF0pOworICAgIHN3aXRjaChhcnJbMV0pIHsKKyAgICAgIGNhc2UgImFrdGl2IjoKKyAgICAgICAgZmlsdGVyc3RhdGU9Tk9URV9BQ1RJVkU7IGJyZWFrOworICAgICAgY2FzZSAiaW5ha3RpdiI6CisgICAgICAgIGZpbHRlcnN0YXRlPU5PVEVfSU5BQ1RJVkU7IGJyZWFrOworICAgICAgY2FzZSAid2FydGVuZCI6CisgICAgICBjYXNlICJwZW5kaW5nIjoKKyAgICAgICAgZmlsdGVyc3RhdGU9Tk9URV9QRU5ESU5HOyBicmVhazsKKyAgICAgIGNhc2UgImFiZ2VoYWt0IjoKKyAgICAgIGNhc2UgImZlcnRpZyI6CisgICAgICBjYXNlICJhYmdlc2NobG9zc2VuIjoKKyAgICAgICAgZmlsdGVyc3RhdGU9Tk9URV9GSU5JU0hFRDsgYnJlYWs7CisgICAgICBjYXNlICJhbGxlIjoKKyAgICAgICAgZmlsdGVyc3RhdGU9MDsgYnJlYWs7CisgICAgICBkZWZhdWx0OiAKKyAgICAgICAgZmlsdGVyc3RhdGU9dG9faW50KGFyclsxXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChwb2ludGVycChhcnIpICYmIHNpemVvZihhcnIpPT0xKSB7CisgICAgemFobD10b19pbnQoYXJyWzBdKTsKKyAgICBmaWx0ZXJzdGF0ZT1OT1RFX0FDVElWRTsKKyAgfQorICBlbHNlIHsKKyAgICAvL1ZvcmVpbnN0ZWxsdW5nZW4KKyAgICB6YWhsPTIwOworICAgIGZpbHRlcnN0YXRlPU5PVEVfQUNUSVZFOworICB9CisgIC8vMS4gQXJndW1lbnQgImFsbCIgb2RlciAiYWxsZSIgaXN0OiBhbGxlIGFuemVpZ2VuCisgIGlmIChwb2ludGVycChhcnIpICYmIHNpemVvZihhcnIpICYmIHN0cmluZ3AoYXJyWzBdKSAmJgorICAgICAgc2l6ZW9mKGFyclswXSkgJiYgYXJyWzBdPT0iYWxsZSIpCisgICAgemFobD1ub3RpenphaGw7ICAvL2FsbGUgYW56ZWlnZW4KKyAgCisgIC8vd2VubiBkaWUgZ2V3dWVuc2NodGUgWmFobCBkaWUgQW56YWhsIGdlc3BlaWNoZXJ0ZXIKKyAgLy9Ob3RpemVuIHVlYmVyc2NocmVpdGV0IChvZGVyIDAgaXN0KQorICBpZighemFobCB8fCB6YWhsPm5vdGl6emFobCkgemFobD1ub3RpenphaGw7CisgIAorICAvL3dlbm4gMS4gQXJndW1lbnQgbmVnYXRpdjogTGlzdGUgaW4gdW1nZWtlaHJ0ZXIgUmVpaGVuZm9sZ2UKKyAgaWYgKHphaGw8MCkgeworICAgIGludmVycz0xOworICAgIHphaGw9emFobCotMTsKKyAgfQorICB0eHQ9c3ByaW50ZigiXG58JTo5fHN8JTo1NnxzfCU6N3xzfFxuIiwiSUQiLCJOb3RpenRleHQiLCJQcmlvLiIpOworICB0eHQrPXNwcmludGYoIiU6NzgnLSdzXG4iLCItIik7CisgIC8vYWxsZSBwYXNzZW5kZW4gTm90aXplbiBlcm1pdHRlbG4KKyAgYXJyPWZpbHRlcihtX2luZGljZXMobm90aXplbiksIydub3RlX2ZpbHRlcixmaWx0ZXJzdGF0ZSk7CisgIC8vc29ydGllcmVuCisgIGFycj1zb3J0X2FycmF5KGFyciwjJ3NvcnRfcHJpbyk7CisgIGlmICh6YWhsPnNpemVvZihhcnIpKSB6YWhsPXNpemVvZihhcnIpOworICAvL2F1c2dlYmVuCisgIGZvcihpPTA7aTx6YWhsO2krKykgeworICAgIGlmICghaW52ZXJzKQorICAgICAgaWQ9dG9faW50KGFycltpXSk7CisgICAgZWxzZQorICAgICAgLy92b24gaGludGVuCisgICAgICBpZD10b19pbnQoYXJyWzxpKzFdKTsgLy8gaSsxIGlzdCB3aXJrbGljaCBBYnNpY2h0LiA7LSkKKyAgICB0eHQrPXNwcmludGYoInwgJTo3fGQgfCAlOjU0LXMgfCAlOjV8ZCB8XG4iLAorICAgICAgICAgICAgaWQsCisJICAgIC8vbnVyIGJpcyB6dW0gZXJzdGVuIFxuIGFuemVpZ2VuCisJICAgIGV4cGxvZGUobm90aXplbltpZCxOT1RFX1RFWFRdLCJcbiIpWzBdLAorICAgICAgICAgICAgbm90aXplbltpZCxOT1RFX1BSSU9dKTsKKyAgfQorICB0eHQrPXNwcmludGYoIiU6NzgnLSdzXG5cbiIsIi0iKTsKKyAgdGVsbF9vYmplY3QoUEwsdHh0KTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyB3aXJmdCBlaW5lbiBCbGljayBhdWYgJXMgTWVya3pldHRlbC5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVuIiA6ICJzZWluZW4iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgQ2hhbmdlRGVwKHN0cmluZyBzdHIpIHsKKyAgaW50IGlkOworICBzdHJpbmcgKmFycjsKKyAgaW50ICpkZXBzOworICAKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIGVpbmUgbWluLiBlaW5lIEFiaGFlbmdpZ2tlaXQgYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICAKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgYXJyLT0oeyIifSk7ICAvLyAiIiBlbnRmZXJuZW4sIHdpY2h0aWcuIDstKQorICBpZiAoc2l6ZW9mKGFycik8MikKKyAgICByZXR1cm4oMCk7CisgIGlkPXRvX2ludChhcnJbMF0pOworICBhcnItPSh7YXJyWzBdfSk7ICAvL2VpZ2VuZSBJRCBsb2VzY2hlbgorICBpZiAoc2l6ZW9mKGFycik8MSkKKyAgICByZXR1cm4oMCk7ICAvL21laHJmYWNoIGRpZSBlaWdlbmUgSUQgZ2lsdCBuaWNodC47LSkKKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgLy9kaWVzIHVwZGF0ZWQgZGlyZWt0IGRpZSBBYmhhZW5naWdrZWl0ZW4gaW4gJ25vdGl6ZW4nIQorICBtYXAoYXJyLCMndXBkYXRlX2RlcHMsaWQpOworICBzYXZlX21lKDYwKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJEdSBhZW5kZXJzdCBkaWUgQWJoYWVuZ2lna2VpdGVuIHZvbiBOb3RpeiAlZC5cbiIsCisgICAgICAgICAgICAgIGlkKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGtyaXR6ZWx0IGF1ZiAlcyBNZXJremV0dGVsIGhlcnVtLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBDaGFuZ2VQcmlvKHN0cmluZyBzdHIpIHsKKyAgaW50IGlkLCBwcmlvOworICBzdHJpbmcqIGFycjsKKyAgCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBlaW5lIG5ldWUgUHJpb3JpdGFldCBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIAorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBpZiAoc2l6ZW9mKGFycik+MikgeworICAgIG5vdGlmeV9mYWlsKCJCaXR0ZSBudXIgZWluZSBJRCB1bmQgZWluZSBuZXVlIFByaW9yaXRhZXQgYW5nZWJlbiEiKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgZWxzZSBpZihzaXplb2YoYXJyKT09MikgeworICAgIGlkPXRvX2ludChhcnJbMF0pOworICAgIHByaW89dG9faW50KGFyclsxXSk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybigwKTsKKworICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICBub3RpemVuW2lkLE5PVEVfUFJJT109cHJpbzsKKyAgLy9jYWNoZT0oe30pOyAvL2NhY2hlIGludmFsaWRpZXJlbgorICBzYXZlX21lKDYwKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJEdSBhZW5kZXJzdCBkaWUgUHJpb3JpdGFldCB2b24gTm90aXogJWQgYXVmICVkLiIsCisgICAgICAgICAgICAgIGlkLG5vdGl6ZW5baWQsTk9URV9QUklPXSkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBrcml0emVsdCBhdWYgJXMgTWVya3pldHRlbCBoZXJ1bS5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgQ2hhbmdlSGVscGVyKHN0cmluZyBzdHIpIHsKKyAgaW50IGlkOworICBzdHJpbmcgKmFycjsKKyAgCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBlaW5lIG1pbi4gZWluZW4gTmFtZW4gYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICAKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgYXJyLT0oeyIifSk7ICAvLyAiIiBlbnRmZXJuZW4sIHdpY2h0aWcuIDstKQorICBpZiAoc2l6ZW9mKGFycik8MikKKyAgICByZXR1cm4oMCk7CisgIGlkPXRvX2ludChhcnJbMF0pOworICBhcnItPSh7YXJyWzBdfSk7ICAvL2VpZ2VuZSBJRCBsb2VzY2hlbgorICBpZiAoc2l6ZW9mKGFycik8MSkKKyAgICByZXR1cm4oMCk7ICAvL21laHJmYWNoIGRpZSBlaWdlbmUgSUQgZ2lsdCBuaWNodC47LSkKKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgbm90aXplbltpZCxOT1RFX0hFTFBFUl09YXJyOworICBzYXZlX21lKDYwKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJNaXRhcmJlaXRlciB2b24gTm90aXogJWQgZ2VhZW5kZXJ0LiIsaWQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMga3JpdHplbHQgYXVmICVzIE1lcmt6ZXR0ZWwgaGVydW0uXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IENoYW5nZVN0YXR1cyhzdHJpbmcgc3RyKSB7CisgIGludCBpZCwgc3RhdGU7CisgIHN0cmluZyAqYXJyOworICAKKyAgbm90aWZ5X2ZhaWwoQlMoCisgICAgICAiQml0dGUgbWluLiBlaW5lIElEIGFuZ2ViZW4sIHVtIGRlbiBTdGF0dXMgdW16dXNjaGFsdGVuIG9kZXIgIgorICAgICAgImVpbmUgSUQgdW5kIGRlbiBuZXVlbiBTdGF0dXMgKDE9PUFrdGl2LCAyPT1XYXJ0ZW5kLCAiCisgICAgICAiLTE9PUluYWt0aXYvUGF1c2UpIikpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBpZiAoc2l6ZW9mKGFycik+MikgeworICAgIG5vdGlmeV9mYWlsKCJCaXR0ZSBudXIgZWluZSBJRCB1bmQgZWluZW4gbmV1ZW4gU3RhdHVzIGFuZ2ViZW4hIik7CisgICAgcmV0dXJuKDApOworICB9CisgIGVsc2UgaWYoc2l6ZW9mKGFycik9PTIpIHsKKyAgICBpZD10b19pbnQoYXJyWzBdKTsKKyAgICBzdGF0ZT10b19pbnQoYXJyWzFdKTsKKyAgfQorICBlbHNlIGlmKHNpemVvZihhcnIpPT0xKSB7CisgICAgaWQ9dG9faW50KGFyclswXSk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybigwKTsKKyAgCisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmKG1lbWJlcihOT1RFX1NUQVRFUyxzdGF0ZSk9PS0xKSB7CisgICAgaWYgKG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdPT1OT1RFX0FDVElWRSkgeworICAgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAgICAgc3ByaW50ZigiJWQgaXN0IGVpbiB1bmJla2FubnRlciBTdGF0dXMsIHNldHp0IE5vdGl6ICVkIGF1ZiAiCisgICAgICAgICAgICAgICInSW5ha3RpdicuIixzdGF0ZSxpZCkpKTsKKyAgICAgIHN0YXRlPU5PVEVfSU5BQ1RJVkU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAgICAgc3ByaW50ZigiJWQgaXN0IGVpbiB1bmJla2FubnRlciBTdGF0dXMsIHNldHp0IE5vdGl6ICVkIGF1ZiAiCisgICAgICAgICAgICAgICInQWt0aXYnLiIsc3RhdGUsaWQpKSk7CisgICAgICBzdGF0ZT1OT1RFX0FDVElWRTsKKyAgICB9CisgIH0KKyAgbm90aXplbltpZCxOT1RFX1NUQVRVU109c3RhdGU7CisgIHNhdmVfbWUoNjApOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIlN0YXR1cyB2b24gTm90aXogJWQgZ2VhZW5kZXJ0LiIsaWQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMga3JpdHplbHQgYXVmICVzIE5vdGl6emV0dGVsIGhlcnVtLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBFcnNldHplVGV4dChzdHJpbmcgc3RyKSB7CisgIHN0cmluZyAqYXJyOworICBpbnQgaWQ7CisgIAorICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgZWluZW4gbmV1ZW4gVGV4dCBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICAKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICAKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgYXJyLT0oeyIifSk7ICAvLyAiIiBlbnRmZXJuZW4KKyAgaWYgKHNpemVvZihhcnIpPDIpCisgICAgcmV0dXJuKDApOworICBpZD10b19pbnQoYXJyWzBdKTsKKyAgc3RyPWltcGxvZGUoYXJyWzEuLl0sIiAiKTsgIC8vdGV4dCB3aWVkZXJoZXJzdGVsbGVuLCBvaG5lIGVyc3RlcyBFbGVtZW50CisgIGlmICghc2l6ZW9mKHN0cikpIHJldHVybigwKTsKKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgbm90aXplbltpZCxOT1RFX1RFWFRdPXN0cjsKKyAgc2F2ZV9tZSg2MCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiVGV4dCB2b24gTm90aXogJWQgZXJzZXR6dC4iLGlkKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIHJhZGllcnQgenVlcnN0IGV0d2FzIGF1ZiAlcyBOb3RpenpldHRlbCBoZXJ1bSB1bmQgIgorICAgICAgICAic2NocmVpYnQgYW5zY2hsaWVzc2VuZCBzb3JnZmFlbHRpZyBldHdhcyBuZXVlcyBhdWYuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IEVyZ2FlbnplVGV4dChzdHJpbmcgc3RyKSB7CisgIHN0cmluZyAqYXJyOworICBpbnQgaWQ7CisgIAorICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgZWluZW4gVGV4dCBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIAorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBhcnItPSh7IiJ9KTsgIC8vICIiIGVudGZlcm5lbgorICBpZiAoc2l6ZW9mKGFycik8MikKKyAgICByZXR1cm4oMCk7CisgIGlkPXRvX2ludChhcnJbMF0pOworICBzdHI9IlxuIjsKKyAgc3RyKz1pbXBsb2RlKGFyclsxLi5dLCIgIik7ICAvL3RleHQgd2llZGVyaGVyc3RlbGxlbgorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICBub3RpemVuW2lkLE5PVEVfVEVYVF0rPXN0cjsKKyAgc2F2ZV9tZSg2MCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiVGV4dCB2b24gTm90aXogJWQgZXJnYWVuenQuIixpZCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBlcmdhZW56dCBldHdhcyBhdWYgJXMgTm90aXp6ZXR0ZWwuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IFplaWdlWmV0dGVsKHN0cmluZyBzdHIpIHsKKyAgICAvL2FuZGVyZW4gemVpZ2VuLCB3aWUgZnVyY2h0YmFyIHZpZWwgbWFuIHp1IHR1biBoYXQuCisgIG9iamVjdCBwbDsKKyAgaW50IGNvdW50OworICBpbnQgKmlkczsKKyAgCisgIG5vdGlmeV9mYWlsKCJXZW0gd2lsbHN0IER1IERlaW5lbiBNZXJremV0dGVsIHplaWdlbj9cbiIpOworICBpZiAoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmICghZW52aXJvbm1lbnQoKSB8fCAhZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpCisgICAgIHJldHVybigwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IER1IHdpbGxzdCBhbmRlcmVuIExldXRlbiBkb2NoIGJlc3RpbW10IG5pY2h0ICIKKyAgICAgICJ6ZWlnZW4sIGRhc3MgRHUgbml4IHp1IHR1biBoYXN0LCBvZGVyPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyBpZighb2JqZWN0cChwbD1wcmVzZW50KHN0cixlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkpKQorICAgICByZXR1cm4oMCk7CisgaWYgKCFsaXZpbmcocGwpKQorICAgICByZXR1cm4oMCk7CisKKyBpZHM9ZmlsdGVyKG1faW5kaWNlcyhub3RpemVuKSwjJ25vdGVfZmlsdGVyLE5PVEVfQUNUSVZFKTsKKyB0ZWxsX29iamVjdChUSSxCUygiRHUgemVpZ3N0ICIrcGwtPk5hbWUoV0VNKSsiIHZvbGxlciBTdG9seiBkZWluZW4gdm9sbGVuICIKKyAgICAgICAiTWVya3pldHRlbC4iKSk7CisgdGVsbF9yb29tKGVudmlyb25tZW50KGVudmlyb25tZW50KCkpLEJTKHNwcmludGYoCisJICIlcyB6ZWlndCAlcyAlcyBNZXJremV0dGVsLiIsCisgICAgICAgVEktPk5hbWUoV0VSKSxwbC0+TmFtZShXRU0pLFRJLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsV0VOLFNJTkdVTEFSKSkpLAorICAgICAoe1RJLHBsfSkpOworIHN3aXRjaChzaXplb2YoaWRzKSkgeworICAgICBjYXNlIDAuLjEwOgorICAgICAgIHRlbGxfb2JqZWN0KHBsLEJTKHNwcmludGYoIiVzIHplaWd0IERpciB2b2xsZXIgU3RvbHogJXMgTWVya3pldHRlbC4gRHUgIgorCSAgICAgICAid2lyZnN0IGVpbmVuIHNjaG5lbGxlbiBCbGljayBkYXJ1ZWJlciB1bmQgemFlaGxzdCAlZCAiCisJICAgICAgICJOb3RpemVuLiBOYSwgc292aWVsIGlzdCBkYXMgamEgenVtIEdsdWVjayBub2NoIG5pY2h0LiIsCisJICAgICAgIFRJLT5OYW1lKFdFUiksVEktPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSxXRU4sU0lOR1VMQVIpLAorCSAgICAgICBzaXplb2YoaWRzKSkpKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIDExLi4yMDoKKyAgICAgICAgdGVsbF9vYmplY3QocGwsQlMoc3ByaW50ZigiJXMgemVpZ3QgRGlyIHZvbGxlciBTdG9seiAlcyBNZXJremV0dGVsLiBEdSAiCisJICAgICAgICJ3aXJmc3QgZWluZW4gc2NobmVsbGVuIEJsaWNrIGRhcnVlYmVyIHVuZCB6YWVobHN0ICVkICIKKwkgICAgICAgIk5vdGl6ZW4uIE9oLCBkYXMgaXN0IGphIHNjaG9uIHNvIGVpbmlnZXMhIiwKKwkgICAgICAgVEktPk5hbWUoV0VSKSxUSS0+UXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTixTSU5HVUxBUiksCisJICAgICAgIHNpemVvZihpZHMpKSkpOworICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRlbGxfb2JqZWN0KHBsLEJTKHNwcmludGYoIiVzIHplaWd0IERpciB2b2xsZXIgU3RvbHogJXMgTWVya3pldHRlbC4gRHUgIgorCSAgICAgICAid2lyZnN0IGVpbmVuIHNjaG5lbGxlbiBCbGljayBkYXJ1ZWJlciB1bmQgemFlaGxzdCAlZCAiCisJICAgICAgICJOb3RpemVuLiBQdXV1aC4gJXMgaGF0IGdhbnogc2Nob2VuIHZpZWwgenUgdHVuISBJbiAiCisJICAgICAgICJEaXIgcmVndCBzaWNoIGxlaXNlcyBNaXRsZWlkLiIsCisJICAgICAgIFRJLT5OYW1lKFdFUiksVEktPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSxXRU4sU0lOR1VMQVIpLAorCSAgICAgICBzaXplb2YoaWRzKSxUSS0+TmFtZShXRVIpICkpKTsKKyAgICAgICBicmVhazsKKyB9CisgcmV0dXJuKDEpOworIH0KKworaW50IFdlZGVsWmV0dGVsKHN0cmluZyBzdHIpIHsKKyAgICBvYmplY3QgcGw7CisgICAgc3RyaW5nIHJ3ZWRlbDsKKyAgLy93ZWRlbHQgYW5kZXJlbiBtaXQgZGVtIFpldHRlbCB2b3IgZGVyIE5hc2UgaGVydW0uCisgIG5vdGlmeV9mYWlsKCJXZW0gd2lsbHN0IER1IERlaW5lbiBNZXJremV0dGVsIHplaWdlbj9cbiIpOworICBpZiAoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmICghZW52aXJvbm1lbnQoKSB8fCAhZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpCisgICAgIHJldHVybigwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIGlmICghb2JqZWN0cChwbD1maW5kX3BsYXllcihzdHIpKSkgcmV0dXJuKDApOworICBpZiAoIXByZXNlbnQocGwsZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSkpKQorICAgIHJ3ZWRlbD0iYXVzIGRlciBGZXJuZSI7CisgICAgICAKKyAgdGVsbF9vYmplY3QoUEwsQlMoIkR1IHdlZGVsc3QgIitwbC0+TmFtZShXRU0pIAorCSsgKHJ3ZWRlbD8iICIrcndlZGVsOiIiKSAKKwkrIiBoZWZ0aWcgbWl0IERlaW5lbSBNZXJremV0dGVsIHZvciBkZXIgTmFzZSBoZXJ1bS4iKSk7CisgIHRlbGxfb2JqZWN0KHBsLEJTKFBMLT5OYW1lKFdFUikrICIgd2VkZWx0IERpciAiIAorCSsgKHJ3ZWRlbD9yd2VkZWwrIiAiOiIiKSArImhlZnRpZyBtaXQgIgorCStQTC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTSxTSU5HVUxBUikKKwkrIiBNZXJremV0dGVsIHZvciBkZXIgTmFzZSBoZXJ1bS4iKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChwbCksQlMoUEwtPk5hbWUoV0VSKSArICIgd2VkZWx0ICIKKwkrcGwtPk5hbWUoV0VNKSArIChyd2VkZWw/IiAiK3J3ZWRlbDoiIikgKyAiIGhlZnRpZyBtaXQgIgorICAgICAgICtQTC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTSxTSU5HVUxBUikKKyAgICAgICArIiBNZXJremV0dGVsIHZvciBkZXIgTmFzZSBoZXJ1bS4iKSwoe1BMLHBsfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBMaWVzRGVwcyhzdHJpbmcgc3RyKSB7CisgIC8vZXJzdG1hbCAocmVrdXJzaXYpIGFsbGUgQWJoYWVuZ2lna2VpdGVuIGVpbmVyIE5vdGl6IGVybWl0dGVsbgorICBzdHJpbmcgKmFycjsKKyAgaW50IGlkLCByZWMsIGk7CisgIGludCAqbGlzdGU7CisgIAorICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgZ2dmLiAnMScgZnVlciByZWt1cnNpdmUgU3VjaGUgYW5nZWJlbiFcbiIpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICAKKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICAiRGVpbiBNZXJremV0dGVsIGlzdCBibHVldGVud2Vpc3MgdW5kIGxlZXIhIFdpZSBrb21tdCBkYXMgZGVubj8/ICIKKyAgICAgICJIYXN0IER1IG5peCB6dSB0dW4/IikpOworICAgIHJldHVybigxKTsKKyAgfQorICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgYXJyLT0oeyIifSk7ICAvLyAiIiBlbnRmZXJuZW4KKyAgaWYgKHNpemVvZihhcnIpPT0xKSB7CisgICAgaWQ9dG9faW50KGFyclswXSk7CisgICAgcmVjPTA7ICAvL1N0YW5kYXJkOiBrZWluZSBSZWt1cnNpb24KKyAgfQorICBlbHNlIGlmIChzaXplb2YoYXJyKT49MikgeworICAgIGlkPXRvX2ludChhcnJbMF0pOworICAgIHJlYz10b19pbnQoYXJyWzFdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgLy9Ob3RpemVuLCB2b24gZGVuZW4gaWQgYWJoYWVuZ3QsIGhvbGVuCisgIC8vdW5kIG51ciBha3RpdmUgTm90aXplbiBiZWhhbHRlbgorICBsaXN0ZT1maWx0ZXIoZ2V0RGVwcyhpZCxyZWMpLCMnbm90ZV9maWx0ZXIsTk9URV9BQ1RJVkUpOworICAvL25hY2ggUHJpb3JpdGFldCBzb3J0aWVyZW4KKyAgbGlzdGU9c29ydF9hcnJheShsaXN0ZSwjJ3NvcnRfcHJpbyk7CisgIC8vZGFubiBtYWwgYXVzZ2ViZW4uCisgIGk9c2l6ZW9mKGxpc3RlKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoc3ByaW50ZigiRHUgdmVydGllZnN0IERpY2ggaW4gZGllIEFiaGFlbmhpZ2tlaXRlbiB2b24gTm90aXo6ICVkXG4iLGlkKSkpOworICB3aGlsZShpLS0pIHsKKyAgICB0ZWxsX29iamVjdChQTCxfTGllc05vdGl6KGxpc3RlW2ldKSsiXG4iKTsKKyAgfQorICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGxpZXN0IGV0d2FzIGF1ZiAlcyBNZXJremV0dGVsLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7ICAgIAorfQorCitpbnQgRXhwaXJlKHN0cmluZyBzdHIpIHsKKyAgZmxvYXQgYWdlOworICBpbnQgc2VrdW5kZW4sIGk7CisgIGludCAqbGlzdGU7CisgIHN0cmluZyByZXM7CisgIAorICBub3RpZnlfZmFpbCgiQml0dGUgYW5nZWJlbiwgd2llIGFsdCB6dSBsb2VzY2hlbmRlIE5vdGl6ZW4gc2VpbiBzb2xsZW4gKGluIFRhZ2VuKSFcbiIpOworICBpZighb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgc3RyPShzdHJpbmcpUEwtPl91bnBhcnNlZF9hcmdzKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpCisgICAgcmV0dXJuKDApOworICBhZ2U9dG9fZmxvYXQoc3RyKTsKKyAgaWYgKGFnZTw9MCkgcmV0dXJuKDApOworICBzZWt1bmRlbj10aW1lKCkgLSAoaW50KShhZ2UqODY0MDApOworICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIC8vYWJnZWhha3RlIE5vdGl6ZW4gZXJtaXR0ZWxuCisgIGxpc3RlPWZpbHRlcihtX2luZGljZXMobm90aXplbiksIydub3RlX2ZpbHRlcixOT1RFX0ZJTklTSEVEKTsKKyAgLy9Ob3RpemVuIGVybWl0dGVsbiwgZGllIGxhbmcgZ2VudWcgYWJnZWhha3Qgc2luZC4KKyAgbGlzdGU9ZmlsdGVyKGxpc3RlLCMnYWVsdGVyX2FscyxzZWt1bmRlbik7CisgIGlmICghc2l6ZW9mKGxpc3RlKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKCJLZWluZSBOb3RpemVuIGdlZnVuZGVuLCBkaWUgbGFuZyBnZW51ZyBhYmdlaGFrdCBzaW5kLiIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgcmVzPXNwcmludGYoIkFyY2hpdmllcnRlIE5vdGl6ZW4gdm9tICVzXG5cbiIsZHRpbWUodGltZSgpKSk7CisgIGZvciAoaT1zaXplb2YobGlzdGUpO2ktLTspIHsKKyAgICAvL0luZm9zIG5vY2ggZWlubWFsIGF1c2dlYmVuIHVuZCBsb2VzY2hlbgorICAgIHJlcys9X0xpZXNOb3RpeihsaXN0ZVtpXSkrIlxuIjsKKyAgICBtX2RlbGV0ZShub3RpemVuLGxpc3RlW2ldKTsKKyAgfQorICByZXMrPSJcbiI7CisgIHdyaXRlX2ZpbGUoQVJDSElWRShvd25lcikscmVzKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoc3ByaW50ZigKKyAgICAiJWQgYWx0ZSBOb3RpemVuIHd1cmRlbiBuYWNoICVzIGFyY2hpdmllcnQgdW5kIGdlbG9lc2NodC4iLAorICAgICAgIHNpemVvZihsaXN0ZSksQVJDSElWRShvd25lcikpKSk7CisgIHJldHVybigxKTsKK30KKworLy8KK3N0YXRpYyBzdHJpbmcgX0xpZXNOb3RpeihpbnQgaWQpIHsKKyAgLy9GdW5rdGlvbiB2ZXJsYWVzc3Qgc2ljaCBkcmF1ZiwgZGFzcyBpZCBleGlzdGllcnQuIDstKQorICBzdHJpbmcgcmVzLHR4dDsKKyAgcmVzPUJTTChzcHJpbnRmKCIlLTExczogJWQiLCJOb3Rpei1Oci4iLGlkKSk7CisgIHJlcys9YnJlYWtfc3RyaW5nKG5vdGl6ZW5baWQsTk9URV9URVhUXSw3OCwiTm90aXp0ZXh0ICA6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTX0lOREVOVF9PTkNFfEJTX0xFQVZFX01ZX0xGUyk7CisgIHJlcys9c3ByaW50ZigiJS0xMXM6ICVkXG4iLCJQcmlvcml0YWV0Iixub3RpemVuW2lkLE5PVEVfUFJJT10pOworICAvL3dlbm4gbmljaHQgYWt0aXY6IFN0YXR1cyBhbnplaWdlbgorICBpZiAobm90aXplbltpZCxOT1RFX1NUQVRVU10hPU5PVEVfQUNUSVZFKSB7CisgICAgc3dpdGNoKG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdKSB7CisgICAgICBjYXNlIE5PVEVfSU5BQ1RJVkU6CisgICAgICAgICAgdHh0PSJJbmFrdGl2L1BhdXNlIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTk9URV9GSU5JU0hFRDoKKyAgICAgICAgICB0eHQ9IkFiZ2VzY2hsb3NzZW4iOyAKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTk9URV9QRU5ESU5HOgorICAgICAgICAgIHR4dD0iV2FydGUgYXVmIFJ1ZWNrbWVsZHVuZyI7IAorICAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogdHh0PXNwcmludGYoIiVkIixub3RpemVuW2lkLE5PVEVfU1RBVFVTXSk7IGJyZWFrOworICAgIH0KKyAgICByZXMrPXNwcmludGYoIiUtMTFzOiAlc1xuIiwiU3RhdHVzIix0eHQpOworICAgIC8vd2VubiBhYmdlc2NobG9zc2VuOiBFbmRlemVpdCBhbnplaWdlbgorICAgIGlmIChub3RpemVuW2lkLE5PVEVfU1RBVFVTXT09Tk9URV9GSU5JU0hFRCkKKyAgICAgIHJlcys9c3ByaW50ZigiJS0xMXM6ICVzXG4iLCJFbmRlemVpdCIsCisgICAgICAgICAgICAgICAgICBkdGltZShub3RpemVuW2lkLE5PVEVfQ0xPU0VUSU1FXSkpOworICB9CisgIHJlcys9c3ByaW50ZigiJS0xMXM6ICVzXG4iLCJNZXJremVpdCIsZHRpbWUobm90aXplbltpZCxOT1RFX1NUQVJUVElNRV0pKTsKKyAgLy9udXIgd2VubiBBYmhhZW5naWdrZWl0ZW46IGFuZXplaWdlbgorICBpZiAocG9pbnRlcnAobm90aXplbltpZCxOT1RFX0RFUFNdKSAmJiBzaXplb2Yobm90aXplbltpZCxOT1RFX0RFUFNdKSkgeworICAgIHR4dD1pbXBsb2RlKG1hcChub3RpemVuW2lkLE5PVEVfREVQU10sIyd0b19zdHJpbmcpLCIgIik7CisgICAgcmVzKz1zcHJpbnRmKCIlLTExczogJXNcbiIsImFiaC4gdm9uIix0eHQpOworICB9CisgIC8vbnVyIHdlbm4gSGVsZmVyOiBhbmV6ZWlnZW4KKyAgaWYgKHBvaW50ZXJwKG5vdGl6ZW5baWQsTk9URV9IRUxQRVJdKSAmJiBzaXplb2Yobm90aXplbltpZCxOT1RFX0hFTFBFUl0pKQorICAgIHJlcys9c3ByaW50ZigiJS0xMXM6ICVzXG4iLCJIZWxmZXIiLAorICAgICAgICAgICAgICAgIGltcGxvZGUobm90aXplbltpZCxOT1RFX0hFTFBFUl0sIiAiKSk7CisgIHJldHVybihyZXMpOworfQorCisvL2ludC4gSGVsZmVyCitzdGF0aWMgaW50IG5vdGVfZmlsdGVyKGludCBpZCxpbnQgZmlsdGVyc3RhdGUpIHsKKyAgICAvL2tlaW4gZmlsdGVyIC0+IHBhc3N0IGltbWVyCisgICAgaWYgKCFmaWx0ZXJzdGF0ZSkgcmV0dXJuKDEpOworICAgIGlmIChtZW1iZXIobm90aXplbixpZCkgJiYKKyAgICBub3RpemVuW2lkLE5PVEVfU1RBVFVTXT09ZmlsdGVyc3RhdGUpCisgICAgcmV0dXJuKDEpOworICAgIHJldHVybigwKTsKK30KKworc3RhdGljIGludCBhZWx0ZXJfYWxzKGludCBpZCxpbnQgemVpdCkgeworICAvL2xpZWZlcnQgMSB6dXJ1ZWNrLCB3ZW5uIFNjaGxpZXNzemVpdCBkZXIgTm90aXogbGFlbmdlciBhbHMgJ3Nla3VuZGVuJyBoZXIgaXN0LCBzb25zdCAwLgorICBpZiAobm90aXplbltpZCxOT1RFX0NMT1NFVElNRV08emVpdCkgcmV0dXJuKDEpOworICByZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBzdHJpbmcgdXBkYXRlX2RlcHMoc3RyaW5nIHN0cixpbnQgaWQpIHsKKyAgLy93YW5kZWx0IHN0ciBuYWNoIGludCB1bQorICAvL3NjaGF1dCwgb2IgZGVwIHBvc2l0aXYgdW5kIG5vY2ggbmljaHQgYmVrYW5udCBpc3QsIHdlbm4gamE6IAorICAvL3p1IGRlcHMgaGluenVmdWVnZW4KKyAgLy93ZW5uIGRlcCA8IDAgdW5kIGJla2FubnQgaXN0OiBhdXMgZGVwcyBlbnRmZXJuZW4KKyAgLy9SdWVja2dhYmV3ZXJ0IGlzdCBlZ2FsLiA7LSkKKyAgaW50IGRlcDsKKyAgZGVwPXRvX2ludChzdHIpOworICBpZiAoZGVwPjAgJiYgbWVtYmVyKG5vdGl6ZW5baWQsTk9URV9ERVBTXSxkZXApPT0tMSkKKyAgICBub3RpemVuW2lkLE5PVEVfREVQU10rPSh7ZGVwfSk7CisgIGVsc2UgaWYgKGRlcDwwICYmIG1lbWJlcihub3RpemVuW2lkLE5PVEVfREVQU10sZGVwKi0xKSE9LTEpCisgICAgbm90aXplbltpZCxOT1RFX0RFUFNdLT0oe2RlcCotMX0pOworICByZXR1cm4oIiIpOworfQorCitzdGF0aWMgaW50ICpnZXREZXBzKGludCBpZCwgaW50IHJlYykgeworICAvL2VybWl0dGVsdCAoZ2dmLiByZWt1cnNpdiBiZWkgcmVjIT0wKSBkaWUgQWJoYWVuZ2lna2VpdGVuIGVpbmVyIE5vdGl6CisgIGludCBpLCAqbGlzdGU7CisgIGxpc3RlPW5vdGl6ZW5baWQsTk9URV9ERVBTXTsKKyAgLy9qZXR6dCBnZ2YuIG5vY2ggcmVrdXJzaXYgd2VpdGVyaG9sZW4KKyAgaWYgKHJlYykgIHsKKyAgICBpPTA7CisgICAgd2hpbGUoaTxzaXplb2YobGlzdGUpKSB7CisgICAgICAgIC8vbmljaHQgc2NocmVpZW4uIDstKQorICAgICAgICBpZiAoZ2V0X2V2YWxfY29zdCgpPDEwMDAwMCkgeworICAgICAgICAgICAgdGVsbF9vYmplY3QoUEwsIkZlaGxlcjogWnUgbGFuZ2UgUmVrdXJzaW9uIGJlaSAiCisJCSJFcm1pdHRlbG4gZGVyIEFiaGFlbmdpZ2tlaXRlbiwgQWJicnVjaFxuIik7CisgICAgICAgICAgICByZXR1cm4obGlzdGUpOworICAgICAgICB9CisgICAgICAgIC8vQWJoYWVuZ2lna2VpdGVuIGRlciBhbmRlcmVuIEFiaGFlbmdpZ2tlaXRlbiBoaW50ZW4gYW5oYWVuZ2VuLgorICAgICAgICBsaXN0ZSs9bm90aXplbltsaXN0ZVtpXSxOT1RFX0RFUFNdOworICAgICAgICBpKys7CisgICAgfQorICB9CisgIHJldHVybihsaXN0ZSk7Cit9CisKK3N0YXRpYyBpbnQgKmdldFVucmVzb2x2ZWREZXBzKGludCBpZCkgeworICAvL2xpZWZlcnQgZGllIEFuemFobCBkZXIgbmljaHQgYWJnZWhha3RlbiBOb3RpemVuLCB2b24gZGVuZW4gZWluZSAKKyAgLy9Ob3RpeiBhYmhhZW5naWcgaXN0IChyZWt1cnNpdikKKyAgaW50ICpsaXN0ZTsKKyAgLy9BYmhhZW5naWdrZWl0ZW4gcmVrdXJzaXYgaG9sZW4KKyAgbGlzdGU9Z2V0RGVwcyhpZCwxKTsKKyAgLy9uaWNodCBhYmdlaGFrdGUgenVydWVja2dlYmVuCisgIHJldHVybihsaXN0ZS1maWx0ZXIobGlzdGUsIydub3RlX2ZpbHRlcixOT1RFX0ZJTklTSEVEKSk7Cit9CisKK3ZvaWQgaW5pdCgpIHsKKyAgOjppbml0KCk7CisgIC8vd2VubiBrZWluIEVudiwgRW52IGtlaW4gbWFnaWVyIG9kZXIgbmljaHQgZGVyIEVpZ2VudHVlbWVyIGlzdDogd2VnCisgIGlmICghb2JqZWN0cChlbnZpcm9ubWVudCgpKSB8fCAhSVNfTEVBUk5FUihlbnZpcm9ubWVudCgpKQorICAgICB8fCAoc3RyaW5ncChvd25lcikgJiYgZ2V0dWlkKGVudmlyb25tZW50KCkpIT1vd25lcikgKSB7CisgICAgaWYgKGZpbmRfY2FsbF9vdXQoInJlbW92ZSIpID09IC0xKQorICAgICAgY2FsbF9vdXQoInJlbW92ZSIsMSwxKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy9iZWltIGVyc3RtYWxpZ2VuIEJld2VnZW4gaW4gZWluZW4gTWFnaWVyIHdpcmQgZGVyIGFscyBFaWdlbnR1ZW1lcgorICAvL3JlZ2lzdHJpZXJ0LiBEYW5hY2gga29tbXQgZGllc2UgSW5mbyBhdXMgUF9BVVRPTE9BRAorICBpZiAoIXN0cmluZ3Aob3duZXIpKQorICAgIG93bmVyPWdldHVpZChlbnZpcm9ubWVudCgpKTsKK30KKworc3RhdGljIG5vbWFzayBzdGF0dXMgY2hlY2tfYWxsb3dlZCgpIHsKKyAgLy9adWdyaWZmIGF1ZiBkaWUgRGF0ZW4gZnVlciBkZW4gRWlnZW50dWVtZXIKKyAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpICYmCisgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpPT1vd25lcgorICAgICAmJiAhcHJvY2Vzc19jYWxsKCkpCisgICAgcmV0dXJuKDEpOworICByZXR1cm4oMCk7Cit9CisKK3Byb3RlY3RlZCBpbnQgcmVzdG9yZV9tZSgpIHsKKyAgLy9sYWVkdCBTYXZlZmlsZSBpbSBIb21lIHZvbSBNYWdpZXIKKyAgaWYoIXN0cmluZ3Aob3duZXIpKSByZXR1cm4oMCk7CisgIGlmKCFyZXN0b3JlX29iamVjdChTQVZFRklMRShvd25lcikpKSB7CisgICAgbWF4dXNlZElEPTE7CisgICAgbm90aXplbj0wOworICAgIC8vY2FjaGU9KHt9KTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgcmV0dXJuKDEpOworfQorCit2YXJhcmdzIHByb3RlY3RlZCB2b2lkIHNhdmVfbWUoaW50IGRlbGF5KSB7CisgIC8vc3BlaWNoZXJ0IFNhdmVmaWxlIGltIEhvbWUgdm9tIE1hZ2llcgorICBpZighc3RyaW5ncChvd25lcikpIHJldHVybjsKKyAgLy93ZW5uIG1heHVzZWRJRD09MCB3dXJkZSBkZXIgemV0dGVsIG5vY2ggbmljaHQgb3JkZW50bGljaCBpbml0aWFsaXNpZXJ0CisgIC8vYnp3LiByZXN0YXVyaWVydC4gSW4gZGllc2VtIEZhbGwgd3VlcmRlIGVpbiBsZWVyZXMgU2F2ZWZpbGUgZ2VzY2hyaWViZW4KKyAgaWYgKG1heHVzZWRJRD09MCkKKyAgICByZXN0b3JlX21lKCk7CisgIGlmKCFkZWxheSkKKyAgICAvL2RpcmVrdCBzcGVpY2hlbi4gOy0pCisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUob3duZXIpKTsKKyAgZWxzZSB7CisgICAgLy92ZXJ6b2VnZXJ0IHNwZWljaGVybiwgd2VubiBzY2hvbiBlaW4gY2FsbF9vdXQgbGFldWZ0LCBuZWhtIGljaCBkZW4KKyAgICBpZihmaW5kX2NhbGxfb3V0KCMnc2F2ZV9tZSk9PS0xKQorICAgICAgY2FsbF9vdXQoIydzYXZlX21lLGRlbGF5KTsKKyAgfQorfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICAvL2Vyc3RtYWwgc3BlaWNoZXJuLiA7LSkKKyAgc2F2ZV9tZSgpOworICByZXR1cm4gOjpyZW1vdmUoc2lsZW50KTsKK30KKworc3RhdGljIHN0cmluZyBxdWVyeV9hdXRvbG9hZG9iaigpIHsKKyAgLy9pbiBQX0FVVE9MT0FEIHdpcmQgbnVyIGRlciBFaWdlbnR1ZW1lciBnZXNwZWljaGVydAorICByZXR1cm4gb3duZXI7Cit9CisKK3N0YXRpYyBzdHJpbmcgc2V0X2F1dG9sb2Fkb2JqKG1peGVkIGFyZykgIHsKKyAgLy9FaWdlbnR1ZW1lciBhdXMgUF9BVVRPTE9BRCByZXN0YXVyaWVyZW4KKyAgaWYgKHN0cmluZ3AoYXJnKSkKKyAgICBvd25lcj1hcmc7CisgIHJldHVybihvd25lcik7Cit9CisKKy8vU2hhZG93IHVuZXJ3dWVuc2NodAoraW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KCkge3JldHVybigxKTt9CisKK3ZhcmFyZ3Mgc3RhdGljIGludCBjaGVja1N0YXR1cyhpbnQgbm9jYWNoZSkgeworICAvL3NjaGF1dCwgb2IgTm90aXplbiBkYSwgb2IgZGVyIENhY2hlIE9rIGlzdCwgZXRjLgorICAvL2xpZWZlcnQgQW56YWhsIGRlciBOb3RpemVuIGF1ZiBkZW0gTWVya3pldHRlbAorICAKKyAgLy93ZW5uIGtlaW5lIE5vdGl6ZW4gZGEgc2luZCwgc2NoYXVlbiwgb2IgZGFzIFNhdmVmaWxlIGVpbmdlbGVzZW4gd2VyZGVuCisgIC8va2FubgorICBpZiAoIW1hcHBpbmdwKG5vdGl6ZW4pIHx8ICFzaXplb2Yobm90aXplbikpCisgICAgcmVzdG9yZV9tZSgpOworICBpZiAoIW1hcHBpbmdwKG5vdGl6ZW4pKSByZXR1cm4oMCk7CisvKiBDYWNoZSBpc3QgZWlnZW50bGljaCBuaWNodCBub2V0aWcgdW5kIG1pciBnZXJhZGUgenUgdW5wcmFrdGlzY2gsIHJhdXMgZGFtaXQuICAKKyAgLy93ZW5uIGtlaW5lIEFrdHVhbGlzaWVydW5nIGRlcyBDYWNoZSBlcnd1ZW5zY2h0IGlzdAorICBpZihub2NhY2hlKSByZXR1cm4oMCk7CisgIAorICBpZiAoc2l6ZW9mKG5vdGl6ZW4pKSB7CisgICAgaWYoIXBvaW50ZXJwKGNhY2hlKSB8fCAhc2l6ZW9mKGNhY2hlKSkgeworICAgICAgLy9jYWNoZSBlcm5ldWVybgorICAgICAgY2FjaGU9c29ydF9hcnJheShtX2luZGljZXMobm90aXplbiksInNvcnRfcHJpbyIpOworICAgIH0KKyAgfQorICByZXR1cm4oc2l6ZW9mKGNhY2hlKSk7IC8vYWVxdWl2YWxlbnQgenUgc2l6ZW9mKG5vdGl6ZW4pCisgICovCisgIHJldHVybihzaXplb2Yobm90aXplbikpOworfQorCitzdGF0aWMgc3RhdHVzIHNvcnRfcHJpbyhpbnQga2V5MSwgaW50IGtleTIpIHsKKyAgLy8gMSwgZmFsbHMgZmFsc2NoZSBSZWloZW5mb2xnZSwKKyAgLy8gMCwgd2VubiByaWNodGlnZQorICAvLyB1bmQgendhciBfYWJzdGVpZ2VuZF8sIGFsc28gaG9lY2hzdGUgUHJpbyBpbiBsaXN0ZVswXSAhCisgIHJldHVybihub3RpemVuW2tleTEsTk9URV9QUklPXTw9bm90aXplbltrZXkyLE5PVEVfUFJJT10pOworfQorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyBEZWJ1Z2dpbmcKK21hcHBpbmcgUXVlcnlOb3RpemVuKCkgeworICAKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgY2hlY2tTdGF0dXMoKTsKKyAgcmV0dXJuKG5vdGl6ZW4pOworfQorCisvL2ludCAqUXVlcnlDYWNoZSgpIHtyZXR1cm4oY2FjaGUpO30KKworaW50IFF1ZXJ5U2l6ZSgpIHtyZXR1cm4oc2l6ZW9mKG5vdGl6ZW4pKTt9CisKK3N0cmluZyBRdWVyeU93bmVyKCkge3JldHVybihvd25lcik7fQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL21lcmt6ZXR0ZWwvbWVya3pldHRlbC5oIGIvb2JqL3Rvb2xzL21lcmt6ZXR0ZWwvbWVya3pldHRlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTc3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbWVya3pldHRlbC9tZXJremV0dGVsLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBfX1pFU1NUUkFfTUVSS1pFVFRFTF9IX18KKyNkZWZpbmUgX19aRVNTVFJBX01FUktaRVRURUxfSF9fCisKKyNkZWZpbmUgU0FWRUZJTEUoeCkgKCIvcGxheWVycy8iK3grIi8ubWVya3pldHRlbCIpCisjZGVmaW5lIEFSQ0hJVkUoeCkgKCIvcGxheWVycy8iK3grIi9tZXJremV0dGVsLmFyY2hpdiIpCisKKyNkZWZpbmUgTk9URV9URVhUIDAKKyNkZWZpbmUgTk9URV9QUklPIDEKKyNkZWZpbmUgTk9URV9TVEFSVFRJTUUgMgorI2RlZmluZSBOT1RFX0RFUFMgMworI2RlZmluZSBOT1RFX0hFTFBFUiA0CisjZGVmaW5lIE5PVEVfU1RBVFVTIDUKKyNkZWZpbmUgTk9URV9DTE9TRVRJTUUgNgorCisvL1N0YXR1cywgPjAgc2luZCBha3RpdiwgPDAgaW5ha3RpdgorI2RlZmluZSBOT1RFX0FDVElWRSAxCisjZGVmaW5lIE5PVEVfUEVORElORyAyCisjZGVmaW5lIE5PVEVfSU5BQ1RJVkUgLTEKKyNkZWZpbmUgTk9URV9GSU5JU0hFRCAtMgorI2RlZmluZSBOT1RFX1NUQVRFUyAoe05PVEVfQUNUSVZFLE5PVEVfUEVORElORyxOT1RFX0lOQUNUSVZFLE5PVEVfRklOSVNIRUR9KQorCisvL1NvcnRpZXJyZWloZW5mb2xnZQorI2RlZmluZSBTT1JUX0lOVkVSU0UgMQorCisvL3dpZXZpZWwgd2lyZCBtYXguYWJnZXNwZWljaGVydAorI2RlZmluZSBNQVhfTk9URV9MRU5HVEggMTAwMAorLy93aWV2aWVsIHdpcmQgbWF4LiBpbiBkZXIgTGlzdGUgYW5nZXplaWd0CisjZGVmaW5lIE1BWF9OT1RFX0xJU1RfTEVOR1RIIDUwCisKKyNkZWZpbmUgQlMoeCkgYnJlYWtfc3RyaW5nKHgsNzgpCisjZGVmaW5lIEJTSSh4LHkpIGJyZWFrX3N0cmluZyh4LDc4LHkpCisjZGVmaW5lIEJTTCh4KSBicmVha19zdHJpbmcoeCw3OCwiIixCU19MRUFWRV9NWV9MRlMpCisjZGVmaW5lIEJTSUwoeCx5KSBicmVha19zdHJpbmcoeCw3OCx5LEJTX0xFQVZFX01ZX0xGUykKKworI2RlZmluZSBUSSB0aGlzX2ludGVyYWN0aXZlKCkKKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworLy9BZGRDbWQKK2ludCBBZGROb3RpeihzdHJpbmcgc3RyKTsKK2ludCBFcnNldHplVGV4dChzdHJpbmcgc3RyKTsKK2ludCBFcmdhZW56ZVRleHQoc3RyaW5nIHN0cik7CitpbnQgUmVtb3ZlTm90aXooc3RyaW5nIHN0cik7CitpbnQgRmluaXNoTm90aXooc3RyaW5nIHN0cik7CitpbnQgTGlzdE5vdGl6ZW4oc3RyaW5nIHN0cik7CitpbnQgTGllc05vdGl6KHN0cmluZyBzdHIpOworaW50IENoYW5nZURlcChzdHJpbmcgc3RyKTsKK2ludCBDaGFuZ2VTdGF0dXMoc3RyaW5nIHN0cik7CitpbnQgQ2hhbmdlUHJpbyhzdHJpbmcgc3RyKTsKK2ludCBDaGFuZ2VIZWxwZXIoc3RyaW5nIHN0cik7CitpbnQgWmVpZ2VaZXR0ZWwoc3RyaW5nIHN0cik7CitpbnQgV2VkZWxaZXR0ZWwoc3RyaW5nIHN0cik7CitpbnQgTGllc0RlcHMoc3RyaW5nIHN0cik7CitpbnQgRXhwaXJlKHN0cmluZyBzdHIpOworCisvL3ZvbiBkZW4gQWRkQ21kLUZ1bnMgZ2VydWZlbgorc3RhdGljIHN0cmluZyBfTGllc05vdGl6KGludCBpZCk7CisKKy8vc29uc3QuIEZ1bmt0aW9uZW4sIHouQi4gZnVlciBEZWJ1Z3p3ZWNrZQorbWFwcGluZyBRdWVyeU5vdGl6ZW4oKTsKK3N0cmluZyBRdWVyeU93bmVyKCk7Cit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCk7CisKKy8vaW50LiBGdW5rdGlvbmVuCitzdGF0aWMgc3RhdHVzIHNvcnRfcHJpbyhpbnQga2V5MSwgaW50IGtleTIpOworc3RhdGljIG5vbWFzayBzdGF0dXMgY2hlY2tfYWxsb3dlZCgpOworcHJvdGVjdGVkIGludCByZXN0b3JlX21lKCk7Cit2YXJhcmdzIHByb3RlY3RlZCB2b2lkIHNhdmVfbWUoaW50IGRlbGF5KTsKK3N0YXRpYyBzdHJpbmcgcXVlcnlfYXV0b2xvYWRvYmooKTsKK3N0YXRpYyBzdHJpbmcgc2V0X2F1dG9sb2Fkb2JqKG1peGVkIGFyZyk7Cit2YXJhcmdzIHN0YXRpYyBpbnQgY2hlY2tTdGF0dXMoaW50IG5vY2FjaGUpOworc3RhdGljIHN0cmluZyB1cGRhdGVfZGVwcyhzdHJpbmcgc3RyLGludCBpZCk7CitzdGF0aWMgaW50IG5vdGVfZmlsdGVyKGludCBpZCxpbnQgZmlsdGVyc3RhdGUpOworc3RhdGljIGludCBhZWx0ZXJfYWxzKGludCBpZCxpbnQgemVpdCk7CitzdGF0aWMgaW50ICpnZXRVbnJlc29sdmVkRGVwcyhpbnQgaWQpOworc3RhdGljIGludCAqZ2V0RGVwcyhpbnQgaWQsaW50IHJlYyk7CisKKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKKworI2VuZGlmIC8vIF9fWkVTU1RSQV9NRVJLWkVUVEVMX0hfXwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL211ZGxpbmsuYyBiL29iai90b29scy9tdWRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5ZDU0NgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9tdWRsaW5rLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIG11ZGxpbmsgdG9vbCwgb2ZmZXJzIHNldmVyYWwgY29tbWFuZHMgYXMgYW4gaW50ZXJmYWNlIHRvIHRoZQorICogTVVETElOSyBzeXN0ZW0uCisgKgorICogQ29tbWFuZHMgb2ZmZXJlZDoKKyAqIHJwZWVycworICogcndobyA8cmVtb3RlbXVkPgorICogcnRlbGwgPHBsYXllcj5APHJlbW90ZW11ZD4KKyAqCisgKiBEZWVwdGhvdWdodCwgMTktSmFuLTkzCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKK2NyZWF0ZSgpIHsKKyAgc3RyaW5nIG5hbWUsIGZvbzsKKworICBpZiAoc2l6ZW9mKG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCIjIikpICE9IDIpIHJldHVybjsKKworICB0aGluZzo6Y3JlYXRlKCk7CisgIFNldFByb3AgKFBfU0hPUlQsImEgTVVETElOSyB0b29sIik7CisgIFNldFByb3AgKFBfTE9ORywKKyAiVGhpcyB0b29sIGlzIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBNVURMSU5LLiBDb21tYW5kcyBhcmU6XG4iCisrInJwZWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0IGEgbGlzdCBvZiBtdWRzIGNvbm5lY3RlZCB0byBNVURMSU5LXG4iCisrInJ3aG8gPG11ZD4gICAgICAgICAgICAgICAgICAgICAgU2hvdyBhIGxpc3Qgb2YgcGxheWVycyBvbiB0aGUgcmVtb3RlIG11ZFxuIgorKyJydGVsbCA8cGxheWVyPkA8bXVkPiA8bWVzc2FnZT4gIFRlbGwgc29tZXRoaW5nIHRvIGEgcGxheWVyIG9uIGFub3RoZXIgbXVkXG4iCisgICAgICAgICAgKTsKKyAgQWRkSWQgKCJ0b29sIik7CisgIEFkZElkICgibXVkbGluayIpOworICBBZGRBZGplY3RpdmUoIm11ZGxpbmsiKTsKKyAgU2V0SW5mbyAoIk11ZGxpbmsgVG9vbCBWMC4xIGJ5IERlZXB0aG91Z2h0Iik7Cit9CisKK19xdWVyeV9yZWFkX21zZygpIHsgcmV0dXJuIDA7IH0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKiBBZGQgYW5kIGRlY29kZSBvdXIgY29tbWFuZHMuCisqLworCitpbml0KCkgeworICB0aGluZzo6aW5pdCgpOworICBhZGRfYWN0aW9uKCJycGVlcnMiLCJycGVlcnMiKTsKKyAgYWRkX2FjdGlvbigicndobyIsInJ3aG8iKTsKKyAgYWRkX2FjdGlvbigicnRlbGwiLCJydGVsbCIpOworfQorCitycGVlcnMoKSB7CisgIHN0cmluZyB1OworICB1ID0gZ2V0ZXVpZCh0aGlzX3BsYXllcigpKTsKKyAgaWYgKHN0cmluZ3AodSkpCisgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoIm11ZGxpbmsiKSwicnBlZXJzICIrdSsiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3J3aG8oc3RyKSB7CisgIHN0cmluZyB1OworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICB3cml0ZSgiVXNhZ2U6IHJ3aG8gPG11ZD5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHJpbmdwKHUgPSBnZXRldWlkKHRoaXNfcGxheWVyKCkpKSkKKyAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigibXVkbGluayIpLCJyd2hvICIrdSsiPSIrc3RyKyJcbiIpOworICByZXR1cm4gMTsKK30KKworcnRlbGwoc3RyKSB7CisgIHN0cmluZyB1OworICBzdHJpbmcgYSwgYiwgYywgZDsKKworICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICB3cml0ZSgiVXNhZ2U6IHJ0ZWxsIDxwbGF5ZXI+QDxtdWQ+IDxtZXNzYWdlPlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHNzY2FuZihzdHIsICIlc0AlcyAlcyIsIGEsIGIsIGMpICE9IDMpIHsKKyAgICB3cml0ZSgiVXNhZ2U6IHJ0ZWxsIDxwbGF5ZXI+QDxtdWQ+IDxtZXNzYWdlPlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0cmluZ3AodSA9IGdldGV1aWQodGhpc19wbGF5ZXIoKSkpKQorICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJtdWRsaW5rIiksInJwYWdlICIrdSsiQCIrYSsiQCIrYisiPSIrYysiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbmV3c3Rvb2wuYyBiL29iai90b29scy9uZXdzdG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjcxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbmV3c3Rvb2wuYwpAQCAtMCwwICsxLDMzNSBAQAoraW5oZXJpdCAic3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG5ld3MuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKyNkZWZpbmUgVUEgUEwtPl91bnBhcnNlZF9hcmdzKCkKKwordm9pZCBjcmVhdGUoKQoreworICBzdHJpbmcgc3RyOworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTE9ORywiRWluIE5ld3MtR3J1cHBlbi1Ub29sLlxuXAorQmVmZWhsZTogYWRkZyAgICAgIDxncm5hbWU+IDxvd25lcm5hbWU+ICAgOiBHcnVwcGUgZXJ6ZXVnZW5cblwKKyAgICAgICAgIHJlbW92ZWcgICA8Z3JuYW1lPiAgICAgICAgICAgICAgIDogR3J1cHBlIGxvZXNjaGVuXG5cCisgICAgICAgICBhZGR3ICAgICAgPGdybmFtZT4gPHVzZXJuYW1lPiAgICA6IFNjaHJlaWJiZXJlY2h0aWd0ZW4gZWludHJhZ2VuXG5cCisgICAgICAgICByZW1vdmV3ICAgPGdybmFtZT4gPHVzZXJuYW1lPiAgICA6IFNjaHJlaWJiZXJlY2h0aWd0ZW4gYXVzdHJhZ2VuXG5cCisgICAgICAgICBhZGRkICAgICAgPGdybmFtZT4gPHVzZXJuYW1lPiAgICA6IExvZXNjaGJlcmVjaHRpZ3RlbiBlaW50cmFnZW5cblwKKyAgICAgICAgIHJlbW92ZWQgICA8Z3JuYW1lPiA8dXNlcm5hbWU+ICAgIDogTG9lc2NoYmVyZWNodGlndGVuIGF1c3RyYWdlblxuXAorICAgICAgICAgYWRkciAgICAgIDxncm5hbWU+IDx1c2VybmFtZT4gICAgOiBMZXNlYmVyZWNodGlndGVuIGVpbnRyYWdlblxuXAorICAgICAgICAgcmVtb3ZlciAgIDxncm5hbWU+IDx1c2VybmFtZT4gICAgOiBMZXNlYmVyZWNodGlndGVuIGF1c3RyYWdlblxuXAorICAgICAgICAgZ2luZm8gICAgIDxncm5hbWU+ICAgICAgICAgICAgICAgOiBJbmZvIHVlYmVyIEdydXBwZSBhYmZyYWdlblxuXAorICAgICAgICAgc2V0ZXhwaXJlIDxncm5hbWU+IDx0YWdlPiAgICAgICAgOiBFeHBpcmV0aW1lIHNldHplblxuXAorICAgICAgICAgc2V0bWF4bXNnIDxncm5hbWU+IDxhbno+ICAgICAgICAgOiBNYXhtc2cgc2V0emVuXG5cCisgICAgICAgICBzZXRnIDxncm5hbWU+IDxsb2VzY2hsZXY+IDxzY2hyZWlibGV2PiA8bGVzZWxldj4gPG1heG1zZz4gPGV4cGlyZT5cbiIpOworICBzdHI9Y2FwaXRhbGl6ZSgoKHN0cj1nZXR1aWQodGhpc19wbGF5ZXIoKSkpWzwxXT09J3MnfHxzdHJbPDFdPT0neCd8fAorCQkgIHN0cls8MV09PSd6Jyk/c3RyKz0iJyI6c3RyKz0icyIpOworICBTZXRQcm9wKFBfU0hPUlQsc3RyKyIgTmV3c1Rvb2wiKTsKKyAgU2V0UHJvcChQX05BTUUsc3RyKyIgTmV3c1Rvb2wiKTsKKyAgU2V0UHJvcChQX0dFTkRFUixORVVURVIpOworICBTZXRQcm9wKFBfQVJUSUNMRSwwKTsKKyAgQWRkSWQoIm5ld3N0b29sIik7CisgIEFkZElkKCJuZXdzZ3J1cHBlbnRvb2wiKTsKKyAgQWRkSWQoIm5ld3MtZ3J1cHBlbi10b29sIik7CisgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwxKTsKKyAgU2V0UHJvcChQX05PRFJPUCwxKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgYWRkX2FjdGlvbigiYWRkZyIsImFkZGciKTsKKyAgYWRkX2FjdGlvbigicmVtb3ZlZyIsInJlbW92ZWciKTsKKyAgYWRkX2FjdGlvbigiYWRkdyIsImFkZHciKTsKKyAgYWRkX2FjdGlvbigicmVtb3ZldyIsInJlbW92ZXciKTsKKyAgYWRkX2FjdGlvbigiYWRkZCIsImFkZGQiKTsKKyAgYWRkX2FjdGlvbigicmVtb3ZlZCIsInJlbW92ZWQiKTsKKyAgYWRkX2FjdGlvbigiYWRkciIsImFkZHIiKTsKKyAgYWRkX2FjdGlvbigicmVtb3ZlciIsInJlbW92ZXIiKTsKKyAgYWRkX2FjdGlvbigic2V0ZyIsInNldGciKTsKKyAgYWRkX2FjdGlvbigic2V0ZXhwaXJlIiwic2V0ZXhwaXJlIik7CisgIGFkZF9hY3Rpb24oImV4cGlyZSIsImV4cGlyZSIpOworICBhZGRfYWN0aW9uKCJnaW5mbyIsImdpbmZvIik7CisgIGFkZF9hY3Rpb24oInNldG1heG1zZyIsInNldG1heG1zZyIpOworfQorCitpbnQgYWRkcihzdHJpbmcgc3RyKQoreworICBtaXhlZCAqYXJyOworICBzdHJpbmcgc3QxLCBzdDI7CisgIAorICBpZiAoKHN0cj1VQSk9PSIiIHx8IHNzY2FuZihzdHIsIiVzICVzIixzdDEsc3QyKSAhPTIpeworICAgIHdyaXRlKCJhZGRyIDxncm91cG5hbWU+IDx1c2VybmFtZT5cbkFuc2NobGllc3NlbmQgZGFyZiBkZXIgVXNlciB1bmFiaGFlbmdpZyB2b20gV2l6bGV2ZWwgZGllIEdydXBwZSBsZXNlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIAorICBhcnI9b2xkX2V4cGxvZGUoc3QyLCIgIiktKHsiIn0pOworICBzd2l0Y2ggKCIvc2VjdXJlL25ld3MiLT5BZGRBbGxvd2VkKHN0MSwoe30pLCh7fSksYXJyKSl7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyXG4iKTsgYnJlYWs7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBib2FyZFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgcmVtb3ZlcihzdHJpbmcgc3RyKQoreworICBtaXhlZCAqYXJyOworICBzdHJpbmcgc3QxLCBzdDI7CisKKyAgaWYgKCEoc3RyPVVBKSB8fCBzc2NhbmYoc3RyLCIlcyAlcyIsc3QxLHN0MikgIT0yKXsKKyAgICB3cml0ZSgicmVtb3ZlciA8Z3J1cHBlbm5hbWU+IDx1c2VybmFtZT5cbkRhbmFjaCBkYXJmIGRlciBVc2VyIGRpZSBHcnVwcGUgbnVyIG5vY2ggbGVzZW4sIHdlbm4gc2VpbiBXaXpsZXZlbCBkaWVzIGVybGF1YnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGFycj1vbGRfZXhwbG9kZShzdDIsIiAiKS0oeyIifSk7CisgIHN3aXRjaCAoIi9zZWN1cmUvbmV3cyItPlJlbW92ZUFsbG93ZWQoc3QxLCh7fSksKHt9KSxhcnIpKXsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJcbiIpOyBicmVhazsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGJvYXJkXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBhZGRkKHN0cmluZyBzdHIpCit7CisgIG1peGVkICphcnI7CisgIHN0cmluZyBzdDEsIHN0MjsKKworICBpZiAoIShzdHI9VUEpIHx8IHNzY2FuZihzdHIsIiVzICVzIixzdDEsc3QyKSAhPTIpeworICAgIHdyaXRlKCJhZGRkIDxncnVwcGU+IDx1c2VyPlxuVXNlciBkYXJmIEFydGlrZWwgbG9lc2NoZW4gKHVuYWJoIHZvbSBXaXpsZXZlbClcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgYXJyPW9sZF9leHBsb2RlKHN0MiwiICIpLSh7IiJ9KTsKKyAgCXN3aXRjaCAoIi9zZWN1cmUvbmV3cyItPkFkZEFsbG93ZWQoc3QxLGFyciwoe30pLCh7fSkpKXsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJcbiIpOyBicmVhazsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGJvYXJkXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCByZW1vdmVkKHN0cmluZyBzdHIpCit7CisgIG1peGVkICphcnI7CisgIHN0cmluZyBzdDEsIHN0MjsKKworICBpZiAoIShzdHI9VUEpIHx8IHNzY2FuZihzdHIsIiVzICVzIixzdDEsc3QyKSAhPTIpeworICAgIHdyaXRlKCJyZW1vdmVkIDxncnVwcGU+IDx1c2VyPlxuVXNlciBkYXJmIG51ciBub2NoIEFydGlrZWwgbG9lc2NoZW4sIHdlbm4gc2VpbiBXaXpsZXZlbCBkYXMgZXJsYXVidC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgYXJyPW9sZF9leHBsb2RlKHN0MiwiICIpLSh7IiJ9KTsKKyAgc3dpdGNoICgiL3NlY3VyZS9uZXdzIi0+UmVtb3ZlQWxsb3dlZChzdDEsYXJyLCh7fSksKHt9KSkpeworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVyclxuIik7IGJyZWFrOworICAgIGNhc2UgMTogd3JpdGUoIk9rLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggYm9hcmRcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IGFkZHcoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmFycjsKKyAgc3RyaW5nIHN0MSwgc3QyOworCisgIGlmICghKHN0cj1VQSkgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLHN0MSxzdDIpICE9Mil7CisgICAgd3JpdGUoImFkZHcgPGdydXBwZT4gPHVzZXI+XG5Vc2VyIGRhcmYgQXJ0aWtlbCBzY2hyZWliZW4gKHVuYWJoIHZvbSBXaXpsZXZlbClcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgYXJyPW9sZF9leHBsb2RlKHN0MiwiICIpLSh7IiJ9KTsKKyAgc3dpdGNoICgiL3NlY3VyZS9uZXdzIi0+QWRkQWxsb3dlZChzdDEsKHt9KSxhcnIsKHt9KSkpeworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVyclxuIik7IGJyZWFrOworICAgIGNhc2UgMTogd3JpdGUoIk9rLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggYm9hcmRcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHJlbW92ZXcoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmFycjsKKyAgc3RyaW5nIHN0MSwgc3QyOworCisgIGlmICghKHN0cj1VQSkgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLHN0MSxzdDIpICE9Mil7CisgICAgd3JpdGUoInJlbW92ZXcgPGdydXBwZT4gPHVzZXI+XG5Vc2VyIGRhcmYgbnVyIG5vY2ggQXJ0aWtlbCBzY2hyZWliZW4sIHdlbm4gc2VpbiBXaXpsZXZlbCBkaWVzIGVybGF1YnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGFycj1vbGRfZXhwbG9kZShzdDIsIiAiKS0oeyIifSk7CisgIHN3aXRjaCAoIi9zZWN1cmUvbmV3cyItPlJlbW92ZUFsbG93ZWQoc3QxLCh7fSksYXJyLCh7fSkpKXsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJcbiIpOyBicmVhazsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGJvYXJkXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRnKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBuYW1lOworICBpbnQgZGxldmVsLCB3bGV2ZWwsIHJsZXZlbCwgbWF4bWVzc2FnZXMsIGV4cGlyZTsKKworICBpZiAoIShzdHI9VUEpIHx8CisgICAgICBzc2NhbmYoc3RyLCIlcyAlZCAlZCAlZCAlZCAlZCIsbmFtZSxkbGV2ZWwsd2xldmVsLHJsZXZlbCxtYXhtZXNzYWdlcyxleHBpcmUpICE9IDYpIHsKKyAgICB3cml0ZSgic2V0ZyA8Z3J1cHBlPiA8bG9lc2NobGV2ZWw+IDxzY2hyZWlibGV2ZWw+IDxsZXNlbGV2ZWw+IDxtYXhtZXNzYWdlcz4gPGV4cGlyZT5cbkdydXBwZW5wYXJhbWV0ZXIgc2V0emVuLCBCZWRldXR1bmcgKERlZmF1bHR3ZXJ0ZSBpbiBLbGFtbWVybik6XG5cCisgICAgbmFtZSAgICAgICAgICAgICAgOiBEZXIgTmFtZSBkZXIgTmV3c2dyb3VwXG5cCisgICAgbG9lc2NobGV2ZWwgICgyMCkgOiBXaXpsZXZlbCwgYWIgZGVtIFVzZXIgQXJ0aWtlbCBsb2VzY2hlbiBrb2VubmVuXG5cCisgICAgc2NocmVpYmxldmVsICggMCkgOiBXaXpsZXZlbCwgYWIgZGVtIFVzZXIgQXJ0aWtlbCBzY2hyZWliZW4ga29lbm5lblxuXAorICAgIGxlc2VsZXZlbCAgICAoIDApIDogV2l6bGV2ZWwsIGFiIGRlbSBVc2VyIEFydGlrZWwgbGVzZW4ga29lbm5lblxuXAorICAgIG1heG1lc3NhZ2VzICAoNDApIDogTWF4aW1hbGUgQW56YWhsIEFydGlrZWwgaW4gZWluZXIgTmV3c2dydXBwZVxuXAorICAgIGV4cGlyZSAgICAgICAoLTEpIDogRXhwaXJldGltZSBpbiBUYWdlbiwgLTEgPSBuaWVcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGV4cGlyZT04NjQwMCpleHBpcmU7CisgIHN3aXRjaCgiL3NlY3VyZS9uZXdzIi0+U2V0R3JvdXAobmFtZSwgZGxldmVsLCB3bGV2ZWwsIHJsZXZlbCwgbWF4bWVzc2FnZXMsZXhwaXJlKSl7CisgICAgY2FzZSAxOiB3cml0ZSgiT2tcbiIpOyBicmVhazsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJvci5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGdyb3VwXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRleHBpcmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG5hbWU7CisgIGludCBleHBpcmU7CisgIG1peGVkICpncjsKKworICBpZiAoIShzdHI9VUEpfHxzc2NhbmYoc3RyLCIlcyAlZCIsbmFtZSxleHBpcmUpIT0yKQorICB7CisgICAgd3JpdGUoInNldGV4cGlyZSA8Z3J1cHBlPiA8dGFnZT5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGV4cGlyZT04NjQwMCpleHBpcmU7CisgIGlmICghcG9pbnRlcnAoKGdyPSIvc2VjdXJlL25ld3MiLT5HZXRHcm91cChuYW1lKSkpKQorICB7CisgICAgd3JpdGUoIkdldCBncm91cCBlcnJvclxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3dpdGNoKCIvc2VjdXJlL25ld3MiLT5TZXRHcm91cChuYW1lLCBncltHX0RMRVZFTF0sIGdyW0dfV0xFVkVMXSwgZ3JbR19STEVWRUxdLCBncltHX01BWF9NU0ddLGV4cGlyZSkpeworICAgIGNhc2UgMTogd3JpdGUoIk9rXG4iKTsgYnJlYWs7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyb3IuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBncm91cFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgc2V0bWF4bXNnKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBuYW1lOworICBpbnQgbWF4bXNnOworICBtaXhlZCAqZ3I7CisgIAorICBpZiAoIShzdHI9VUEpfHxzc2NhbmYoc3RyLCIlcyAlZCIsbmFtZSxtYXhtc2cpIT0yKQorICB7CisgICAgd3JpdGUoInNldGV4cGlyZSA8Z3J1cHBlPiA8dGFnZT5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghcG9pbnRlcnAoKGdyPSIvc2VjdXJlL25ld3MiLT5HZXRHcm91cChuYW1lKSkpKQorICB7CisgICAgd3JpdGUoIkdldCBncm91cCBlcnJvclxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3dpdGNoKCIvc2VjdXJlL25ld3MiLT5TZXRHcm91cChuYW1lLCBncltHX0RMRVZFTF0sIGdyW0dfV0xFVkVMXSwgZ3JbR19STEVWRUxdLCBtYXhtc2csIGdyW0dfRVhQSVJFXSkpeworICAgIGNhc2UgMTogd3JpdGUoIk9rXG4iKTsgYnJlYWs7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyb3IuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBncm91cFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgZ2luZm8oc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmdyOworICBpbnQgaTsKKyAgCisgIGlmICghKHN0cj1VQSkpCisgIHsKKyAgICB3cml0ZSgiVXNhZ2U6IGdpbmZvIDxnbmFtZT5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghcG9pbnRlcnAoKGdyPSIvc2VjdXJlL25ld3MiLT5HZXRHcm91cChzdHIpKSkpCisgIHsKKyAgICB3cml0ZSgiR2V0IGdyb3VwIGVycm9yXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoZ3JbMTFdPT0tMSkKKyAgeworICAgIHdyaXRlKCJHcm91cCBcIiIrZ3JbMF0rIlwiIGRvZXMgbm90IGV4aXN0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgICAgICAgLy8gICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgNSAgICAgICAgIDYgICAgICAgICA3IAorICAgICAgICAvLzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3OAorICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIAorICBwcmludGYoIlJ1YnJpayAgOiAlcyAoJXMpIFNhdmVmaWxlOiAlc1xuXG4iLGdyWzBdLGNhcGl0YWxpemUoZ3JbMV0pLGdyWzJdKTsKKyAgcHJpbnRmKCJNZXNzYWdlczogJWkvJWkgICAgRXhwaXJlOiAlaSBUYWdlLlxuXG4iLAorCQkgIChwb2ludGVycChnclsxMV0pP3NpemVvZihnclsxMV0pOjApLGdyWzEwXSxnclszXS84NjQwMCk7ICAKKyAgCisgIHByaW50ZiggYnJlYWtfc3RyaW5nKChzaXplb2YoZ3JbNl0pPyIoIisoQ291bnRVcChtYXAoZ3JbNl0sIydjYXBpdGFsaXplKSkpKyIpIjoiICIpLCA3OCwgIlJlYWRlcnMgOiAiK2dyWzldKyIgIiwxNikpOworICAKKyAgcHJpbnRmKCBicmVha19zdHJpbmcoKHNpemVvZihncls1XSk/IigiKyhDb3VudFVwKG1hcChncls1XSwjJ2NhcGl0YWxpemUpKSkrIikiOiIgIiksIDc4LCAiV3JpdGVycyA6ICIrZ3JbOF0rIiAiLDE2KSk7CisgIAorICBwcmludGYoIGJyZWFrX3N0cmluZygoc2l6ZW9mKGdyWzRdKT8iKCIrKENvdW50VXAobWFwKGdyWzRdLCMnY2FwaXRhbGl6ZSkpKSsiKSI6IiAiKSwgNzgsICJEZWxldGVyczogIitncls3XSsiICIsMTYpKTsKKyAgCisgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisgICAgCitpbnQgcmVtb3ZlZyhzdHJpbmcgc3RyKQoreworICBpZiAoIShzdHI9VUEpKQorICB7CisgICAgd3JpdGUoInJlbW92ZWcgPGdydXBwZW5uYW1lPlxuR3J1cHBlIExPRVNDSEVOLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3dpdGNoKCIvc2VjdXJlL25ld3MiLT5SZW1vdmVHcm91cChzdHIpKXsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay4gQml0dGUgbmljaHQgdmVyZ2Vzc2VuLCBkYXMgU2F2ZWZpbGUgZGVyIE5ld3Nncm91cCB2b24gSGFuZCB6dSBlbnRmZXJuZW4gIVxuIik7IGJyZWFrOworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVycm9yLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggZ3JvdXAiKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBhZGRnKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBuYW1lLCBvd25lcjsKKworICBpZiAoIShzdHI9VUEpIHx8IHNzY2FuZihzdHIsIiVzICVzIixuYW1lLG93bmVyKSE9MikKKyAgeworICAgIHdyaXRlKCJhZGRnIDxncnVwcGU+IDx1c2VyPlxuR3J1cHBlIGFubGVnZW4sIDx1c2VyPiB3aXJkIEJlc2l0emVyIGRlciBHcnVwcGVcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHN3aXRjaCAoInNlY3VyZS9uZXdzIi0+QWRkR3JvdXAobmFtZSwgb3duZXIpKXsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay5cbiIpOyBicmVhazsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJvci5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvbi5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiR3JvdXAgYWxyZWFkeSB0aGVyZVxuIik7IGJyZWFrOworICAgIGNhc2UgLTM6IHdyaXRlKCJPd25lciBub3QgZm91bmQuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtNDogd3JpdGUoIlNhdmVmaWxlIGFscmVhZHkgaW4gdXNlLlxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorICAKK2ludCBleHBpcmUoKQoreworICAiL3NlY3VyZS9uZXdzIi0+ZXhwaXJlX2FsbCgpOworICB3cml0ZSgiRXhwaXJpbmcgc3RhcnRldC5cbiIpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9wbGFudHRvb2wuYyBiL29iai90b29scy9wbGFudHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBjY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3BsYW50dG9vbC5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgIi9zdGQvc2VjdXJlX3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNkZWZpbmUgUExBTlRNQVNURVIgIi9zZWN1cmUva3JhdXRtYXN0ZXIiCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIAoreworICAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIAorICAgICByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgCisgICBTZXRQcm9wKFBfU0hPUlQsICJEYXMgS3JhZXV0ZXJ0b29sIik7CisgICBTZXQoUF9MT05HLCBmdW5jdGlvbiBzdHJpbmcgKCkgeyByZXR1cm4gCisgICAgICJEYXMgS3JhZXV0ZXJ0b29sIGhhdCBmb2xnZW5kZSBCZWZlaGxlOlxuIgorICAgICsiLSBzaG93cGxhbnQgW2thdGVnb3JpZV0gKGxpc3RldCBhbGxlIFBmbGFuemVuIGVpbmVyIEthdGVnb3JpZSBhdWYuKVxuIgorICAgICsoSVNfQVJDSCh0aGlzX3BsYXllcigpKT8KKyAgICAiRm9sZ2VuZGUgQmVmZWhsZSBzaW5kIG51ciBmdWVyIEVNKyB2ZXJmdWVnYmFyOlxuIgorICAgICsiLSBzaG93cm9vbXMgW0lEfGFsbF0gKExpc3RldCBhbGxlIFJhZXVtZSBhdWYsIGluIGRlbmVuIGRhcyBLcmF1dCA8SUQ+XG4iCisgICAgKyIgIHp1IGZpbmRlbiBpc3QsIG9kZXIgYWxsZSBSYWV1bWUsIGluIGRlbmVuIGVpbiBLcmF1dCB3YWVjaHN0LilcbiIKKyAgICArIi0gcmVmcmVzaCAodXBkYXRldCBhbGxlIEZpbGVzKS5cbiIKKyAgICArIi0gYWRkcm9vbSA8cGxhbnRJZD4gPGxvYWRuYW1lPiAodHJhZWd0IGVpbmVuIG5ldWVuIEZ1bmRvcnQgZWluKS5cbiIKKyAgICArIi0gZGVscm9vbSA8bG9hZG5hbWU+IChsb2VzY2h0IGFsbGUgS3JhZXV0ZXIgZnVlciBlaW5lbiBGdW5kb3J0KS5cbiIKKyAgICArIi0gY3JlYXRlZmlsZSA8cGxhbnRJZD4gKGVyemV1Z3QgZGFzIEtyYXV0IGFscyBGaWxlKS5cbiIKKyAgICArIi0gY2xvbmVwbGFudCA8cGxhbnRJZHxwbGFudEZpbGU+IChjbG9udCBkYXMgS3JhdXQgaW52IEludikuXG4iOgorICAgICIiKTt9LCBGX1FVRVJZX01FVEhPRCk7CisgICBTZXRQcm9wKFBfTkFNRSwgIlBsYW50dG9vbCIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKKyAgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwgMSk7CisgICBTZXRQcm9wKFBfTk9EUk9QLCAxKTsKKyAgIFNldFByb3AoUF9ORVZFUkRST1AsIDEpOworICAgQWRkSWQoKHsidG9vbCIsICJrcmFldXRlcnRvb2wiLCAicGxhbnR0b29sIn0pKTsKKyAgIEFkZENtZCgoeyJjbG9uZXBsYW50IiwgInNob3dwbGFudCIsICJzaG93cm9vbXMiLCAicmVmcmVzaCIsCisgICAgICAgICAgICAiYWRkcm9vbSIsICJkZWxyb29tIiwgImNyZWF0ZWZpbGUifSksICJfcGxhbnRtYXN0ZXIiKTsKK30KKworc3RhdGljIGludCBfcGxhbnRtYXN0ZXIoc3RyaW5nIHN0cikKK3sKKyAgIG5vdGlmeV9mYWlsKCJVbmtub3duIEZ1bmN0aW9uIGluIHBsYW50bWFzdGVyOiBfIitxdWVyeV92ZXJiKCkrIigpXG4iKTsKKyAgIHJldHVybiBjYWxsX290aGVyKFBMQU5UTUFTVEVSLCAiXyIrcXVlcnlfdmVyYigpLCBzdHIpOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3Byb2pla3R0b29sLmMgYi9vYmovdG9vbHMvcHJvamVrdHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFhOWRkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3Byb2pla3R0b29sLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8vCisvLyBQcm9qZWN0dG9vbAorLy8KKworI2luY2x1ZGUgIi9wL3NlcnZpY2UvbWFuZHJhZ29uL3Byb2pla3RicmV0dC9wcm9qZWN0bWFzdGVyLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CitzdHJpbmcgaGlsZmU7CitzdGF0aWMgaW50IGNoYW5nZXRpbWU7CitzdGF0aWMgaW50IHN1cHByZXNzaW5mb3M7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKwlpZiAoIUlTX0NMT05FKFRPKSkgcmV0dXJuOworCTo6Y3JlYXRlKCk7CisJaWYgKCFmaW5kX29iamVjdChQUk9KRUNUTUFTVEVSKSkgY2FsbF9vdGhlcihQUk9KRUNUTUFTVEVSLCI/Pz8iKTsKKyAgICAgICAgCisJU2V0UHJvcChQX05BTUUsIlNjaHJlaWJmZWRlciIpOworCVNldFByb3AoUF9OT0RST1AsIkR1IG1vZWNodGVzdCBEZWluZSBGZWRlciBkYW5uIGRvY2ggbGllYmVyIGJlaGFsdGVuLlxuIik7CisJU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKwlTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisJU2V0UHJvcChQX1NIT1JULCJFaW5lIGtsZWluZSBtYWdpc2NoZSBTY2hyZWliZmVkZXIiKTsKKyAgICAgICAgaWYgKCFjaGFuZ2V0aW1lKSBjaGFuZ2V0aW1lPTE7CisgICAgICAgIGhpbGZlPUJTKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICAgICAgICAgICAgICAiRGllc2UgRmVkZXIgZXJtb2VnbGljaHQgZXMgRGlyIG5pY2h0IG51ciwgdm9uIHVlYmVyYWxsIGhlciBhdWYgZGllICIKKyAgICAgICAgICAgICAgICAgImFsbHNlaXRzIGJlbGllYnRlbiBTY2h3YXJ6ZW4gQnJldHRlciBmdWVyIFByb2pla3RlIHp1enVncmVpZmVuLCAiCisgICAgICAgICAgICAgICAgICJzb25kZXJuIGVybW9lZ2xpY2h0IGVzIERpciBhdWNoLCBzZWxiZXIgUHJvamVrdGUgZG9ydCB6dSAiCisgICAgICAgICAgICAgICAgICJ2ZXJvZWZmZW50bGljaGVuLlxuIgorICAgICAgICAgICAgICAgICAiRm9sZ2VuZGUgS29tbWFuZG9zIGtvZW5uZW4gRGlyIGRhYmVpIGhlbGZlbjpcblxuIgorICAgICAgICAgICAgICAgICAiZmVkZXJoaWxmZSAgICAgICAgICAgICAgLSBEaWVzZSBVZWJlcnNpY2h0XG4iCisgICAgICAgICAgICAgICAgICJmZWRlcmRva3UgICAgICAgICAgICAgICAtIERva3VtZW50YXRpb24gYWxsZXIgQmVmZWhsZVxuIgorICAgICAgICAgICAgICAgICAicHJvamVrdGhpbGZlICAgICAgICAgICAgLSBVZWJlcnNpY2h0IHVlYmVyIGRpZSBCcmV0dGJlZmVobGVcbiIKKyAgICAgICAgICAgICAgICAgIkFkZFByb2plY3QgICAgICAgICAgICAgIC0gUHJvamVrdCBhbmxlZ2VuXG4iCisgICAgICAgICAgICAgICAgICJSZW1vdmVQcm9qZWN0IDxOdW1tZXI+ICAtIFByb2pla3QgZW50ZmVybmVuXG4iCisgICAgICAgICAgICAgICAgICJNb2RpZnlQcm9qZWN0IDxOdW1tZXI+ICAtIFByb2pla3QgYWVuZGVyblxuIgorICAgICAgICAgICAgICAgICAicHJvamVrdGluZm9zIGVpbnxhbnxhdXMgLSBBZW5kZXJ1bmdlbiAobmljaHQgbWVocikgYW56ZWlnZW5cblxuIgorICAgICAgICAgICAgICAgICAiQmVpIEZyYWdlbiwgQnVncyB1bmQvb2RlciBUeXBvcyB3ZW5kZSBEaWNoIGJpdHRlIHZlcnRyYXVlbnN2b2xsIGFuIGRlblxuIgorICAgICAgICAgICAgICAgICAiTWFuZHJhZ29uIERlaW5lciBXYWhsLlxuIgorICAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJU2V0UHJvcChQX0xPTkcsCisJCUJTKCJEaWVzZSBrbGVpbmUsIHdlaXNzZSwgbWFnaXNjaCBnbGFlbnplbmRlIEZlZGVyIGxpZWd0IHNhbmZ0ICIgKworCSAgICAgICAgICAgImluIERlaW5lciBIYW5kLiBEdSBzcHVlcnN0IGZvZXJtbGljaCwgd2llIHNpZSBkYW5hY2ggZHJpbmd0LCAiICsKKwkJICAgIk5ldWVzIHp1IHNjaGFmZmVuIHVuZCBkaWUgV2VsdCB6dSB2ZXJncm9lc3Nlcm4uXG5cbiIpK2hpbGZlKTsKKyAgICAgICAgQWRkSWQoKHsic2NocmVpYmZlZGVyIiwiZmVkZXIiLCJwcm9qZWt0dG9vbCJ9KSk7CisJQWRkQ21kKCJmZWRlcmhpbGZlIiwiaGlsZmVfZnVuIik7CisJQWRkQ21kKCJwcm9qZWt0aGlsZmUiLCJib2FyZF9oZWxwIik7CisJQWRkQ21kKCJwcm9qZWt0bGlzdGUiLCJib2FyZF9saXN0Iik7CisgICAgICAgIEFkZENtZCgiZmVkZXJkb2t1IiwiZG9rdV9mdW4iKTsKKwlBZGRDbWQoKHsicHJvamVrdGRldGFpbCIsInByb2pla3RkZXRhaWxzIn0pLCJib2FyZF9sb25nIik7CisJQWRkQ21kKCh7ImFkZHByb2plY3QiLCJBZGRQcm9qZWN0IiwiYXAifSksImFkZHByb2pfZnVuIik7CisJQWRkQ21kKCh7InJlbW92ZXByb2plY3QiLCJSZW1vdmVQcm9qZWN0IiwicnAifSksInJlbXByb2pfZnVuIik7CisJQWRkQ21kKCh7Im1vZGlmeXByb2plY3QiLCJNb2RpZnlQcm9qZWN0IiwibXAifSksIm1vZHByb2pfZnVuIik7CisgICAgICAgIEFkZENtZCgicHJvamVrdGluZm9zIiwid2F0Y2hfZnVuIik7CisJVE8tPm1vdmUoVFAsTV9OT0NIRUNLKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgX3NldF9hdXRvbG9hZG9iaihtaXhlZCB2YWwpCit7CisgIGlmIChpbnRwKHZhbCkpIGNoYW5nZXRpbWU9dGltZSgpOworICBlbHNlIGlmIChwb2ludGVycCh2YWwpJiZzaXplb2YodmFsKT09MikKKyAgeworICAgIGNoYW5nZXRpbWU9dmFsWzBdOworICAgIHN1cHByZXNzaW5mb3M9dmFsWzFdOworICB9CisgIHJldHVybjsKK30KKworaW50ICpfcXVlcnlfYXV0b2xvYWRvYmooKSB7IHJldHVybiAoeyBjaGFuZ2V0aW1lLCBzdXBwcmVzc2luZm9zIH0pOyB9CisKK2ludCBkb2t1X2Z1bihzdHJpbmcgYXJnKQoreworICBUUC0+TW9yZShQUk9KRUNURE9LVSwxKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBib2FyZF9oZWxwKHN0cmluZyBhcmcpCit7CisgIFBST0pFQ1RNQVNURVItPkJvYXJkSGVscCgpOworICByZXR1cm4gMTsKK30KKworaW50IGJvYXJkX2xpc3Qoc3RyaW5nIGFyZykKK3sKKyAgYXJnPVRQLT5fdW5wYXJzZWRfYXJncygxKTsKKyAgaWYgKCFzaXplb2YoYXJnKSkgKFBST0pFQ1RNQVNURVIpLT5TaG93TGlzdCgpOworICBlbHNlIFBST0pFQ1RNQVNURVItPlBhcnNlQXJncyhhcmcpOworICBjaGFuZ2V0aW1lPXRpbWUoKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBib2FyZF9sb25nKHN0cmluZyBhcmcpCit7CisgIGludCBudW1iZXI7CisgIGFyZz1UUC0+X3VucGFyc2VkX2FyZ3MoMSk7CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHByb2pla3RkZXRhaWwgPFBST0pFS1ROVU1NRVI+XG4iKTsKKyAgaWYgKCFzaXplb2YoYXJnKSkgcmV0dXJuIDA7CisgIGlmICghKG51bWJlcj10b19pbnQoYXJnKSl8fChhcmchPXRvX3N0cmluZyhudW1iZXIpKSkgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJQcm9qZWt0bnVtbWVybiBrb2VubmVuIG51ciBaYWhsZW4gZ3JvZXNzZXIgTnVsbCBzZWluLlxuIik7CisgIGlmIChudW1iZXI8MSkgcmV0dXJuIDA7CisgIFBST0pFQ1RNQVNURVItPlNob3dMb25nKG51bWJlcik7CisgIHJldHVybiAxOworfQorCitpbnQgaGlsZmVfZnVuKHN0cmluZyBhcmcpCit7CisgIHRlbGxfb2JqZWN0KFRQLGhpbGZlKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBib2FyZF9mdW4oc3RyaW5nIGFyZykKK3sKKyAgUFJPSkVDVE1BU1RFUi0+UGFyc2VBcmdzKFRQLT5fdW5wYXJzZWRfYXJncygxKSk7CisgIHJldHVybiAxOworfQorCitpbnQgYWRkcHJval9mdW4oc3RyaW5nIGFyZykKK3sKKyAgaWYgKCFJU19MRUFSTkVSKFRQKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFRQLCJXaWUgYmlzdCBEVSBkZW5uIGFuIGRpZSBGZWRlciBnZWtvbW1lbj9cbiIpOworICAgIFRPLT5yZW1vdmUoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBQUk9KRUNUTUFTVEVSLT5DaGFuZ2VEYXRhKDApOworICByZXR1cm4gMTsKK30KKworaW50IHJlbXByb2pfZnVuKHN0cmluZyBhcmcpCit7CisgIGlmICghSVNfTEVBUk5FUihUUCkpCisgIHsKKyAgICB0ZWxsX29iamVjdChUUCwiV2llIGJpc3QgRFUgZGVubiBhbiBkaWUgRmVkZXIgZ2Vrb21tZW4/XG4iKTsKKyAgICBUTy0+cmVtb3ZlKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogcmVtb3ZlcHJvamVjdCBOVU1NRVJcbiIpOworICBpZiAoIXNpemVvZihhcmcpfHwhaW50cCh0b19pbnQoYXJnKSl8fChhcmchPXRvX3N0cmluZyh0b19pbnQoYXJnKSkpKSByZXR1cm4gMDsKKyAgUFJPSkVDVE1BU1RFUi0+RGVsZXRlRGF0YSh0b19pbnQoYXJnKSk7CisgIHJldHVybiAxOworfQorCitpbnQgbW9kcHJval9mdW4oc3RyaW5nIGFyZykKK3sKKyAgaWYgKCFJU19MRUFSTkVSKFRQKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFRQLCJXaWUgYmlzdCBEVSBkZW5uIGFuIGRpZSBGZWRlciBnZWtvbW1lbj9cbiIpOworICAgIFRPLT5yZW1vdmUoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBub3RpZnlfZmFpbCgiU3ludGF4OiBtb2RpZnlwcm9qZWN0IE5VTU1FUlxuIik7CisgIGlmICghYXJnfHwhaW50cCh0b19pbnQoYXJnKSl8fChhcmchPXRvX3N0cmluZyh0b19pbnQoYXJnKSkpKSByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIkVzIGdpYnQga2VpbiBQcm9qZWt0IG1pdCBkZXIgTnVtbWVyIDAuXG4iKTsKKyAgaWYgKHRvX2ludChhcmcpPT0wKSByZXR1cm4gMDsKKyAgUFJPSkVDVE1BU1RFUi0+Q2hhbmdlRGF0YSh0b19pbnQoYXJnKSk7CisgIHJldHVybiAxOworfQorCitpbnQgd2F0Y2hfZnVuKHN0cmluZyBhcmcpCit7CisgIGlmICghSVNfTEVBUk5FUihUUCkpCisgIHsKKyAgICB0ZWxsX29iamVjdChUUCwiV2llIGJpc3QgRFUgZGVubiBhbiBkaWUgRmVkZXIgZ2Vrb21tZW4/XG4iKTsKKyAgICBUTy0+cmVtb3ZlKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFzaXplb2YoYXJnKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFRQLEJTKHNwcmludGYoIkR1IGJla29tbXN0IGRlcnplaXQgJXNJbmZvcm1hdGlvbmVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1ZWJlciBBZW5kZXJ1bmdlbiBhbSBQcm9qZWt0YnJldHQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzaW5mb3M/ImtlaW5lICI6IiIpKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogcHJvamVrdGluZm9zIDxlaW58YW58YXVzPlxuIik7CisgIGlmIChhcmchPSJlaW4iJiZhcmchPSJhbiImJmFyZyE9ImF1cyIpIHJldHVybiAwOworICBpZiAoYXJnPT0iYXVzIikKKyAgeworICAgIHN1cHByZXNzaW5mb3M9MTsKKyAgICB0ZWxsX29iamVjdChUUCxCUygiRHUgd2lyc3QgamV0enQga2VpbmUgTWVsZHVuZ2VuIG1laHIgdWViZXIgIgorICAgICAgICAgICAgICAgICAgICAgICJBZW5kZXJ1bmdlbiBhbSBQcm9qZWt0YnJldHQgZXJoYWx0ZW4uXG4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3VwcHJlc3NpbmZvcz0wOworICB0ZWxsX29iamVjdChUUCxCUygiRHUgYmVrb21tc3QgYWIgc29mb3J0IE1lbGR1bmdlbiB1ZWJlciBBZW5kZXJ1bmdlbiAiCisgICAgICAgICAgICAgICAgICAgICJhbSBQcm9qZWt0YnJldHQuXG4iKSk7CisgIHJldHVybiAxOworfQorCit2b2lkIGluaXQoKQoreworICBpZiAoIUlTX0xFQVJORVIoVFApKSB7CisgICAgaWYgKGZpbmRfY2FsbF9vdXQoInJlbW92ZSIpID09IC0xKQorICAgICAgY2FsbF9vdXQoInJlbW92ZSIsMCk7CisgIH0KKyAgZWxzZSA6OmluaXQoKTsKKyAgcmV0dXJuOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgaWYgKCFlbnZpcm9ubWVudCgpKQorICB7CisgICAgZGVzdHJ1Y3QoVE8pOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXN1cHByZXNzaW5mb3MmJmNoYW5nZXRpbWU8KFBST0pFQ1RNQVNURVItPkNoYW5nZVRpbWUoKSkpCisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwiSW50dWl0aXYgc3B1ZXJzdCBEdSwgZGFzcyBzaWNoICIKKyAgICAgICAgICAgICAgICAiZGllIEF1c2hhZW5nZSBhbSBQcm9qZWt0YnJldHQgZ2VhZW5kZXJ0IGhhYmVuLlxuIik7CisgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9wdG9vbC5jIGIvb2JqL3Rvb2xzL3B0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNmNhZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9wdG9vbC5jCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICAgT2JqZWt0IHp1bSBFaW50cmFnZW4gdm9uIFJhZXVtZW4gZGllIFphdWJlcnRyYWVua2UgZW50aGFsdGVuIGJlaW0KKyAgIHBvdGlvbm1hc3Rlci4gCisqLworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK2luaGVyaXQgInN0ZC90aGluZyI7CisKK2ludCBkdW1wKCk7CisKK2ludCBzZWN1cmUoKQoreworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKSByZXR1cm4gMDsKKyAgaWYgKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpPT1ST09USUQpIHJldHVybiAxOworICBpZiAoZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gZ2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSByZXR1cm4gMDsKKyAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSAhPSB0aGlzX3BsYXllcigpKSByZXR1cm4gMDsKKyAgaWYgKCFBUkNIX1NFQ1VSSVRZKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiUG90aW9uLVRvb2wiKTsKKyAgU2V0UHJvcChQX0xPTkcsIAorICAgICAiRWluIFRvb2wgenVtIEVpbnRyYWdlbiB2b24gUmF1bWVuIGluIGRlbiBQb3Rpb25tYXN0ZXIuXG4iKworICAgICAiRm9sZ2VuZGUgQmVmZWhsZSBnaWJ0IGVzOlxuIisKKyAgICAgInB0YWRkIDxsaXN0ZT4gICAgIEFkZGllcnQgZGVuIFpUIGltIFJhdW0gaW4gTGlzdGUgPGxpc3RlPlxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgIHVuZCBha3RpdmllcnQgaWhuIGdsZWljaHplaXRpZy5cbiIrCisgICAgICJwdHNldCA8bGlzdGU+ICAgICBBa3RpdmllcnQgZGVuIFpUIGltIFJhdW0gdW5kIHNldHp0IGlobiBpblxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgIGRpZSBMaXN0ZSA8bGlzdGU+LlxuIisKKyAgICAgInB0Y2hhbmdlIDxudW1tZXI+IEVyc2V0enQgZGVuIFpUIDxudW1tZXI+IGR1cmNoIGRlbiBaVCBpbSBSYXVtLlxuIisKKyAgICAgInB0YWN0ICAgICAgICAgICAgIEFrdGl2aWVydCBlaW5lbiBkZWFrdGl2aWVydGVuIFpUIGluIHNlaW5lclxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgIGJpc2hlcmlnZW4gTGlzdGUuXG4iKworICAgICAicHRkZWFjdCAgICAgICAgICAgRGVha3RpdmllcnQgZGVuIFpUIGltIFJhdW0gYXVzIGRlciBaVExpc3RlXG4iKworICAgICAiICAgICAgICAgICAgICAgICAgdW5kIHZlcnNjaGllYnQgaWhuIG5hY2ggJ2RlYWt0aXZpZXJ0ZSBaVHMnLlxuIisKKyAgICAgInB0aW5mbyBbcGFyYV0gICAgIGtlaW4gcGFyYTogICBaZWlndCBJbmZvcyB1ZWJlciBkZW4gWlQgaW0gYWt0dS1cbiIrCisgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsZW4gUmF1bS5cbiIrCisgICAgICIgICAgICAgICAgICAgICAgICBpbnQgcGFyYTogICAgWmVpZ3QgSW5mb3MgenVtIFpUIHBhcmEgYW4uXG4iKworICAgICAiICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhcmE6IFplaWd0IFpULUluZm9zIGRlcyBTcGllbGVycyBwYXJhLlxuIisKKyAgICAgInB0ZHVtcCAgICAgICAgICAgIEVyemV1Z3QgZWluIER1bXAgZGVyIGFrdHVlbGxlbiBaVExpc3RlIHVuZFxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgIHNwZWljaGVydCBkaWVzZW4gYWIuXG5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIlBUb29sIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIEFkZElkKCh7InRvb2wiLCAicHRvb2wifSkpOworICBTZXRQcm9wKFBfTk9EUk9QLCAxKTsKKyAgU2V0UHJvcChQX0FVVE9MT0FET0JKLCAxKTsKKyAgQWRkQ21kKCJwdGFkZCIsICJhZGQiKTsKKyAgQWRkQ21kKCJwdHNldCIsICJzZXRsaXN0Iik7CisgIEFkZENtZCgicHRjaGFuZ2UiLCAiY2hhbmdlcGF0aCIpOworICBBZGRDbWQoInB0YWN0IiwgImFjdGl2YXRlIik7CisgIEFkZENtZCgicHRkZWFjdCIsICJkZWFjdGl2YXRlIik7CisgIEFkZENtZCgicHRpbmZvIiwgImluZm8iKTsKKyAgQWRkQ21kKCJwdGR1bXAiLCAiZHVtcCIpOworfQorCitpbnQgYWRkKHN0cmluZyBudW1iZXIpCit7CisgIGludCBuciwgbmV4dCwgYWN0aXZlOworICBzdHJpbmcgcm9vbTsKKyAgaWYgKCFzZWN1cmUoKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTFcbiIpOyByZXR1cm4gLTE7IH0KKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICB7IHByaW50ZigiRmVobGVyOiAtMlxuIik7IHJldHVybiAtMjsgfQorICBpZiAoIW51bWJlcikKKyAgeyBwcmludGYoIkZlaGxlcjogLTNcbiIpOyByZXR1cm4gLTM7IH0KKyAgc3NjYW5mKG51bWJlciwgIiVkIiwgbnIpOworICBpZiAoIWludHAobnIpKQorICB7IHByaW50ZigiRmVobGVyOiAtNFxuIik7IHJldHVybiAtNDsgfQorICByb29tID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpKTsKKyAgbmV4dCA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkFkZFBvdGlvblJvb20ocm9vbSxucik7CisgIGlmIChuZXh0PjApCisgICAgcHJpbnRmKCJSYXVtIGluIEdlc2FtdGxpc3RlIGVpbmdldHJhZ2VuLCBOdW1tZXI6ICVkXG4iLCBuZXh0LTEpOworICBlbHNlCisgIHsKKyAgICBwcmludGYoIlJhdW0ga29ubnRlIG5pY2h0IGVpbmdldHJhZ2VuIHdlcmRlbiwgRXJnZWJuaXM6ICVkXG4iLCBuZXh0KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBOaWNodCBtZWhyIG5vZXRpZywgQXJhdGhvcm4sIDIwMTMtTWFpLTMwCisgIC8vYWN0aXZlID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+U2V0TGlzdE5yKHJvb20sIG5yKTsKKyAgaWYgKGFjdGl2ZT49MCkKKyAgeworICAgIHByaW50ZigiUmF1bSBha3RpdmllcnQgaW4gTGlzdGUgJWRcbiIsIG5yKTsKKyAgICBkdW1wKCk7CisgIH0KKyAgZWxzZQorICAgIHByaW50ZigiRmVobGVyIGJlaW0gQWt0aXZpZXJlbiwgRXJnZWJuaXM6ICVkXG4iLCBhY3RpdmUpOworICByZXR1cm4gMTsKK30KKworaW50IGNoYW5nZXBhdGgoc3RyaW5nIG51bWJlcikKK3sKKyAgaW50IG5yLG5ldTsKKyAgc3RyaW5nIHJvb207CisgIG1peGVkIHJvb21vbGQ7CisgIGlmICghc2VjdXJlKCkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0xXG4iKTsgcmV0dXJuIC0xOyB9CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTJcbiIpOyByZXR1cm4gLTI7IH0KKyAgaWYgKCFudW1iZXIpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0zXG4iKTsgcmV0dXJuIC0zOyB9CisgIHNzY2FuZihudW1iZXIsICIlZCIsIG5yKTsKKyAgaWYgKCFpbnRwKG5yKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTRcbiIpOyByZXR1cm4gLTQ7IH0KKyAgcm9vbSA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKSk7CisgIHJvb21vbGQgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5HZXRGaWxlbmFtZUJ5TnVtYmVyKG5yKTsKKyAgaWYgKHJvb21vbGQ9PS0xKQorICB7IHByaW50ZigiRmVobGVyOiAtNVxuIik7IHJldHVybiAtNTsgfQorICBuZXUgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5DaGFuZ2VSb29tUGF0aChyb29tb2xkLHJvb20pOworICBpZiAobmV1PjApCisgICAgeworICAgICAgcHJpbnRmKCJaVCAlZCBkdXJjaCBha3R1ZWxsZW4gUmF1bSBlcnNldHp0LlxuIiwgbmV1KTsKKyAgICAgIGR1bXAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYoIlpUICVkIGtvbm50ZSBuaWNodCBlcnNldHp0IHdlcmRlbiwgRXJnZWJuaXM6ICVkXG4iLCBucixuZXUpOworICByZXR1cm4gMTsKK30KKworaW50IHNldGxpc3Qoc3RyaW5nIG51bWJlcikKK3sKKyAgaW50IG5yLCBuZXh0LCBhY3RpdmU7CisgIHN0cmluZyByb29tOworICBpZiAoIXNlY3VyZSgpKQorICB7IHByaW50ZigiRmVobGVyOiAtMVxuIik7IHJldHVybiAtMTsgfQorICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0yXG4iKTsgcmV0dXJuIC0yOyB9CisgIGlmICghbnVtYmVyKQorICB7IHByaW50ZigiRmVobGVyOiAtM1xuIik7IHJldHVybiAtMzsgfQorICBzc2NhbmYobnVtYmVyLCAiJWQiLCBucik7CisgIGlmICghaW50cChucikgfHwgbnI8MCB8fCBucj43KQorICB7IHByaW50ZigiRmVobGVyOiAtNFxuIik7IHJldHVybiAtNDsgfQorICByb29tID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpKTsKKyAgYWN0aXZlID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+U2V0TGlzdE5yKHJvb20sIG5yKTsKKyAgaWYgKGFjdGl2ZT49MCkKKyAgeworICAgIHByaW50ZigiUmF1bSBha3RpdmllcnQgaW4gTGlzdGUgJWRcbiIsIG5yKTsKKyAgICBkdW1wKCk7CisgIH0KKyAgZWxzZQorICAgIHByaW50ZigiRmVobGVyIGJlaW0gQWt0aXZpZXJlbiwgRXJnZWJuaXM6ICVkXG4iLCBhY3RpdmUpOworICByZXR1cm4gMTsKK30KKworaW50IGFjdGl2YXRlKCkKK3sKKyAgaW50IG5yLCBhY3RpdmU7CisgIHN0cmluZyByb29tOworICAKKyAgaWYgKCFzZWN1cmUoKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTFcbiIpOyByZXR1cm4gLTE7IH0KKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICB7IHByaW50ZigiRmVobGVyOiAtMlxuIik7IHJldHVybiAtMjsgfQorICByb29tID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpKTsKKyAgYWN0aXZlID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+QWN0aXZhdGVSb29tKHJvb20pOworICBpZiAoYWN0aXZlPj0wKQorICAgIHsKKyAgICAgIHByaW50ZigiUmF1bSBha3RpdmllcnQgaW4gTGlzdGUgJWRcbiIsIGFjdGl2ZSk7CisgICAgICBkdW1wKCk7CisgICAgfQorICBlbHNlCisgICAgcHJpbnRmKCJGZWhsZXIgYmVpbSBBa3RpdmllcmVuLCBFcmdlYm5pczogJWRcbiIsIGFjdGl2ZSk7CisgIHJldHVybiAxOworfQorCitpbnQgZGVhY3RpdmF0ZSgpCit7CisgIGludCBkZWFjdGl2ZTsKKyAgc3RyaW5nIHJvb207CisgIAorICBpZiAoIXNlY3VyZSgpKQorICB7IHByaW50ZigiRmVobGVyOiAtMVxuIik7IHJldHVybiAtMTsgfQorICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0yXG4iKTsgcmV0dXJuIC0yOyB9CisgIHJvb20gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSkpOworICBkZWFjdGl2ZSA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkRlYWN0aXZhdGVSb29tKHJvb20pOworICBpZiAoZGVhY3RpdmU+PTApCisgICAgeworICAgICAgcHJpbnRmKCJSYXVtIGRlYWt0aXZpZXJ0IGluIExpc3RlICVkXG4iLGRlYWN0aXZlKTsKKyAgICAgIGR1bXAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYoIkZlaGxlciBiZWltIERlYWt0aXZpZXJlbiwgRXJnZWJuaXM6ICVkXG4iLCBkZWFjdGl2ZSk7CisgIHJldHVybiAxOworfQorCitpbnQgaW5mbyhzdHJpbmcgcGFyYSkKK3sKKyAgaW50IGluZm8sbnI7CisgIHN0cmluZyBzOworICBvYmplY3Qgcm9vbSxvOworICBtaXhlZCBtLCpwb3Rpb25zOworICBpZiAoIXNlY3VyZSgpKQorICB7IHByaW50ZigiRmVobGVyOiAtMVxuIik7IHJldHVybiAtMTsgfQorICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0yXG4iKTsgcmV0dXJuIC0yOyB9CisgIGlmICghcGFyYSB8fCBwYXJhPT0iIikKKyAgICB7CisgICAgICByb29tID0gZW52aXJvbm1lbnQoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpOworICAgICAgaW5mbyA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkhhc1BvdGlvbihyb29tKTsKKyAgICAgIGlmIChpbmZvPj0wKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKCJSYXVtIGhhdCBaVCBtaXQgTnI6ICAlZFxuXG4iLGluZm8pOworICAgICAgICAgIG5yID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+R2V0TGlzdEJ5TnVtYmVyKGluZm8pOworICAgICAgICAgIGlmIChucj49MCkKKyAgICAgICAgICAgIHByaW50ZigiWlQgYWt0aXYgaW4gTGlzdGU6ICAgJWRcblxuIixucik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuciA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkdldEluYWN0TGlzdEJ5TnVtYmVyKGluZm8pOworICAgICAgICAgICAgICBpZiAobnI+PTApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJaVCBJTmFrdGl2IGluIExpc3RlOiAlZFxuXG4iLG5yKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiWlQgSU5ha3RpdlxuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaW5mbz49MCAmJiBzPXJlYWRfZmlsZSgiL3NlY3VyZS9BUkNIL1pULyIraW5mbysiLnp0IikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHdyaXRlKCJUaXA6XG4iK3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHByaW50ZigiUmF1bSBoYXQga2VpbmVuIFpUIGVpbmdldHJhZ2VuLlxuIik7CisgICAgfQorICBlbHNlCisgICAgaWYgKHNzY2FuZihwYXJhLCIlZCIsaW5mbyk9PTEpCisgICAgICB7CisgICAgICAgIHByaW50ZigiWlQgbWl0IE51bW1lcjogJWRcblxuIixpbmZvKTsKKyAgICAgICAgbSA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkdldEZpbGVuYW1lQnlOdW1iZXIoaW5mbyk7CisgICAgICAgIGlmIChtIT0tMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICB3cml0ZSgiRmlsZW5hbWU6ICIrbSsiXG5cbiIpOworICAgICAgICAgICAgbnIgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5HZXRMaXN0QnlOdW1iZXIoaW5mbyk7CisgICAgICAgICAgICBpZiAobnI+PTApCisgICAgICAgICAgICAgIHByaW50ZigiWlQgYWt0aXYgaW4gTGlzdGU6ICVkXG5cbiIsbnIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbnIgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5HZXRJbmFjdExpc3RCeU51bWJlcihpbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAobnI+PTApCisgICAgICAgICAgICAgICAgICBwcmludGYoIlpUIElOYWt0aXYgaW4gTGlzdGU6ICVkXG5cbiIsbnIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiWlQgSU5ha3RpdlxuXG4iKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZm8+PTAgJiYgcz1yZWFkX2ZpbGUoIi9zZWN1cmUvQVJDSC9aVC8iK2luZm8rIi56dCIpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGUoIlRpcDpcbiIrcyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB3cml0ZSgiS2VpbiBaVCBtaXQgZGllc2VyIE51bW1lciBiZWthbm50LlxuIik7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICB3cml0ZSgiU3BpZWxlciAiK2NhcGl0YWxpemUocGFyYSkrIlxuXG4iKTsKKyAgICAgICAgaWYgKG89ZmluZF9wbGF5ZXIocGFyYSkpCisgICAgICAgICAgeworICAgICAgICAgICAgcG90aW9ucz1zb3J0X2FycmF5KG8tPlF1ZXJ5UHJvcChQX1BPVElPTlJPT01TKSwjJz4pOworICAgICAgICAgICAgaWYgKHNpemVvZihwb3Rpb25zKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHM9IiI7CisgICAgICAgICAgICAgICAgZm9yIChucj0wO25yPHNpemVvZihwb3Rpb25zKTtucisrKQorICAgICAgICAgICAgICAgICAgcys9cG90aW9uc1tucl0rIiwgIjsKKyAgICAgICAgICAgICAgICB3cml0ZSgiUG90aW9ucm9vbXM6XG4iK2JyZWFrX3N0cmluZyhzWzAuLjwzXSw3OCkrIlxuIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2Ugd3JpdGUoIlNwaWVsZXIgaGF0IGtlaW5lIHdlaXRlcmVuIFBvdGlvbnJvb21zLlxuIik7CisgICAgICAgICAgICBwb3Rpb25zPXNvcnRfYXJyYXkoby0+UXVlcnlQcm9wKFBfS05PV05fUE9USU9OUk9PTVMpLCMnPik7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKHBvdGlvbnMpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcz0iIjsKKyAgICAgICAgICAgICAgICBmb3IgKG5yPTA7bnI8c2l6ZW9mKHBvdGlvbnMpO25yKyspCisgICAgICAgICAgICAgICAgICBzKz1wb3Rpb25zW25yXSsiLCAiOworICAgICAgICAgICAgICAgIHdyaXRlKCJCZWthbm50ZSBQb3Rpb25yb29tczpcbiIrCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKHNbMC4uPDNdLDc4KSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2Ugd3JpdGUoIlNwaWVsZXIgaGF0IGtlaW5lIGJla2FubnRlbiBQb3Rpb25yb29tcy5cbiIpOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlKCJLZWluIFNwaWVsZXIgbWl0IGRpZXNlbSBOYW1lbiBhbndlc2VuZC5cbiIpOworICAgICAgfQorICByZXR1cm4gMTsKK30KKworaW50IGR1bXAoKQoreworICAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5EdW1wTGlzdCgpOworICBwcmludGYoIkxpc3RlIHd1cmRlIGVyemV1Z3QuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL29iai90b29scy9wdWJ0b29sLmMgYi9vYmovdG9vbHMvcHVidG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWFmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvcHVidG9vbC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIE1vcmdlbkdyYXVlbiBNdWRMaWIgOiBQdWJ0b29sICovCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitjcmVhdGUoKQoreworICAgIGlmICghY2xvbmVwKE1FKSkKKyAgICAgICAgcmV0dXJuOworICAgIDo6Y3JlYXRlKCk7CisKKyAgICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBQdWJ0b29sIik7CisgICAgU2V0UHJvcChQX0xPTkcsCisgICAgIkRhcyBQdWJ0b29sIGJlcmVjaG5ldCBkaWUgbWF4aW1hbCB6dWxhZXNzaWdlIEhlaWx1bmcgZWluZXIgS25laXBlLlxuIisKKyAgIlxuIisKKyAgIlN5bnRheDogcHVidGVzdCA8UF9BTENPSE9MPiA8UF9EUklOSz4gPFBfRk9PRD4gPFBfVkFMVUU+IDxSYXRlPiA8RGVsYXk+XG4iKworICAiXG4iKworICAiV2VydGViZXJlaWNoOiAgICAgID49MCAgICAgICAgID49MCAgICAgICA+PTAgICAgICA+PTAgICAgMS4uMjAgICAwLi5cbiIrCisgICJcbiIpOworICAgIFNldFByb3AoUF9OQU1FLCJQdWJ0b29sIik7CisgICAgU2V0UHJvcChQX0dFTkRFUixORVVURVIpOworICAgIFNldFByb3AoUF9XRUlHSFQsMCk7CisgICAgU2V0UHJvcChQX1ZBTFVFLDApOyAKKyAgICBTZXRQcm9wKFBfTk9EUk9QLCJEYXMgUHVidG9vbCBiZWhhZWxzdCBEdSBsaWViZXIgYmVpIERpci5cbiIpOworICAgIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisgICAgU2V0UHJvcChQX0FVVE9MT0FET0JKLDEpOworCisgICAgQWRkSWQoICJwdWJ0b29sIiApOworCisgICAgQWRkQ21kKCAicHVidGVzdCIsICJwdWJ0ZXN0IiApOworfQorCitpbnQgcHVidGVzdChzdHJpbmcgYXJnKQoreyAgIGludCB2LGQsYSxmLHIsaCx5OworCisgICAgbm90aWZ5X2ZhaWwoCisgICJTeW50YXg6IHB1YnRlc3QgPFBfQUxDT0hPTD4gPFBfRFJJTks+IDxQX0ZPT0Q+IDxQX1ZBTFVFPiA8UmF0ZT4gPERlbGF5PlxuIik7CisKKyAgICBpZiAoIWFyZyB8fCAhc3RyaW5ncChhcmcpIHx8CisgICAgICAgIHNzY2FuZihhcmcsIiVkICVkICVkICVkICVkICVkIixhLGQsZix2LHIseSkhPTYpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHY8MSB8fCBkPDAgfHwgYTwwIHx8IGY8MCB8fCByPDEgfHwgcj4yMCB8fCB5PDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaD1jYWxsX290aGVyKCIvc2VjdXJlL3B1Ym1hc3RlciIsIkNhbGNNYXgiLAorICAgICAgICAgICAgICAgICAoW1BfVkFMVUU6dixQX0FMQ09IT0w6YSxQX0RSSU5LOmQsUF9GT09EOmYsCisgICAgICAgICAgICAgICAgICJkZWxheSI6eSwicmF0ZSI6cl0pLDApOworCisgICAgcHJpbnRmKCJCZXJlY2huZXRlIE1heGltYWxoZWlsdW5nIGZ1ZXI6XG4iKworICAgICAgICAgICAiUF9BTENPSE9MID0gJTNkICAgIFBfRFJJTksgICA9ICUzZCAgICBQX0ZPT0QgICAgPSAlM2QgXG4iKworICAgICAgICAgICAiUF9WQUxVRSAgID0gJTNkICAgIFJhdGUgICAgICA9ICUzZCAgICBEZWxheSAgICAgPSAlM2QgXG4iKworICAgICAgICAgICAiRXJnZWJuaXM6XG4iKworICAgICAgICAgICAiR2VzYW10OiAlM2QgKEhQK1NQKSwgYXVmZ2V0ZWlsdCB6LkIuICUzZCBIUCB1bmQgJTNkIFNQLlxuIiwKKyAgICAgICAgICAgYSxkLGYsdixyLHksaCwoaC8yKSwoaCUyPyhoLzIpKzE6KGgvMikpKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9xdWVzdHRvb2wuYyBiL29iai90b29scy9xdWVzdHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmYTdjCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3F1ZXN0dG9vbC5jCkBAIC0wLDAgKzEsNzU0IEBACisvKgorICogIFRoZSBuZXcgdWx0aW1hdGUgcXVlc3QgYWRtaW5pc3RyYXRpb24gdG9vbAorICovCisKKy8qIEFFTkRFUlVOR0VOCisgKiAyMDA2LTA5LTI5IDogWm9vaworICogICAgICAgICAgICAgIFF1ZXN0dG9vbCBhbiBuZXVlIEZlbGRlciAiQXR0cmlidXRlIiB1bmQgIktsYXNzZSIKKyAqICAgICAgICAgICAgICBhbmdlcGFzc3QuCisgKiAyMDAwLTExLTE4IDogWm9vazoKKyAqCQlRdWVzdHRvb2wgdW0gbmV1ZXMgRmVsZCAiV2FydGVuZGVyIE1hZ2llciIgZGVzIFF1ZXN0bWFzdGVyCisgKgkJZXJ3ZWl0ZXJ0LgorICogMjAwMC0xMS0xOCA6IFpvb2s6CisgKgkJUXVlc3R0b29sIHVtIG5ldWVzIEZlbGQgIkdydXBwZW5laW5vcmRudW5nIiBkZXMgUXVlc3RtYXN0ZXIKKyAqCQllcndlaXRlcnQuCisgKi8KKworaW5oZXJpdCAic3RkL3RoaW5nIjsKK2luaGVyaXQgInN0ZC9tb3JlIjsKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlICIvc2VjdXJlL3F1ZXN0bWFzdGVyLmgiCisKKyNkZWZpbmUgVUEgdGhpc19pbnRlcmFjdGl2ZSgpLT5fdW5wYXJzZWRfYXJncygpCisKKyNkZWZpbmUgUU5BTUUJMAorI2RlZmluZSBRUAkxCisjZGVmaW5lIFhQCTIKKyNkZWZpbmUgQUxMT1cJMworI2RlZmluZSBJTkZPCTQKKyNkZWZpbmUgTEVWRUwJNQorI2RlZmluZSBDTEFTUwk2CisjZGVmaW5lIEFUVFIJNworI2RlZmluZSBXSVoJOAorI2RlZmluZSBTQ05EV0laIDkKKyNkZWZpbmUgRU5EICAgIDEwCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKK3ByaXZhdGUgdm9pZCBMb2FkX051bUtleSgpOworaW50ICBBZGRfUXVlc3QJICAgICAoIHN0cmluZyBzdHIgKTsKK3ZvaWQgUmVhZE5ld1F1ZXN0ICAgICggc3RyaW5nIHN0ciApOworaW50ICBSZW1vdmVfUXVlc3QgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIENoYW5nZV9RdWVzdCAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgUmVzdG9yZV9RdWVzdCAgICggc3RyaW5nIHN0ciApOworaW50ICBTZXRfUXVlc3QJICAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgUmVtb3ZlX1F1ZXN0ICAgICggc3RyaW5nIHN0ciApOworaW50ICBRdWVyeV9RdWVzdCAgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIFF1ZXJ5X0tleXMgICAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgUXVlcnlfUXVlc3RzICAgICggc3RyaW5nIHN0ciApOworaW50ICBBY3RpdmF0ZVF1ZXN0ICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIERlYWN0aXZhdGVRdWVzdCAoIHN0cmluZyBzdHIgKTsKK2ludCAgR2V0UmV0dXJuCSAgICAgKCBzdHJpbmcgc3RyICk7CisKK3N0cmluZyBuYW1lOworaW50ICAgIHFwOworaW50ICAgIHhwOworaW50ICAgIGxldmVsOworaW50ICAgIG5lZWQ7CitzdHJpbmcgKmFsbG93ZWQ7CitzdHJpbmcgaW5mbzsKK3N0cmluZyB3aXphcmQ7CitzdHJpbmcgc2NuZHdpemFyZDsKK2ludCAgICBncm91cDsKK21hcHBpbmcgbnVtX2tleTsKKworb2JqZWN0IG93bmVyOworaW50ICAgIGNvdW50ZXI7CittaXhlZCAgKnNhdmVxdWVzdDsKK3N0cmluZyBzYXZla2V5OworaW50ICAgIGRvX2NoYW5nZTsKK3N0cmluZyBjaGFuZ2VrZXk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc3RyaW5nIHN0cjsKKworICBpZihJU19CTFVFKE1FKSkgcmV0dXJuOworICB0aGluZzo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9HRU5ERVIsTkVVVEVSKTsKKyAgb3duZXIgPSBQTDsKKyAgQWRkSWQoInF1ZXN0dG9vbCIpOworICBBZGRJZCgicXQiKTsKKyAgU2V0UHJvcChQX0FSVElDTEUsMCk7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIHN0cj1jYXBpdGFsaXplKCgoc3RyPW93bmVyLT5xdWVyeV9yZWFsX25hbWUoKSlbPDFdPT0ncyd8fHN0cls8MV09PSd4J3x8c3RyWzwxXT09J3onKT9zdHIrPSInIjpzdHIrPSJzIik7CisgIFNldFByb3AoUF9OQU1FLCBzdHIrIiBRdWVzdFRvb2wiKTsKKyAgU2V0UHJvcChQX1NIT1JULCBzdHIrIiBRdWVzdFRvb2wiKTsKKyAgU2V0UHJvcChQX0xPTkcsCisgICAiRGFzIFF1ZXN0VG9vbCBkaWVudCBkZXIgQWRtaW5pc3RyYXRpb24gdm9uIFF1ZXN0cy4gKGJ5IEtpcmssIDEwLjExLjk0KVxuIgorICArImltcGxlbWVudGllcnRlIEtvbW1hbmRvczpcbiIKKyAgKyIgIEFkZFEJCQkgICAgOiBOZXVlbiBRdWVzdGVpbnRyYWcgZWluZnVlZ2VuXG4iCisgICsiICBSZW1vdmVRCSAgPHF1ZXN0PgkgICAgOiBRdWVzdGVpbnRyYWcgbG9lc2NoZW5cbiIKKyAgKyIgIENoYW5nZVEJICA8cXVlc3Q+CSAgICA6IFF1ZXN0ZWludHJhZyBhZW5kZXJuXG4iCisgICsiICBSZVN0b3JlUQkJCSAgICA6IFp1bGV0enQgZ2Vsb2VzY2h0ZW4gb2RlciBnZWFlbmRlcnRlblxuIgorICArIgkJCQkgICAgOiBRdWVzdGVpbnRyYWcgcmVzdGF1cmllcmVuXG4iCisgICsiICBTZXRRCSAgPHNwaWVsZXI+IDxxdWVzdD4gOiBRdWVzdCBhbHMgJ2dlbG9lc3QnIG1hcmtpZXJlblxuIgorICArIiAgRGVsUQkgIDxzcGllbGVyPiA8cXVlc3Q+IDogUXVlc3QgYWxzICduaWNodCBnZWxvZXN0JyBtYXJraWVyZW5cbiIKKyAgKyIgIFF1ZXJ5UQkgIDxxdWVzdD4JICAgIDogUXVlc3RlaW50cmFnIGFuemVpZ2VuXG4iCisgICsiICBRdWVyeUsJCQkgICAgOiBBbGxlIEtleXMgdW5kIEluZGljZXMgYW56ZWlnZW5cbiIKKyAgKyIgIFF1ZXJ5QWxsUSAJCSAgICA6IEFsbGUgRWludHJhZWdlIHZvbGxzdGFlbmRpZyBhbnplaWdlblxuIgorICArIiAgQWN0aVZhdGVRICAgPHF1ZXN0PgkgICAgOiBRdWVzdCBpbSBRdWVzdG1hc3RlciBha3RpdmllcmVuXG4iCisgICsiICBEZWFjdGlWYXRlUSA8cXVlc3Q+CSAgICA6IFF1ZXN0IGltIFF1ZXN0bWFzdGVyIGRlYWt0aXZpZXJlblxuXG4iCisgICsiICBmdWVyIDxxdWVzdD4ga2FubiBkZXIgSW5kZXggdmVyd2VuZGV0IHdlcmRlbiwgZGVuIFF1ZXJ5SyBsaWVmZXJ0IVxuXG4iCisgICsiICAoQWxsZSBLb21tYW5kb3Mga29lbm5lbiBhYmdla3Vlcnp0IHdlcmRlbi4pXG4iCisJKyIgICAtPiBCZWlzcGllbDogRGVhY3RpVmF0ZVEgPT0gRFZRID09IGR2cSA9PSBkZWFjdGl2YXRlcVxuIik7CisKKyAgU2V0UHJvcChQX05FVkVSRFJPUCwgMSk7CisgIFNldFByb3AoUF9OT0RST1AsIAorICAiTWl0IEhpbGZlIGRlcyBRdWVzdFRvb2xzIGtvZW5uZW4gUXVlc3RzIGVpbmdldHJhZ2VuLCBvZGVyIGdlbG9lc2NodFxuIisKKyAgIndlcmRlbi4gRHUgYnJhdWNoc3QgZXMgdmllbGxlaWNodCBub2NoLCBkZXNoYWxiIHdpcmZzdCBEdSBlcyBuaWNodCB3ZWcuXG4iKTsKKyAgU2V0UHJvcChQX05PQlVZLCAxKTsKKyAgQWRkQ21kKCh7ICJBZGRRIiwgImFkZHEiLCAiQVEiLCAiYXEiIH0pLAkJICAgIkFkZF9RdWVzdCIpOworICBBZGRDbWQoKHsgIlJlbW92ZVEiLCAicmVtb3ZlcSIsICJSUSIsICJycSIgfSksCSAgICJSZW1vdmVfUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJDaGFuZ2VRIiwgImNoYW5nZXEiLCAiQ1EiLCAiY3EiIH0pLAkgICAiQ2hhbmdlX1F1ZXN0Iik7CisgIEFkZENtZCgoeyAiUmVTdG9yZVEiLCAicmVzdG9yZXEiLCAiUlNRIiwgInJzcSIgfSksCSAgICJSZXN0b3JlX1F1ZXN0Iik7CisgIEFkZENtZCgoeyAiU2V0USIsICJzZXRxIiwgIlNRIiwgInNxIiB9KSwJCSAgICJTZXRfUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJEZWxRIiwgImRlbHEiLCAiRFEiLCAiZHEiIH0pLAkJICAgIkRlbF9RdWVzdCIpOworICBBZGRDbWQoKHsgIlF1ZXJ5USIsICJxdWVyeXEiLCAiUVEiLCAicXEiIH0pLAkJICAgIlF1ZXJ5X1F1ZXN0Iik7CisgIEFkZENtZCgoeyAiUXVlcnlLIiwgInF1ZXJ5ayIsICJRSyIsICJxayIgfSksCQkgICAiUXVlcnlfS2V5cyIpOworICBBZGRDbWQoKHsgIlF1ZXJ5QWxsUSIsICJxdWVyeWFsbHEiLCAiUUFRIiwgInFhcSIgfSksCSAgICJRdWVyeV9RdWVzdHMiKTsKKyAgQWRkQ21kKCh7ICJBY3RpVmF0ZVEiLCAiYWN0aXZhdGVxIiwgIkFWUSIsICJhdnEiIH0pLAkgICAiQWN0aXZhdGVRdWVzdCIpOworICBBZGRDbWQoKHsgIkRlYWN0aVZhdGVRIiwgImRlYWN0aXZhdGVxIiwgIkRWUSIsICJkdnEiIH0pLCAiRGVhY3RpdmF0ZVF1ZXN0Iik7CisgIGNvdW50ZXIgPSBRTkFNRTsKKyAgc2F2ZWtleSA9ICIiOworICBkb19jaGFuZ2UgPSAwOworICBudW1fa2V5ID0gKFtdKTsKK30KKworaW50IF9xdWVyeV9hdXRvbG9hZG9iaigpIHsgcmV0dXJuIDE7IH0KKwordm9pZCBpbml0KCkKK3sKKyAgb2JqZWN0IHRwOworCisgIGlmKCEodHAgPSBQTCkgfHwgdHAgIT0gZW52aXJvbm1lbnQoKSkKKyAgICByZXR1cm47CisKKyAgdGhpbmc6OmluaXQoKTsKKworICBpZiAoICFJU19XSVpBUkQodHApIHx8IHRwICE9IG93bmVyICkKKyAgICByZXR1cm4gY2FsbF9vdXQoImRvX3JlbW92ZSIsMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3JlbW92ZSgpCit7CisgIHdyaXRlICggTUUtPlF1ZXJ5UHJvcChQX1NIT1JUKSsiIHplcmZhZWxsdCB6dSBTdGF1Yi5cbiIpOworICBzYXkgKCBNRS0+UXVlcnlQcm9wKFBfU0hPUlQpKyIgemVyZmFlbGx0IGluICIrUEwtPm5hbWUoV0VTU0VOKSsKKyAgICAgICAiIHVuYmVmdWd0ZW4gSGFlbmRlbiB6dSBTdGF1Yi5cbiIpOworICBjYWxsX291dCgicmVtb3ZlIiwxKTsKK30KKworcHJpdmF0ZSB2b2lkIExvYWRfTnVtS2V5KCkKK3sKKyAgc3RyaW5nICprZXlzOworICBpbnQgaTsKKworICBpZiAoICEoa2V5cyA9IChzdHJpbmcqKSBRTS0+UXVlcnlBbGxLZXlzKCkpICkgcmV0dXJuOworICBrZXlzPXNvcnRfYXJyYXkoa2V5cywjJz4pOy8vJykKKyAgZm9yICggaSA9IDAsIG51bV9rZXkgPSAoW10pOyBpIDwgc2l6ZW9mKGtleXMpOyBpKysgKQorICAgIG51bV9rZXkgKz0gKFsoaSsxKSsiIjprZXlzW2ldXSk7Cit9CisKK2ludCBBZGRfUXVlc3Qoc3RyaW5nIHN0cikKK3sKKyAgY291bnRlciA9IFFOQU1FOworICB3cml0ZSAoICJOZXVlIFF1ZXN0OiAoQWJicnVjaCBtaXQgJy4nIG9kZXIgJ35xJylcbiIgKTsKKyAgd3JpdGUgKCAiS2V5IDpcbiIgKTsgCisgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUmVhZE5ld1F1ZXN0IChzdHJpbmcgc3RyKQoreworICBtaXhlZCAqb2xkcXVlc3Q7CisgIGludCBlcnJzdGF0OworICBpbnQgYWN0aXZlOworCisgIGlmICggc3RyID09ICJ+cSIgfHwgc3RyID09ICIuIiApCisgIHsKKyAgICBjb3VudGVyID0gUU5BTUU7CisgICAgaWYoZG9fY2hhbmdlKQorICAgIHsKKyAgICAgIGRvX2NoYW5nZSA9IDA7CisgICAgICBjaGFuZ2VrZXkgPSAiIjsKKyAgICAgIHNhdmVrZXkgPSAiIjsKKyAgICAgIHNhdmVxdWVzdCA9ICh7fSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHN3aXRjaCAoIGNvdW50ZXIgKQorICB7CisgICAgY2FzZSBRTkFNRToKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpICYmIGRvX2NoYW5nZSkKKwluYW1lID0gc2F2ZWtleTsKKyAgICAgIGVsc2UKKwluYW1lID0gc3RyOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJQdW5rdGUgKD4wKSBbJWRdOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8oaW50KXNhdmVxdWVzdFswXToxMCkpICk7IAorICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBRUDoKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpKQorCWlmKGRvX2NoYW5nZSkKKwkgIHFwID0gKGludCkgc2F2ZXF1ZXN0W1FfUVBdOworCWVsc2UKKwkgIHFwID0gMTA7CisgICAgICBlbHNlCisJc3NjYW5mICggc3RyLCAiJWQiLCBxcCApOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJFcmZhaHJ1bmcgKD49MCkgWyVkXTpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/KGludClzYXZlcXVlc3RbMV06cXAqMTAwMCkpKTsKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWFA6IAorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkpCisJaWYoZG9fY2hhbmdlKQorCSAgeHAgPSAoaW50KSBzYXZlcXVlc3RbUV9YUF07CisJZWxzZQorCSAgeHAgPSBxcCAqIDEwMDA7CisgICAgICBlbHNlCisJc3NjYW5mICggc3RyLCAiJWQiLCB4cCApOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJGaWxlbmFtZW4gZmlsZTFbLGZpbGUyLC4uLl0pICVzOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8iWyIraW1wbG9kZSgoc3RyaW5nICopc2F2ZXF1ZXN0WzJdLCIsIikrIl0iOgorCQkgICAgICAgIiIpKSApOworICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBTExPVzoKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpICYmIGRvX2NoYW5nZSkKKwlhbGxvd2VkID0gKHN0cmluZyAqKSBzYXZlcXVlc3RbUV9BTExPV0VEXTsKKyAgICAgIGVsc2UKKwlhbGxvd2VkID0gb2xkX2V4cGxvZGUoaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIi5jIiksIiIpLCIsIik7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIkluZm8gJXM6XG4iLCAoZG9fY2hhbmdlPworCQkJCSAgICAgIlsiK2JyZWFrX3N0cmluZygiXGJcYlxiXGJcYlxiIisoc3RyaW5nKQorCQkJCQkJICAgICAgc2F2ZXF1ZXN0WzNdKyJdIiw3OCw2KQorCQkJCSAgICAgOiIiKSkgKTsgCisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElORk86CisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSAmJiBkb19jaGFuZ2UpCisJaW5mbyA9IChzdHJpbmcpIHNhdmVxdWVzdFtRX0hJTlRdOworICAgICAgZWxzZQorCWluZm8gPSBzdHI7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIlN0dWZlICgtMSA8PWxldjw9MTApICgtMSBpc3QgZWluZSBTZWhlcnF1ZXN0KSBbJWRdOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8oaW50KXNhdmVxdWVzdFs0XTowKSkgKTsKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTEVWRUw6CisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSkKKwlpZihkb19jaGFuZ2UpCisJICBsZXZlbCA9IChpbnQpIHNhdmVxdWVzdFtRX0RJRkZdOworCWVsc2UKKwkgIGxldmVsID0gMDsKKwlzc2NhbmYgKCBzdHIsICIlZCIsIGxldmVsICk7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIktsYXNzZSAoWzAxMjM0NV0pIFslZF06XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyhpbnQpc2F2ZXF1ZXN0WzVdOjApKSApOyAKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0xBU1M6CisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSkKKwlpZihkb19jaGFuZ2UpCisJICBuZWVkID0gKGludCkgc2F2ZXF1ZXN0W1FfQ0xBU1NdOworCWVsc2UKKwkgIG5lZWQgPSAwOworICAgICAgZWxzZQorCXNzY2FuZiAoIHN0ciwgIiVkIiwgbmVlZCApOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJBdHRyaWJ1dCBbMDEyMzRdXG4oMT1mbGVpc3NpZywyPWhlcm9pc2NoLDM9ZXBpc2NoLDQ9bGVnZW5kYWVyKSAlczpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/IlsiKyhzdHJpbmcpc2F2ZXF1ZXN0WzldKyJdIjoiIikpICk7CisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFUVFI6CisgICAgICBpZiAoKCFzdHJ8fCFzaXplb2Yoc3RyKSkpCisJaWYgKGRvX2NoYW5nZSkKKwkgIGdyb3VwID0gKGludCkgc2F2ZXF1ZXN0W1FfQVRUUl07CisJZWxzZQorCSAgZ3JvdXAgPSAwOworICAgICAgZWxzZQorCXNzY2FuZiAoc3RyLCAiJWQiLCBncm91cCk7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIk1hZ2llciAlczpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/IlsiKyhzdHJpbmcpc2F2ZXF1ZXN0WzddKyJdIjoiIikpICk7CisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgYnJlYWs7CQorICAgIGNhc2UgV0laOgorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkgJiYgZG9fY2hhbmdlKQorCXdpemFyZCA9IChzdHJpbmcpIHNhdmVxdWVzdFtRX1dJWl07CisgICAgICBlbHNlCisJd2l6YXJkID0gc3RyOworICAgICAgd2l6YXJkID0gbG93ZXJfY2FzZSh3aXphcmQpOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCBzcHJpbnRmKCJXYXJ0ZW5kZXIgTWFnaWVyICVzOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8iWyIrKHN0cmluZylzYXZlcXVlc3RbOF0rIl0iOiIiKSkgKTsKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0NORFdJWjoKKyAgICAgIGlmICgoIXN0cnx8IXNpemVvZihzdHIpKSAmJiBkb19jaGFuZ2UpCisJc2NuZHdpemFyZCA9IChzdHJpbmcpIHNhdmVxdWVzdFtRX1NDTkRXSVpdOworICAgICAgZWxzZQorCXNjbmR3aXphcmQgPSBzdHI7CisgICAgICBzY25kd2l6YXJkID0gbG93ZXJfY2FzZShzY25kd2l6YXJkKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggIkVpbnRyYWdlbiAoai9uKT9cbiIgKTsKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5EOgorICAgICAgY291bnRlcj1RTkFNRTsKKworICAgICAgaWYgKCBzdHIgIT0gImoiICYmIHN0ciAhPSAiamEiICYmIHN0ciAhPSAieSIgJiYgc3RyICE9ICJ5ZXMiICkKKwlyZXR1cm47CisKKyAgICAgIGFjdGl2ZSA9IDA7CisgICAgICBpZiAoIGRvX2NoYW5nZSAmJiBjaGFuZ2VrZXkgJiYgc2l6ZW9mKGNoYW5nZWtleSkgKQorICAgICAgeworCW9sZHF1ZXN0ID0gKG1peGVkICopIFFNLT5RdWVyeVF1ZXN0ICggY2hhbmdla2V5ICk7CisKKwlpZiAoICFwb2ludGVycCAoIG9sZHF1ZXN0ICkgfHwgIXNpemVvZiAoIG9sZHF1ZXN0ICkgKQorCXsKKwkgIHdyaXRlICggIkFsdGVuIEVpbnRyYWcgbmljaHQgZ2VmdW5kZW4uXG4iICk7CisJICByZXR1cm47CisJfQorCisJZXJyc3RhdCA9IChpbnQpIFFNLT5SZW1vdmVRdWVzdCggY2hhbmdla2V5ICk7CisKKwlkb19jaGFuZ2UgPSAwOworCWNoYW5nZWtleSA9ICIiOworCisJc3dpdGNoICggZXJyc3RhdCApCisJeworCSAgY2FzZQkwOiB3cml0ZSAoICJadWdyaWZmIGF1ZiBhbHRlbiBFaW50cmFnIHZlcndlaWdlcnQuXG4iICk7IHJldHVybjsKKwkgIGNhc2UgLTE6IHdyaXRlICggIlBhcmFtZXRlcmZlaGxlciBiZWltIExvZXNjaGVuLlxuIiApOyByZXR1cm47CisJICBjYXNlIC0yOiB3cml0ZSAoICJBbHRlbiBFaW50cmFnIG5pY2h0IGdlZnVuZGVuLlxuIiApOyByZXR1cm47CisJICBkZWZhdWx0OiB3cml0ZSAoICJBbHRlciBFaW50cmFnIGdlbG9lc2NodC5cbiIgKTsKKwl9CisJYWN0aXZlID0gb2xkcXVlc3RbNl07CisJc2F2ZXF1ZXN0ID0gb2xkcXVlc3Q7CisJc2F2ZWtleSAgID0gY2hhbmdla2V5OworICAgICAgfQorCisgICAgICAvLyBhZGQgbmV3IFF1ZXN0IGRlYWN0aXZhdGVkIGJ5IGRlZmF1bHQgYW5kIGtlZXAgb2xkIGFjdGl2ZSBmbGFnCisgICAgICAvLyBpZiBjaGFuZ2luZyBhbiBleGlzdGluZyBlbnRyeQorICAgICAgZXJyc3RhdD0gKGludClRTS0+QWRkUXVlc3QobmFtZSxxcCx4cCxhbGxvd2VkLGluZm8sbGV2ZWwsbmVlZCxhY3RpdmUsCisJCQkJIHdpemFyZCwgc2NuZHdpemFyZCwgZ3JvdXApOworCisgICAgICBzd2l0Y2ggKCBlcnJzdGF0ICkKKyAgICAgIHsKKwljYXNlICAwOiB3cml0ZSAoICJadWdyaWZmIHZlcndlaWdlcnQuXG4iICk7IGJyZWFrOworCWNhc2UgLTE6IHdyaXRlICggIktleSB1bmd1ZWx0aWcgb2RlciBzaXplb2Yoa2V5KSA8IDUuXG4iICk7IGJyZWFrOworCWNhc2UgLTI6IHdyaXRlICggIlFQIHVuZ3VlbHRpZyBvZGVyIDwgMS5cbiIgKTsgYnJlYWs7CisJY2FzZSAtMzogd3JpdGUgKCAiWFAgdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKwljYXNlIC00OiB3cml0ZSAoICJGaWxlbmFtZShuKSB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworCWNhc2UgLTU6IHdyaXRlICggIkluZm8gdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKwljYXNlIC02OiB3cml0ZSAoICJTdHVmZSB1bmd1ZWx0aWcgb2RlciA8IDAgb2RlciA+IDIwLlxuIiApOyBicmVhazsKKwljYXNlIC03OiB3cml0ZSAoICJBa3Rpdi1GbGFnIDwgMCBvZGVyID4gMS5cbiIgKTsgYnJlYWs7CisJY2FzZSAtODogd3JpdGUgKCAiTWFnaWVybmFtZSB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworCWNhc2UgLTk6IHdyaXRlICggIk1hZ2llcm5hbWUgZGVzIHdhcnRlbmRlbiBNYWdpZXJzIHVuZ3VlbHRpZy5cbiIpOyBicmVhazsKKwljYXNlIC0xMDogd3JpdGUgKCJGYWxzY2hlIEdydXBwZW5laW5vcmRudW5nLlxuIik7IGJyZWFrOworCWRlZmF1bHQ6IHdyaXRlICggIkVpbnRyYWcgZWluZ2VmdWVndC5cbiIgKTsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOworICB9Cit9CisKK2ludCBSZW1vdmVfUXVlc3QgKCBzdHJpbmcgc3RyICkKK3sKKyAgbWl4ZWQgKm9sZHF1ZXN0OworICBzdHJpbmcgbmV3c3RyOworICBpbnQgZXJyc3RhdDsKKworICBpZiAoICEoc3RyPVVBKSApCisgIHsKKyAgICB3cml0ZSAoICJTeW50YXg6IFJlbW92ZVEgPG5hbWU+XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBMb2FkX051bUtleSgpOworCisgIGlmICggIShuZXdzdHIgPSBudW1fa2V5W3N0cisiIl0pICkKKyAgICBuZXdzdHIgPSBzdHI7CisKKyAgb2xkcXVlc3QgPSAobWl4ZWQgKikgUU0tPlF1ZXJ5UXVlc3QgKCBuZXdzdHIgKTsKKworICBpZiAoICFwb2ludGVycCAoIG9sZHF1ZXN0ICkgfHwgIXNpemVvZiAoIG9sZHF1ZXN0ICkgKQorICB7CisgICAgd3JpdGUgKCAiS2VpbmUgUXVlc3QgZGllc2VzIE5hbWVucyBnZWZ1bmRlbi5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGVycnN0YXQgPSAoaW50KSBRTS0+UmVtb3ZlUXVlc3QoIG5ld3N0ciApOworCisgIHN3aXRjaCAoIGVycnN0YXQgKQorICB7CisgICAgY2FzZSAgMDogd3JpdGUgKCAiWnVncmlmZiB2ZXJ3ZWlnZXJ0LlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSAoICJQYXJhbWV0ZXJmZWhsZXIuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlICggIlF1ZXN0IG5pY2h0IGdlZnVuZGVuLlxuIiApOyBicmVhazsKKyAgICBkZWZhdWx0OiB3cml0ZSAoICJRdWVzdCBlbnRmZXJudC5cbiIgKTsKKyAgfQorCisgIHNhdmVxdWVzdCA9IG9sZHF1ZXN0OworICBzYXZla2V5ICAgPSBuZXdzdHI7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDaGFuZ2VfUXVlc3QgKCBzdHJpbmcgc3RyICkKK3sKKyAgbWl4ZWQgKm9sZHF1ZXN0OworICBzdHJpbmcgbmV3c3RyOworCisgIGlmICggIShzdHI9VUEpICkKKyAgeworICAgIHdyaXRlICggIlN5bnRheDogQ2hhbmdlUSA8cXVlc3Q+XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBMb2FkX051bUtleSgpOworCisgIGlmICggIShuZXdzdHIgPSBudW1fa2V5W3N0cisiIl0pICkKKyAgICBuZXdzdHIgPSBzdHI7CisKKyAgb2xkcXVlc3QgPSAobWl4ZWQgKikgUU0tPlF1ZXJ5UXVlc3QgKCBuZXdzdHIgKTsKKworICBpZiAoICFwb2ludGVycCggb2xkcXVlc3QgKSB8fCAhc2l6ZW9mICggb2xkcXVlc3QgKSApCisgIHsKKyAgICB3cml0ZSAoICJLZWluZSBRdWVzdCBkaWVzZXMgTmFtZW5zIGdlZnVuZGVuLlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgZG9fY2hhbmdlID0gMTsKKyAgY2hhbmdla2V5ID0gbmV3c3RyOworICBzYXZla2V5ID0gbmV3c3RyOworICBzYXZlcXVlc3QgPSBvbGRxdWVzdDsKKworICB3cml0ZSAoICJBa3R1ZWxsZXIgRWludHJhZzpcbiIpOworICB3cml0ZSAoICJLZXkgICAgICAgICAgICAgIDogIituZXdzdHIrIlxuIiApOworICB3cml0ZSAoICJQdW5rdGUgICAgICAgICAgIDogIitvbGRxdWVzdFtRX1FQXSsiXG4iICk7CisgIHdyaXRlICggIkVyZmFocnVuZyAgICAgICAgOiAiK29sZHF1ZXN0W1FfWFBdKyJcbiIgKTsKKyAgd3JpdGUgKCAiRmlsZW5hbWVuICAgICAgICA6ICIraW1wbG9kZShvbGRxdWVzdFtRX0FMTE9XRURdLCIsIikrIlxuIiApOworICB3cml0ZSAoICJJbmZvICAgICAgICAgICAgIDogIitvbGRxdWVzdFtRX0hJTlRdKyJcbiIgKTsKKyAgd3JpdGUgKCAiU3R1ZmUgICAgICAgICAgICA6ICIrb2xkcXVlc3RbUV9ESUZGXSsiXG4iICk7CisgIHdyaXRlICggIktsYXNzZSAgICAgICAgICAgOiAiK1FDTEFTU19TVEFSUyhvbGRxdWVzdFtRX0NMQVNTXSkrIlxuIiApOworICB3cml0ZSAoICJBdHRyaWJ1dCAgICAgICAgIDogIitRQVRUUl9TVFJJTkdTW29sZHF1ZXN0W1FfQVRUUl1dKyJcbiIgKTsKKyAgd3JpdGUgKCAiTWFnaWVyICAgICAgICAgICA6ICIrY2FwaXRhbGl6ZShvbGRxdWVzdFtRX1dJWl0pKyJcbiIgKTsKKyAgd3JpdGUgKCAiV2FydGVuZGVyIE1hZ2llciA6ICIrY2FwaXRhbGl6ZShvbGRxdWVzdFtRX1NDTkRXSVpdKSsiXG4iICk7CisKKworICB3cml0ZSAoICJcbk5ldWUgUXVlc3Q6ICAgICAobWl0ICcuJyBvZGVyICd+cScga2FubiBhYmdlYnJvY2hlbiB3ZXJkZW4pXG4iICk7CisgIHdyaXRlICggc3ByaW50ZigiS2V5IFslc106XG4iLCBzYXZla2V5KSApOworICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBSZXN0b3JlX1F1ZXN0ICggc3RyaW5nIHN0ciApCit7CisgIGludCBlcnJzdGF0OworCisgIGlmICggIXNhdmVrZXkgfHwgIXNpemVvZihzYXZla2V5KSApCisgIHsKKyAgICB3cml0ZSAoICJcblR1dCBtaXIgbGVpZCFcbiIgKTsKKyAgICB3cml0ZSAoICJOaWNodHMgenVtIFJlc3RhdXJpZXJlbiBnZWZ1bmRlbiAuLi5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGVycnN0YXQgPSAKKwkoaW50KVFNLT5BZGRRdWVzdCggc2F2ZWtleSwgKGludCkgc2F2ZXF1ZXN0WzBdLCAoaW50KSBzYXZlcXVlc3RbMV0sCisJCQkgIChzdHJpbmcgKikgc2F2ZXF1ZXN0WzJdLCAoc3RyaW5nKSBzYXZlcXVlc3RbM10sCisJCQkgIChpbnQpIHNhdmVxdWVzdFs0XSwgKGludCkgc2F2ZXF1ZXN0WzVdLAorCQkJICAoc3RyaW5nKSBzYXZlcXVlc3RbNl0sIChpbnQpIHNhdmVxdWVzdFs3XSwKKwkJCSAgKHN0cmluZykgc2F2ZXF1ZXN0WzhdICk7CisKKyAgc3dpdGNoICggZXJyc3RhdCApCisgIHsKKyAgICBjYXNlICAwOiB3cml0ZSAoICJadWdyaWZmIHZlcndlaWdlcnQuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlICggIktleSB1bmd1ZWx0aWcgb2RlciBzaXplb2Yoa2V5KSA8IDUuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlICggIlFQIHVuZ3VlbHRpZyBvZGVyIDwgMS5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMzogd3JpdGUgKCAiWFAgdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC00OiB3cml0ZSAoICJGaWxlbmFtZShuKSB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTU6IHdyaXRlICggIkluZm8gdW5ndWVsdGlnLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC02OiB3cml0ZSAoICJTdHVmZSB1bmd1ZWx0aWcgb2RlciA8IDAgb2RlciA+IDIwLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC03OiB3cml0ZSAoICJBa3Rpdi1GbGFnIDwgMCBvZGVyID4gMS5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtODogd3JpdGUgKCAiTWFnaWVybmFtZSB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTk6IHdyaXRlICggIk1hZ2llcm5hbWUgdW5ndWVsdGlnLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTEwOiB3cml0ZSAoIlVuZ3VlbHRpZ2UgR3J1cHBlbm51bW1lci5cbiIpOyBicmVhazsKKyAgICBkZWZhdWx0OiB3cml0ZSAoICInIitzYXZla2V5KyInIHJlc3RhdXJpZXJ0LlxuIiApOworICB9CisgIHNhdmVrZXkgPSAiIjsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBTZXRfUXVlc3QgKCBzdHJpbmcgc3RyICkKK3sKKyAgc3RyaW5nIHF1ZXN0LCBwbGF5ZXIsIG5ld3F1ZXN0OworICBpbnQgY3JlYXRlZDsKKyAgb2JqZWN0IG9iOworCisgIGlmICggIShzdHI9VUEpIHx8IHNzY2FuZiggc3RyLCAiJXMgJXMiLCBwbGF5ZXIsIHF1ZXN0ICkgIT0gMiApCisgIHsKKyAgICB3cml0ZSAoICJTeW50YXg6IFNldFEgPHBsYXllcj4gPHF1ZXN0PlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgY3JlYXRlZD0wOworICBMb2FkX051bUtleSgpOworCisgIGlmICggIShuZXdxdWVzdCA9IG51bV9rZXlbcXVlc3QrIiJdKSApCisgICAgbmV3cXVlc3QgPSBxdWVzdDsKKworICBvYj1maW5kX3BsYXllcihwbGF5ZXIpOworICBpZighb2IpCisgIHsKKyAgICBvYj1maW5kX25ldGRlYWQocGxheWVyKTsKKyAgICBpZighb2IpCisgICAgeworICAgICAgY3JlYXRlZD0xOworICAgICAgb2I9X19jcmVhdGVfcGxheWVyX2R1bW15KHBsYXllcik7CisgICAgfQorICB9CisgIGlmKCFvYikKKyAgeworICAgIHdyaXRlKCJLZWluIHNvbGNoZXIgU3BpZWxlciBnZWZ1bmRlbi5cbiEiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgd3JpdGUoRVJSTk9fMl9TVFJJTkcoIkdRIiwoaW50KW9iLT5HaXZlUXVlc3QobmV3cXVlc3QsIl9fc2lsZW50X18iKSkrIlxuIik7CisgIGlmKGNyZWF0ZWQpCisgIHsKKyAgICBvYi0+c2F2ZV9tZSgwKTsKKyAgICBpZighKG9iLT5yZW1vdmUoKSkpCisgICAgeworICAgIAlkZXN0cnVjdChvYik7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgRGVsX1F1ZXN0ICggc3RyaW5nIHN0ciApCit7CisgIHN0cmluZyBxdWVzdCwgcGxheWVyLCBuZXdxdWVzdDsKKyAgaW50IGNyZWF0ZWQ7CisgIG9iamVjdCBvYjsKKworICBpZiAoICEoc3RyPVVBKSB8fCBzc2NhbmYoIHN0ciwgIiVzICVzIiwgcGxheWVyLCBxdWVzdCApICE9IDIgKQorICB7CisgICAgd3JpdGUgKCAiU3ludGF4OiBEZWxRIDxwbGF5ZXI+IDxxdWVzdD5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIExvYWRfTnVtS2V5KCk7CisKKyAgaWYgKCAhKG5ld3F1ZXN0ID0gbnVtX2tleVtxdWVzdCsiIl0pICkKKyAgICBuZXdxdWVzdCA9IHF1ZXN0OworCisgIGNyZWF0ZWQ9MDsKKyAgb2I9ZmluZF9wbGF5ZXIocGxheWVyKTsKKyAgaWYoIW9iKQorICB7CisgICAgb2I9ZmluZF9uZXRkZWFkKHBsYXllcik7CisgICAgaWYoIW9iKQorICAgIHsKKyAgICAgIGNyZWF0ZWQ9MTsKKyAgICAgIG9iPV9fY3JlYXRlX3BsYXllcl9kdW1teShwbGF5ZXIpOworICAgIH0KKyAgfQorICBpZighb2IpCisgIHsKKyAgICB3cml0ZSgiS2VpbiBzb2xjaGVyIFNwaWVsZXIgZ2VmdW5kZW4uXG4hIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIHdyaXRlKEVSUk5PXzJfU1RSSU5HKCJEUSIsKGludCkgb2ItPkRlbGV0ZVF1ZXN0ICggbmV3cXVlc3QgKSkrIlxuIik7CisgIGlmKGNyZWF0ZWQpCisgIHsKKyAgICBvYi0+c2F2ZV9tZSgwKTsKKyAgICBpZighKG9iLT5yZW1vdmUoKSkpCisgICAgeworICAgIAlkZXN0cnVjdChvYik7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgUXVlcnlfUXVlc3QgKCBzdHJpbmcgc3RyICkKK3sKKyAgbWl4ZWQgKnF1ZXN0OworICBzdHJpbmcgbmV3c3RyOworICBpbnQgaTsKKworICBpZiAoICEoc3RyPVVBKSApCisgIHsKKyAgICB3cml0ZSAoICJTeW50YXg6IFF1ZXJ5USA8cXVlc3Q+XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBMb2FkX051bUtleSgpOworCisgIGlmICggIShuZXdzdHIgPSBudW1fa2V5W3N0cisiIl0pICkKKwluZXdzdHIgPSBzdHI7CisKKyAgcXVlc3QgPSAobWl4ZWQgKikgUU0tPlF1ZXJ5UXVlc3QoIG5ld3N0ciApOworCisgIGlmICggIXBvaW50ZXJwKCBxdWVzdCApIHx8ICFzaXplb2YgKCBxdWVzdCApICkKKyAgeworICAgIHdyaXRlICggIktlaW5lIFF1ZXN0IGRpZXNlcyBOYW1lbnMgZ2VmdW5kZW4uXG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB3cml0ZSAoICJBa3R1ZWxsZXIgRWludHJhZzpcbiIpOworICB3cml0ZSAoICJLZXkgICAgICAgICAgICAgIDogIituZXdzdHIgKTsKKyAgaWYocXVlc3RbUV9BQ1RJVkVdKQorICAgIHdyaXRlICgiIChha3RpdmllcnQpXG4iKTsKKyAgZWxzZQorICAgIHdyaXRlICgiIChkZWFrdGl2aWVydClcbiIpOworICB3cml0ZSAoICJQdW5rdGUgICAgICAgICAgIDogIitxdWVzdFtRX1FQXSsiXG4iICk7CisgIHdyaXRlICggIkVyZmFocnVuZyAgICAgICAgOiAiK3F1ZXN0W1FfWFBdKyJcbiIgKTsKKyAgd3JpdGUgKCBicmVha19zdHJpbmcgKCBpbXBsb2RlKCBxdWVzdFtRX0FMTE9XRURdLCAiICIgKSwgNjUsICJGaWxlbmFtZW4JIDogIiApICk7CisgIHdyaXRlICggYnJlYWtfc3RyaW5nICggcXVlc3RbUV9ISU5UXSwgNjUsICJJbmZvICAgICAgICAgICAgIDogIiApICk7CisgIHdyaXRlICggIlN0dWZlICAgICAgICAgICAgOiAiK3F1ZXN0W1FfRElGRl0rIlxuIiApOworICBwcmludGYoIlN0dWZlIChhdmcpICAgICAgOiAlLjJmICglZClcbiIsIHF1ZXN0W1FfQVZFUkFHRV1bMF0sIAorICAgICAgICBxdWVzdFtRX0FWRVJBR0VdWzFdKTsKKyAgd3JpdGUgKCAiS2xhc3NlICAgICAgICAgICA6ICIrIFFDTEFTU19TVEFSUyhxdWVzdFtRX0NMQVNTXSkrIlxuIik7CisgIHdyaXRlICggIkF0dHJpYnV0ZSAgICAgICAgOiAiKyBRQVRUUl9TVFJJTkdTW3F1ZXN0W1FfQVRUUl1dKyJcbiIpOworICB3cml0ZSAoICJNYWdpZXIgICAgICAgICAgIDogIitjYXBpdGFsaXplKHF1ZXN0W1FfV0laXSkrIlxuIiApOworICB3cml0ZSAoICJXYXJ0ZW5kZXIgTWFnaWVyIDogIitjYXBpdGFsaXplKHF1ZXN0W1FfU0NORFdJWl0pKyJcbiIpOworICByZXR1cm4gMTsKK30KKworaW50IFF1ZXJ5X0tleXMgKCBzdHJpbmcgc3RyICkKK3sKKyAgc3RyaW5nICprZXlzLCBhY3RpdmU7CisgIG1peGVkICpxdWVzdDsKKyAgaW50IGk7CisKKyAgaWYgKCAhKGtleXMgPSAoc3RyaW5nICopIFFNLT5RdWVyeUFsbEtleXMoKSkgKQorICAgIHJldHVybiAxOworCisgIHdyaXRlICggIlxuIiApOworICBrZXlzPXNvcnRfYXJyYXkoa2V5cywjJz4pOy8vJykKKyAgZm9yICggaSA9IDA7IGkgPCBzaXplb2Yoa2V5cyk7IGkrKyApCisgIHsKKyAgICBxdWVzdCA9IChtaXhlZCAqKSBRTS0+UXVlcnlRdWVzdChrZXlzW2ldKTsKKyAgICBpZihxdWVzdFs2XSkKKyAgICAgIGFjdGl2ZT0iKiI7CisgICAgZWxzZQorICAgICAgYWN0aXZlPSIgIjsKKyAgICB3cml0ZShzcHJpbnRmKCIlMmQlcyAlLTMzcyVzIixpKzEscXVlc3RbNl0/IioiOiIgIixrZXlzW2ldLAorCQkgICAgICAhKGklMik/IiAiOiJcbiIpKTsKKyAgfQorICBpZihpJTIpCisgICAgd3JpdGUoIlxuIik7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBRdWVyeV9RdWVzdHMgKCBzdHJpbmcgc3RyICkKK3sKKyAgbWl4ZWQgKnF1ZXN0OworICBzdHJpbmcgKmtleXMsIHJzdHI7CisgIGludCBpOworCisgIGlmICggIShrZXlzID0gKG1peGVkICopIFFNLT5RdWVyeUFsbEtleXMoKSkgKQorICAgIHJldHVybiAxOworCisgIGtleXM9c29ydF9hcnJheShrZXlzLCMnPik7Ly8nKQorICBmb3IgKCBpID0gMCwgcnN0ciA9ICIiOyBpIDwgc2l6ZW9mKGtleXMpOyBpKysgKQorICB7CisgICAgcXVlc3QgPSAobWl4ZWQgKikgUU0tPlF1ZXJ5UXVlc3Qoa2V5c1tpXSk7CisgICAgICB3cml0ZSAoICJcbktleSAgICAgICAgICAgICAgOiAiK2tleXNbaV0gKTsKKyAgaWYocXVlc3RbUV9BQ1RJVkVdKQorICAgIHdyaXRlICgiIChha3RpdmllcnQpXG4iKTsKKyAgZWxzZQorICAgIHdyaXRlICgiIChkZWFrdGl2aWVydClcbiIpOworICB3cml0ZSAoICJQdW5rdGUgICAgICAgICAgIDogIitxdWVzdFtRX1FQXSsiXG4iICk7CisgIHdyaXRlICggIkVyZmFocnVuZyAgICAgICAgOiAiK3F1ZXN0W1FfWFBdKyJcbiIgKTsKKyAgd3JpdGUgKCBicmVha19zdHJpbmcgKCBpbXBsb2RlKCBxdWVzdFtRX0FMTE9XRURdLCAiICIgKSwgNzgsICJGaWxlbmFtZW4JIDogIiApICk7CisgIHdyaXRlICggYnJlYWtfc3RyaW5nICggcXVlc3RbUV9ISU5UXSwgNzgsICJJbmZvCQkgOiAiICkgKTsKKyAgd3JpdGUgKCAiU3R1ZmUgICAgICAgICAgICA6ICIrcXVlc3RbUV9ESUZGXSsiXG4iICk7CisgIHdyaXRlICggIktsYXNzZSAgICAgICAgICAgOiAiKyBRQ0xBU1NfU1RBUlMocXVlc3RbUV9DTEFTU10pKyJcbiIpOworICB3cml0ZSAoICJBdHRyaWJ1dGUgICAgICAgIDogIisgUUFUVFJfU1RSSU5HU1txdWVzdFtRX0FUVFJdXSsiXG4iKTsKKyAgd3JpdGUgKCAiTWFnaWVyICAgICAgICAgICA6ICIrY2FwaXRhbGl6ZShxdWVzdFs3XSkrIlxuIiApOworICB3cml0ZSAoICJXYXJ0ZW5kZXIgTWFnaWVyIDogIitjYXBpdGFsaXplKHF1ZXN0WzhdKSsiXG4iKTsKKyAgfQorICBNb3JlKCByc3RyLCAwICk7CisgIHJldHVybiAxOworfQorCitpbnQgQWN0aXZhdGVRdWVzdCggc3RyaW5nIHN0ciApCit7CisgIG1peGVkICpxdWVzdDsKKyAgc3RyaW5nIG5ld3N0cjsKKyAgaW50IGVycnN0YXQ7CisKKyAgaWYgKCAhKHN0cj1VQSkgKQorICB7CisgICAgd3JpdGUgKCAiU3ludGF4OiBBY3RpVmF0ZVEgPHF1ZXN0PlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgTG9hZF9OdW1LZXkoKTsKKworICBpZiAoICEobmV3c3RyID0gbnVtX2tleVtzdHIrIiJdKSApCisJbmV3c3RyID0gc3RyOworCisgIHN3aXRjaCggUU0tPlNldEFjdGl2ZSggbmV3c3RyLCAxICkgKQorICB7CisgICAgY2FzZSAtMzogd3JpdGUgKCAiVW5ndWVsdGlnZXIgRmxhZy5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUgKCAiUXVlc3Qgd2FyIGJlcmVpdHMgYWt0aXZpZXJ0LlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSAoICJLZWluZSBRdWVzdCBkaWVzZXMgTmFtZW5zIGdlZnVuZGVuLlxuIiApOyBicmVhazsKKyAgICBjYXNlICAwOiB3cml0ZSAoICJadWdyaWZmIHZlcndlaWdlcnRcbiIgKTsgYnJlYWs7CisgICAgY2FzZSAgMTogd3JpdGUgKCAiUXVlc3QgJyIrbmV3c3RyKyInIGFrdGl2aWVydC5cbiIgKTsgYnJlYWs7CisgICAgZGVmYXVsdDogd3JpdGUgKCAidW5iZWthbm50ZXIgRmVobGVyc3RhdHVzLlxuIiApOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgRGVhY3RpdmF0ZVF1ZXN0KCBzdHJpbmcgc3RyICkKK3sKKyAgbWl4ZWQgKnF1ZXN0OworICBzdHJpbmcgbmV3c3RyOworICBpbnQgZXJyc3RhdDsKKworICBpZiAoICEoc3RyPVVBKSApCisgIHsKKyAgICB3cml0ZSAoICJTeW50YXg6IERlYWN0aVZhdGVRIDxxdWVzdD5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIExvYWRfTnVtS2V5KCk7CisKKyAgaWYgKCAhKG5ld3N0ciA9IG51bV9rZXlbc3RyKyIiXSkgKQorCW5ld3N0ciA9IHN0cjsKKworICBzd2l0Y2goIFFNLT5TZXRBY3RpdmUoIG5ld3N0ciwgMCApICkKKyAgeworICAgIGNhc2UgLTM6IHdyaXRlICggIlVuZ3VlbHRpZ2VyIEZsYWcuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlICggIlF1ZXN0IHdhciBiZXJlaXRzIGRlYWt0aXZpZXJ0LlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSAoICJLZWluZSBRdWVzdCBkaWVzZXMgTmFtZW5zIGdlZnVuZGVuLlxuIiApOyBicmVhazsKKyAgICBjYXNlICAwOiB3cml0ZSAoICJadWdyaWZmIHZlcndlaWdlcnRcbiIgKTsgYnJlYWs7CisgICAgY2FzZSAgMTogd3JpdGUgKCAiUXVlc3QgJyIrbmV3c3RyKyInIGRlYWt0aXZpZXJ0LlxuIiApOyBicmVhazsKKyAgICBkZWZhdWx0OiB3cml0ZSAoICJ1bmJla2FubnRlciBGZWhsZXJzdGF0dXMuXG4iICk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9hZG0vbWsgYi9vYmovdG9vbHMvdGVsbGVyL2FkbS9tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Nzk4MjY0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9hZG0vbWsKQEAgLTAsMCArMSwyNSBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisKKyRtb2RlID0gMDsKKyRUMT0ibWl4ZWR8ZmxvYXR8aW50fHN0cmluZ3xvYmplY3R8dm9pZHxxdW90ZWRfYXJyYXl8c3ltYm9sfGNsb3N1cmV8bWFwcGluZyI7CiskVDI9Im1peGVkIFwqfGZsb2F0IFwqfGludCBcKnxzdHJpbmcgXCp8b2JqZWN0IFwqfHZvaWQgXCp8cXVvdGVkX2FycmF5IFwqfHN5bWJvbCBcKnxjbG9zdXJlIFwqfG1peGVkIFwmIjsKKyRUWVBFUz0iXCgkVDF8JFQyXCkiOworCit3aGlsZSggPD4gKSB7CisJY2hvcCAkXzsKKwlpZiggJG1vZGUgPT0gMCAmJiAkXyBlcSAiJWVmdW5zIiApIHsKKwkJJG1vZGUgPSAxOworCX0gZWxzaWYoICRtb2RlID09IDEgJiYgJF8gZXEgIiV4Y29kZXMiICkgeworCQkkbW9kZSA9IDI7CisJfSBlbHNpZiggJF8gPX4gIiNlbmRpZiIgJiYgJG1vZGUgPT0gMyApIHsKKwkJJG1vZGUgPSAxOworCX0gZWxzaWYoICRtb2RlID09IDEgKSB7CisJCWlmKCAkXyA9fiBtIiNpZm5kZWYgTkFUSVZFIiB8fCAkXyA9fiBtIiNpZmRlZiBNQUxMT0NfbWFsbG9jIiApIHsKKwkJCSRtb2RlID0gMzsKKwkJfSBlbHNpZiggJF8gbmUgIiIgJiYgJF8gIX4gbSJeLlwqIiAmJiAkXyAhfiAiXiMiICkgeworCQkJcy9kZWZhdWx0OiBcdyovLzsKKwkJCXMvJFRZUEVTL21peGVkL2c7CisJCQlwcmludCAiJF9cbiI7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2FycmF5IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9hcnJheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUzMDAwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9hcnJheQpAQCAtMCwwICsxLDE5IEBACitCRUZFSEw6CisJYXJyYXksIGFycgorCitBUkdVTUVOVEU6CisJQWxsZSBTdGFja2VsZW1lbnRlIGJpcyB6dW0gbGV0enRlbiBMb2NrLgorCitGVU5LVElPTjoKKwlBbGxlIEVsZW1lbnRlIHdlcmRlbiB6dSBlaW5lbSBBcnJheSB6dXNhbW1lbmdlZnVlZ3QuIERlciBMb2NrCisJd2lyZCBlbnRmZXJudCB1bmQgZGFzIEFycmF5IHdpZWRlciBhdWYgZGVuIFN0YWNrIGdlbGVndC4KKworQkVJU1BJRUxFOgorCSxtZSAiemFwX21zZyIsICJEdSBrb2Noc3QgQEB3ZW5AQC5cbiIgIkBAaWNoQEAga29jaHQgQEB3ZW5AQC5cbiIKKwkiQEBpY2hAQCBrb2NodCBEaWNoLlxuIiBhcnJheSAhU2V0UHJvcAorCQlXYW5kZWx0IGRpZSBkcmVpIFN0cmluZ3MgaW4gZWluIEFycmF5IHVtLiBEYW5hY2ggd2lyZCBpbQorCQlTcGllbGVyIGRpZSBaYXBwLU1lbGR1bmcgbmV1IGdlc2V0enQuIERhcyBvYmlnZSBtdXNzCisJCW5hdHVlcmxpY2ggaW4gZWluZXIgWmVpbGUgZWluZ2VnZWJlbiB3ZXJkZW4uCisKK1NQSUVIRSBBVUNIOgorCSJzcGxpdCIsICJsb2NrIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTcyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGwKQEAgLTAsMCArMSwyNiBAQAorQkVGRUhMOgorCSdmdW5rdGlvbiwgJydmdW5rdGlvbiBvZGVyCisJLT5mdW5rdGlvbiwgLS0+ZnVua3Rpb24KKworQVJHVU1FTlRFOgorCUFsbGUgU3RhY2tlbGVtZW50ZSBiaXMgenVtIGxldHp0ZW4gTG9jay4KKwlmdW5rdGlvbiAtLSBOYW1lIGVpbmVyIGxmdW4uCisKK0ZVTktUSU9OOgorCVJ1ZmUgaW4gZGVtIE9iamVrdCBvYmVyaGFsYiBkZXMgbGV0enRlbiBMb2NrcywgZGllIGFuZ2VnZWJlbmUKKwlGdW5rdGlvbiBhdWYgdW5kIHVlYmVyZ2liIGRpZSBmb2xnZW5kZW4gRWxlbWVudGUgZGVzIFN0YWNrcworCShiaXMgaGluYXVmIHp1bSBUT1MpIGFscyBBcmd1bWVudGUuIEVudGZlcm5lIGRlbiBMb2NrLgorCVdlbm4gbWl0IGRpZSBGdW5rdGlvbiBtaXQgendlaSBBcG9zdHJvcGhlbiBvZGVyIHp3ZWkgTWludXN6ZWljaGVuCisJZ2VydWZlbiB3dXJkZSwgbGVnZSBkYXMgRXJnZWJuaXMgYXVmIGRlbiBTdGFjay4gKEJlaSBlaW5mYWNoZW0KKwlBcG9zdHJvcGggYnp3LiBNaW51c3plaWNoZW4gYWxzbyBuaWNodC4pCisKK0JFSVNQSUVMOgorCSxtZSAiZGFzIEdyYXVlbiBhbSBNb3JnZW4iICdzZXRfdGl0bGUKKwlFbnNwcmljaHQ6CisJY2FsbF9vdGhlciggdGhpc19wbGF5ZXIoKSwgInNldF90aXRsZSIsICJkYXMgR3JhdWVuIGFtIE1vcmdlbiIgKTsKKworV0FSTlVORzoKKwlNYW4gc29sbHRlIHZvcmhlciBuYWNoc2NoYXVlbiwgb2IgbmljaHQgbm9jaCBldHdhcyBhdWYgZGVtIFN0YWNrCisJbGllZ3QsIGRlbm4gd2VubiBrZWluIExvY2sgZGEgaXN0LCB3dWVyZGUgZGllIEZ1bmt0aW9uIGRhcmluCisJYXVmZ2VydWZlbiB3ZXJkZW4gKG1pdCBtZSB1bmQgImRhcyBHcmF1ZW4gYW0gTW9yZ2VuIiBhbHMgQXJndW1lbnRlKSwKKwlEZXNoYWxiIGJlc3NlciBzbzogLCxtZSAiZGFzIEdyYXVlbiBhbSBNb3JnZW4iICcnc2V0X3RpdGxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGxlZnVuIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsZWZ1bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWZkZTJhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsZWZ1bgpAQCAtMCwwICsxLDI1IEBACitCRUZFSEw6CisJYGZ1bmt0aW9uLCBgYGZ1bmt0aW9uIG9kZXIKKwktKmZ1bmt0aW9uLCAtLSpmdW5rdGlvbgorCitBUkdVTUVOVEU6CisJQWxsZSBTdGFja2VsZW1lbnRlIGJpcyB6dW0gbGV0enRlbiBMb2NrLgorCWZ1bmt0aW9uIC0tIE5hbWUgZWluZXIgZWZ1bi4KKworRlVOS1RJT046CisJUnVmZSBkaWUgYW5nZWdlYmVuZSBlZnVuIGF1ZiwgdW5kIHVlYmVyZ2ViZSBhbGxlIFN0YWNrZWxlbWVudGUKKwliaXMgenVtIGxldHp0ZW4gTG9jayBhbHMgQXJndW1lbnRlLiBFbnRmZXJuZSBkZW4gTG9jay4KKwlXZW5uIGRpZSBlZnVuIG1pdCBkb3BwZWx0ZW4gQmFja3F1b3RlcyBvZGVyIE1pbnVzemVpY2hlbiAoJ2BgJyBvZGVyCisJJy0tKicpIGF1ZmdlcnVmZW4gd3VyZGUsIGxlZ2UgZGFzIEVyZ2VibmlzIGF1ZiBkZW4gU3RhY2suIChCZWkKKwllaW5mYWNoZW0gJ2AnIGFsc28gbmljaHQuKQorCitCRUlTUElFTDoKKwksbWUgYGVudmlyb25tZW50CisJRW5zcHJpY2h0OgorCWVudmlyb25tZW50KCB0aGlzX3BsYXllcigpICk7CisKK1dBUk5VTkc6CisJTWFuIHNvbGx0ZSB2b3JoZXIgbmFjaHNjaGF1ZW4sIG9iIG5pY2h0IG5vY2ggZXR3YXMgYXVmIGRlbSBTdGFjaworCWxpZWd0LCBkZW5uIHdlbm4ga2VpbiBMb2NrIGRhIGlzdCwgd2VyZGVuIHp1YWV0emxpY2ggbm9jaAorCXVuZ2V3dW5zY2h0ZSBBcmd1bWVudGUgbWl0dWViZXJnZWJlbi4KKwlEZXNoYWxiIGJlc3NlciBzbzogLCxtZSBgYGVudmlyb25tZW50CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGxvdXRzIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsb3V0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMwNDJjCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jYWxsb3V0cwpAQCAtMCwwICsxLDI0IEBACitCRUZFSEw6CisJY2FsbG91dHMKKwljYWxsb3V0cyEKKworQVJHVU1FTlRFOgorCWNhbGxvdXRzOiBUT1MgU3RyaW5nLCBuYWNoIGRlbSBnZXN1Y2h0IHdpcmQuCisJY2FsbG91dHMhOiBrZWluZQorCitGVU5LVElPTjoKKwlHaWIgZWluZSBMaXN0ZSBhbGxlciBpbSBTcGllbCBsYXVmZW5kZW4gY2FsbF9vdXRzIGF1cy4gRWluIGNhbGxfb3V0CisJd2lyZCBpbiBmb2xnZW5kZW0gRm9ybWF0IGF1c2dlZ2ViZW46CisJMS4pIFplaXQsIGJpcyB6dW0gQXVmcnVmIGRlciBGdW5rdGlvbi4KKwkyLikgT2JqZWt0LCBpbiBkZW0gZGllIEZ1bmt0aW9uIGF1ZmdlcnVmZW4gd2lyZC4KKwkzLikgTmFtZSBkZXIgRnVua3Rpb24uCisJNC4pIEFyZ3VtZW50LCBkYXMgZGVtIGNhbGxfb3V0IHVlYmVyZ2ViZW4gd2lyZC4KKworCVdpcmQgZGVyIEJlZmVobCBvaG5lIFJ1ZnplaWhlbiBlaW5nZWdlYmVuLCBzbyB3ZXJkZW4gbnVyIGRpZQorCU1lbGR1bmdlbiBhdXNnZWdlYmVuLCBkaWUgaW4gZGVuIGVyc3RlbiBkcmVpICghKSBBcmd1bWVudGVuCisJZGVuIGFuZ2VnZWJlbmVuIFN0cmluZyBlbnRoYWx0ZW4uCisKK0JFSVNQSUVMOgorCSwiZ28iIGNhbGxvdXRzCisJR2lidCBhbGxlIE1vbnN0ZXIgYXVzLCBkaWUgbWl0dGVscyBkZXIgRnVua3Rpb24gImdvIiB1bWhlcmxhdWZlbi4KKwkoRXMgZ2lidCBhYmVyIGF1Y2ggd2VsY2hlLCBkaWUgbWl0dGVscyAiV2FsayIgbGF1ZmVuLiA6LSkKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xlYW5vZiBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xlYW5vZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTU3Y2YxCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbGVhbm9mCkBAIC0wLDAgKzEsMTYgQEAKK0JFRkVITDoKKwljbGVhbm9mLCBjbG5vZgorCitBUkdVTUVOVEU6CisJRGllIHp3ZWkgb2JlcnN0ZW4gU3RhY2tlbGVtZW50ZS4KKworRlVOS1RJT046CisJWmVyc3RvZXJlIGFsbGUgT2JqZWt0ZSBpbiBkZW0gendlaXRlbiBPYmpla3QgYXVmIGRlbSBTdGFjaywKKwlkaWUgc2ljaCB1bnRlciBkZW0gTmFtZW4sIGRlciBpbiBUT1Mgc3RlaHQsIGFuZ2VzcHJvY2hlbiBmdWVobGVuLgorCURpZSBPYmpla3RlIHdlcmRlbiBhYmVyIG51ciByZW1vdmVkLCBkYXMgZGFzIGRlciBlbXBmb2hsZW5lIFdlZworCWlzdCwgT2JqZWt0ZSB6dSB6ZXJzdG9lcmVuLiBTb2xsZW4gZGllIE9iamVrdGUgd2lya2xpY2ggaGFydCB6ZXJzdG9lcnQKKwl3ZXJkZW4sIHNvIGthbm4gbWFuIGVpbiBSdWZ6ZWljaGVuIGFuIGRlbiBCZWZlaGwgYW5oYWVuZ2VuLgorCShBbHNvICdjbGVhbm9mIScuKQorCitTSUVIRSBBVUNIOgorCSJyZW1vdmUiLCAiZGVzdHJ1Y3QiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NsZWFyIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbGVhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNiNWRjCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbGVhcgpAQCAtMCwwICsxLDkgQEAKK0JFRkVITDoKKwljbGVhciwgY2xyCisKK0FSR1VNRU5URToKKwlTVEFDSworCitGVU5LVElPTjoKKwlMb2VzY2hlIGRlbiBnYW56ZW4gU3RhY2suIERpZSBPYmpla3RlIGF1ZiBkZW0gU3RhY2sgd2VyZGVuIGFiZXIKKwluaWNodCBkZXN0cnVjdGVkLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbG9uZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xvbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1NjIwYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xvbmUKQEAgLTAsMCArMSw3IEBACitCRUZFSEw6CisKK0FSR1VNRU5URToKKworRlVOS1RJT046CisKK0JFSVNQSUVMRToKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvZGVzdHJ1Y3QgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Rlc3RydWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZWQyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Rlc3RydWN0CkBAIC0wLDAgKzEsMTQgQEAKK0JFRkVITDoKKwlkZXN0cnVjdCwgZGVzdCwgZGVzCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJWmVyc3RvZXJlIGRhcyBPYmpla3QgYXVmIGRlbSBUT1MuIEluIHdpcmtsaWNoa2VpdCB3aXJkIGFiZXIgbnVyIHJlbW92ZQorCWF1ZmdlcnVmZW4sIGRhcyBkYXMgZGllIGVtcGZvaGxlbmUgQXJ0IGRlclplcnN0b2VydW5nIHZvbiBPYmpla3RlbgorCWlzdC4gV2lsbCBtYW4gamVkb2NoIGVpbiBPYmpla3Qgd2lya2xpY2ggaGFydCBkZXN0cnVjdGVuLCBzbworCWhhZW5nZSBtYW4gZWluIFJ1ZnplaWNoZW4gKCchJykgYW4gZGFzIEtvbW1hbmRvIChhbHNvICdkZXN0cnVjdCEnKS4KKworU0lFSEUgQVVDSDoKKwkicmVtb3ZlIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kdW1wIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kdW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YmU0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2R1bXAKQEAgLTAsMCArMSwxNiBAQAorQkVGRUhMOgorCWR1bXAKKwkKK0FSR1VNRU5URToKKwlrZWlucyBvZGVyCisJVE9TIC0tIGZpbGVuYW1lCisJCitGVU5LVElPTjoKKwlTcGVpY2hlcmUgYWxsZSBzZWxic3RkZWZpbmllcnRlbiBGdW5rdGlvbmVuIGluIGRlciBhbmdlZ2ViZW5lbgorCURhdGVpIGFiLiBJc3QgZGVyIFRPUyBrZWluIFN0cmluZywgc28gd2lyZCBpbiBkZXIgRGF0ZWkKKwl+Ly5tZW1vcnkubyBnZXNwZWljaGVydC4KKworCUVzIGtvZW5uZW4gbnVyIEZ1bmt0aW9uZW4gYWJnZXNwZWljaGVydCBvZGVyIGdlbGFkZW4gd2VyZGVuIQorCitTSUVIRSBBVUNIOgorCSJmdW5rdGlvbmVuIiwgInJlc3RvcmUiLCAibWVtb3J5IgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kdXAgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2R1cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzAyYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kdXAKQEAgLTAsMCArMSw5IEBACitCRUZFSEw6CisJZHVwCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJTGVnZSBkYXMgT2JqZWt0LCBkYXMgb2JlbiBhdWYgZGVtIFN0YWNrIGxpZWd0LCBub2NoZWlubWFsIGF1ZgorCWRlbiBTdGFjaywgdW0gZXMgZXZlbnR1ZWxsIHNwYWV0ZXIgbm9jaCBlaW5tYWwgd2llZGVyIHp1IHZlcndlbmRlbi4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvZWlubGVpdHVuZyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZWlubGVpdHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE5ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9laW5sZWl0dW5nCkBAIC0wLDAgKzEsMTIxIEBACitXSUNIVElHOgorCSoqKioqKioqKioqKioqKioqKioqKioKKwlEYXMgZXJzdGUgWmVpY2hlbiBtdXNzIGFiIGpldHp0IGVpbiBLb21tYSAoLCkgc2Vpbi4gQmlzaGVyIHdhcgorCWVzIGVpbiBTZW1pa29sb24sIGFiZXIgZGFzIHdlY2hzZWx3aXJrdCBqYSBtaXQgZGVtIGVtb3RlLgorCSoqKioqKioqKioqKioqKioqKioqKioKKworREVSIFRFTExFUlNUQVBFTDoKKworCURlciBUZWxsZXJzdGFwZWwgaXN0IGVpbiBzdGFja29yaWVudGllcnRlcyBNYWdpZXJ0b29sLgorCURhcyBoZWlzc3QsIG1hbiBsZWd0IGRpZSBPYmpla3RlLCBTdHJpbmdzIG9kZXIgd2FzIGF1Y2ggaW1tZXIgYXVmCisJZGVuIFN0YWNrIHVuZCBydWZ0IGFscyBsZXR6dGVzIGRpZSBGdW5rdGlvbiBhdWYsIGRpZSBkYW5uIG1pdAorCWRlbSBTdGFja2lobmhhbHQgaXJnZW5kZXR3YXMgbWFjaHQuIERhcyBFcmdlYm5pcyB3aXJkIG1laXN0ZW5zCisJZGFubiB3aWVkZXIgYXVmIGRlbSBTdGFjayBhYmdlbGVndC4KKwlJbSBncm9zc2VuIHVuZCBnYW56ZW4gZGllc2VzIFRvb2wgdm9uIE1hY2JldGhzIEx1cGUgaW5zcGlyaWVydC4KKworCUltIGZvbGdlbmRlbiB3aXJkIG1pdCBUT1MgKFRvcE9mU3RhY2spIGRhcyBEaW5nIGJlemVpY2huZXQsIGRhcworCWFscyBsZXR6dGVzIGF1ZiBkZW0gU3RhY2sgYWJnZWxlZ3Qgd3VyZGUuCisKK0tPTU1BTkRPUzoKKworCUplZGVzIEtvbW1hbmRvLCBkYXMgbWl0IGRlbiBUZWxsZXJuIGF1c2dlZnVlaHJ0IHdlcmRlbiBzb2xsLAorCXdpcmQgbWl0ICcsJyBlaW5nZWxlaXRldC4gQWxsZXJkaW5ncyBoYXQgZGFzIFNlbWlrb2xvbiBub2NoCisJZWluZSB3ZWl0ZXJlIEZ1bmt0aW9uLCBhYmVyIGRhenUgc3BhZXRlci4KKworRElOR0UgQVVGIERFTiBTVEFDSyBMRUdFTjoKKworCUhpbnRlciBkZW0gU2VtaWtvbG9uIHdlcmRlbiAoYmVsaWViaWcgdmllbGUpIFN0YWNrb3BlcmF0aW9uZW4KKwlhbmdlZ2ViZW4uIERpZSBtZWlzc3RlbiBkaWVzZXIgT3BlcmF0aW9uZW4gbGVnZW4gaXJnZW5kZXR3YXMgYXVmCisJZGVtIFN0YWNrIGFiLiBXaWxsIG1hbiBPYmpla3RlIGF1ZiBkZW0gU3RhY2sgYWJsZWdlbiwgc28gZ2lidAorCW1hbiBlaW5mYWNoIGRlcmVuIEZpbGVuYW1lbiBhbi4gWmFobGVuIGdpYnQgbWFuIGR1cmNoIGVpbiB2b3JhbgorCWdlc3RlbGx0ZXMgRG9wcGVsa3JldXogKCcjJykgYW4uIChQb3NpdGl2ZSBaYWhsZW4gZ2VoZW4gYXVjaCBvaG5lLikKKwl1bmQgU3RyaW5ncyB3ZXJkZW4gaW4gQW5mdWVocnVuZ3N6ZWljaGVuIGVpbmdlZmFzc3QsIGRhbWl0IHNpZSB2b24KKwlkZW4gT2JqZWt0ZW4gdW50ZXJzY2hpZWRlbiB3ZXJkZW4ga29lbm5lbi4gKFVlYnJpZ2VucyBpc3QgZGFzIFplaWNoZW4KKwknXG4nIHVuZCBkYXMgRVNDLVplaWNoZW4gKCdcZScpIGluIFN0cmluZ3MgZXJsYXVidC4pCisKK1NUQUNLT1BFUkFUSU9ORU46CisKKwlTdGFja29wZXJhdGlvbmVuLCBkaWUgZGVuIFN0YWNrIG5pY2h0IGJlZWluZmx1c3Nlbi4KKworCQlzYXkgICAgIC0gTWVsZHVuZ2VuIGFuIE1pdHNwaWVsZXIgZWluLSB1bmQgYXVzc2NoYWx0ZW4uCisJCQkgIFVtc3RlaGVuZGUgc2VoZW4gbm9ybWFsZXJ3ZWlzZSwgd2VubiBtYW4gbWl0IGRlbgorCQkJICBUZWxsZXJuIGFyYmVpdGV0LCBlaW5lIE1lbGR1bmcgZGVyIEFydDoKKwkJCSAgIlNvd2llc28gam9uZ2lsZXJ0IG1pdCBzZWluZW4gVGVsbGVybi4iIGJ6dworCQkJICAiU293aWVzbyBmYWVsbHQgYmVpbSBKb25nbGllcmVuIGVpbiBUZWxsZXIgaGVydW50ZXIuIgorCQluYW1lcyAgIC0gT2JqZWt0ZSBtaXQgb2RlciBvaG5lIE5hbWVuIGJlaSBBdWZsaXN0dW5nZW4KKwkJCSAgYXVzZ2ViZW4uCisJCXN0YWNrICAgLSBHZWJlIFN0YWNraW5oYWx0IGF1cyAoMCBpc3QgZGVyIFRPUykuCisJCW1lbW9yeSAgLSBHZWJlIEluaGFsdCBkZXIgVmFyaWFibGVuIGF1cy4KKwkJdG9wICAgICAtIEdlYmUgZGVuIFRPUyBhdXMuCisJCWludiAgICAgLSBHZWJlIGVpbmUgTGlzdGUgZGVyIE9iamVrdGUgYXVzLAorCQkJICBkaWUgc2ljaCBpbSBUT1MtT2JqZWt0IGJlZmluZGVuLgorCQlzY2FuICAgIC0gR2ViZSByZWxldmFudGUgRGF0ZW4genUgZGVtIFNwaWVsZXIgYXVmIGRlbSBUT1MgYXVzLgorCisJU3RhY2tvcGVyYXRpb25lbiwgZGllIG1pdCBzZWxic3RkZWZpbmllcnRlbiBGdW5rdGlvbmVuIHp1IHR1ZW4KKwloYWJlbjoKKworCQkhCS0gRGVmaW5pZXJlIGVpbmUgbmV1ZSBGdW5rdGlvbi4KKwkJCSAgKEhpbGZlIHVudGVyICJmdW5rdGlvbmVuIi4pCisJCWR1bXAKKwkJcmVzdG9yZSAtIFNwZWljaGVybiB1bmQgTGFkZW4gZGVyIGJlbnV0emVyZGVmaW5pZXJ0ZW4KKwkJCSAgRnVua3Rpb25lbgorCisJU3RhY2tvcGVyYXRpb25lbiwgZGllIGV0d2FzIGF1ZiBkZW0gU3RhY2sgYWJsZWdlbjoKKworCQltZSAgICAgIC0gTGVnZSBkaWNoIHNlbGJzdCBhdWYgZGVuIFN0YWNrLgorCQloZXJlICAgIC0gTGVnZSBkZW4gUmF1bSwgaW4gZGVtIER1IGJpc3QsIGF1ZiBkZW4gU3RhY2suCisKKwlTdGFja29wZXJhdGlvbmVuIHp1IGRlc3NlbiBWZXJ3YWx0dW5nOgorCisJCWR1cCAgICAgLSBMZWdlIGRlbiBUT1Mgbm9jaCBlaW5tYWwgYXVmIGRlbiBTdGFjay4KKwkJcG9wICAgICAtIExvZXNjaGUgZGVuIFRPUyB2b20gU3RhY2suCisJCXN3YXAgICAgLSBWZXJzdGF1Y2hlIGRlbiBUT1MgbWl0IGRlbSBEaW5nIGRhcnVudGVyLgorCQljbGVhciAgIC0gTG9lc2NoZSBkZW4gZ2FuemVuIFN0YWNrLgorCisJRGllIGZvbGdlbmRlbiBGdW5rdGlvbmVuIHBvcHBlbiBpaHJlIFBhcmFtZXRlciB2b20gU3RhY2sgaGVydW50ZXIuCisKKwlGdW5rdGlvbmVuIG1pdCBlaW5lbSBQYXJhbWV0ZXI6CisKKwkJY2xvbmUgICAtIENsb25lIGVpbiBPYmpla3QgbWl0IGRlbiBhbmdlZ2ViZW5lbiBGaWxlbmFtZW4uCisJCSAgICAgICAgICBMZWdlIGRhcyBnZWNsb250ZSBPYmpla3QgYXVmIGRlbiBTdGFjay4KKwkJdXBkYXRlICAtIFplcnN0b2VyZSBkaWUgQmx1ZXByaW50IGRlcyBPYmpla3Rlcy4KKwkJcmVtb3ZlICAtIFplcnN0b2VyZSBkYXMgT2JqZWt0LgorCisJRnVua3Rpb25lbiBtaXQgbWVocmVyZW4gUGFyYW1ldGVybjoKKworCQltb3ZlCS0gQmV3ZWdlIGRhcyB6d2VpdG9iZXJzdGUgRWxlbWVudCBpbiBkYXMgT2JlcnN0ZS4KKwkJaWYgICAgICAtIHN1Y2hlIGFiaGFlbmdpZyB2b20gb2JlcnN0ZW4gRWxlbWVudCBlaW5lcyBkZXIKKwkJCSAgZGFydW50ZXIgbGllZ2VuZGVuIGF1cy4KKworCUZ1bmt0aW9uZW4gbWl0IGJlbGllYmlnIHZpZWxlbiBQYXJhbWV0ZXJuOgorCisJCVVtIHp1IHdpc3Nlbiwgd2lldmllbGUgZGVyIFN0YWNrZWxlbWVudGUgenUgZGVtIEZ1bmt0aW9ucy0KKwkJYXVmcnVmIGdlaG9lcmVuLCBtdXNzIGVpbmUgSW5mb3JtYXRpb24gYXVmIGRlbSBTdGFjaworCQlhYmdlbGVndCB3ZXJkZW4uIERpZXNlcyB3aXJkIG1pdCBlaW5lbSBMb2NrICgnOycpIGdlbWFjaHQuCisJCVVudGVyIGRlbSBTdGljaHB1bmt0ICJsb2NrIiBzaW5kIGF1Y2ggQmVpc3BpZWxlLgorCisJCWFycmF5CS0gRnVlZ2UgYWxsZSBFbGVtZW50ZSB6dSBlaW5lbSBBcnJheSB6dXNhbW1lbi4KKwkJc3BsaXQJLSBaZXJsZWdlIGRhcyBBcnJheSBhdWYgZGVtIFN0YWNrIGluIEVpbnplbHRlaWxlLgorCisJCS0+CS0gUnVmZSBpbiBkZW0gdW50ZXJzdGVuIE9iamVrdCBkaWUgaGludGVyIGRlbQorCQkJICBQZmVpbCBzdGVoZW5kZSBGdW5rdGlvbiBhdWYuIFVlYmVyZ2ViZSBhbGxlCisJCQkgIGRlbSBPYmpla3QgZm9sZ2VuZGVuIEVsZW1lbnRlIGFscyBQYXJhbWV0ZXIuCisJCS0tPgktIERpdG8uIExlZ2UgYWJlciBkYXMgRXJnZWJuaXMgd2llZGVyIGF1ZgorCQkJICBhdWYgZGVtIFN0YWNrIGFiLgorCQkJICAoSGlsZmUgaXN0IHVudGVyIGRlbSBCZWdyaWZmICJjYWxsIiB6dSBmaW5kZW4uKQorCisJCS0qCS0gUnVmZSBkaWUgaGludGVyIGRlbSAtKiBzdGVoZW5kZSBlZnVuIGF1Zi4KKwkJCSAgdWViZXJnaWIgYWxsZSBTdGFja2VsZW1lbnRlIGFscyBQYXJhbWV0ZXIuCisJCS0tKgktIERpdG8gbWl0IEVyZ2VibmlzcnVlY2tnYWJlLgorCQkJICAoSGlsZmUgdW50ZXIgZGVtIEJlZ3JpZmYgImNhbGxlZnVuIi4pCisKKwkJQAktIEZ1ZWhyZSBkZW4gTFBDLUNvZGUgaGludGVyIGRlbSBLbGFtbWVyYWZmZW4gYXVzLgorCQlAQAktIERpdG8gbWl0IFJldHVybndlcnQuCisJCQkgIChIaWxmZSB1bnRlciAiZXZhbHVhdGUiLikKKworCVdpZSBkaWUgQmVmZWhsZSBpbSBlaW56ZWxuZW4gZnVua3Rpb25pZXJlbiwga2FubiBtYW4gZHVyY2gKKwkiO2hpbGZlIDxCZWZlaGw+IiBlcmZhaHJlbi4gVGhlbWEgaXN0IGltIEFsbGdlbWVuZWluZW4gZGVyCisJQmVmZWhsc25hbWUuIEJlaSBBdXNuYWhtZW4gYml0dGUgb2JlbiBuYWNobGVzZW4uIDstKQorCisJVmllbCBTcGFzcyBkYW1pdAorCQlSdW1hdGEsIGRpZSBHb2V0dGluIGRlciBNb3JnZW5yb2V0ZS4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvZXZhbHVhdGUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2V2YWx1YXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjZlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2V2YWx1YXRlCkBAIC0wLDAgKzEsMjIgQEAKK0JFRkVITDoKKwlldmFsdWF0ZSwgZXZhbAorCQorQVJHVU1FTlRFOgorCVRPUyAtIE5hbWUgZWluZXIgRnVua3Rpb24gYWxzIFN0cmluZy4KKwkKK0ZVTktUSU9OOgorCURlciBOYW1lIHdpcmQgdm9uIFN0YWNrIGdlbm9tbWVuLgorCURlciB1bnRlciBOYW1lbiBnZXNwZWljaGVydGUgV2VydCB3aXJkIGF1c2dld2VydGV0LiBGdWVyIG5vcm1hbGUKKwlXZXJ0ZSBiZWRldXRldCBkYXMsIGRhc3Mgc2llIGF1ZiBkZW4gU3RhY2sgZ2VsZWd0IHdlcmRlbi4gRnVua3Rpb25lbgorCXdlcmRlbiBhdXNnZXdlcnRldC4KKwkKK0JFSVNQSUVMOgorCSwhUSAhMSBwbCAhMCAtPlF1ZXJ5UHJvcAorCSxydW1hdGEgdGl0bGUgUQorCQlsaWVmZXJ0IGRpcmVrdCBkZW4gVGl0ZWwuCisJLHJ1bWF0YSB0aXRsZSAiUSIgZXZhbAorCQl0dXQgZGFzIHNlbGJlLCBudXIgZGFzICJRIiBhbHMgU3RyaW5nCisJCXp3aXNjaGVuZHVyY2ggYXVmIGRlbSBTdGFjayBsaWVndC4KKworU0lFSEUgQVVDSDoKKwkiZnVua3Rpb25lbiIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvZnVua3Rpb25lbiBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZnVua3Rpb25lbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU3ZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9mdW5rdGlvbmVuCkBAIC0wLDAgKzEsMjUgQEAKK0JFRkVITDoKKwkhZnVua3Rpb25zbmFtZSB0ZXh0CisJCitBUkdVTUVOVEU6CisJdGV4dCAtLSBkZXIgKmdhbnplKiBSZXN0IGRlciBaZWlsZQorCQorRlVOS1RJT046CisJRXJ6ZXVnZSBhdXMgdGV4dCBlaW5lIG5ldWUgRnVua3Rpb24gbWl0IGRlbSBhbmdlZ2ViZW5lbiBOYW1lbi4gRGllc2VyCisJTmFtZSBpc3QgYWxzIG5ldWVyIEJlZmVobCBpbm5lcmhhbGIgZGVyIFRlbGxlciBiZW51dHpiYXIgd2llIGRpZQorCWVpbmdlYmF1dGVuIEJlZmVobGUuCisJV2lyZCBlaW4gQmVmZWhsIGF1c2dlZnVlaHJ0LCBiZWtvbW10IGVyIGF1ZiBlaW5lbSBuZXVlbiBTdGFjayBzZWluZQorCVBhcmFtZXRlciB1ZWJlcmdlYmVuLiBXYXMgYW0gRW5kZSBkZXMgRnVua3Rpb25zYXVmcnVmZXMgYXVmIGRlbQorCVN0YWNrIGxlZ3QsIHdpcmQgZGFubiBhdWYgZGVuIHVyc3BydWVuZ2xpY2hlbiBhYmdlbGVndC4KKworQkVJU1BJRUw6CisJLCFRdWVyeSAhMSBwbCAhMCAtLT5RdWVyeVByb3AKKwlEZWZpbmllcmUgZGllIEZ1bmt0aW9uICJRdWVyeSIsIHNpZSBoYXQgendlaSBQYXJhbWV0ZXIgKCEwIHVuZCAhMSksCisJd29iZWkgITAgZGVyIFRPUyBpc3QuCisJLHJ1bWF0YSB0aXRsZSBRdWVyeQorCQlMaWVmZXJ0IGRhbm4gZGVuIFRpdGVsIHZvbiBSdW1hdGEgYXVmIGRlbSBTdGFjayB6dXJ1ZWNrLCBkYQorCQlhbSBFbmRlIGRlciBBdXN3ZXJ0dW5nIGRpZXNlciBhdWYgZGVtIFN0YWNrIGxpZWdlbiB3dWVyZGUuCisJLCFEZW1vICExIHN0aworCSwxIDIgMyA0IERlbW8KKwkJWmVpZ3QgZWluZW4gU3RhY2sgYXVmIGRlbSBkYXMgendlaXRvYmVyc3RlIEVsZW1lbnQgdm9uIGRlbQorCQl1cnNwcnVuZ3NzdGFjayBsaWVndDsgaW4gZGllc2VtIEZhbGwgYWxzbyAzLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9nZW5lcmFsIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9nZW5lcmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNmQ3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2dlbmVyYWwKQEAgLTAsMCArMSwxNyBAQAorRGFzIHNpbmQgZGllIEJlZmVobGUsIGRpZSBkaWUgbWFnaXNjaGVuIFRlbGxlciB6dXIgWmVpdCBiZWhlcnJzY2hlbjoKKyhMZXR6dGUgQWVuZGVydW5nIGFtIDIwLjAxLjE5OTUgYW4gZGVuIG1pdCAlIG1hcmtpZXJ0ZW4gRnVua3Rpb25lbiwKK2RpZSBtaXQgKiBzaW5kIG5ldSEgQUIgSkVUWlQgR0lCVCBFUyBBVUNIIEZVTktUSU9ORU4hICkKKworYXJyYXkgICAgICAgZGVzdHJ1Y3QgICAgaGVyZSAgICAgICAgbWVtb3J5JSAgICAgcmVraW52ICAgICAgc3BsaXQKK2NhbGwgICAgICAgIGR1bXAqICAgICAgIGlmKiAgICAgICAgIG1lc3NhZ2UgICAgIHJlbW92ZSAgICAgIHN0YWNrCitjYWxsZWZ1biAgICBkdXAgICAgICAgICBpbnYgICAgICAgICBtb3ZlICAgICAgICByZXN0b3JlKiAgICBzd2FwCitjYWxsb3V0cyAgICBlaW5sZWl0dW5nICBsaXZpbmcgICAgICBuYW1lcyAgICAgICBydXBkYXRlICAgICB0b2RvCitjbGVhbm9mICAgICBldmFsdWF0ZSogICBsb2NrICAgICAgICBvYmplY3QgICAgICBzYXkgICAgICAgICB0b3AKK2NsZWFyICAgICAgIEZVTktUSU9ORU4qIGxwYyAgICAgICAgIHBsYXllciAgICAgIHNjYW4gICAgICAgIHVwZGF0ZQorY2xvbmUgICAgICAgZ2VuZXJhbCAgICAgbWUgICAgICAgICAgcG9wICAgICAgICAgc25vb3AgICAgICAgdmFycworCitNaXQgIixoaWxmZSA8QmVmZWhsPiIga2FubnN0IER1IEluZm9ybWF0aW9uZW4genUgZGVuIEJlZmVobGVuIGFiZnJhZ2VuLgorV2VubiBEdSBnYXJuaXggdmVyc3RlaHN0LCBkYW5uIHZlcnN1Y2hlIG1hbCAiLGhpbGZlIGVpbmxlaXR1bmciLiA6LSkKKworV0lDSFRJRzogRGFzIFNlbWlrb2xvbiB3aXJkIG5pY2h0IG1laHIgdW50ZXJzdHVldHp0LCBzdGF0dGRlc3NlbgorCWthbm4gbnVyIG5vY2ggZGFzIEtvbW1hIGJlbnV0enQgd2VyZGVuLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9oZXJlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9oZXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZWJkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2hlcmUKQEAgLTAsMCArMSw4IEBACitCRUZFSEw6CisJaGVyZQorCitBUkdVTUVOVEU6CisJS2VpbnMKKworRlVOS1RJT046CisJTGVnZSBkZW4gUmF1bSwgaW4gbWFuIHNpY2ggYmVmaW5kZXQgb2JlbiBhdWYgZGVuIFN0YWNrLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9pZiBiL29iai90b29scy90ZWxsZXIvaGlsZmUvaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5NDcxNwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvaWYKQEAgLTAsMCArMSwyMiBAQAorQkVGRUhMOgorCWlmCisJCitBUkdVTUVOVEU6CisJd2VubiBzb25zdCBiZWRpbmd1bmcoVE9TKQorCQorRlVOS1RJT046CisJV2VubiBkZXIgVE9TIE51bGwgaXN0LCBsaWVmZXJlIGRhcyBkcml0dG9iZXJzdGUgRWxlbWVudCB2b20gU3RhY2ssCisJc29uc3QgZGFzIHp3ZWl0b2JlcnN0ZS4gRGllc2VyIEJlZmVobCBpc3QgaW5zYmVzb25kZXJlIGltIFp1c2FtbWVuLQorCWhhbmcgbWl0ICJldmFsdWF0ZSIgaW50ZXJlc3NhbnQuCisJCitCRUlTUElFTDoKKwksImJsYSIgImJsdWJiIiAwIGlmCisJCUxpZWZlcnQgImJsdWJiIgorCSwiYmxhIiAiYmx1aWJiIiAxIGlmCisJCUxpZWZlcnQgImJsYSIKKwksIlEiICJSIiB0ZXN0IGlmIGV2YWx1YXRlCisJCVdlcnRlIFEgYXVzLCB3ZW5uIGRlciBXZXJ0ICJ0ZXN0IiBuaWNodCBudWxsIGlzdC4KKwkJQW5kZXJlbmZhbGxzIHdlcnRlIFIgYXVzLgorCitTSUVIRSBBVUNIOgorCSJldmFsdWF0ZSIsICJmdW5rdGlvbmVuIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9pbnYgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2ludgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQzODAwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9pbnYKQEAgLTAsMCArMSwxNyBAQAorQkVGRUhMOgorCWludgorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCUdlYmUgYWxsZSBPYmpla3RlIGFuLCBkaWUgc2ljaCBpbiBkZW0gT2JqZWt0IFRPUyBiZWZpbmRlbi4KKwlHaWIgZWluZW4gRmVobGVyIGF1cywgd2VubiBUT1Mga2VpbiBPYmpla3QgaXN0LgorCVRPUyBibGVpYnQgYXVmIGRlbSBTdGFjaywgZGEgZGllc2VyIEJlZmVobCBtZWlzdGVucyBkYXp1IGJlbnV0enQKKwl3aXJkLCBlaW4gT2JqZWt0IGF1ZiBkZW4gU3RhY2sgenUgbGVnZW4gdW5kIGRhbm4gYmVzdGltbXRlCisJT2JqZWt0ZSBpbiBpaG0genUgc3VjaGVuLCB1bmQgZGFubiBkaWVzZSB6dSBob2xlbi4KKworQkVJU1BJRUxFOgorCSxtZSBpbnYKKwlEYW5uIHNpZWh0IG1hbiAuLi4uICIuMiAvYmxhL2JsYS9ibGEvb2JqZWt0IiB1bmQgbWFuIGthbm4gZGFubgorCW1pdHRlbHMgLC4yIGRpZXNlcyBPYmpla3QgaG9sZW4uCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xpdmluZyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbGl2aW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjA2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xpdmluZwpAQCAtMCwwICsxLDE3IEBACitCRUZFSEw6CisJbGl2aW5nLCBsdgorCitBUkdVTUVOVEU6CisJVE9TIC0tIE5hbWUgZWluZXMgTW9uc3RlcnMKKworRlVOS1RJT046CisJSG9sZSBlaW5lbiBOYW1lbiB2b20gU3RhY2sgdW5kIGxlZ2Ugc3RhdHRkZXNzZW4gZGFzIGVudHNwcmVjaGVuZGUKKwlNb25zdGVyb2JqZWt0IGF1ZiBkZW4gU3RhY2suIEdlYmUgZWluZSBGZWhsZXJtZWxkdW5nIGF1cywgd2VubiBrZWluCisJZGVyYXJ0aWdlcyBNb25zdGVyIHZvcmhhbmRlbiBpc3QuCisKK0JFSVNQSUVMRToKKwksIm9yayIgbGl2aW5nCisJU3VjaHQgZGVuIGVyc3RiZXN0ZW4gT3JrLgorCitTSUVIRSBBVUNIOgorCSJvYmplY3QiLCAicGxheWVyIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9sb2NrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9sb2NrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NzBkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xvY2sKQEAgLTAsMCArMSwyNiBAQAorQkVGRUhMOgorCSwKKworQVJHVU1FTlRFOgorCUtlaW5lCisKK0ZVTktUSU9OOgorCUxlZ2UgZWluZW4gJ0xvY2snIGF1ZiBkZW0gU3RhY2sgYWIuIEFuaGFuZCBlaW5lcyBMb2NrcyBlcmtlbm5lbgorCUZ1bmt0aW9uZW4sIGRpZSBlaW5lIHZhcmliYWxlIEFuemFobCB2b24gQXJndW1lbnRlbiB2b20gU3RhY2sKKwluZWhtZW4ga29lbm5lbiwgd2lldmllbGUgZGVyIEFyZ3VtZW50ZSBmdWVyIHNpZSBiZXN0aW1tdCBzaW5kLgorCisJV2ljaHRpZzogRGFzIEtvbW1hIGFtIEFuZmFnIGplZGVyIEVpbmdhYmV6ZWlsZSBpc3QgS0VJTiBMb2NrLgorCitCRUlTUElFTEU6CisJLG1lLCAxIDIgMyBhcnJheQorCQlFcyB3ZXJkZW4gbnVyIGRpZSBaYWhsZW4gMSAyIHVuZCAzIGluIGRhcyBBcnJheSBhdWZnZW5vbW1lbiwKKwkJbmljaHQgZGVyIFNwaWVsZXIgc2VsYnN0LiBBdWYgZGVtIFN0YWNrIGxpZWdlbiBuYWNoZXIgZGVyCisJCVNwaWVsZXIgdW5kIGRhcyBBcnJheS4KKwksaGVyZSwgbWUgInJ1bWF0YSIgLT5pZAorCQkiaWQiIHdpcmQgaW0gU3BpZWxlciBtaXQgZWluZW0gQXJndW1lbnQgKCJydW1hdGEiKSBhdWZnZXJ1ZmVuLgorCSxoZXJlIG1lICJydW1hdGEiIC0+aWQJCisJCUhpZXIgd2lyZCBkaWUgRnVua3Rpb24gaW0gUmF1bSBtaXQgendlaSBBcmd1bWVudGVuIGF1ZmdlcnVmZW4sCisJCXdhcyBoaWVyIG5hdHVlcmxpY2gga2VpbmVuIFNpbm4gbWFjaHQuCisKK1NJRUhFIEFVQ0g6CisJImFycmF5IiwgInNwbGl0IiwgImNhbGwiLCAiY2FsbGVmdW4iLCAiZXZhbHVhdGUiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xwYyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbHBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTBlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xwYwpAQCAtMCwwICsxLDIxIEBACitCRUZFSEw6CisJQCB0ZXh0CisJQEAgdGV4dAorCQorQVJHVU1FTlRFOgorCXRleHQgLS0gZGVyIGdhbnplKCEpIFJlc3QgZGVyIEVpbmdhYmV6ZWlsZS4KKwlEZXIgU3RhY2sgYmlzIHp1bSBsZXR6dGVuIExvY2suCisJCitGVU5LVElPTjoKKwlGdWVocmUgZGVuIExQQy1Db2RlIDx0ZXh0PiBkaXJla3QgYXVzLiBEYWJlaSBrb2VubmVuIGRpZSBBcmd1bWVudGUKKwl2b20gU3RhY2sgbWl0IEA8bnVtbWVyPkAgZWluZ2VzZXR6dCB3ZXJkZW4uIFdpY2h0aWcsIHdlbm4gbWFuIGVpbgorCUVyZ2VibmlzIHdlaXRlcmJlcmVjaG5lbiB3aWxsLCBtdXNzIG1hbiBhdWNoIGVpbiAncmV0dXJuJyB1bQorCUxQQy1Db2RlIGJlbnV0enQgaGFiZW4uCisKKwlCZWkgZGVyIEF1c2Z1ZWhydW5nIHdlcmRlbiBuaWNodCBhbGxlIEluY2x1ZGUtRGF0ZWllbiBlaW5nZWxhZGVuLgorCQorQkVJU1BJRUw6CisJLG1lIEAgd3JpdGUoIEAwQC0+bmFtZShXRVIpKyJcbiIgKQorCUdpYnQgRGVpbmVuIE5hbWVuIGF1cy4KKwksbWUgQEAgcmV0dXJuIEAwQC0+bmFtZShXRVIpCisJR2lidCBkZW4gTmFtZW4genVydWVjayB1bmQgbGVndCBpaG4gYXVmIGRlbiBTdGFjay4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbWUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjFmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lCkBAIC0wLDAgKzEsOCBAQAorQkVGRUhMOgorCW1lCisKK0FSR1VNRU5URToKKwlLZWluZQorCitGVU5LVElPTjoKKwlMZWdlIGRlbiBFaWdlbnR1ZW1lciAoRGljaCEpIG9iZW4gYXVmIGRlbiBTdGFjay4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbWVtb3J5IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZW1vcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxMjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbWVtb3J5CkBAIC0wLDAgKzEsMTUgQEAKK0JFRkVITDoKKwltZW1vcnksIG1lbQorCitBUkdVTUVOVEU6CisJS2VpbmUKKworRlVOS1RJT046CisJWmVpZ2UgZGVuIEluaGFsdCBhbGxlciBWYXJpYWJsZW4gYW4sIGRpZSBtYW4gYW5nZWxlZ3QgaGF0LgorCU5vcm1hbGVyd2Vpc2Ugd2lyZCBkZXIgSW5oYWx0IGluIGRlciBGb3JtIE5hbWUgPSBJbmhhbHQgYW5nZXplaWd0LgorCUlzdCB1bnRlciBkZW0gTmFtZW4gZWluZSBGdW5rdGlvbiBnZXNwZWljaGVydCwgd2lyZAorCQlOYW1lID4gSW5oYWx0CisJYW5nZXplaWd0LCB1bSBGdW5rdGlvbmVuIHZvbiBTdHJpbmdzIHVudGVyc2NoZWlkZW4genUga29lbm5lbi4KKworU0lFSEUgQVVDSDoKKwkidmFycyIsICJmdW5rdGlvbmVuIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZXNzYWdlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmQ5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lc3NhZ2UKQEAgLTAsMCArMSwxMyBAQAorS09NTUFORE86CisJbWVzc2FnZSBbdG8gPHNwaWVsZXI+XQorCW1zZyBbdG8gPHNwaWVsZXI+XQorCitGVU5LVElPTjoKKwlXZW5uIG1hbiBnYW56ZSBUZXh0YmxvZWNrZSBzYWdlbiBtb2VjaHRlLCBrYW5uIG1hbiBkYXMgbWl0IGRpZXNlbQorCUJlZmVobCB0dW4uIE5hY2ggRWluZ2FiZSB2b24gJ21lc3NhZ2UnIHdpcmQgamVkZSBFaW5nYWJlIGRpcmVrdCBmdWVyCisJYWxsZSBpbSBSYXVtIHNpY2h0YmFyIG9kZXIgZnVlciBkZW4gYW5nZWdlYmVuZW4gU3BpZWxlciBhdXNnZWdlYmVuLgorCU1pdCAnKionIGthbm4gbWFuIHdpZWRlciBhdWYgbm9ybWFsZSBFaW5nYWJlIHp1cnVlY2tzY2hhbHRlbi4KKworQUNIVFVORzoKKwlEaWVzZXIgQmVmZWhsIGdlaG9lcnQgbmljaHQgenUgZGVuZW4sIGRpZSBtaXR0ZWxzICcsJyBlaW5nZWxlaXRldAorCXdlcmRlbi4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbW92ZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbW92ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTgxYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tb3ZlCkBAIC0wLDAgKzEsMTQgQEAKK0JFRkVITDoKKwltb3ZlLCBtdgorCitBUkdVTUVOVEU6CisJb2JqIC0tIE9iamVrdCwgZGFzIGJld2VndCB3ZXJkZW4gc29sbC4KKwl6aWVsKFRPUykgLS0gUmF1bSwgaW4gZGVuIGRhcyBPYmpla3Qgc29sbAorCitGVU5LVElPTjoKKwlCZXdlZ2UgZGFzIE9iamVrdCBpbiBkZW4gYW5nZWdlYmVuZW4gUmF1bS4gRGllIG1laXN0ZW4gU2ljaGVydW5nZW4KKwl3ZXJkZW4gYmVpIGRpZXNlbSBWZXJzY2hpdWViZW4gdW1nYW5nZW4sIGFsc28gdm9yc2ljaHQhCisKK0JFSVNQSUVMRToKKwksbWUgIn4vd29ya3Jvb20iIG9iIG12CisJCU1hbiBnZWh0IGluIGRlbiBlaWdlbmVuIFdvcmtyb29tLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9uYW1lcyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbmFtZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYmMzYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbmFtZXMKQEAgLTAsMCArMSwxNyBAQAorQkVGRUhMOgorCW5hbWVzLCBuYW0KKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0ZVTktUSU9OOgorCU5vcm1hbGVyd2Vpc2Ugd2VyZGVuIGRlciBGaWxlbmFtZSB1bmQgZGVyIE5hbWUgKFF1ZXJ5UHJvcChQX05BTUUpKQorCWFuZ2V6ZWlndCwgd2VubiBtYW4gZGVuIFN0YWNrIG9kZXIgYWVobmxpY2hlcyBiZXRyYWNodGV0LgorCU1pdCBkaWVzZW0gQmVmZWhsIHNjaGFsdGV0IG1hbiBkZW4gTmFtZW4gYXVzIG9kZXIgYW4uCisKKwlEdXJjaCBBbnNjaGF1ZW4gZGVyIFRlbGxlciBrYW5uIG1hbiBmZXN0c3RlbGxlbiwgb2IgZGllIE5hbWVuIG9kZXIKKwludXIgZGllIEZpbGVuYW1lbiBhbmdlemVpZ3Qgd2VyZGVuLgorCitTSUVIRSBBVUNIOgorCSJpbnYiLCAic3RhY2siLCAibW92ZSIsICJ0b3AiLCAuLi4KKwlBbmRlcmUgU2NoYWx0ZXI6ICJzYXkiLCAiaW5mb3JtIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9vYmplY3QgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL29iamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDViMzBhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9vYmplY3QKQEAgLTAsMCArMSwyMiBAQAorQkVGRUhMOgorCW9iamVjdCwgb2IKKworQVJHVU1FTlRFOgorCVRPUyAtLSBOYW1lIGVpbmVzIE9iamVrdGVzCisKK0ZVTktUSU9OOgorCUhvbGUgZWluZW4gTmFtZW4gdm9tIFN0YWNrIHVuZCBsZWdlIHN0YXR0ZGVzc2VuIGRhcyBlbnRzcHJlY2hlbmRlCisJT2JqZWt0IGF1ZiBkZW4gU3RhY2suIEZhbGxzIGVzIGtlaW4gZ2VsYWRlbmVzIE9iamVrdCBkaWVzZXMgTmFtZW5zLAorCXdvaGwgYWJlciBlaW5lIChuaWNodCBnZWxhZGVuZSkgQmx1ZXByaW50LCBzbyB3aXJkIGRpZXNlIGdlbGFkZW4KKworQkVJU1BJRUxFOgorCSwicGxheWVycy9ydW1hdGEvd29ya3Jvb20iIG9iCisJTWFjaHQgZGFzIHNlbGJlIHdpZSAnLC9wbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbScsIGRhIGRpZSBUZWxsZXIKKwlGaWxlbmFtZW4gYXV0b21hdGlzY2ggenUgZXJrZW5uZW4gdmVyc3VjaGVuLgorCSwifnJ1bWF0YS93b3Jrcm9vbSIgb2IKKwlnZWh0IGF1Y2guCisJLCJ+L3dvcmtyb29tIiBvYgorCWxpZWZlcnQgZGVuIGVpZ2VuZW4gV29ya3Jvb20uCisKK1NJRUhFIEFVQ0g6CisJImxpdmluZyIsICJwbGF5ZXIiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3BsYXllciBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcGxheWVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2FhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3BsYXllcgpAQCAtMCwwICsxLDIxIEBACitCRUZFSEw6CisJcGxheWVyLCBwbAorCitBUkdVTUVOVEU6CisJVE9TIC0tIE5hbWUgZWluZXMgU3BpZWxlcnMKKworRlVOS1RJT046CisJSG9sZSBlaW5lbiBOYW1lbiB2b20gU3RhY2sgdW5kIGxlZ2Ugc3RhdHRkZXNzZW4gZGFzIGVudHNwcmVjaGVuZGUKKwlTcGllbGVyb2JqZWt0IGF1ZiBkZW4gU3RhY2suCisKKwlBbSBFbmRlIGRlcyBTcGllbGVybmFtZW5zIGlzdCBlaW4gU3Rlcm4gKCcqJykgYWxzIFdpbGRjYXJkIGVybGF1YnQuCisJRGllIE5hbWVuIG5pY2h0IGVpbmdlbG9nZ3RlciBTcGllbGVyIG11ZXNzZW4gaW4gamVkZW0gRmFsbCBhdXNnZS0KKwlzY2hyaWViZW4gd2VyZGVuLgorCisKK0JFSVNQSUVMRToKKwksInJ1bWF0YSIgcGwKKwlMZWd0IFJ1bWF0YSBhdWYgZGVuIFN0YWNrLgorCitTSUVIRSBBVUNIOgorCSJsaXZpbmciLCAib2JqZWN0IgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9wb3AgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3BvcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzBkYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9wb3AKQEAgLTAsMCArMSw4IEBACitCRUZFSEw6CisJcG9wCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJTmltbSBkYXMgb2JlcnN0ZSBFbGVtZW50IHZvbSBTdGFjay4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVraW52IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZWtpbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MWJkMgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVraW52CkBAIC0wLDAgKzEsMTIgQEAKK0JFRkVITDoKKwlyZWtpbnYKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlEaWVzZXIgQmVmZWhsIG1hY2ggZGFzIHNlbGJlIHdpZSAiaW52IiwgemVpZ3QgYWJlciByZWt1cnNpdgorCWF1Y2ggZGVuIEluaGFsdCBkZXIgZW50aGFsdGVuZW4gT2JqZWt0ZSBhbi4KKworU0lFSEUgQVVDSDoKKwkiaW52IgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZW1vdmUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3JlbW92ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmYyNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZW1vdmUKQEAgLTAsMCArMSwxNiBAQAorQkVGRUhMOgorCXJlbW92ZSwgcmVtCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJWmVyc3RvZXJlIGRhcyBPYmpla3QgYXVmIGRlbSBUT1MuIEdpYiBkZW0gT2JqZWt0IGRpZSBHZWxlZ2VuaGVpdCwKKwlBdWZyYWV1bWFyYmVpdGVuIGR1cmNoenVmdWVocmVuLgorCitCRUlTUElFTEU6CisJLG1lIHJlbW92ZQorCU1hbiBsb2dndCBzaWNoIHNlbGJlciBhdXMuCisKK1NJRUhFIEFVQ0g6CisJImRlc3RydWN0IgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZXN0b3JlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZXN0b3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjBhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Jlc3RvcmUKQEAgLTAsMCArMSwxNSBAQAorQkVGRUhMOgorCXJlc3RvcmUKKwkKK0FSR1VNRU5URToKKwlrZWlucyBvZGVyCisJVE9TIC0tIGZpbGVuYW1lCisJCitGVU5LVElPTjoKKwlMYWRlIGRpZSBpbiBkZXIgRGF0ZWkgZ2VzcGVpY2hlcnRlbiBGdW5rdGlvbmVuLiBXaXJkIGtlaW4gRmlsZW5hbWUKKwlhbmdlZ2ViZW4sIHNvIHdpcmQgZGllIERhdGVpIH4vLm1lbW9yeS5vIGF1c2dlbGVzZW4uCisKKwlFcyBrb2VubmVuIG51ciBGdW5rdGlvbmVuIGFiZ2VzcGVpY2hlcnQgb2RlciBnZWxhZGVuIHdlcmRlbiEKKworU0lFSEUgQVVDSDoKKwkiZnVua3Rpb25lbiIsICJkdW1wIiwgIm1lbW9yeSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvcnVwZGF0ZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcnVwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWYwMzNlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9ydXBkYXRlCkBAIC0wLDAgKzEsMjUgQEAKK0JFRkVITDoKKwlyb29tdXBkYXRlLCBydXBkYXRlLCBydXBkLCBydXAKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlaZXJzdG9lcmUgZGVuIFJhdW0gdW5kIGxhZGUgaWhuIG5ldSwgZGFtaXQgQWVuZGVydW5nZW4gZGVyIEZpbGVzCisJYWt0aXYgd2VyZGVuIGtvZW5uZW4uIFNvcmdlIGRhZnVlciwgZGFzcyBkaWUgT2JqZWt0ZSBpbiBkZW0gYWx0ZW4gUmF1bQorCWluIGRlbiBuZXVlbiBoaW51ZWJlcmdlcmV0dGV0IHdlcmRlbi4gKERpZXNlIEVpZ2Vuc2NoYWZ0IGthbm4gbWl0dGVscworCWRlcyBTdGVybmNoZW5zICgnKicpIGFiZ2VzY2hhbHRldCB3ZXJkZW4uKQorCQorCUdlYmUgZGVtIFJhdW0gamVkb2NoIEdlbGVnZW5oZWl0LCBBdWZyYWV1bWFyYmVpdGVuIHp1IHRhZXRpZ2VuLiBTb2xsCisJZGVyIFJhdW0gd2lya2xpY2ggaGFydCB6ZXJzdG9lcnQgd2VyZGVuLCBzbyBpc3QgZWluIFJ1ZnplaWNoZW4gYW4gZGVuCisJQmVmZWhsIGFuenVoYWVuZ2VuLiAoYWxzbyBgcnVwZGF0ZSEnLCBlaW4gU3Rlcm4gbXVzcyB2b3IgZGVtIFJ1ZnplaWNoZW4KKwlzdGVoZW4sIGFsc28gYHJ1cGRhdGUqIScgdW5kIG5pY2h0IGBydXBkYXRlISonLikKKwlXaWNodGlnOiBSYWV1bWUsIGRpZSBrZWluZSBCbHVlcHJpbnQgc2luZCwga29lbm5lbiBuaWNodCBtaXQgZGllc2VtCisJQmVmZWhsIGFrdHVhbGlzaWVydCB3ZXJkZW4uCisKK0JFSVNQSUVMRToKKwksaGVyZSBydXBkYXRlCisJQWt0dWFsaXNpZXJ0IGRlbiBSYXVtLCBpbiBkZW0gZGVyIE1hZ2llciBzaWNoIGJlZmluZGV0LgorCitTSUVIRSBBVUNIOgorCSJ1cGRhdGUiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NheSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc2F5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMjMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NheQpAQCAtMCwwICsxLDE3IEBACitCRUZFSEw6CisJc2F5CisKK0FSR1VNRU5URToKKwlrZWluZQorCitGVU5LVElPTjoKKwlTY2hhbHRlIGRpZSBNZWxkdW5nLCBkaWUgYW5kZXJlIFNwaWVsZXIgYmVrb21tZW4sIHdlbm4gbWFuCisJbWl0IGRlbiBUZWxsZXJuIGFyYmVpdGV0LCBhdXMgb2RlciBhbi4KKworCUlzdCBtYW4gdW5zaWNodGJhciwgZ2lidCBlcyBpbiBrZWluZW0gRmFsbCBlaW5lIE1lbGR1bmcuCisKKwlEdXJjaCBBbnNjaGF1ZW4gZGVyIFRlbGxlciBrYW5uIG1hbiBmZXN0c3RlbGxlbiwgb2IgTWlzcGllbGVyCisJZGllIE1lbGR1bmdlbiBiZWtvbW1lbi4KKworU0lFSEUgQVVDSDoKKwkibmFtZXMiLCAiaW5mb3JtIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zY2FuIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zY2FuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjUxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NjYW4KQEAgLTAsMCArMSwxNyBAQAorQkVGRUhMOgorCXNjYW4KKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlXZW5uIGRlciBUT1MgZWluIFNwaWVsZXIgb2RlciBlaW4gTW9uc3RlciBpc3QsIHNvIGdpYiBkaWUKKwlzcGllbHJlbGV2YW50ZW4gSW5mb3JtYXRpb25lbiB6dSBpaG0gYXVzLiBXZW5uIGRlciBUT1MgZWluCisJU3RyaW5nIGlzdCwgc28gd2lyZCBkZXIgU3BpZWxlciBtaXQgZGllc2VtIE5hbWVuIGdlc3VjaHQuCisKK0JFSVNQSUVMRToKKwksbWUgc2NhbgorCSwiam9mIiBwbCBzY2FuIChvZGVyIGt1ZXJ6ZXI6IDsiam9mIiBzY2FuKQorCitTSUVIRSBBVUNIOgorCSJwbGF5ZXIiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Nub29wIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zbm9vcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUxMzAwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zbm9vcApAQCAtMCwwICsxLDExIEBACitCRUZFSExFOgorCXNub29wCisKK0FSR1VNRU5URToKKwlrZWluZQorCitGVU5LVElPTjoKKwlaZWlnZSBsYXVmZW5kZSBTbm9vcHZvcmdhZW5nZSBhbi4KKworCVdlbm4gZGVyIFNub29wZXIgZWluZW4gaG9laGVyZW4gTWFnaWVybGV2ZWwgYWxzIG1hbiBzZWxic3QgaGF0LAorCXdpcmQgZGVyIFNub29wIG5pY2h0IGFuZ2V6ZWlndC4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvc3BsaXQgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NwbGl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTAyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NwbGl0CkBAIC0wLDAgKzEsMTQgQEAKK0JFRkVITDoKKwlzcGxpdCwgc3BsCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJWmVybGVnZSBkZW4gQXJyYXksIGRlciBhdWYgZGVtIFN0YWNrIGxpZWd0IHVuZCBsZWdlIGRpZQorCWVpbnplbG5lbiBFbGVtZW50ZSAoZGFzIEVsZW1lbnQgbWl0IEluZGV4IDAgenV1bnRlcnN0KQorCWF1ZiBkZW0gU3RhY2sgYWIuIFdlbm4gZGVyIFN0YWNrIHZvcmhlciBuaWNodCBsZWVyIHdhciwKKwlsZWdlIHZvcmhlciBlaW4gTG9jayBhdWYgZGVuIFN0YWNrLgorCitTSUVIRSBBVUNIOgorCSJhcnJheSIsICJsb2NrIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zdGFjayBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc3RhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmMTgyZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc3RhY2sKQEAgLTAsMCArMSwxOCBAQAorQkVGRUhMOgorCXN0YWNrLCBzdGsKKwkKK0FSR1VNRU5URToKKwlTVEFDSworCQorRlVOS1RJT046CisJWmVpZ2UgYWxsZSBEaW5nZSBhbiwgZGllIGF1ZiBkZW0gU3RhY2sgbGllZ2VuLgorCQorQkVJU1BJRUw6CisJLG1lIGhlcmU7IDEgMiBhcnJheSBzdGsKKwlFcmdpYnQgKHp1bSBCZWlzcGllbCk6CisJMDogKHsKKwkgICAgIDEKKwkgICAgIDIKKwkgICB9KQorCTE6IC9yb29tL2dpbGRlIChlaW4gUmF1bSkKKwkyOiAvc3RkL3NoZWxscy9tYWdpZXIjNzY5MSAoQXRhbXVyKQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zd2FwIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zd2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmFmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3N3YXAKQEAgLTAsMCArMSw4IEBACitCRUZFSEw6CisJc3dhcAorCitBUkdVTUVOVEU6CisJRGllIG9iZXJzdGVuIDIgU3RhY2tlbGVtZW50ZS4KKworRlVOS1RJT046CisJVmVydGF1c2NoZSBkaWUgYmVpZGVuIG9iZXJzdGVuIEVsZW1lbnRlIHZvbSBTdGFjay4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvdG9kbyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdG9kbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjJjZWZiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS90b2RvCkBAIC0wLDAgKzEsMTQgQEAKK1dhcyBub2NoIGtvbW1lbiBzb2xsOgorCisJRG9rdSB2ZXJiZXNzZXJuLCBkYSBlaW5lIFN0YWNrbWFjaGluZSBuaWNodCBqZWRlcm1hbm5zIFNhY2hlIGlzdC4KKwkoc2Nob24gIixoaWxmZSBlaW5sZWl0dW5nIiBnZW1hY2h0PykKKworCUFsbGVzLCB3YXMgbmljaHQgcGxheWVyIGlzdCwgYXVzIGRlbSBSYXVtIGhlcmF1c3JhZXVtZW4uCisJPGNsZWFudXA+ID8KKworV2FzIE5JQ0hUIGtvbW1lbiBzb2xsOgorCisJQWxhcm0sIHdlbm4gbWFuIGFuZ2VzY2hhdXQgd2lyZC4gKFdvenUgYXVjaD8gOi0pCisKK1dlaXRlcmUgSWRlZW4gd2VyZGVuIHZvbiBSdW1hdGEgZ2VybmUgZW50Z2VnZW5nZW5vbW1lbi4KK0FiZXIgYml0dGUgbmljaHQgZGF1ZXJuZCBhbmxhYmVybiwgc29uZGVybiBhbHMgbWFpbCA6LSkKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvdG9wIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS90b3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwN2ZhOQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdG9wCkBAIC0wLDAgKzEsMjMgQEAKK0JFRkVITDoKKwl0b3AKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlaZWlndCBkYXMgT2JqZWt0IGFuLCBkYXMgYXVmIGRlbSBTdGFjayB6dW9iZXJzdCBsaWVndCAoPVRPUykuCisKK0JFSVNQSUVMRToKKwk7bWUgdG9wCisJWmVpZ2UgZGFzIE9iamVrdCwgZGFzIG1hbiBzZWxic3QgaXN0LCBhbi4KKworCTtoZXJlIHRvcAorCVplaWdlIGRlbiBSYXVtLCBpbiBkZW0gbWFuIHNpY2ggYmVmaW5kZXQuCisKKwk7OyAxIDIgMyBhcnJheSB0b3AgKERhcyB6d2VpdGUgJzsnIGlzdCB3aWNodGlnKQorCUVyZ2lidDoKKwlUT1M9ICh7CisJICAgICAgIDEKKwkgICAgICAgMgorCSAgICAgICAzCisJICAgICB9KQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS91cGRhdGUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3VwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDM1YWFkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS91cGRhdGUKQEAgLTAsMCArMSwyMiBAQAorQkVGRUhMOgorCXVwZGF0ZSwgdXBkCisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJWmVyc3RvZXJlIGRpZSBCbHVlcHJpbnQgZGVzIE9iamVrdGVzLCBkYXMgYXVmIGRlbSBTdGFjayBsaWVndCwgZGFtaXQKKwlBZW5kZXJ1bmdlbiBkZXIgRmlsZXMgYWt0aXYgd2VyZGVuIGtvZW5uZW4uIEdlYmUgZGVyIEJsdWVwcmludAorCWplZG9jaCBHZWxlZ2VuaGVpdCwgQXVmcmFldW1hcmJlaXRlbiB6dSB0YWV0aWdlbi4gU29sbCBkaWUgQmx1ZXByaW50CisJd2lya2xpY2ggaGFydCB6ZXJzdG9lcnQgd2VyZGVuLCBzbyBpc3QgZWluIFJ1ZnplaWNoZW4gYW4gZGVuIEJlZmVobAorCWFuenVoYWVuZ2VuLiAoYWxzbyBgdXBkYXRlIScpCisJV2ljaHRpZzogRGFzIGdlY2xvbnRlIE9iamVrdCwgdWViZXIgZGFzIGRpZSBCbHVlcHJpbnQgemVyc3RvZXJ0IHdpcmQsCisJYmxlaWJ0IGVyaGFsdGVuLCBlYmVuc28gd2llIGFsbGUgYW5kZXJlbiBnZWNsb250ZW4gT2JqZWt0ZS4KKworQkVJU1BJRUxFOgorCSxtZSAudGVkZHkgdXBkYXRlCisJWmVyc3RvZXJ0IGRpZSBCbHVlcHJpbnQgdm9tIFRlZGR5LCBkZW4gbWFuIGhhdC4gKERhcyBpc3QgbmF0dWVybGljaCBudXIKKwlmdWVyIE1hZ2llciBzaW5udm9sbCwgZGllIGRhcyBGaWxlIGVkaXRpZXJlbiBrb25udGVuLikKKworU0lFSEUgQVVDSDoKKwkicm9vbXVwZGF0ZSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvdmFycyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdmFycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZkZWFiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS92YXJzCkBAIC0wLDAgKzEsMjMgQEAKK0JFRkVITEU6CisJPHZhcm5hbWUsID52YXJuYW1lCisKK0FSR1VNRU5URToKKwlUT1MgCisJdmFybmFtZSAtLSBTdHJpbmcKKworRlVOS1RJT046CisJPnZhcm5hbWUKKwkJU3BlaWNoZXJlIGRhcyBvYmVyc3RlIEVsZW1lbnQgZGVzIFN0YWNrcyBpbiBkZXIgVmFyaWFibGUKKwkJInZhcm5hbWUiIGFiLgorCTx2YXJuYW1lCisJCUtvcGllcmUgZGVuIEluaGFsdCBkZXIgVmFyaWFibGUgInZhcm5hbWUiIGF1ZiBkZW4gU3RhY2suCisJCVdlbm4gZGVyIEluaGFsdCBkZXIgVmFyaWFibGUgZWluZSBGdW5rdGlvbiBpc3QsIHdvIHdpcmQKKwkJZGllc2UgaW4gU3RyaW5nZm9ybSBhdWYgZGVuIFN0YWNrIGdlbGVndCB1bmQgbmljaHQgYXVzLQorCQlnZXdlcnRldC4KKworCUVzIGtvZW5uZW4gYXVzc2VyIE9iamVrdGVuIGF1Y2ggQXJyYXlzLCBTdHJpbmdzIHVuZCBJbnRlZ2VycworCWluIFZhcmlhYmxlbiBnZXNwZWljaGVydCB3ZXJkZW4uIFdpcmQgZWluZSAwIGluIGVpbmVyIFZhcmlhYmxlCisJZ2VzcGVpY2hlcnQsIHNvIHdpcmQgZGllIFZhcmlhYmxlIHdpZWRlciBnZWxvZXNjaHQuCisKK1NJRUhFIEFVQ0g6CisJIm1lbW9yeSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvdF9iYXNlLmMgYi9vYmovdG9vbHMvdGVsbGVyL3RfYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzZkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL3RfYmFzZS5jCkBAIC0wLDAgKzEsMzYxIEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEaWUgQmFzaXMtIHVuZCBIaWxmc2Z1bmt0aW9uZW4gZGVyIFRlbGxlci4KKy8vIFN0YWNrIHVuZCBNZW1vcnkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpbmNsdWRlICJ0ZWxsZXIuaCIKKworI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHRlcm1pbmFsLmg+CisKK3N0YXRpYyBtaXhlZCAqc3RhY2s7CitzdGF0aWMgbWFwcGluZyBtZW1vcnk7CitzdGF0aWMgb2JqZWN0ICpvbGRpbnY7CitzdGF0aWMgYm9vbCBtaXRfbmFtZW47CitzdGF0aWMgYm9vbCBmZWhsZXJfcGFzc2llcnQ7CitzdGF0aWMgYm9vbCBtaXRfc2F5Oworc3RhdGljIGJvb2wgc2VjdXJlaW52Oworc3RhdGljIGJvb2wgZG9sb2dhY2Nlc3M7CitzdGF0aWMgYm9vbCBwcmV0dHk7CitzdGF0aWMgYm9vbCBkb19wcm9maWxlOworCitzdGF0aWMgbWl4ZWQgdG9wKCk7CitzdGF0aWMgbWl4ZWQgcG9wKCk7CitzdGF0aWMgdm9pZCBwdXNoKCBtaXhlZCBvYiApOworCitzdGF0aWMgdm9pZCBkdW1wX29iaiggbWl4ZWQgb2IsIGludCBpbmRlbnQgKTsKKwordm9pZCBjcmVhdGUoKQoreworCXN0YWNrID0gKHt9KTsKKwltZW1vcnkgPSAoW10pOworCW1pdF9uYW1lbiA9IFRSVUU7CisJZmVobGVyX3Bhc3NpZXJ0ID0gRkFMU0U7CisJbWl0X3NheSA9IFRSVUU7CisJc2VjdXJlaW52ID0gRkFMU0U7CisJZG9sb2dhY2Nlc3MgPSBGQUxTRTsKKwlwcmV0dHkgPSBUUlVFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIaWxmc2Z1bmt0aW9uZW4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBlcnJvciggc3RyaW5nIG1zZyApCit7CisJd3JpdGUoICJGZWhsZXIgaW4gIittc2crIi5cbiIgKTsKKwlmZWhsZXJfcGFzc2llcnQgPSBUUlVFOworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCBtZW1vKCBzdHJpbmcgbXNnICkKK3sKKwl3cml0ZSggIk1FTU86ICIrbXNnKyIuXG4iICk7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IGNhbGNpbnYoIHN0cmluZyBzdHIgKQoreworCW9iamVjdCogb2JzOworCW9iamVjdCBvYjsKKwlpbnQgdmFsOworCisJaWYoIHNzY2FuZiggc3RyLCAiJWQiLCB2YWwgKSA9PSAxICkKKwl7CisJCW9icyA9IGFsbF9pbnZlbnRvcnkodG9wKCkpOworCQlpZiggdmFsPDAgfHwgdmFsPj1zaXplb2Yob2JzKSApCisJCQlyZXR1cm4gZXJyb3IoICInLic6IEtlaW4gT2JqZWt0IG1pdCBkaWVzZXIgTnVtbWVyIiApOworCQlwb3AoKTsKKwkJcHVzaChvYnNbdmFsXSk7CisJCXJldHVybiBUUlVFOworCX0KKworCWlmKCAhKG9iPXByZXNlbnQoc3RyLHRvcCgpKSkgKQorCQlyZXR1cm4gZXJyb3IoICInLic6IEtlaW4gT2JqZWt0IG5hbWVucyBcIiIrc3RyKyJcIiBnZWZ1bmRlbiIgKTsKKwlwb3AoKTsKKwlwdXNoKG9iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIG1peGVkIHB1c2hfc3RyKCBzdHJpbmcgc3RyICkKK3sKKwlyZXR1cm4KKwkJcHVzaCggaW1wbG9kZShvbGRfZXhwbG9kZSggaW1wbG9kZShvbGRfZXhwbG9kZSggaW1wbG9kZShvbGRfZXhwbG9kZSgKKwkJCQkJIiAiK3N0cisiICIsCisJCQkJIlxcbiIpLCJcbiIpLCAiXFxlIiksRVNDKSwgIlxcYiIpLCJcYiIpCisJCVsxLi48Ml0gKTsKK30KKworc3RhdGljIHZvaWQgZG9fbW92ZSggb2JqZWN0IG9iLCBtaXhlZCBkZXN0ICkKK3sKKwlpbnQgd2VpZ2h0OworCisJd2VpZ2h0ID0gb2ItPlF1ZXJ5V2VpZ2h0KCk7CisJaWYoIGVudmlyb25tZW50KG9iKSApCisJCWVudmlyb25tZW50KG9iKS0+QWRkV2VpZ2h0KC13ZWlnaHQpOworCW9iLT5tb3ZlKGRlc3QsTV9OT0NIRUNLKTsKKwlkZXN0LT5BZGRXZWlnaHQod2VpZ2h0KTsKK30KKwordm9pZCBoZWFydF9iZWF0KCkKK3sKKwlvYmplY3QgKm5ld2ludjsKKwlvYmplY3Qgb3duZXI7CisJaW50IGksajsKKworCWlmKCBvd25lcj1maW5kX3BsYXllcihnZXR1aWQoKSkgKQorCXsKKwkJbmV3aW52ID0gc29ydF9hcnJheSggYWxsX2ludmVudG9yeShvd25lciksIGxhbWJkYSggKHsnYSwnYn0pLAorCQkJKHsgIyc8LAorCQkJCSh7ICMnb2JqZWN0X25hbWUsICdhIH0pLAorCQkJCSh7ICMnb2JqZWN0X25hbWUsICdiIH0pCisJCQl9KQorCQkpICk7CisJCWlmKCBwb2ludGVycChvbGRpbnYpICkKKwkJeworCQkJZm9yKCBpPTAsaj0wOyBpPHNpemVvZihuZXdpbnYpICYmIGo8c2l6ZW9mKG9sZGludikgOyApCisJCQl7CisJCQkJaWYoIG5ld2ludltpXSA9PSBvbGRpbnZbal0gKQorCQkJCXsgaSsrOyBqKys7IH0KKwkJCQllbHNlIGlmKCBvYmplY3RfbmFtZShuZXdpbnZbaV0pID4gb2JqZWN0X25hbWUob2xkaW52W2pdKSApCisJCQkJeworCQkJCQl0ZWxsX29iamVjdChvd25lciwKKwkJCQkJCSJNRU1POiBcIiIrb2JqZWN0X25hbWUobmV3aW52W2ldKSsiXCIgZW50ZXJlZCBpbnZlbnRvcnkuXG4iICk7CisJCQkJCWkrKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlqKys7CisJCQl9CisJCQlmb3IoIDsgaTxzaXplb2YobmV3aW52KSA7IGkrKyApCisJCQkJdGVsbF9vYmplY3QoIG93bmVyLAorCQkJCQkiTUVNTzogXCIiK29iamVjdF9uYW1lKG5ld2ludltpXSkrIlwiIGVudGVyZWQgaW52ZW50b3J5LlxuIiApOworCQl9CisJfQorCW9sZGludiA9IG5ld2ludjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRHVtcGZ1bmt0aW9uZW4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgZHVtcF9hcnJheSggbWl4ZWQqIG9iLCBpbnQgaW5kZW50ICkKK3sKKwlpbnQgaTsKKwlmb3IoIGk9MDsgaTxzaXplb2Yob2IpOyBpKysgKQorCXsKKwkJcHJpbnRmKCAiJSpzIiwgaW5kZW50LCAiIiApOworCQlkdW1wX29iaiggb2JbaV0sIGluZGVudCApOworCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9tYXBwaW5nKCBtYXBwaW5nIG9iLCBpbnQgaW5kZW50ICkKK3sKKwltaXhlZCAqaW5kZXg7CisJbWl4ZWQga2V5OworCWludCBpLGosdmFsdWVzOworCisJaW5kZXggPSBtX2luZGljZXMoIG9iICk7CisJdmFsdWVzID0gZ2V0X3R5cGVfaW5mbyhvYilbMV07CisJZm9yKCBpPTA7IGk8c2l6ZW9mKGluZGV4KTsgaSsrICkKKwl7CisJCWtleSA9IGluZGV4W2ldOworCQlwcmludGYoICIlKnMiLCBpbmRlbnQsICIiICk7CisJCWR1bXBfb2JqKCBrZXksIGluZGVudCApOworCQlmb3IoIGo9MDsgajx2YWx1ZXM7IGorKyApCisJCXsKKwkJCXByaW50ZiggIiUqczogIiwgaW5kZW50KzEsICIiICk7CisJCQlkdW1wX29iaiggb2Jba2V5LGpdLCBpbmRlbnQrMyApOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX29iaiggbWl4ZWQgb2IsIGludCBpbmRlbnQgKQoreworCWlmKCAhcHJldHR5ICkKKwl7CisJCXByaW50ZiggIiVPXG4iLCBvYiApOworCQlyZXR1cm47CisJfQorCWlmKCBpbnRwKG9iKSApCisJCXdyaXRlKCBvYiArICJcbiIgKTsKKwllbHNlIGlmKCBmbG9hdHAob2IpICkKKwkJcHJpbnRmKCAiJTEuNWZcbiIsIG9iICk7CisJZWxzZSBpZiggc3RyaW5ncChvYikgKQorCXsKKwkJaWYgKCBvYj09IjsiICkKKwkJCXdyaXRlKCAiO1xuIiApOworCQllbHNlCisJCXsKKwkJCXdyaXRlKCAiXCIiICsgaW1wbG9kZShvbGRfZXhwbG9kZSggaW1wbG9kZShvbGRfZXhwbG9kZSggaW1wbG9kZShvbGRfZXhwbG9kZSgKKwkJCQkJCQkiICIrb2IrIiAiLAorCQkJCQkJICJcbiIpLCJcXG4iKSwgRVNDKSwgIlxcZSIpLCAiXGIiKSwiXFxiIikKKwkJCQkJCSBbMS4uPDJdICsgIlwiXG4iCisJCQkpOworCQl9CisJfQorCWVsc2UgaWYoIG9iamVjdHAob2IpICkKKwl7CisJCWlmKCBtaXRfbmFtZW4gKQorCQkJd3JpdGUoIG9iamVjdF9uYW1lKG9iKSsiICgiK29iLT5uYW1lKFdFUiwwKSsiKVxuIiApOworCQllbHNlCisJCQl3cml0ZSggb2JqZWN0X25hbWUob2IpKyJcbiIgKTsKKwl9CisJZWxzZSBpZiggbWFwcGluZ3Aob2IpICkKKwl7CisJCXdyaXRlKCAiKFtcbiIgKTsKKwkJZHVtcF9tYXBwaW5nKCBvYiwgaW5kZW50ICsgMiApOworCQlwcmludGYoICIlKnNcbiIsIGluZGVudCArIDIsICJdKSIgKTsKKwl9CisJZWxzZSBpZiggcG9pbnRlcnAob2IpICkKKwl7CisJCXdyaXRlKCAiKHtcbiIgKTsKKwkJZHVtcF9hcnJheSggb2IsIGluZGVudCsyICk7CisJCXByaW50ZiggIiUqc1xuIiwgaW5kZW50KzIgLCAifSkiICk7CisJfQorCWVsc2UKKwkJcHJpbnRmKCAiJU9cbiIsIG9iICk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNwZWljaGVyZnVua3Rpb25lbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBkb19yZWNhbGwoIG1peGVkIGFyZyApCit7CisJaWYoIG1lbWJlcihtZW1vcnksYXJnKSApCisJCXB1c2goIG1lbW9yeVthcmcsMF0gKTsKK30KKworc3RhdGljIHZvaWQgZG9fc3RvcmUoIG1peGVkIGFyZyApCit7CisJaWYgKCBzaXplb2Yoc3RhY2spICkKKwl7CisJCWlmKCAhdG9wKCkgKQorCQkJbWVtb3J5ID0gbV9kZWxldGUobWVtb3J5LGFyZyk7CisJCWVsc2UKKwkJCW1lbW9yeSArPSAoWyBhcmc6IHRvcCgpOyAwIF0pOworCX0KKwllbHNlCisJCW1lbW8oICJFcyB3dXJkZSBrZWluIFdlcnQgaW4gXCIiK2FyZysiXCIgZ2VzcGVpY2hlcnQiICk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0YWNrLUZ1bmt0aW9uZW4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgcHVzaCggbWl4ZWQgb2IgKQoreworCXN0YWNrID0gKHsgb2IgfSkgKyBzdGFjazsKK30KKworc3RhdGljIG1peGVkIHBvcCgpCit7CisJbWl4ZWQgYW5zd2VyOworCisJaWYoICFzaXplb2YoIHN0YWNrICkgKQorCQlyZXR1cm4gRkFMU0U7CisJYW5zd2VyID0gc3RhY2tbMF07CisJc3RhY2sgPSBzdGFja1sxLi5dOworCXJldHVybiBhbnN3ZXI7Cit9CQorCitzdGF0aWMgbWl4ZWQgdG9wKCkKK3sKKwlpZiggc2l6ZW9mKHN0YWNrKSApCisJCXJldHVybiBzdGFja1swXTsKK30KKworc3RhdGljIHZhcmFyZ3MgaW50IGJlY29tZXNfb2JqKCBtaXhlZCBhcmd2KQoreworCW9iamVjdCBvYjsKKworCWlmKCAhcG9pbnRlcnAoYXJndikgKSAvLyBkZWZhdWx0IGlzdCBkZXIgc3RhY2sgIQorCQlhcmd2ID0gc3RhY2s7CisJaWYoICFzaXplb2YoYXJndikgKQorCQlyZXR1cm4gRkFMU0U7IAorCWlmKCBzdHJpbmdwKGFyZ3ZbMF0pICYmICFjYXRjaChjYWxsX290aGVyKGFyZ3ZbMF0sIj8iKSkgKQorCXsKKwkgIGFyZ3ZbMF0gPSBmaW5kX29iamVjdChhcmd2WzBdKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwkJcmV0dXJuIG9iamVjdHAoYXJndlswXSk7Cit9CisKK3N0YXRpYyBpc1N1YlN0ciggcGwsIHN0ciwgbGVuICkKK3sKKwlyZXR1cm4gZ2V0dWlkKHBsKVswLi5sZW5dID09IHN0cjsKK30KKworc3RhdGljIGJlY29tZXNfcGwoYXJndikKK3sKKwlvYmplY3QgcGw7CisJb2JqZWN0KiBwbGxpc3Q7CisJc3RyaW5nIHN0cjsKKwlpbnQgbGVuOworCisJaWYoICFhcmd2ICkgYXJndiA9IHN0YWNrOworCWlmKCAhc2l6ZW9mKGFyZ3YpIHx8ICggYmVjb21lc19vYmooKSAmJiAhaW50ZXJhY3RpdmUoYXJndlswXSkgKSApCisJCXJldHVybiBGQUxTRTsKKwlpZiggc3RyaW5ncChhcmd2WzBdKSApCisJeworCQlzdHIgPSBsb3dlcl9jYXNlKCBhcmd2WzBdICk7CisJCXBsID0gMDsKKwkJaWYoIHN0cls8MS4uPDFdID09ICIqIiApCisJCXsJCisJCQlzdHIgPSBzdHJbMC4uPDJdOworCQkJbGVuID0gc2l6ZW9mKHN0cikgLSAxOworCQkJcGxsaXN0ID0gZmlsdGVyKCB1c2VycygpLCAjJ2lzU3ViU3RyLCBzdHIsIGxlbiApOworCQkJaWYoIHNpemVvZihwbGxpc3QpID09IDEgKQorCQkJeworCQkJCXBsPXBsbGlzdFswXTsKKwkJCQlhcmd2WzBdID0gcGw7CisJCQl9CisJCX0KKwkJaWYoICFwbCAmJiBwbD1maW5kX3BsYXllcihhcmd2WzBdKSApCisJCQlhcmd2WzBdID0gcGw7CisJCXJldHVybiBwbDsKKwl9CisJcmV0dXJuIGFyZ3ZbMF07Cit9CisKK3N0YXRpYyBEdW1wT2JqKCBvYiApCit7CisgIHN0cmluZyBhbnM7CisgIGludCBpLGo7CisKKyAgaWYoIGludHAob2IpICkKKyAgICByZXR1cm4gIiIrb2I7CisgIGVsc2UgaWYoIHN0cmluZ3Aob2IpICkKKyAgICByZXR1cm4gIlwiIitpbXBsb2RlKGV4cGxvZGUob2IsIlxuIiksIlxcbiIpKyJcIiI7CisgIGVsc2UgaWYoIG9iamVjdHAob2IpICkKKyAgICByZXR1cm4gIlwiIitvYmplY3RfbmFtZShvYikrIlwiIjsKKyAgZWxzZSBpZiggbWFwcGluZ3Aob2IpICkKKyAgeworICAgIGFucz0iKFsiOworICAgIGZvciggaT0wOyBpPHNpemVvZihvYiktMTsgaSsrICkKKyAgICAgIGFucyArPSBEdW1wTWFwcChvYixpKSsiLCI7CisgICAgLy8gcmVseSBvbiByaWdodCB2YWx1ZSBvZiBpCisgICAgcmV0dXJuIGFucytEdW1wTWFwcChvYixpKSsiXSkiOworICB9CisgIGVsc2UKKyAgeworICAgIGFucz0iKHsiOworICAgIGZvciggaT0wOyBpPHNpemVvZihvYiktMTsgaSsrICkKKyAgICAgIGFucyArPSBEdW1wT2JqKG9iW2ldKSsiLCI7CisgICAgLy8gcmVseSBvbiByaWdodCB2YWx1ZSBvZiBpCisgICAgcmV0dXJuIGFucytEdW1wT2JqKG9iW2ldKSsifSkiOworICB9Cit9CisKK3N0YXRpYyBEdW1wTWFwcChvYixpKQoreworICBpbnQgaix2ejsKKyAgc3RyaW5nIGFuczsKKworICB2eiA9IGdldF90eXBlX2luZm8ob2IpWzFdOworICBhbnMgPSBEdW1wT2JqKG1faW5kaWNlcyhvYilbaV0pKyI6IjsKKyAgZm9yKCBqPTA7IGo8dnotMTsgaisrICkKKyAgICBhbnMgKz0gRHVtcE9iaihvYlttX2luZGljZXMob2IpW2ldLGpdKSsiOyI7CisgIC8vIHJlbHkgb24gdmFsdWUgb2YgagorICByZXR1cm4gYW5zICsgRHVtcE9iaihvYlttX2luZGljZXMob2IpW2ldLGpdKTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvdF9jbWRzLmMgYi9vYmovdG9vbHMvdGVsbGVyL3RfY21kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZmE1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL3RfY21kcy5jCkBAIC0wLDAgKzEsMTAwMCBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQnVpbHRpbmtvbW1hbmRvcyBkZXIgVGVsbGVyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2luY2x1ZGUgInRlbGxlci5oIgoraW5oZXJpdCBUX0JBU0U7CisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8dGVybWluYWwuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworc3RhdGljIHZvaWQgZG9fcmludiggb2JqZWN0IGVudiwgaW50IGRlcHRoICk7CitzdGF0aWMgc2Nhbl9vYmooIG9iamVjdCBwbGF5ZXIsIG9iamVjdCBvYmogKTsKK3N0YXRpYyB2b2lkIG1rX3dhaXRmb3IoIG1peGVkIHdhaXRmb3IgKTsKK3N0YXRpYyB2b2lkIG1rX2F1dG9sb2FkKCBtaXhlZCBhdXRvbG9hZCApOworc3RhdGljIGludCBkb19yb29tdXBkYXRlKCBpbnQgZGVzdGZsYWcsIGludCBub2l0ZW1zICk7CitzdGF0aWMgaW50IGRvX2NsZWFub2YoIGludCBzdHJvbmcgKTsKKworLy8gZnJvbSB0ZWxsZXIuYworc3RhdGljIGludCBkb19jbWQoIHN0cmluZyBzdHIgKTsKKworc3RhdGljIGludCBjbWRfY2xlYXIoKQoreworCXN0YWNrID0gKHt9KTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfcG9wKCkKK3sKKwlpZiggIXNpemVvZihzdGFjaykgKQorCQlyZXR1cm4gZXJyb3IoICJwb3A6IERlciBTdGFjayBpc3QgbGVlciIgKTsKKwlwb3AoKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfdG9wKCkKK3sKKwlpZiggIXNpemVvZihzdGFjaykgKQorCQlyZXR1cm4gZXJyb3IoICJ0b3A6IERlciBTdGFjayBpc3QgbGVlciIgKTsKKwl3cml0ZSggIlRPUz0gIiApOworCWR1bXBfb2JqKCB0b3AoKSwgNSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9zd2FwKCkKK3sKKwltaXhlZCB0bXA7CisKKwlpZiggc2l6ZW9mKHN0YWNrKTwyICkKKwkJcmV0dXJuIGVycm9yKCAic3dhcDogS2VpbmUgMiBFbGVtZW50ZSBhdWYgZGVtIFN0YWNrIiApOworCXRtcCA9IHN0YWNrWzBdOworCXN0YWNrWzBdID0gc3RhY2tbMV07CisJc3RhY2tbMV0gPSB0bXA7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2R1cCgpCit7CisJaWYoICFzaXplb2Yoc3RhY2spICkKKwkJcmV0dXJuIGVycm9yKCAiZHVwOiBEZXIgU3RhY2sgaXN0IGxlZXIiICk7CisJcHVzaCh0b3AoKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2hlcmUoKQoreworCXB1c2goZW52aXJvbm1lbnQoUEwpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfc3RhY2soKQoreworICBpbnQgaTsKKyAgaWYoICFzaXplb2Yoc3RhY2spICkKKyAgICByZXR1cm4gbWVtbyggIkRlciBTdGFjayBpc3QgbGVlciIgKTsKKworICBmb3IoIGk9MDsgaTxzaXplb2Yoc3RhY2spOyBpKysgKQorICB7CisgICAgcHJpbnRmKCAiJTJkOiAiLCBpICk7CisgICAgZHVtcF9vYmooIHN0YWNrW2ldLCA0ICk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2ludigpCit7CisgIGludCBpOworICBvYmplY3Qgb2I7CisKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJpbnY6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisgIHdyaXRlKCAiSW52ZW50YXIgdm9uICIgKTsKKyAgZHVtcF9vYmooIHRvcCgpLCAxMyApOworICBmb3IoIGk9MCwgb2I9Zmlyc3RfaW52ZW50b3J5KHRvcCgpKTsgb2I7IG9iPW5leHRfaW52ZW50b3J5KG9iKSwgaSsrICkKKyAgeworICAgIHByaW50ZiggIiUyZC4gIiwgaSApOworICAgIGR1bXBfb2JqKCBvYiwgNCApOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9yZWtpbnYoKQoreworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggInJla2ludjogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwl3cml0ZSggIkludmVudGFyIHZvbiAiICk7CisJZHVtcF9vYmooIHRvcCgpLCAxMyApOworCisJZG9fcmludiggdG9wKCksIDIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgZG9fcmludiggb2JqZWN0IGVudiwgaW50IGRlcHRoICkKK3sKKwlpbnQgaTsKKwlvYmplY3Qgb2I7CisKKwlmb3IoIGk9MCwgb2I9Zmlyc3RfaW52ZW50b3J5KGVudik7IG9iOyBvYj1uZXh0X2ludmVudG9yeShvYiksIGkrKyApCisJeworCQlwcmludGYoICIlKmQuICIsIGRlcHRoLCBpICk7CisJCWR1bXBfb2JqKCBvYiwgMitkZXB0aCApOworCQlkb19yaW52KCBvYiwgZGVwdGgrMiApOworCX0KK30KKworc3RhdGljIGludCBjbWRfbWUoKQoreworCXB1c2goIFBMICk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIFVlYmVybm9tbWVuIGF1cyBkZW0gVGVkZHkgKG1pdCBmcmV1bmRsaWNoZXIgR2VuZWhtaWd1bmcgdm9uIFNpcikuCitzdGF0aWMgaW50IGNtZF9zY2FuKCkKK3sKKwlvYmplY3Qgb2JqOworCisJaWYoICFiZWNvbWVzX3BsKCkgJiYgKCAhb2JqZWN0cCh0b3AoKSkgfHwgIWxpdmluZyh0b3AoKSkgKSApCisJeworCQlpZiggc3RyaW5ncCh0b3AoKSkgJiYgZmlsZV9zaXplKCAiL3NhdmUvIit0b3AoKVswLi4wXSsiLyIrdG9wKCkrIi5vIikgPiAwICkKKwkJeworCQkJb2JqID0gY2xvbmVfb2JqZWN0KCBUX1BMQVlFUiApOworCQkJb2JqLT5Mb2FkKCB0b3AoKSApOworCQkJb2JqLT5TZXRQcm9wKCBQX05BTUUsIGNhcGl0YWxpemUoIHBvcCgpICkgKTsKKwkJCXNjYW5fb2JqKCBUUlVFLCBvYmogKTsKKwkJCWRlc3RydWN0KCBvYmogKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJCXJldHVybiBlcnJvciggInNjYW46IFRPUyBpc3Qga2VpbiBMZWJld2VzZW4iICk7CisJfQorCisJc2Nhbl9vYmooIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoIHRvcCgpICksIHBvcCgpICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgV2l6TGV2ZWwoIG9iamVjdCBvYmogKQoreworCWlmKCBvYmotPk5vdGxvZ2dlZCgpICkKKwkJcmV0dXJuIHF1ZXJ5X3dpel9sZXZlbCggbG93ZXJfY2FzZShvYmotPnBsYXllcm5hbWUoKSkgKTsKKwllbHNlCisJCXJldHVybiBxdWVyeV93aXpfbGV2ZWwoIG9iaiApOworfQorCitzdGF0aWMgc3RyaW5nIElwTmFtZSggb2JqZWN0IG9iaiApCit7CisJc3RyaW5nIGlwX25hbWUsIGlwX251bSwgbm07CisKKwlpZiggb2JqLT5Ob3Rsb2dnZWQoKSApCisJeworCQkvLyBBdXMgVW1zdGVsbHVuZ3NncnVlbmRlbiB3ZXJkZW4gQ0FMTEVEX0ZST01fSVAgdW5kIElQX05BTUUKKwkJLy8gYWJnZWZyYWd0LiBJUF9OQU1FIGlzdCBuZXVlci4KKworCQlubSA9IGxvd2VyX2Nhc2Uob2JqLT5wbGF5ZXJuYW1lKCkpOworCQlpcF9uYW1lID0gb2JqLT5RdWVyeVByb3AoUF9DQUxMRURfRlJPTV9JUCk7CisJCWlmKCAhaXBfbmFtZSApIGlwX25hbWUgPSBvYmotPlF1ZXJ5KFBfSVBfTkFNRSk7CisJCXJldHVybiBpcF9uYW1lICsgIiAoIgorCQkJKyBkdGltZShnZXRfZGlyKCIvc2F2ZS8iK25tWzAuLjBdKyIvIitubSsiLm8iLDQpWzBdKSArIikiOworCX0KKwllbHNlCisJeworCQlubSA9IGxvd2VyX2Nhc2UoIG9iai0+bmFtZShSQVcpICk7CisJCWlwX25hbWUgPSBxdWVyeV9pcF9uYW1lKCBvYmogKTsKKwkJaWYoIGlwX25hbWUgPT0gIiIgfHwgIWlwX25hbWUgKQorCQl7CisJCQlpcF9uYW1lID0gb2JqLT5RdWVyeVByb3AoUF9DQUxMRURfRlJPTV9JUCk7CisJCQlpZiggIWlwX25hbWUgKSBpcF9uYW1lID0gb2JqLT5RdWVyeShQX0lQX05BTUUpOworCQkJcmV0dXJuIGlwX25hbWUgKyAiICgiCisJCQkJKyBkdGltZShnZXRfZGlyKCIvc2F2ZS8iK25tWzAuLjBdKyIvIitubSsiLm8iLDQpWzBdKSArIikiOworCQl9CisJCXJldHVybiBpcF9uYW1lICsgIiBbIiArIHF1ZXJ5X2lwX251bWJlcihvYmopICsgIl0iOworCX0KK30KKworc3RyaW5nIElkbGVUaW1lKCBvYmplY3Qgb2JqICkKK3sKKwlpZiggb2JqLT5Ob3Rsb2dnZWQoKSApIHJldHVybiAiLW5pY2h0IGRhLSI7CisJaWYoIHF1ZXJ5X2lwX251bWJlcihvYmopICkgcmV0dXJuICIiK3F1ZXJ5X2lkbGUob2JqKTsKKwlyZXR1cm4gIi1uZXR6dG90LSI7Cit9CisKK3N0YXRpYyBzY2FuX29iaiggb2JqZWN0IHBsYXllciwgb2JqZWN0IG9iaiApCit7CisJc3RyaW5nIHRpdGxlLCBsZXZlbCwgZ2VuZGVyLCByb29tLCB0ZXN0cGwsCisJCXdlYXBvbiwgYXJtb3VyLCBxdWVzdCwgc3RhdF9zdHIsICphcnI7CisJaW50IGksYWM7CisJb2JqZWN0IHdlYXBvbm9iaiwgKmxpc3QsICpnZWduZXI7CisJbWl4ZWQgKmhhbmRzLCAqcXVlc3RzLCAqc3RhdHM7CisKKwkvLyAxLlplaWxlIDogTmFtZSBUaXRlbCAtIFJhc3NlIC0gWyBXaXpsZXZlbCBdCisJdGl0bGUgPSBvYmotPlF1ZXJ5UHJvcChQX1RJVExFKTsKKworICBpZiggIXBsYXllciApCisgICAgbGV2ZWwgPSAiTW9uc3RlciIgOworICBlbHNlIGlmKCBXaXpMZXZlbCggb2JqICkgPCBXSVpBUkRfTFZMICkKKwl7CisJCWlmKCB0ZXN0cGw9b2JqLT5RdWVyeVByb3AoIFBfVEVTVFBMQVlFUiApICkKKwkJeworCQkJaWYoIHN0cmluZ3AodGVzdHBsKSApCisJCQkJbGV2ZWwgPSAiKCIrdGVzdHBsKyIpIjsKKwkJCWVsc2UKKwkJCQlsZXZlbCA9ICJUZXN0c3BpZWxlciI7CisJCX0KKwkJZWxzZSBpZiggV2l6TGV2ZWwoIG9iaiApID49IFNFRVJfTFZMICkKKwkJCWxldmVsID0gIlNlaGVyIjsKKwkJZWxzZQorCQkJbGV2ZWwgPSAiU3BpZWxlciIgOworCX0KKyAgZWxzZSBpZiggV2l6TGV2ZWwoIG9iaiApID49IEdPRF9MVkwgKQorICAgIGxldmVsID0gIk11ZEdvdHQiIDsKKyAgZWxzZSBpZiggV2l6TGV2ZWwoIG9iaiApID49IEFSQ0hfTFZMICkKKyAgICBsZXZlbCA9ICJFcnptYWdpZXIiIDsKKyAgZWxzZSBpZiggV2l6TGV2ZWwoIG9iaiApID49IExPUkRfTFZMICkKKyAgICBsZXZlbCA9ICJSZWdpb25zbWFnaWVyIiA7CisgIGVsc2UKKyAgICBsZXZlbCA9ICJNYWdpZXIiIDsKKworICBpZiggIW9iai0+c2hvcnQoKSApCisgICAgbGV2ZWwgKz0gIiwgdW5zaWNodGJhciIgOworICBpZiggb2JqIC0+IFF1ZXJ5UHJvcCggUF9GUk9HICkgKQorICAgIGxldmVsICs9ICIsIEZyb3NjaCIgOworICBpZiggb2JqLT5RdWVyeVByb3AoIFBfR0hPU1QgKSApCisgIAlsZXZlbCArPSAiLCB0b3QiOworCWlmKCBvYmotPk5vdGxvZ2dlZCgpICkKKwkJbGV2ZWwgKz0gIiwgYXVzZ2Vsb2dndCI7CisJaWYob2JqLT5RdWVyeVByb3AoUF9TRUNPTkQpICkKKwkJbGV2ZWwgKz0iLCBad2VpdGllIjsKKworCWlmKCBlbnZpcm9ubWVudChvYmopICkKKwkJcm9vbSA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KCBvYmogKSk7CisJZWxzZQorCQlyb29tID0gIi1uaXJnZW5kcy0iOworCisgIHByaW50ZiggIiVzICVzICVzWyAlcyBdLlxuQmVmaW5kZXQgc2ljaCBpbiAlcy5cbiIsCisJCW9iai0+bmFtZShSQVcpLCB0aXRsZT8gdGl0bGUgOiAiIiwKKwkJc3RyaW5ncChvYmotPlF1ZXJ5UHJvcChQX1JBQ0UpKSA/ICItICIrb2JqLT5RdWVyeVByb3AoUF9SQUNFKSsiIC0gIiA6ICIiLAorCQlsZXZlbCwgcm9vbSApIDsKKworCS8vIDEgYWJjIFplaWxlIDogSG9zdCxFbWFpbCxTbm9vcGVyCisJaWYoIHBsYXllciApCisJeworCQlwcmludGYoICJIb3N0Li4uLi4uLjogJXNcbiIsIElwTmFtZShvYmopICk7CisJCXByaW50ZiggIkUtTWFpbC4uLi4uOiAlcy5cbiIsIG9iai0+UXVlcnlQcm9wKFBfTUFJTEFERFIpICk7CisJCWlmKCAhb2JqLT5Ob3Rsb2dnZWQoKSAmJiBxdWVyeV9zbm9vcChvYmopICkKKwkJCXByaW50ZiggIlNub29wZXIuLi4uOiAlcy5cbiIsIGNhcGl0YWxpemUoZ2V0dWlkKHF1ZXJ5X3Nub29wKG9iaikpKSApOworCisJCXByaW50ZiggIlZvcnNpY2h0Li4uOiAlMTFkIEt1cnptb2R1cy46ICUxMXMgTWFnaWVyYmxpY2suLi4uOiAlMTFzLlxuIiwKKwkJCW9iai0+UXVlcnlQcm9wKFBfV0lNUFkpLCBvYmotPlF1ZXJ5UHJvcChQX0JSSUVGKSA/ICItYW4tIiA6ICItYXVzLSIsCisJCQlvYmotPlF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKSA/ICItYW4tIiA6ICItYXVzLSIgKTsKKwkJcHJpbnRmKCAiSWRsZXplaXQuLi46ICUxMXMgQWx0ZXIuLi4uLjogJTExcyBWZXJoZWlyYXRldCBtaXQ6ICUtMTFzLlxuIiwKKwkJCUlkbGVUaW1lKG9iaiksIHRpbWUyc3RyaW5nKCIlNWQ6JTAyaDolMDJtIixvYmotPlF1ZXJ5UHJvcChQX0FHRSkqMiksCisJCQkoc3RyaW5ncChvYmotPlF1ZXJ5UHJvcChQX01BUlJJRUQpKSA/IG9iai0+UXVlcnlQcm9wKFBfTUFSUklFRCkgOiAiLSIgKQorCQkpOworCX0KKworICAvLyAyLlplaWxlIDogSFAsIFNQIHVuZCBYUAorICBwcmludGYoICJMZWJlbnNwa3QuLjogWyU0ZC8lNGRdIE1hZ2llcGt0Li46IFslNGQvJTRkXS5cbiIgKworICAgICJRdWVzdHB1bmt0ZTogWyU0ZC8lNGRdIEVyZmFocnVuZy46ICUxMWQuXG4iLAorICAgIG9iai0+UXVlcnlQcm9wKFBfSFApLCBvYmotPlF1ZXJ5UHJvcChQX01BWF9IUCksCisJCW9iai0+UXVlcnlQcm9wKFBfU1ApLCBvYmotPlF1ZXJ5UHJvcChQX01BWF9TUCksCisJCW9iai0+UXVlcnlQcm9wKFBfUVApLCAiL3NlY3VyZS9xdWVzdG1hc3RlciItPlF1ZXJ5TWF4UVAoKSwKKwkJb2JqLT5RdWVyeVByb3AoUF9YUCkgKTsKKworICAvLyAzLlplaWxlIDogRk9PRCwgRFJJTkssIEFMQ09IT0wKKyAgcHJpbnRmKCAiTmFocnVuZy4uLi46IFslNGQvJTRkXSBGbHVlc3NpZ2suOiBbJTRkLyU0ZF0gIiArCisgICAgIkFsa29ob2wuLi4uLi4uLjogWyU0ZC8lNGRdLlxuIiwKKyAgICBvYmotPlF1ZXJ5UHJvcChQX0ZPT0QpLCBvYmotPlF1ZXJ5UHJvcChQX01BWF9GT09EKSwKKyAgICBvYmotPlF1ZXJ5UHJvcChQX0RSSU5LKSwgb2JqLT5RdWVyeVByb3AoUF9NQVhfRFJJTkspLAorICAgIG9iai0+UXVlcnlQcm9wKFBfQUxDT0hPTCksIG9iai0+UXVlcnlQcm9wKFBfTUFYX0FMQ09IT0wpICkgOworCisgIC8vIDQuWmVpbGUgOiBHZXNjaGxlY2h0LCBBbGlnbm1lbnQsIExldmVsCisgIHN3aXRjaCggb2JqLT5RdWVyeVByb3AoUF9HRU5ERVIpICkKKyAgeworICAgIGNhc2UgRkVNQUxFIDogZ2VuZGVyID0gIndlaWJsaWNoICAgIiA7IGJyZWFrIDsKKyAgICBjYXNlIE1BTEUgICA6IGdlbmRlciA9ICJtYWVubmxpY2ggICIgOyBicmVhayA7CisgICAgZGVmYXVsdCAgICAgOiBnZW5kZXIgPSAibmV1dHJ1bSAgICAiIDsgYnJlYWsgOworICB9CisgIHByaW50ZigKKwkJIkdlc2NobGVjaHQuOiAlcyBDaGFyYWt0ZXIuOiAlMTFkIChNYWdpZXIpU3R1ZmUuLjogWyU0cy8lNGRdLlxuIiwgCisgICAgZ2VuZGVyLCBvYmotPlF1ZXJ5UHJvcChQX0FMSUdOKSwKKwkJcGxheWVyID8gV2l6TGV2ZWwob2JqKSsiIiA6ICItIiwgb2JqLT5RdWVyeVByb3AoUF9MRVZFTCkgKTsKKworCS8vIDUuWmVpbGUgOiBHZWxkLCBHZXdpY2h0LCBQbGF5ZXJraWxscworCXByaW50ZiggIkdlbGQuLi4uLi4uOiAlMTFkIFRyYWVndC4uLi46ICUxMWQgUGxheWVya2lsbHMuLi4uOiAlMTFkLlxuIiwKKwkJb2JqLT5RdWVyeU1vbmV5KCksIG9iai0+cXVlcnlfd2VpZ2h0X2NvbnRlbnRzKCksCisJCW9iai0+UXVlcnlQcm9wKFBfS0lMTFMpICk7CisKKyAgLy8gNi5aZWlsZSA6IHN0YXRpCisgIHN0YXRzID0gb2JqLT5RdWVyeVByb3AoUF9BVFRSSUJVVEVTKSA7CisJYXJyID0gbV9pbmRpY2VzKCBzdGF0cyApOworICBzdGF0X3N0ciA9ICIiIDsKKyAgZm9yKCBpID0gMDsgaSA8IHNpemVvZiggYXJyICk7IGkrKyApIHsKKyAgICBzdGF0X3N0ciArPSBjYXBpdGFsaXplKGFyclsgaSBdKSArICJbIiArIHN0YXRzW2FyclsgaSBdXTsKKyAgICBpZiggYWMgPSBvYmotPlF1ZXJ5QXR0cmlidXRlT2Zmc2V0KGFycltpXSkgKSB7CisgICAgCXN0YXRfc3RyICs9ICIrIiArIGFjOworICAgIH0KKyAgICBzdGF0X3N0ciArPSAiXSwgIjsKKyAgfQorCisgIGlmKCBzdGF0X3N0ciA9PSAiIiApCisgICAgc3RhdF9zdHIgPSAiS2VpbmUiIDsKKyAgZWxzZQorICAgIHN0YXRfc3RyID0gc3RhdF9zdHJbMC4uc2l6ZW9mKCBzdGF0X3N0ciApIC0gM10gOworICBwcmludGYoICJBdHRyaWJ1dGUuLjogJXMuXG4iLCBzdGF0X3N0ciApIDsKKworICAvLyA3LlplaWxlIDogV2FmZmUoIERhdGVpbmFtZSApWyBBQyBdCisgIC8vIDguWmVpbGUgOiBSdWVzdHVuZyhlbilbIFdDIF0KKwl3ZWFwb25vYmo9b2JqLT5RdWVyeVByb3AoUF9XRUFQT04pOworCWlmKCB3ZWFwb25vYmogKQorICAgIHdlYXBvbiA9IHdlYXBvbm9iai0+bmFtZShSQVcpICsgIiAoIiArIAorICAgICAgb2JqZWN0X25hbWUoIHdlYXBvbm9iaiApICsgIikgWyIgKworICAgICAgd2VhcG9ub2JqLT5RdWVyeVByb3AoUF9XQykgKyAiXSIgOworCWVsc2UKKwl7CisJCWhhbmRzID0gb2JqLT5RdWVyeVByb3AoUF9IQU5EUyk7CisJCXdlYXBvbiA9IHNwcmludGYoICJrYWVtcGZ0JXMgWyVkXSIsIGhhbmRzWzBdLCBoYW5kc1sxXSApOworCX0KKwlhYyA9IDA7CisJbGlzdCA9IG9iai0+UXVlcnlQcm9wKFBfQVJNT1VSUyk7CisJYXJtb3VyID0gIiI7CisJZm9yKCBpID0gMDsgaSA8IHNpemVvZiggbGlzdCApOyBpKysgKQorCXsKKyAgICAgYXJtb3VyICs9ICggbGlzdFtpXS0+bmFtZShSQVcpICsgIlsiICsKKyAgICAgICAgIGxpc3RbaV0tPlF1ZXJ5UHJvcChQX0FDKSArICJdIiArICIsICIpIDsKKwkJIGFjICs9IGxpc3RbaV0tPlF1ZXJ5UHJvcChQX0FDKTsKKwl9CisKKyAgaWYoIGFybW91ciA9PSAiIiApCisgICAgYXJtb3VyID0gIktlaW5lICAiIDsKKworCWFyciA9IG9sZF9leHBsb2RlKCBicmVha19zdHJpbmcoIGFybW91clswLi48M10rc3ByaW50ZigiID0+WyVkXSIsCisJCWFjK29iai0+UXVlcnlQcm9wKFBfQk9EWSkgKSwgNjUgKSwgIlxuIiApIDsKKwlhcm1vdXIgPSBhcnJbIDAgXSA7CisJZm9yKCBpID0gMTsgaSA8IHNpemVvZiggYXJyICk7IGkrKyApCisJCWFybW91ciArPSAiXG4gICAgICAgICAgICAgIiArIGFyclsgaSBdIDsKKyAgcHJpbnRmKCAiV2FmZmUuLi4uLi46ICVzLlxuUnVlc3R1bmcuLi46ICVzLlxuIiwgd2VhcG9uLCBhcm1vdXIgKSA7CisKKwlnZWduZXIgPSBvYmotPlF1ZXJ5RW5lbWllcygpOworCWlmKCBwb2ludGVycChnZWduZXIpICkKKwl7CisJCWdlZ25lciA9IGdlZ25lclswXTsKKwkJZm9yKCBpPTA7IGk8c2l6ZW9mKGdlZ25lcik7IGkrKyApCisJCXsKKwkJCWlmKCBpPT0wICkgcHJpbnRmKCAiR2VnbmVyLi4uLi46ICIpOyBlbHNlIHByaW50ZiggIiAgICAgICAgICAgICAiICk7CisJCQlpZiggIW9iamVjdHAoZ2VnbmVyW2ldKSApCisJCQkJcHJpbnRmKCAiPCVPPlxuIiwgZ2VnbmVyW2ldICk7CisJCQllbHNlCisJCQkJcHJpbnRmKCAiJXMgKCVzKVxuIiwgZ2VnbmVyW2ldLT5uYW1lKFdFUiwwKSwgb2JqZWN0X25hbWUoZ2VnbmVyW2ldKSApOworCQl9CisJfQorCisJbWtfd2FpdGZvciggb2JqLT5RdWVyeVByb3AoUF9XQUlURk9SKSApOworCisJbWtfYXV0b2xvYWQoIG9iai0+UXVlcnlQcm9wKFBfQVVUT0xPQUQpICk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgbWtfd2FpdGZvciggbWl4ZWQgd2FpdGZvciApCit7CisJc3RyaW5nIHN0cjsKKwlpbnQgaTsKKworCWlmKCAhcG9pbnRlcnAod2FpdGZvcikgfHwgc2l6ZW9mKHdhaXRmb3IpPT0wICkKKwkJcmV0dXJuOworCXN0ciA9ICJXYWl0aW5nIGZvcjogIjsKKwlmb3IoIGk9c2l6ZW9mKHdhaXRmb3IpLTE7IGk+MDsgaS0tICkKKwkJc3RyICs9IHdhaXRmb3JbaV0gKyAiLCAiOworCXN0ciArPSB3YWl0Zm9yWzBdOworCXdyaXRlKCBzdHIrIlxuIiApOworfQorCQorc3RhdGljIHZvaWQgbWtfYXV0b2xvYWQoIG1peGVkIGF1dG9sb2FkICkKK3sKKwlzdHJpbmcgc3RyLCAqb2JqbGlzdDsKKwlpbnQgaTsKKworCWlmKCAhbWFwcGluZ3AoYXV0b2xvYWQpICkKKwkJcmV0dXJuOworCXN0ciA9ICJBdXRvbG9hZC4uLjogIjsKKwlvYmpsaXN0ID0gbV9pbmRpY2VzKGF1dG9sb2FkKTsKKwlmb3IoIGk9c2l6ZW9mKG9iamxpc3QpLTE7IGk+PTA7IGktLSApCisJeworCQlzdHIgKz0gIlwiIiArIG9iamxpc3RbaV0gKyAiXCJcbiI7CisJCWlmKCBpPjAgKQorCQkJc3RyICs9ICIgICAgICAgICAgICAgIjsKKwl9CisJd3JpdGUoIHN0ciApOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZW1vcnlfbGluZSggc3RyaW5nIGtleSwgb2JqZWN0IGRhdGEsIGludCBmbGFnICkKK3sKKyAgcHJpbnRmKCAiICUtMTBzJXMgIiwga2V5LCAoZmxhZyA/ICI+IiA6ICI9IikgKTsKKyAgZHVtcF9vYmooIGRhdGEsIDEzICk7Cit9CisJCitzdGF0aWMgaW50IGNtZF9tZW1vcnkoKQoreworICBpbnQgaTsKKyAgaWYoICFzaXplb2YobWVtb3J5KSApCisgICAgcmV0dXJuIG1lbW8oICJLZWluZSBWYXJpYWJsZW4gZGVmaW5pZXJ0IiApOworCisgIHdhbGtfbWFwcGluZyggbWVtb3J5LCAjJ3ByaW50X21lbW9yeV9saW5lICk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9hcnJheSgpCit7CisgIG1peGVkICphcnJheTsKKyAgbWl4ZWQgb2I7CisKKwlpZiggIXNpemVvZihzdGFjaykgKQorCQlyZXR1cm4gZXJyb3IoICJhcnJheTogRGVyIFN0YWNrIGlzdCBsZWVyIiApOworICBhcnJheSA9ICh7fSk7CisgIHdoaWxlKCBzaXplb2Yoc3RhY2spICYmIChvYj1wb3AoKSkgJiYgb2IhPSI7IiApCisgICAgYXJyYXkgPSAoe29ifSkgKyBhcnJheTsKKyAgcHVzaCggYXJyYXkgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfc3BsaXQoKQoreworICBtaXhlZCAqYXJyYXk7CisgIGludCBpOworCisJaWYoICFwb2ludGVycCh0b3AoKSkgKQorCQlyZXR1cm4gZXJyb3IoICJzcGxpdDogVE9TIGlzdCBrZWluIEFycmF5IiApOworICBhcnJheT1wb3AoKTsKKyAgaWYoIHNpemVvZihzdGFjaykgKQorICAgIHB1c2goICI7IiApOworICBmb3IoIGk9MDsgaTxzaXplb2YoYXJyYXkpOyBpKysgKQorICAgIHB1c2goYXJyYXlbaV0pOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9wbGF5ZXIoKQoreworCW9iamVjdCBvYjsKKwlzdHJpbmcgc3RyOworCisJc3RyID0gdG9wKCk7CisJaWYoICFzdHJpbmdwKHN0cikgKQorCQlyZXR1cm4gZXJyb3IoICJwbGF5ZXI6IFRPUyBpc3Qga2VpbiBTdHJpbmciICk7CisJb2IgPSBiZWNvbWVzX3BsKCk7CisJaWYoICFvYiApCisJCXJldHVybiBlcnJvciggInBsYXllcjogS2VpbmVuIFNwaWVsZXIgbmFtZW5zIFwiIitzdHIrIlwiIGdlZnVuZGVuIiApOworCS8vcG9wKCk7CisJLy9wdXNoKG9iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfb2JqZWN0KCkKK3sKKwlvYmplY3Qgb2I7CisJc3RyaW5nIGVycixmbmFtOworCisJaWYoICFzdHJpbmdwKHRvcCgpKSApCisJCXJldHVybiBlcnJvciggIm9iamVjdDogVE9TIGlzdCBrZWluIFN0cmluZyIgKTsKKwlvYiA9IGZpbmRfb2JqZWN0KHRvcCgpKTsKKwlpZiggIW9iICkKKwl7CisJCWlmKCAhKGZuYW09dGhpc19wbGF5ZXIoKS0+ZmluZF9maWxlKHRvcCgpLCIuYyIpKSApCisJCQlyZXR1cm4gZXJyb3IoICJvYmplY3Q6IEtlaW4gT2JqZWt0IG5hbWVucyBcIiIrdG9wKCkrIlwiIGdlZnVuZGVuIiApOworCQlpZiggZXJyPShjYXRjaChjYWxsX290aGVyKGZuYW0sIj8iKSkpICkKKwkJCXJldHVybiBlcnJvciggIm9iamVjdDogRmVobGVyIGJlaW0gTGFkZW46ICIrZXJyWzEuLjwzXSApOworCQlvYiA9IGZpbmRfb2JqZWN0KGZuYW0pOworCX0KKwlwb3AoKTsKKwlwdXNoKG9iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfbGl2aW5nKCkKK3sKKwlvYmplY3Qgb2I7CisJaWYoICFzdHJpbmdwKHRvcCgpKSApCisJCXJldHVybiBlcnJvciggIm9iamVjdDogVE9TIGlzdCBrZWluIFN0cmluZyIgKTsKKwlvYiA9IGZpbmRfbGl2aW5nKHRvcCgpKTsKKwlpZiggIW9iICkKKwkJcmV0dXJuIGVycm9yKCAib2JqZWN0OiBLZWluIE9iamVrdCBuYW1lbnMgXCIiK3RvcCgpKyJcIiBnZWZ1bmRlbiIgKTsKKwlwb3AoKTsKKwlwdXNoKG9iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfc2F5KCkKK3sKKwltaXRfc2F5ID0gIW1pdF9zYXk7CisJaWYoIG1pdF9zYXkgKQorCQltZW1vKCAiTWVsZHVuZ2VuIGFuIE1pdHNwaWVsZXIgYW4iICk7CisJZWxzZQorCQltZW1vKCAiTWVsZHVuZ2VuIGFuIE1pdHNwaWVsZXIgYXVzIiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9uYW1lcygpCit7CisJbWl0X25hbWVuID0gIW1pdF9uYW1lbjsKKwlpZiggbWl0X25hbWVuICkKKwkJbWVtbyggIk5hbWVuIHdlcmRlbiBhbmdlemVpZ3QiICk7CisJZWxzZQorCQltZW1vKCAiTmFtZW4gd2VyZGVuIG5pY2h0IGFuZ2V6ZWlndCIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfc2VjdXJlaW52KCkKK3sKKwlzZWN1cmVpbnYgPSAhc2VjdXJlaW52OworCWlmKCBzZWN1cmVpbnYgKQorCQltZW1vKCAiSW52ZW50b3J5IHdpcmQgdWViZXJ3YWNodCIgKTsKKwllbHNlCisJCW1lbW8oICJJbnZlbnRvcnkgd2lyZCBuaWNodCB1ZWJlcndhY2h0IiApOworCXNldF9oZWFydF9iZWF0KHNlY3VyZWludik7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2xvZ2FjY2VzcygpCit7CisJZG9sb2dhY2Nlc3MgPSAhZG9sb2dhY2Nlc3M7CisJaWYoIGRvbG9nYWNjZXNzICkKKwkJbWVtbyggIlp1Z3JpZmZlIHdlcmRlbiBnZW1lbGRldCIgKTsKKwllbHNlCisJCW1lbW8oICJadWdyaWZmZSB3ZXJkZW4gbmljaHQgZ2VtZWxkZXQiICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2Rlc3RydWN0X2JhbmcoKQoreworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggImRlc3RydWN0OiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCWRlc3RydWN0KHBvcCgpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfZGVzdHJ1Y3QoKQoreworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggInJlbW92ZTogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwltZW1vKCAiZGVzdHJ1Y3Q6IFRPUyB3aXJkICdyZW1vdmVkJyEiICk7CisJdG9wKCktPnJlbW92ZSgpOworCWlmKCB0b3AoKSApCisJCW1lbW8oICJkZXN0cnVjdDogVE9TIGxlYnQgbm9jaC4iICk7CisJZWxzZQorCQlwb3AoKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfcmVtb3ZlKCkKK3sKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJyZW1vdmU6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJdG9wKCktPnJlbW92ZSgpOworCWlmKCB0b3AoKSApCisJCW1lbW8oICJkZXN0cnVjdDogVE9TIGxlYnQgbm9jaC4iICk7CisJZWxzZQorCQlwb3AoKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfdXBkYXRlKCkKK3sKKwlvYmplY3QgYmx1ZTsKKworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggInVwZGF0ZTogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwlibHVlID0gZmluZF9vYmplY3Qob2xkX2V4cGxvZGUob2JqZWN0X25hbWUodG9wKCkpLCIjIilbMF0pOworCWJsdWUtPnJlbW92ZSgpOworCWlmKCBibHVlICkKKwkJbWVtbyggInVwZGF0ZTogVE9TIGxlYnQgbm9jaCIgKTsKKwllbHNlCisJCXBvcCgpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF91cGRhdGVfYmFuZygpCit7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAidXBkYXRlOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCWRlc3RydWN0KGZpbmRfb2JqZWN0KG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHBvcCgpKSwiIyIpWzBdKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3Jvb211cGRhdGUoKQoreworCXJldHVybiBkb19yb29tdXBkYXRlKCBGQUxTRSwgRkFMU0UgKTsKK30KKworc3RhdGljIGludCBjbWRfcm9vbXVwZGF0ZV9iYW5nKCkKK3sKKwlyZXR1cm4gZG9fcm9vbXVwZGF0ZSggVFJVRSwgRkFMU0UgKTsKK30KKworc3RhdGljIGludCBjbWRfZXh0cm9vbXVwZGF0ZSgpCit7CisJcmV0dXJuIGRvX3Jvb211cGRhdGUoIEZBTFNFLCBUUlVFICk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2V4dHJvb211cGRhdGVfYmFuZygpCit7CisJcmV0dXJuIGRvX3Jvb211cGRhdGUoIFRSVUUsIFRSVUUgKTsKK30KKworLy8gSGlsZnNmdW5rdGlvbmVuIHp1bSBGaWx0ZXJuIHZvbiBJdGVtcworc3RhdGljIG9iamVjdCAqY29sbGVjdF9pdGVtczsKK3N0YXRpYyB2b2lkIGNvbGxlY3QoIG9iamVjdCogZGF0YSApIHsgY29sbGVjdF9pdGVtcyArPSAoeyBkYXRhWzBdIH0pOyB9CisKK3N0YXRpYyBpbnQgZG9fcm9vbXVwZGF0ZSggaW50IGRlc3RmbGFnLCBpbnQgbm9pdGVtcyApCit7CisJb2JqZWN0IHRtcHJvb20sbmV3cm9vbTsKKwlvYmplY3QgKmludjsKKwlzdHJpbmcgZXJybXNnOworCXN0cmluZyAqZmlsZTsKKwlvYmplY3QgKml0ZW1zOworCWludCBpOworCisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAicm9vbXVwZGF0ZTogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwlmaWxlID0gb2xkX2V4cGxvZGUoIG9iamVjdF9uYW1lKCB0b3AoKSApLCAiIyIgKTsKKwlpZiggc2l6ZW9mKGZpbGUpID4gMSApCisJCXJldHVybiBlcnJvciggInJvb211cGRhdGU6IFRPUyBpc3Qga2VpbmUgQmx1ZXByaW50IiApOworCWlmKCBmaWxlWzBdID09ICIvcm9vbS92b2lkIiApCisJCXJldHVybiBlcnJvciggInJvb211cGRhdGU6IERpZSBgdm9pZCcgZGFyZiBuaWNodCBnZXVwZGF0ZXQgd2VyZGVuIiApOworCisJLy8gLS0tLS0gUmV0dHVuZwkKKwl0ZWxsX3Jvb20oIHRvcCgpLAorCQkiRGVyIFJhdW0gdmVyc2Nod2ltbXQgdm9yIERlaW5lbiBBdWdlbiwgdW0gc2ljaCB6dSBlcm5ldWVybi5cbiIKKwkpOworCXRtcHJvb20gPSBjbG9uZV9vYmplY3QoICIvcm9vbS92b2lkIiApOworCisJaWYoIG5vaXRlbXMgKQorCSAgLy8gTnVyIFNwaWVsZXIga29tbWVuIHJhdXMuCisJCWludiA9IGZpbHRlciggYWxsX2ludmVudG9yeSh0b3AoKSksICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZSApOworCWVsc2UKKwl7IC8vIERpbmdlLCBkaWUgUF9JVEVNUyBzaW5kLCBibGVpYmVuIGRhIQorCQljb2xsZWN0X2l0ZW1zID0gKHt9KTsKKwkJbWFwKCB0b3AoKS0+UXVlcnlQcm9wKFBfSVRFTVMpLCAjJ2NvbGxlY3QgKTsgCisJCWludiA9IGFsbF9pbnZlbnRvcnkodG9wKCkpIC0gY29sbGVjdF9pdGVtczsKKwl9CisKKwlmb3IoIGk9c2l6ZW9mKGludiktMTsgaT49MDsgaS0tICkKKwkJaW52W2ldLT5tb3ZlKCB0bXByb29tLCBNX05PQ0hFQ0sgfCBNX1NJTEVOVCB8IE1fTk9fU0hPVyApOworCisJLy8gLS0tLS0gVmVybmljaHR1bmcKKwlpZiggZGVzdGZsYWcgKQorCQlkZXN0cnVjdCggcG9wKCkgKTsKKwllbHNlCisJeworCQl0b3AoKS0+cmVtb3ZlKCk7CisJCWlmKCB0b3AoKSApCisJCQltZW1vKCAicm9vbXVwZGF0ZSA6IFRPUyBpc3QgbmljaHQgdmVyc2Nod3VuZGVuLiIgKTsKKwkJZWxzZQorCQkJcG9wKCk7CisJfQorCisJLy8gLS0tLS0gTmV1ZXJzY2hhZmZ1bmcKKwllcnJtc2cgPSBjYXRjaCggY2FsbF9vdGhlciggZmlsZVswXSwgIj8iICkgKTsKKwlpZiggZXJybXNnICkKKwl7CisJCXRlbGxfcm9vbSggdG1wcm9vbSwgIkRlciBSYXVtIHZlcmJsZWljaHQgaW4gZWluIE5pY2h0cy5cbiIgKTsKKwkJcHVzaCggZmlsZVswXSApOworCQlyZXR1cm4gZXJyb3IoICJ1cGRhdGVyb29tOiAiICsgZXJybXNnWzEuLjwyXSApOworCX0KKworCS8vIC0tLS0tIFJlc3RhdXJpZXJ1bmcKKwluZXdyb29tID0gZmluZF9vYmplY3QoIGZpbGVbMF0gKTsKKwlmb3IoIGk9c2l6ZW9mKGludiktMTsgaT49MDsgaS0tICkKKwkJaWYoIG9iamVjdHAoaW52W2ldKSApIC8vIE9iamVrdGUga29lbm50ZW4gc2ljaCBiZWltIGVyc3RlbiBtb3ZlIHplcnN0b2VyZW4uCisJCQlpbnZbaV0tPm1vdmUoIG5ld3Jvb20sIE1fTk9DSEVDSyB8IE1fU0lMRU5UIHwgTV9OT19TSE9XICk7CisJdGVsbF9yb29tKCBuZXdyb29tLCAiRGllIEtvbnR1cmVuIHdlcmRlbiB3aWVkZXIgc2NoYXJmLlxuIiApOworCWRlc3RydWN0KCB0bXByb29tICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2Nsb25lKCkKK3sKKwlpZiggIXN0cmluZ3AodG9wKCkpICkKKwkJcmV0dXJuIGVycm9yKCAiY2xvbmU6IFRPUyBpc3Qga2VpbiBTdHJpbmciICk7CisJaWYoIGZpbGVfc2l6ZSh0b3AoKSsiLmMiKTw9MCApCisJCXJldHVybiBlcnJvciggImNsb25lOiBLZWluIHNvbGNoZXMgRmlsZSIgKTsKKwlwdXNoKGNsb25lX29iamVjdChwb3AoKSkpOworCS8vZG9fbW92ZSggdG9wKCksIGVudmlyb25tZW50KFBMKSApOworCS8vdG9wKCktPm1vdmUoUEwsTV9HRVR8TV9TSUxFTlQpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9tb3ZlKCkKK3sKKwlvYmplY3Qgb2I7CisKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJtb3ZlOiBaaWVsIGlzdCBrZWluIE9iamVrdCIgKTsKKwlvYiA9IHBvcCgpOworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggIm1vdmU6IEtlaW4gc29sY2hlciBHZWdlbnN0YW5kIiApOworCWRvX21vdmUoIHBvcCgpLCBvYiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9jbGVhbm9mX2JhbmcoKQoreworCXJldHVybiBkb19jbGVhbm9mKCBUUlVFICk7Cit9CisKK3N0YXRpYyBpbnQgY21kX2NsZWFub2YoKQoreworCXJldHVybiBkb19jbGVhbm9mKCBGQUxTRSApOworfQorCitzdGF0aWMgaW50IGRvX2NsZWFub2YoIGludCBzdHJvbmcgKQoreworCW9iamVjdCAqaW52OworCWludCBpOworCXN0cmluZyBjbGVhbl9pZDsKKworCWlmKCAhc3RyaW5ncCh0b3AoKSkgKQorCQlyZXR1cm4gZXJyb3IoICJjbGVhbm9mOiBUT1MgaXN0IGtlaW4gU3RyaW5nIiApOworCWNsZWFuX2lkID0gcG9wKCk7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwl7CisJCXB1c2goIGNsZWFuX2lkICk7CisJCXJldHVybiBlcnJvciggImNsZWFub2Y6IEtlaW4gT2JqZWt0IHp1bSBMZWVyZW4iICk7CisJfQorCWZvciggaT0wLCBpbnY9YWxsX2ludmVudG9yeShwb3AoKSk7IGk8c2l6ZW9mKGludik7IGkrKyApCisJCWlmKCBpbnZbaV0tPmlkKGNsZWFuX2lkKSApCisJCXsKKwkJCWlmKCBzdHJvbmcgKQorCQkJCWRlc3RydWN0KCBpbnZbaV0gKTsKKwkJCWVsc2UKKwkJCQlpbnZbaV0tPnJlbW92ZSgpOworCQl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3Nub29wZXJzKCkKK3sKKwlvYmplY3QqIHUsIHNub29wZXI7CisJaW50IGksIGZsYWc7CisKKwlmbGFnID0gMDsKKwl1ID0gdXNlcnMoKTsKKwlmb3IoIGk9MDsgaTxzaXplb2YodSk7IGkrKyApCisJeworCQlpZiggc25vb3BlciA9IHF1ZXJ5X3Nub29wKHVbaV0pICkKKwkJeworCQkJZmxhZyA9IDE7CisJCQlwcmludGYoICIlcyB3aXJkIGdlc25vb3BlZCB2b246ICVzLlxuIiwKKwkJCQljYXBpdGFsaXplKGdldHVpZCh1W2ldKSksIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSApOworCQl9CisJfQorCWlmKCAhZmxhZyApCisJCW1lbW8oICJNb21lbnRhbiB3aXJkIG5pZW1hbmQgZ2Vzbm9vcGVkIiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9waW5nKCkKK3sKKwlvYmplY3QgcGw7CisKKwlpZiggIWJlY29tZXNfcGwoKSApCisJCXJldHVybiBlcnJvciggInBpbmc6IFRPUyBpc3Qga2VpbiBTcGllbGVyIiApOworCisJcGw9cG9wKCk7CisJY2FsbF9vdXQoICJwaW5nIiwgMCwgKHsgcGwsIDUgfSkgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgcGluZyggbWl4ZWQqIGFyZ3YgKQoreworCWlmKCAhYXJndlswXSB8fCAtLWFyZ3ZbMV0gPCAwICkgcmV0dXJuOworCXRlbGxfb2JqZWN0KCBhcmd2WzBdLCBCRUVQK1BMLT5uYW1lKFdFUikrIiBwaW5ndCBEaWNoIGFuLlxuIiApOworCWNhbGxfb3V0KCAicGluZyIsIDEsIGFyZ3YgKTsKK30KKworc3RhdGljIHZvaWQgZG9fY2FsbG91dGluZm8oIG1peGVkKiBjYWxsICkKK3sKKwlpbnQgbCxpOworCisJaWYoIHBvaW50ZXJwKGNhbGwpICkKKwl7CisJCXByaW50ZiggIiU1ZDolTy0+JU8oIiwgY2FsbFsyXSwgY2FsbFswXSwgY2FsbFsxXSk7CisJCWlmKCAobD1zaXplb2YoY2FsbCkpPjMgKSB7CisJCQlmb3IoIDsgbD49MyAmJiAhY2FsbFstLWxdOyApIDsKKwkJCWZvciggaT0zOyBpPD1sOyBpKysgKSBwcmludGYoICIlTyVzIiwgY2FsbFtpXSwgKGk9PWwpPyIiOiIsIiApOworCQl9CisJCXdyaXRlKCIpXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY21kX2NhbGxvdXRzX2JhbmcoKQoreworCW1peGVkICpjYWxsczsKKwlvYmplY3Qgb2JqOworCXN0cmluZyBuYW1lOworCWludCBpLGo7CisKKwljYWxscyA9IGNhbGxfb3V0X2luZm8oKTsKKwlpZiggIXBvaW50ZXJwKGNhbGxzKSB8fCAhc2l6ZW9mKGNhbGxzKSApCisJeworCQltZW1vKCAiS2VpbmUgQ2FsbG91dHMgdm9yaGFuZGVuIiApOworCQlyZXR1cm4gVFJVRTsKKwl9CisJbWFwKCBjYWxscywgIydkb19jYWxsb3V0aW5mbyApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBkb19jYWxsb3V0aW5mbzIoIG1peGVkKiBjYWxsLCBzdHJpbmcgc3RyICkKK3sKKwlzdHJpbmcgczsKKwlpbnQgaSxsOworCisJaWYoIHBvaW50ZXJwKGNhbGwpICkKKwl7CisJCXMgPSBzcHJpbnRmKCAiJTVkOiVPLT4lTygiLCBjYWxsWzJdLCBjYWxsWzBdLCBjYWxsWzFdKTsKKwkJaWYoIHNpemVvZihleHBsb2RlKHMsc3RyKSkgPiAxICkKKwkJeworCQkJd3JpdGUoIHMgKTsKKwkJCWlmKCAobD1zaXplb2YoY2FsbCkpPjMgKSB7CisJCQkJZm9yKCA7IGw+PTMgJiYgIWNhbGxbLS1sXTsgKSA7CisJCQkJZm9yKCBpPTM7IGk8PWw7IGkrKyApIHByaW50ZiggIiVPJXMiLCBjYWxsW2ldLCAoaT09bCk/IiI6IiwiICk7CisJCQl9CisJCQl3cml0ZSgiKVxuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgY21kX2NhbGxvdXRzKCkKK3sKKwltaXhlZCAqY2FsbHM7CisJb2JqZWN0IG9iajsKKwlzdHJpbmcgc3RyOworCWludCBpLGo7CisKKwlpZiggIXN0cmluZ3AodG9wKCkpICkKKwkJcmV0dXJuIGVycm9yKCAiVE9TIGlzdCBrZWluIFN0cmluZyIgKTsKKwlzdHIgPSBwb3AoKTsKKwljYWxscyA9IGNhbGxfb3V0X2luZm8oKTsKKwlpZiggIXBvaW50ZXJwKGNhbGxzKSB8fCAhc2l6ZW9mKGNhbGxzKSApCisJeworCQltZW1vKCAiS2VpbmUgQ2FsbG91dHMgdm9yaGFuZGVuIiApOworCQlyZXR1cm4gVFJVRTsKKwl9CisJbWFwKCBjYWxscywgIydkb19jYWxsb3V0aW5mbzIsIHN0ciApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9oZWFydGJlYXRzKCkKK3sKKwltaXhlZCAqYmVhdHM7CisJaW50IGk7CisJb2JqZWN0IGVudjsKKwlzdHJpbmcgZW5hbTsKKworCWJlYXRzID0gaGVhcnRfYmVhdF9pbmZvKCk7CisJaWYoICFwb2ludGVycChiZWF0cykgfHwgIXNpemVvZihiZWF0cykgKQorCXsKKwkJbWVtbyggIktlaW5lIEhlYXJ0YmVhdHMgdm9yaGFuZGVuIiApOworCQlyZXR1cm4gVFJVRTsKKwl9CisJZm9yKCBpPTA7IGk8c2l6ZW9mKGJlYXRzKTsgaSsrICkKKwl7CisJCWVudiA9IGVudmlyb25tZW50KGJlYXRzW2ldKTsKKwkJZW5hbSA9IGVudiA/IG9iamVjdF9uYW1lKGVudikgOiAiLS0gbmlyZ2VuZHMgLS0iOworCQlwcmludGYoICIlLTM1cyAlLTM1c1xuIiwgb2JqZWN0X25hbWUoYmVhdHNbaV0pLCBlbmFtICk7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF93ZXIoKQoreworCW9iamVjdCogcHBsOworCXN0cmluZyogcGw7CisJaW50IGk7CisKKwlwcGwgPSBzb3J0X2FycmF5KCB1c2VycygpLCBsYW1iZGEoICh7ICd4LCAneSB9KSwKKwkJKHsgIyc8LCAoeyAjJ3F1ZXJ5X2lwX251bWJlciwgJ3ggfSksICh7ICMncXVlcnlfaXBfbnVtYmVyLCAneSB9KSB9KQorCSkpOworCXBsID0gKHt9KTsKKwlmb3IoIGk9MDsgaTxzaXplb2YocHBsKTsgaSsrICkKKwl7CisJCXBsICs9ICh7IHNwcmludGYoICIlJy4nLTE0cyAlLTE1cyAlM2QgJXMgXG4iLAorCQkJCWNhcGl0YWxpemUoZ2V0ZXVpZChwcGxbaV0pKSwKKwkJCQlxdWVyeV9pcF9udW1iZXIocHBsW2ldKSwKKwkJCQlxdWVyeV93aXpfbGV2ZWwocHBsW2ldKT4wID8gcXVlcnlfd2l6X2xldmVsKHBwbFtpXSkKKwkJCQkJOiBwcGxbaV0tPlF1ZXJ5UHJvcChQX0xFVkVMKSwKKwkJCQlxdWVyeV93aXpfbGV2ZWwocHBsW2ldKT4wID8gIlciIDogIlAiCisJCSkgfSk7CisJfQorCXdyaXRlKCBpbXBsb2RlKHBsLCIiKSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9kZWJ1Z2luZm8oKQoreworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggImRpbmZvOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCWRlYnVnX2luZm8oIDAsIHBvcCgpICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3ByZXR0eSgpCit7CisJcHJldHR5ID0gIXByZXR0eTsKKwlpZiggcHJldHR5ICkKKwkJbWVtbyggIlNjaG9lbm1vZHVzIGFuIiApOworCWVsc2UKKwkJbWVtbyggIlNjaG9lbm1vZHVzIGF1cyIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfZG9wcm9maWxlKCkKK3sKKwlkb19wcm9maWxlPSFkb19wcm9maWxlOworCWlmKCBkb19wcm9maWxlICkKKwkJbWVtbyggIlByb2ZpbGUgd2lyZCBnZWxhZGVuIiApOworCWVsc2UKKwkJbWVtbyggIlByb2ZpbGUgd2lyZCBuaWNodCBnZWxhZGVuIiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9ldmFsdWF0ZSgpCit7CisJc3RyaW5nIHN0cjsKKwlpZiggIXNpemVvZihzdGFjaykgKSByZXR1cm4gZXJyb3IoICJldmFsdWF0ZTogU3RhY2sgaXN0IGxlZXIiICk7CisJaWYoICFzdHJpbmdwKHRvcCgpKSApIHJldHVybiBlcnJvciggImV2YWx1YXRlOiBUT1MgaXN0IGtlaW4gU3RyaW5nIiApOworCXN0ciA9IHBvcCgpOworCXJldHVybiBkb19jbWQoIHN0ciApOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9tZW1vcnkoIHN0cmluZyBuYW0sIHN0cmluZyBzdHIsIGludCBmbGFnLCBzdHJpbmcgZmlsZSApCit7CisJaWYoIGZsYWcgKSB3cml0ZV9maWxlKCBmaWxlLCBuYW0gKyAiID0gIiArIHN0ciArICJcbiIgKTsKK30KKworc3RhdGljIGludCBjbWRfZHVtcCgpCit7CisJc3RyaW5nIGZpbGU7CisKKwlpZiggIXNpemVvZihzdGFjaykgfHwgIXN0cmluZ3AodG9wKCkpICkKKwkJZmlsZSA9ICIvcGxheWVycy8iK2dldHVpZChQTCkrIi8ubWVtb3J5Lm8iOworCWVsc2UKKwkJZmlsZSA9IHBvcCgpOworCXJtKCBmaWxlICk7CisJd3JpdGVfZmlsZSggZmlsZSwgIiMgRHVtcCBkZXMgVGVsbGVyc3RhcGVscyB2b20gIiArIGR0aW1lKHRpbWUoKSkgKyAiXG4iICk7CisJd3JpdGVfZmlsZSggZmlsZSwgIiMgT3duZXIgPSAiK2NhcGl0YWxpemUoZ2V0dWlkKFBMKSkrIlxuIiApOworCXdhbGtfbWFwcGluZyggbWVtb3J5LCAjJ3dyaXRlX21lbW9yeSwgZmlsZSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IHJlc3RvcmVfbGluZSggc3RyaW5nIGxpbmUgKQoreworCXN0cmluZyBuYW0sc3RyOworCWlmKCBzc2NhbmYoIGxpbmUsICIlcyA9ICVzIiwgbmFtLCBzdHIgKSAhPSAyICkKKwkJcmV0dXJuIGVycm9yKCAicmVzdG9yZTogRmVobGVyIGltIGZpbGUiICk7CisJbWVtb3J5ICs9IChbIG5hbTogc3RyOyAxIF0pOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRfcmVzdG9yZSgpCit7CisJc3RyaW5nIHN0ciwgKmxpbmVzOworCisJaWYoICFzaXplb2Yoc3RhY2spIHx8ICFzdHJpbmdwKHRvcCgpKSApCisJCXN0ciA9ICIvcGxheWVycy8iK2dldHVpZChQTCkrIi8ubWVtb3J5Lm8iOworCWVsc2UKKwkJc3RyID0gcG9wKCk7CisKKwlpZihmaWxlX3NpemUoc3RyKTw9MCkKKwkJcmV0dXJuIGVycm9yKCAicmVzdG9yZToga2FubiAnIitzdHIrIicgbmljaHQgbGFkZW4iICk7CisJbGluZXMgPSByZWdleHAoIG9sZF9leHBsb2RlKCByZWFkX2ZpbGUoc3RyKSwgIlxuIiApLCAiXlteI10iICk7CisJbWFwKCBsaW5lcywgIydyZXN0b3JlX2xpbmUgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfaWYoKQoreworCWlmKCBzaXplb2Yoc3RhY2spIDwgMyApCisJCXJldHVybiBlcnJvciggImlmOiB6dXdlbmlnIEFyZ3VtZW50ZSIgKTsKKwlpZiggIXBvcCgpICkKKwkJY21kX3N3YXAoKTsKKwlwb3AoKTsKKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvdF9lZnVuLmMgYi9vYmovdG9vbHMvdGVsbGVyL3RfZWZ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTJkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL3RfZWZ1bi5jCkBAIC0wLDAgKzEsNDE2IEBACitzdGF0aWMgZWZ1bl9yZWdleHAoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiByZWdleHAoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fYWxsX2ludmVudG9yeSggYXJnICkKK3sKKwlyZXR1cm4gYWxsX2ludmVudG9yeSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2JyZWFrX3N0cmluZyggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIGJyZWFrX3N0cmluZyggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl9jYXBpdGFsaXplKCBhcmcgKQoreworCXJldHVybiBjYXBpdGFsaXplKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fY2F0KCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gY2F0KCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX2NsZWFyX2JpdCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIGNsZWFyX2JpdCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9jcnlwdCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIGNyeXB0KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2N0aW1lKCBhcmcgKQoreworCXJldHVybiBjdGltZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2RlYnVnX2luZm8oIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBkZWJ1Z19pbmZvKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2RlZXBfaW52ZW50b3J5KCBhcmcgKQoreworCXJldHVybiBkZWVwX2ludmVudG9yeSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2Vudmlyb25tZW50KCBhcmcgKQoreworCXJldHVybiBlbnZpcm9ubWVudCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2V4cGxvZGUoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBvbGRfZXhwbG9kZSggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9maWxlX25hbWUoIGFyZyApCit7CisJcmV0dXJuIG9iamVjdF9uYW1lKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZmlsZV9zaXplKCBhcmcgKQoreworCXJldHVybiBmaWxlX3NpemUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9maWx0ZXJfYXJyYXkoIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgKQoreworCXJldHVybiBmaWx0ZXIoIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgKTsKK30KKworc3RhdGljIGVmdW5fZmluZF9jYWxsX291dCggYXJnICkKK3sKKwlyZXR1cm4gZmluZF9jYWxsX291dCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbmRfbGl2aW5nKCBhcmcgKQoreworCXJldHVybiBmaW5kX2xpdmluZyggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbmRfb2JqZWN0KCBhcmcgKQoreworCXJldHVybiBmaW5kX29iamVjdCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbmRfcGxheWVyKCBhcmcgKQoreworCXJldHVybiBmaW5kX3BsYXllciggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2Z1bmN0aW9uX2V4aXN0cyggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cyggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9pbXBsb2RlKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gaW1wbG9kZSggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9pbnRlcmFjdGl2ZSggYXJnICkKK3sKKwlyZXR1cm4gaW50ZXJhY3RpdmUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9pbnRwKCBhcmcgKQoreworCXJldHVybiBpbnRwKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fbGFzdF9yZWJvb3RfdGltZSgpCit7CisJcmV0dXJuIGxhc3RfcmVib290X3RpbWUoKTsKK30KKworc3RhdGljIGVmdW5fbGl2aW5nKCBhcmcgKQoreworCXJldHVybiBsaXZpbmcoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9sb3dlcl9jYXNlKCBhcmcgKQoreworCXJldHVybiBsb3dlcl9jYXNlKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZ2V0X2RpciggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIGdldF9kaXIoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fbWFwX2FycmF5KCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0ICkKK3sKKwlyZXR1cm4gbWFwKCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0ICk7Cit9CisKK3N0YXRpYyBlZnVuX21lbWJlciggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIG1lbWJlciggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9vYmplY3RwKCBhcmcgKQoreworCXJldHVybiBvYmplY3RwKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcG9pbnRlcnAoIGFyZyApCit7CisJcmV0dXJuIHBvaW50ZXJwKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcHJlc2VudCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHByZXNlbnQoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fcHJvY2Vzc19zdHJpbmcoIGFyZyApCit7CisJcmV0dXJuIHByb2Nlc3Nfc3RyaW5nKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcXVlcnlfYWN0aW9ucyggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHF1ZXJ5X2FjdGlvbnMoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fcXVlcnlfaWRsZSggYXJnICkKK3sKKwlyZXR1cm4gcXVlcnlfaWRsZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3F1ZXJ5X2lwX25hbWUoIGFyZyApCit7CisJcmV0dXJuIHF1ZXJ5X2lwX25hbWUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9xdWVyeV9pcF9udW1iZXIoIGFyZyApCit7CisJcmV0dXJuIHF1ZXJ5X2lwX251bWJlciggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3F1ZXJ5X2xvYWRfYXZlcmFnZSgpCit7CisJcmV0dXJuIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpOworfQorCitzdGF0aWMgZWZ1bl9xdWVyeV9zbm9vcCggYXJnICkKK3sKKwlyZXR1cm4gcXVlcnlfc25vb3AoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9yYW5kb20oIGFyZyApCit7CisJcmV0dXJuIHJhbmRvbSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3JlYWRfYnl0ZXMoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiByZWFkX2J5dGVzKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3JlYWRfZmlsZSggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIHJlYWRfZmlsZSggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl9yZW1vdmVfY2FsbF9vdXQoIGFyZyApCit7CisJcmV0dXJuIHJlbW92ZV9jYWxsX291dCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3JlbW92ZV9pbnRlcmFjdGl2ZSggYXJnICkKK3sKKwlyZXR1cm4gcmVtb3ZlX2ludGVyYWN0aXZlKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcnVzYWdlKCkKK3sKKwlyZXR1cm4gcnVzYWdlKCk7Cit9CisKK3N0YXRpYyBlZnVuX3NheSggYXJnMSwgYXJnMiApCit7CisJaWYoICFhcmcyICkgcmV0dXJuIHNheSggYXJnMSApOworCXJldHVybiBzYXkoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fc2V0X2JpdCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHNldF9iaXQoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fc2V0X2hlYXJ0X2JlYXQoIGFyZyApCit7CisJcmV0dXJuIHNldF9oZWFydF9iZWF0KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fc2V0X2xpdmluZ19uYW1lKCBhcmcgKQoreworCXJldHVybiBzZXRfbGl2aW5nX25hbWUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9zaXplb2YoIGFyZyApCit7CisJcmV0dXJuIHNpemVvZiggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3NvcnRfYXJyYXkoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiBzb3J0X2FycmF5KCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3N0cmluZ3AoIGFyZyApCit7CisJcmV0dXJuIHN0cmluZ3AoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9zdHJsZW4oIGFyZyApCit7CisJcmV0dXJuIHNpemVvZiggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3RhaWwoIGFyZyApCit7CisJcmV0dXJuIHRhaWwoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9zaG91dCggYXJnICkKK3sKKwlyZXR1cm4gc2hvdXQoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl90ZWxsX29iamVjdCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHRlbGxfb2JqZWN0KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX3RlbGxfcm9vbSggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIHRlbGxfcm9vbSggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl90ZXN0X2JpdCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHRlc3RfYml0KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX3RpbWUoKQoreworCXJldHVybiB0aW1lKCk7Cit9CisKK3N0YXRpYyBlZnVuX3VuaXF1ZV9hcnJheSggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIHVuaXF1ZV9hcnJheSggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl91c2VycygpCit7CisJcmV0dXJuIHVzZXJzKCk7Cit9CisKK3N0YXRpYyBlZnVuX3ZlcnNpb24oKQoreworCXJldHVybiB2ZXJzaW9uKCk7Cit9CisKK3N0YXRpYyBlZnVuX3dyaXRlKCBhcmcgKQoreworCXJldHVybiB3cml0ZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3dyaXRlX2J5dGVzKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gd3JpdGVfYnl0ZXMoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fd3JpdGVfZmlsZSggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHdyaXRlX2ZpbGUoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fZ2V0ZXVpZCggYXJnICkKK3sKKwlyZXR1cm4gZ2V0ZXVpZCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2dldHVpZCggYXJnICkKK3sKKwlyZXR1cm4gZ2V0dWlkKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZmlyc3RfaW52ZW50b3J5KCBhcmcgKQoreworCXJldHVybiBmaXJzdF9pbnZlbnRvcnkoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9uZXh0X2ludmVudG9yeSggYXJnICkKK3sKKwlyZXR1cm4gbmV4dF9pbnZlbnRvcnkoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9pbmhlcml0X2xpc3QoIGFyZyApCit7CisJcmV0dXJuIGluaGVyaXRfbGlzdCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3N0cnN0ciggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIHN0cnN0ciggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl9wcm9ncmFtX3RpbWUoIGFyZyApCit7CisJcmV0dXJuIHByb2dyYW1fdGltZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2dldF9lcnJvcl9maWxlKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gZ2V0X2Vycm9yX2ZpbGUoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fc2V0X3Byb21wdCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHNldF9wcm9tcHQoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fZmlsdGVyX29iamVjdHMoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiBmaWx0ZXJfb2JqZWN0cyggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl9tYXBfb2JqZWN0cyggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIG1hcF9vYmplY3RzKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3RyYW5zcG9zZV9hcnJheSggYXJnICkKK3sKKwlyZXR1cm4gdHJhbnNwb3NlX2FycmF5KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSggYXJnICkKK3sKKwlyZXR1cm4gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3dpemxpc3QoIGFyZyApCit7CisJd2l6bGlzdCggYXJnICk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBlZnVuX21rZGlyKCBzdHIgKQoreworCXJldHVybiBta2Rpciggc3RyICk7Cit9CisKK3N0YXRpYyBlZnVuX3JtKCBzdHIgKQoreworCXJldHVybiBybSggc3RyICk7Cit9CisKK3N0YXRpYyBlZnVuX2NvdW50cnkoIHN0ciApCit7CisJcmV0dXJuIGNvdW50cnkoIHN0ciApOworfQorCitzdGF0aWMgZWZ1bl9kdGltZSggdmFsICkKK3sKKwlyZXR1cm4gZHRpbWUoIHZhbCApOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci90X3BsYXllci5jIGIvb2JqL3Rvb2xzL3RlbGxlci90X3BsYXllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MmIxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL3RfcGxheWVyLmMKQEAgLTAsMCArMSw2MCBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWndpc2NoZW5vYmpla3QgenVtIExlc2VuIGRlciBTcGllbGVyZGF0ZW4gYXVjaCB2b24gbmljaHRlaW5nZWxvZ2d0ZW4uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSAidGVsbGVyLmgiCisKK2luaGVyaXQgInN0ZC9wbGF5ZXIvYmFzZSI7CisKK2NyZWF0ZSgpIHsKKwl1c2VkX2F0dHJpYnV0ZXNfb2Zmc2V0cyA9IChbXSk7Cit9CisKK3N0cmluZyBuYW1lOworc3RyaW5nIHJhY2U7CitzdHJpbmcgaGFuZHM7CittYXBwaW5nIGF1dG9sb2FkOworCitfcXVlcnlfbmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0KK3BsYXllcm5hbWUoKSB7IHJldHVybiBuYW1lOyB9Citfc2V0X25hbWUoIHN0ciApIHsgcmV0dXJuIG5hbWU9c3RyOyB9CisKK19xdWVyeV9yYWNlKCkKK3sKKwlpZiggcmFjZSApIHJldHVybiByYWNlOworCQkKKwlyZXR1cm4gIi9zZWN1cmUvbWFzdGVyIgorCQktPnF1ZXJ5X3BsYXllcl9vYmplY3QobG93ZXJfY2FzZShuYW1lKSkKKwkJLT5RdWVyeVByb3AoUF9SQUNFKTsKK30KKworX3F1ZXJ5X2hhbmRzKCkKK3sKKwlpZiggaGFuZHMgKSByZXR1cm4gaGFuZHM7CisJcmV0dXJuICh7ICIgbmljaHQiLCAwIH0pOworfQorCitfcXVlcnlfYXV0b2xvYWQoKQoreworCXJldHVybiBhdXRvbG9hZDsKK30KKworTG9hZCggc3RyICkKK3sKKwlyZXN0b3JlX29iamVjdCggIi9zYXZlLyIrc3RyWzAuLjBdKyIvIitzdHIgKTsKK30KKworTm90bG9nZ2VkKCkgeyByZXR1cm4gVFJVRTsgfQorCitRdWVyeU1vbmV5KCkKK3sKKwlpZiggIW1hcHBpbmdwKGF1dG9sb2FkKSApCisJCXJldHVybiAwOworCXJldHVybiBhdXRvbG9hZFsiL2l0ZW1zL21vbmV5Il07Cit9CisKK1F1ZXJ5RW5lbWllcygpCit7CisgICAgICAgIHJldHVybiAoeyh7fSksKHt9KX0pOworfQorCitRdWVyeUF0dHJpYnV0ZU9mZnNldCggYXJyICkgeyByZXR1cm4gIj8iOyB9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL3RlbGxlci5jIGIvb2JqL3Rvb2xzL3RlbGxlci90ZWxsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjM0ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci90ZWxsZXIuYwpAQCAtMCwwICsxLDY4NiBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGVsbGVyc3RhcGVsLCBlaW4gU3RhY2tvcmllbnRpZXJ0ZXMgbWFnaWVydG9vbC4KKy8vIFJ1bWF0YSAxNS4wOS45MworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2luY2x1ZGUgInRlbGxlci5oIgoraW5oZXJpdCAic3RkL3NlY3VyZV90aGluZyI7Citpbmhlcml0IFRfQ01EUzsKK2luaGVyaXQgVF9FRlVOOworaW5oZXJpdCAic3RkL21vcmUiOworCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKworbm9zYXZlIG1hcHBpbmcgdGNvbW1hbmRzOworbm9zYXZlIHN0cmluZyBvd25lcl9uYW1lOworCit2b2lkIGxvZ2FjY2Vzcyggc3RyaW5nIHMgKTsKK3N0YXRpYyB2b2lkIGRvX21zZyggc3RyaW5nIHMsIG9iamVjdCBvICk7CitzdGF0aWMgc3RyaW5nfGludCBwYXJzZU5leHQoIHN0cmluZyBzdHIsIG1peGVkIGF1eHN0YWNrLCBzdHJpbmcgZnVubmFtZSApOworc3RhdGljIG1peGVkIG5leHRBbHBoYSggc3RyaW5nIHMgKTsKK3N0YXRpYyB2YXJhcmdzIHZvaWQgcmVzdG9yZV9zdGFjayggc3RyaW5nKiBhcmd2LCBpbnQgYXJncyApOworc3RhdGljIGludCBkb19jYWxsKCBzdHJpbmcgZnVuLCBpbnQgbWl0X3JldHVybiApOworc3RhdGljIGludCBkb19jYWxsX2VmdW4oIHN0cmluZyBmdW4sIGludCBtaXRfcmV0dXJuICk7CitzdGF0aWMgaW50IGRvX2xwYyggc3RyaW5nIHN0ciwgaW50IG1pdF9yZXR1cm4gKTsKK3N0YXRpYyBpbnQgZG9fY21kKCBzdHJpbmcgc3RyICk7CitpbnQgZXJyb3IoIHN0cmluZyBzICk7CisKK3N0YXRpYyB2b2lkIHRBZGRDbWQoIG1peGVkIGNtZCApCit7CisJaW50IGk7CisKKwkvL2lmIChmaW5kX3BsYXllcigicmlrdXMiKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInJpa3VzIiksc3ByaW50ZigiJU9cbiIsY21kKSk7CisJaWYoICFwb2ludGVycChjbWQpICkKKyAgICBtX2FkZCh0Y29tbWFuZHMsIGNtZCwgY21kKTsKKwllbHNlCisJCWZvciggaT0wOyBpPHNpemVvZihjbWQpOyBpKysgKQorICAgICAgbV9hZGQodGNvbW1hbmRzLCBjbWRbaV0sIGNtZFswXSk7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKwlpZiggSVNfQkxVRShNRSkgKSByZXR1cm47CisJaWYoICFmaW5kX3BsYXllcihnZXR1aWQoKSkgKSByZXR1cm47CisJb3duZXJfbmFtZSA9IGZpbmRfcGxheWVyKGdldHVpZCgpKS0+bmFtZShXRVNTRU4sMSk7CisKKwlzZWN1cmVfdGhpbmc6OmNyZWF0ZSgpOworCXRfY21kczo6Y3JlYXRlKCk7CisJU2V0UHJvcCggUF9OQU1FLCAiVGVsbGVyc3RhcGVsIiApOworCVNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisJQWRkSWQoICh7InRlbGxlciIsInN0YXBlbCIsInRlbGxlcnN0YXBlbCJ9KSApOworCVNldFByb3AoIFBfTk9EUk9QLCAiV296dSBkZW5uP1xuIiApOworCVNldFByb3AoIFBfTkVWRVJEUk9QLCAxICk7CisJU2V0UHJvcCggUF9SRUFEX01TRywgIkRpZSBHcmF2dXIgYmVzYWd0OiAnQXVzIGRlciBSdW1hdGEtTWFudWZha3R1cidcbiIgKTsKKwl0Y29tbWFuZHMgPSAoW10pOworCQorCXRBZGRDbWQoICJzYXkiICk7CisJdEFkZENtZCggKHsibmFtZXMiLCJuYW0ifSkgKTsKKwl0QWRkQ21kKCAic2VjdXJlaW52IiApOworCXRBZGRDbWQoICJsb2dhY2Nlc3MiICk7CisJdEFkZENtZCggInByZXR0eSIgKTsKKwl0QWRkQ21kKCAiZG9wcm9maWxlIiApOworCXRBZGRDbWQoICh7ImNsZWFyIiwiY2xyIn0pKTsKKwl0QWRkQ21kKCAicG9wIiApOworCXRBZGRDbWQoICJkdXAiICk7CisJdEFkZENtZCggInN3YXAiICk7CisJdEFkZENtZCggKHsiZXZhbHVhdGUiLCJldmFsIn0pICk7CisKKwl0QWRkQ21kKCAiaGVyZSIgKTsKKwl0QWRkQ21kKCAibWUiICk7CisKKwl0QWRkQ21kKCAoeyJtZW1vcnkiLCJtZW0ifSkgKTsKKwl0QWRkQ21kKCAiZHVtcCIgKTsKKwl0QWRkQ21kKCAicmVzdG9yZSIgKTsKKwl0QWRkQ21kKCAidG9wIiApOworCXRBZGRDbWQoICJ3ZXIiICk7CisJdEFkZENtZCggKHsic3RhY2siLCJzdGsifSkgKTsKKwl0QWRkQ21kKCAoeyJzbm9vcGVycyIsInNub29wIn0pICk7CisJdEFkZENtZCggImNhbGxvdXRzIiApOworCXRBZGRDbWQoICh7ImNhbGxvdXRzX2JhbmciLCJjYWxsb3V0cyEifSkgKTsKKwl0QWRkQ21kKCAoeyJoZWFydGJlYXRzIiwiYmVhdHMifSkgKTsKKwl0QWRkQ21kKCAiaW52IiApOworCXRBZGRDbWQoICh7InJla2ludiIsInJpbnYifSkgKTsKKwl0QWRkQ21kKCAic2NhbiIgKTsKKwl0QWRkQ21kKCAiaWYiICk7CisKKwl0QWRkQ21kKCAoeyJhcnJheSIsImFyciJ9KSApOworCXRBZGRDbWQoICh7InNwbGl0Iiwic3BsIn0pICk7CisJdEFkZENtZCggKHsicGxheWVyIiwicGwifSkgKTsKKwl0QWRkQ21kKCAoeyJsaXZpbmciLCJsdiJ9KSApOworCXRBZGRDbWQoICh7Im9iamVjdCIsIm9iIn0pICk7CisKKwl0QWRkQ21kKCAoeyJkZWJ1Z2luZm8iLCJkaW5mbyJ9KSApOworCXRBZGRDbWQoICh7ImNsb25lIiwiY2xuIn0pICk7CisJdEFkZENtZCggKHsidXBkYXRlIiwidXBkIn0pICk7CisJdEFkZENtZCggKHsidXBkYXRlX2JhbmciLCJ1cGRhdGUhIiwidXBkISJ9KSApOworCXRBZGRDbWQoICh7Im1vdmUiLCJtdiJ9KSApOworCXRBZGRDbWQoICh7ImRlc3RydWN0IiwiZGVzdCIsImRlcyJ9KSApOworCXRBZGRDbWQoICh7InJlbW92ZSIsInJlbSJ9KSApOworCXRBZGRDbWQoICh7ImRlc3RydWN0X2JhbmciLCJkZXN0cnVjdCEiLCJkZXN0ISIsImRlcyEiLCJyZW1vdmUhIiwicmVtISJ9KSApOworCXRBZGRDbWQoICh7InJvb211cGRhdGUiLCJydXBkYXRlIiwicnVwZCIsInJ1cCJ9KSApOworCXRBZGRDbWQoICh7InJvb211cGRhdGVfYmFuZyIsInJvb211cGRhdGUhIiwicnVwZGF0ZSEiLCJydXBkISIsInJ1cCEifSkgKTsKKwl0QWRkQ21kKCAoeyJleHRyb29tdXBkYXRlIiwicnVwZGF0ZSoiLCJydXBkKiIsInJ1cCoifSkgKTsKKwl0QWRkQ21kKCAoeyJleHRyb29tdXBkYXRlX2JhbmciLCJyb29tdXBkYXRlKiEiLCJydXBkYXRlKiEiLCJydXBkKiEiLCJydXAqISIsCisJCSJydXAhKiIgfSkgKTsKKwl0QWRkQ21kKCAoeyJjbGVhbm9mIiwiY2xub2YifSkgKTsKKwl0QWRkQ21kKCAoeyJjbGVhbm9mX2JhbmciLCJjbGVhbm9mISIsImNsbm9mISJ9KSApOworCisJdEFkZENtZCggInBpbmciICk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisJLy9sb2dhY2Nlc3MoICJpbml0IiApOworCTo6aW5pdCgpOworCWlmICggIUlTX1dJWkFSRChQTCkgfHwgZW52aXJvbm1lbnQoKSE9UEwgKQorCQlyZXR1cm47CisJYWRkX2FjdGlvbiggInBhcnNlIiwgIiwiLCAxICk7CisJYWRkX2FjdGlvbiggImpvbmdsaWVyIiwgImpvbmdsaWVyIiwgMSApOworCWFkZF9hY3Rpb24oICJtZXNzYWdlIiwgIm1lc3NhZ2UiICk7CisJYWRkX2FjdGlvbiggIm1lc3NhZ2UiLCAibXNnIiApOworfQorCitzaG9ydCgpCit7CisJbG9nYWNjZXNzKCAic2hvcnQiICk7CisJcmV0dXJuICJFaW4gU3RhcGVsIFRlbGxlci5cbiI7Cit9CisKK2lkKCBzdHIgKQoreworCWxvZ2FjY2VzcyggImlkIiApOworCXJldHVybiA6OmlkKHN0cik7Cit9CisKK25hbWUoIGNhc3VzLCBkZW0sIGZvcmNlICkKK3sKKwlsb2dhY2Nlc3MoICJuYW1lIiApOworCXJldHVybiA6Om5hbWUoIGNhc3VzLCBkZW0sIGZvcmNlICk7Cit9CisKK2xvbmcoKQoreworCXN0cmluZyBhbnN3ZXI7CisJCisJYW5zd2VyID0KKwkJICJEdSBiZXRyYWNodGVzdCAiK293bmVyX25hbWUrIiBtYWdpc2NoZW4gVGVsbGVyc3RhcGVsLiBEaWUgZWluemVsbmVuIFRlbGxlciBzaW5kXG4iCisJCSsiYmlzIGF1ZiBlaW5lIGtsZWluZSBJbnNjaHJpZnQgYXVmIGRlbSBCb2RlbiB3ZWlzcy4gV2VubiBEdSBoaWVybWl0XG4iCisJCSsiam9uZ2xpZXJzdCwga2FubiBBTExFUyBwYXNzaWVyZW4uXG4iOworCisJaWYoIGdldHVpZChQTCkgPT0gZ2V0dWlkKCkgKQorCXsKKwkJYW5zd2VyICs9CisJCQkoIG1pdF9zYXkKKwkJCQk/ICJEaWUgVGVsbGVyIHNpbmQgYmVpbSBKb25nbGllcmVuIHNpY2h0YmFyLlxuIgorCQkJCTogIkRpZSBUZWxsZXIgc2luZCBiZWltIEpvbmdsaWVyZW4gdW5zaWNodGJhci5cbiIKKwkJCSkgKyAoIG1pdF9uYW1lbgorCQkJCT8gIkRpZSBUZWxsZXIgbmVubmVuIGRpZSBEaW5nZSBiZWltIE5hbWVuLlxuIgorCQkJCTogIkRpZSBUZWxsZXIgbmVubmVuIGRpZSBEaW5nZSBiZWltIEZpbGVuYW1lbi5cbiIKKwkJCSkgKyAoIHByZXR0eQorCQkJCT8gIkRpZSBUZWxsZXIgaGFiZW4gZWluIHZlcnNjaG5vZXJrZWx0ZXMgTXVzdGVyLlxuIgorCQkJCTogIkRpZSBUZWxsZXIgc2luZCBnZXJhZGV6dSBzY2htdWNrbG9zLlxuIgorCQkJKSArICggZG9sb2dhY2Nlc3MKKwkJCQk/ICJEaWUgVGVsbGVyIHNwdWVyZW4gWnVncmlmZmUuXG4iCisJCQkJOiAiIgorCQkJKSArICggc2VjdXJlaW52CisJCQkJPyAiRGllIFRlbGxlciBiZXdhY2hlbiBEZWluIEludmVudGFyLlxuIgorCQkJCTogIiIKKwkJCSkgKyAoIGRvX3Byb2ZpbGUKKwkJCQk/ICJEaWUgVGVsbGVyIHdlcmRlbiBiZWltIEVpbmxvZ2dlbiBha3Rpdi5cbiIKKwkJCQk6ICIiCisJCQkpOworCX0gCisJcmV0dXJuIGFuc3dlcjsgCQorfQorCit2b2lkIF9zZXRfYXV0b2xvYWRvYmooIG1peGVkIHZhbCApCit7CisJaWYoICFwb2ludGVycCh2YWwpICkgcmV0dXJuOworCXZhbCArPSAoeyAwLDAsMCwwLDAsMCB9KTsKKwltaXRfbmFtZW4gPSB2YWxbMF07CisJbWl0X3NheSA9IHZhbFsxXTsJCisJc2V0X2hlYXJ0X2JlYXQoIHNlY3VyZWludiA9IHZhbFsyXSApOworCWRvbG9nYWNjZXNzID0gdmFsWzNdOworCXByZXR0eSA9IHZhbFs0XTsKKwlkb19wcm9maWxlID0gdmFsWzVdOworCWlmKCBkb19wcm9maWxlICkgY2FsbF9vdXQoICJfbG9hZF9wcm9maWxlIiwgMCwgdGhpc19wbGF5ZXIoKSApOworfQorCittaXhlZCBfcXVlcnlfYXV0b2xvYWRvYmooKQoreworCXJldHVybiAoeyBtaXRfbmFtZW4sIG1pdF9zYXksIHNlY3VyZWludiwgZG9sb2dhY2Nlc3MsIHByZXR0eSwKKwkJZG9fcHJvZmlsZSB9KTsKK30KKwordm9pZCBfbG9hZF9wcm9maWxlKCBvYmplY3QgcGwgKQoreworCXN0cmluZyBwZixlcnJtc2c7CisKKwlpZiggZ2V0ZXVpZCgpICYmIHBsICYmIGdldGV1aWQocGwpPT1nZXRldWlkKCkKKwkJJiYgZmlsZV9zaXplKHBmPSIvcGxheWVycy8iK2dldGV1aWQoKSsiLy5wcm9maWxlLmMiKT4wCisJCSYmIChlcnJtc2c9Y2F0Y2goY2FsbF9vdGhlcihwZiwic2V0dXAiLHBsKSkpCisJKQorCQlwcmludGYoICJFcnJvciBsb2FkaW5nIHByb2ZpbGU6ICVPXG4iLCBlcnJtc2cgKTsKK30KKwordm9pZCBsb2dhY2Nlc3MoIHN0cmluZyBzdHIgKQoreworCWlmKCBSUEwgJiYgZG9sb2dhY2Nlc3MgJiYgZ2V0dWlkKCkhPWdldHVpZChSUEwpICYmIGZpbmRfcGxheWVyKGdldHVpZCgpKQorCQkmJiBwcmV2aW91c19vYmplY3QoKSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRAorCQkmJiBxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKCkpPj1xdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKFJQTCkpCisJKQorCQl0ZWxsX29iamVjdCggZmluZF9wbGF5ZXIoZ2V0dWlkKCkpLCAiTUVNTzogIiArIHN0ciArICIoKSB2b24gIgorCQkJKyBSUEwtPm5hbWUoV0VNKSArICIgdmlhIFsiCisJCQkrIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSsiXS5cbiIKKwkJKTsKKwlpZiggc2VjdXJlaW52ICYmIGZpbmRfcGxheWVyKGdldHVpZCgpKSAmJiAhbWVtYmVyKGhlYXJ0X2JlYXRfaW5mbygpLE1FKSApCisJeworCQl0ZWxsX29iamVjdCggZmluZF9wbGF5ZXIoZ2V0dWlkKCkpLCAiTUVNTzogaGVhcnRfYmVhdCByZXN0YXJ0ZXQhLlxuIiApOworCQlzZXRfaGVhcnRfYmVhdChUUlVFKTsKKwl9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpbGZlLUZ1bmt0aW9uZW4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBpbnQgc2VjdXJlKCkKK3sKKwlpbnQgaTsKKwlpZiggcHJvY2Vzc19jYWxsKCkgfHwgc2VjdXJlX2xldmVsKCk8cXVlcnlfd2l6X2xldmVsKFJQTCkgKSByZXR1cm4gMDsKKwlmb3IoIGk9MDsgcHJldmlvdXNfb2JqZWN0KGkpPT1SUEw7IGkrKyApCisJCTsKKwlyZXR1cm4gKCFwcmV2aW91c19vYmplY3QoaSkgfHwgcHJldmlvdXNfb2JqZWN0KCk9PU1FKQorCQkgJiYgZ2V0dWlkKCk9PWdldHVpZChSUEwpICYmIElTX1dJWkFSRChSUEwpOworfQorCitpbnQgam9uZ2xpZXIoIHN0cmluZyBzdHIgKQoreworCXN0cmluZyBhcmc7CisKKwlsb2dhY2Nlc3MoICJqb25nbGllcmUiICk7CisJaWYoICFzdHIgfHwgaWQoc3RyKSB8fCBzc2NhbmYoIHN0ciwgIm1pdCAlcyIsIGFyZyApID09IDEgKQorCXsKKwkJaWYoICFzZWN1cmUoKSApCisJCQl3cml0ZSgKKwkJCQkiRGllc2VyIFRlbGxlcnN0YXBlbCBpc3QgbmljaHRzIGZ1ZXIgRGljaC4gU3VjaGUgRGlyIGVpbmVuIGVpZ2VuZW4uXG4iCisJCQkpOworCQllbHNlCisJCQl3cml0ZSgKKwkJCSAgIkRlciBKb25nbGllcmJlZmVobCBsYXV0ZXQgXCI7XCIgb2RlciBcIixcIi5cbiIKKwkJCSsJIlwiO2hpbGZlIDxiZWZlaGw+XCIgZ2lidCBEaXIgSGlsZmVzdGVsbHVuZy5cbiIKKwkJCSk7CisJCXJldHVybiBUUlVFOworCX0KKyAgcmV0dXJuIDA7Cit9CisJCQkKK3N0YXRpYyBpbnQgemVpZ2VfaGlsZmUoIHN0cmluZyBzdHIgKQoreworCWlmKCAhc3RyaW5ncChzdHIpICkgc3RyID0gImdlbmVyYWwiOworCXN0ciA9IGltcGxvZGUoIG9sZF9leHBsb2RlKCBIRUxQKHN0ciksICIvLi4vIiApLCAiLyIgKTsKKwlpZiggZmlsZV9zaXplKHN0cikgPiAwICkKKwl7CisJCU1vcmUoIHN0ciwgMSApOworCQlyZXR1cm4gVFJVRTsKKwl9CisJd3JpdGUoICJadSBkaWVzZW0gVGhlbWEgZ2lidCBlcyBrZWluZSBIaWxmZS5cbiIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworaW50IG1lc3NhZ2UoIHN0cmluZyBzdHIgKQoreworCXN0cmluZyBwbDsKKwlvYmplY3QgZGVzdDsKKworCWlmKCAhc2VjdXJlKCkgKSByZXR1cm4gRkFMU0U7CisKKwlpZiggc3RyICkKKwl7CisJCWlmKCBzc2NhbmYoIHN0ciwgInRvICVzIiwgcGwgKSA9PSAxICkKKwkJCXN0ciA9IHBsOworCQlpZiggIShkZXN0ID0gZmluZF9wbGF5ZXIoc3RyKSApICkKKwkJeworCQkJd3JpdGUoIGNhcGl0YWxpemUoc3RyKSArICIgaXN0IG5pY2h0IGVpbmdlbG9nZ3QuXG4iICk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwllbHNlCisJCWRlc3QgPSAwOworCisJZG9fbXNnKCAiPE1pdHRlaWx1bmcgdm9uICIrUEwtPm5hbWUoV0VNKSsiPiIsIGRlc3QgKTsKKwl3cml0ZSggIk1pdHRlaWx1bmciCisJCSsgKCBkZXN0ID8gIiBhbiAiICsgZGVzdC0+bmFtZShXRU4pIDogIiIgKQorCQkrICIga2FubiBtaXQgJyoqJyBiZWVuZGV0IHdlcmRlbi5cbiIgKTsKKworCWlucHV0X3RvKCAibW9yZV9tZXNzYWdlIiwgMCwgZGVzdCApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBkb19tc2coIHN0cmluZyBzdHIsIG9iamVjdCBvYmogKQoreworCWlmKCBvYmogKQorCQl0ZWxsX29iamVjdCggb2JqLCBzdHIgKyAiXG4iICk7CisJZWxzZQorCQlzYXkoIHN0ciArICJcbiIgKTsKK30KKworc3RhdGljIGludCBtb3JlX21lc3NhZ2UoIHN0cmluZyBzdHIsIG9iamVjdCBvYmogKQoreworCWlmKCBzdHIgIT0gIioqIiApCisJeworCQlkb19tc2coIHN0ciwgb2JqICk7CisJCWlucHV0X3RvKCAibW9yZV9tZXNzYWdlIiwgMCwgb2JqICk7CisJfQorCWVsc2UKKwkJZG9fbXNnKCAiPEVuZGUgZGVyIE1pdHRlaWx1bmc+Iiwgb2JqICk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcnNlLUZ1bmt0aW9uZW4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBwYXJzZSggc3RyaW5nIHN0ciApCit7CisJaW50IGk7CisJc3RyaW5nIGFyZywgcmVzdDsKKworCWlmKCAhc2VjdXJlKCkgKSByZXR1cm4gRkFMU0U7CisKKwkvLyBEaWUgSGlsZmUgZmFlbGx0IGF1cyBkZXIgYWxsZ2VtZWluZW4gU3ludGF4IGhlcmF1cyAhCisJaWYoIHF1ZXJ5X3ZlcmIoKVsxLi5dID09ICJoaWxmZSIgfHwgcXVlcnlfdmVyYigpWzEuLl0gPT0gImhlbHAiICkKKwkJcmV0dXJuIHplaWdlX2hpbGZlKCBzdHIgKTsKKworCWlmKCBzdHI9dGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSApCisJCXN0ciA9IHF1ZXJ5X3ZlcmIoKVsxLi5dKyIgIitzdHI7CisJZWxzZQorCQlzdHIgPSBxdWVyeV92ZXJiKClbMS4uXTsKKworCWZlaGxlcl9wYXNzaWVydCA9IEZBTFNFOworCXdoaWxlKCAhZmVobGVyX3Bhc3NpZXJ0ICYmIHN0ciAmJiBzdHIhPSIiICkKKwkJc3RyID0gcGFyc2VOZXh0KCBzdHIsICh7fSksICItUk9PVC0iICk7CisKKwlpZiggbWl0X3NheSAmJiAhUEwtPlF1ZXJ5UHJvcChQX0lOVklTKSApCisJeworCQlpZiggIWZlaGxlcl9wYXNzaWVydCApCisJCQlzYXkoIFBMLT5uYW1lKFdFUikrIiBqb25nbGllcnQgbWl0ICIKKwkJCQkrIFBMLT5RUFAoTUFMRSxXRU0sUExVUkFMKSsiIFRlbGxlcm4uXG4iICk7CisJCWVsc2UKKwkJCXNheSggUEwtPm5hbWUoV0VNKSsiIGZhZWxsdCBiZWltIEpvbmdsaWVyZW4gZWluIFRlbGxlciBoZXJ1bnRlci5cbiIgKTsKKwl9CisJaWYoICFmZWhsZXJfcGFzc2llcnQgKQorCQl3cml0ZSggIk9LLlxuIiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgc3RyaW5nfGludCBwYXJzZU5leHQoIHN0cmluZyBzdHIsIG1peGVkIGF1eHN0YWNrLCBzdHJpbmcgZnVubmFtZSApCit7CisJbWl4ZWQgKnJlczsKKwlzdHJpbmcgYXJnLCByZXN0OworCWJvb2wgbWl0X3JldHVybjsKKwlpbnQgbnVtOworCisJd2hpbGUoIHN0ciE9IiIgJiYgc3RyWzBdPT0nICcgKQorCQlzdHIgPSBzdHJbMS4uXTsKKwlpZiggc3RyPT0iIiApCisJCXJldHVybiBGQUxTRTsKKworCXN3aXRjaCggc3RyWzBdICkKKwl7CisJCWNhc2UgJzsnOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEtvbW1hbmRvYmVnaW5uCisJCWNhc2UgJywnOgorCQkJcHVzaCggIjsiICk7CisJCQlyZXR1cm4gc3RyWzEuLl07CisJCWNhc2UgJ1wiJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0cmluZ2tvbnN0YW50ZQorCQkJaWYoIHNzY2FuZiggc3RyLCAiXCIlc1wiJXMiLCBhcmcsIHJlc3QgKT09MiApCisJCQl7CisJCQkJLyogdGVzdCBhdWYgbnVtZXJpc2NoIGZlaGx0IGhpZXIgbm9jaCAqLworCQkJCXB1c2hfc3RyKCBhcmcgKTsKKwkJCQlyZXR1cm4gcmVzdDsKKwkJCX0KKwkJCWlmKCAhc3NjYW5mKCBzdHIsICJcIiVzXCIiLCBhcmcgKSApCisJCQkJcmV0dXJuIGVycm9yKCAiU3RyaW5nIG9obmUgRW5kZSIgKTsKKwkJCXB1c2hfc3RyKCBhcmcgKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJY2FzZSAnIyc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gWmFobAorCQkJcmVzID0gbmV4dEFscGhhKCBzdHJbMS4uXSApOworCQkJaWYoIHNzY2FuZiggcmVzWzBdLCAiJWQiLCBudW0gKSA9PSAxICkKKwkJCXsKKwkJCQlwdXNoKCBudW0gKTsKKwkJCQlyZXR1cm4gcmVzWzFdOworCQkJfQorCQkJcmV0dXJuIGVycm9yKCAiJyMnOiBrZWluZSBlcmxhdWJ0ZSBaYWhsIiApOworCQljYXNlICdeJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb2xlIGVudgorCQkJaWYoICFiZWNvbWVzX29iaigpICkKKwkJCQlyZXR1cm4gZXJyb3IoICInXic6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJCQlpZiggIWVudmlyb25tZW50KHRvcCgpKSApCisJCQkJcmV0dXJuIGVycm9yKCAiJ14nOiBUT1MgaGF0IGtlaW4gRW52aXJvbm1lbnQiICk7CisJCQlwdXNoKGVudmlyb25tZW50KHBvcCgpKSk7CisJCQlyZXR1cm4gc3RyWzEuLl07CisJCWNhc2UgJy4nOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhvbGUgYXVzIGludgorCQkJaWYoICFiZWNvbWVzX29iaigpICkKKwkJCQlyZXR1cm4gZXJyb3IoICInLic6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0clsxLi5dICk7CisJCQljYWxjaW52KCByZXNbMF0gKTsKKwkJCXJldHVybiByZXNbMV07CisJCWNhc2UgJzwnOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlY2FsbAorCQkJaWYoICFzc2NhbmYoIHN0ciwgIjwlcyIsIGFyZyApIHx8IGFyZz09IiIgKQorCQkJCXJldHVybiBlcnJvciggIic8JzogVmFyaWFibGVubmFtZSBmZWhsdCIgKTsKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyWzEuLl0gKTsKKwkJCWRvX3JlY2FsbChyZXNbMF0pOworCQkJcmV0dXJuIHJlc1sxXTsKKwkJY2FzZSAnPic6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RvcmUKKwkJCWlmKCAhc3NjYW5mKCBzdHIsICI+JXMiLCBhcmcgKSB8fCBhcmc9PSIiICkKKwkJCQlyZXR1cm4gZXJyb3IoICInPic6IFZhcmlhYmxlbm5hbWUgZmVobHQiICk7CisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0clsxLi5dICk7CisJCQlkb19zdG9yZShyZXNbMF0pOworCQkJcmV0dXJuIHJlc1sxXTsKKwkJY2FzZSAnLSc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FsbCBtaXQgJy0nCisJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCWlmKCBtaXRfcmV0dXJuID0gKHN0clswXSA9PSAnLScpICkKKwkJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyWzEuLl0gKTsKKwkJCXN3aXRjaCggc3RyWzBdICkKKwkJCXsKKwkJCQljYXNlICc+JzoKKwkJCQkJaWYoIGRvX2NhbGwoIHJlc1swXSwgbWl0X3JldHVybiApICkKKwkJCQkJCXJldHVybiByZXNbMV07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyonOgorCQkJCQlpZiggZG9fY2FsbF9lZnVuKCByZXNbMF0sIG1pdF9yZXR1cm4gKSApCisJCQkJCQlyZXR1cm4gcmVzWzFdOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gZXJyb3IoICInLSc6ICc+JyBvZGVyICcqJyBlcndhcnRldCIgKTsKKwkJCX0KKwkJCXJldHVybiBGQUxTRTsKKwkJY2FzZSAnXCcnOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FsbAorCQkJc3RyID0gc3RyWzEuLl07CisJCQlpZiggbWl0X3JldHVybiA9IChzdHJbMF0gPT0gJ1wnJykgKQorCQkJCXN0ciA9IHN0clsxLi5dOworCQkJcmVzID0gbmV4dEFscGhhKCBzdHIgKTsKKwkJCWlmKCBkb19jYWxsKCByZXNbMF0sIG1pdF9yZXR1cm4gKSApCisJCQkJcmV0dXJuIHJlc1sxXTsKKwkJCXJldHVybiBGQUxTRTsKKwkJY2FzZSAnYCc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYWxsIEVmdW4KKwkJCXN0ciA9IHN0clsxLi5dOworCQkJaWYoIG1pdF9yZXR1cm4gPSAoc3RyWzBdID09ICdgJykgKQorCQkJCXN0ciA9IHN0clsxLi5dOworCQkJcmVzID0gbmV4dEFscGhhKCBzdHIgKTsKKwkJCWlmKCBkb19jYWxsX2VmdW4oIHJlc1swXSwgbWl0X3JldHVybiApICkKKwkJCQlyZXR1cm4gcmVzWzFdOworCQkJcmV0dXJuIEZBTFNFOworCQljYXNlICdAJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV2YWx1YXRlCisJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCWlmKCBtaXRfcmV0dXJuID0gKHN0clswXSA9PSAnQCcpICkKKwkJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCWlmKCBkb19scGMoIHN0ciwgbWl0X3JldHVybiApICkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlyZXR1cm4gRkFMU0U7CisJCWNhc2UgJyEnOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1FVEEKKwkJCWlmKCBzc2NhbmYoc3RyLCIhJWQlcyIsbnVtLGFyZyk9PTIgKQorCQkJeworCQkJCWlmKCBudW0+PXNpemVvZihhdXhzdGFjaykgKQorCQkJCQlyZXR1cm4gZXJyb3IoICInIitmdW5uYW1lKyInOiB6dSB3ZWluZyBBcmd1bWVudGUiICk7CisJCQkJcHVzaCggYXV4c3RhY2tbbnVtXSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJlcyA9IG5leHRBbHBoYSggc3RyWzEuLl0gKTsKKwkJCQltZW1vcnkgKz0gKFsgcmVzWzBdOiByZXNbMV07IDEgXSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJcmV0dXJuIGFyZzsKKwkJZGVmYXVsdDogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVmYXVsdAorCQkJcmVzID0gbmV4dEFscGhhKCBzdHIgKTsKKwkJCWRvX2NtZChyZXNbMF0pOworCQkJcmV0dXJuIHJlc1sxXTsKKwl9CisJcmV0dXJuIG1lbW8oICJFdHdhcyBTZWx0c2FtZXMgaXN0IHBhc3NpZXJ0IiApOworfQorCitzdGF0aWMgaW50IGRvX2NtZCggc3RyaW5nIHN0ciApCit7CisJc3RyaW5nIGZ1biwgZmlsZW5hbWUsICpzcGw7CisJbWl4ZWQqIG9sZHN0YWNrOworCWludCBpLG1heCxudW07CisKKwlpZiggbWVtYmVyKG1lbW9yeSxzdHIpICkKKwl7CisJCWZ1biA9IG1lbW9yeVtzdHIsMF07CisJCWlmKCAhbWVtb3J5W3N0ciwxXSApIC8vIG5vcm1hbGUgVmFyaWFibGVuCisJCXsKKwkJCXB1c2goIGZ1biApOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJb2xkc3RhY2sgPSBzdGFjazsKKwkJc3RhY2sgPSAoe30pOworCQlzcGwgPSByZWdleHBsb2RlKCBmdW4sICIhWzAtOV1bMC05XSoiICk7CisJCW1heCA9IC0xOworCQlmb3IoIGk9MTsgaTxzaXplb2Yoc3BsKTsgaSs9MiApCisJCQlpZiggc3NjYW5mKHNwbFtpXSwiISVkIixudW0pICYmIG1heDxudW0gKSBtYXggPSBudW07CisKKwkJd2hpbGUoICFmZWhsZXJfcGFzc2llcnQgJiYgZnVuICYmIGZ1biE9IiIgKQorCQkJZnVuID0gcGFyc2VOZXh0KCBmdW4sIG9sZHN0YWNrLCBzdHIgKTsKKwkJaWYoIGZlaGxlcl9wYXNzaWVydCApCisJCXsKKwkJCXN0YWNrID0gb2xkc3RhY2s7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJc3RhY2sgPSBzdGFjayArIG9sZHN0YWNrWyhtYXgrMSkuLl07CisJCXJldHVybiBUUlVFOworCX0KKyAgZWxzZSBpZiAoZnVuPXRjb21tYW5kc1tzdHJdKQorCQlyZXR1cm4gY2FsbF9vdGhlcihNRSwiY21kXyIrZnVuKTsKKworCWlmKCBzc2NhbmYoIHN0ciwgIiVkIiwgaSApICkKKwkJcHVzaCggaSApOworCWVsc2UKKwl7CisJCWZpbGVuYW1lID0gTUFTVEVSLT5fZ2V0X3BhdGgoc3RyLGdldHVpZCgpKTsKKwkJaWYoIGZpbGVuYW1lWzwxXSA9PSAnLicgKQorCQkJZmlsZW5hbWUgPSBmaWxlbmFtZVswLi48Ml07CisJCWlmKCBmaWxlX3NpemUoIGZpbGVuYW1lKyIuYyIgKSAhPSAtMSApCisJCQlwdXNoKCBmaWxlbmFtZSApOworCQllbHNlCisJCQlwdXNoKCBzdHIgKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBtaXhlZCBuZXh0QWxwaGEoIHN0cmluZyBzdHIgKQoreworCWludCBwb3M7CisKKwlmb3IoIAorCQlwb3M9MDsKKwkJcG9zPHNpemVvZihzdHIpICYmIG1lbWJlciggIiAjXCI7LF4uPjwiLCBzdHJbcG9zXSApID09IC0xOworCQlwb3MrKworCSkKKwkJOworCisJaWYoIHBvcz09c2l6ZW9mKHN0cikgKQorCQlyZXR1cm4gKHsgc3RyLCAwIH0pOworCWVsc2UKKwkJcmV0dXJuICh7IHN0clswLi5wb3MtMV0sIHN0cltwb3MuLl0gfSk7Cit9CisKK3N0YXRpYyB2YXJhcmdzIHZvaWQgcmVzdG9yZV9zdGFjayggc3RyaW5nKiBhcmd2LCBpbnQgYXJncyApCit7CisJaW50IGk7CisJaWYoICFhcmdzICkKKwkJYXJncyA9IHNpemVvZihhcmd2KTsKKwlpZiggc2l6ZW9mKHN0YWNrKSApIHB1c2goICI7IiApOworCWZvciggaT0wOyBpPGFyZ3M7IGkrKyApCisJCXB1c2goYXJndltpXSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2FsbCggc3RyaW5nIGZ1biwgaW50IG1pdF9yZXR1cm4gKQoreworCWludCBhcmdzOworCXN0cmluZyBlcnI7CisJbWl4ZWQgcmVzdWx0OworCW1peGVkIGFyZywgKmFyZ3Y7CisKKwlhcmd2ID0gKHt9KTsKKwl3aGlsZSggc2l6ZW9mKHN0YWNrKSAmJiAoYXJnPXBvcCgpKSE9IjsiICkKKwkJYXJndiA9ICh7YXJnfSkgKyBhcmd2OworCWlmKCAhYmVjb21lc19vYmooYXJndikgKQorCXsKKwkJcmVzdG9yZV9zdGFjayggYXJndiApOworCQlyZXR1cm4gZXJyb3IoICJjYWxsOiBGdW5rdGlvbiBuaWNodCBhbiBPYmpla3QgZ2VyaWNodGV0IiApOworCX0KKwlpZiggIWZ1bmN0aW9uX2V4aXN0cyhmdW4sYXJndlswXSkgKQorCXsKKwkJcmVzdG9yZV9zdGFjayhhcmd2KTsKKwkJcmV0dXJuIGVycm9yKCAiY2FsbDogRnVua3Rpb24gbmljaHQgZ2VmdW5kZW4iICk7CisJfQorCisJYXJncyA9IHNpemVvZihhcmd2KTsKKwlhcmd2ICs9ICh7IDAsMCwwLDAsMCB9KTsKKwllcnI9KGNhdGNoKHJlc3VsdD1jYWxsX290aGVyKGFyZ3ZbMF0sZnVuLAorCQlhcmd2WzFdLGFyZ3ZbMl0sYXJndlszXSxhcmd2WzRdLGFyZ3ZbNV0pKSk7CisJaWYoIGVyciApCisJeworCQlyZXN0b3JlX3N0YWNrKCBhcmd2LCBhcmdzICk7CisJCXJldHVybiBlcnJvciggImNhbGw6ICIrZXJyWzEuLjwyXSApOworCX0KKwllbHNlCisJeworCQl3cml0ZSggIj0+ICIgKTsKKwkJZHVtcF9vYmooIHJlc3VsdCwgMyApOworCQlpZiggbWl0X3JldHVybiApCisJCQlwdXNoKCByZXN1bHQgKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2FsbF9lZnVuKCBzdHJpbmcgZnVuLCBpbnQgbWl0X3JldHVybiApCit7CisJaW50IGFyZ3M7CisJc3RyaW5nIGVycjsKKwltaXhlZCByZXN1bHQ7CisJbWl4ZWQgYXJnLCAqYXJndjsKKworCWFyZ3YgPSAoe30pOworCXdoaWxlKCBzaXplb2Yoc3RhY2spICYmIChhcmc9cG9wKCkpIT0iOyIgKQorCQlhcmd2ID0gKHthcmd9KSArIGFyZ3Y7CisKKwlpZiggIWZ1bmN0aW9uX2V4aXN0cyggImVmdW5fIitmdW4gKSApCisJCXJldHVybiBlcnJvciggImNhbGwgZWZ1bjogXCIiK2Z1bisiXCIgbmljaHQgYmVudXR6YmFyIiApOworCWZ1biA9ICJlZnVuXyIrZnVuOworCisJYXJncyA9IHNpemVvZihhcmd2KTsKKwlhcmd2ICs9ICh7IDAsMCwwLDAsMCB9KTsKKwllcnI9KGNhdGNoKHJlc3VsdD1jYWxsX290aGVyKE1FLGZ1biwKKwkJCWFyZ3ZbMF0sYXJndlsxXSxhcmd2WzJdLGFyZ3ZbM10sYXJndls0XSkpKTsKKwlpZiggZXJyICkKKwl7CisJCXJlc3RvcmVfc3RhY2soIGFyZ3YsIGFyZ3MgKTsKKwkJcmV0dXJuIGVycm9yKCAiY2FsbCBlZnVuOiAiK2VyclsxLi48Ml0gKTsKKwl9CisJZWxzZQorCXsKKwkJd3JpdGUoICI9PiAiICk7CisJCWR1bXBfb2JqKCByZXN1bHQsIDMgKTsKKwkJaWYoIG1pdF9yZXR1cm4gKQorCQkJcHVzaCggcmVzdWx0ICk7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGRvX2xwYyggc3RyaW5nIHN0ciwgaW50IG1pdF9yZXR1cm4gKQoreworCWludCBhcmdzLCB2YWw7CisJc3RyaW5nIGVycjsKKwlzdHJpbmcgZmlsZSwgY21kLCBwcmUsIHBvc3Q7CisJbWl4ZWQgcmVzdWx0OworCW1peGVkIGFyZywgKmFyZ3Y7CisKKwlhcmd2ID0gKHt9KTsKKwl3aGlsZSggc2l6ZW9mKHN0YWNrKSAmJiAoYXJnPXBvcCgpKSE9IjsiICkKKwkJYXJndiA9IGFyZ3YgKyAoe2FyZ30pOworCisJZmlsZSA9ICIvcGxheWVycy8iK2dldHVpZCgpKyIvLnRlbGxlciI7CisJY21kID0gIiNpbmNsdWRlIDxsYW5ndWFnZS5oPlxuI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiIKKwkJKyAiI2luY2x1ZGUgPG1vdmluZy5oPlxuI2luY2x1ZGUgPGRlZmluZXMuaD5cbiNpbmNsdWRlIDx0ZXJtaW5hbC5oPlxuIgorCQkrICIjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+XG4jaW5jbHVkZSA8YW5zaS5oPlxuY3JlYXRlKCl7fWRvaXQoKXsiOworCisJd2hpbGUoIHN0ciE9IiIgJiYgc3NjYW5mKCBzdHIsICIlc0AlcyIsIHByZSwgcG9zdCApID09IDIgKQorCXsKKwkJaWYoIHNzY2FuZiggc3RyLCAiJXNAJWRAJXMiLCBwcmUsIHZhbCwgcG9zdCApID09IDMgKQorCQl7CisJCQlpZiggc2l6ZW9mKGFyZ3YpPD12YWwgfHwgdmFsPDAgKQorCQkJeworCQkJCXJlc3RvcmVfc3RhY2soIGFyZ3YsIGFyZ3MgKTsKKwkJCQlyZXR1cm4gZXJyb3IoICJscGM6IElsbGVnYWxlciBJbmRleCBhdWYgZGVuIFN0YWNrIiApOworCQkJfQorCQkJY21kICs9IHByZSArIER1bXBPYmooYXJndlt2YWxdKTsKKwkJCXN0ciA9IHBvc3Q7CisJCX0KKwkJZWxzZQorCQkJaWYoIHNzY2FuZiggc3RyLCAiJXNAJXMiLCBwcmUsIHBvc3QgKSA9PSAyICkKKwkJCXsKKwkJCQljbWQgKz0gcHJlICsgIkAiOworCQkJCXN0ciA9IHBvc3Q7CisJCQl9CisJfQorCWNtZCArPSBzdHI7CisJcm0oIGZpbGUrIi5jIiApOworCXdyaXRlX2ZpbGUoIGZpbGUrIi5jIiAsIGNtZCsiO31cbiIgKTsKKwlpZiggZmluZF9vYmplY3QoZmlsZSkgKSBkZXN0cnVjdCggZmluZF9vYmplY3QoZmlsZSkgKTsKKwllcnI9KGNhdGNoKHJlc3VsdD1jYWxsX290aGVyKGZpbGUsImRvaXQiKSkpOworCWlmKCBlcnIgKQorCXsKKwkJLy9ybSggZmlsZSsiLmMiICk7CisJCXJlc3RvcmVfc3RhY2soIGFyZ3YsIGFyZ3MgKTsKKwkJcmV0dXJuIGVycm9yKCAibHBjOiAiK2VyclsxLi48Ml0gKTsKKwl9CisJZWxzZQorCXsKKwkJLy9ybSggZmlsZSsiLmMiICk7CisJCXdyaXRlKCAiPT4gIiApOworCQlkdW1wX29iaiggcmVzdWx0LCAzICk7CisJCWlmKCBtaXRfcmV0dXJuICkKKwkJCXB1c2goIHJlc3VsdCApOworCX0KKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvdGVsbGVyLmggYi9vYmovdG9vbHMvdGVsbGVyL3RlbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWQ3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL3RlbGxlci5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX1RFTExFUl9IXworI2RlZmluZSBfVEVMTEVSX0hfCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgYm9vbCBpbnQKKworI2RlZmluZSBJTkZPUk1FUiAiL3NlY3VyZS9tZXJsaW4iCisvLyNkZWZpbmUgTUFTVEVSICIvc2VjdXJlL21hc3RlciIKKworI2RlZmluZSBUX0JBU0UgIi9vYmovdG9vbHMvdGVsbGVyL3RfYmFzZSIKKyNkZWZpbmUgVF9FRlVOICIvb2JqL3Rvb2xzL3RlbGxlci90X2VmdW4iCisjZGVmaW5lIFRfQ01EUyAiL29iai90b29scy90ZWxsZXIvdF9jbWRzIgorI2RlZmluZSBUX1BMQVlFUiAiL29iai90b29scy90ZWxsZXIvdF9wbGF5ZXIiCisKKyNkZWZpbmUgSEVMUCh4KSAoIi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlLyIrKHgpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29iai90b29scy90ZXN0ZXIvdGVzdC5jIGIvb2JqL3Rvb2xzL3Rlc3Rlci90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3MGZhOAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZXN0ZXIvdGVzdC5jCkBAIC0wLDAgKzEsMTE0NiBAQAorLyoKKyoqICAgT2JqZWt0LVRlc3RlciAtIE1pc2NodW5nIGF1cyBSaWt1cycgRGV0YWlsdGVzdGVyIHVuZCBSb2NodXMnIFRlc3QtTlBDLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogICAgVXJzcHJ1ZW5nbGljaGUgT2JqZWt0ZToKKyoqICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisqKiAgICAvcGxheWVycy9yaWtvcy9vYmovcmRldC5jICAgICAgICAgICBSaWt1c0BNb3JnZW5HcmF1ZW4gICAgICAgICAyNS4wNS45NgorKioKKyoqICAgIC9wbGF5ZXJzL3JvY2h1cy9tb24vdGVzdGVyLmMgICAgICAgIFJvY2h1c0BNb3JnZW5HcmF1ZW4gICAgICAgIDE4LjEwLjk0CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgICBEaWVzZXMgT2JqZWt0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgVmVyc2lvbiAwLjggXQorKiogICAgfn5+fn5+fn5+fn5+fn4KKyoqICAgIC9wbGF5ZXJzL3BhcmFjZWxzdXMvdG9vbHMvb3Rlc3QuYyAgIFBhcmFjZWxzdXNATW9yZ2VuZ3JhdWVuICAgIDI4LjAyLjk4CisqKgorKiogICAgRGllIFdlaXRlcmdhYmUsIFZlcndlbmR1bmcgb2RlciBWZXJhZW5kZXJ1bmcgaXN0IG51ciBlcmxhdWJ0LCB3ZW5uCisqKiAgICBkaWVzZSBNZWxkdW5nIG5pY2h0IGdlYWVuZGVydCB3aXJkLgorKiogICAgRGllIEJlbnV0enVuZyBlcmZvbGd0IGF1ZiBlaWdlbmUgR2VmYWhyLCBqZWRlIFZlcmFudHdvcnR1bmcgd2lyZAorKiogICAgYWJnZWxlaG50LiBFcyB3aXJkIGtlaW5lIEdhcmFudGllIGdlZ2ViZW4sIGRhc3MgZGVyIE9iamVrdHRlc3RlcgorKiogICAgZWlud2FuZGZyZWksIHZvbGxzdGFlbmRpZyBvZGVyIGdhciB6dWZyaWVkZW5zdGVsbGVuZCBhcmJlaXRldC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgIENoYW5nZUxvZzoKKyoqICAgIH5+fn5+fn5+fn4KKyoqICAgIFYgMC4xICAgIDI4LjAyLjk4IDExOjAwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWt1cycgUmF1bXRlc3RlciBrb3BpZXJ0LCBvcHRpbWllcnQuCisqKgorKiogICAgViAwLjIgICAgMjguMDIuOTggMTE6MzA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtlaW5lIGRpcmVrdGUgQXVzZ2FiZSBtZWhyIHNvbmRlcm4KKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dGRlc3NlbiBlaW4gTW9yZSgpLgorKioKKyoqICAgIFYgMC4zICAgIDI4LjAyLjk4IDEzOjAwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0ZW4gbmljaHQgbWVociBhdWYgUmFldW1lIGJlc2NocmFlbmt0LgorKioKKyoqICAgIFYgMC40ICAgIDI4LjAyLjk4IDE2OjAwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5rdGlvbmVuIGF1cyBSb2NodXMnIFRlc3RlciB1ZWJlcm5vbW1lbgorKioKKyoqICAgIFYgMC41ICAgIDI4LjAyLjk4IDE4OjAwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5rdGlvbmFsaXRhZXRlbiB2b24gUmlrdXMgdW5kIFJvY2h1cworKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZWluYW5kZXIgYW5nZXBhc3N0LgorKioKKyoqICAgIFYgMC42ICAgIDI4LjAyLjk4IDE5OjAwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXJ1ZWNoZSB1bmQgR2VyYWV1c2NoZSBlaW5nZWJhdXQsCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJzdGUgVGVzdHMgZXJmb2xncmVpY2guCisqKgorKiogICAgViAwLjcgICAgMjguMDIuOTggMTk6MzA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYWx0ZW56YWhsIGVpbnN0ZWxsYmFyLgorKioKKyoqICAgIFYgMC44ICAgIDAxLjAzLjk4IDE5OjMwOjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FubmVuIGdhbnplciBWZXJ6ZWljaG5pc3NlLiBHZWh0IGpldHp0CisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenVtaW5kZXN0IGJlaSBSYWV1bWVuLgorKioKKyoqICAgIFYgMC45ICAgIDIwLjA5Ljk4IDIwOjQ1OjAwICAgUGFyYWNlbHN1cworKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbWdlc3RlbGx0IHZvbiBoZWFydF9iZWF0KCkgYXVmCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9vdXQoKSwgZGFtaXQgdGhpc19wbGF5ZXIoKQorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyaGFsdGVuIGJsZWlidC4KKyoqCSAgICAgICAxMy4xMC4wOAkJICAgQ2hhZ2FsbAorKioKKyoqCQkJCSAgICAgX3F1ZXJ5X2RldGFpbHMoKSB1bmQKKyoqCQkJCSAgICAgX3F1ZXJ5X3NwZWNpYWxfZGV0YWlscyBhdWYKKyoqCQkJCSAgICAgUXVlcnlQcm9wKCkgdW1nZXN0ZWxsdAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgIEV2ZW50dWVsbCBhdWZ0cmV0ZW5kZSBQcm9ibGVtZToKKyoqICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorKiogICAtIFp1IGhvaGUgZXZhbF9jb3N0LCB3ZW5uIHp1IHZpZWxlIERldGFpbHMgdm9yaGFuZGVuIHNpbmQuCisqKiAgICAgR3JvZXNzdGVyIGJpc2hlciBnZXRlc3RldGVyIFJhdW0gKG9obmUgRmVobGVyKSA6IDYzOTA3CisqKiAgICAgU2NoZWludCBhbHNvIHdvaGwgZG9jaCBrZWluIFByb2JsZW0genUgc2Vpbi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogICBJZGVlbi9Ub0RvOgorKiogICB+fn5+fn5+fn5+fgorKioKKyoqICAgLSBOUEMtSW5mb3MgdGVzdGVuLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHRlcm1pbmFsLmg+CisKKyNkZWZpbmUgREFUQUZJTEUgICAgICJ0ZXN0LmRhdCIKKyNkZWZpbmUgREVGQVVMVF9EQVRBICIvb2JqL3Rvb2xzL3Rlc3Rlci90ZXN0LmRhdCIKKworI2RlZmluZSBQX09URVNUX1RZUCAib2ItdGVzdDp0eXAiCisjZGVmaW5lIFBfT1RFU1RfU1BMICJvYi10ZXN0OnNwYWx0ZW4iCisKKyNkZWZpbmUgVF9ST0NIVVMgMQorI2RlZmluZSBUX1JJS1VTICAyCisKKyNkZWZpbmUgVF9QQVVTRSAgNAorCisjcHJhZ21hIHN0cm9uZ190eXBlcworCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworLy8gQWxsZ2VtZWluIGJlbm9ldGlndGUgZ2xvYmFsZSBWYXJpYWJsZW4KKworaW50ICAgICBzY2FudHlwLHNwYWx0ZW47CittYXBwaW5nIGFsbF9kZXRzOworbWl4ZWQgICBvdXRwdXQ7CitvYmplY3QgIG1hc3RlcjsKKworLy8gR2xvYmFsZSBWYXJpYWJsZW4gZnVlciBkYXMgc2Nhbm5lbiBnYW56ZXIgRGlyZWN0b3JpZXMKKworaW50ICAgICBzY2FucnVuLHNjYW5jb3VudCxzY2FucGF1c2UsKnNjYW5lcnI7CitzdHJpbmcgIHNjYW5kaXIsKnNjYW5maWxlczsKK29iamVjdCAgdGVzdG9iOworCitzdHJpbmcgeF9sb25nKCkKK3sgICBzdHJpbmcgcmUsUFJFLEVORDsKKworICAgIHN3aXRjaCAoUEwtPlF1ZXJ5UHJvcChQX1RUWSkpCisgICAgeworICAgICAgICBjYXNlICJhbnNpIiAgOgorICAgICAgICBjYXNlICJ2dDEwMCIgOiBQUkU9Qk9MRDsgRU5EPU5PUk1BTDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgICAgICA6IFBSRT0iIjsgICBFTkQ9IiI7ICAgICBicmVhazsKKyAgICB9CisKKyAgICByZSA9IGJyZWFrX3N0cmluZygKKyAgICAgICAgICJNaXQgZGllc2VtIE9iamVrdHBydWVmZXIga2FubnN0IER1IGZlc3RzdGVsbGVuLCB3ZWxjaGUgRGV0YWlscywgIisKKyAgICAgICAgICJHZXJ1ZWNoZSBvZGVyIEdlcmFldXNjaGUgaW4gZWluZW0gUmF1bSBiencgYW4gZWluZW0gT2JqZWt0IG5vY2ggIisKKyAgICAgICAgICJuaWNodCBiZXNjaHJpZWJlbiBzaW5kLiIsNzgpKworICAgICAgICAgIlxuIisKKyAgICAgICAgICJTeW50YXg6ICVzb3Rlc3QgW2RldGFpbHxzbWVsbHxzb3VuZF0gezxvYmpla3Q+W2luIG1pcnxpbSByYXVtXXwiKworICAgICAgICAgICAgICJoaWVyfVxuXG4iKworICAgICAgICAgIiAgICAgICAgb3R5cGUgW3Jpa3VzfHJvY2h1c11cblxuIisKKyAgICAgICAgICIgICAgICAgIG9jb2xtIFsxfDJ8M3w0fDV8Nnw3fDh8YXV0b11cblxuIisKKyAgICAgICAgICIgICAgICAgIG90ZGlyIDx2ZXJ6ZWljaG5pcz4gPGF1c2dhYmVmaWxlPiVzXG5cbiIrCisgICAgICAgICBicmVha19zdHJpbmcoCisgICAgICAgICAiTWl0ICVzb3R5cGUlcyBrYW5uIG1hbiBmZXN0bGVnZW4sIG9iIG1hbiBpbSAnUmlrdXMnLSBvZGVyIGltICIrCisgICAgICAgICAiJ1JvY2h1cyctTW9kdXMgc2Nhbm5lbiB3aWxsLCBtaXQgJXNvY29sbSVzIGRpZSBhbnphaGwgZGVyIEF1c2dhYmUiKworICAgICAgICAgInNwYWx0ZW4gdW5kIG1pdCAlc290ZXN0JXMgd2lyZCBkYW5uIGRpZSBBdXN3ZXJ0dW5nIGdlc3RhcnRldC4gIisKKyAgICAgICAgICJNaXQgZGVtIEtvbW1hbmRvICVzb3RkaXIlcyBrYW5uIG1hbiBzb2dhciBnYW56ZSBWZXJ6ZWljaG5pc3NlICIrCisgICAgICAgICAiYXVmIGVpbm1hbCB0ZXN0ZW4gbGFzc2VuLiBEYXMgZGF1ZXJ0IG5hdHVlcmxpY2ggZWluZSBXZWlsZS4gIisKKyAgICAgICAgICJBdXNzZXJkZW0gbXVzcyBlaW4gVmVyemVpY2huaXMgJy9sb2cvPG1hZ2llcm5hbWU+LycgYmVzdGVoZW4uIiw3OCkrCisgICAgICAgICAiRGVyemVpdGlnZXIgU2NhbnR5cDogICAgJXMnIisoc2NhbnR5cD09VF9ST0NIVVM/IlJPQ0hVUyI6IlJJS1VTIikrCisgICAgICAgICAiJyVzXG4iKworICAgICAgICAgIkRlcnplaXRpZ2UgU3BhbHRlbnphaGw6ICVzJXMlc1xuJXMiOworICAgIHJldHVybiBzcHJpbnRmKHJlLFBSRSxFTkQsUFJFLEVORCxQUkUsRU5ELFBSRSxFTkQsUFJFLEVORCxQUkUsRU5ELFBSRSwKKyAgICAgICAgICAgKHNwYWx0ZW4+MD9zcHJpbnRmKCIlZCIsc3BhbHRlbik6IidBVVRPJyIpLEVORCwKKyAgICAgICAgICAgKHNjYW5ydW4/c3ByaW50ZigKKyAgICAgICAgICAgICAgICJcbkRlcnplaXQgRGlyc2NhbiBpbjogICAgICVzJXMlc1xuIisKKyAgICAgICAgICAgICAgICJBbmdlbm9tbWVuZSBSZXN0emVpdDogICAlcyglcykgW0ZpOiVkLyVkfEVyOiVkfFNrOiVkXSVzXG4iLAorICAgICAgICAgICAgICAgUFJFLHNjYW5kaXIsRU5ELFBSRSwKKyAgICAgICAgICAgICAgIHRpbWUyc3RyaW5nKCIlaDolMDJtOiUwMnMiLChzY2FucnVuLTEpKjQqVF9QQVVTRSksCisgICAgICAgICAgICAgICAoc2l6ZW9mKHNjYW5maWxlcyktc2NhbnJ1bisxKSwoc2l6ZW9mKHNjYW5maWxlcykpLAorICAgICAgICAgICAgICAgc2NhbmVyclswXSxzY2FuZXJyWzFdLEVORCk6IiIpKTsKK30KKwordm9pZCBjcmVhdGUoKQoreworICAgIGlmICghY2xvbmVwKE1FKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgOjpjcmVhdGUoKTsKKworLy8gQWxsZ2VtZWluZSBnbG9iYWxlIFZhcmlhYmxlbiBpbml0aWFsaXNpZXJlbgorCisgICAgc2NhbnR5cCAgID0gVF9ST0NIVVM7CisgICAgc3BhbHRlbiAgID0gNDsKKyAgICBhbGxfZGV0cyAgPSAoW10pOworICAgIG91dHB1dCAgICA9IDA7CisKKy8vIEdsb2JhbGUgVmFyaWFibGVuIGZ1ZXIgZGVuIERpcmVjdG9yeXNjYW4gaW5pdGlhbGlzaWVyZW4KKworICAgIHNjYW5kaXIgICA9IDA7CisgICAgc2NhbnJ1biAgID0gMDsKKyAgICBzY2FuZmlsZXMgPSAoe30pOworICAgIHNjYW5jb3VudCA9IDA7CisgICAgc2NhbnBhdXNlID0gMDsKKyAgICBzY2FuZXJyICAgPSAoezAsMH0pOworCisvLyBQcm9wZXJ0aWVzCisKKyAgICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBPYmpla3RwcnVlZmVyIikgOworICAgIFNldChQX0xPTkcsIyd4X2xvbmcsRl9RVUVSWV9NRVRIT0QpOworICAgIFNldFByb3AoUF9OQU1FLCJPYmpla3RwcnVlZmVyIik7CisgICAgU2V0UHJvcChQX0dFTkRFUixNQUxFKTsKKyAgICBTZXRQcm9wKFBfQVVUT0xPQURPQkosMSk7CisgICAgU2V0UHJvcChQX1ZBTFVFLDApOworICAgIFNldFByb3AoUF9XRUlHSFQsMCk7CisgICAgU2V0UHJvcChQX05PRFJPUCwxKTsKKyAgICBTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOworCisgICAgQWRkSWQoICh7InBydWVmZXIiLCJvYmpla3RwcnVlZmVyIn0pICk7CisKKyAgICBBZGRDbWQoICJvdGVzdCIsInNlYXJjaCIgKTsKKyAgICBBZGRDbWQoICJvdHlwZSIsInNjYW5hcnQiICk7CisgICAgQWRkQ21kKCAib2NvbG0iLCJzcGFsdGVuemFobCIgKTsKKyAgICBBZGRDbWQoICJvdGRpciIsImRpcnRlc3RlbiIgKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgICA6OmluaXQoKTsKKyAgICBpZiAoUEwtPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpIHx8IElTX0xFQVJORVIoUEwpKQorICAgIHsKKyAgICAgICAgc2NhbnR5cD0oUEwtPlF1ZXJ5UHJvcChQX09URVNUX1RZUCl8fFRfUk9DSFVTKTsKKyAgICAgICAgc3BhbHRlbj0oUEwtPlF1ZXJ5UHJvcChQX09URVNUX1NQTCl8fDQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChmaW5kX2NhbGxfb3V0KCJyZW1vdmVuIikgPT0gLTEpCisgICAgICBjYWxsX291dCgicmVtb3ZlbiIsMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgRGllIEhpbGZzZnVua3Rpb25lbiBkZXMgT2JqZWt0dGVzdGVycy4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCit2b2lkIE91dHB1dChzdHJpbmcgdGV4dCkKK3sKKyAgICBpZiAoIXRleHQgfHwgIXN0cmluZ3AodGV4dCkpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAob2JqZWN0cChvdXRwdXQpKQorICAgICAgICBvdXRwdXQtPk1vcmUodGV4dCk7CisgICAgZWxzZSBpZiAoc3RyaW5ncChvdXRwdXQpKQorICAgICAgICB3cml0ZV9maWxlKG91dHB1dCx0ZXh0KTsKKyAgICBlbHNlCisgICAgICAgIHdyaXRlKHRleHQpOworfQorCitpbnQgcmVtb3ZlbigpCit7CisgICAgd3JpdGUoIkRpZXNlcyBUb29sIGlzdCBudXIgZnVlciBUZXN0aWVzIHVuZCBNYWdpZXIhXG4iKTsKKyAgICByZW1vdmUoKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RyaW5nICpncm9zcyhzdHJpbmcgcykKK3sKKyAgICByZXR1cm4gcmVnZXhwKHJlZ2V4cGxvZGUocywiW15BLVphLXowLTldIiksIlxcPFtBLVpdIik7Cit9CisKK3N0cmluZyAqZGV0X2F1c3dlcnRlbihzdHJpbmcgaW5wdXQpCit7ICAgc3RyaW5nICp3b3JkcyxzdHIsKnJlOworICAgIGludCAgICBhbmYsbixpOworCisgICAgaWYgKHNjYW50eXA9PVRfUklLVVMpCisgICAgICAgIHJldHVybiBncm9zcyhpbnB1dCk7CisKKyAgICByZSA9ICh7fSk7CisgICAgaWYgKCFpbnB1dCB8fCAhc3RyaW5ncChpbnB1dCkpCisgICAgICAgIHJldHVybiByZTsKKworICAgIHdvcmRzPXJlZ2V4cGxvZGUoaW5wdXQsIlteQS1aYS16MC05XSIpOworICAgICAgICBuPXNpemVvZih3b3Jkcyk7CisgICAgaWYgKCFuKQorICAgICAgICByZXR1cm4gcmU7CisKKyAgICBhbmY9MTsKKyAgICBmb3IgKGk9MDtpPG47aSsrKQorICAgIHsKKyAgICAgICAgc3RyPXdvcmRzW2ldOworICAgICAgICBpZiAoc3RyPT0iIiB8fCBzdHI9PSIgIikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RyPT0iLiIgfHwgc3RyPT0iOiIgfHwgc3RyPT0iPyIgfHwgc3RyPT0iISIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFuZj0xOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemVvZihyZWdleHAoKHtzdHJ9KSwiW15BLVphLXowLTldIikpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzaXplb2YocmVnZXhwKCh7c3RyfSksIlxcPFswLTldKlxcPiIpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RyIT1jYXBpdGFsaXplKHN0cikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFuZikKKyAgICAgICAgeworICAgICAgICAgICAgYW5mPTA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZSArPSAoeyBzdHIgfSk7CisgICAgfQorICAgIHJldHVybiByZTsKK30KKwordmFyYXJncyBtaXhlZCB0ZXN0X2RldGFpbHMoc3RyaW5nIHN0ciwgc3RyaW5nIGRlZikKK3sgICBzdHJpbmcgKnN0cnMsb3N0ciwqc3RyczIsc3VmOworICAgIGludCAgICBpOworCisgICAgaWYgKCFzdHIgfHwgIXN0cmluZ3Aoc3RyKSB8fCAhbWFwcGluZ3AoYWxsX2RldHMpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cnMgPSAoe3N0cn0pOworICAgIG9zdHIgPSBzdHI7CisKKyAgICBpZiAoKHN1Zj1zdHJbPDEuLjwxXSk9PSJzIiB8fCBzdWY9PSJuIiB8fCBzdWY9PSJlIikKKyAgICB7CisgICAgICAgIG9zdHIgID0gc3RyWzAuLjwyXTsKKyAgICAgICAgc3RycyArPSAoeyBvc3RyIH0pOworICAgICAgICBvc3RyICs9ICgiKCIrc3VmKyIpIik7CisgICAgfQorICAgIGlmICgoc3VmPXN0cls8Mi4uPDFdKT09ImVzIiB8fCBzdWY9PSJlbiIpCisgICAgeworICAgICAgICBvc3RyICA9IHN0clswLi48M107CisgICAgICAgIHN0cnMgKz0gKHsgb3N0ciB9KTsKKyAgICAgICAgb3N0ciArPSAoIigiK3N1ZisiKSIpOworICAgIH0KKyAgICBmb3IgKCBzdHJzMj0oe30pLGk9c2l6ZW9mKHN0cnMpLTEgOyBpPj0wIDsgaS0tKQorICAgICAgICBpZiAobWVtYmVyKGFsbF9kZXRzLHN0cnNbaV0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyaW5ncChkZWYpICYmIGFsbF9kZXRzW3N0cnNbaV1dPT1kZWYgJiYgc3RyIT1TRU5TRV9ERUZBVUxUKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgc3RyczIgKz0gKHsgc3Ryc1tpXSB9KTsKKwl9CisgICAgaWYgKHNpemVvZihzdHJzMik+MCkKKyAgICAgICAgcmV0dXJuIHN0cnMyOworICAgIHJldHVybiBvc3RyOworfQorCitzdHJpbmcgKmV2YWxfZGV0YWlsX2VudHJ5KG1peGVkIGtleSkKK3sgICBtaXhlZCAgcmUsaDsKKyAgICBzdHJpbmcgKnJhOworICAgIGludCAgICBpOworCisgICAgaWYgKCFrZXkgfHwgIXN0cmluZ3Aoa2V5KSB8fCAhbWFwcGluZ3AoYWxsX2RldHMpIHx8ICFtZW1iZXIoYWxsX2RldHMsa2V5KSkKKyAgICAgICAgcmV0dXJuICh7fSk7CisKKyAgICByZT1hbGxfZGV0c1trZXldOworICAgIGlmIChjbG9zdXJlcChyZSkpCisgICAgICAgIHJlPWZ1bmNhbGwocmUsa2V5KTsKKyAgICBpZiAobWFwcGluZ3AocmUpKQorICAgIHsKKyAgICAgICAgcmE9ZmlsdGVyKG1faW5kaWNlcyhyZSksIydzdHJpbmdwKTsKKyAgICAgICAgZm9yICggaD0oeyByZVswXSB9KSxpPXNpemVvZihyYSktMSA7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICAgaWYgKHN0cmluZ3AocmVbcmFbaV1dKSkKKyAgICAgICAgICAgICAgICBoICs9ICh7IHJlW3JhW2ldXSB9KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvaW50ZXJwKHJlW3JhW2ldXSkpCisgICAgICAgICAgICAgICAgaCArPSByZVtyYVtpXV07CisgICAgICAgIHJlPWg7CisgICAgfQorICAgIGlmIChwb2ludGVycChyZSkpCisgICAgICAgIHJldHVybiBmaWx0ZXIocmUsIydzdHJpbmdwKTsKKyAgICBpZiAoc3RyaW5ncChyZSkpCisgICAgICAgIHJldHVybiAoeyByZSB9KTsKKyAgICByZXR1cm4gKHt9KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBEaWUgRnVua3Rpb24sIGRpZSBkaWUgKFNwZWNpYWwpRGV0YWlscyBpbSBSYXVtIHVudGVyc3VjaHQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IHNlYXJjaF9kKG9iamVjdCByKQoreyAgIGludCAgICAgaSxqLHJvb207CisgICAgbWFwcGluZyBtOworICAgIHN0cmluZyAgKnMsczEsKnMyLFBSRSxFTkQsKnNwZWNpYWwsKnp1ZmluZGVuLCpkZXRhaWxzLHJlLCp1ZWJlcmdlaGVuOworICAgIG1peGVkICAgbWk7CisKKyAgICBpZiAoIXIgfHwgIW9iamVjdHAocikpCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1QtRVJST1I6IEtlaW4gKGV4aXN0aWVyZW5kZXMpIFppZWxvYmpla3QgZ2VmdW5kZW4hXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisvLyBEaWUgQXVzZ2FiZW4gZXJmb2xnZW4genVuYWVjaHN0IGluIGVpbmVuIFN0cmluZy4KKworICAgIHJlPSJcbiI7CisKKy8vIEhhbmRlbHQgZXMgc2ljaCB1bSBlaW5lbiBSYXVtPworCisgICAgcm9vbSA9IChmdW5jdGlvbl9leGlzdHMoImludF9sb25nIixyKSA/IDEgOiAwICk7CisKKy8vIFRlcm1pbmFsdHlwIGRlcyBNYWdpZXJzIGZlc3RzdGVsbGVuLgorCisgICAgaWYgKG9iamVjdHAob3V0cHV0KSkKKyAgICAgICAgc3dpdGNoIChvdXRwdXQtPlF1ZXJ5UHJvcChQX1RUWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgImFuc2kiICA6CisgICAgICAgICAgICBjYXNlICJ2dDEwMCIgOiBQUkU9Qk9MRDsgRU5EPU5PUk1BTDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0ICAgICAgOiBQUkU9IiI7ICAgRU5EPSIiOyAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQUkU9IiI7CisgICAgICAgIEVORD0iIjsKKyAgICB9CisKKy8vICBMaXN0ZSBkZXIgenUgdWViZXJnZWhlbmRlbiBEZXRhaWxzIGVyemV1Z2VuLiBEaWUgdmVyd2VuZGV0ZSBNZXRob2RlIGhhdCBkZW4KKy8vICBWb3J0ZWlsLCBkYXNzIG1hbiBuYWNoIGVpbmVyIEVyZ2Flbnp1bmcgZGVyIExpc3RlIG5pY2h0IGRhcyBUb29sIG5ldSBsYWRlbgorLy8gIHVuZCBjbG9uZW4gbXVzcy4gRGFzIFRvb2wgZXJ3YXJ0ZXQsIGRpZSBMaXN0ZSBEQVRBRklMRSBpbSBnbGVpY2hlbgorLy8gIFZlcnplaWNobmlzIHp1IGZpbmRlbiwgaW4gZGVtIGF1Y2ggZGFzIFRvb2wgbGllZ3QuCisKKyAgICBzMT1pbXBsb2RlKGV4cGxvZGUob2xkX2V4cGxvZGUob2JqZWN0X25hbWUoTUUpLCIjIilbMF0sIi8iKVswLi48Ml0sIi8iKSsiLyIKKyAgICAgICBEQVRBRklMRTsKKyAgICBpZiAoZmlsZV9zaXplKHMxKTwxKQorICAgICAgICBzMT1ERUZBVUxUX0RBVEE7CisKKyAgICB1ZWJlcmdlaGVuID0gcmVnZXhwKHJlZ2V4cGxvZGUocmVhZF9maWxlKHMxKSwiW15BLVphLXowLTldIiksIlxcPFthLXpdIik7CisKKy8vIFNhdHogYW4gRGV0YWlscywgZGllIGF1ZiBqZWRlbiBGYWxsIHZvcmhhbmRlbiBzZWluIHNvbGx0ZW4sIGplIG5hY2hkZW0KKy8vIG9iIFBfSU5ET09SUyBnZXNldHp0IGlzdCBvZGVyIG5pY2h0LgorCisgICAgaWYgKHJvb20gJiYgci0+UXVlcnlQcm9wKFBfSU5ET09SUykpCisgICAgICAgIHp1ZmluZGVuID0gKHsiQm9kZW4iLCJEZWNrZSIsIldhbmQiLCJXYWVuZGUiLCJSYXVtIn0pOworICAgIGVsc2UgaWYgKHJvb20pCisgICAgICAgIHp1ZmluZGVuID0gKHsiQm9kZW4iLCJIaW1tZWwiLCJTb25uZSIsIldvbGtlIiwiV29sa2VuIn0pOworICAgIGVsc2UKKyAgICAgICAgenVmaW5kZW4gPSAoe30pOworCisvLyBBbGxlIHZvcmhhbmRlbmVuIERldGFpbHMgYW56ZWlnZW4uCisKKy8vICAgIGRldGFpbHMgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhyLT5fcXVlcnlfZGV0YWlscygpfHwoW10pKSwjJzwpOworICAgIGRldGFpbHMgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhyLT5RdWVyeVByb3AoUF9ERVRBSUxTKXx8KFtdKSksIyc8KTsKKworICAgIGlmIChzY2FucnVuPDEpCisgICAgeworICAgICAgICBpZiAoKGk9c2l6ZW9mKGRldGFpbHMpKT4wKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBzMT0iIiwtLWk7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICAgICAgIHMxICs9IChkZXRhaWxzW2ldKyhpPyJcbiI6IiIpKTsKKworICAgICAgICAgICAgcmUgKz0gc3ByaW50ZihzcHJpbnRmKCIlc0xpc3RlIGRlciB2b3JoYW5kZW5lbiBEZXRhaWxzOiVzXG5cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iLFBSRSxFTkQsKCIlLSM3OCIrKHNwYWx0ZW48MT8iIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiLiVkIixzcGFsdGVuKSkrInMiKSksczEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoIiVzS2VpbmUgRGV0YWlscyBnZWZ1bmRlbi4lc1xuXG4iLFBSRSxFTkQpOworICAgIH0KKworLy8gQWxsZSB2b3JoYW5kZW5lbiBTcGVjaWFsRGV0YWlscyBhbnplaWdlbi4KKworLy8gICAgc3BlY2lhbD1zb3J0X2FycmF5KG1faW5kaWNlcyhyLT5fcXVlcnlfc3BlY2lhbF9kZXRhaWxzKCl8fChbXSkpLCMnPCk7CisgICAgc3BlY2lhbD1zb3J0X2FycmF5KG1faW5kaWNlcyhyLT5RdWVyeVByb3AoUF9TUEVDSUFMX0RFVEFJTFMpfHwoW10pKSwjJzwpOworCisgICAgaWYgKHNjYW5ydW48MSkKKyAgICB7CisgICAgICAgIGlmICgoaT1zaXplb2Yoc3BlY2lhbCkpPjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIHMxPSIiLC0taSA7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICAgICAgIHMxICs9IChzcGVjaWFsW2ldKyhpPyJcbiI6IiIpKTsKKworICAgICAgICAgICAgcmUgKz0gc3ByaW50ZihzcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNMaXN0ZSBkZXIgdm9yaGFuZGVuZW4gU3BlY2lhbERldGFpbHM6JXNcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIsUFJFLEVORCwoIiUtIzc4Iisoc3BhbHRlbjwxPyIiOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIuJWQiLHNwYWx0ZW4pKSsicyIpKSxzMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNLZWluZSBTcGVjaWFsRGV0YWlscyBnZWZ1bmRlbi4lc1xuXG4iLFBSRSxFTkQpOworICAgIH0KKworLy8gIERpZSBMaXN0ZW4gZGVyIHZvcmhhbmRlbmVuIERldGFpbHMgdW5kIFNwZWNpYWxEZXRhaWxzIHZlcmVpbmlnZW4uCisKKyAgICBkZXRhaWxzICs9IHNwZWNpYWw7CisKKy8vICBEZXRhaWxzIHVuZCBTcGVjaWFsRGV0YWlscyBhdXN3ZXJ0ZW4gLSBnYXIgbmljaHQgc28gZWluZmFjaC4KKworICAgIGFsbF9kZXRzID0gci0+UXVlcnkoUF9ERVRBSUxTKTsKKworICAgIGZvciAoIHM9KHt9KSxpPXNpemVvZihkZXRhaWxzKS0xIDsgaT49MCA7IGktLSkKKyAgICAgICAgcyArPSBldmFsX2RldGFpbF9lbnRyeShkZXRhaWxzW2ldKTsKKworICAgIGZvciAoIHMyPSh7fSksaT1zaXplb2YocyktMSA7IGk+PTAgOyBpLS0gKQorICAgICAgICBpZiAoc3RyaW5ncChzW2ldKSkKKyAgICAgICAgICAgIGlmIChtZW1iZXIoczIsc1tpXSk9PS0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMyICs9ICh7IHNbaV0gfSk7CisgICAgICAgICAgICAgICAgenVmaW5kZW4rPWRldF9hdXN3ZXJ0ZW4oc1tpXSk7CisgICAgICAgICAgICB9CisKKy8vICBHcm9zc2dlc2NocmllYmVuZSBXb2VydGVyIGF1cyBkZXIgTGFuZ2Jlc2NocmVpYnVuZyBoaW56dWZ1ZWdlbi4KKworICAgIGlmIChmdW5jdGlvbl9leGlzdHMoImludF9sb25nIixyKSkKKyAgICAgICAgenVmaW5kZW4gKz0gZGV0X2F1c3dlcnRlbigKKyAgICAgICAgICAgIG9sZF9leHBsb2RlKHItPmludF9sb25nKG1hc3RlcixtYXN0ZXIpLCJFcyBnaWJ0ICIpWzBdKTsKKyAgICBlbHNlCisgICAgICAgIHp1ZmluZGVuICs9IGRldF9hdXN3ZXJ0ZW4ob2xkX2V4cGxvZGUoci0+bG9uZygpLCJlbnRoYWVsdDoiKVswXSk7CisKKy8vIERvcHBlbHRlIEVpbnRyYWVnZSBlbGltaW5pZXJlbi4KKworICAgIGZvciAoIHMyPSh7fSksIGk9c2l6ZW9mKHp1ZmluZGVuKS0xIDsgaT49MCA7IGktLSkKKyAgICAgICAgaWYgKG1lbWJlcihzMix6dWZpbmRlbltpXSk9PS0xKQorICAgICAgICAgICAgczIgKz0gKHsgenVmaW5kZW5baV0gfSk7CisKKy8vIEFsbGVzIGtsZWluIG1hY2hlbi4KKworICAgIHp1ZmluZGVuPW1hcChzMiwjJ2xvd2VyX2Nhc2UpOworCisvLyBCZWkgTlBDcy9PYmpla3RlbiBkaWUgSURzIHJhdXNmaWx0ZXJuLgorCisgICAgaWYgKCFyb29tKQorICAgICAgICB6dWZpbmRlbiAtPSByLT5RdWVyeVByb3AoUF9JRFMpOworCisvLyBEaWUgenUgdWViZXJnZWhlbmRlbiBEZXRhaWxzIHJhdXNmaWx0ZXJuLgorCisgICAgenVmaW5kZW49ZmlsdGVyKCh6dWZpbmRlbi11ZWJlcmdlaGVuKSwjJ3N0cmluZ3ApOworCisvLyBTY2hhdWVuLCB3ZWxjaGUgRGV0YWlscyBmZWhsZW4gdW5kIGRpZXNlIEF1c2dlYmVuLgorCisgICAgZm9yICggcz0oe30pLHMyPSh7fSksaT1zaXplb2YoenVmaW5kZW4pLTE7aT49MDtpLS0pCisgICAgeworICAgICAgICBpZiAoIShtaT10ZXN0X2RldGFpbHMoenVmaW5kZW5baV0pKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocG9pbnRlcnAobWkpKQorICAgICAgICB7CisgICAgICAgICAgIGZvciAoaj1zaXplb2YobWkpLTEgOyBqPj0wIDsgai0tKQorICAgICAgICAgICAgICAgaWYgKG1lbWJlcihzLG1pW2pdKT09LTEpCisgICAgICAgICAgICAgICAgICAgcyArPSAoeyBtaVtqXSB9KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJpbmdwKG1pKSAmJiBtZW1iZXIoczIsbWkpPT0tMSkKKyAgICAgICAgICAgIHMyICs9ICh7IG1pIH0pOworICAgIH0KKworICAgIHMgID0gc29ydF9hcnJheShzLCAjJzwpOworICAgIHMyID0gc29ydF9hcnJheShzMiwjJzwpOworCisgICAgaWYgKHNjYW5ydW48MSkKKyAgICB7CisgICAgICAgIGlmICgoaT1zaXplb2YocykpPjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIHMxPSIiLC0taSA7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICAgICAgIHMxICs9IChzW2ldKyhpPyJcbiI6IiIpKTsKKworICAgICAgICAgICAgcmUgKz0gc3ByaW50ZihzcHJpbnRmKCIlc0xpc3RlIGRlciBnZWZ1bmRlbmVuIERldGFpbHM6JXNcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIsUFJFLEVORCwoIiUtIzc4Iisoc3BhbHRlbjwxPyIiOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIuJWQiLHNwYWx0ZW4pKSsicyIpKSxzMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNFcyBnaWJ0IGtlaW5lIERldGFpbHMuJXNcblxuIixQUkUsRU5EKTsKKyAgICB9CisKKyAgICBpZiAoKGk9c2l6ZW9mKHMyKSk+MCkKKyAgICB7CisgICAgICAgIGZvciAoIHMxPSIiLC0taSA7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICBzMSArPSAoczJbaV0rKGk/IlxuIjoiIikpOworCisgICAgICAgIHJlICs9IHNwcmludGYoc3ByaW50ZigiJXNMaXN0ZSBkZXIgZmVobGVuZGVuIERldGFpbHM6JXNcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIixQUkUsRU5ELCgiJS0jNzgiKyhzcGFsdGVuPDE/IiI6CisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiLiVkIixzcGFsdGVuKSkrInMiKSksczEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlICs9IHNwcmludGYoIiVzRXMgZmVobGVuIGtlaW5lIERldGFpbHMuJXNcblxuIixQUkUsRU5EKTsKKworICAgIGlmIChzY2FucnVuPDEpCisgICAgICAgIHJlICs9IHNwcmludGYoIiVzRkVSVElHLiVzXG4iLFBSRSxFTkQpOworCisvLyBEaWUgZWlnZW50bGljaGUgVGV4dGF1c2dhYmUuCisKKyAgICBPdXRwdXQocmUpOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgSGF1cHRmdW5rdGlvbiBmdWVyIGRhcyBUZXN0ZW4gdm9uIEdlcmFldXNjaGVuIHVuZCBHZXJ1ZWNoZW4uCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IHNlYXJjaF9zZW5zZShvYmplY3QgciwgaW50IHNlbnNlKQoreyAgIHN0cmluZyByZSxQUkUsRU5ELFdBUywqc2Vuc2VzLHMxLCp6dWZpbmRlbiwqczIsKnMzLGRlZjsKKyAgICBpbnQgICAgaSxqOworICAgIG1peGVkICBtaTsKKworICAgIGlmICghciB8fCAhb2JqZWN0cChyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVC1FUlJPUjogS2VpbiAoZXhpc3RpZXJlbmRlcykgWmllbG9iamVrdCBnZWZ1bmRlbiFcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHNlbnNlPT1TRU5TRV9TTUVMTCkKKyAgICB7CisgICAgICAgIGFsbF9kZXRzPXItPlF1ZXJ5KFBfU01FTExTKXx8KFtdKTsKKyAgICAgICAgV0FTPSJHZXJ1ZWNoZSI7CisgICAgfQorICAgIGVsc2UgaWYgKHNlbnNlPT1TRU5TRV9TT1VORCkKKyAgICB7CisgICAgICAgIGFsbF9kZXRzPXItPlF1ZXJ5KFBfU09VTkRTKXx8KFtdKTsKKyAgICAgICAgV0FTPSJHZXJhZXVzY2hlIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNULUVSUk9SOiBJbGxlZ2FsZXIgc2Vuc2UtV2VydCBpbiBzZWFyY2hfc2Vuc2UoKVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJlID0gIlxuIjsKKworICAgIHp1ZmluZGVuID0gKHtTRU5TRV9ERUZBVUxUfSk7CisKKyAgICBkZWYgPSBhbGxfZGV0c1tTRU5TRV9ERUZBVUxUXTsKKworLy8gVGVybWluYWx0eXAgZGVzIE1hZ2llcnMgZmVzdHN0ZWxsZW4uCisKKyAgICBpZiAob2JqZWN0cChvdXRwdXQpKQorICAgICAgICBzd2l0Y2ggKG91dHB1dC0+UXVlcnlQcm9wKFBfVFRZKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAiYW5zaSIgIDoKKyAgICAgICAgICAgIGNhc2UgInZ0MTAwIiA6IFBSRT1CT0xEOyBFTkQ9Tk9STUFMOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgICAgICA6IFBSRT0iIjsgICBFTkQ9IiI7ICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBSRT0iIjsKKyAgICAgICAgRU5EPSIiOworICAgIH0KKworICAgIHNlbnNlcyA9IHNvcnRfYXJyYXkobV9pbmRpY2VzKGFsbF9kZXRzKSwjJzwpOworCisvLyBBbGxlIHZvcmhhbmRlbmVuIFNlbnNlLURldGFpbHMgYW56ZWlnZW4uCisKKyAgICBpZiAoc2NhbnJ1bjwxKQorICAgIHsKKyAgICAgICAgaWYgKChpPXNpemVvZihzZW5zZXMpKT4wKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBzMT0iIiwtLWk7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICAgICAgIHMxICs9ICgoc2Vuc2VzW2ldPT1TRU5TRV9ERUZBVUxUPyJERUZBVUxUIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNlc1tpXSkrKGk/IlxuIjoiIikpOworCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKHNwcmludGYoIiVzTGlzdGUgZGVyIHZvcmhhbmRlbmVuICVzOiVzXG5cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iLFBSRSxXQVMsRU5ELCgiJS0jNzgiKyhzcGFsdGVuPDE/IiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIi4lZCIsc3BhbHRlbikpKyJzIikpLHMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKCIlc0tlaW5lICVzIGdlZnVuZGVuLiVzXG5cbiIsUFJFLFdBUyxFTkQpOworICAgIH0KKworCisvLyAgU2Vuc2UtRGV0YWlscyBhdXN3ZXJ0ZW4gLSBnZWh0IHdpZSBiZWkgRGV0YWlscy4KKworICAgIGZvciAoIHMyPSh7fSksaT1zaXplb2Yoc2Vuc2VzKS0xIDsgaT49MCA7IGktLSkKKyAgICAgICAgczIgKz0gZXZhbF9kZXRhaWxfZW50cnkoc2Vuc2VzW2ldKTsKKworICAgIGZvciAoIHMzPSh7fSksaT1zaXplb2YoczIpLTEgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgaWYgKHN0cmluZ3AoczJbaV0pKQorICAgICAgICAgICAgaWYgKG1lbWJlcihzMyxzMltpXSk9PS0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMzICs9ICh7IHMyW2ldIH0pOworICAgICAgICAgICAgICAgIHp1ZmluZGVuKz1kZXRfYXVzd2VydGVuKHMyW2ldKTsKKyAgICAgICAgICAgIH0KKworLy8gVGVzdGVuLCB3ZWxjaGUgU2Vuc2UtRGV0YWlscyBmZWhsZW4gdW5kIGFuemVpZ2VuCisKKyAgICBmb3IgKCBzMj0oe30pLHMzPSh7fSksaT1zaXplb2YoenVmaW5kZW4pLTE7aT49MDtpLS0pCisgICAgeworICAgICAgICBpZiAoIShtaT10ZXN0X2RldGFpbHMoenVmaW5kZW5baV0sZGVmKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHBvaW50ZXJwKG1pKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPXNpemVvZihtaSktMSA7IGo+PTAgOyBqLS0pCisgICAgICAgICAgICAgICAgaWYgKG1lbWJlcihzMixtaVtqXSk9PS0xKQorICAgICAgICAgICAgICAgICAgICBzMiArPSAoeyBtaVtqXSB9KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJpbmdwKG1pKSAmJiBtZW1iZXIoczMsbWkpPT0tMSkKKyAgICAgICAgICAgIHMzICs9ICh7IG1pIH0pOworICAgIH0KKyAgICBzMiA9IHNvcnRfYXJyYXkoczIsIyc8KTsKKyAgICBzMyA9IHNvcnRfYXJyYXkoczMsIyc8KTsKKworICAgIGlmIChzY2FucnVuPDEpCisgICAgeworICAgICAgICBpZiAoKGk9c2l6ZW9mKHMyKSk+MCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggczE9IiIsLS1pIDsgaT49MCA7IGktLSApCisgICAgICAgICAgICAgICAgczEgKz0gKChzMltpXT09U0VOU0VfREVGQVVMVD8iREVGQVVMVCI6czJbaV0pKyhpPyJcbiI6IiIpKTsKKworICAgICAgICAgICAgcmUgKz0gc3ByaW50ZihzcHJpbnRmKCIlc0xpc3RlIGRlciBnZWZ1bmRlbmVuICVzOiVzXG5cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iLFBSRSxXQVMsRU5ELCgiJS0jNzgiKyhzcGFsdGVuPDE/IiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIi4lZCIsc3BhbHRlbikpKyJzIikpLHMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKCIlc0VzIGdpYnQga2VpbmUgJXMuJXNcblxuIixQUkUsV0FTLEVORCk7CisgICAgfQorCisgICAgaWYgKChpPXNpemVvZihzMykpPjApCisgICAgeworICAgICAgICBmb3IgKCBzMT0iIiwtLWkgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgczEgKz0gKChzM1tpXT09U0VOU0VfREVGQVVMVD8iREVGQVVMVCI6czNbaV0pKyhpPyJcbiI6IiIpKTsKKworICAgICAgICByZSArPSBzcHJpbnRmKHNwcmludGYoIiVzTGlzdGUgZGVyIGZlaGxlbmRlbiAlczolc1xuXG4iKworICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iLFBSRSxXQVMsRU5ELCgiJS0jNzgiKyhzcGFsdGVuPDE/IiI6CisgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiLiVkIixzcGFsdGVuKSkrInMiKSksczEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlICs9IHNwcmludGYoIiVzRXMgZmVobGVuIGtlaW5lICVzLiVzXG5cbiIsUFJFLFdBUyxFTkQpOworCisgICAgaWYgKHNjYW5ydW48MSkKKyAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNGRVJUSUcuJXNcbiIsUFJFLEVORCk7CisKKy8vIERpZSBlaWdlbnRsaWNoZSBUZXh0YXVzZ2FiZS4KKworICAgIE91dHB1dChyZSk7CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBEaWUgRnVua3Rpb24sIGRpZSBkaWUgR2VyYWV1c2NoZSBpbSBSYXVtIHVudGVyc3VjaHQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IHNlYXJjaF9uKG9iamVjdCByKQoreworICAgIGlmICghciB8fCAhb2JqZWN0cChyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVC1FUlJPUjogS2VpbiAoZXhpc3RpZXJlbmRlcykgWmllbG9iamVrdCBnZWZ1bmRlbiFcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VhcmNoX3NlbnNlKHIsU0VOU0VfU09VTkQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIERpZSBGdW5rdGlvbiwgZGllIGRpZSBHZXJ1ZWNoZSBpbSBSYXVtIHVudGVyc3VjaHQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IHNlYXJjaF9tKG9iamVjdCByKQoreworICAgIGlmICghciB8fCAhb2JqZWN0cChyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVC1FUlJPUjogS2VpbiAoZXhpc3RpZXJlbmRlcykgWmllbG9iamVrdCBnZWZ1bmRlbiFcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VhcmNoX3NlbnNlKHIsU0VOU0VfU01FTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIERpZSBGdW5rdGlvbiwgZGllIGRhcyBlaW5nZWdlYmVuZSBLb21tYW5kbyB6ZXJsZWd0IHVuZCBpbnRlcnByZXRpZXJ0LgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBzZWFyY2goc3RyaW5nIGFyZykKK3sgICBzdHJpbmcgKmluLGR1bTsKKyAgICBvYmplY3QgdGFyZzsKKyAgICBpbnQgICAgd287CisKKyAgICBpZiAoIShQTC0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpICYmICFJU19MRUFSTkVSKFBMKSkKKyAgICAgICAgcmV0dXJuIHJlbW92ZW4oKTsKKworICAgIGlmIChzY2FucnVuKQorICAgIHsKKyAgICAgICAgd3JpdGUoIkRlcnplaXQgd2lyZCBlaW4gVmVyemVpY2huaXMgZ2VzY2FubmVkLiBCaXR0ZSB3YXJ0ZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbm90aWZ5X2ZhaWwoIk9URVNULVN5bnRheDogb3Rlc3QgW2RldGFpbHxzbWVsbHxzb3VuZF0gIisKKyAgICAgICAgICAgICAgICAgIns8b2JqZWt0PltpbiBtaXJ8aW0gcmF1bV18aGllcn1cbiIpOworCisgICAgaWYgKCFhcmcgfHwgIXN0cmluZ3AoYXJnKSB8fCBzaXplb2YoaW49b2xkX2V4cGxvZGUoYXJnLCIgIikpPDEpCisgICAgeworICAgICAgICBvdXRwdXQ9UEw7CisgICAgICAgIHNjYW5ydW49MDsKKyAgICAgICAgbWFzdGVyPVBMOworICAgICAgICByZXR1cm4gc2VhcmNoX2QoZW52aXJvbm1lbnQoUEwpKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZW9mKGluKT4xKQorICAgIHsKKyAgICAgICAgYXJnPWltcGxvZGUoaW5bMS4uXSwiICIpOworICAgICAgICBpZiAobWVtYmVyKCh7ImhpZXIiLCJyYXVtIiwiIn0pLGFyZykhPS0xKQorICAgICAgICAgICAgdGFyZz1lbnZpcm9ubWVudChQTCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNzY2FuZihhcmcsIiVzIGluIG1pciIsZHVtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3bz0xOworICAgICAgICAgICAgICAgIGFyZz1kdW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzc2NhbmYoYXJnLCIlcyBpbSByYXVtIixkdW0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvPS0xOworICAgICAgICAgICAgICAgIGFyZz1kdW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHdvPTA7CisgICAgICAgICAgICBpZiAod28hPS0xKQorICAgICAgICAgICAgICAgIHRhcmc9cHJlc2VudChhcmcsUEwpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKHRhcmcpICYmIHdvIT0xKQorICAgICAgICAgICAgICAgIHRhcmc9cHJlc2VudChhcmcsZW52aXJvbm1lbnQoUEwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHRhcmc9ZW52aXJvbm1lbnQoUEwpOworICAgIGlmICghb2JqZWN0cCh0YXJnKSkKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVC1FUlJPUjogR2V3dWVuc2NodGVzIFppZWwgbmljaHQgZ2VmdW5kZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgb3V0cHV0PVBMOworICAgIHNjYW5ydW49MDsKKyAgICBtYXN0ZXI9UEw7CisKKyAgICBzd2l0Y2goaW5bMF0pCisgICAgeworICAgICAgICBjYXNlICJkZSIgOgorICAgICAgICBjYXNlICJkZXRhaWwiIDoKKyAgICAgICAgY2FzZSAiZGV0YWlscyIgOgorICAgICAgICAgICAgcmV0dXJuIHNlYXJjaF9kKHRhcmcpOworICAgICAgICBjYXNlICJzbSIgOgorICAgICAgICBjYXNlICJzbWVsbCIgOgorICAgICAgICBjYXNlICJzbWVsbHMiIDoKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hfbSh0YXJnKTsKKyAgICAgICAgY2FzZSAic28iIDoKKyAgICAgICAgY2FzZSAic291bmQiIDoKKyAgICAgICAgY2FzZSAic291bmRzIiA6CisgICAgICAgICAgICByZXR1cm4gc2VhcmNoX24odGFyZyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIEhpZXIga2FubiBtYW4gZGVuICdTY2FudHlwJyBlaW5zdGVsbGVuLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBzY2FuYXJ0KHN0cmluZyBhcmcpCit7ICAgaW50IGg7CisKKyAgICBpZiAoIShQTC0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpICYmICFJU19MRUFSTkVSKFBMKSkKKyAgICAgICAgcmV0dXJuIHJlbW92ZW4oKTsKKworICAgIGlmIChzY2FucnVuKQorICAgIHsKKyAgICAgICAgd3JpdGUoIkRlcnplaXQgd2lyZCBlaW4gVmVyemVpY2huaXMgZ2VzY2FubmVkLiBCaXR0ZSB3YXJ0ZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbm90aWZ5X2ZhaWwoIk9URVNULVN5bnRheDogb3R5cGUgW3Jpa3VzfHJvY2h1c11cbiIpOworICAgIGlmICghYXJnIHx8ICFzdHJpbmdwKGFyZykpCisgICAgeworICAgICAgICBpZiAoaD1QTC0+UXVlcnlQcm9wKFBfT1RFU1RfVFlQKSkKKyAgICAgICAgICAgIHNjYW50eXA9aDsKKyAgICAgICAgaWYgKCFoKQorICAgICAgICB7CisgICAgICAgICAgICBQTC0+U2V0UHJvcChQX09URVNUX1RZUCxzY2FudHlwKTsKKyAgICAgICAgICAgIFBMLT5TZXQoUF9PVEVTVF9UWVAsU0FWRSxGX01PREVfQVMpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiT1RFU1Q6IEVpbmdlc3RlbGx0ZXIgU2NhbnR5cCBpc3QgJyVzJ1xuIiwKKyAgICAgICAgICAgIChzY2FudHlwPT1UX1JPQ0hVUz8iUk9DSFVTIjoiUklLVVMiKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobWVtYmVyKCh7InJpa3VzIiwicm9jaHVzIn0pLGFyZyk9PS0xKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYXJnPT0icm9jaHVzIikKKyAgICB7CisgICAgICAgIHNjYW50eXA9VF9ST0NIVVM7CisgICAgICAgIFBMLT5TZXRQcm9wKFBfT1RFU1RfVFlQLHNjYW50eXApOworICAgICAgICBQTC0+U2V0KFBfT1RFU1RfVFlQLFNBVkUsRl9NT0RFX0FTKTsKKyAgICAgICAgd3JpdGUoIk9URVNUOiBFaW5nZXN0ZWxsdGVyIFNjYW50eXAgaXN0ICdST0NIVVMnXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNjYW50eXA9VF9SSUtVUzsKKyAgICBQTC0+U2V0UHJvcChQX09URVNUX1RZUCxzY2FudHlwKTsKKyAgICBQTC0+U2V0KFBfT1RFU1RfVFlQLFNBVkUsRl9NT0RFX0FTKTsKKyAgICB3cml0ZSgiT1RFU1Q6IEVpbmdlc3RlbGx0ZXIgU2NhbnR5cCBpc3QgJ1JJS1VTJ1xuIik7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgSGllciBrYW5uIG1hbiBkaWUgU3BhbHRlbnphaGwgZWluc3RlbGxlbi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgc3BhbHRlbnphaGwoc3RyaW5nIGFyZykKK3sgICBpbnQgaDsKKworICAgIGlmICghKFBMLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkgJiYgIUlTX0xFQVJORVIoUEwpKQorICAgICAgICByZXR1cm4gcmVtb3ZlbigpOworCisgICAgaWYgKHNjYW5ydW4pCisgICAgeworICAgICAgICB3cml0ZSgiRGVyemVpdCB3aXJkIGVpbiBWZXJ6ZWljaG5pcyBnZXNjYW5uZWQuIEJpdHRlIHdhcnRlbi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBub3RpZnlfZmFpbCgiT1RFU1QtU3ludGF4OiBvY29sbSBbMXwyfDN8NHw1fDZ8N3w4fGF1dG9dXG4iKTsKKworICAgIGlmICghYXJnIHx8ICFzdHJpbmdwKGFyZykpCisgICAgeworICAgICAgICBpZiAoaD1QTC0+UXVlcnlQcm9wKFBfT1RFU1RfU1BMKSkKKyAgICAgICAgICAgIHNwYWx0ZW49aDsKKyAgICAgICAgaWYgKCFoKQorICAgICAgICB7CisgICAgICAgICAgICBQTC0+U2V0UHJvcChQX09URVNUX1NQTCxzcGFsdGVuKTsKKyAgICAgICAgICAgIFBMLT5TZXQoUF9PVEVTVF9TUEwsU0FWRSxGX01PREVfQVMpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiT1RFU1Q6IEVpbmdlc3RlbGx0ZSBTcGFsdGVuemFobCBpc3QgJyVzJ1xuIiwKKyAgICAgICAgICAgIChzcGFsdGVuPjA/c3ByaW50ZigiJWQiLHNwYWx0ZW4pOiInQVVUTyciKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoYXJnPT0iYXV0byIpCisgICAgeworICAgICAgICBzcGFsdGVuPS0xOworICAgICAgICBQTC0+U2V0UHJvcChQX09URVNUX1NQTCxzcGFsdGVuKTsKKyAgICAgICAgUEwtPlNldChQX09URVNUX1NQTCxTQVZFLEZfTU9ERV9BUyk7CisgICAgICAgIHdyaXRlKCJPVEVTVDogRWluZ2VzdGVsbHRlIFNwYWx0ZW56YWhsIGlzdCAnQVVUTydcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaCA9IHRvX2ludChhcmcpOworICAgIGlmIChoPDEgfHwgaD44KQorICAgICAgICByZXR1cm4gMDsKKyAgICBzcGFsdGVuPWg7CisgICAgUEwtPlNldFByb3AoUF9PVEVTVF9TUEwsc3BhbHRlbik7CisgICAgUEwtPlNldChQX09URVNUX1NQTCxTQVZFLEZfTU9ERV9BUyk7CisgICAgcHJpbnRmKCJPVEVTVDogRWluZ2VzdGVsbHRlIFNwYWx0ZW56YWhsIGlzdCAlZFxuIixzcGFsdGVuKTsKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBIaWVyIGthbm4gbWFuIGdhbnplIFZlcnplaWNobmlzc2UgZHVyY2hzY2FubmVuIGxhc3NlbgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBkaXJ0ZXN0ZW4oc3RyaW5nIGFyZykKK3sgICBzdHJpbmcgdnosYWYsdSwqZGlyOworICAgIGludCAgICBpLHNpOworCisgICAgaWYgKCEoUEwtPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKSAmJiAhSVNfTEVBUk5FUihQTCkpCisgICAgICAgIHJldHVybiByZW1vdmVuKCk7CisKKyAgICBpZiAoc2NhbnJ1bikKKyAgICB7CisgICAgICAgIHdyaXRlKCJEZXJ6ZWl0IHdpcmQgZWluIFZlcnplaWNobmlzIGdlc2Nhbm5lZC4gQml0dGUgd2FydGVuLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChvYmplY3RfbmFtZShNRSlbMC4uMl09PSIvcC8iKQorICAgIHsKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJFaW4gRGlyc2NhbiBrYW5uIG51ciBkdXJjaGdlZnVlaHJ0IHdlcmRlbiwgIisKKyAgICAgICAgICAgICAgIndlbm4gbWFuIGRlbiBQcnVlZmVyIGluIHNlaW4gL3BsYXllcnMvLVZlcnplaWNobmlzIGtvcGllcnQgIisKKyAgICAgICAgICAgICAgImhhdCBvZGVyIHZvbiBlaW5lbSBkb3J0IGxpZWdlbmRlbiBPYmpla3QgaW5oZXJpdGVkLiIsNzgsCisgICAgICAgICAgICAgICJPVEVTVDogIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBub3RpZnlfZmFpbCgiT1RFU1QtU3ludGF4OiBvdGRpciA8dmVyemVpY2huaXM+IDxhdXNnYWJlZmlsZT5cbiIpOworICAgIGlmICghYXJnIHx8ICFzdHJpbmdwKGFyZykgfHwgc3NjYW5mKGFyZywiJXMgJXMiLHZ6LGFmKSE9MikKKyAgICAgICAgcmV0dXJuIDA7CisKKy8vIFppZWxmaWxlbmFtZSB0ZXN0ZW4vZmVzdGxlZ2VuLgorCisgICAgdT1nZXR1aWQoUEwpOworICAgIGlmIChmaWxlX3NpemUoIi9sb2cvIit1KyIvIikhPS0yKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJPVEVTVDogRXMgZXhpc3RpZXJ0IGtlaW4gVmVyemVpY2huaXMgJy9sb2cvJXMvJ1xuIix1KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciAoaT1zaXplb2YoYWYpLTE7aT49MDtpLS0pCisgICAgICAgIGlmICgoKHNpPWFmW2ldKTw0OCAmJiBzaSE9NDYpIHx8IChzaT41NyAmJiBzaTw2NSkgfHwgc2k+MTIyIHx8CisgICAgICAgICAgICAoc2k+OTAgJiYgc2k8OTcpKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZSgiT1RFU1Q6IElsbGVnYWxlciBGaWxlbmFtZSBmdWVyIEF1c2dhYmVmaWxlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIHU9c3ByaW50ZigiL2xvZy8lcy8lcyIsdSxhZik7CisKKy8vIFp1IHVudGVyc3VjaGVuZGVzIFZlcnplaWNobmlzIHBydWVmZW4vZWlubGVzZW4uCisKKyAgICBpZiAoIXZ6IHx8ICFzdHJpbmdwKHZ6KSB8fCBzaXplb2YodnopPDMgfHwgdnpbMF0hPScvJyB8fCB2els8MV0hPScvJykKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVDogVmVyemVpY2huaXNuYW1lIG11c3MgbWl0ICcvJyBiZWdpbm5lbiB1bmQgYXVmaG9lcmVuLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKGk9c2l6ZW9mKGFmKS0xO2k+PTA7aS0tKQorICAgICAgICBpZiAoKChzaT1hZltpXSk8NDYpIHx8IChzaT41NyAmJiBzaTw2NSkgfHwgc2k+MTIyIHx8IChzaT45MCAmJiBzaTw5NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKCJPVEVTVDogSWxsZWdhbGVyIEZpbGVuYW1lIGZ1ZXIgVmVyemVpY2huaXMuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgZGlyID0gZ2V0X2Rpcih2eisiKi5jIik7CisgICAgaWYgKChzaT1zaXplb2YoZGlyKSk8MSkKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVDogRGFzIGdld3VlbnNjaHRlIFZlcnplaWNobmlzIGV4aXN0aWVydCBuaWNodCBvZGVyIGlzdCAiKworICAgICAgICAgICAgICAibGVlci5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBvdXRwdXQgICAgPSB1OworCisgICAgaWYgKHN0cmluZ3AoY2F0Y2gKKyAgICAgICAgICAoaT13cml0ZV9maWxlKG91dHB1dCwgc3ByaW50ZigiVGVzdHN0YXJ0OiAlc1xuXG4iLGR0aW1lKHRpbWUoKSkpKSkpCisgICAgICAgICYmIGkhPTEpCisgICAgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgICAgICBzcHJpbnRmKCJGZWhsZXIgYmVpbSBTY2hyZWliZW4gaW4gZGFzIEZpbGUgJXM6XG4lc0Fib3J0aW5nLiIsCisgICAgICAgICAgICAgICAgb3V0cHV0LHUpLDc4LCJPVEVTVDogIiwxKSk7CisgICAgICAgIG91dHB1dCA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHNjYW5ydW4gICA9IHNpKzE7CisgICAgc2NhbmZpbGVzID0gZGlyOworICAgIHNjYW5kaXIgICA9IHZ6OworICAgIHNjYW5jb3VudCA9IDA7CisgICAgbWFzdGVyICAgID0gUEw7CisgICAgc2NhbmVyciAgID0gKHswLDB9KTsKKworICAgIGNhbGxfb3V0KCJ4X2hlYXJ0X2JlYXQiLFRfUEFVU0UpOworCisgICAgcHJpbnRmKCJPVEVTVDogU2Nhbm5lICVkIEZpbGVzOlxuIisKKyAgICAgICAgICAgIiAgICAgICAlcyA9PiAlc1xuIisKKyAgICAgICAgICAgIlplaXQ6ICBldHdhICVzXG4iLHNpLHZ6LG91dHB1dCwKKyAgICAgICAgICAgICAgIHRpbWUyc3RyaW5nKCIlaDolMDJtOiUwMnMiLHNpKjQqVF9QQVVTRSkpOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgRGFzIFNjYW5uZW4gdm9uIFZlcnplaWNobmlzc2VuIHdpcmQgdWViZXIgeF9oZWFydF9iZWF0KCkgZXJsZWRpZ3QuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKwordm9pZCB4X2hlYXJ0X2JlYXQoKQoreyAgIGludCAgICBucjsKKyAgICBzdHJpbmcgZm4sZXI7CisKKyAgICBjYWxsX291dCgieF9oZWFydF9iZWF0IixUX1BBVVNFKTsKKworICAgIGlmICgoKytzY2FuY291bnQpPjQpCisgICAgeworICAgICAgICBzY2FuY291bnQgPSAxOworICAgICAgICB0ZXN0b2IgICAgPSAwOworICAgICAgICBzY2FucnVuLS07CisgICAgfQorCisgICAgbnI9c2NhbnJ1bi0yOworICAgIGlmIChucjwwKQorICAgIHsKKyAgICAgICAgaWYgKGVudmlyb25tZW50KCkgJiYgaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgICAgICAgICAgICBlbnZpcm9ubWVudCgpLT5NZXNzYWdlKGJyZWFrX3N0cmluZygiJ290ZGlyJyBiZWVuZGV0LlxuIisKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCJGaWxlczogJWQgLSBGZWhsZXI6ICVkIC0gU2tpcHM6ICVkIiwKKyAgICAgICAgICAgICAgICBzaXplb2Yoc2NhbmZpbGVzKSxzY2FuZXJyWzBdLHNjYW5lcnJbMV0pLAorICAgICAgICAgICAgICAgIDc4LCJPVEVTVDogIiwxKSxNU0dGTEFHX1RFTEwpOworCisgICAgICAgIHNjYW5ydW4gICA9IDA7CisgICAgICAgIHNjYW5jb3VudCA9IDA7CisgICAgICAgIG91dHB1dCAgICA9IDA7CisgICAgICAgIHNjYW5maWxlcyA9ICh7fSk7CisgICAgICAgIHNjYW5kaXIgICA9IDA7CisgICAgICAgIHRlc3RvYiAgICA9IDA7CisgICAgICAgIHNjYW5lcnIgICA9ICh7MCwwfSk7CisKKyAgICAgICAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJ4X2hlYXJ0X2JlYXQiKSE9LTEpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm49c2NhbmRpcitzY2FuZmlsZXNbbnJdOworICAgIGlmIChmbls8Mi4uXT09Ii5jIikKKyAgICAgICAgZm49Zm5bMC4uPDNdOworCisgICAgaWYgKHNjYW5jb3VudD09MSkgLy8gVGVzdGVuLCBvYiBGaWxlIGxhZGJhcgorICAgIHsKKyAgICAgICAgT3V0cHV0KHNwcmludGYoIkZpbGU6ICVzXG5cbiIsZm4pKTsKKyAgICAgICAgZXI9Y2F0Y2goY2FsbF9vdGhlcihmbiwiPz8/IikpOworICAgICAgICBpZiAoZXIgJiYgc3RyaW5ncChlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIE91dHB1dChzcHJpbnRmKCJFcnJvcjogJXMtPkFib3J0QExvYWRcblxuIixlcikpOworICAgICAgICAgICAgc2NhbnJ1bi0tOworICAgICAgICAgICAgc2NhbmNvdW50ICA9IDA7CisgICAgICAgICAgICB0ZXN0b2IgICAgID0gMDsKKyAgICAgICAgICAgIHNjYW5lcnJbMF0gPSBzY2FuZXJyWzBdKzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVzdG9iID0gZmluZF9vYmplY3QoZm4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghb2JqZWN0cCh0ZXN0b2IpKQorICAgIHsKKyAgICAgICAgT3V0cHV0KCJPYmpla3QgbmljaHQgZ2VmdW5kZW5cbi0+IEFib3J0QE9iamVjdC5cblxuIik7CisgICAgICAgIHNjYW5ydW4tLTsKKyAgICAgICAgc2NhbmNvdW50ICA9IDA7CisgICAgICAgIHNjYW5lcnJbMF0gPSBzY2FuZXJyWzBdKzE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoImludF9sb25nIix0ZXN0b2IpKQorICAgIHsKKyAgICAgICAgT3V0cHV0KCJPYmpla3QgaXN0IGtlaW4gUmF1bSAtPiBTS0lQUElORy5cblxuIik7CisgICAgICAgIHNjYW5ydW4tLTsKKyAgICAgICAgc2NhbmNvdW50ICA9IDA7CisgICAgICAgIHRlc3RvYiAgICAgPSAwOworICAgICAgICBzY2FuZXJyWzFdID0gc2NhbmVyclsxXSsxOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN3aXRjaChzY2FuY291bnQpCisgICAgeworICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgaWYgKChlcj1jYXRjaChzZWFyY2hfZCh0ZXN0b2IpKSkgJiYgc3RyaW5ncChlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3V0cHV0KHNwcmludGYoIkVycm9yOiAlcy0+IEFib3J0QERldGFpbC5cblxuIixlcikpOworICAgICAgICAgICAgICAgIHNjYW5ydW4tLTsKKyAgICAgICAgICAgICAgICBzY2FuY291bnQgID0gMDsKKyAgICAgICAgICAgICAgICB0ZXN0b2IgICAgID0gMDsKKyAgICAgICAgICAgICAgICBzY2FuZXJyWzBdID0gc2NhbmVyclswXSsxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgaWYgKChlcj1jYXRjaChzZWFyY2hfc2Vuc2UodGVzdG9iLFNFTlNFX1NNRUxMKSkpICYmIHN0cmluZ3AoZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE91dHB1dChzcHJpbnRmKCJFcnJvcjogJXMtPiBBYm9ydEBTbWVsbC5cblxuIixlcikpOworICAgICAgICAgICAgICAgIHNjYW5ydW4tLTsKKyAgICAgICAgICAgICAgICBzY2FuY291bnQgID0gMDsKKyAgICAgICAgICAgICAgICB0ZXN0b2IgICAgID0gMDsKKyAgICAgICAgICAgICAgICBzY2FuZXJyWzBdID0gc2NhbmVyclswXSsxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgaWYgKChlcj1jYXRjaChzZWFyY2hfc2Vuc2UodGVzdG9iLFNFTlNFX1NPVU5EKSkpICYmIHN0cmluZ3AoZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE91dHB1dChzcHJpbnRmKCJFcnJvcjogJXMtPiBBYm9ydEBTb3VuZC5cblxuIixlcikpOworICAgICAgICAgICAgICAgIHNjYW5ydW4tLTsKKyAgICAgICAgICAgICAgICBzY2FuY291bnQgID0gMDsKKyAgICAgICAgICAgICAgICB0ZXN0b2IgICAgID0gMDsKKyAgICAgICAgICAgICAgICBzY2FuZXJyWzBdID0gc2NhbmVyclswXSsxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVzdGVyL3Rlc3QuZGF0IGIvb2JqL3Rvb2xzL3Rlc3Rlci90ZXN0LmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzIwYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3Rlc3Rlci90ZXN0LmRhdApAQCAtMCwwICsxLDUgQEAKK2RlciBkaWUgZGFzIGljaCBkdSBlciBzaWUgZXMgd2lyIGlociBzaWUgbWVpbiBkZWluIHNlaW4gZGVpbmVyIGV1ZXIgYW4gYXVzCitlaW4gYXVjaCBkYWZ1ZXIgZG9jaCBpbSBuYWphIHdpZSBkZWluZW4gbWVpbmVuIGRlaW5lbSBtZWluZW0gc2llaHQgZGljaCBkaWVzCitzdWVkZW4gbm9yZGVuIHdlc3RlbiBvc3RlbiBzdWVkb3N0ZW4gc3VlZHdlc3RlbiBub3Jkb3N0ZW4gbm9yZHdlc3RlbiBkaWVzZQorZGlyIGRvcnQgaG0gamEgbmVpbiBhbHMgYXVmIGluIG1hbiBuYWNoIHVtIGRpZXNlciBuaWNodCBkZWluZSB2b24gd2VubiBhbQora2VpbmUgbXVkIGhpZXIgc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMveHRvb2wuYyBiL29iai90b29scy94dG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGM0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMveHRvb2wuYwpAQCAtMCwwICsxLDcgQEAKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYobWVtYmVyKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCcjJyk9PS0xKQorICAgIHJldHVybjsKKyAgY2xvbmVfb2JqZWN0KCIvb2JqL3Rvb2xzL01HdG9vbCIpLT5tb3ZlKHRoaXNfb2JqZWN0KCkpOworICBjYWxsX291dChsYW1iZGEoKHt9KSwoeyMnZGVzdHJ1Y3QsKHsjJ3RoaXNfb2JqZWN0fSl9KSksMCk7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMveHh0b29sLmMgYi9vYmovdG9vbHMveHh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzZmI2YwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy94eHRvb2wuYwpAQCAtMCwwICsxLDQxIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPg0KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPg0KKw0KK2luaGVyaXQgIm9iai90b29scy9NR3Rvb2wiOw0KK2luaGVyaXQgInN0ZC90aGluZyI7DQorDQordm9pZCBjcmVhdGUoKQ0KK3sNCisgIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpDQorICAgIHJldHVybjsNCisgIHRoaW5nOjpjcmVhdGUoKTsNCisgIDo6Y3JlYXRlKCk7DQorICBTZXRQcm9wKFBfTkFNRSwiQW5raCIpOw0KKyAgU2V0UHJvcChQX0dFTkRFUixORVVURVIpOw0KKyAgU2V0UHJvcChQX0lEUywoeyJhbmtoIiwieHh0b29sIn0pKTsNCit9DQorDQorc3RyaW5nIF9xdWVyeV9zaG9ydCgpDQorew0KKyAgOjpfcXVlcnlfc2hvcnQoKTsNCisgIHJldHVybiAiRWluIEFua2ggYW0gSGFsc2JhbmQuXG4iOw0KK30NCisNCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKQ0KK3sNCisgIDo6X3F1ZXJ5X2xvbmcoKTsNCisgIHJldHVybg0KKyAgICAiRWluIEhhbHNiYW5kLCBhbiBkZW0gZWluIEFua2ggaGFlbmd0LlxuIg0KKyAgICArCSJFaW4gQW5raCBzaWVodCB1bmdlZmFlaHIgc28gYXVzIHdpZSBlaW4gS3JldXogYWJlciBlYmVuIG5pY2h0IGdhbnouXG4iOw0KK30NCisNCitzdHJpbmcgbmFtZSggaW50IGQxLCBpbnQgZDIgKQ0KK3sNCisgIHJldHVybiB0aGluZzo6bmFtZShkMSxkMik7DQorfQ0KKw0KK2ludCBpZCggc3RyaW5nIHN0ciApDQorew0KKyAgOjppZChzdHIpOw0KKyAgcmV0dXJuIG1lbWJlciggKHsiYW5raCIsInh4dG9vbCJ9KSxzdHIgKSAhPSAtMTsNCit9DQo=