Lyogdm1zaWZ5LmMgLS0gTW9kdWxlIGZvciB2bXMgPC0+IHVuaXggZmlsZSBuYW1lIGNvbnZlcnNpb24KQ29weXJpZ2h0IChDKSAxOTk2LTIwMjUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBNYWtlLgoKR05VIE1ha2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgp2ZXJzaW9uLgoKR05VIE1ha2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCldBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCkEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAp0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KCi8qIFdyaXR0ZW4gYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKQogICBvZiBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueSAqLwoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2luY2x1ZGUgIm1ha2VpbnQuaCIKCiNpZiBNS19PU19WTVMKI2luY2x1ZGUgPHVuaXhsaWIuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8anBpZGVmLmg+CiNpbmNsdWRlIDxkZXNjcmlwLmg+CiNpbmNsdWRlIDx1YWlkZWYuaD4KI2luY2x1ZGUgPHNzZGVmLmg+CiNpbmNsdWRlIDxzdGFybGV0Lmg+CiNpbmNsdWRlIDxsaWIkcm91dGluZXMuaD4KLyogSW5pdGlhbGl6ZSBhIHN0cmluZyBkZXNjcmlwdG9yIChzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcykgZm9yIGFuCiAgIGFyYml0cmFyeSBzdHJpbmcuICAgQUREUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgogICBvZiB0aGUgc3RyaW5nLCBhbmQgTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKi8KCiNkZWZpbmUgSU5JVF9EU0NfUyhkc2MsIGFkZHIsIGxlbikgZG8geyBcCiAgKGRzYykuZHNjJGJfZHR5cGUgPSBEU0MkS19EVFlQRV9UOyAgICBcCiAgKGRzYykuZHNjJGJfY2xhc3MgPSBEU0MkS19DTEFTU19TOyAgICBcCiAgKGRzYykuZHNjJHdfbGVuZ3RoID0gKGxlbik7ICAgICAgICAgICBcCiAgKGRzYykuZHNjJGFfcG9pbnRlciA9IChhZGRyKTsgICAgICAgICBcCn0gd2hpbGUgKDApCgovKiBJbml0aWFsaXplIGEgc3RyaW5nIGRlc2NyaXB0b3IgKHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9zKSBmb3IgYQogICBOVUwtdGVybWluYXRlZCBzdHJpbmcuICBTIGlzIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nOyB0aGUgbGVuZ3RoCiAgIGlzIGRldGVybWluZWQgYnkgY2FsbGluZyBzdHJsZW4oKS4gKi8KCiNkZWZpbmUgSU5JVF9EU0NfQ1NUUklORyhkc2MsIHMpIElOSVRfRFNDX1MoZHNjLCBzLCBzdHJsZW4ocykpCiNlbmRpZgoKLyoKICBjb3B5ICdmcm9tJyB0byAndG8nIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nICd1cHRvJwogIHJldHVybiAwIGlmIGVvcyBvbiBmcm9tCiAgcmV0dXJuIDEgaWYgdXB0byBmb3VuZAoKICByZXR1cm4gJ3RvJyBhdCBsYXN0IGNoYXIgKyAxCiAgcmV0dXJuICdmcm9tJyBhdCBtYXRjaCArIDEgb3IgZW9zIGlmIG5vIG1hdGNoCgogIGlmIGFzX2RpciA9PSAxLCBjaGFuZ2UgYWxsICcuJyB0byAnXycKICBlbHNlIGNoYW5nZSBhbGwgJy4nIGJ1dCB0aGUgbGFzdCB0byAnXycKKi8KCnN0YXRpYyBpbnQKY29weXRvIChjaGFyICoqdG8sIGNvbnN0IGNoYXIgKipmcm9tLCBjaGFyIHVwdG8sIGludCBhc19kaXIpCnsKICBjb25zdCBjaGFyICpzOwoKICBzID0gc3RycmNociAoKmZyb20sICcuJyk7CgogIHdoaWxlICgqKmZyb20pCiAgICB7CiAgICAgIGlmICgqKmZyb20gPT0gdXB0bykKCXsKCSAgZG8KCSAgICB7CgkgICAgICAoKmZyb20pKys7CgkgICAgfQoJICB3aGlsZSAoKipmcm9tID09IHVwdG8pOwoJICByZXR1cm4gMTsKCX0KICAgICAgaWYgKCoqZnJvbSA9PSAnLicpCgl7CgkgIGlmICgoYXNfZGlyID09IDEpCgkgICAgICB8fCAoKmZyb20gIT0gcykpCgkgICAgKip0byA9ICdfJzsKCSAgZWxzZQoJICAgICoqdG8gPSAnLic7Cgl9CiAgICAgIGVsc2UKCXsKI2lmZGVmIEhBVkVfQ0FTRV9JTlNFTlNJVElWRV9GUwoJICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpKipmcm9tKSkKCSAgICAqKnRvID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpKipmcm9tKTsKCSAgZWxzZQojZW5kaWYKCSAgICAqKnRvID0gKipmcm9tOwoJfQogICAgICAoKnRvKSsrOwogICAgICAoKmZyb20pKys7CiAgICB9CgogIHJldHVybiAwOwp9CgoKLyoKICBnZXQgdHJhbnNsYXRpb24gb2YgbG9naWNhbCBuYW1lCgoqLwoKc3RhdGljIGNoYXIgKgp0cm5sb2cgKGNvbnN0IGNoYXIgKm5hbWUpCnsKICBpbnQgc3RhdDsKICBzdGF0aWMgY2hhciByZXNsdFsxMDI0XTsKICAkREVTQ1JJUFRPUiAocmVzbHRfZHNjLCByZXNsdCk7CiAgc2hvcnQgcmVzbHRsZW47CiAgc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MgbmFtZV9kc2M7CiAgY2hhciAqczsKCiAgLyoKICAgKiB0aGUgc3RyaW5nIGlzbid0IGNoYW5nZWQsIGJ1dCB0aGVyZSBpcyBubyBzdHJpbmcgZGVzY3JpcHRvciB3aXRoCiAgICogImNvbnN0IGNoYXIgKmRzYyRhX3BvaW50ZXIiCiAgICovCiAgSU5JVF9EU0NfQ1NUUklORyAobmFtZV9kc2MsIChjaGFyICopbmFtZSk7CgogIHN0YXQgPSBsaWIkc3lzX3RybmxvZyAoJm5hbWVfZHNjLCAmcmVzbHRsZW4sICZyZXNsdF9kc2MpOwoKICBpZiAoKHN0YXQmMSkgPT0gMCkKICAgIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIGlmIChzdGF0ID09IFNTJF9OT1RSQU4pCiAgICB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICByZXNsdFtyZXNsdGxlbl0gPSAnXDAnOwoKICBzID0geG1hbGxvYyAocmVzbHRsZW4rMSk7CiAgc3RyY3B5IChzLCByZXNsdCk7CiAgcmV0dXJuIHM7Cn0KCnN0YXRpYyBjaGFyICoKc2hvd2FsbCAoY2hhciAqcykKewogIHN0YXRpYyBjaGFyIHRbNTEyXTsKICBjaGFyICpwdDsKCiAgcHQgPSB0OwogIGlmIChzdHJjaHIgKHMsICdcXCcpID09IDApCiAgICByZXR1cm4gczsKICB3aGlsZSAoKnMpCiAgICB7CiAgICAgIGlmICgqcyA9PSAnXFwnKQoJewoJICAqcHQrKyA9ICpzOwoJfQogICAgICAqcHQrKyA9ICpzKys7CiAgICB9CiAgcmV0dXJuIHB0Owp9CgoKZW51bSBuYW1lc3RhdGUgeyBOX1NUQVJULCBOX0RFVklDRSwgTl9PUEVOLCBOX0RPVCwgTl9DTE9TRUQsIE5fRE9ORSB9OwoKLyoKICBjb252ZXJ0IHVuaXggc3R5bGUgbmFtZSB0byB2bXMgc3R5bGUKICB0eXBlID0gMCAtPiBuYW1lIGlzIGEgZnVsbCBuYW1lIChkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIHBhcnQpCiAgdHlwZSA9IDEgLT4gbmFtZSBpcyBhIGRpcmVjdG9yeQogIHR5cGUgPSAyIC0+IG5hbWUgaXMgYSBmaWxlbmFtZSB3aXRob3V0IGRpcmVjdG9yeQoKICBUaGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIGFyZSBhcHBsaWVkCgkJCSgwKQkJKDEpCQkJKDIpCglpbnB1dAkJZnVsbCBuYW1lCWRpciBuYW1lCQlmaWxlIG5hbWUKCjEJLi8JCTxjd2Q+CQlbXQkJCTxjdXJyZW50IGRpcmVjdG9yeT4uZGlyCjIJLi4vCQk8aG9tZSBvZiBjd2Q+CTxob21lIG9mIGN3ZD4JCTxob21lIG9mIGN3ZD4uZGlyCgozCS8vCQk8ZGV2IG9mIGN3ZD46CTxkZXYgb2YgY3dkPjpbMDAwMDAwXQk8ZGV2IG9mIGN3ZD46MDAwMDAwLmRpcgo0CS8vYQkJYToJCWE6CQkJYToKNQkvL2EvCQlhOgkJYToJCQlhOjAwMDAwMC5kaXIKCjkJLwkJWzAwMDAwMF0JWzAwMDAwMF0JCTAwMDAwMC5kaXIKMTAJL2EJCVswMDAwMDBdYQlbYV0JCQlbMDAwMDAwXWEKMTEJL2EvCQlbYV0JCVthXQkJCVswMDAwMDBdYS5kaXIKMTIJL2EvYgkJW2FdYgkJW2EuYl0JCQlbYV1iCjEzCS9hL2IvCQlbYS5iXQkJW2EuYl0JCQlbYV1iLmRpcgoxNAkvYS9iL2MJCVthLmJdYwkJW2EuYi5jXQkJCVthLmJdYwoxNQkvYS9iL2MvCQlbYS5iLmNdCQlbYS5iLmNdCQkJW2EuYl1jLmRpcgoKMTYJYQkJYQkJWy5hXQkJCWEKMTcJYS8JCVsuYV0JCVsuYV0JCQlhLmRpcgoxOAlhL2IJCVsuYV1iCQlbLmEuYl0JCQlbLmFdYgoxOQlhL2IvCQlbLmEuYl0JCVsuYS5iXQkJCVsuYV1iLmRpcgoyMAlhL2IvYwkJWy5hLmJdYwkJWy5hLmIuY10JCVsuYS5iXWMKMjEJYS9iL2MvCQlbLmEuYi5jXQlbLmEuYi5jXQkJWy5hLmJdYy5kaXIKCjIyCWEuYi5jCQlhX2IuYwkJWy5hX2JfY10JCWFfYl9jLmRpcgoKMjMJW3hdW3ldegkJW3gueV16CQlbeC55XXoJCQlbeC55XXoKMjQJW3hdWy55XXoJW3gueV16CQlbeC55XXoJCQlbeC55XXoKCjI1ICBmaWxlbmFtZXMgd2l0aCAnJCcgIGFyZSBsZWZ0IHVuY2hhbmdlZCBpZiB0aGV5IGNvbnRhaW4gbm8gJy8nCjI1ICBmaWxlbmFtZXMgd2l0aCAnOicgYXJlIGxlZnQgdW5jaGFuZ2VkCjI2ICBmaWxlbmFtZXMgd2l0aCBhIHNpbmdsZSBwYWlyIG9mICdbJyAnXScgYXJlIGxlZnQgdW5jaGFuZ2VkCgogIFRoZSBpbnB1dCBzdHJpbmcgaXMgbm90IHdyaXR0ZW4gdG8uICBUaGUgcmVzdWx0IGlzIGFsc28gY29uc3QgYmVjYXVzZQogIGl0J3MgYSBzdGF0aWMgYnVmZmVyOyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdC4KKi8KCmNvbnN0IGNoYXIgKgp2bXNpZnkgKGNvbnN0IGNoYXIgKm5hbWUsIGludCB0eXBlKQp7Ci8qIG1heCAyNTUgZGV2aWNlCiAgIG1heCAzOSBkaXJlY3RvcnkKICAgbWF4IDM5IGZpbGVuYW1lCiAgIG1heCAzOSBmaWxldHlwZQogICBtYXggNSB2ZXJzaW9uCiovCi8qIHRvZG86IFZNU01BWFBBVEhMRU4gaXMgZGVmaW5lZCBmb3IgT0RTMiBuYW1lczogaXQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQuICovCiNkZWZpbmUgVk1TTUFYUEFUSExFTiA1MTIKCiAgZW51bSBuYW1lc3RhdGUgbnN0YXRlOwogIHN0YXRpYyBjaGFyIHZtc25hbWVbVk1TTUFYUEFUSExFTisxXTsKICBjb25zdCBjaGFyICpmcHRyOwogIGNvbnN0IGNoYXIgKnQ7CiAgY2hhciAqdnB0cjsKICBpbnQgYXNfZGlyOwogIGludCBjb3VudDsKICBjb25zdCBjaGFyICpzOwogIGNvbnN0IGNoYXIgKnMxOwogIGNvbnN0IGNoYXIgKnMyOwoKICBpZiAobmFtZSA9PSAwKQogICAgcmV0dXJuIDA7CiAgZnB0ciA9IG5hbWU7CiAgdnB0ciA9IHZtc25hbWU7CiAgbnN0YXRlID0gTl9TVEFSVDsKCiAgLyogY2FzZSAyNWEgKi8KICB0ID0gc3RycGJyayAobmFtZSwgIiQ6Iik7CgogIGlmICh0ICE9IDApCiAgICB7Ci8vICAgICAgY29uc3QgY2hhciAqczE7Ci8vICAgICAgY29uc3QgY2hhciAqczI7CgogICAgICBpZiAodHlwZSA9PSAxKQogICAgICAgIHsKICAgICAgICAgIHMxID0gc3RyY2hyICh0KzEsICdbJyk7CiAgICAgICAgICBzMiA9IHN0cmNociAodCsxLCAnXScpOwogICAgICAgIH0KCiAgICAgIGlmICgqdCA9PSAnJCcpCiAgICAgICAgewogICAgICAgICAgaWYgKHN0cmNociAobmFtZSwgJy8nKSA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgc3RyY3B5ICh2bXNuYW1lLCBuYW1lKTsKICAgICAgICAgICAgICBpZiAoKHR5cGUgPT0gMSkgJiYgKHMxICE9IDApICYmIChzMiA9PSAwKSkKICAgICAgICAgICAgICAgIHN0cmNhdCAodm1zbmFtZSwgIl0iKTsKICAgICAgICAgICAgICByZXR1cm4gdm1zbmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIHN0cmNweSAodm1zbmFtZSwgbmFtZSk7CiAgICAgICAgICBpZiAoKHR5cGUgPT0gMSkgJiYgKHMxICE9IDApICYmIChzMiA9PSAwKSkKICAgICAgICAgICAgc3RyY2F0ICh2bXNuYW1lLCAiXSIpOwogICAgICAgICAgcmV0dXJuIHZtc25hbWU7CiAgICAgICAgfQogICAgfQoKICAvKiBjYXNlIDI2ICovCiAgdCA9IHN0cmNociAobmFtZSwgJ1snKTsKCiAgaWYgKHQgIT0gMCkKICAgIHsKLy8gICAgICBjb25zdCBjaGFyICpzOwovLyAgICAgIGNvbnN0IGNoYXIgKnMxID0gc3RyY2hyICh0KzEsICdbJyk7CiAgICAgIHMxID0gc3RyY2hyICh0KzEsICdbJyk7CiAgICAgIGlmIChzMSA9PSAwKQoJewogICAgICAgICAgc3RyY3B5ICh2bXNuYW1lLCBuYW1lKTsKCSAgaWYgKCh0eXBlID09IDEpICYmIChzdHJjaHIgKHQrMSwgJ10nKSA9PSAwKSkKICAgICAgICAgICAgc3RyY2F0ICh2bXNuYW1lLCAiXSIpOwogICAgICAgICAgcmV0dXJuIHZtc25hbWU7Cgl9CiAgICAgIHMxLS07CiAgICAgIGlmICgqczEgIT0gJ10nKQoJewogICAgICAgICAgc3RyY3B5ICh2bXNuYW1lLCBuYW1lKTsKCSAgcmV0dXJuIHZtc25hbWU7CQkvKiBub3QgXVssIGtlZXAgdW5jaGFuZ2VkICovCgl9CgogICAgICAvKiB3ZSBoYXZlIF1bICovCgogICAgICBzID0gbmFtZTsKCiAgICAgIC8qIHMgIC0+IHN0YXJ0aW5nIGNoYXIKCSBzMSAtPiBlbmRpbmcgJ10nICAqLwogICAgICBkbwoJewoJICBzdHJuY3B5ICh2cHRyLCBzLCBzMS1zKTsJLyogY29weSB1cCB0byBidXQgbm90IGluY2x1ZGluZyAnXScgKi8KCSAgdnB0ciArPSBzMS1zOwoJICBpZiAoKnMxID09IDApCgkgICAgYnJlYWs7CgkgIHMgPSBzMSArIDE7CQkJLyogcyAtPiBjaGFyIGJlaGluZCAnXScgKi8KCSAgaWYgKCpzICE9ICdbJykJCS8qIHdhcyAnXVsnID8gKi8KCSAgICBicmVhazsJCQkvKiBubywgbGFzdCBdIGZvdW5kLCBleGl0ICovCgkgIHMrKzsKCSAgaWYgKCpzICE9ICcuJykKCSAgICAqdnB0cisrID0gJy4nOwoJICBzMSA9IHN0cmNociAocywgJ10nKTsKCSAgaWYgKHMxID09IDApCQkJLyogbm8gY2xvc2luZyBdICovCgkgICAgczEgPSBzICsgc3RybGVuIChzKTsKCX0KICAgICAgd2hpbGUgKDEpOwoKICAgICAgKnZwdHIrKyA9ICddJzsKCiAgICAgIGZwdHIgPSBzOwoKICAgIH0KICBlbHNlCQkvKiBubyBbIGluIG5hbWUgKi8KICAgIHsKICAgICAgaW50IHN0YXRlID0gMDsKICAgICAgaW50IHJvb3RlZCA9IDE7CS8qIGZsYWcgaWYgbG9naWNhbCBpcyByb290ZWQsIGVsc2UgaW5zZXJ0IFswMDAwMDBdICovCgogICAgICBkbwoJewogICAgICBzd2l0Y2ggKHN0YXRlKQoJewoJICBjYXNlIDA6CQkJCS8qIHN0YXJ0IG9mIGxvb3AgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy8nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDE7CgkgICAgICB9CgkgICAgZWxzZSBpZiAoKmZwdHIgPT0gJy4nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDEwOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMToJCQkJLyogJy8nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyID09ICcvJykKCSAgICAgIHsKCQlmcHRyKys7CgkJc3RhdGUgPSAzOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gNDsKCSAgICBicmVhazsKCgkgIGNhc2UgMjoJCQkJLyogbm8gJy8nIGF0IHN0YXJ0ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIG5vICcvJyAoMTYpICovCgkgICAgICB7CgkJaWYgKHR5cGUgPT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZT09MSkpOwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIGZvdW5kICcvJyAoMTcuLjIxKSAqLwoJICAgICAgewoJCWlmICgodHlwZSA9PSAyKQoJCSAgICAmJiAoKihzKzEpID09IDApKQkvKiAxNygyKSAqLwoJCSAgewoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgc3RhdGUgPSA3OwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgbnN0YXRlID0gTl9PUEVOOwoJCSAgICBzdGF0ZSA9IDk7CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCgkgIGNhc2UgMzoJCQkJLyogJy8vJyBhdCBzdGFydCAqLwogICAgICAgICAgICB7Ci8vICAgICAgICAgICAgY29uc3QgY2hhciAqczsKLy8gICAgICAgICAgICBjb25zdCBjaGFyICpzMTsKICAgICAgICAgICAgY2hhciAqdnA7CgkgICAgd2hpbGUgKCpmcHRyID09ICcvJykJLyogY29sbGFwc2UgYWxsICcvJyAqLwoJICAgICAgZnB0cisrOwoJICAgIGlmICgqZnB0ciA9PSAwKQkJLyoganVzdCAvLyAqLwoJICAgICAgewoJCWNoYXIgY3dkYnVmW1ZNU01BWFBBVEhMRU4rMV07CgoJCXMxID0gZ2V0Y3dkKGN3ZGJ1ZiwgVk1TTUFYUEFUSExFTik7CgkJaWYgKHMxID09IDApCgkJICB7CiAgICAgICAgICAgICAgICAgICAgdm1zbmFtZVswXSA9ICdcMCc7CgkJICAgIHJldHVybiB2bXNuYW1lOwkvKiBGSVhNRSwgZXJyIGdldGN3ZCAqLwoJCSAgfQoJCXMgPSBzdHJjaHIgKHMxLCAnOicpOwoJCWlmIChzID09IDApCgkJICB7CiAgICAgICAgICAgICAgICAgICAgdm1zbmFtZVswXSA9ICdcMCc7CgkJICAgIHJldHVybiB2bXNuYW1lOwkvKiBGSVhNRSwgZXJyIG5vIGRldmljZSAqLwoJCSAgfQoJCXN0cm5jcHkgKHZwdHIsIHMxLCBzLXMxKzEpOwoJCXZwdHIgKz0gcy1zMSsxOwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgoJICAgIHMgPSB2cHRyOwoKCSAgICBpZiAoY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgMSkgPT0gMCkJLyogY29weSBkZXZpY2UgcGFydCAqLwoJICAgICAgewoJCSp2cHRyKysgPSAnOic7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICAqdnB0ciA9ICc6JzsKCSAgICBuc3RhdGUgPSBOX0RFVklDRTsKCSAgICBpZiAoKmZwdHIgPT0gMCkJLyoganVzdCAnLy9hLycgKi8KCSAgICAgIHsKCQlzdHJjcHkgKHZwdHIrMSwgIlswMDAwMDBdIik7CgkJdnB0ciArPSA5OwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgKnZwdHIgPSAwOwoJCQkJLyogY2hlY2sgbG9naWNhbCBmb3IgWzAwMDAwMF0gaW5zZXJ0aW9uICovCgkgICAgdnAgPSB0cm5sb2cgKHMpOwoJICAgIGlmICgqdnAgIT0gJ1wwJykKCSAgICAgIHsJCQkvKiBmb3VuZCB0cmFuc2xhdGlvbiAqLwoJCWZvciAoOzspCS8qIGxvb3Agb3ZlciBhbGwgbmVzdGVkIGxvZ2ljYWxzICovCgkJICB7CgkJICAgIGNoYXIgKnZwMiA9IHZwICsgc3RybGVuICh2cCkgLSAxOwoJCSAgICBpZiAoKnZwMiA9PSAnOicpCS8qIHRyYW5zbGF0aW9uIGVuZHMgaW4gJzonICovCgkJICAgICAgewoJCQl2cDIgPSB0cm5sb2cgKHZwKTsKCQkJZnJlZSAodnApOwoJCQlpZiAoKnZwMiA9PSAwKQoJCQkgIHsKCQkJICAgIHJvb3RlZCA9IDA7CgkJCSAgICBicmVhazsKCQkJICB9CgkJCXZwID0gdnAyOwoJCQljb250aW51ZTsJLyogbmV4dCBpdGVyYXRpb24gKi8KCQkgICAgICB9CgkJICAgIGlmICgqdnAyID09ICddJykJLyogdHJhbnNsYXRpb24gZW5kcyBpbiAnXScgKi8KCQkgICAgICB7CgkJCWlmICgqKHZwMi0xKSA9PSAnLicpCS8qIGVuZHMgaW4gJy5dJyAqLwoJCQkgIHsKCQkJICAgIGlmIChzdHJuY21wIChmcHRyLCAiMDAwMDAwIiwgNikgIT0gMCkKCQkJICAgICAgcm9vdGVkID0gMDsKCQkJICB9CgkJCWVsc2UKCQkJICB7CgkJCSAgICBzdHJjcHkgKHZtc25hbWUsIHMxKTsKCQkJICAgIHZwID0gc3RyY2hyICh2bXNuYW1lLCAnXScpOwoJCQkgICAgKnZwID0gJy4nOwoJCQkgICAgbnN0YXRlID0gTl9ET1Q7CgkJCSAgICB2cHRyID0gdnA7CgkJCSAgfQoJCSAgICAgIH0KCQkgICAgYnJlYWs7CgkJICB9CgkJZnJlZSAodnApOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHJvb3RlZCA9IDA7CgoJICAgIGlmICgqdnB0ciA9PSAwKQoJICAgICAgewoJCW5zdGF0ZSA9IE5fREVWSUNFOwoJICAgICAgICAqdnB0cisrID0gJzonOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHZwdHIrKzsKCgkgICAgaWYgKHJvb3RlZCA9PSAwKQoJICAgICAgewoJCW5zdGF0ZSA9IE5fRE9UOwoJICAgICAgICBzdHJjcHkgKHZwdHIsICJbMDAwMDAwLiIpOwoJCXZwdHIgKz0gODsKCQl2cCA9IHZwdHItMTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB2cCA9IDA7CgogICAgICAgICAgICAvKiB2cC0+ICcuJyBhZnRlciAwMDAwMDAgb3IgTlVMTCAqLwoKCSAgICBzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCgkgICAgICB7CQkJCS8qIG5vIG5leHQgJy8nICovCgkJaWYgKCoodnB0ci0xKSA9PSAnLicpCgkJICAqKHZwdHItMSkgPSAnXSc7CgkJZWxzZSBpZiAocm9vdGVkID09IDApCgkJICAqdnB0cisrID0gJ10nOwoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZSA9PSAxKSk7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJd2hpbGUgKCoocysxKSA9PSAnLycpCS8qIHNraXAgbXVsdGlwbGUgJy8nICovCgkJICBzKys7CgkgICAgICB9CgoJICAgIGlmICgocm9vdGVkICE9IDApCgkgICAgICAgICYmICgqKHZwdHItMSkgIT0gJy4nKSkKCSAgICAgIHsKCQkqdnB0cisrID0gJ1snOwoJCW5zdGF0ZSA9IE5fRE9UOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIGlmICgobnN0YXRlID09IE5fRE9UKQoJCSAmJiAodnAgIT0gMCkKCQkgJiYgKCoocysxKSA9PSAwKSkKCQl7CgkJICBpZiAodHlwZSA9PSAyKQoJCSAgICB7CgkJICAgICAgKnZwID0gJ10nOwoJCSAgICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICB9CgkJfQoJICAgIHN0YXRlID0gOTsKCSAgICBicmVhazsKICAgICAgICAgICAgfQoJICBjYXNlIDQ6CQkJCS8qIHNpbmdsZSAnLycgYXQgc3RhcnQgKDkuLjE1KSAqLwoJICAgIGlmICgqZnB0ciA9PSAwKQoJICAgICAgc3RhdGUgPSA1OwoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gNjsKCSAgICBicmVhazsKCgkgIGNhc2UgNToJCQkJLyoganVzdCAnLycgYXQgc3RhcnQgKDkpICovCgkgICAgaWYgKHR5cGUgIT0gMikKCSAgICAgIHsKCSAgICAgICAgKnZwdHIrKyA9ICdbJzsKCQluc3RhdGUgPSBOX09QRU47CgkgICAgICB9CgkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwIik7CgkgICAgdnB0ciArPSA2OwoJICAgIGlmICh0eXBlID09IDIpCgkgICAgICBzdGF0ZSA9IDc7CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA4OwoJICAgIGJyZWFrOwoKCSAgY2FzZSA2OgkJLyogY2hhcnMgZm9sbG93aW5nICcvJyBhdCBzdGFydCAxMC4uMTUgKi8KICAgICAgICAgICAgewogICAgICAgICAgICBjb25zdCBjaGFyICpzOwoJICAgICp2cHRyKysgPSAnWyc7CgkgICAgbnN0YXRlID0gTl9PUEVOOwoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkJCQkvKiAxMCAqLwoJICAgICAgewoJCWlmICh0eXBlICE9IDEpCgkJICB7CgkJICAgIHN0cmNweSAodnB0ciwgIjAwMDAwMF0iKTsKCQkgICAgdnB0ciArPSA3OwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZSA9PSAxKSk7CgkJaWYgKHR5cGUgPT0gMSkKCQkgIHsKCQkgICAgKnZwdHIrKyA9ICddJzsKCQkgIH0KCQlzdGF0ZSA9IC0xOwoJICAgICAgfQoJICAgIGVsc2UJCQkvKiAxMS4uMTUgKi8KCSAgICAgIHsKCQlpZiAoICh0eXBlID09IDIpCgkJICAgJiYgKCoocysxKSA9PSAwKSkJLyogMTEoMikgKi8KCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwXSIpOwoJCSAgICBuc3RhdGUgPSBOX0NMT1NFRDsKCQkgICAgdnB0ciArPSA3OwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsICgqKHZwdHItMSkgIT0gJ10nKSk7CgkJc3RhdGUgPSA5OwoJICAgICAgfQoJICAgIGJyZWFrOwogICAgICAgICAgICB9CgoJICBjYXNlIDc6CQkJCS8qIGFkZCAnLmRpcicgYW5kIGV4aXQgKi8KCSAgICBpZiAoKG5zdGF0ZSA9PSBOX09QRU4pCgkJfHwgKG5zdGF0ZSA9PSBOX0RPVCkpCgkgICAgICB7CgkJY2hhciAqdnAgPSB2cHRyLTE7CgkJd2hpbGUgKHZwID4gdm1zbmFtZSkKCQkgIHsKCQkgICAgaWYgKCp2cCA9PSAnXScpCgkJICAgICAgewoJCQlicmVhazsKCQkgICAgICB9CgkJICAgIGlmICgqdnAgPT0gJy4nKQoJCSAgICAgIHsKCQkJKnZwID0gJ10nOwoJCQlicmVhazsKCQkgICAgICB9CgkJICAgIHZwLS07CgkJICB9CgkgICAgICB9CgkgICAgc3RyY3B5ICh2cHRyLCAiLmRpciIpOwoJICAgIHZwdHIgKz0gNDsKCSAgICBzdGF0ZSA9IC0xOwoJICAgIGJyZWFrOwoKCSAgY2FzZSA4OgkJCQkvKiBhZGQgJ10nIGFuZCBleGl0ICovCgkgICAgKnZwdHIrKyA9ICddJzsKCSAgICBzdGF0ZSA9IC0xOwoJICAgIGJyZWFrOwoKCSAgY2FzZSA5OgkJCS8qIDE3Li4yMSwgZnB0ciAtPiAxc3QgJy8nICsgMSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnM7CgkgICAgaWYgKCpmcHRyID09IDApCgkgICAgICB7CgkJaWYgKHR5cGUgPT0gMikKCQkgIHsKCQkgICAgc3RhdGUgPSA3OwoJCSAgfQoJCWVsc2UKCQkgIHN0YXRlID0gODsKCQlicmVhazsKCSAgICAgIH0KCSAgICBzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCgkgICAgICB7CgkJaWYgKHR5cGUgIT0gMSkKCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSA9PSBOX09QRU4pCgkJICAgICAgewoJCQkqdnB0cisrID0gJ10nOwoJCQluc3RhdGUgPSBOX0NMT1NFRDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDA7CgkJICB9CgkJZWxzZQoJCSAgewoJCSAgICBpZiAobnN0YXRlID09IE5fT1BFTikKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnLic7CgkJCW5zdGF0ZSA9IE5fRE9UOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMTsKCQkgIH0KCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJd2hpbGUgKCoocysxKSA9PSAnLycpCgkJICBzKys7CgkJaWYgKCAodHlwZSA9PSAyKQoJCSAgICAmJiAoKihzKzEpID09IDApKQkJLyogMTkoMiksIDIxKDIpKi8KCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSAhPSBOX0NMT1NFRCkKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCW5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMTsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgIGlmIChuc3RhdGUgPT0gTl9PUEVOKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICcuJzsKCQkJbnN0YXRlID0gTl9ET1Q7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJICAgICAgfQoJICAgIGlmICggKCpmcHRyID09ICcuJykJCQkvKiBjaGVjayBmb3IgJy4uJyBvciAnLi4vJyAqLwoJCSYmICgqKGZwdHIrMSkgPT0gJy4nKQoJCSYmICgoKihmcHRyKzIpID09ICcvJykKCQkgICAgfHwgKCooZnB0cisyKSA9PSAwKSkgKQoJICAgICAgewogICAgICAgICAgICAgICAgY2hhciAqdnA7CgkJZnB0ciArPSAyOwoJCWlmICgqZnB0ciA9PSAnLycpCgkJICB7CgkJICAgIGRvCgkJICAgICAgewoJCQlmcHRyKys7CgkJICAgICAgfQoJCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKTsKCQkgIH0KCQllbHNlIGlmICgqZnB0ciA9PSAwKQoJCSAgdHlwZSA9IDE7CgkJdnB0ci0tOwkJCQkvKiB2cHRyIC0+ICcuJyBvciAnXScgKi8KCQl2cCA9IHZwdHI7CgkJZm9yICg7OykKCQkgIHsKCQkgICAgdnAtLTsKCQkgICAgaWYgKCp2cCA9PSAnLicpCQkvKiBvbmUgYmFjayAqLwoJCSAgICAgIHsKCQkJdnB0ciA9IHZwOwoJCQluc3RhdGUgPSBOX09QRU47CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgaWYgKCp2cCA9PSAnWycpCQkvKiB0b3AgbGV2ZWwgcmVhY2hlZCAqLwoJCSAgICAgIHsKCQkJaWYgKCpmcHRyID09IDApCgkJCSAgewoJCQkgICAgc3RyY3B5ICh2cCwgIlswMDAwMDBdIik7CgkJCSAgICB2cHRyID0gdnAgKyA4OwoJCQkgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJCSAgICBzID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJZWxzZQoJCQkgIHsKCQkJICAgIHZwdHIgPSB2cCsxOwoJCQkgICAgbnN0YXRlID0gTl9PUEVOOwoJCQkgICAgYnJlYWs7CgkJCSAgfQoJCSAgICAgIH0KCQkgIH0KCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgYXNfZGlyKTsKCQlpZiAobnN0YXRlID09IE5fRE9UKQoJCSAgbnN0YXRlID0gTl9PUEVOOwoJICAgICAgfQoJICAgIGlmIChzID09IDApCgkgICAgICB7CQkJCQkvKiAxOCwyMCAqLwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCWlmICgqKHMrMSkgPT0gMCkKCQkgIHsKCQkgICAgaWYgKHR5cGUgPT0gMikJCS8qIDE5LDIxICovCgkJICAgICAgewoJCSAgICAgICAgc3RhdGUgPSA3OwoJCSAgICAgIH0KCQkgICAgZWxzZQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJc3RhdGUgPSAtMTsKCQkgICAgICB9CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCgkgIGNhc2UgMTA6CQkJCS8qIDEsMiBmaXJzdCBpcyAnLicgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy4nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDExOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gMTI7CgkgICAgYnJlYWs7CgoJICBjYXNlIDExOgkJCQkvKiAyLCAnLi4nIGF0IHN0YXJ0ICovCgkgICAgY291bnQgPSAxOwoJICAgIGlmICgqZnB0ciAhPSAwKQoJICAgICAgewoJCWlmICgqZnB0ciAhPSAnLycpCQkvKiBnb3QgLi54eHggKi8KCQkgIHsKICAgICAgICAgICAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwoJCSAgICByZXR1cm4gdm1zbmFtZTsKCQkgIH0KCQlkbwkJCQkvKiBnb3QgLi4vICovCgkJICB7CgkJICAgIGZwdHIrKzsKCQkgICAgd2hpbGUgKCpmcHRyID09ICcvJykgZnB0cisrOwoJCSAgICBpZiAoKmZwdHIgIT0gJy4nKQoJCSAgICAgIGJyZWFrOwoJCSAgICBpZiAoKihmcHRyKzEpICE9ICcuJykKCQkgICAgICBicmVhazsKCQkgICAgZnB0ciArPSAyOwoJCSAgICBpZiAoKCpmcHRyID09IDApCgkJCXx8ICgqZnB0ciA9PSAnLycpKQoJCSAgICAgIGNvdW50Kys7CgkJICB9CgkJd2hpbGUgKCpmcHRyID09ICcvJyk7CgkgICAgICB9CgkgICAgewkJCQkJLyogZ290ICcuLicgb3IgJy4uLycgKi8KICAgICAgICAgICAgICBjaGFyICp2cDsKCSAgICAgIGNoYXIgY3dkYnVmW1ZNU01BWFBBVEhMRU4rMV07CgoJICAgICAgdnAgPSBnZXRjd2QoY3dkYnVmLCBWTVNNQVhQQVRITEVOKTsKCSAgICAgIGlmICh2cCA9PSAwKQoJCXsKICAgICAgICAgICAgICAgICAgdm1zbmFtZVswXSA9ICdcMCc7CgkJICByZXR1cm4gdm1zbmFtZTsgICAgLyogRklYTUUsIGVyciBnZXRjd2QgKi8KCQl9CgkgICAgICBzdHJjcHkgKHZwdHIsIHZwKTsKCSAgICAgIHZwID0gc3RyY2hyICh2cHRyLCAnXScpOwoJICAgICAgaWYgKHZwICE9IDApCgkJewoJCSAgbnN0YXRlID0gTl9PUEVOOwoJCSAgd2hpbGUgKHZwID4gdnB0cikKCQkgICAgewoJCSAgICAgIHZwLS07CgkJICAgICAgaWYgKCp2cCA9PSAnWycpCgkJCXsKCQkJICB2cCsrOwoJCQkgIHN0cmNweSAodnAsICIwMDAwMDBdIik7CgkJCSAgc3RhdGUgPSAtMTsKCQkJICBicmVhazsKCQkJfQoJCSAgICAgIGVsc2UgaWYgKCp2cCA9PSAnLicpCgkJCXsKCQkJICBpZiAoLS1jb3VudCA9PSAwKQoJCQkgICAgewoJCQkgICAgICBpZiAoKmZwdHIgPT0gMCkJLyogaGFkICcuLicgb3IgJy4uLycgKi8KCQkJCXsKCQkJCSAgKnZwKysgPSAnXSc7CgkJCQkgIHN0YXRlID0gLTE7CgkJCQl9CgkJCSAgICAgIGVsc2UJCQkvKiBoYWQgJy4uL3h4eCcgKi8KCQkJCXsKCQkJCSAgc3RhdGUgPSA5OwoJCQkJfQoJCQkgICAgICAqdnAgPSAnXDAnOwoJCQkgICAgICBicmVhazsKCQkJICAgIH0KCQkJfQoJCSAgICB9CgkJfQoJICAgICAgdnB0ciArPSBzdHJsZW4gKHZwdHIpOwoJICAgIH0KCSAgICBicmVhazsKCgkgIGNhc2UgMTI6CQkJCS8qIDEsICcuJyBhdCBzdGFydCAqLwoJICAgIGlmICgqZnB0ciAhPSAwKQoJICAgICAgewoJCWlmICgqZnB0ciAhPSAnLycpCgkJICB7CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5ICh2bXNuYW1lLCBuYW1lKTsKCQkgICAgcmV0dXJuIHZtc25hbWU7CgkJICB9CgkJd2hpbGUgKCpmcHRyID09ICcvJykKCQkgIGZwdHIrKzsKCSAgICAgIH0KCgkgICAgewogICAgICAgICAgICAgIGNoYXIgKnZwOwoJICAgICAgY2hhciBjd2RidWZbVk1TTUFYUEFUSExFTisxXTsKCgkgICAgICB2cCA9IGdldGN3ZChjd2RidWYsIFZNU01BWFBBVEhMRU4pOwoJICAgICAgaWYgKHZwID09IDApCgkJewogICAgICAgICAgICAgICAgICB2bXNuYW1lWzBdID0gJ1wwJzsKCQkgIHJldHVybiB2bXNuYW1lOyAgICAvKkZJWE1FLCBlcnIgZ2V0Y3dkICovCgkJfQoJICAgICAgc3RyY3B5ICh2cHRyLCB2cCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCpmcHRyID09IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhdGUgPSAtMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIgKnZwID0gc3RyY2hyICh2cHRyLCAnXScpOwogICAgICAgICAgICAgICAgaWYgKHZwID09IDApCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqdnAgPSAnXDAnOwogICAgICAgICAgICAgICAgbnN0YXRlID0gTl9PUEVOOwogICAgICAgICAgICAgICAgdnB0ciArPSBzdHJsZW4gKHZwdHIpOwogICAgICAgICAgICAgICAgc3RhdGUgPSA5OwogICAgICAgICAgICAgIH0KCSAgICBicmVhazsKCX0KCgl9CiAgICAgIHdoaWxlIChzdGF0ZSA+IDApOwoKCiAgICB9CgoKICAvKiBkaXJlY3RvcnkgY29udmVyc2lvbiBkb25lCiAgICAgZnB0ciAtPiBmaWxlbmFtZSBwYXJ0IG9mIGlucHV0IHN0cmluZwogICAgIHZwdHIgLT4gZnJlZSBzcGFjZSBpbiB2bXNuYW1lCiAgKi8KCiAgKnZwdHIrKyA9IDA7CgogIHJldHVybiB2bXNuYW1lOwp9CgoKCi8qCiAgY29udmVydCBmcm9tIHZtcy1zdHlsZSB0byB1bml4LXN0eWxlCgogIGRldjpbZGlyMS5kaXIyXQkvL2Rldi9kaXIxL2RpcjIvCiovCgpjb25zdCBjaGFyICoKdW5peGlmeSAoY29uc3QgY2hhciAqbmFtZSkKewogIHN0YXRpYyBjaGFyIHBpZWNlWzUxMl07CiAgY29uc3QgY2hhciAqczsKICBjaGFyICpwOwoKICBpZiAoc3RyY2hyIChuYW1lLCAnLycpICE9IDApCQkvKiBhbHJlYWR5IGluIHVuaXggc3R5bGUgKi8KICAgIHsKICAgICAgc3RyY3B5IChwaWVjZSwgbmFtZSk7CiAgICAgIHJldHVybiBwaWVjZTsKICAgIH0KCiAgcCA9IHBpZWNlOwogICpwID0gMDsKCiAgLyogZGV2aWNlIHBhcnQgKi8KCiAgcyA9IHN0cmNociAobmFtZSwgJzonKTsKCiAgaWYgKHMgIT0gMCkKICAgIHsKICAgICAgaW50IGwgPSBzIC0gbmFtZTsKICAgICAgKnArKyA9ICcvJzsKICAgICAgKnArKyA9ICcvJzsKICAgICAgc3RybmNweSAocCwgbmFtZSwgbCk7CiAgICAgIHAgKz0gbDsKICAgIH0KCiAgLyogZGlyZWN0b3J5IHBhcnQgKi8KCiAgKnArKyA9ICcvJzsKICBzID0gc3RyY2hyIChuYW1lLCAnWycpOwoKICBpZiAocyAhPSAwKQogICAgewogICAgICBzKys7CiAgICAgIHN3aXRjaCAoKnMpCiAgICAgICAgewoJICBjYXNlICddJzoJCS8qIFtdICovCgkgICAgc3RyY2F0IChwLCAiLi8iKTsKCSAgICBicmVhazsKCSAgY2FzZSAnLSc6CQkvKiBbLSAqLwoJICAgIHN0cmNhdCAocCwgIi4uLyIpOwoJICAgIGJyZWFrOwoJICBjYXNlICcuJzoKCSAgICBzdHJjYXQgKHAsICIuLyIpOwkvKiBbLiAqLwoJICAgIGJyZWFrOwoJICBkZWZhdWx0OgoJICAgIHMtLTsKCSAgICBicmVhazsKICAgICAgICB9CiAgICAgIHMrKzsKICAgICAgd2hpbGUgKCpzKQogICAgICAgIHsKCSAgaWYgKCpzID09ICcuJykKCSAgICAqcCsrID0gJy8nOwoJICBlbHNlCgkgICAgKnArKyA9ICpzOwoJICBzKys7CgkgIGlmICgqcyA9PSAnXScpCgkgICAgewoJICAgICAgcysrOwoJICAgICAgYnJlYWs7CgkgICAgfQogICAgICAgIH0KICAgICAgaWYgKCpzICE9IDApCQkvKiBtb3JlIGFmdGVyICddJyA/PyAqLwogICAgICAgIHsKCSAgaWYgKCoocC0xKSAhPSAnLycpCgkgICAgKnArKyA9ICcvJzsKCSAgc3RyY3B5IChwLCBzKTsJCS8qIGNvcHkgaXQgYW55d2F5ICovCiAgICAgICAgfQogICAgfQoKICBlbHNlCQkvKiBubyAnWycgYW55d2hlcmUgKi8KCiAgICB7CiAgICAgICpwKysgPSAwOwogICAgfQoKICAvKiBmb3JjZSBlbmQgd2l0aCAnLycgKi8KCiAgaWYgKCoocC0xKSAhPSAnLycpCiAgICAqcCsrID0gJy8nOwogICpwID0gMDsKCiAgcmV0dXJuIHBpZWNlOwp9CgovKiBFT0YgKi8K