Lyogdm1zaWZ5LmMgLS0gTW9kdWxlIGZvciB2bXMgPC0+IHVuaXggZmlsZSBuYW1lIGNvbnZlcnNpb24KQ29weXJpZ2h0IChDKSAxOTk2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBNYWtlLgoKR05VIE1ha2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgp2ZXJzaW9uLgoKR05VIE1ha2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCldBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCkEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAp0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKLyogV3JpdHRlbiBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpCiAgIG9mIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55ICovCgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaWYgVk1TCiNpbmNsdWRlIDx1bml4bGliLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGpwaWRlZi5oPgojaW5jbHVkZSA8ZGVzY3JpcC5oPgojaW5jbHVkZSA8dWFpZGVmLmg+CiNpbmNsdWRlIDxzc2RlZi5oPgojaW5jbHVkZSA8c3RhcmxldC5oPgojaW5jbHVkZSA8bGliJHJvdXRpbmVzLmg+Ci8qIEluaXRpYWxpemUgYSBzdHJpbmcgZGVzY3JpcHRvciAoc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MpIGZvciBhbgogICBhcmJpdHJhcnkgc3RyaW5nLiAgIEFERFIgaXMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAgb2YgdGhlIHN0cmluZywgYW5kIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICovCgojZGVmaW5lIElOSVRfRFNDX1MoZHNjLCBhZGRyLCBsZW4pIGRvIHsgXAogIChkc2MpLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsgICAgXAogIChkc2MpLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsgICAgXAogIChkc2MpLmRzYyR3X2xlbmd0aCA9IChsZW4pOyAgICAgICAgICAgXAogIChkc2MpLmRzYyRhX3BvaW50ZXIgPSAoYWRkcik7ICAgICAgICAgXAp9IHdoaWxlICgwKQoKLyogSW5pdGlhbGl6ZSBhIHN0cmluZyBkZXNjcmlwdG9yIChzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcykgZm9yIGEKICAgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLiAgUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZzsgdGhlIGxlbmd0aAogICBpcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgc3RybGVuKCkuICovCgojZGVmaW5lIElOSVRfRFNDX0NTVFJJTkcoZHNjLCBzKSBJTklUX0RTQ19TKGRzYywgcywgc3RybGVuKHMpKQojZW5kaWYKCi8qCiAgY29weSAnZnJvbScgdG8gJ3RvJyB1cCB0byBidXQgbm90IGluY2x1ZGluZyAndXB0bycKICByZXR1cm4gMCBpZiBlb3Mgb24gZnJvbQogIHJldHVybiAxIGlmIHVwdG8gZm91bmQKCiAgcmV0dXJuICd0bycgYXQgbGFzdCBjaGFyICsgMQogIHJldHVybiAnZnJvbScgYXQgbWF0Y2ggKyAxIG9yIGVvcyBpZiBubyBtYXRjaAoKICBpZiBhc19kaXIgPT0gMSwgY2hhbmdlIGFsbCAnLicgdG8gJ18nCiAgZWxzZSBjaGFuZ2UgYWxsICcuJyBidXQgdGhlIGxhc3QgdG8gJ18nCiovCgpzdGF0aWMgaW50CmNvcHl0byAoY2hhciAqKnRvLCBjb25zdCBjaGFyICoqZnJvbSwgY2hhciB1cHRvLCBpbnQgYXNfZGlyKQp7CiAgY29uc3QgY2hhciAqczsKCiAgcyA9IHN0cnJjaHIgKCpmcm9tLCAnLicpOwoKICB3aGlsZSAoKipmcm9tKQogICAgewogICAgICBpZiAoKipmcm9tID09IHVwdG8pCgl7CgkgIGRvCgkgICAgewoJICAgICAgKCpmcm9tKSsrOwoJICAgIH0KCSAgd2hpbGUgKCoqZnJvbSA9PSB1cHRvKTsKCSAgcmV0dXJuIDE7Cgl9CiAgICAgIGlmICgqKmZyb20gPT0gJy4nKQoJewoJICBpZiAoKGFzX2RpciA9PSAxKQoJICAgICAgfHwgKCpmcm9tICE9IHMpKQoJICAgICoqdG8gPSAnXyc7CgkgIGVsc2UKCSAgICAqKnRvID0gJy4nOwoJfQogICAgICBlbHNlCgl7CiNpZmRlZiBIQVZFX0NBU0VfSU5TRU5TSVRJVkVfRlMKCSAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSoqZnJvbSkpCgkgICAgKip0byA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSoqZnJvbSk7CgkgIGVsc2UKI2VuZGlmCgkgICAgKip0byA9ICoqZnJvbTsKCX0KICAgICAgKCp0bykrKzsKICAgICAgKCpmcm9tKSsrOwogICAgfQoKICByZXR1cm4gMDsKfQoKCi8qCiAgZ2V0IHRyYW5zbGF0aW9uIG9mIGxvZ2ljYWwgbmFtZQoKKi8KCnN0YXRpYyBjaGFyICoKdHJubG9nIChjb25zdCBjaGFyICpuYW1lKQp7CiAgaW50IHN0YXQ7CiAgc3RhdGljIGNoYXIgcmVzbHRbMTAyNF07CiAgJERFU0NSSVBUT1IgKHJlc2x0X2RzYywgcmVzbHQpOwogIHNob3J0IHJlc2x0bGVuOwogIHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9zIG5hbWVfZHNjOwogIGNoYXIgKnM7CgogIC8qCiAgICogdGhlIHN0cmluZyBpc24ndCBjaGFuZ2VkLCBidXQgdGhlcmUgaXMgbm8gc3RyaW5nIGRlc2NyaXB0b3Igd2l0aAogICAqICJjb25zdCBjaGFyICpkc2MkYV9wb2ludGVyIgogICAqLwogIElOSVRfRFNDX0NTVFJJTkcgKG5hbWVfZHNjLCAoY2hhciAqKW5hbWUpOwoKICBzdGF0ID0gbGliJHN5c190cm5sb2cgKCZuYW1lX2RzYywgJnJlc2x0bGVuLCAmcmVzbHRfZHNjKTsKCiAgaWYgKChzdGF0JjEpID09IDApCiAgICB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICBpZiAoc3RhdCA9PSBTUyRfTk9UUkFOKQogICAgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgcmVzbHRbcmVzbHRsZW5dID0gJ1wwJzsKCiAgcyA9IG1hbGxvYyAocmVzbHRsZW4rMSk7CiAgaWYgKHMgPT0gMCkKICAgIHJldHVybiAiIjsKICBzdHJjcHkgKHMsIHJlc2x0KTsKICByZXR1cm4gczsKfQoKc3RhdGljIGNoYXIgKgpzaG93YWxsIChjaGFyICpzKQp7CiAgc3RhdGljIGNoYXIgdFs1MTJdOwogIGNoYXIgKnB0OwoKICBwdCA9IHQ7CiAgaWYgKHN0cmNociAocywgJ1xcJykgPT0gMCkKICAgIHJldHVybiBzOwogIHdoaWxlICgqcykKICAgIHsKICAgICAgaWYgKCpzID09ICdcXCcpCgl7CgkgICpwdCsrID0gKnM7Cgl9CiAgICAgICpwdCsrID0gKnMrKzsKICAgIH0KICByZXR1cm4gcHQ7Cn0KCgplbnVtIG5hbWVzdGF0ZSB7IE5fU1RBUlQsIE5fREVWSUNFLCBOX09QRU4sIE5fRE9ULCBOX0NMT1NFRCwgTl9ET05FIH07CgovKgogIGNvbnZlcnQgdW5peCBzdHlsZSBuYW1lIHRvIHZtcyBzdHlsZQogIHR5cGUgPSAwIC0+IG5hbWUgaXMgYSBmdWxsIG5hbWUgKGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgcGFydCkKICB0eXBlID0gMSAtPiBuYW1lIGlzIGEgZGlyZWN0b3J5CiAgdHlwZSA9IDIgLT4gbmFtZSBpcyBhIGZpbGVuYW1lIHdpdGhvdXQgZGlyZWN0b3J5CgogIFRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgYXJlIGFwcGxpZWQKCQkJKDApCQkoMSkJCQkoMikKCWlucHV0CQlmdWxsIG5hbWUJZGlyIG5hbWUJCWZpbGUgbmFtZQoKMQkuLwkJPGN3ZD4JCVtdCQkJPGN1cnJlbnQgZGlyZWN0b3J5Pi5kaXIKMgkuLi8JCTxob21lIG9mIGN3ZD4JPGhvbWUgb2YgY3dkPgkJPGhvbWUgb2YgY3dkPi5kaXIKCjMJLy8JCTxkZXYgb2YgY3dkPjoJPGRldiBvZiBjd2Q+OlswMDAwMDBdCTxkZXYgb2YgY3dkPjowMDAwMDAuZGlyCjQJLy9hCQlhOgkJYToJCQlhOgo1CS8vYS8JCWE6CQlhOgkJCWE6MDAwMDAwLmRpcgoKOQkvCQlbMDAwMDAwXQlbMDAwMDAwXQkJMDAwMDAwLmRpcgoxMAkvYQkJWzAwMDAwMF1hCVthXQkJCVswMDAwMDBdYQoxMQkvYS8JCVthXQkJW2FdCQkJWzAwMDAwMF1hLmRpcgoxMgkvYS9iCQlbYV1iCQlbYS5iXQkJCVthXWIKMTMJL2EvYi8JCVthLmJdCQlbYS5iXQkJCVthXWIuZGlyCjE0CS9hL2IvYwkJW2EuYl1jCQlbYS5iLmNdCQkJW2EuYl1jCjE1CS9hL2IvYy8JCVthLmIuY10JCVthLmIuY10JCQlbYS5iXWMuZGlyCgoxNglhCQlhCQlbLmFdCQkJYQoxNwlhLwkJWy5hXQkJWy5hXQkJCWEuZGlyCjE4CWEvYgkJWy5hXWIJCVsuYS5iXQkJCVsuYV1iCjE5CWEvYi8JCVsuYS5iXQkJWy5hLmJdCQkJWy5hXWIuZGlyCjIwCWEvYi9jCQlbLmEuYl1jCQlbLmEuYi5jXQkJWy5hLmJdYwoyMQlhL2IvYy8JCVsuYS5iLmNdCVsuYS5iLmNdCQlbLmEuYl1jLmRpcgoKMjIJYS5iLmMJCWFfYi5jCQlbLmFfYl9jXQkJYV9iX2MuZGlyCgoyMwlbeF1beV16CQlbeC55XXoJCVt4LnldegkJCVt4LnldegoyNAlbeF1bLnldeglbeC55XXoJCVt4LnldegkJCVt4LnldegoKMjUgIGZpbGVuYW1lcyB3aXRoICckJyAgYXJlIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZXkgY29udGFpbiBubyAnLycKMjUgIGZpbGVuYW1lcyB3aXRoICc6JyBhcmUgbGVmdCB1bmNoYW5nZWQKMjYgIGZpbGVuYW1lcyB3aXRoIGEgc2luZ2xlIHBhaXIgb2YgJ1snICddJyBhcmUgbGVmdCB1bmNoYW5nZWQKCiAgVGhlIGlucHV0IHN0cmluZyBpcyBub3Qgd3JpdHRlbiB0by4gIFRoZSByZXN1bHQgaXMgYWxzbyBjb25zdCBiZWNhdXNlCiAgaXQncyBhIHN0YXRpYyBidWZmZXI7IHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LgoqLwoKY29uc3QgY2hhciAqCnZtc2lmeSAoY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUpCnsKLyogbWF4IDI1NSBkZXZpY2UKICAgbWF4IDM5IGRpcmVjdG9yeQogICBtYXggMzkgZmlsZW5hbWUKICAgbWF4IDM5IGZpbGV0eXBlCiAgIG1heCA1IHZlcnNpb24KKi8KI2RlZmluZSBNQVhQQVRITEVOIDUxMgoKICBlbnVtIG5hbWVzdGF0ZSBuc3RhdGU7CiAgc3RhdGljIGNoYXIgdm1zbmFtZVtNQVhQQVRITEVOKzFdOwogIGNvbnN0IGNoYXIgKmZwdHI7CiAgY29uc3QgY2hhciAqdDsKICBjaGFyICp2cHRyOwogIGludCBhc19kaXI7CiAgaW50IGNvdW50OwogIGNvbnN0IGNoYXIgKnM7CiAgY29uc3QgY2hhciAqczE7CiAgY29uc3QgY2hhciAqczI7CgogIGlmIChuYW1lID09IDApCiAgICByZXR1cm4gMDsKICBmcHRyID0gbmFtZTsKICB2cHRyID0gdm1zbmFtZTsKICBuc3RhdGUgPSBOX1NUQVJUOwoKICAvKiBjYXNlIDI1YSAqLwogIHQgPSBzdHJwYnJrIChuYW1lLCAiJDoiKTsKCiAgaWYgKHQgIT0gMCkKICAgIHsKLy8gICAgICBjb25zdCBjaGFyICpzMTsKLy8gICAgICBjb25zdCBjaGFyICpzMjsKCiAgICAgIGlmICh0eXBlID09IDEpCiAgICAgICAgewogICAgICAgICAgczEgPSBzdHJjaHIgKHQrMSwgJ1snKTsKICAgICAgICAgIHMyID0gc3RyY2hyICh0KzEsICddJyk7CiAgICAgICAgfQoKICAgICAgaWYgKCp0ID09ICckJykKICAgICAgICB7CiAgICAgICAgICBpZiAoc3RyY2hyIChuYW1lLCAnLycpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwogICAgICAgICAgICAgIGlmICgodHlwZSA9PSAxKSAmJiAoczEgIT0gMCkgJiYgKHMyID09IDApKQogICAgICAgICAgICAgICAgc3RyY2F0ICh2bXNuYW1lLCAiXSIpOwogICAgICAgICAgICAgIHJldHVybiB2bXNuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgc3RyY3B5ICh2bXNuYW1lLCBuYW1lKTsKICAgICAgICAgIGlmICgodHlwZSA9PSAxKSAmJiAoczEgIT0gMCkgJiYgKHMyID09IDApKQogICAgICAgICAgICBzdHJjYXQgKHZtc25hbWUsICJdIik7CiAgICAgICAgICByZXR1cm4gdm1zbmFtZTsKICAgICAgICB9CiAgICB9CgogIC8qIGNhc2UgMjYgKi8KICB0ID0gc3RyY2hyIChuYW1lLCAnWycpOwoKICBpZiAodCAhPSAwKQogICAgewovLyAgICAgIGNvbnN0IGNoYXIgKnM7Ci8vICAgICAgY29uc3QgY2hhciAqczEgPSBzdHJjaHIgKHQrMSwgJ1snKTsKICAgICAgczEgPSBzdHJjaHIgKHQrMSwgJ1snKTsKICAgICAgaWYgKHMxID09IDApCgl7CiAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwoJICBpZiAoKHR5cGUgPT0gMSkgJiYgKHN0cmNociAodCsxLCAnXScpID09IDApKQogICAgICAgICAgICBzdHJjYXQgKHZtc25hbWUsICJdIik7CiAgICAgICAgICByZXR1cm4gdm1zbmFtZTsKCX0KICAgICAgczEtLTsKICAgICAgaWYgKCpzMSAhPSAnXScpCgl7CiAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwoJICByZXR1cm4gdm1zbmFtZTsJCS8qIG5vdCBdWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KCiAgICAgIC8qIHdlIGhhdmUgXVsgKi8KCiAgICAgIHMgPSBuYW1lOwoKICAgICAgLyogcyAgLT4gc3RhcnRpbmcgY2hhcgoJIHMxIC0+IGVuZGluZyAnXScgICovCiAgICAgIGRvCgl7CgkgIHN0cm5jcHkgKHZwdHIsIHMsIHMxLXMpOwkvKiBjb3B5IHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nICddJyAqLwoJICB2cHRyICs9IHMxLXM7CgkgIGlmICgqczEgPT0gMCkKCSAgICBicmVhazsKCSAgcyA9IHMxICsgMTsJCQkvKiBzIC0+IGNoYXIgYmVoaW5kICddJyAqLwoJICBpZiAoKnMgIT0gJ1snKQkJLyogd2FzICddWycgPyAqLwoJICAgIGJyZWFrOwkJCS8qIG5vLCBsYXN0IF0gZm91bmQsIGV4aXQgKi8KCSAgcysrOwoJICBpZiAoKnMgIT0gJy4nKQoJICAgICp2cHRyKysgPSAnLic7CgkgIHMxID0gc3RyY2hyIChzLCAnXScpOwoJICBpZiAoczEgPT0gMCkJCQkvKiBubyBjbG9zaW5nIF0gKi8KCSAgICBzMSA9IHMgKyBzdHJsZW4gKHMpOwoJfQogICAgICB3aGlsZSAoMSk7CgogICAgICAqdnB0cisrID0gJ10nOwoKICAgICAgZnB0ciA9IHM7CgogICAgfQogIGVsc2UJCS8qIG5vIFsgaW4gbmFtZSAqLwogICAgewogICAgICBpbnQgc3RhdGUgPSAwOwogICAgICBpbnQgcm9vdGVkID0gMTsJLyogZmxhZyBpZiBsb2dpY2FsIGlzIHJvb3RlZCwgZWxzZSBpbnNlcnQgWzAwMDAwMF0gKi8KCiAgICAgIGRvCgl7CiAgICAgIHN3aXRjaCAoc3RhdGUpCgl7CgkgIGNhc2UgMDoJCQkJLyogc3RhcnQgb2YgbG9vcCAqLwoJICAgIGlmICgqZnB0ciA9PSAnLycpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTsKCSAgICAgIH0KCSAgICBlbHNlIGlmICgqZnB0ciA9PSAnLicpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTA7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSAyOwoJICAgIGJyZWFrOwoKCSAgY2FzZSAxOgkJCQkvKiAnLycgYXQgc3RhcnQgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy8nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDM7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA0OwoJICAgIGJyZWFrOwoKCSAgY2FzZSAyOgkJCQkvKiBubyAnLycgYXQgc3RhcnQgKi8KICAgICAgICAgICAgewogICAgICAgICAgICBjb25zdCBjaGFyICpzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCQkJLyogbm8gJy8nICgxNikgKi8KCSAgICAgIHsKCQlpZiAodHlwZSA9PSAxKQoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICJbLiIpOwoJCSAgICB2cHRyICs9IDI7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlPT0xKSk7CgkJaWYgKHR5cGUgPT0gMSkKCQkgICp2cHRyKysgPSAnXSc7CgkJc3RhdGUgPSAtMTsKCSAgICAgIH0KCSAgICBlbHNlCQkJLyogZm91bmQgJy8nICgxNy4uMjEpICovCgkgICAgICB7CgkJaWYgKCh0eXBlID09IDIpCgkJICAgICYmICgqKHMrMSkgPT0gMCkpCS8qIDE3KDIpICovCgkJICB7CgkJICAgIGNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsIDEpOwoJCSAgICBzdGF0ZSA9IDc7CgkJICB9CgkJZWxzZQoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICJbLiIpOwoJCSAgICB2cHRyICs9IDI7CgkJICAgIGNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsIDEpOwoJCSAgICBuc3RhdGUgPSBOX09QRU47CgkJICAgIHN0YXRlID0gOTsKCQkgIH0KCSAgICAgIH0KCSAgICBicmVhazsKICAgICAgICAgICAgfQoKCSAgY2FzZSAzOgkJCQkvKiAnLy8nIGF0IHN0YXJ0ICovCiAgICAgICAgICAgIHsKLy8gICAgICAgICAgICBjb25zdCBjaGFyICpzOwovLyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMxOwogICAgICAgICAgICBjaGFyICp2cDsKCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKQkvKiBjb2xsYXBzZSBhbGwgJy8nICovCgkgICAgICBmcHRyKys7CgkgICAgaWYgKCpmcHRyID09IDApCQkvKiBqdXN0IC8vICovCgkgICAgICB7CgkJY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkJczEgPSBnZXRjd2QoY3dkYnVmLCBNQVhQQVRITEVOKTsKCQlpZiAoczEgPT0gMCkKCQkgIHsKICAgICAgICAgICAgICAgICAgICB2bXNuYW1lWzBdID0gJ1wwJzsKCQkgICAgcmV0dXJuIHZtc25hbWU7CS8qIEZJWE1FLCBlcnIgZ2V0Y3dkICovCgkJICB9CgkJcyA9IHN0cmNociAoczEsICc6Jyk7CgkJaWYgKHMgPT0gMCkKCQkgIHsKICAgICAgICAgICAgICAgICAgICB2bXNuYW1lWzBdID0gJ1wwJzsKCQkgICAgcmV0dXJuIHZtc25hbWU7CS8qIEZJWE1FLCBlcnIgbm8gZGV2aWNlICovCgkJICB9CgkJc3RybmNweSAodnB0ciwgczEsIHMtczErMSk7CgkJdnB0ciArPSBzLXMxKzE7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCgkgICAgcyA9IHZwdHI7CgoJICAgIGlmIChjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKSA9PSAwKQkvKiBjb3B5IGRldmljZSBwYXJ0ICovCgkgICAgICB7CgkJKnZwdHIrKyA9ICc6JzsKCQlzdGF0ZSA9IC0xOwoJCWJyZWFrOwoJICAgICAgfQoJICAgICp2cHRyID0gJzonOwoJICAgIG5zdGF0ZSA9IE5fREVWSUNFOwoJICAgIGlmICgqZnB0ciA9PSAwKQkvKiBqdXN0ICcvL2EvJyAqLwoJICAgICAgewoJCXN0cmNweSAodnB0cisxLCAiWzAwMDAwMF0iKTsKCQl2cHRyICs9IDk7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICAqdnB0ciA9IDA7CgkJCQkvKiBjaGVjayBsb2dpY2FsIGZvciBbMDAwMDAwXSBpbnNlcnRpb24gKi8KCSAgICB2cCA9IHRybmxvZyAocyk7CgkgICAgaWYgKCp2cCAhPSAnXDAnKQoJICAgICAgewkJCS8qIGZvdW5kIHRyYW5zbGF0aW9uICovCgkJZm9yICg7OykJLyogbG9vcCBvdmVyIGFsbCBuZXN0ZWQgbG9naWNhbHMgKi8KCQkgIHsKCQkgICAgY2hhciAqdnAyID0gdnAgKyBzdHJsZW4gKHZwKSAtIDE7CgkJICAgIGlmICgqdnAyID09ICc6JykJLyogdHJhbnNsYXRpb24gZW5kcyBpbiAnOicgKi8KCQkgICAgICB7CgkJCXZwMiA9IHRybmxvZyAodnApOwoJCQlmcmVlICh2cCk7CgkJCWlmICgqdnAyID09IDApCgkJCSAgewoJCQkgICAgcm9vdGVkID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJdnAgPSB2cDI7CgkJCWNvbnRpbnVlOwkvKiBuZXh0IGl0ZXJhdGlvbiAqLwoJCSAgICAgIH0KCQkgICAgaWYgKCp2cDIgPT0gJ10nKQkvKiB0cmFuc2xhdGlvbiBlbmRzIGluICddJyAqLwoJCSAgICAgIHsKCQkJaWYgKCoodnAyLTEpID09ICcuJykJLyogZW5kcyBpbiAnLl0nICovCgkJCSAgewoJCQkgICAgaWYgKHN0cm5jbXAgKGZwdHIsICIwMDAwMDAiLCA2KSAhPSAwKQoJCQkgICAgICByb290ZWQgPSAwOwoJCQkgIH0KCQkJZWxzZQoJCQkgIHsKCQkJICAgIHN0cmNweSAodm1zbmFtZSwgczEpOwoJCQkgICAgdnAgPSBzdHJjaHIgKHZtc25hbWUsICddJyk7CgkJCSAgICAqdnAgPSAnLic7CgkJCSAgICBuc3RhdGUgPSBOX0RPVDsKCQkJICAgIHZwdHIgPSB2cDsKCQkJICB9CgkJICAgICAgfQoJCSAgICBicmVhazsKCQkgIH0KCQlmcmVlICh2cCk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcm9vdGVkID0gMDsKCgkgICAgaWYgKCp2cHRyID09IDApCgkgICAgICB7CgkJbnN0YXRlID0gTl9ERVZJQ0U7CgkgICAgICAgICp2cHRyKysgPSAnOic7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgdnB0cisrOwoKCSAgICBpZiAocm9vdGVkID09IDApCgkgICAgICB7CgkJbnN0YXRlID0gTl9ET1Q7CgkgICAgICAgIHN0cmNweSAodnB0ciwgIlswMDAwMDAuIik7CgkJdnB0ciArPSA4OwoJCXZwID0gdnB0ci0xOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHZwID0gMDsKCiAgICAgICAgICAgIC8qIHZwLT4gJy4nIGFmdGVyIDAwMDAwMCBvciBOVUxMICovCgoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsJCQkJLyogbm8gbmV4dCAnLycgKi8KCQlpZiAoKih2cHRyLTEpID09ICcuJykKCQkgICoodnB0ci0xKSA9ICddJzsKCQllbHNlIGlmIChyb290ZWQgPT0gMCkKCQkgICp2cHRyKysgPSAnXSc7CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlID09IDEpKTsKCQlzdGF0ZSA9IC0xOwoJCWJyZWFrOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQl3aGlsZSAoKihzKzEpID09ICcvJykJLyogc2tpcCBtdWx0aXBsZSAnLycgKi8KCQkgIHMrKzsKCSAgICAgIH0KCgkgICAgaWYgKChyb290ZWQgIT0gMCkKCSAgICAgICAgJiYgKCoodnB0ci0xKSAhPSAnLicpKQoJICAgICAgewoJCSp2cHRyKysgPSAnWyc7CgkJbnN0YXRlID0gTl9ET1Q7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgaWYgKChuc3RhdGUgPT0gTl9ET1QpCgkJICYmICh2cCAhPSAwKQoJCSAmJiAoKihzKzEpID09IDApKQoJCXsKCQkgIGlmICh0eXBlID09IDIpCgkJICAgIHsKCQkgICAgICAqdnAgPSAnXSc7CgkJICAgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgIH0KCQl9CgkgICAgc3RhdGUgPSA5OwoJICAgIGJyZWFrOwogICAgICAgICAgICB9CgkgIGNhc2UgNDoJCQkJLyogc2luZ2xlICcvJyBhdCBzdGFydCAoOS4uMTUpICovCgkgICAgaWYgKCpmcHRyID09IDApCgkgICAgICBzdGF0ZSA9IDU7CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA2OwoJICAgIGJyZWFrOwoKCSAgY2FzZSA1OgkJCQkvKiBqdXN0ICcvJyBhdCBzdGFydCAoOSkgKi8KCSAgICBpZiAodHlwZSAhPSAyKQoJICAgICAgewoJICAgICAgICAqdnB0cisrID0gJ1snOwoJCW5zdGF0ZSA9IE5fT1BFTjsKCSAgICAgIH0KCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDAiKTsKCSAgICB2cHRyICs9IDY7CgkgICAgaWYgKHR5cGUgPT0gMikKCSAgICAgIHN0YXRlID0gNzsKCSAgICBlbHNlCgkgICAgICBzdGF0ZSA9IDg7CgkgICAgYnJlYWs7CgoJICBjYXNlIDY6CQkvKiBjaGFycyBmb2xsb3dpbmcgJy8nIGF0IHN0YXJ0IDEwLi4xNSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnM7CgkgICAgKnZwdHIrKyA9ICdbJzsKCSAgICBuc3RhdGUgPSBOX09QRU47CgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIDEwICovCgkgICAgICB7CgkJaWYgKHR5cGUgIT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwXSIpOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlID09IDEpKTsKCQlpZiAodHlwZSA9PSAxKQoJCSAgewoJCSAgICAqdnB0cisrID0gJ10nOwoJCSAgfQoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIDExLi4xNSAqLwoJICAgICAgewoJCWlmICggKHR5cGUgPT0gMikKCQkgICAmJiAoKihzKzEpID09IDApKQkvKiAxMSgyKSAqLwoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDBdIik7CgkJICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgKCoodnB0ci0xKSAhPSAnXScpKTsKCQlzdGF0ZSA9IDk7CgkgICAgICB9CgkgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCgkgIGNhc2UgNzoJCQkJLyogYWRkICcuZGlyJyBhbmQgZXhpdCAqLwoJICAgIGlmICgobnN0YXRlID09IE5fT1BFTikKCQl8fCAobnN0YXRlID09IE5fRE9UKSkKCSAgICAgIHsKCQljaGFyICp2cCA9IHZwdHItMTsKCQl3aGlsZSAodnAgPiB2bXNuYW1lKQoJCSAgewoJCSAgICBpZiAoKnZwID09ICddJykKCQkgICAgICB7CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgaWYgKCp2cCA9PSAnLicpCgkJICAgICAgewoJCQkqdnAgPSAnXSc7CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgdnAtLTsKCQkgIH0KCSAgICAgIH0KCSAgICBzdHJjcHkgKHZwdHIsICIuZGlyIik7CgkgICAgdnB0ciArPSA0OwoJICAgIHN0YXRlID0gLTE7CgkgICAgYnJlYWs7CgoJICBjYXNlIDg6CQkJCS8qIGFkZCAnXScgYW5kIGV4aXQgKi8KCSAgICAqdnB0cisrID0gJ10nOwoJICAgIHN0YXRlID0gLTE7CgkgICAgYnJlYWs7CgoJICBjYXNlIDk6CQkJLyogMTcuLjIxLCBmcHRyIC0+IDFzdCAnLycgKyAxICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY29uc3QgY2hhciAqczsKCSAgICBpZiAoKmZwdHIgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSA9PSAyKQoJCSAgewoJCSAgICBzdGF0ZSA9IDc7CgkJICB9CgkJZWxzZQoJCSAgc3RhdGUgPSA4OwoJCWJyZWFrOwoJICAgICAgfQoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSAhPSAxKQoJCSAgewoJCSAgICBpZiAobnN0YXRlID09IE5fT1BFTikKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCW5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMDsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgIGlmIChuc3RhdGUgPT0gTl9PUEVOKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICcuJzsKCQkJbnN0YXRlID0gTl9ET1Q7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQl3aGlsZSAoKihzKzEpID09ICcvJykKCQkgIHMrKzsKCQlpZiAoICh0eXBlID09IDIpCgkJICAgICYmICgqKHMrMSkgPT0gMCkpCQkvKiAxOSgyKSwgMjEoMikqLwoJCSAgewoJCSAgICBpZiAobnN0YXRlICE9IE5fQ0xPU0VEKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSA9PSBOX09QRU4pCgkJICAgICAgewoJCQkqdnB0cisrID0gJy4nOwoJCQluc3RhdGUgPSBOX0RPVDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDE7CgkJICB9CgkgICAgICB9CgkgICAgaWYgKCAoKmZwdHIgPT0gJy4nKQkJCS8qIGNoZWNrIGZvciAnLi4nIG9yICcuLi8nICovCgkJJiYgKCooZnB0cisxKSA9PSAnLicpCgkJJiYgKCgqKGZwdHIrMikgPT0gJy8nKQoJCSAgICB8fCAoKihmcHRyKzIpID09IDApKSApCgkgICAgICB7CiAgICAgICAgICAgICAgICBjaGFyICp2cDsKCQlmcHRyICs9IDI7CgkJaWYgKCpmcHRyID09ICcvJykKCQkgIHsKCQkgICAgZG8KCQkgICAgICB7CgkJCWZwdHIrKzsKCQkgICAgICB9CgkJICAgIHdoaWxlICgqZnB0ciA9PSAnLycpOwoJCSAgfQoJCWVsc2UgaWYgKCpmcHRyID09IDApCgkJICB0eXBlID0gMTsKCQl2cHRyLS07CQkJCS8qIHZwdHIgLT4gJy4nIG9yICddJyAqLwoJCXZwID0gdnB0cjsKCQlmb3IgKDs7KQoJCSAgewoJCSAgICB2cC0tOwoJCSAgICBpZiAoKnZwID09ICcuJykJCS8qIG9uZSBiYWNrICovCgkJICAgICAgewoJCQl2cHRyID0gdnA7CgkJCW5zdGF0ZSA9IE5fT1BFTjsKCQkJYnJlYWs7CgkJICAgICAgfQoJCSAgICBpZiAoKnZwID09ICdbJykJCS8qIHRvcCBsZXZlbCByZWFjaGVkICovCgkJICAgICAgewoJCQlpZiAoKmZwdHIgPT0gMCkKCQkJICB7CgkJCSAgICBzdHJjcHkgKHZwLCAiWzAwMDAwMF0iKTsKCQkJICAgIHZwdHIgPSB2cCArIDg7CgkJCSAgICBuc3RhdGUgPSBOX0NMT1NFRDsKCQkJICAgIHMgPSAwOwoJCQkgICAgYnJlYWs7CgkJCSAgfQoJCQllbHNlCgkJCSAgewoJCQkgICAgdnB0ciA9IHZwKzE7CgkJCSAgICBuc3RhdGUgPSBOX09QRU47CgkJCSAgICBicmVhazsKCQkJICB9CgkJICAgICAgfQoJCSAgfQoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQljb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCBhc19kaXIpOwoJCWlmIChuc3RhdGUgPT0gTl9ET1QpCgkJICBuc3RhdGUgPSBOX09QRU47CgkgICAgICB9CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsJCQkJCS8qIDE4LDIwICovCgkJaWYgKHR5cGUgPT0gMSkKCQkgICp2cHRyKysgPSAnXSc7CgkJc3RhdGUgPSAtMTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJaWYgKCoocysxKSA9PSAwKQoJCSAgewoJCSAgICBpZiAodHlwZSA9PSAyKQkJLyogMTksMjEgKi8KCQkgICAgICB7CgkJICAgICAgICBzdGF0ZSA9IDc7CgkJICAgICAgfQoJCSAgICBlbHNlCgkJICAgICAgewoJCQkqdnB0cisrID0gJ10nOwoJCQlzdGF0ZSA9IC0xOwoJCSAgICAgIH0KCQkgIH0KCSAgICAgIH0KCSAgICBicmVhazsKICAgICAgICAgICAgfQoKCSAgY2FzZSAxMDoJCQkJLyogMSwyIGZpcnN0IGlzICcuJyAqLwoJICAgIGlmICgqZnB0ciA9PSAnLicpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTE7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSAxMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMTE6CQkJCS8qIDIsICcuLicgYXQgc3RhcnQgKi8KCSAgICBjb3VudCA9IDE7CgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykJCS8qIGdvdCAuLnh4eCAqLwoJCSAgewogICAgICAgICAgICAgICAgICAgIHN0cmNweSAodm1zbmFtZSwgbmFtZSk7CgkJICAgIHJldHVybiB2bXNuYW1lOwoJCSAgfQoJCWRvCQkJCS8qIGdvdCAuLi8gKi8KCQkgIHsKCQkgICAgZnB0cisrOwoJCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKSBmcHRyKys7CgkJICAgIGlmICgqZnB0ciAhPSAnLicpCgkJICAgICAgYnJlYWs7CgkJICAgIGlmICgqKGZwdHIrMSkgIT0gJy4nKQoJCSAgICAgIGJyZWFrOwoJCSAgICBmcHRyICs9IDI7CgkJICAgIGlmICgoKmZwdHIgPT0gMCkKCQkJfHwgKCpmcHRyID09ICcvJykpCgkJICAgICAgY291bnQrKzsKCQkgIH0KCQl3aGlsZSAoKmZwdHIgPT0gJy8nKTsKCSAgICAgIH0KCSAgICB7CQkJCQkvKiBnb3QgJy4uJyBvciAnLi4vJyAqLwogICAgICAgICAgICAgIGNoYXIgKnZwOwoJICAgICAgY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkgICAgICB2cCA9IGdldGN3ZChjd2RidWYsIE1BWFBBVEhMRU4pOwoJICAgICAgaWYgKHZwID09IDApCgkJewogICAgICAgICAgICAgICAgICB2bXNuYW1lWzBdID0gJ1wwJzsKCQkgIHJldHVybiB2bXNuYW1lOyAgICAvKiBGSVhNRSwgZXJyIGdldGN3ZCAqLwoJCX0KCSAgICAgIHN0cmNweSAodnB0ciwgdnApOwoJICAgICAgdnAgPSBzdHJjaHIgKHZwdHIsICddJyk7CgkgICAgICBpZiAodnAgIT0gMCkKCQl7CgkJICBuc3RhdGUgPSBOX09QRU47CgkJICB3aGlsZSAodnAgPiB2cHRyKQoJCSAgICB7CgkJICAgICAgdnAtLTsKCQkgICAgICBpZiAoKnZwID09ICdbJykKCQkJewoJCQkgIHZwKys7CgkJCSAgc3RyY3B5ICh2cCwgIjAwMDAwMF0iKTsKCQkJICBzdGF0ZSA9IC0xOwoJCQkgIGJyZWFrOwoJCQl9CgkJICAgICAgZWxzZSBpZiAoKnZwID09ICcuJykKCQkJewoJCQkgIGlmICgtLWNvdW50ID09IDApCgkJCSAgICB7CgkJCSAgICAgIGlmICgqZnB0ciA9PSAwKQkvKiBoYWQgJy4uJyBvciAnLi4vJyAqLwoJCQkJewoJCQkJICAqdnArKyA9ICddJzsKCQkJCSAgc3RhdGUgPSAtMTsKCQkJCX0KCQkJICAgICAgZWxzZQkJCS8qIGhhZCAnLi4veHh4JyAqLwoJCQkJewoJCQkJICBzdGF0ZSA9IDk7CgkJCQl9CgkJCSAgICAgICp2cCA9ICdcMCc7CgkJCSAgICAgIGJyZWFrOwoJCQkgICAgfQoJCQl9CgkJICAgIH0KCQl9CgkgICAgICB2cHRyICs9IHN0cmxlbiAodnB0cik7CgkgICAgfQoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMjoJCQkJLyogMSwgJy4nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykKCQkgIHsKICAgICAgICAgICAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwoJCSAgICByZXR1cm4gdm1zbmFtZTsKCQkgIH0KCQl3aGlsZSAoKmZwdHIgPT0gJy8nKQoJCSAgZnB0cisrOwoJICAgICAgfQoKCSAgICB7CiAgICAgICAgICAgICAgY2hhciAqdnA7CgkgICAgICBjaGFyIGN3ZGJ1ZltNQVhQQVRITEVOKzFdOwoKCSAgICAgIHZwID0gZ2V0Y3dkKGN3ZGJ1ZiwgTUFYUEFUSExFTik7CgkgICAgICBpZiAodnAgPT0gMCkKCQl7CiAgICAgICAgICAgICAgICAgIHZtc25hbWVbMF0gPSAnXDAnOwoJCSAgcmV0dXJuIHZtc25hbWU7ICAgIC8qRklYTUUsIGVyciBnZXRjd2QgKi8KCQl9CgkgICAgICBzdHJjcHkgKHZwdHIsIHZwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKmZwdHIgPT0gMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IC0xOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2hhciAqdnAgPSBzdHJjaHIgKHZwdHIsICddJyk7CiAgICAgICAgICAgICAgICBpZiAodnAgPT0gMCkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICp2cCA9ICdcMCc7CiAgICAgICAgICAgICAgICBuc3RhdGUgPSBOX09QRU47CiAgICAgICAgICAgICAgICB2cHRyICs9IHN0cmxlbiAodnB0cik7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IDk7CiAgICAgICAgICAgICAgfQoJICAgIGJyZWFrOwoJfQoKCX0KICAgICAgd2hpbGUgKHN0YXRlID4gMCk7CgoKICAgIH0KCgogIC8qIGRpcmVjdG9yeSBjb252ZXJzaW9uIGRvbmUKICAgICBmcHRyIC0+IGZpbGVuYW1lIHBhcnQgb2YgaW5wdXQgc3RyaW5nCiAgICAgdnB0ciAtPiBmcmVlIHNwYWNlIGluIHZtc25hbWUKICAqLwoKICAqdnB0cisrID0gMDsKCiAgcmV0dXJuIHZtc25hbWU7Cn0KCgoKLyoKICBjb252ZXJ0IGZyb20gdm1zLXN0eWxlIHRvIHVuaXgtc3R5bGUKCiAgZGV2OltkaXIxLmRpcjJdCS8vZGV2L2RpcjEvZGlyMi8KKi8KCmNvbnN0IGNoYXIgKgp1bml4aWZ5IChjb25zdCBjaGFyICpuYW1lKQp7CiAgc3RhdGljIGNoYXIgcGllY2VbNTEyXTsKICBjb25zdCBjaGFyICpzOwogIGNoYXIgKnA7CgogIGlmIChzdHJjaHIgKG5hbWUsICcvJykgIT0gMCkJCS8qIGFscmVhZHkgaW4gdW5peCBzdHlsZSAqLwogICAgewogICAgICBzdHJjcHkgKHBpZWNlLCBuYW1lKTsKICAgICAgcmV0dXJuIHBpZWNlOwogICAgfQoKICBwID0gcGllY2U7CiAgKnAgPSAwOwoKICAvKiBkZXZpY2UgcGFydCAqLwoKICBzID0gc3RyY2hyIChuYW1lLCAnOicpOwoKICBpZiAocyAhPSAwKQogICAgewogICAgICBpbnQgbCA9IHMgLSBuYW1lOwogICAgICAqcCsrID0gJy8nOwogICAgICAqcCsrID0gJy8nOwogICAgICBzdHJuY3B5IChwLCBuYW1lLCBsKTsKICAgICAgcCArPSBsOwogICAgfQoKICAvKiBkaXJlY3RvcnkgcGFydCAqLwoKICAqcCsrID0gJy8nOwogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMrKzsKICAgICAgc3dpdGNoICgqcykKICAgICAgICB7CgkgIGNhc2UgJ10nOgkJLyogW10gKi8KCSAgICBzdHJjYXQgKHAsICIuLyIpOwoJICAgIGJyZWFrOwoJICBjYXNlICctJzoJCS8qIFstICovCgkgICAgc3RyY2F0IChwLCAiLi4vIik7CgkgICAgYnJlYWs7CgkgIGNhc2UgJy4nOgoJICAgIHN0cmNhdCAocCwgIi4vIik7CS8qIFsuICovCgkgICAgYnJlYWs7CgkgIGRlZmF1bHQ6CgkgICAgcy0tOwoJICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcysrOwogICAgICB3aGlsZSAoKnMpCiAgICAgICAgewoJICBpZiAoKnMgPT0gJy4nKQoJICAgICpwKysgPSAnLyc7CgkgIGVsc2UKCSAgICAqcCsrID0gKnM7CgkgIHMrKzsKCSAgaWYgKCpzID09ICddJykKCSAgICB7CgkgICAgICBzKys7CgkgICAgICBicmVhazsKCSAgICB9CiAgICAgICAgfQogICAgICBpZiAoKnMgIT0gMCkJCS8qIG1vcmUgYWZ0ZXIgJ10nID8/ICovCiAgICAgICAgewoJICBpZiAoKihwLTEpICE9ICcvJykKCSAgICAqcCsrID0gJy8nOwoJICBzdHJjcHkgKHAsIHMpOwkJLyogY29weSBpdCBhbnl3YXkgKi8KICAgICAgICB9CiAgICB9CgogIGVsc2UJCS8qIG5vICdbJyBhbnl3aGVyZSAqLwoKICAgIHsKICAgICAgKnArKyA9IDA7CiAgICB9CgogIC8qIGZvcmNlIGVuZCB3aXRoICcvJyAqLwoKICBpZiAoKihwLTEpICE9ICcvJykKICAgICpwKysgPSAnLyc7CiAgKnAgPSAwOwoKICByZXR1cm4gcGllY2U7Cn0KCi8qIEVPRiAqLwo=