Lyogc2V0Z3JwLmMgLSBieSBNaWNoYWVsIEhhYXJkdC4gU2V0IHRoZSBnaWQgaWYgcG9zc2libGUgKi8KLyogQWRkZWQgYSBiaXQgbW9yZSBlcnJvciByZWNvdmVyeS9yZXBvcnRpbmcgLSBwb2UgKi8KLyogVmVzYSBSb3Vrb25lbiBhZGRlZCBjb2RlIGZvciBhc2tpbmcgcGFzc3dvcmQgKi8KLyogQ3VycmVudGx5IG1haW50YWluZWQgYXQgZnRwOi8vZnRwLmRhaW1pLmFhdS5kay9wdWIvbGludXgvcG9lLyAqLwoKLyogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICovCgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxwd2QuaD4KI2luY2x1ZGUgPGdycC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxlcnJuby5oPgoKI2luY2x1ZGUgImMuaCIKI2luY2x1ZGUgInBhdGhuYW1lcy5oIgojaW5jbHVkZSAibXlfY3J5cHQuaCIKI2luY2x1ZGUgIm5scy5oIgoKLyogdHJ5IHRvIHJlYWQgcGFzc3dvcmQgZnJvbSBnc2hhZG93ICovCnN0YXRpYyBjaGFyICoKZ2V0X2dzaGFkb3dfcHdkKGNoYXIgKmdyb3VwbmFtZSkKewoJY2hhciBidWZbQlVGU0laXTsKCWNoYXIgKnB3ZCA9IE5VTEw7CglGSUxFICpmID0gZm9wZW4oX1BBVEhfR1NIQURPVywgInIiKTsKCglpZiAoZ3JvdXBuYW1lID09IE5VTEwgfHwgKmdyb3VwbmFtZSA9PSAnXDAnIHx8IGYgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgl3aGlsZShmZ2V0cyhidWYsIHNpemVvZiBidWYsIGYpKQoJewoJCWNoYXIgKmNwID0gc3RyY2hyIChidWYsICc6Jyk7CgkJaWYgKCFjcCkKCQkJY29udGludWU7CQkJCS8qIGFueSBqdW5rIGluIGdzaGFkb3c/ICovCgkJKmNwID0gJ1wwJzsKCQlpZiAoc3RyY21wKGJ1ZiwgZ3JvdXBuYW1lKSA9PSAwKQoJCXsKCQkJaWYgKGNwLWJ1ZiA+PSBCVUZTSVopCgkJCQlicmVhazsJCQkJLyogb25seSBncm91cCBuYW1lIG9uIGxpbmUgKi8KCQkJcHdkID0gY3ArMTsKCQkJaWYgKChjcCA9IHN0cmNocihwd2QsICc6JykpICYmIHB3ZCA9PSBjcCsxICkKCQkJCXB3ZCA9IE5VTEw7CQkJLyogZW1wdHkgcGFzc3dvcmQgKi8KCQkJZWxzZSBpZiAoY3ApCgkJCQkqY3AgPSAnXDAnOwoJCQlicmVhazsKCQl9Cgl9CglmY2xvc2UoZik7CglyZXR1cm4gcHdkID8gc3RyZHVwKHB3ZCkgOiBOVUxMOwp9CgpzdGF0aWMgaW50CmFsbG93X3NldGdpZChzdHJ1Y3QgcGFzc3dkICpwZSwgc3RydWN0IGdyb3VwICpnZSkgCnsKICAgIGNoYXIgKipsb29rOwogICAgaW50IG5vdGZvdW5kID0gMTsKICAgIGNoYXIgKnB3ZCwgKnhwd2Q7CgogICAgaWYgKGdldHVpZCgpID09IDApIHJldHVybiBUUlVFOwkvKiByb290IG1heSBkbyBhbnl0aGluZyAqLwogICAgaWYgKGdlLT5ncl9naWQgPT0gcGUtPnB3X2dpZCkgcmV0dXJuIFRSVUU7IC8qIFlvdSBjYW4gc3dpdGNoIGJhY2sgdG8geW91ciBkZWZhdWx0IGdyb3VwICovCgogICAgbG9vayA9IGdlLT5ncl9tZW07CiAgICB3aGlsZSAoKmxvb2sgJiYgKG5vdGZvdW5kID0gc3RyY21wKCpsb29rKysscGUtPnB3X25hbWUpKSk7CgogICAgaWYoIW5vdGZvdW5kKSByZXR1cm4gVFJVRTsJCS8qIG1lbWJlciBvZiBncm91cCA9PiBPSyAqLwoKICAgIC8qIEFzayBmb3IgcGFzc3dvcmQuIE9mdGVuIHRoZXJlIGlzIG5vIHBhc3N3b3JkIGluIC9ldGMvZ3JvdXAsIHNvCiAgICAgICBjb250cmFyeSB0byBsb2dpbiBldCBhbC4gd2UgbGV0IGFuIGVtcHR5IHBhc3N3b3JkIG1lYW4gdGhlIHNhbWUKICAgICAgIGFzICogaW4gL2V0Yy9wYXNzd2QgKi8KCiAgICAvKiBjaGVjayAvZXRjL2dzaGFkb3cgKi8KICAgIGlmICghKHB3ZCA9IGdldF9nc2hhZG93X3B3ZChnZS0+Z3JfbmFtZSkpKQogICAgICAgIHB3ZCA9IGdlLT5ncl9wYXNzd2Q7CgogICAgaWYocHdkICYmICpwd2QgJiYgKHhwd2QgPSBnZXRwYXNzKF8oIlBhc3N3b3JkOiAiKSkpKSB7CiAgICAgICAgaWYoc3RyY21wKHB3ZCwgY3J5cHQoeHB3ZCwgcHdkKSkgPT0gMCkKCSAgIHJldHVybiBUUlVFOwkJLyogcGFzc3dvcmQgYWNjZXB0ZWQgKi8KICAgICB9CgogICAgcmV0dXJuIEZBTFNFOwkJCS8qIGRlZmF1bHQgdG8gZGVuaWFsICovCn0KCmludCAKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBzdHJ1Y3QgcGFzc3dkICpwd19lbnRyeTsKICAgIHN0cnVjdCBncm91cCAqZ3JfZW50cnk7CiAgICBjaGFyICpzaGVsbDsKCiAgICBzZXRsb2NhbGUoTENfQUxMLCAiIik7CiAgICBiaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogICAgdGV4dGRvbWFpbihQQUNLQUdFKTsKCiAgICBpZiAoIShwd19lbnRyeSA9IGdldHB3dWlkKGdldHVpZCgpKSkpIHsKCXBlcnJvcihfKCJuZXdncnA6IFdobyBhcmUgeW91PyIpKTsKCWV4aXQoMSk7CiAgICB9CgogICAgc2hlbGwgPSAocHdfZW50cnktPnB3X3NoZWxsWzBdID8gcHdfZW50cnktPnB3X3NoZWxsIDogX1BBVEhfQlNIRUxMKTsKCiAgICBpZiAoYXJnYyA8IDIpIHsKCWlmKHNldGdpZChwd19lbnRyeS0+cHdfZ2lkKSA8IDApIHsKCSAgICBwZXJyb3IoXygibmV3Z3JwOiBzZXRnaWQiKSk7CgkgICAgZXhpdCgxKTsKCX0KICAgIH0gZWxzZSB7CgllcnJubyA9IDA7CglpZiAoIShncl9lbnRyeSA9IGdldGdybmFtKGFyZ3ZbMV0pKSkgewoJICAgIGlmIChlcnJubykKCQkgICAgcGVycm9yKF8oIm5ld2dycDogTm8gc3VjaCBncm91cC4iKSk7CQkJLyogZXJyb3IgKi8KCSAgICBlbHNlCgkJICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIF8oIm5ld2dycDogTm8gc3VjaCBncm91cC4iKSk7CS8qIG5vIGdyb3VwICovCgkgICAgZXhpdCgxKTsKCX0gZWxzZSB7CgkgICAgaWYoYWxsb3dfc2V0Z2lkKHB3X2VudHJ5LCBncl9lbnRyeSkpIHsKCQlpZihzZXRnaWQoZ3JfZW50cnktPmdyX2dpZCkgPCAwKSB7CgkJICAgIHBlcnJvcihfKCJuZXdncnA6IHNldGdpZCIpKTsKCQkgICAgZXhpdCgxKTsKCQl9CgkgICAgfSBlbHNlIHsKCQlwdXRzKF8oIm5ld2dycDogUGVybWlzc2lvbiBkZW5pZWQiKSk7CgkJZXhpdCgxKTsKCSAgICB9Cgl9CiAgICB9CgogICAgaWYoc2V0dWlkKGdldHVpZCgpKSA8IDApIHsKCXBlcnJvcihfKCJuZXdncnA6IHNldHVpZCIpKTsKCWV4aXQoMSk7CiAgICB9CgogICAgZmZsdXNoKHN0ZG91dCk7IGZmbHVzaChzdGRlcnIpOwogICAgZXhlY2woc2hlbGwsc2hlbGwsKGNoYXIqKTApOwogICAgcGVycm9yKF8oIk5vIHNoZWxsIikpOwogICAgZmZsdXNoKHN0ZGVycik7CiAgICBleGl0KDEpOwp9Cg==