LyoKICB2bXNpZnkuYwoKICBNb2R1bGUgZm9yIHZtcyA8LT4gdW5peCBmaWxlIG5hbWUgY29udmVyc2lvbgoKICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKICBvZiBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueQoKKi8KCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaWYgVk1TCiNpbmNsdWRlIDx1bml4bGliLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGpwaWRlZi5oPgojaW5jbHVkZSA8ZGVzY3JpcC5oPgojaW5jbHVkZSA8dWFpZGVmLmg+CiNpbmNsdWRlIDxzc2RlZi5oPgojaW5jbHVkZSA8c3RhcmxldC5oPgojaW5jbHVkZSA8bGliJHJvdXRpbmVzLmg+Ci8qIEluaXRpYWxpemUgYSBzdHJpbmcgZGVzY3JpcHRvciAoc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MpIGZvciBhbgogICBhcmJpdHJhcnkgc3RyaW5nLiAgIEFERFIgaXMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAgb2YgdGhlIHN0cmluZywgYW5kIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICovCgojZGVmaW5lIElOSVRfRFNDX1MoZHNjLCBhZGRyLCBsZW4pIGRvIHsgXAogIChkc2MpLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsgICAgXAogIChkc2MpLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsgICAgXAogIChkc2MpLmRzYyR3X2xlbmd0aCA9IChsZW4pOyAgICAgICAgICAgXAogIChkc2MpLmRzYyRhX3BvaW50ZXIgPSAoYWRkcik7ICAgICAgICAgXAp9IHdoaWxlICgwKQoKLyogSW5pdGlhbGl6ZSBhIHN0cmluZyBkZXNjcmlwdG9yIChzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcykgZm9yIGEKICAgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLiAgUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZzsgdGhlIGxlbmd0aAogICBpcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgc3RybGVuKCkuICovCgojZGVmaW5lIElOSVRfRFNDX0NTVFJJTkcoZHNjLCBzKSBJTklUX0RTQ19TKGRzYywgcywgc3RybGVuKHMpKQojZW5kaWYKCi8qCiAgY29weSAnZnJvbScgdG8gJ3RvJyB1cCB0byBidXQgbm90IGluY2x1ZGluZyAndXB0bycKICByZXR1cm4gMCBpZiBlb3Mgb24gZnJvbQogIHJldHVybiAxIGlmIHVwdG8gZm91bmQKCiAgcmV0dXJuICd0bycgYXQgbGFzdCBjaGFyICsgMQogIHJldHVybiAnZnJvbScgYXQgbWF0Y2ggKyAxIG9yIGVvcyBpZiBubyBtYXRjaAoKICBpZiBhc19kaXIgPT0gMSwgY2hhbmdlIGFsbCAnLicgdG8gJ18nCiAgZWxzZSBjaGFuZ2UgYWxsICcuJyBidXQgdGhlIGxhc3QgdG8gJ18nCiovCgpzdGF0aWMgaW50CmNvcHl0byAoY2hhciAqKnRvLCBjaGFyICoqZnJvbSwgY2hhciB1cHRvLCBpbnQgYXNfZGlyKQp7CiAgY2hhciAqczsKCiAgcyA9IHN0cnJjaHIgKCpmcm9tLCAnLicpOwoKICB3aGlsZSAoKipmcm9tKQogICAgewogICAgICBpZiAoKipmcm9tID09IHVwdG8pCgl7CgkgIGRvCgkgICAgewoJICAgICAgKCpmcm9tKSsrOwoJICAgIH0KCSAgd2hpbGUgKCoqZnJvbSA9PSB1cHRvKTsKCSAgcmV0dXJuIDE7Cgl9CiAgICAgIGlmICgqKmZyb20gPT0gJy4nKQoJewoJICBpZiAoKGFzX2RpciA9PSAxKQoJICAgICAgfHwgKCpmcm9tICE9IHMpKQoJICAgICoqdG8gPSAnXyc7CgkgIGVsc2UKCSAgICAqKnRvID0gJy4nOwoJfQogICAgICBlbHNlCgl7CgkgIGlmIChpc2xvd2VyICgqKmZyb20pKQoJICAgICoqdG8gPSB0b3VwcGVyICgqKmZyb20pOwoJICBlbHNlCgkgICAgKip0byA9ICoqZnJvbTsKCX0KICAgICAgKCp0bykrKzsKICAgICAgKCpmcm9tKSsrOwogICAgfQoKICByZXR1cm4gMDsKfQoKCi8qCiAgZ2V0IHRyYW5zbGF0aW9uIG9mIGxvZ2ljYWwgbmFtZQoKKi8KCnN0YXRpYyBjaGFyICoKdHJubG9nIChjaGFyICpuYW1lKQp7CiAgaW50IHN0YXQ7CiAgc3RhdGljIGNoYXIgcmVzbHRbMTAyNF07CiAgJERFU0NSSVBUT1IgKHJlc2x0X2RzYywgcmVzbHQpOwogIHNob3J0IHJlc2x0bGVuOwogIHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9zIG5hbWVfZHNjOwogIGNoYXIgKnM7CgogIElOSVRfRFNDX0NTVFJJTkcgKG5hbWVfZHNjLCBuYW1lKTsKCiAgc3RhdCA9IGxpYiRzeXNfdHJubG9nICgmbmFtZV9kc2MsICZyZXNsdGxlbiwgJnJlc2x0X2RzYyk7CgogIGlmICgoc3RhdCYxKSA9PSAwKQogICAgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgaWYgKHN0YXQgPT0gU1MkX05PVFJBTikKICAgIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIHJlc2x0W3Jlc2x0bGVuXSA9ICdcMCc7CgogIHMgPSAoY2hhciAqKW1hbGxvYyAocmVzbHRsZW4rMSk7CiAgaWYgKHMgPT0gMCkKICAgIHJldHVybiAiIjsKICBzdHJjcHkgKHMsIHJlc2x0KTsKICByZXR1cm4gczsKfQoKZW51bSBuYW1lc3RhdGUgeyBOX1NUQVJULCBOX0RFVklDRSwgTl9PUEVOLCBOX0RPVCwgTl9DTE9TRUQsIE5fRE9ORSB9OwoKLyoKICBjb252ZXJ0IHVuaXggc3R5bGUgbmFtZSB0byB2bXMgc3R5bGUKICB0eXBlID0gMCAtPiBuYW1lIGlzIGEgZnVsbCBuYW1lIChkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIHBhcnQpCiAgdHlwZSA9IDEgLT4gbmFtZSBpcyBhIGRpcmVjdG9yeQogIHR5cGUgPSAyIC0+IG5hbWUgaXMgYSBmaWxlbmFtZSB3aXRob3V0IGRpcmVjdG9yeQoKICBUaGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIGFyZSBhcHBsaWVkCgkJCSgwKQkJKDEpCQkJKDIpCglpbnB1dAkJZnVsbCBuYW1lCWRpciBuYW1lCQlmaWxlIG5hbWUKCjEJLi8JCTxjd2Q+CQlbXQkJCTxjdXJyZW50IGRpcmVjdG9yeT4uZGlyCjIJLi4vCQk8aG9tZSBvZiBjd2Q+CTxob21lIG9mIGN3ZD4JCTxob21lIG9mIGN3ZD4uZGlyCgozCS8vCQk8ZGV2IG9mIGN3ZD46CTxkZXYgb2YgY3dkPjpbMDAwMDAwXQk8ZGV2IG9mIGN3ZD46MDAwMDAwLmRpcgo0CS8vYQkJYToJCWE6CQkJYToKNQkvL2EvCQlhOgkJYToJCQlhOjAwMDAwMC5kaXIKCjkJLwkJWzAwMDAwMF0JWzAwMDAwMF0JCTAwMDAwMC5kaXIKMTAJL2EJCVswMDAwMDBdYQlbYV0JCQlbMDAwMDAwXWEKMTEJL2EvCQlbYV0JCVthXQkJCVswMDAwMDBdYS5kaXIKMTIJL2EvYgkJW2FdYgkJW2EuYl0JCQlbYV1iCjEzCS9hL2IvCQlbYS5iXQkJW2EuYl0JCQlbYV1iLmRpcgoxNAkvYS9iL2MJCVthLmJdYwkJW2EuYi5jXQkJCVthLmJdYwoxNQkvYS9iL2MvCQlbYS5iLmNdCQlbYS5iLmNdCQkJW2EuYl1jLmRpcgoKMTYJYQkJYQkJWy5hXQkJCWEKMTcJYS8JCVsuYV0JCVsuYV0JCQlhLmRpcgoxOAlhL2IJCVsuYV1iCQlbLmEuYl0JCQlbLmFdYgoxOQlhL2IvCQlbLmEuYl0JCVsuYS5iXQkJCVsuYV1iLmRpcgoyMAlhL2IvYwkJWy5hLmJdYwkJWy5hLmIuY10JCVsuYS5iXWMKMjEJYS9iL2MvCQlbLmEuYi5jXQlbLmEuYi5jXQkJWy5hLmJdYy5kaXIKCjIyCWEuYi5jCQlhX2IuYwkJWy5hX2JfY10JCWFfYl9jLmRpcgoKMjMJW3hdW3ldegkJW3gueV16CQlbeC55XXoJCQlbeC55XXoKMjQJW3hdWy55XXoJW3gueV16CQlbeC55XXoJCQlbeC55XXoKCjI1ICBmaWxlbmFtZXMgd2l0aCAnJCcgIGFyZSBsZWZ0IHVuY2hhbmdlZCBpZiB0aGV5IGNvbnRhaW4gbm8gJy8nCjI1ICBmaWxlbmFtZXMgd2l0aCAnOicgYXJlIGxlZnQgdW5jaGFuZ2VkCjI2ICBmaWxlbmFtZXMgd2l0aCBhIHNpbmdsZSBwYWlyIG9mICdbJyAnXScgYXJlIGxlZnQgdW5jaGFuZ2VkCgogIHRoZSBpbnB1dCBzdHJpbmcgaXMgbm90IHdyaXR0ZW4gdG8KKi8KCmNoYXIgKgp2bXNpZnkgKG5hbWUsIHR5cGUpCiAgICBjaGFyICpuYW1lOwogICAgaW50IHR5cGU7CnsKLyogbWF4IDI1NSBkZXZpY2UKICAgbWF4IDM5IGRpcmVjdG9yeQogICBtYXggMzkgZmlsZW5hbWUKICAgbWF4IDM5IGZpbGV0eXBlCiAgIG1heCA1IHZlcnNpb24KKi8KI2RlZmluZSBNQVhQQVRITEVOIDUxMgoKICBlbnVtIG5hbWVzdGF0ZSBuc3RhdGU7CiAgc3RhdGljIGNoYXIgdm1zbmFtZVtNQVhQQVRITEVOKzFdOwogIGNoYXIgKmZwdHI7CiAgY2hhciAqdnB0cjsKICBjaGFyICpzLCpzMTsKICBpbnQgYXNfZGlyOwogIGludCBjb3VudDsKCiAgaWYgKG5hbWUgPT0gMCkKICAgIHJldHVybiAwOwogIGZwdHIgPSBuYW1lOwogIHZwdHIgPSB2bXNuYW1lOwogIG5zdGF0ZSA9IE5fU1RBUlQ7CgogIC8qIGNhc2UgMjVhICovCgogIHMgPSBzdHJwYnJrIChuYW1lLCAiJDoiKTsKICBpZiAocyAhPSAwKQogICAgewogICAgICBpZiAoKnMgPT0gJyQnKQoJewoJICBpZiAoc3RyY2hyIChuYW1lLCAnLycpID09IDApCgkgICAgewoJICAgICAgcmV0dXJuIG5hbWU7CgkgICAgfQoJfQogICAgICBlbHNlCgl7CgkgIHJldHVybiBuYW1lOwoJfQogICAgfQoKICAvKiBjYXNlIDI2ICovCgogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMxID0gc3RyY2hyIChzKzEsICdbJyk7CiAgICAgIGlmIChzMSA9PSAwKQoJewoJICByZXR1cm4gbmFtZTsJCQkvKiBzaW5nbGUgWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KICAgICAgczEtLTsKICAgICAgaWYgKCpzMSAhPSAnXScpCgl7CgkgIHJldHVybiBuYW1lOwkJCS8qIG5vdCBdWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KCiAgICAgIC8qIHdlIGhhdmUgXVsgKi8KCiAgICAgIHMgPSBuYW1lOwoKICAgICAgLyogcyAgLT4gc3RhcnRpbmcgY2hhcgoJIHMxIC0+IGVuZGluZyAnXScgICovCgogICAgICBkbwoJewoJICBzdHJuY3B5ICh2cHRyLCBzLCBzMS1zKTsJLyogY29weSB1cCB0byBidXQgbm90IGluY2x1ZGluZyAnXScgKi8KCSAgdnB0ciArPSBzMS1zOwoJICBpZiAoKnMxID09IDApCgkgICAgYnJlYWs7CgkgIHMgPSBzMSArIDE7CQkJLyogcyAtPiBjaGFyIGJlaGluZCAnXScgKi8KCSAgaWYgKCpzICE9ICdbJykJCS8qIHdhcyAnXVsnID8gKi8KCSAgICBicmVhazsJCQkvKiBubywgbGFzdCBdIGZvdW5kLCBleGl0ICovCgkgIHMrKzsKCSAgaWYgKCpzICE9ICcuJykKCSAgICAqdnB0cisrID0gJy4nOwoJICBzMSA9IHN0cmNociAocywgJ10nKTsKCSAgaWYgKHMxID09IDApCQkJLyogbm8gY2xvc2luZyBdICovCgkgICAgczEgPSBzICsgc3RybGVuIChzKTsKCX0KICAgICAgd2hpbGUgKDEpOwoKICAgICAgKnZwdHIrKyA9ICddJzsKCiAgICAgIGZwdHIgPSBzOwoKICAgIH0KCiAgZWxzZQkJLyogbm8gWyBpbiBuYW1lICovCgogICAgewoKICAgICAgaW50IHN0YXRlOwogICAgICBpbnQgcm9vdGVkID0gMTsJLyogZmxhZyBpZiBsb2dpY2FsIGlzIHJvb3RlZCwgZWxzZSBpbnNlcnQgWzAwMDAwMF0gKi8KCiAgICAgIHN0YXRlID0gMDsKCiAgICAgIGRvCgl7CgogICAgICBzd2l0Y2ggKHN0YXRlKQoJewoJICBjYXNlIDA6CQkJCS8qIHN0YXJ0IG9mIGxvb3AgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy8nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDE7CgkgICAgICB9CgkgICAgZWxzZSBpZiAoKmZwdHIgPT0gJy4nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDEwOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMToJCQkJLyogJy8nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyID09ICcvJykKCSAgICAgIHsKCQlmcHRyKys7CgkJc3RhdGUgPSAzOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gNDsKCSAgICBicmVhazsKCgkgIGNhc2UgMjoJCQkJLyogbm8gJy8nIGF0IHN0YXJ0ICovCgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIG5vICcvJyAoMTYpICovCgkgICAgICB7CgkJaWYgKHR5cGUgPT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZT09MSkpOwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIGZvdW5kICcvJyAoMTcuLjIxKSAqLwoJICAgICAgewoJCWlmICgodHlwZSA9PSAyKQoJCSAgICAmJiAoKihzKzEpID09IDApKQkvKiAxNygyKSAqLwoJCSAgewoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgc3RhdGUgPSA3OwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgbnN0YXRlID0gTl9ET1Q7CgkJICAgIHZwdHIgKz0gMjsKCQkgICAgY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgMSk7CgkJICAgIHN0YXRlID0gOTsKCQkgIH0KCSAgICAgIH0KCSAgICBicmVhazsKCgkgIGNhc2UgMzoJCQkJLyogJy8vJyBhdCBzdGFydCAqLwoJICAgIHdoaWxlICgqZnB0ciA9PSAnLycpCS8qIGNvbGxhcHNlIGFsbCAnLycgKi8KCSAgICAgIGZwdHIrKzsKCSAgICBpZiAoKmZwdHIgPT0gMCkJCS8qIGp1c3QgLy8gKi8KCSAgICAgIHsKCQljaGFyIGN3ZGJ1ZltNQVhQQVRITEVOKzFdOwoKCQlzMSA9IGdldGN3ZChjd2RidWYsIE1BWFBBVEhMRU4pOwoJCWlmIChzMSA9PSAwKQoJCSAgewoJCSAgICByZXR1cm4gIiI7CQkvKiBGSVhNRSwgZXJyIGdldGN3ZCAqLwoJCSAgfQoJCXMgPSBzdHJjaHIgKHMxLCAnOicpOwoJCWlmIChzID09IDApCgkJICB7CgkJICAgIHJldHVybiAiIjsJCS8qIEZJWE1FLCBlcnIgbm8gZGV2aWNlICovCgkJICB9CgkJc3RybmNweSAodnB0ciwgczEsIHMtczErMSk7CgkJdnB0ciArPSBzLXMxKzE7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCgkgICAgcyA9IHZwdHI7CgoJICAgIGlmIChjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKSA9PSAwKQkvKiBjb3B5IGRldmljZSBwYXJ0ICovCgkgICAgICB7CgkJKnZwdHIrKyA9ICc6JzsKCQlzdGF0ZSA9IC0xOwoJCWJyZWFrOwoJICAgICAgfQoJICAgICp2cHRyID0gJzonOwoJICAgIG5zdGF0ZSA9IE5fREVWSUNFOwoJICAgIGlmICgqZnB0ciA9PSAwKQkvKiBqdXN0ICcvL2EvJyAqLwoJICAgICAgewoJCXN0cmNweSAodnB0cisxLCAiWzAwMDAwMF0iKTsKCQl2cHRyICs9IDk7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICAqdnB0ciA9IDA7CgkJCQkvKiBjaGVjayBsb2dpY2FsIGZvciBbMDAwMDAwXSBpbnNlcnRpb24gKi8KCSAgICBzMSA9IHRybmxvZyAocyk7CgkgICAgaWYgKCpzMSAhPSAwKQoJICAgICAgewkJCS8qIGZvdW5kIHRyYW5zbGF0aW9uICovCgkJY2hhciAqczI7CgkJZm9yICg7OykJLyogbG9vcCBvdmVyIGFsbCBuZXN0ZWQgbG9naWNhbHMgKi8KCQkgIHsKCQkgICAgczIgPSBzMSArIHN0cmxlbiAoczEpIC0gMTsKCQkgICAgaWYgKCpzMiA9PSAnOicpCS8qIHRyYW5zbGF0aW9uIGVuZHMgaW4gJzonICovCgkJICAgICAgewoJCQlzMiA9IHRybmxvZyAoczEpOwoJCQlmcmVlIChzMSk7CgkJCWlmICgqczIgPT0gMCkKCQkJICB7CgkJCSAgICByb290ZWQgPSAwOwoJCQkgICAgYnJlYWs7CgkJCSAgfQoJCQlzMSA9IHMyOwoJCQljb250aW51ZTsJLyogbmV4dCBpdGVyYXRpb24gKi8KCQkgICAgICB9CgkJICAgIGlmICgqczIgPT0gJ10nKQkvKiB0cmFuc2xhdGlvbiBlbmRzIGluICddJyAqLwoJCSAgICAgIHsKCQkJaWYgKCooczItMSkgPT0gJy4nKQkvKiBlbmRzIGluICcuXScgKi8KCQkJICB7CgkJCSAgICBpZiAoc3RybmNtcCAoZnB0ciwgIjAwMDAwMCIsIDYpICE9IDApCgkJCSAgICAgIHJvb3RlZCA9IDA7CgkJCSAgfQoJCQllbHNlCgkJCSAgewoJCQkgICAgc3RyY3B5ICh2bXNuYW1lLCBzMSk7CgkJCSAgICBzID0gc3RyY2hyICh2bXNuYW1lLCAnXScpOwoJCQkgICAgKnMgPSAnLic7CgkJCSAgICBuc3RhdGUgPSBOX0RPVDsKCQkJICAgIHZwdHIgPSBzOwoJCQkgIH0KCQkgICAgICB9CgkJICAgIGJyZWFrOwoJCSAgfQoJCWZyZWUgKHMxKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICByb290ZWQgPSAwOwoKCSAgICBpZiAoKnZwdHIgPT0gMCkKCSAgICAgIHsKCQluc3RhdGUgPSBOX0RFVklDRTsKCSAgICAgICAgKnZwdHIrKyA9ICc6JzsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB2cHRyKys7CgoJICAgIGlmIChyb290ZWQgPT0gMCkKCSAgICAgIHsKCSAgICAgICAgc3RyY3B5ICh2cHRyLCAiWzAwMDAwMC4iKTsKCQl2cHRyICs9IDg7CgkJczEgPSB2cHRyLTE7CgkJbnN0YXRlID0gTl9ET1Q7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgczEgPSAwOwoKCS8qIHMxLT4gJy4nIGFmdGVyIDAwMDAwMCBvciBOVUxMICovCgoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsJCQkJLyogbm8gbmV4dCAnLycgKi8KCQlpZiAoKih2cHRyLTEpID09ICcuJykKCQkgICoodnB0ci0xKSA9ICddJzsKCQllbHNlIGlmIChyb290ZWQgPT0gMCkKCQkgICp2cHRyKysgPSAnXSc7CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlID09IDEpKTsKCQlzdGF0ZSA9IC0xOwoJCWJyZWFrOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQl3aGlsZSAoKihzKzEpID09ICcvJykJLyogc2tpcCBtdWx0aXBsZSAnLycgKi8KCQkgIHMrKzsKCSAgICAgIH0KCgkgICAgaWYgKChyb290ZWQgIT0gMCkKCSAgICAgICAgJiYgKCoodnB0ci0xKSAhPSAnLicpKQoJICAgICAgewoJCSp2cHRyKysgPSAnWyc7CgkJbnN0YXRlID0gTl9ET1Q7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgaWYgKChuc3RhdGUgPT0gTl9ET1QpCgkJICYmIChzMSAhPSAwKQoJCSAmJiAoKihzKzEpID09IDApKQoJCXsKCQkgIGlmICh0eXBlID09IDIpCgkJICAgIHsKCQkgICAgICAqczEgPSAnXSc7CgkJICAgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgIH0KCQl9CgkgICAgc3RhdGUgPSA5OwoJICAgIGJyZWFrOwoKCSAgY2FzZSA0OgkJCQkvKiBzaW5nbGUgJy8nIGF0IHN0YXJ0ICg5Li4xNSkgKi8KCSAgICBpZiAoKmZwdHIgPT0gMCkKCSAgICAgIHN0YXRlID0gNTsKCSAgICBlbHNlCgkgICAgICBzdGF0ZSA9IDY7CgkgICAgYnJlYWs7CgoJICBjYXNlIDU6CQkJCS8qIGp1c3QgJy8nIGF0IHN0YXJ0ICg5KSAqLwoJICAgIGlmICh0eXBlICE9IDIpCgkgICAgICB7CgkgICAgICAgICp2cHRyKysgPSAnWyc7CgkJbnN0YXRlID0gTl9PUEVOOwoJICAgICAgfQoJICAgIHN0cmNweSAodnB0ciwgIjAwMDAwMCIpOwoJICAgIHZwdHIgKz0gNjsKCSAgICBpZiAodHlwZSA9PSAyKQoJICAgICAgc3RhdGUgPSA3OwoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gODsKCSAgICBicmVhazsKCgkgIGNhc2UgNjoJCQkJLyogY2hhcnMgZm9sbG93aW5nICcvJyBhdCBzdGFydCAxMC4uMTUgKi8KCSAgICAqdnB0cisrID0gJ1snOwoJICAgIG5zdGF0ZSA9IE5fT1BFTjsKCSAgICBzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCQkJLyogMTAgKi8KCSAgICAgIHsKCQlpZiAodHlwZSAhPSAxKQoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDBdIik7CgkJICAgIHZwdHIgKz0gNzsKCQkgIH0KCQljb3B5dG8gKCZ2cHRyLCAmZnB0ciwgMCwgKHR5cGUgPT0gMSkpOwoJCWlmICh0eXBlID09IDEpCgkJICB7CgkJICAgICp2cHRyKysgPSAnXSc7CgkJICB9CgkJc3RhdGUgPSAtMTsKCSAgICAgIH0KCSAgICBlbHNlCQkJLyogMTEuLjE1ICovCgkgICAgICB7CgkJaWYgKCAodHlwZSA9PSAyKQoJCSAgICYmICgqKHMrMSkgPT0gMCkpCS8qIDExKDIpICovCgkJICB7CgkJICAgIHN0cmNweSAodnB0ciwgIjAwMDAwMF0iKTsKCQkgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgIHZwdHIgKz0gNzsKCQkgIH0KCQljb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAoKih2cHRyLTEpICE9ICddJykpOwoJCXN0YXRlID0gOTsKCSAgICAgIH0KCSAgICBicmVhazsKCgkgIGNhc2UgNzoJCQkJLyogYWRkICcuZGlyJyBhbmQgZXhpdCAqLwoJICAgIGlmICgobnN0YXRlID09IE5fT1BFTikKCQl8fCAobnN0YXRlID09IE5fRE9UKSkKCSAgICAgIHsKCQlzID0gdnB0ci0xOwoJCXdoaWxlIChzID4gdm1zbmFtZSkKCQkgIHsKCQkgICAgaWYgKCpzID09ICddJykKCQkgICAgICB7CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgaWYgKCpzID09ICcuJykKCQkgICAgICB7CgkJCSpzID0gJ10nOwoJCQlicmVhazsKCQkgICAgICB9CgkJICAgIHMtLTsKCQkgIH0KCSAgICAgIH0KCSAgICBzdHJjcHkgKHZwdHIsICIuZGlyIik7CgkgICAgdnB0ciArPSA0OwoJICAgIHN0YXRlID0gLTE7CgkgICAgYnJlYWs7CgoJICBjYXNlIDg6CQkJCS8qIGFkZCAnXScgYW5kIGV4aXQgKi8KCSAgICAqdnB0cisrID0gJ10nOwoJICAgIHN0YXRlID0gLTE7CgkgICAgYnJlYWs7CgoJICBjYXNlIDk6CQkJCS8qIDE3Li4yMSwgZnB0ciAtPiAxc3QgJy8nICsgMSAqLwoJICAgIGlmICgqZnB0ciA9PSAwKQoJICAgICAgewoJCWlmICh0eXBlID09IDIpCgkJICB7CgkJICAgIHN0YXRlID0gNzsKCQkgIH0KCQllbHNlCgkJICBzdGF0ZSA9IDg7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQoJICAgICAgewoJCWlmICh0eXBlICE9IDEpCgkJICB7CgkJICAgIGlmIChuc3RhdGUgPT0gTl9PUEVOKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAwOwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSA9PSBOX09QRU4pCgkJICAgICAgewoJCQkqdnB0cisrID0gJy4nOwoJCQluc3RhdGUgPSBOX0RPVDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDE7CgkJICB9CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCXdoaWxlICgqKHMrMSkgPT0gJy8nKQoJCSAgcysrOwoJCWlmICggKHR5cGUgPT0gMikKCQkgICAgJiYgKCoocysxKSA9PSAwKSkJCS8qIDE5KDIpLCAyMSgyKSovCgkJICB7CgkJICAgIGlmIChuc3RhdGUgIT0gTl9DTE9TRUQpCgkJICAgICAgewoJCQkqdnB0cisrID0gJ10nOwoJCQluc3RhdGUgPSBOX0NMT1NFRDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDE7CgkJICB9CgkJZWxzZQoJCSAgewoJCSAgICBpZiAobnN0YXRlID09IE5fT1BFTikKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnLic7CgkJCW5zdGF0ZSA9IE5fRE9UOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMTsKCQkgIH0KCSAgICAgIH0KCSAgICBpZiAoICgqZnB0ciA9PSAnLicpCQkJLyogY2hlY2sgZm9yICcuLicgb3IgJy4uLycgKi8KCQkmJiAoKihmcHRyKzEpID09ICcuJykKCQkmJiAoKCooZnB0cisyKSA9PSAnLycpCgkJICAgIHx8ICgqKGZwdHIrMikgPT0gMCkpICkKCSAgICAgIHsKCQlmcHRyICs9IDI7CgkJaWYgKCpmcHRyID09ICcvJykKCQkgIHsKCQkgICAgZG8KCQkgICAgICB7CgkJCWZwdHIrKzsKCQkgICAgICB9CgkJICAgIHdoaWxlICgqZnB0ciA9PSAnLycpOwoJCSAgfQoJCWVsc2UgaWYgKCpmcHRyID09IDApCgkJICB0eXBlID0gMTsKCQl2cHRyLS07CQkJCS8qIHZwdHIgLT4gJy4nIG9yICddJyAqLwoJCXMxID0gdnB0cjsKCQlmb3IgKDs7KQoJCSAgewoJCSAgICBzMS0tOwoJCSAgICBpZiAoKnMxID09ICcuJykJCS8qIG9uZSBiYWNrICovCgkJICAgICAgewoJCQl2cHRyID0gczE7CgkJCW5zdGF0ZSA9IE5fT1BFTjsKCQkJYnJlYWs7CgkJICAgICAgfQoJCSAgICBpZiAoKnMxID09ICdbJykJCS8qIHRvcCBsZXZlbCByZWFjaGVkICovCgkJICAgICAgewoJCQlpZiAoKmZwdHIgPT0gMCkKCQkJICB7CgkJCSAgICBzdHJjcHkgKHMxLCAiWzAwMDAwMF0iKTsKCQkJICAgIHZwdHIgPSBzMSArIDg7CgkJCSAgICBuc3RhdGUgPSBOX0NMT1NFRDsKCQkJICAgIHMgPSAwOwoJCQkgICAgYnJlYWs7CgkJCSAgfQoJCQllbHNlCgkJCSAgewoJCQkgICAgdnB0ciA9IHMxKzE7CgkJCSAgICBuc3RhdGUgPSBOX09QRU47CgkJCSAgICBicmVhazsKCQkJICB9CgkJICAgICAgfSAKCQkgIH0KCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgYXNfZGlyKTsKCQlpZiAobnN0YXRlID09IE5fRE9UKQoJCSAgbnN0YXRlID0gTl9PUEVOOwoJICAgICAgfQoJICAgIGlmIChzID09IDApCgkgICAgICB7CQkJCQkvKiAxOCwyMCAqLwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCWlmICgqKHMrMSkgPT0gMCkKCQkgIHsKCQkgICAgaWYgKHR5cGUgPT0gMikJCS8qIDE5LDIxICovCgkJICAgICAgewoJCSAgICAgICAgc3RhdGUgPSA3OwoJCSAgICAgIH0KCQkgICAgZWxzZQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJc3RhdGUgPSAtMTsKCQkgICAgICB9CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlIDEwOgkJCQkvKiAxLDIgZmlyc3QgaXMgJy4nICovCgkgICAgaWYgKCpmcHRyID09ICcuJykKCSAgICAgIHsKCQlmcHRyKys7CgkJc3RhdGUgPSAxMTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICBzdGF0ZSA9IDEyOwoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMToJCQkJLyogMiwgJy4uJyBhdCBzdGFydCAqLwoJICAgIGNvdW50ID0gMTsKCSAgICBpZiAoKmZwdHIgIT0gMCkKCSAgICAgIHsKCQlpZiAoKmZwdHIgIT0gJy8nKQkJLyogZ290IC4ueHh4ICovCgkJICB7CgkJICAgIHJldHVybiBuYW1lOwoJCSAgfQoJCWRvCQkJCS8qIGdvdCAuLi8gKi8KCQkgIHsKCQkgICAgZnB0cisrOwoJCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKSBmcHRyKys7CgkJICAgIGlmICgqZnB0ciAhPSAnLicpCgkJICAgICAgYnJlYWs7CgkJICAgIGlmICgqKGZwdHIrMSkgIT0gJy4nKQoJCSAgICAgIGJyZWFrOwoJCSAgICBmcHRyICs9IDI7CgkJICAgIGlmICgoKmZwdHIgPT0gMCkKCQkJfHwgKCpmcHRyID09ICcvJykpCgkJICAgICAgY291bnQrKzsKCQkgIH0KCQl3aGlsZSAoKmZwdHIgPT0gJy8nKTsKCSAgICAgIH0KCSAgICB7CQkJCQkvKiBnb3QgJy4uJyBvciAnLi4vJyAqLwoJICAgICAgY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkgICAgICBzMSA9IGdldGN3ZChjd2RidWYsIE1BWFBBVEhMRU4pOwoJICAgICAgaWYgKHMxID09IDApCgkJewoJCSAgcmV0dXJuICIiOwkgICAgLyogRklYTUUsIGVyciBnZXRjd2QgKi8KCQl9CgkgICAgICBzdHJjcHkgKHZwdHIsIHMxKTsKCSAgICAgIHMgPSBzdHJjaHIgKHZwdHIsICddJyk7CgkgICAgICBpZiAocyAhPSAwKQoJCXsKCQkgIHdoaWxlIChzID4gdnB0cikKCQkgICAgewoJCSAgICAgIHMtLTsKCQkgICAgICBpZiAoKnMgPT0gJ1snKQoJCQl7CgkJCSAgcysrOwoJCQkgIHN0cmNweSAocywgIjAwMDAwMF0iKTsKCQkJICBzdGF0ZSA9IC0xOwoJCQkgIGJyZWFrOwoJCQl9CgkJICAgICAgZWxzZSBpZiAoKnMgPT0gJy4nKQoJCQl7CgkJCSAgaWYgKC0tY291bnQgPT0gMCkKCQkJICAgIHsKCQkJICAgICAgaWYgKCpmcHRyID09IDApCS8qIGhhZCAnLi4nIG9yICcuLi8nICovCgkJCQl7CgkJCQkgICpzKysgPSAnXSc7CgkJCQkgIHN0YXRlID0gLTE7CgkJCQl9CgkJCSAgICAgIGVsc2UJCQkvKiBoYWQgJy4uL3h4eCcgKi8KCQkJCXsKCQkJCSAgc3RhdGUgPSA5OwoJCQkJfQoJCQkgICAgICAqcyA9IDA7CgkJCSAgICAgIGJyZWFrOwoJCQkgICAgfQoJCQl9CgkJICAgIH0KCQl9CgkgICAgICB2cHRyICs9IHN0cmxlbiAodnB0cik7CgkgICAgfQoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMjoJCQkJLyogMSwgJy4nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykKCQkgIHsKCQkgICAgcmV0dXJuIG5hbWU7CgkJICB9CgkJZnB0cisrOwoJICAgICAgfQoKCSAgICB7CgkgICAgICBjaGFyIGN3ZGJ1ZltNQVhQQVRITEVOKzFdOwoKCSAgICAgIHMxID0gZ2V0Y3dkKGN3ZGJ1ZiwgTUFYUEFUSExFTik7CgkgICAgICBpZiAoczEgPT0gMCkKCQl7CgkJICByZXR1cm4gIiI7CSAgICAvKkZJWE1FLCBlcnIgZ2V0Y3dkICovCgkJfQoJICAgICAgc3RyY3B5ICh2cHRyLCBzMSk7CgkgICAgICBpZiAoKmZwdHIgPT0gMCkKCQl7CgkJICBzdGF0ZSA9IC0xOwoJCSAgYnJlYWs7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgIHMgPSBzdHJjaHIgKHZwdHIsICddJyk7CgkJICBpZiAocyA9PSAwKQoJCSAgICB7CgkJICAgICAgc3RhdGUgPSAtMTsKCQkgICAgICBicmVhazsKCQkgICAgfQoJCSAgKnMgPSAwOwoJCSAgbnN0YXRlID0gTl9PUEVOOwoJCSAgdnB0ciArPSBzdHJsZW4gKHZwdHIpOwoJCSAgc3RhdGUgPSA5OwoJCX0KCSAgICB9CgkgICAgYnJlYWs7Cgl9CgoJfQogICAgICB3aGlsZSAoc3RhdGUgPiAwKTsKICAgICAgCgogICAgfQoKCiAgLyogZGlyZWN0b3J5IGNvbnZlcnNpb24gZG9uZQogICAgIGZwdHIgLT4gZmlsZW5hbWUgcGFydCBvZiBpbnB1dCBzdHJpbmcKICAgICB2cHRyIC0+IGZyZWUgc3BhY2UgaW4gdm1zbmFtZQogICovCgogICp2cHRyKysgPSAwOwoKICByZXR1cm4gdm1zbmFtZTsKfQoKCgovKgogIGNvbnZlcnQgZnJvbSB2bXMtc3R5bGUgdG8gdW5peC1zdHlsZQoKICBkZXY6W2RpcjEuZGlyMl0JLy9kZXYvZGlyMS9kaXIyLwoqLwoKY2hhciAqCnVuaXhpZnkgKGNoYXIgKm5hbWUpCnsKICBzdGF0aWMgY2hhciBwaWVjZVs1MTJdOwogIGNoYXIgKnMsICpwOwoKICBpZiAoc3RyY2hyIChuYW1lLCAnLycpICE9IDApCQkvKiBhbHJlYWR5IGluIHVuaXggc3R5bGUgKi8KICAgIHJldHVybiBuYW1lOwoKICBwID0gcGllY2U7CiAgKnAgPSAwOwoKICAvKiBkZXZpY2UgcGFydCAqLwoKICBzID0gc3RyY2hyIChuYW1lLCAnOicpOwoKICBpZiAocyAhPSAwKQogICAgewogICAgICAqcyA9IDA7CiAgICAgICpwKysgPSAnLyc7CiAgICAgICpwKysgPSAnLyc7CiAgICAgIHN0cmNweSAocCwgbmFtZSk7CiAgICAgIHAgKz0gc3RybGVuIChwKTsKICAgICAgKnMgPSAnOic7CiAgICB9CgogIC8qIGRpcmVjdG9yeSBwYXJ0ICovCgogICpwKysgPSAnLyc7CiAgcyA9IHN0cmNociAobmFtZSwgJ1snKTsKCiAgaWYgKHMgIT0gMCkKICAgIHsKICAgICAgcysrOwogICAgICBzd2l0Y2ggKCpzKQogICAgICAgIHsKCSAgY2FzZSAnXSc6CQkvKiBbXSAqLwoJICAgIHN0cmNhdCAocCwgIi4vIik7CgkgICAgYnJlYWs7CgkgIGNhc2UgJy0nOgkJLyogWy0gKi8KCSAgICBzdHJjYXQgKHAsICIuLi8iKTsKCSAgICBicmVhazsKCSAgY2FzZSAnLic6CgkgICAgc3RyY2F0IChwLCAiLi8iKTsJLyogWy4gKi8KCSAgICBicmVhazsKCSAgZGVmYXVsdDoKCSAgICBzLS07CgkgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBzKys7CiAgICAgIHdoaWxlICgqcykKICAgICAgICB7CgkgIGlmICgqcyA9PSAnLicpCgkgICAgKnArKyA9ICcvJzsKCSAgZWxzZQoJICAgICpwKysgPSAqczsKCSAgcysrOwoJICBpZiAoKnMgPT0gJ10nKQoJICAgIHsKCSAgICAgIHMrKzsKCSAgICAgIGJyZWFrOwoJICAgIH0KICAgICAgICB9CiAgICAgIGlmICgqcyAhPSAwKQkJLyogbW9yZSBhZnRlciAnXScgPz8gKi8KICAgICAgICB7CgkgIGlmICgqKHAtMSkgIT0gJy8nKQoJICAgICpwKysgPSAnLyc7CgkgIHN0cmNweSAocCwgcyk7CQkvKiBjb3B5IGl0IGFueXdheSAqLwogICAgICAgIH0KICAgIH0KCiAgZWxzZQkJLyogbm8gJ1snIGFueXdoZXJlICovCgogICAgewogICAgICAqcCsrID0gMDsKICAgIH0KCiAgLyogZm9yY2UgZW5kIHdpdGggJy8nICovCgogIGlmICgqKHAtMSkgIT0gJy8nKQogICAgKnArKyA9ICcvJzsKICAqcCA9IDA7CgogIHJldHVybiBwaWVjZTsKfQoKLyogRU9GICovCg==