LyoKICB2bXNpZnkuYwoKICBNb2R1bGUgZm9yIHZtcyA8LT4gdW5peCBmaWxlIG5hbWUgY29udmVyc2lvbgoKICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKICBvZiBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueQoKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2lmIFZNUwojaW5jbHVkZSA8dW5peGxpYi5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxqcGlkZWYuaD4KI2luY2x1ZGUgPGRlc2NyaXAuaD4KI2luY2x1ZGUgPHVhaWRlZi5oPgojaW5jbHVkZSA8c3NkZWYuaD4KI2luY2x1ZGUgPHN0YXJsZXQuaD4KI2luY2x1ZGUgPGxpYiRyb3V0aW5lcy5oPgovKiBJbml0aWFsaXplIGEgc3RyaW5nIGRlc2NyaXB0b3IgKHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9zKSBmb3IgYW4KICAgYXJiaXRyYXJ5IHN0cmluZy4gICBBRERSIGlzIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgIG9mIHRoZSBzdHJpbmcsIGFuZCBMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAqLwoKI2RlZmluZSBJTklUX0RTQ19TKGRzYywgYWRkciwgbGVuKSBkbyB7IFwKICAoZHNjKS5kc2MkYl9kdHlwZSA9IERTQyRLX0RUWVBFX1Q7ICAgIFwKICAoZHNjKS5kc2MkYl9jbGFzcyA9IERTQyRLX0NMQVNTX1M7ICAgIFwKICAoZHNjKS5kc2Mkd19sZW5ndGggPSAobGVuKTsgICAgICAgICAgIFwKICAoZHNjKS5kc2MkYV9wb2ludGVyID0gKGFkZHIpOyAgICAgICAgIFwKfSB3aGlsZSAoMCkKCi8qIEluaXRpYWxpemUgYSBzdHJpbmcgZGVzY3JpcHRvciAoc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MpIGZvciBhCiAgIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4gIFMgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmc7IHRoZSBsZW5ndGgKICAgaXMgZGV0ZXJtaW5lZCBieSBjYWxsaW5nIHN0cmxlbigpLiAqLwoKI2RlZmluZSBJTklUX0RTQ19DU1RSSU5HKGRzYywgcykgSU5JVF9EU0NfUyhkc2MsIHMsIHN0cmxlbihzKSkKI2VuZGlmCgovKgogIGNvcHkgJ2Zyb20nIHRvICd0bycgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgJ3VwdG8nCiAgcmV0dXJuIDAgaWYgZW9zIG9uIGZyb20KICByZXR1cm4gMSBpZiB1cHRvIGZvdW5kCgogIHJldHVybiAndG8nIGF0IGxhc3QgY2hhciArIDEKICByZXR1cm4gJ2Zyb20nIGF0IG1hdGNoICsgMSBvciBlb3MgaWYgbm8gbWF0Y2gKCiAgaWYgYXNfZGlyID09IDEsIGNoYW5nZSBhbGwgJy4nIHRvICdfJwogIGVsc2UgY2hhbmdlIGFsbCAnLicgYnV0IHRoZSBsYXN0IHRvICdfJwoqLwoKc3RhdGljIGludApjb3B5dG8gKGNoYXIgKip0bywgY2hhciAqKmZyb20sIGNoYXIgdXB0bywgaW50IGFzX2RpcikKewogIGNoYXIgKnM7CgogIHMgPSBzdHJyY2hyICgqZnJvbSwgJy4nKTsKCiAgd2hpbGUgKCoqZnJvbSkKICAgIHsKICAgICAgaWYgKCoqZnJvbSA9PSB1cHRvKQoJewoJICBkbwoJICAgIHsKCSAgICAgICgqZnJvbSkrKzsKCSAgICB9CgkgIHdoaWxlICgqKmZyb20gPT0gdXB0byk7CgkgIHJldHVybiAxOwoJfQogICAgICBpZiAoKipmcm9tID09ICcuJykKCXsKCSAgaWYgKChhc19kaXIgPT0gMSkKCSAgICAgIHx8ICgqZnJvbSAhPSBzKSkKCSAgICAqKnRvID0gJ18nOwoJICBlbHNlCgkgICAgKip0byA9ICcuJzsKCX0KICAgICAgZWxzZQoJewoJICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpKipmcm9tKSkKCSAgICAqKnRvID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpKipmcm9tKTsKCSAgZWxzZQoJICAgICoqdG8gPSAqKmZyb207Cgl9CiAgICAgICgqdG8pKys7CiAgICAgICgqZnJvbSkrKzsKICAgIH0KCiAgcmV0dXJuIDA7Cn0KCgovKgogIGdldCB0cmFuc2xhdGlvbiBvZiBsb2dpY2FsIG5hbWUKCiovCgpzdGF0aWMgY2hhciAqCnRybmxvZyAoY2hhciAqbmFtZSkKewogIGludCBzdGF0OwogIHN0YXRpYyBjaGFyIHJlc2x0WzEwMjRdOwogICRERVNDUklQVE9SIChyZXNsdF9kc2MsIHJlc2x0KTsKICBzaG9ydCByZXNsdGxlbjsKICBzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcyBuYW1lX2RzYzsKICBjaGFyICpzOwoKICBJTklUX0RTQ19DU1RSSU5HIChuYW1lX2RzYywgbmFtZSk7CgogIHN0YXQgPSBsaWIkc3lzX3RybmxvZyAoJm5hbWVfZHNjLCAmcmVzbHRsZW4sICZyZXNsdF9kc2MpOwoKICBpZiAoKHN0YXQmMSkgPT0gMCkKICAgIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIGlmIChzdGF0ID09IFNTJF9OT1RSQU4pCiAgICB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICByZXNsdFtyZXNsdGxlbl0gPSAnXDAnOwoKICBzID0gKGNoYXIgKiltYWxsb2MgKHJlc2x0bGVuKzEpOwogIGlmIChzID09IDApCiAgICByZXR1cm4gIiI7CiAgc3RyY3B5IChzLCByZXNsdCk7CiAgcmV0dXJuIHM7Cn0KCnN0YXRpYyBjaGFyICoKc2hvd2FsbCAoY2hhciAqcykKewogIHN0YXRpYyBjaGFyIHRbNTEyXTsKICBjaGFyICpwdDsKCiAgcHQgPSB0OwogIGlmIChzdHJjaHIgKHMsICdcXCcpID09IDApCiAgICByZXR1cm4gczsKICB3aGlsZSAoKnMpCiAgICB7CiAgICAgIGlmICgqcyA9PSAnXFwnKQoJewoJICAqcHQrKyA9ICpzOwoJfQogICAgICAqcHQrKyA9ICpzKys7CiAgICB9CiAgcmV0dXJuIHB0Owp9CgoKZW51bSBuYW1lc3RhdGUgeyBOX1NUQVJULCBOX0RFVklDRSwgTl9PUEVOLCBOX0RPVCwgTl9DTE9TRUQsIE5fRE9ORSB9OwoKLyoKICBjb252ZXJ0IHVuaXggc3R5bGUgbmFtZSB0byB2bXMgc3R5bGUKICB0eXBlID0gMCAtPiBuYW1lIGlzIGEgZnVsbCBuYW1lIChkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIHBhcnQpCiAgdHlwZSA9IDEgLT4gbmFtZSBpcyBhIGRpcmVjdG9yeQogIHR5cGUgPSAyIC0+IG5hbWUgaXMgYSBmaWxlbmFtZSB3aXRob3V0IGRpcmVjdG9yeQoKICBUaGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIGFyZSBhcHBsaWVkCgkJCSgwKQkJKDEpCQkJKDIpCglpbnB1dAkJZnVsbCBuYW1lCWRpciBuYW1lCQlmaWxlIG5hbWUKCjEJLi8JCTxjd2Q+CQlbXQkJCTxjdXJyZW50IGRpcmVjdG9yeT4uZGlyCjIJLi4vCQk8aG9tZSBvZiBjd2Q+CTxob21lIG9mIGN3ZD4JCTxob21lIG9mIGN3ZD4uZGlyCgozCS8vCQk8ZGV2IG9mIGN3ZD46CTxkZXYgb2YgY3dkPjpbMDAwMDAwXQk8ZGV2IG9mIGN3ZD46MDAwMDAwLmRpcgo0CS8vYQkJYToJCWE6CQkJYToKNQkvL2EvCQlhOgkJYToJCQlhOjAwMDAwMC5kaXIKCjkJLwkJWzAwMDAwMF0JWzAwMDAwMF0JCTAwMDAwMC5kaXIKMTAJL2EJCVswMDAwMDBdYQlbYV0JCQlbMDAwMDAwXWEKMTEJL2EvCQlbYV0JCVthXQkJCVswMDAwMDBdYS5kaXIKMTIJL2EvYgkJW2FdYgkJW2EuYl0JCQlbYV1iCjEzCS9hL2IvCQlbYS5iXQkJW2EuYl0JCQlbYV1iLmRpcgoxNAkvYS9iL2MJCVthLmJdYwkJW2EuYi5jXQkJCVthLmJdYwoxNQkvYS9iL2MvCQlbYS5iLmNdCQlbYS5iLmNdCQkJW2EuYl1jLmRpcgoKMTYJYQkJYQkJWy5hXQkJCWEKMTcJYS8JCVsuYV0JCVsuYV0JCQlhLmRpcgoxOAlhL2IJCVsuYV1iCQlbLmEuYl0JCQlbLmFdYgoxOQlhL2IvCQlbLmEuYl0JCVsuYS5iXQkJCVsuYV1iLmRpcgoyMAlhL2IvYwkJWy5hLmJdYwkJWy5hLmIuY10JCVsuYS5iXWMKMjEJYS9iL2MvCQlbLmEuYi5jXQlbLmEuYi5jXQkJWy5hLmJdYy5kaXIKCjIyCWEuYi5jCQlhX2IuYwkJWy5hX2JfY10JCWFfYl9jLmRpcgoKMjMJW3hdW3ldegkJW3gueV16CQlbeC55XXoJCQlbeC55XXoKMjQJW3hdWy55XXoJW3gueV16CQlbeC55XXoJCQlbeC55XXoKCjI1ICBmaWxlbmFtZXMgd2l0aCAnJCcgIGFyZSBsZWZ0IHVuY2hhbmdlZCBpZiB0aGV5IGNvbnRhaW4gbm8gJy8nCjI1ICBmaWxlbmFtZXMgd2l0aCAnOicgYXJlIGxlZnQgdW5jaGFuZ2VkCjI2ICBmaWxlbmFtZXMgd2l0aCBhIHNpbmdsZSBwYWlyIG9mICdbJyAnXScgYXJlIGxlZnQgdW5jaGFuZ2VkCgogIHRoZSBpbnB1dCBzdHJpbmcgaXMgbm90IHdyaXR0ZW4gdG8KKi8KCmNoYXIgKgp2bXNpZnkgKG5hbWUsIHR5cGUpCiAgICBjaGFyICpuYW1lOwogICAgaW50IHR5cGU7CnsKLyogbWF4IDI1NSBkZXZpY2UKICAgbWF4IDM5IGRpcmVjdG9yeQogICBtYXggMzkgZmlsZW5hbWUKICAgbWF4IDM5IGZpbGV0eXBlCiAgIG1heCA1IHZlcnNpb24KKi8KI2RlZmluZSBNQVhQQVRITEVOIDUxMgoKICBlbnVtIG5hbWVzdGF0ZSBuc3RhdGU7CiAgc3RhdGljIGNoYXIgdm1zbmFtZVtNQVhQQVRITEVOKzFdOwogIGNoYXIgKmZwdHI7CiAgY2hhciAqdnB0cjsKICBjaGFyICpzLCpzMTsKICBpbnQgYXNfZGlyOwogIGludCBjb3VudDsKCiAgaWYgKG5hbWUgPT0gMCkKICAgIHJldHVybiAwOwogIGZwdHIgPSBuYW1lOwogIHZwdHIgPSB2bXNuYW1lOwogIG5zdGF0ZSA9IE5fU1RBUlQ7CgogIC8qIGNhc2UgMjVhICovCgogIHMgPSBzdHJwYnJrIChuYW1lLCAiJDoiKTsKICBpZiAocyAhPSAwKQogICAgewogICAgICBjaGFyICpzMTsKICAgICAgY2hhciAqczI7CgogICAgICBpZiAodHlwZSA9PSAxKQoJewoJICBzMSA9IHN0cmNociAocysxLCAnWycpOwoJICBzMiA9IHN0cmNociAocysxLCAnXScpOwoJfQoKICAgICAgaWYgKCpzID09ICckJykKCXsKCSAgaWYgKHN0cmNociAobmFtZSwgJy8nKSA9PSAwKQoJICAgIHsKCSAgICAgIGlmICgodHlwZSA9PSAxKSAmJiAoczEgIT0gMCkgJiYgKHMyID09IDApKQoJCXsKCQkgIHN0cmNweSAodm1zbmFtZSwgbmFtZSk7CgkJICBzdHJjYXQgKHZtc25hbWUsICJdIik7CgkJICByZXR1cm4gdm1zbmFtZTsKCQl9CgkgICAgICBlbHNlCgkJcmV0dXJuIG5hbWU7CgkgICAgfQoJfQogICAgICBlbHNlCgl7CgkgIGlmICgodHlwZSA9PSAxKSAmJiAoczEgIT0gMCkgJiYgKHMyID09IDApKQoJICAgIHsKCSAgICAgIHN0cmNweSAodm1zbmFtZSwgbmFtZSk7CgkgICAgICBzdHJjYXQgKHZtc25hbWUsICJdIik7CgkgICAgICByZXR1cm4gdm1zbmFtZTsKCSAgICB9CgkgIGVsc2UKCSAgICByZXR1cm4gbmFtZTsKCX0KICAgIH0KCiAgLyogY2FzZSAyNiAqLwoKICBzID0gc3RyY2hyIChuYW1lLCAnWycpOwoKICBpZiAocyAhPSAwKQogICAgewogICAgICBzMSA9IHN0cmNociAocysxLCAnWycpOwogICAgICBpZiAoczEgPT0gMCkKCXsKCSAgaWYgKCh0eXBlID09IDEpCgkgICAgICAgJiYgKHN0cmNociAocysxLCAnXScpID09IDApKQoJICAgIHsKCSAgICAgIHN0cmNweSAodm1zbmFtZSwgbmFtZSk7CgkgICAgICBzdHJjYXQgKHZtc25hbWUsICJdIik7CgkgICAgICByZXR1cm4gdm1zbmFtZTsKCSAgICB9CgkgIGVsc2UKCSAgICByZXR1cm4gbmFtZTsJCQkvKiBzaW5nbGUgWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KICAgICAgczEtLTsKICAgICAgaWYgKCpzMSAhPSAnXScpCgl7CgkgIHJldHVybiBuYW1lOwkJCS8qIG5vdCBdWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KCiAgICAgIC8qIHdlIGhhdmUgXVsgKi8KCiAgICAgIHMgPSBuYW1lOwoKICAgICAgLyogcyAgLT4gc3RhcnRpbmcgY2hhcgoJIHMxIC0+IGVuZGluZyAnXScgICovCgogICAgICBkbwoJewoJICBzdHJuY3B5ICh2cHRyLCBzLCBzMS1zKTsJLyogY29weSB1cCB0byBidXQgbm90IGluY2x1ZGluZyAnXScgKi8KCSAgdnB0ciArPSBzMS1zOwoJICBpZiAoKnMxID09IDApCgkgICAgYnJlYWs7CgkgIHMgPSBzMSArIDE7CQkJLyogcyAtPiBjaGFyIGJlaGluZCAnXScgKi8KCSAgaWYgKCpzICE9ICdbJykJCS8qIHdhcyAnXVsnID8gKi8KCSAgICBicmVhazsJCQkvKiBubywgbGFzdCBdIGZvdW5kLCBleGl0ICovCgkgIHMrKzsKCSAgaWYgKCpzICE9ICcuJykKCSAgICAqdnB0cisrID0gJy4nOwoJICBzMSA9IHN0cmNociAocywgJ10nKTsKCSAgaWYgKHMxID09IDApCQkJLyogbm8gY2xvc2luZyBdICovCgkgICAgczEgPSBzICsgc3RybGVuIChzKTsKCX0KICAgICAgd2hpbGUgKDEpOwoKICAgICAgKnZwdHIrKyA9ICddJzsKCiAgICAgIGZwdHIgPSBzOwoKICAgIH0KCiAgZWxzZQkJLyogbm8gWyBpbiBuYW1lICovCgogICAgewoKICAgICAgaW50IHN0YXRlOwogICAgICBpbnQgcm9vdGVkID0gMTsJLyogZmxhZyBpZiBsb2dpY2FsIGlzIHJvb3RlZCwgZWxzZSBpbnNlcnQgWzAwMDAwMF0gKi8KCiAgICAgIHN0YXRlID0gMDsKCiAgICAgIGRvCgl7CgogICAgICBzd2l0Y2ggKHN0YXRlKQoJewoJICBjYXNlIDA6CQkJCS8qIHN0YXJ0IG9mIGxvb3AgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy8nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDE7CgkgICAgICB9CgkgICAgZWxzZSBpZiAoKmZwdHIgPT0gJy4nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDEwOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMToJCQkJLyogJy8nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyID09ICcvJykKCSAgICAgIHsKCQlmcHRyKys7CgkJc3RhdGUgPSAzOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gNDsKCSAgICBicmVhazsKCgkgIGNhc2UgMjoJCQkJLyogbm8gJy8nIGF0IHN0YXJ0ICovCgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIG5vICcvJyAoMTYpICovCgkgICAgICB7CgkJaWYgKHR5cGUgPT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZT09MSkpOwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIGZvdW5kICcvJyAoMTcuLjIxKSAqLwoJICAgICAgewoJCWlmICgodHlwZSA9PSAyKQoJCSAgICAmJiAoKihzKzEpID09IDApKQkvKiAxNygyKSAqLwoJCSAgewoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgc3RhdGUgPSA3OwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgbnN0YXRlID0gTl9PUEVOOwoJCSAgICBzdGF0ZSA9IDk7CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlIDM6CQkJCS8qICcvLycgYXQgc3RhcnQgKi8KCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKQkvKiBjb2xsYXBzZSBhbGwgJy8nICovCgkgICAgICBmcHRyKys7CgkgICAgaWYgKCpmcHRyID09IDApCQkvKiBqdXN0IC8vICovCgkgICAgICB7CgkJY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkJczEgPSBnZXRjd2QoY3dkYnVmLCBNQVhQQVRITEVOKTsKCQlpZiAoczEgPT0gMCkKCQkgIHsKCQkgICAgcmV0dXJuICIiOwkJLyogRklYTUUsIGVyciBnZXRjd2QgKi8KCQkgIH0KCQlzID0gc3RyY2hyIChzMSwgJzonKTsKCQlpZiAocyA9PSAwKQoJCSAgewoJCSAgICByZXR1cm4gIiI7CQkvKiBGSVhNRSwgZXJyIG5vIGRldmljZSAqLwoJCSAgfQoJCXN0cm5jcHkgKHZwdHIsIHMxLCBzLXMxKzEpOwoJCXZwdHIgKz0gcy1zMSsxOwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgoJICAgIHMgPSB2cHRyOwoKCSAgICBpZiAoY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgMSkgPT0gMCkJLyogY29weSBkZXZpY2UgcGFydCAqLwoJICAgICAgewoJCSp2cHRyKysgPSAnOic7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICAqdnB0ciA9ICc6JzsKCSAgICBuc3RhdGUgPSBOX0RFVklDRTsKCSAgICBpZiAoKmZwdHIgPT0gMCkJLyoganVzdCAnLy9hLycgKi8KCSAgICAgIHsKCQlzdHJjcHkgKHZwdHIrMSwgIlswMDAwMDBdIik7CgkJdnB0ciArPSA5OwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgKnZwdHIgPSAwOwoJCQkJLyogY2hlY2sgbG9naWNhbCBmb3IgWzAwMDAwMF0gaW5zZXJ0aW9uICovCgkgICAgczEgPSB0cm5sb2cgKHMpOwoJICAgIGlmICgqczEgIT0gMCkKCSAgICAgIHsJCQkvKiBmb3VuZCB0cmFuc2xhdGlvbiAqLwoJCWNoYXIgKnMyOwoJCWZvciAoOzspCS8qIGxvb3Agb3ZlciBhbGwgbmVzdGVkIGxvZ2ljYWxzICovCgkJICB7CgkJICAgIHMyID0gczEgKyBzdHJsZW4gKHMxKSAtIDE7CgkJICAgIGlmICgqczIgPT0gJzonKQkvKiB0cmFuc2xhdGlvbiBlbmRzIGluICc6JyAqLwoJCSAgICAgIHsKCQkJczIgPSB0cm5sb2cgKHMxKTsKCQkJZnJlZSAoczEpOwoJCQlpZiAoKnMyID09IDApCgkJCSAgewoJCQkgICAgcm9vdGVkID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJczEgPSBzMjsKCQkJY29udGludWU7CS8qIG5leHQgaXRlcmF0aW9uICovCgkJICAgICAgfQoJCSAgICBpZiAoKnMyID09ICddJykJLyogdHJhbnNsYXRpb24gZW5kcyBpbiAnXScgKi8KCQkgICAgICB7CgkJCWlmICgqKHMyLTEpID09ICcuJykJLyogZW5kcyBpbiAnLl0nICovCgkJCSAgewoJCQkgICAgaWYgKHN0cm5jbXAgKGZwdHIsICIwMDAwMDAiLCA2KSAhPSAwKQoJCQkgICAgICByb290ZWQgPSAwOwoJCQkgIH0KCQkJZWxzZQoJCQkgIHsKCQkJICAgIHN0cmNweSAodm1zbmFtZSwgczEpOwoJCQkgICAgcyA9IHN0cmNociAodm1zbmFtZSwgJ10nKTsKCQkJICAgICpzID0gJy4nOwoJCQkgICAgbnN0YXRlID0gTl9ET1Q7CgkJCSAgICB2cHRyID0gczsKCQkJICB9CgkJICAgICAgfQoJCSAgICBicmVhazsKCQkgIH0KCQlmcmVlIChzMSk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcm9vdGVkID0gMDsKCgkgICAgaWYgKCp2cHRyID09IDApCgkgICAgICB7CgkJbnN0YXRlID0gTl9ERVZJQ0U7CgkgICAgICAgICp2cHRyKysgPSAnOic7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgdnB0cisrOwoKCSAgICBpZiAocm9vdGVkID09IDApCgkgICAgICB7CgkgICAgICAgIHN0cmNweSAodnB0ciwgIlswMDAwMDAuIik7CgkJdnB0ciArPSA4OwoJCXMxID0gdnB0ci0xOwoJCW5zdGF0ZSA9IE5fRE9UOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHMxID0gMDsKCgkvKiBzMS0+ICcuJyBhZnRlciAwMDAwMDAgb3IgTlVMTCAqLwoKCSAgICBzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCgkgICAgICB7CQkJCS8qIG5vIG5leHQgJy8nICovCgkJaWYgKCoodnB0ci0xKSA9PSAnLicpCgkJICAqKHZwdHItMSkgPSAnXSc7CgkJZWxzZSBpZiAocm9vdGVkID09IDApCgkJICAqdnB0cisrID0gJ10nOwoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZSA9PSAxKSk7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJd2hpbGUgKCoocysxKSA9PSAnLycpCS8qIHNraXAgbXVsdGlwbGUgJy8nICovCgkJICBzKys7CgkgICAgICB9CgoJICAgIGlmICgocm9vdGVkICE9IDApCgkgICAgICAgICYmICgqKHZwdHItMSkgIT0gJy4nKSkKCSAgICAgIHsKCQkqdnB0cisrID0gJ1snOwoJCW5zdGF0ZSA9IE5fRE9UOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIGlmICgobnN0YXRlID09IE5fRE9UKQoJCSAmJiAoczEgIT0gMCkKCQkgJiYgKCoocysxKSA9PSAwKSkKCQl7CgkJICBpZiAodHlwZSA9PSAyKQoJCSAgICB7CgkJICAgICAgKnMxID0gJ10nOwoJCSAgICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICB9CgkJfQoJICAgIHN0YXRlID0gOTsKCSAgICBicmVhazsKCgkgIGNhc2UgNDoJCQkJLyogc2luZ2xlICcvJyBhdCBzdGFydCAoOS4uMTUpICovCgkgICAgaWYgKCpmcHRyID09IDApCgkgICAgICBzdGF0ZSA9IDU7CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA2OwoJICAgIGJyZWFrOwoKCSAgY2FzZSA1OgkJCQkvKiBqdXN0ICcvJyBhdCBzdGFydCAoOSkgKi8KCSAgICBpZiAodHlwZSAhPSAyKQoJICAgICAgewoJICAgICAgICAqdnB0cisrID0gJ1snOwoJCW5zdGF0ZSA9IE5fT1BFTjsKCSAgICAgIH0KCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDAiKTsKCSAgICB2cHRyICs9IDY7CgkgICAgaWYgKHR5cGUgPT0gMikKCSAgICAgIHN0YXRlID0gNzsKCSAgICBlbHNlCgkgICAgICBzdGF0ZSA9IDg7CgkgICAgYnJlYWs7CgoJICBjYXNlIDY6CQkJCS8qIGNoYXJzIGZvbGxvd2luZyAnLycgYXQgc3RhcnQgMTAuLjE1ICovCgkgICAgKnZwdHIrKyA9ICdbJzsKCSAgICBuc3RhdGUgPSBOX09QRU47CgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIDEwICovCgkgICAgICB7CgkJaWYgKHR5cGUgIT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwXSIpOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlID09IDEpKTsKCQlpZiAodHlwZSA9PSAxKQoJCSAgewoJCSAgICAqdnB0cisrID0gJ10nOwoJCSAgfQoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIDExLi4xNSAqLwoJICAgICAgewoJCWlmICggKHR5cGUgPT0gMikKCQkgICAmJiAoKihzKzEpID09IDApKQkvKiAxMSgyKSAqLwoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDBdIik7CgkJICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgKCoodnB0ci0xKSAhPSAnXScpKTsKCQlzdGF0ZSA9IDk7CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlIDc6CQkJCS8qIGFkZCAnLmRpcicgYW5kIGV4aXQgKi8KCSAgICBpZiAoKG5zdGF0ZSA9PSBOX09QRU4pCgkJfHwgKG5zdGF0ZSA9PSBOX0RPVCkpCgkgICAgICB7CgkJcyA9IHZwdHItMTsKCQl3aGlsZSAocyA+IHZtc25hbWUpCgkJICB7CgkJICAgIGlmICgqcyA9PSAnXScpCgkJICAgICAgewoJCQlicmVhazsKCQkgICAgICB9CgkJICAgIGlmICgqcyA9PSAnLicpCgkJICAgICAgewoJCQkqcyA9ICddJzsKCQkJYnJlYWs7CgkJICAgICAgfQoJCSAgICBzLS07CgkJICB9CgkgICAgICB9CgkgICAgc3RyY3B5ICh2cHRyLCAiLmRpciIpOwoJICAgIHZwdHIgKz0gNDsKCSAgICBzdGF0ZSA9IC0xOwoJICAgIGJyZWFrOwoKCSAgY2FzZSA4OgkJCQkvKiBhZGQgJ10nIGFuZCBleGl0ICovCgkgICAgKnZwdHIrKyA9ICddJzsKCSAgICBzdGF0ZSA9IC0xOwoJICAgIGJyZWFrOwoKCSAgY2FzZSA5OgkJCQkvKiAxNy4uMjEsIGZwdHIgLT4gMXN0ICcvJyArIDEgKi8KCSAgICBpZiAoKmZwdHIgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSA9PSAyKQoJCSAgewoJCSAgICBzdGF0ZSA9IDc7CgkJICB9CgkJZWxzZQoJCSAgc3RhdGUgPSA4OwoJCWJyZWFrOwoJICAgICAgfQoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSAhPSAxKQoJCSAgewoJCSAgICBpZiAobnN0YXRlID09IE5fT1BFTikKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCW5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMDsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgIGlmIChuc3RhdGUgPT0gTl9PUEVOKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICcuJzsKCQkJbnN0YXRlID0gTl9ET1Q7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQl3aGlsZSAoKihzKzEpID09ICcvJykKCQkgIHMrKzsKCQlpZiAoICh0eXBlID09IDIpCgkJICAgICYmICgqKHMrMSkgPT0gMCkpCQkvKiAxOSgyKSwgMjEoMikqLwoJCSAgewoJCSAgICBpZiAobnN0YXRlICE9IE5fQ0xPU0VEKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSA9PSBOX09QRU4pCgkJICAgICAgewoJCQkqdnB0cisrID0gJy4nOwoJCQluc3RhdGUgPSBOX0RPVDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDE7CgkJICB9CgkgICAgICB9CgkgICAgaWYgKCAoKmZwdHIgPT0gJy4nKQkJCS8qIGNoZWNrIGZvciAnLi4nIG9yICcuLi8nICovCgkJJiYgKCooZnB0cisxKSA9PSAnLicpCgkJJiYgKCgqKGZwdHIrMikgPT0gJy8nKQoJCSAgICB8fCAoKihmcHRyKzIpID09IDApKSApCgkgICAgICB7CgkJZnB0ciArPSAyOwoJCWlmICgqZnB0ciA9PSAnLycpCgkJICB7CgkJICAgIGRvCgkJICAgICAgewoJCQlmcHRyKys7CgkJICAgICAgfQoJCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKTsKCQkgIH0KCQllbHNlIGlmICgqZnB0ciA9PSAwKQoJCSAgdHlwZSA9IDE7CgkJdnB0ci0tOwkJCQkvKiB2cHRyIC0+ICcuJyBvciAnXScgKi8KCQlzMSA9IHZwdHI7CgkJZm9yICg7OykKCQkgIHsKCQkgICAgczEtLTsKCQkgICAgaWYgKCpzMSA9PSAnLicpCQkvKiBvbmUgYmFjayAqLwoJCSAgICAgIHsKCQkJdnB0ciA9IHMxOwoJCQluc3RhdGUgPSBOX09QRU47CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgaWYgKCpzMSA9PSAnWycpCQkvKiB0b3AgbGV2ZWwgcmVhY2hlZCAqLwoJCSAgICAgIHsKCQkJaWYgKCpmcHRyID09IDApCgkJCSAgewoJCQkgICAgc3RyY3B5IChzMSwgIlswMDAwMDBdIik7CgkJCSAgICB2cHRyID0gczEgKyA4OwoJCQkgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJCSAgICBzID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJZWxzZQoJCQkgIHsKCQkJICAgIHZwdHIgPSBzMSsxOwoJCQkgICAgbnN0YXRlID0gTl9PUEVOOwoJCQkgICAgYnJlYWs7CgkJCSAgfQoJCSAgICAgIH0KCQkgIH0KCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgYXNfZGlyKTsKCQlpZiAobnN0YXRlID09IE5fRE9UKQoJCSAgbnN0YXRlID0gTl9PUEVOOwoJICAgICAgfQoJICAgIGlmIChzID09IDApCgkgICAgICB7CQkJCQkvKiAxOCwyMCAqLwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCWlmICgqKHMrMSkgPT0gMCkKCQkgIHsKCQkgICAgaWYgKHR5cGUgPT0gMikJCS8qIDE5LDIxICovCgkJICAgICAgewoJCSAgICAgICAgc3RhdGUgPSA3OwoJCSAgICAgIH0KCQkgICAgZWxzZQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJc3RhdGUgPSAtMTsKCQkgICAgICB9CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlIDEwOgkJCQkvKiAxLDIgZmlyc3QgaXMgJy4nICovCgkgICAgaWYgKCpmcHRyID09ICcuJykKCSAgICAgIHsKCQlmcHRyKys7CgkJc3RhdGUgPSAxMTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICBzdGF0ZSA9IDEyOwoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMToJCQkJLyogMiwgJy4uJyBhdCBzdGFydCAqLwoJICAgIGNvdW50ID0gMTsKCSAgICBpZiAoKmZwdHIgIT0gMCkKCSAgICAgIHsKCQlpZiAoKmZwdHIgIT0gJy8nKQkJLyogZ290IC4ueHh4ICovCgkJICB7CgkJICAgIHJldHVybiBuYW1lOwoJCSAgfQoJCWRvCQkJCS8qIGdvdCAuLi8gKi8KCQkgIHsKCQkgICAgZnB0cisrOwoJCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKSBmcHRyKys7CgkJICAgIGlmICgqZnB0ciAhPSAnLicpCgkJICAgICAgYnJlYWs7CgkJICAgIGlmICgqKGZwdHIrMSkgIT0gJy4nKQoJCSAgICAgIGJyZWFrOwoJCSAgICBmcHRyICs9IDI7CgkJICAgIGlmICgoKmZwdHIgPT0gMCkKCQkJfHwgKCpmcHRyID09ICcvJykpCgkJICAgICAgY291bnQrKzsKCQkgIH0KCQl3aGlsZSAoKmZwdHIgPT0gJy8nKTsKCSAgICAgIH0KCSAgICB7CQkJCQkvKiBnb3QgJy4uJyBvciAnLi4vJyAqLwoJICAgICAgY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkgICAgICBzMSA9IGdldGN3ZChjd2RidWYsIE1BWFBBVEhMRU4pOwoJICAgICAgaWYgKHMxID09IDApCgkJewoJCSAgcmV0dXJuICIiOwkgICAgLyogRklYTUUsIGVyciBnZXRjd2QgKi8KCQl9CgkgICAgICBzdHJjcHkgKHZwdHIsIHMxKTsKCSAgICAgIHMgPSBzdHJjaHIgKHZwdHIsICddJyk7CgkgICAgICBpZiAocyAhPSAwKQoJCXsKCQkgIG5zdGF0ZSA9IE5fT1BFTjsKCQkgIHdoaWxlIChzID4gdnB0cikKCQkgICAgewoJCSAgICAgIHMtLTsKCQkgICAgICBpZiAoKnMgPT0gJ1snKQoJCQl7CgkJCSAgcysrOwoJCQkgIHN0cmNweSAocywgIjAwMDAwMF0iKTsKCQkJICBzdGF0ZSA9IC0xOwoJCQkgIGJyZWFrOwoJCQl9CgkJICAgICAgZWxzZSBpZiAoKnMgPT0gJy4nKQoJCQl7CgkJCSAgaWYgKC0tY291bnQgPT0gMCkKCQkJICAgIHsKCQkJICAgICAgaWYgKCpmcHRyID09IDApCS8qIGhhZCAnLi4nIG9yICcuLi8nICovCgkJCQl7CgkJCQkgICpzKysgPSAnXSc7CgkJCQkgIHN0YXRlID0gLTE7CgkJCQl9CgkJCSAgICAgIGVsc2UJCQkvKiBoYWQgJy4uL3h4eCcgKi8KCQkJCXsKCQkJCSAgc3RhdGUgPSA5OwoJCQkJfQoJCQkgICAgICAqcyA9IDA7CgkJCSAgICAgIGJyZWFrOwoJCQkgICAgfQoJCQl9CgkJICAgIH0KCQl9CgkgICAgICB2cHRyICs9IHN0cmxlbiAodnB0cik7CgkgICAgfQoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMjoJCQkJLyogMSwgJy4nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykKCQkgIHsKCQkgICAgcmV0dXJuIG5hbWU7CgkJICB9CgkJd2hpbGUgKCpmcHRyID09ICcvJykKCQkgIGZwdHIrKzsKCSAgICAgIH0KCgkgICAgewoJICAgICAgY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkgICAgICBzMSA9IGdldGN3ZChjd2RidWYsIE1BWFBBVEhMRU4pOwoJICAgICAgaWYgKHMxID09IDApCgkJewoJCSAgcmV0dXJuICIiOwkgICAgLypGSVhNRSwgZXJyIGdldGN3ZCAqLwoJCX0KCSAgICAgIHN0cmNweSAodnB0ciwgczEpOwoJICAgICAgaWYgKCpmcHRyID09IDApCgkJewoJCSAgc3RhdGUgPSAtMTsKCQkgIGJyZWFrOwoJCX0KCSAgICAgIGVsc2UKCQl7CgkJICBzID0gc3RyY2hyICh2cHRyLCAnXScpOwoJCSAgaWYgKHMgPT0gMCkKCQkgICAgewoJCSAgICAgIHN0YXRlID0gLTE7CgkJICAgICAgYnJlYWs7CgkJICAgIH0KCQkgICpzID0gMDsKCQkgIG5zdGF0ZSA9IE5fT1BFTjsKCQkgIHZwdHIgKz0gc3RybGVuICh2cHRyKTsKCQkgIHN0YXRlID0gOTsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoJfQoKCX0KICAgICAgd2hpbGUgKHN0YXRlID4gMCk7CgoKICAgIH0KCgogIC8qIGRpcmVjdG9yeSBjb252ZXJzaW9uIGRvbmUKICAgICBmcHRyIC0+IGZpbGVuYW1lIHBhcnQgb2YgaW5wdXQgc3RyaW5nCiAgICAgdnB0ciAtPiBmcmVlIHNwYWNlIGluIHZtc25hbWUKICAqLwoKICAqdnB0cisrID0gMDsKCiAgcmV0dXJuIHZtc25hbWU7Cn0KCgoKLyoKICBjb252ZXJ0IGZyb20gdm1zLXN0eWxlIHRvIHVuaXgtc3R5bGUKCiAgZGV2OltkaXIxLmRpcjJdCS8vZGV2L2RpcjEvZGlyMi8KKi8KCmNoYXIgKgp1bml4aWZ5IChjaGFyICpuYW1lKQp7CiAgc3RhdGljIGNoYXIgcGllY2VbNTEyXTsKICBjaGFyICpzLCAqcDsKCiAgaWYgKHN0cmNociAobmFtZSwgJy8nKSAhPSAwKQkJLyogYWxyZWFkeSBpbiB1bml4IHN0eWxlICovCiAgICByZXR1cm4gbmFtZTsKCiAgcCA9IHBpZWNlOwogICpwID0gMDsKCiAgLyogZGV2aWNlIHBhcnQgKi8KCiAgcyA9IHN0cmNociAobmFtZSwgJzonKTsKCiAgaWYgKHMgIT0gMCkKICAgIHsKICAgICAgKnMgPSAwOwogICAgICAqcCsrID0gJy8nOwogICAgICAqcCsrID0gJy8nOwogICAgICBzdHJjcHkgKHAsIG5hbWUpOwogICAgICBwICs9IHN0cmxlbiAocCk7CiAgICAgICpzID0gJzonOwogICAgfQoKICAvKiBkaXJlY3RvcnkgcGFydCAqLwoKICAqcCsrID0gJy8nOwogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMrKzsKICAgICAgc3dpdGNoICgqcykKICAgICAgICB7CgkgIGNhc2UgJ10nOgkJLyogW10gKi8KCSAgICBzdHJjYXQgKHAsICIuLyIpOwoJICAgIGJyZWFrOwoJICBjYXNlICctJzoJCS8qIFstICovCgkgICAgc3RyY2F0IChwLCAiLi4vIik7CgkgICAgYnJlYWs7CgkgIGNhc2UgJy4nOgoJICAgIHN0cmNhdCAocCwgIi4vIik7CS8qIFsuICovCgkgICAgYnJlYWs7CgkgIGRlZmF1bHQ6CgkgICAgcy0tOwoJICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcysrOwogICAgICB3aGlsZSAoKnMpCiAgICAgICAgewoJICBpZiAoKnMgPT0gJy4nKQoJICAgICpwKysgPSAnLyc7CgkgIGVsc2UKCSAgICAqcCsrID0gKnM7CgkgIHMrKzsKCSAgaWYgKCpzID09ICddJykKCSAgICB7CgkgICAgICBzKys7CgkgICAgICBicmVhazsKCSAgICB9CiAgICAgICAgfQogICAgICBpZiAoKnMgIT0gMCkJCS8qIG1vcmUgYWZ0ZXIgJ10nID8/ICovCiAgICAgICAgewoJICBpZiAoKihwLTEpICE9ICcvJykKCSAgICAqcCsrID0gJy8nOwoJICBzdHJjcHkgKHAsIHMpOwkJLyogY29weSBpdCBhbnl3YXkgKi8KICAgICAgICB9CiAgICB9CgogIGVsc2UJCS8qIG5vICdbJyBhbnl3aGVyZSAqLwoKICAgIHsKICAgICAgKnArKyA9IDA7CiAgICB9CgogIC8qIGZvcmNlIGVuZCB3aXRoICcvJyAqLwoKICBpZiAoKihwLTEpICE9ICcvJykKICAgICpwKysgPSAnLyc7CiAgKnAgPSAwOwoKICByZXR1cm4gcGllY2U7Cn0KCi8qIEVPRiAqLwo=