LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWZkZWYgbGludXgKIAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlICJ3aW5kb3dzLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJtc2Rvcy5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgIm1vZHVsZS5oIgojaW5jbHVkZSAibGR0LmgiCiNpbmNsdWRlICJkb3NleGUuaCIKCnZvaWQgRE9TVk1fRHVtcCggTFBET1NUQVNLIGxwRG9zVGFzaykKewogdW5zaWduZWQgaW9mczsKIEJZVEUqaW5zdDsKIGludCB4OwoKIHN3aXRjaCAoVk04Nl9UWVBFKGxwRG9zVGFzay0+Zm4pKSB7CiAgY2FzZSBWTTg2X1NJR05BTDoKICAgcHJpbnRmKCJUcmFwcGVkIHNpZ25hbFxuIik7IGJyZWFrOwogIGNhc2UgVk04Nl9VTktOT1dOOgogICBwcmludGYoIlRyYXBwZWQgdW5oYW5kbGVkIEdQRlxuIik7IGJyZWFrOwogIGNhc2UgVk04Nl9JTlR4OgogICBwcmludGYoIlRyYXBwZWQgSU5UICUwMnhcbiIsVk04Nl9BUkcobHBEb3NUYXNrLT5mbikpOyBicmVhazsKICBjYXNlIFZNODZfU1RJOgogICBwcmludGYoIlRyYXBwZWQgU1RJXG4iKTsgYnJlYWs7CiAgY2FzZSBWTTg2X1BJQ1JFVFVSTjoKICAgcHJpbnRmKCJUcmFwcGVkIGR1ZSB0byBwZW5kaW5nIFBJQyByZXF1ZXN0XG4iKTsgYnJlYWs7CiAgY2FzZSBWTTg2X1RSQVA6CiAgIHByaW50ZigiVHJhcHBlZCBkZWJ1ZyByZXF1ZXN0XG4iKTsgYnJlYWs7CiB9CiNkZWZpbmUgUkVHUyBscERvc1Rhc2stPlZNODYucmVncwogZnByaW50ZihzdGRlcnIsIkFYPSUwNGxYIENYPSUwNGxYIERYPSUwNGxYIEJYPSUwNGxYXG4iLFJFR1MuZWF4LFJFR1MuZWJ4LFJFR1MuZWN4LFJFR1MuZWR4KTsKIGZwcmludGYoc3RkZXJyLCJTST0lMDRsWCBEST0lMDRsWCBTUD0lMDRsWCBCUD0lMDRsWFxuIixSRUdTLmVzaSxSRUdTLmVkaSxSRUdTLmVzcCxSRUdTLmVicCk7CiBmcHJpbnRmKHN0ZGVyciwiQ1M9JTA0WCBEUz0lMDRYIEVTPSUwNFggU1M9JTA0WFxuIixSRUdTLmNzLFJFR1MuZHMsUkVHUy5lcyxSRUdTLnNzKTsKCiBpb2ZzPSgoRFdPUkQpUkVHUy5jczw8NCkrUkVHUy5laXA7CiN1bmRlZiBSRUdTCiBpbnN0PShCWVRFKilscERvc1Rhc2stPmltZytpb2ZzOwogcHJpbnRmKCJPcGNvZGVzOiIpOwogZm9yICh4PTA7IHg8ODsgeCsrKSBwcmludGYoIiAlMDJ4IixpbnN0W3hdKTsKIHByaW50ZigiXG4iKTsKCiBleGl0KDApOwp9CgppbnQgRE9TVk1fSW50KGludCB2ZWN0LCBMUERPU1RBU0sgbHBEb3NUYXNrLCBQQ09OVEVYVCBjb250ZXh0ICkKewogc3dpdGNoICh2ZWN0KSB7CiAgY2FzZSAweDIwOgogICByZXR1cm4gLTE7CiAgY2FzZSAweDIxOgogICBpZiAoQUhfcmVnKGNvbnRleHQpPT0weDRjKSByZXR1cm4gLTE7CiAgIERPUzNDYWxsKGNvbnRleHQpOwogICBicmVhazsKIH0KIHJldHVybiAwOwp9CgppbnQgRE9TVk1fUHJvY2VzcyggTFBET1NUQVNLIGxwRG9zVGFzayApCnsKIENPTlRFWFQgY29udGV4dDsKIGludCByZXQ9MDsKCiNkZWZpbmUgUkVHUyBscERvc1Rhc2stPlZNODYucmVncwogY29udGV4dC5FYXg9UkVHUy5lYXg7IGNvbnRleHQuRWN4PVJFR1MuZWN4OyBjb250ZXh0LkVkeD1SRUdTLmVkeDsgY29udGV4dC5FYng9UkVHUy5lYng7CiBjb250ZXh0LkVzaT1SRUdTLmVzaTsgY29udGV4dC5FZGk9UkVHUy5lZGk7IGNvbnRleHQuRXNwPVJFR1MuZXNwOyBjb250ZXh0LkVicD1SRUdTLmVicDsKIGNvbnRleHQuU2VnQ3M9UkVHUy5jczsgY29udGV4dC5TZWdEcz1SRUdTLmRzOyBjb250ZXh0LlNlZ0VzPVJFR1MuZXM7CiBjb250ZXh0LlNlZ1NzPVJFR1Muc3M7IGNvbnRleHQuU2VnRnM9UkVHUy5mczsgY29udGV4dC5TZWdHcz1SRUdTLmdzOwogY29udGV4dC5FaXA9UkVHUy5laXA7IGNvbnRleHQuRUZsYWdzPVJFR1MuZWZsYWdzOwogKHZvaWQqKVY4NkJBU0UoJmNvbnRleHQpPWxwRG9zVGFzay0+aW1nOwoKIHN3aXRjaCAoVk04Nl9UWVBFKGxwRG9zVGFzay0+Zm4pKSB7CiAgY2FzZSBWTTg2X1NJR05BTDoKICAgcHJpbnRmKCJUcmFwcGVkIHNpZ25hbFxuIik7CiAgIHJldD0tMTsgYnJlYWs7CiAgY2FzZSBWTTg2X1VOS05PV046CiAgIERPU1ZNX0R1bXAobHBEb3NUYXNrKTsKICAgYnJlYWs7CiAgY2FzZSBWTTg2X0lOVHg6CiAgIFRSQUNFKGludCwiRE9TIEVYRSBjYWxscyBJTlQgJTAyeFxuIixWTTg2X0FSRyhscERvc1Rhc2stPmZuKSk7CiAgIHJldD1ET1NWTV9JbnQoVk04Nl9BUkcobHBEb3NUYXNrLT5mbiksbHBEb3NUYXNrLCZjb250ZXh0KTsgYnJlYWs7CiAgY2FzZSBWTTg2X1NUSToKICAgYnJlYWs7CiAgY2FzZSBWTTg2X1BJQ1JFVFVSTjoKICAgcHJpbnRmKCJUcmFwcGVkIGR1ZSB0byBwZW5kaW5nIFBJQyByZXF1ZXN0XG4iKTsgYnJlYWs7CiAgY2FzZSBWTTg2X1RSQVA6CiAgIHByaW50ZigiVHJhcHBlZCBkZWJ1ZyByZXF1ZXN0XG4iKTsgYnJlYWs7CiAgZGVmYXVsdDoKICAgRE9TVk1fRHVtcChscERvc1Rhc2spOwogfQoKIGxwRG9zVGFzay0+Zm49Vk04Nl9FTlRFUjsKIFJFR1MuZWF4PWNvbnRleHQuRWF4OyBSRUdTLmVjeD1jb250ZXh0LkVjeDsgUkVHUy5lZHg9Y29udGV4dC5FZHg7IFJFR1MuZWJ4PWNvbnRleHQuRWJ4OwogUkVHUy5lc2k9Y29udGV4dC5Fc2k7IFJFR1MuZWRpPWNvbnRleHQuRWRpOyBSRUdTLmVzcD1jb250ZXh0LkVzcDsgUkVHUy5lYnA9Y29udGV4dC5FYnA7CiBSRUdTLmNzPWNvbnRleHQuU2VnQ3M7IFJFR1MuZHM9Y29udGV4dC5TZWdEczsgUkVHUy5lcz1jb250ZXh0LlNlZ0VzOwogUkVHUy5zcz1jb250ZXh0LlNlZ1NzOyBSRUdTLmZzPWNvbnRleHQuU2VnRnM7IFJFR1MuZ3M9Y29udGV4dC5TZWdHczsKIFJFR1MuZWlwPWNvbnRleHQuRWlwOyBSRUdTLmVmbGFncz1jb250ZXh0LkVGbGFnczsKI3VuZGVmIFJFR1MKIHJldHVybiByZXQ7Cn0KCiNlbmRpZiAvKiBsaW51eCAqLwo=