LyoKICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgogKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwogKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBNb2R1bGUgTmFtZSA6IHVkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVVNCIGRlc2NyaXB0b3IgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKI2luY2x1ZGUgImhwYW5pLmgiCiNpbmNsdWRlICJocHVzYi5oIgoKZXh0ZXJuIHZvaWQgemZ3VXNiQ21kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pOwoKZXh0ZXJuIHZvaWQgemZJZGxSc3AoemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CmV4dGVybiB1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKZXh0ZXJuIHUxNl90IHpmRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KTsKCgojZGVmaW5lIFVTQl9FTkRQT0lOVF9UWF9JTkRFWCAgIDEKI2RlZmluZSBVU0JfRU5EUE9JTlRfUlhfSU5ERVggICAyCiNkZWZpbmUgVVNCX0VORFBPSU5UX0lOVF9JTkRFWCAgMwojZGVmaW5lIFVTQl9FTkRQT0lOVF9DTURfSU5ERVggIDQKCnZvaWQgemZJZGxDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbikKewojaWYgWk1fU1dfTE9PUF9CQUNLICE9IDEKICAgIHpmd1VzYkNtZChkZXYsIFVTQl9FTkRQT0lOVF9DTURfSU5ERVgsIGNtZCwgY21kTGVuKTsKI2VuZGlmCgogICAgcmV0dXJuOwp9CgoKLyogemZBZGp1c3RDdHJsU2V0dGluZzogZml0IE9VVFMgZm9ybWF0ICovCi8qICAgICBjb252ZXJ0IE1JTU8yIHRvIE9VVFMgICAgICAgICAgICAgKi8Kdm9pZCB6ZkFkanVzdEN0cmxTZXR0aW5nKHpkZXZfdCogZGV2LCB1MTZfdCogaGVhZGVyLCB6YnVmX3QqIGJ1ZikKewogICAgLyogTUlNTzIgPT4gT1VUUyBGQi01MCAqLwogICAgLyogbGVuZ3RoIG5vdCBjaGFuZ2UsIG9ubHkgbW9kaWZ5IGZvcm1hdCAqLwoKICAgIHUzMl90IG9sZE1UOwoJdTMyX3Qgb2xkTUNTOwoKICAgIHUzMl90IHBoeUN0cmw7CiAgICB1MzJfdCBvbGRQaHlDdHJsOwoKICAgIHUxNl90IHRwYyA9IDA7CiAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKCiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CiAgICBocFByaXY9d2QtPmhwUHJpdmF0ZTsKCiAgIC8qIG1tICovCiAgICBpZiAoaGVhZGVyID09IE5VTEwpCiAgICB7CiAgICAgICAgb2xkUGh5Q3RybCA9IHptd19idWZfcmVhZGgoZGV2LCBidWYsIDQpIHwgKCh1MzJfdCl6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCA2KSA8PCAxNik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgb2xkUGh5Q3RybCA9IGhlYWRlclsyXSB8ICgodTMyX3QpaGVhZGVyWzNdIDw8MTYpOwogICAgfQoKCXBoeUN0cmwgPSAwOwoKCgkvKiBNVCA6IEJpdFsxfjBdICovCglvbGRNVCA9IG9sZFBoeUN0cmwmMHgzOwoJcGh5Q3RybCB8PSBvbGRNVDsKICAgIGlmICggb2xkTVQgPT0gMHgzICkgICAvKiBETC1PRkRNIChEdXBsaWNhdGUgTGVnYWN5IE9GRE0pICovCgkJcGh5Q3RybCB8PSAweDE7CgoKCS8qIFBUIDogQml0WzJdICAgIEhUIFBUOiAwIE1peGVkIG1vZGUgICAgMSBHcmVlbiBmaWVsZCAqLwoJcGh5Q3RybCB8PSAob2xkUGh5Q3RybCYweDQpOwoKCS8qIEJhbmR3aWR0aCBjb250cm9sIDogQml0WzR+M10gKi8KCWlmICggb2xkUGh5Q3RybCYweDgwMDAwMCApICAgIC8qIEJpdDIzIDogNDBNICovCgl7CgkJI2lmIDAKCQlpZiAob2xkTVQgPT0gMHgzKSAgICAgICAgICAgICAvKiBETC1PRkRNICovCiAgICAgICAgICAgIHBoeUN0cmwgfD0gKDB4Mzw8Myk7ICAgLyogNDBNIGR1cGxpY2F0ZSAqLwoJCWVsc2UKCQkJcGh5Q3RybCB8PSAoMHgyPDwzKTsgICAvKiA0ME0gc2hhcmVkICovCgkJI2Vsc2UKCQlpZiAob2xkTVQgPT0gMHgyICYmICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCdzQwKQoJCXsKCQkJcGh5Q3RybCB8PSAoMHgyPDwzKTsgICAvKiA0ME0gc2hhcmVkICovCgkJfQoJCSNlbmRpZgoJfQoJZWxzZSB7CiAgICAgICAgb2xkUGh5Q3RybCAmPSB+MHg4MDAwMDAwMDsKICAgIH0KCgkvKiBNQ1MgOiBCaXRbMjR+MThdICovCglvbGRNQ1MgPSAob2xkUGh5Q3RybCYweDdmMDAwMCk+PjE2OyAgLyogQml0WzIyfjE2XSAqLwoJcGh5Q3RybCB8PSAob2xkTUNTPDwxOCk7CgoJLyogU2hvcnQgR0kgOiBCaXRbMzFdKi8KICAgIHBoeUN0cmwgfD0gKG9sZFBoeUN0cmwmMHg4MDAwMDAwMCk7CgoJLyogQU0gOiBBbnRlbm5hIG1hc2sgKi8KCS8vaWYgKChvbGRNVCA9PSAyKSAmJiAob2xkTUNTID4gNykpCglpZiAoaHBQcml2LT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKQoJewoJICAgIHBoeUN0cmwgfD0gKDB4MTw8MTUpOwoJfQoJZWxzZQoJewoJICAgIC8qIEhUICAgICAgICAgICAgICAgICAgICAgVHggMiBjaGFpbiAqLwoJICAgIC8qIE9GRE0gNk0vOU0vMTJNLzE4TS8yNE0gVHggMiBjaGFpbiAqLwoJICAgIC8qIE9GRE0gMzZNLzQ4TS81NE0vICAgICAgVHggMSBjaGFpbiAqLwoJICAgIC8qIENDSyAgICAgICAgICAgICAgICAgICAgVHggMiBjaGFpbiAqLwoJICAgIGlmICgob2xkTVQgPT0gMikgfHwgKG9sZE1UID09IDMpKQoJICAgIHsKCSAgICAgICAgcGh5Q3RybCB8PSAoMHg1PDwxNSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKG9sZE1UID09IDEpCgkgICAgewoJICAgICAgICBpZiAoKG9sZE1DUyA9PSAweGIpIHx8IChvbGRNQ1MgPT0gMHhmKSB8fAoJICAgICAgICAgICAgKG9sZE1DUyA9PSAweGEpIHx8IChvbGRNQ1MgPT0gMHhlKSB8fAoJICAgICAgICAgICAgKG9sZE1DUyA9PSAweDkpKSAgICAgICAgICAgICAgICAgICAgICAgLy82TS85TS8xMk0vMThNLzI0TQoJICAgICAgICB7CgkgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDU8PDE1KTsKCSAgICAgICAgfQoJICAgICAgICBlbHNlCgkgICAgICAgIHsKCSAgICAgICAgICAgIHBoeUN0cmwgfD0gKDB4MTw8MTUpOwoJICAgICAgICB9CgkgICAgfQoJICAgIGVsc2UgLy8ob2xkTVQ9PTApCgkgICAgewoJICAgICAgICBwaHlDdHJsIHw9ICgweDU8PDE1KTsKCSAgICB9Cgl9CgkvL2Vsc2UKCS8vICAgIHBoeUN0cmwgfD0gKDB4MTw8MTUpOwoKCS8qIFRQQyAqLwoJLyogVE9ETyA6IGFjY2VsZXJhdGluZyB0aGVzZSBjb2RlICovCglpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApCgl7CiAgICAgICAgaWYgKG9sZE1UID09IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBDQ0sgKi8KICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4Q2NrW29sZE1DU10mMHgzZik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9sZE1UID09IDEpCiAgICAgICAgewogICAgICAgICAgICAvKiBPRkRNICovCiAgICAgICAgICAgIGlmIChvbGRNQ1MgPT0gMHhjKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1szXSYweDNmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHg4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1syXSYweDNmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHhkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1sxXSYweDNmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHg5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cGMgPSAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0taHBQcml2LT50UG93MngyZzI0SGVhdnlDbGlwT2Zmc2V0KSYweDNmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9sZE1UID09IDIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIG9sZFBoeUN0cmwmMHg4MDAwMDAgKSAgICAvKiBCaXQyMyA6IDQwTSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBIVCA0MCAqLwogICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDQwW29sZE1DUyYweDddJjB4M2YpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogSFQgMjAgKi8KICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnSHQyMFtvbGRNQ1MmMHg3XSYweDNmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgIC8vNUdIegogICAgewogICAgICAgIGlmIChvbGRNVCA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgLyogT0ZETSAqLwogICAgICAgICAgICBpZiAob2xkTUNTID09IDB4YykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbM10mMHgzZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4OCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbMl0mMHgzZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4ZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbMV0mMHgzZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvbGRNVCA9PSAyKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBvbGRQaHlDdHJsJjB4ODAwMDAwICkgICAgLyogQml0MjMgOiA0ME0gKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogSFQgNDAgKi8KICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQ0MFtvbGRNQ1MmMHg3XSYweDNmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEhUIDIwICovCiAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z0h0MjBbb2xkTUNTJjB4N10mMHgzZik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogVHggcG93ZXIgYWRqdXN0IGZvciBIVDQwICovCgkvKiBIVDQwICAgKzFkQm0gKi8KCWlmICgob2xkTVQ9PTIpICYmIChvbGRQaHlDdHJsJjB4ODAwMDAwKSApCgl7CgkgICAgdHBjICs9IDI7Cgl9Cgl0cGMgJj0gMHgzZjsKCiAgICAvKiBFdmwgZm9yY2UgdHggVFBDICovCiAgICBpZih3ZC0+Zm9yY2VUeFRQQykKICAgIHsKICAgICAgICB0cGMgPSAodTE2X3QpKHdkLT5mb3JjZVR4VFBDICYgMHgzZik7CiAgICB9CgogICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKSB7CiAgICAgICAgd2QtPm1heFR4UG93ZXIyICY9IDB4M2Y7CiAgICAgICAgdHBjID0gKHRwYyA+IHdkLT5tYXhUeFBvd2VyMik/IHdkLT5tYXhUeFBvd2VyMiA6IHRwYzsKICAgIH0gZWxzZSB7CiAgICAgICAgd2QtPm1heFR4UG93ZXI1ICY9IDB4M2Y7CiAgICAgICAgdHBjID0gKHRwYyA+IHdkLT5tYXhUeFBvd2VyNSk/IHdkLT5tYXhUeFBvd2VyNSA6IHRwYzsKICAgIH0KCgojZGVmaW5lIFpNX01JTl9UUEMgICAgIDUKI2RlZmluZSBaTV9UUENfT0ZGU0VUICA1CiNkZWZpbmUgWk1fU0lHTkFMX1RIUkVTSE9MRCAgNTYKICAgIGlmICgod2QtPnN0YS5iU2NoZWR1bGVTY2FuID09IEZBTFNFKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UpKQogICAgewogICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKICAgICAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCiAgICAgICAgICAgICAgICAmJiAod2QtPlNpZ25hbFN0cmVuZ3RoID4gWk1fU0lHTkFMX1RIUkVTSE9MRCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAodHBjID4gKChaTV9NSU5fVFBDK1pNX1RQQ19PRkZTRVQpKjIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cGMgLT0gKFpNX1RQQ19PRkZTRVQqMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHBjID4gKFpNX01JTl9UUEMqMikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRwYyA9IChaTV9NSU5fVFBDKjIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojdW5kZWYgWk1fTUlOX1RQQwojdW5kZWYgWk1fVFBDX09GRlNFVAojdW5kZWYgWk1fU0lHTkFMX1RIUkVTSE9MRAoKICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCiAgICBwaHlDdHJsIHw9ICh0cGMgJiAweDNmKSA8PCA5OwogICAgI2VuZGlmCgogICAgLyogU2V0IGJpdHNbODo2XUJGLU1DUyBmb3IgaGVhdnkgY2xpcCAqLwogICAgaWYgKChwaHlDdHJsJjB4MykgPT0gMikKCXsKCSAgICBwaHlDdHJsIHw9ICgocGh5Q3RybCA+PiAxMikgJiAweDFjMCk7CiAgICB9CgoJLyogUEhZIGNvbnRyb2wgKi8KICAgIGlmIChoZWFkZXIgPT0gTlVMTCkKICAgIHsKICAgICAgICB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgNCwgKHUxNl90KSAocGh5Q3RybCYweGZmZmYpKTsKICAgICAgICB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgNiwgKHUxNl90KSAocGh5Q3RybD4+MTYpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvL1BIWSBjb250cm9sIEwKICAgICAgICBoZWFkZXJbMl0gPSAodTE2X3QpIChwaHlDdHJsJjB4ZmZmZik7CiAgICAgICAgLy9QSFkgY29udHJvbCBICiAgICAgICAgaGVhZGVyWzNdID0gKHUxNl90KSAocGh5Q3RybD4+MTYpOwogICAgfQoKCXptX21zZzJfdHgoWk1fTFZfMiwgIm9sZCBwaHkgY3RybCA9ICIsIG9sZFBoeUN0cmwpOwogICAgem1fbXNnMl90eChaTV9MVl8yLCAibmV3IHBoeSBjdHJsID0gIiwgcGh5Q3RybCk7CgkvL0RiZ1ByaW50KCJvbGQgcGh5IGN0cmwgPSUwOHggXG4iLCBvbGRQaHlDdHJsKTsKICAgIC8vRGJnUHJpbnQoIm5ldyBwaHkgY3RybCA9JTA4eCBcbiIsIHBoeUN0cmwpOwp9CgoKI2RlZmluZSBFWFRSQV9JTkZPX0xFTiAgICAgIDI0ICAgIC8vUlNTSSg3KSArIEVWTSgxMikgKyBQSFkoMSkgKyBNQUNTdGF0dXMoNCkKdTE2X3QgemZIcFNlbmQoemRldl90KiBkZXYsIHUxNl90KiBoZWFkZXIsIHUxNl90IGhlYWRlckxlbiwKICAgICAgICAgICAgICAgIHUxNl90KiBzbmFwLCB1MTZfdCBzbmFwTGVuLAogICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICB1MTZfdCBidWZUeXBlLCB1OF90IGFjLCB1OF90IGtleUlkeCkKewojaWYgWk1fU1dfTE9PUF9CQUNLID09IDEKICAgIHpidWZfdCAqcnhidWY7CiAgICB1OF90ICpwdVJ4QnVmOwogICAgdThfdCAqcEhkcjsKCSAgIHU4X3QgKnBzbmFwOwoJICAgdTE2X3QgcGxjcGxlbiA9IDEyOwogICAgdTE2X3QgaTsKICAgCXUxNl90IHN3bHBPZmZzZXQ7CiNlbmRpZiAvKiAjaWYgWk1fU1dfTE9PUF9CQUNLID09IDEgKi8KICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2OwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKICAgIGhwUHJpdj13ZC0+aHBQcml2YXRlOwoKICAgIHptX21zZzFfdHgoWk1fTFZfMSwgInpmSHBTZW5kKCksIGxlbiA9ICIsIDEyICsgaGVhZGVyTGVuLTggKyBzbmFwTGVuICsgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgKyA0ICsgOCk7CgoJLyogQWRqdXN0IGN0cmwgc2V0dGluZyA6IDZOMTQgeWpzdW5nICovCiAgICB6ZkFkanVzdEN0cmxTZXR0aW5nKGRldiwgaGVhZGVyLCBidWYpOwoKI2lmIFpNX1NXX0xPT1BfQkFDSyAhPSAxCiAgICBocFByaXYtPnVzYlNlbmRCeXRlcyArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbYWMmMHgzXSArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKCiAgICAvKiBTdWJtaXQgVVNCIE91dCBVcmIgKi8KICAgIHpmd1VzYlNlbmQoZGV2LCBVU0JfRU5EUE9JTlRfVFhfSU5ERVgsICh1OF90ICopaGVhZGVyLCBoZWFkZXJMZW4sCiAgICAgICAgICAgICAgICAgICh1OF90ICopc25hcCwgc25hcExlbiwgKHU4X3QgKil0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCk7CiNlbmRpZgoKI2lmIFpNX1NXX0xPT1BfQkFDSyA9PSAxCgogICAgcnhidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIHBsY3BsZW4gKyBoZWFkZXJMZW4tOCArIHNuYXBMZW4gKyAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Ziktb2Zmc2V0KSArIDQgKyBFWFRSQV9JTkZPX0xFTik7CiAgICBwSGRyID0gKHU4X3QgKikgaGVhZGVyKzg7CiAgIAlwc25hcCA9ICh1OF90ICopIHNuYXA7CgogICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKICAgIC8qIHNvZnR3YXJlIGxvb3AgYmFjayAqLwogICAgLyogQ29weSBXTEFOIGhlYWRlciBhbmQgcGFja2V0IGJ1ZmZlciAqLwogICAJc3dscE9mZnNldCA9IHBsY3BsZW47CgogICAgZm9yKGkgPSAwOyBpIDwgaGVhZGVyTGVuLTg7IGkrKykKICAgIHsKICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIHJ4YnVmLCBzd2xwT2Zmc2V0K2ksIHBIZHJbaV0pOwogICAgfQoKICAgCXN3bHBPZmZzZXQgKz0gaGVhZGVyTGVuLTg7CgogICAgLyogQ29weSBTTkFQIGhlYWRlciAqLwogICAgZm9yKGkgPSAwOyBpIDwgc25hcExlbjsgaSsrKQogICAgewoJCSAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgcnhidWYsIHN3bHBPZmZzZXQraSwgcHNuYXBbaV0pOwogICAgfQoKCSAgIHN3bHBPZmZzZXQgKz0gc25hcExlbjsKCiAgICAvKiBDb3B5IGJvZHkgZnJvbSB0eCBidWYgdG8gcnhidWYgKi8KICAgIGZvcihpID0gMDsgaSA8ICh6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1vZmZzZXQpOyBpKyspCiAgICB7CiAgICAgICAgdThfdCB2YWx1ZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGkrb2Zmc2V0KTsKICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIHJ4YnVmLCBzd2xwT2Zmc2V0K2ksIHZhbHVlKTsKICAgIH0KCgkgICAvKiB0b3RhbCBsZW5ndGggPSBQTENQICsgICAgICAgICBNYWNIZWFkZXIgICAgICAgKyBQYXlsb2FkICAgKyBGQ1MgKyBSWHN0YXR1cyAqLwoJICAgLyogICAgICAgICAgICAgICAgIDEyICArICBoZWFkZXJMZW4tOCAgKyBzbmFwTGVuICsgYnVmIGxlbmd0aCArIDQgICsgOCAgICAgICAgKi8KICAgCXpmd1NldEJ1ZlNldFNpemUoZGV2LCByeGJ1Ziwgc3dscE9mZnNldCArICh6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1vZmZzZXQpICsgNCArIEVYVFJBX0lORk9fTEVOICk7CgogICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKCiAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKCgkgICAvL3pmd0R1bXBCdWYoZGV2LCByeGJ1Zik7CgkgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvL3pmQ29yZVJlY3YoZGV2LCByeGJ1Zik7CgojZW5kaWYgLyogI2lmIFpNX1NXX0xPT1BfQkFDSyAqLwoKICAgIHJldHVybiBaTV9TVUNDRVNTOwp9CgovKiBSZXBvcnQgbW9uaXRlciBIYWwgcnggaW5mb3JtYXRpb24gYWJvdXQgcnNzaSwgZXZtLCBiYW5kd2lkdGgsIFNHIGV0YyAqLwp2b2lkIHpmSHBRdWVyeU1vbkhhbFJ4SW5mbyh6ZGV2X3QqIGRldiwgdThfdCAqbW9uSGFsUnhJbmZvKQp7CiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CiAgICB6Zk1lbW9yeUNvcHkobW9uSGFsUnhJbmZvLAogICAgICAgICAgICAgICAgKHU4X3QqKSYoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8pLAogICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB6c0hhbFJ4SW5mbykpOwp9CgoKdThfdCB6ZklzRGF0YUZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKewogICAgdThfdCBmcmFtZVR5cGU7CiAgICB1OF90IG1wZHVJbmQ7CgogICAgbXBkdUluZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLTEpOwoKICAgIC8qIHNpbmxnZSBvciBGaXJzdCAqLwogICAgaWYgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCB8fCAobXBkdUluZCAmIDB4MzApID09IDB4MjApCiAgICB7CiAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMTIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZyYW1lVHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApOwogICAgfQoKICAgIGlmKChmcmFtZVR5cGUgJiAweGYpID09IFpNX1dMQU5fREFUQV9GUkFNRSkKICAgICAgICByZXR1cm4gMTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKfQoKdTMyX3QgemZjQ29udmVydFJhdGVPRkRNKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKewogICAgLy8gV2hhdCdzIHRoZSBkZWZhdWx0IHZhbHVlPz8KICAgIHUzMl90IE1DUyA9IDA7CgogICAgc3dpdGNoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApJiAweGYpCiAgICB7CiAgICAgICAgY2FzZSAweGI6CiAgICAgICAgICAgIE1DUyA9IDB4NDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGY6CiAgICAgICAgICAgIE1DUyA9IDB4NTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGE6CiAgICAgICAgICAgIE1DUyA9IDB4NjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGU6CiAgICAgICAgICAgIE1DUyA9IDB4NzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDk6CiAgICAgICAgICAgIE1DUyA9IDB4ODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGQ6CiAgICAgICAgICAgIE1DUyA9IDB4OTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDg6CiAgICAgICAgICAgIE1DUyA9IDB4YTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGM6CiAgICAgICAgICAgIE1DUyA9IDB4YjsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gTUNTOwp9Cgp1MTZfdCB6ZkhwR2V0UGF5bG9hZExlbih6ZGV2X3QqIGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgemJ1Zl90KiBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgcGxjcEhkckxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TVQsCiAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeE1DUywKICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4QlcsCiAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeFNHCiAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgdThfdCBtb2R1bGF0aW9uLG1wZHVJbmQ7CiAgICB1MTZfdCBsb3csIGhpZ2gsIG1zYjsKICAgIHMxNl90IHBheWxvYWRMZW4gPSAwOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICBtcGR1SW5kID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTEpOwogICAgbW9kdWxhdGlvbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSkpICYgMHgzOwogICAgKnJ4TVQgPSBtb2R1bGF0aW9uOwoKICAgIC8vem1fZGVidWdfbXNnMSgiIG1vZHVsYXRpb249ICIsIG1vZHVsYXRpb24pOwogICAgc3dpdGNoIChtb2R1bGF0aW9uKSB7CiAgICBjYXNlIDA6IC8qIENDSyBNb2RlICovCiAgICAgICAgbG93ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMik7CiAgICAgICAgaGlnaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMpOwogICAgICAgIHBheWxvYWRMZW4gPSAobG93IHwgaGlnaCA8PCA4KSAtIDQ7CiAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvKQogICAgICAgIHsKICAgICAgICAgICAgKnJ4TUNTID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CiAgICAgICAgICAgICpyeEJXICA9IDA7CiAgICAgICAgICAgICpyeFNHICA9IDA7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSAxOiAvKiBMZWdhY3ktT0ZETSBtb2RlICovCiAgICAgICAgbG93ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNTsKICAgICAgICBoaWdoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMSk7CiAgICAgICAgbXNiID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMikgJiAweDE7CiAgICAgICAgcGF5bG9hZExlbiA9IChsb3cgfCAoaGlnaCA8PCAzKSB8IChtc2IgPDwgMTEpKSAtIDQ7CiAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvKQogICAgICAgIHsKICAgICAgICAgICAgKnJ4TUNTID0gemZjQ29udmVydFJhdGVPRkRNKGRldiwgYnVmKTsKICAgICAgICAgICAgKnJ4QlcgID0gMDsKICAgICAgICAgICAgKnJ4U0cgID0gMDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6IC8qIEhUIE9GRE0gbW9kZSAqLwogICAgICAgIC8vem1fZGVidWdfbXNnMSgiYWdncmVnYXRpb249ICIsICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCA2KSA+PiAzKSAmMHgxICk7CiAgICAgICAgaWYgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCB8fCAobXBkdUluZCAmIDB4MzApID09IDB4MTApICAgIC8vc2luZ2xlIG9yIGxhc3QgbXBkdQogICAgICAgICAgICBwYXlsb2FkTGVuID0gbGVuIC0gMjQgLSA0IC0gcGxjcEhkckxlbjsgIC8vIC0gcnhTdGF0dXMgLSBmY3MKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcGF5bG9hZExlbiA9IGxlbiAtIDQgLSA0IC0gcGxjcEhkckxlbjsgIC8vIC0gcnhTdGF0dXMgLSBmY3MKICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJmaXJzdCBvciBtaWRkbGUgbXBkdSwgcGxjcEhkckxlbj0gIiwgcGxjcEhkckxlbik7CiAgICAgICAgfQogICAgICAgIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbykKICAgICAgICB7CiAgICAgICAgICAgICpyeE1DUyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMpICYgMHg3ZjsKICAgICAgICAgICAgKnJ4QlcgID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMpID4+IDcpICYgMHgxOwogICAgICAgICAgICAqcnhTRyAgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgNikgPj4gNykgJiAweDE7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKCiAgICB9CiAgICAvKiByZXR1cm4gdGhlIHBheWxvYWQgbGVuZ3RoIC0gRkNTICovCiAgICBpZiAocGF5bG9hZExlbiA8IDApIHBheWxvYWRMZW4gPSAwOwogICAgcmV0dXJuIHBheWxvYWRMZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpVXNiUmVjdiAgICAgICAgICAgICAgICAgICovCi8qICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBJTiBUcmFuc2Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2OiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgWk1fSU5UX1VTRV9FUDIgICAgICAgICAgICAgICAgMQojZGVmaW5lIFpNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFICAgMTIKCiNpZiBaTV9JTlRfVVNFX0VQMiA9PSAxCnZvaWQgemZpVXNiUmVnSW4oemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CiNlbmRpZgoKI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKdm9pZCB6ZmlVc2JSZWN2UGVyUGt0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKI2Vsc2UKdm9pZCB6ZmlVc2JSZWN2KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKI2VuZGlmCnsKCgojaWYgWk1fRldfTE9PUF9CQUNLICE9IDEKICAgIHU4X3QgbXBkdUluZDsKICAgIHUxNl90IHBsY3BIZHJMZW47CiAgICB1MTZfdCBjcmNQbHVzUnhTdGF0dXNMZW47CiAgICB1MTZfdCBsZW4sIHBheWxvYWRMZW49MDsKICAgIHUxNl90IGk7IC8vQ1dZYW5nKCspCiAgICBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gYWRkSW5mbzsKICAgIHUzMl90ICAgICAgICAgICAgICAgcnhNVDsKICAgIHUzMl90ICAgICAgICAgICAgICAgcnhNQ1M7CiAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4Qlc7CiAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4U0c7CiAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKCiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CiAgICBocFByaXY9d2QtPmhwUHJpdmF0ZTsKCiAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgInpmaVVzYlJlY3YoKSIpOwoKI2lmIFpNX0lOVF9VU0VfRVAyID09IDEKCiAgICBmb3IgKGk9MDsgaTwoWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkU+PjEpOyBpKyspCiAgICB7CiAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIGkqMikgIT0gMHhmZmZmKQogICAgICAgIAlicmVhazsKICAgIH0KCiAgICBpZiAoaT09KFpNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFPj4xKSkKICAgIHsKICAgICAgICB1MzJfdCAgICAgICAgICAgICAgIHJzcFtaTV9VU0JfTUFYX0VQSU5UX0JVRkZFUi80XTsKICAgICAgICB1MTZfdCAgICAgICAgICAgICAgIHJzcExlbjsKICAgICAgICB1MzJfdCAgICAgICAgICAgICAgIHJzcGk7CiAgICAgICAgdThfdCogICAgICAgICAgICAgICBwZHN0ID0gKHU4X3QqKXJzcDsKCiAgICAgICAgLyogSW50ZXJydXB0IFJzcCAqLwogICAgICAgIHJzcExlbiA9ICh1MTZfdCkgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkU7CgogICAgICAgIGlmIChyc3BMZW4gPiA2MCkKICAgICAgICB7CiAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkdldCBlcnJvciBsZW4gYnkgRVAyID0gXG4iLCByc3BMZW4pOwogICAgICAgICAgICAvKiBmcmVlIFVTQiBidWYgKi8KCSAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKCSAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmb3IgKHJzcGk9MDsgcnNwaTxyc3BMZW47IHJzcGkrKykKICAgICAgICB7CiAgICAgICAgCSpwZHN0ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgcnNwaStaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSk7CiAgICAgICAgCXBkc3QrKzsKICAgICAgICB9CgogICAgICAgIC8vaWYgKGFkYXB0ZXItPnpmY2JVc2JSZWdJbikKICAgICAgICAvLyAgICBhZGFwdGVyLT56ZmNiVXNiUmVnSW4oYWRhcHRlciwgcnNwLCByc3BMZW4pOwogICAgICAgIHpmaVVzYlJlZ0luKGRldiwgcnNwLCByc3BMZW4pOwoKCSAgICAgIC8qIGZyZWUgVVNCIGJ1ZiAqLwoJICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CgkgICAgICByZXR1cm47CiAgICB9CiNlbmRpZiAvKiBlbmQgb2YgI2lmIFpNX0lOVF9VU0VfRVAyID09IDEgKi8KCiAgICBaTV9QRVJGT1JNQU5DRV9SWF9NUERVKGRldiwgYnVmKTsKCiAgICBpZiAod2QtPnN3U25pZmZlcikKICAgIHsKICAgICAgICAvKiBhaXJvcGVlazogUmVwb3J0IGV2ZXJ5dGhpbmcgdXAgKi8KICAgICAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBOVUxMKTsKICAgICAgICB9CiAgICB9CgogICAgLyogUmVhZCB0aGUgbGFzdCBieXRlICovCiAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tMSk7CgogICAgLyogRmlyc3QgTVBEVSAqLwogICAgaWYoKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwKQogICAgewogICAgICAgIHUxNl90IGR1cmF0aW9uOwogICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAzNikgPT0gMCkgLy9BQyA9IEJFCiAgICAgICAgewogICAgICAgICAgICBkdXJhdGlvbiA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBocFByaXYtPmFnZ01heER1cmF0aW9uQkUgPSBkdXJhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChocFByaXYtPmFnZ01heER1cmF0aW9uQkUgPiAxMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBocFByaXYtPmFnZ01heER1cmF0aW9uQkUtLTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL0RiZ1ByaW50KCJhZ2dNYXhEdXJhdGlvbkJFPSVkIiwgaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFKTsKICAgICAgICB9CiAgICB9CgojaWYgMQogICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLwogICAgaWYoKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCkgfHwgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkpCiAgICAvL2lmICgobXBkdUluZCAmIDB4MTApID09IDB4MDApCiAgICB7CiAgICAgICAgcGxjcEhkckxlbiA9IDEyOyAgICAgICAgLy8gUExDUCBoZWFkZXIgbGVuZ3RoCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpID09IHdkLT5tYWNBZGRyWzBdICYmCiAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYpID09IHdkLT5tYWNBZGRyWzFdICYmCiAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDgpID09IHdkLT5tYWNBZGRyWzJdKSB7CiAgICAgICAgICAgIHBsY3BIZHJMZW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNikgPT0gd2QtPm1hY0FkZHJbMF0gJiYKICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCkgPT0gd2QtPm1hY0FkZHJbMV0gJiYKICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCkgPT0gd2QtPm1hY0FkZHJbMl0pewogICAgICAgICAgICBwbGNwSGRyTGVuID0gMTI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwbGNwSGRyTGVuID0gMDsKICAgICAgICB9CiAgICB9CgogICAgLyogTGFzdCBNUERVIG9yIFNpbmdsZSBNUERVICovCiAgICBpZiAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwIHx8IChtcGR1SW5kICYgMHgzMCkgPT0gMHgxMCkKICAgIHsKICAgICAgICBjcmNQbHVzUnhTdGF0dXNMZW4gPSBFWFRSQV9JTkZPX0xFTiArIDQ7ICAgICAvLyBFeHRyYSBieXRlcyArIEZDUwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGNyY1BsdXNSeFN0YXR1c0xlbiA9IDQgKyA0OyAgICAgLy8gRXh0cmEgNCBieXRlcyArIEZDUwogICAgfQojZWxzZQogICAgcGxjcEhkckxlbiA9IDEyOwogICAgY3JjUGx1c1J4U3RhdHVzTGVuID0gRVhUUkFfSU5GT19MRU4gKyA0OyAgICAgLy8gRXh0cmEgYnl0ZXMgKyBGQ1MKI2VuZGlmCgogICAgaWYgKGxlbiA8IChwbGNwSGRyTGVuKzEwK2NyY1BsdXNSeFN0YXR1c0xlbikpCiAgICB7CiAgICAgICAgem1fbXNnMV9yeChaTV9MVl8wLCAiSW52YWxpZCBSeCBsZW5ndGg9IiwgbGVuKTsKICAgICAgICAvL3pmd0R1bXBCdWYoZGV2LCBidWYpOwoKICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogZGlzcGxheSBSU1NJIGNvbWJpbmVkICovCiAgICAvKgogICAgICogonqid6J3oneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneiewogICAgICogonggUExDUCBIZWFkZXIgonggIE1QRFUgIKJ4IFJTU0kgonggIEVWTSCieCBQSFkgRXJyIKJ4ICBNQUMgU3RhdHVzIKJ4CiAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CiAgICAgKiCieCAgICAgMTIgICAgICCieCAgICBuICAgonggIDcgICCieCAgMTIgIKJ4ICAgIDEgICAgonggICAgICA0ICAgICAgongKICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KICAgICAqCVJTU0kgZmlsZWQgKEZyb20gQkIgYW5kIE1BQyBqdXN0IHBhc3MgdGhlbSB0byBob3N0KQogICAgICogICBCeXRlMTogUlNTSSBmb3IgYW50ZW5uYSAwLgogICAgICogICBCeXRlMjogUlNTSSBmb3IgYW50ZW5uYSAxLgogICAgICogICBCeXRlMzogUlNTSSBmb3IgYW50ZW5uYSAyLgogICAgICogICBCeXRlNDogUlNTSSBmb3IgYW50ZW5uYSAwIGV4dGVuc2lvbi4KICAgICAqICAgQnl0ZTU6IFJTU0kgZm9yIGFudGVubmEgMSBleHRlbnNpb24uCiAgICAgKiAgIEJ5dGU2OiBSU1NJIGZvciBhbnRlbm5hIDIgZXh0ZW5zaW9uLgogICAgICogICBCeXRlNzogUlNTSSBmb3IgYW50ZW5uYSBjb21iaW5lZC4KICAgICAqLwoKICAgIC8vem1fZGVidWdfbXNnMSgiIHJlY3YgUlNTSSA9ICIsIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSktMTcpKTsKCiAgICBwYXlsb2FkTGVuID0gemZIcEdldFBheWxvYWRMZW4oZGV2LCBidWYsIGxlbiwgcGxjcEhkckxlbiwgJnJ4TVQsICZyeE1DUywgJnJ4QlcsICZyeFNHKTsKCiAgICAvKiBIYWwgUnggaW5mbyAqLwogICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLwogICAgaWYoKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCkgfHwgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkpCiAgICB7CiAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvICYmIHpmSXNEYXRhRnJhbWUoZGV2LCBidWYpKQogICAgICAgIHsKICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RGF0YU1UICAgPSByeE1UOwogICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhEYXRhTUNTICA9IHJ4TUNTOwogICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhEYXRhQlcgICA9IHJ4Qlc7CiAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeERhdGFTRyAgID0gcnhTRzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKChwbGNwSGRyTGVuICsgcGF5bG9hZExlbikgPiBsZW4pIHsKICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzAsICJJbnZhbGlkIHBheWxvYWQgbGVuZ3RoPSIsIHBheWxvYWRMZW4pOwogICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvL1N0b3JlIFJ4IFRhaWwgSW5mb21hdGlvbiBiZWZvcmUgUmVtb3ZlLS1DV1lhbmcoKykKCiNpZiAwCiAgICBmb3IgKGkgPSAwOyBpIDwgY3JjUGx1c1J4U3RhdHVzTGVuLTQ7IGkrKykKICAgIHsKICAgICAgIGFkZEluZm8uVGFpbC5CeXRlW2ldID0KICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gY3JjUGx1c1J4U3RhdHVzTGVuICsgNCArIGkpOwogICAgfQojZWxzZQovKgoqIEJyaWVmIGZvcm1hdCBvZiBPVVRTIGNoaXAKKiCieqJ3oneid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneid6J7CiogonggUExDUCBIZWFkZXIgonggIE1QRFUgIKJ4IFJTU0kgonggIEVWTSCieCBQSFkgRXJyIKJ4ICBNQUMgU3RhdHVzIKJ4CiogonWid6J3oneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAoqIKJ4ICAgICAxMiAgICAgIKJ4ICAgIG4gICCieCAgNyAgIKJ4ICAxMiAgonggICAgMSAgICCieCAgICAgIDQgICAgICCieAoqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKiBSU1NJOgoqICAgICAgIEJ5dGUgMSAgYW50ZW5uYSAwCiogICAgICAgQnl0ZSAyICBhbnRlbm5hIDEKKiAgICAgICBCeXRlIDMgIGFudGVubmEgMgoqICAgICAgIEJ5dGUgNCAgYW50ZW5uYSAwIGV4dGVuc2lvbgoqICAgICAgIEJ5dGUgNSAgYW50ZW5uYSAxIGV4dGVuc2lvbgoqICAgICAgIEJ5dGUgNiAgYW50ZW5uYSAyIGV4dGVuc2lvbgoqICAgICAgIEJ5dGUgNyAgYW50ZW5uYSBjb21iaW5lZAoqIEVWTToKKiAgICAgICBCeXRlIDEgIFN0cmVhbSAwIHBpbG90IDAKKiAgICAgICBCeXRlIDIgIFN0cmVhbSAwIHBpbG90IDEKKiAgICAgICBCeXRlIDMgIFN0cmVhbSAwIHBpbG90IDIKKiAgICAgICBCeXRlIDQgIFN0cmVhbSAwIHBpbG90IDMKKiAgICAgICBCeXRlIDUgIFN0cmVhbSAwIHBpbG90IDQKKiAgICAgICBCeXRlIDYgIFN0cmVhbSAwIHBpbG90IDUKKiAgICAgICBCeXRlIDcgIFN0cmVhbSAxIHBpbG90IDAKKiAgICAgICBCeXRlIDggIFN0cmVhbSAxIHBpbG90IDEKKiAgICAgICBCeXRlIDkgIFN0cmVhbSAxIHBpbG90IDIKKiAgICAgICBCeXRlIDEwIFN0cmVhbSAxIHBpbG90IDMKKiAgICAgICBCeXRlIDExIFN0cmVhbSAxIHBpbG90IDQKKiAgICAgICBCeXRlIDEyIFN0cmVhbSAxIHBpbG90IDUKKi8KCiAgICAvKiBGaWxsIHRoZSBUYWlsIGluZm9ybWF0aW9uICovCiAgICAvKiBMYXN0IE1QRFUgb3IgU2luZ2xlIE1QRFUgKi8KICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDEwKQogICAgewojZGVmaW5lIFpNX1JYX1JTU0lfQ09NUEVOU0FUSU9OICAgICAyNwogICAgICAgIHU4X3Qgem1fcnhfcnNzaV9jb21wZW5zYXRpb24gPSBaTV9SWF9SU1NJX0NPTVBFTlNBVElPTjsKCiAgICAJLyogUlNTSSBpbmZvcm1hdGlvbiAqLwogICAgICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsCiAgICAgICAgICAgICAgICAobGVuLTEpIC0gMTcpICsgKChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAxKT96bV9yeF9yc3NpX2NvbXBlbnNhdGlvbjowKTsKI3VuZGVmIFpNX1JYX1JTU0lfQ09NUEVOU0FUSU9OCgogICAgICAvKiBFVk0gKi8KCiAgICAgIC8qIFRPRE86IGZvciBSRC9CQiBkZWJ1ZyBtZXNzYWdlICovCiAgICAgIC8qIHNhdmUgY3VycmVudCByeCBodyBpbmZvbXJhdGlvbiwgcmVwb3J0IHRvIERydkNvcmUvQXBwbGljYXRpb24gKi8KICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvICYmIHpmSXNEYXRhRnJhbWUoZGV2LCBidWYpKQogICAgICB7CiAgICAgICAgICAgIHU4X3QgdHJzc2k7CiAgICAgICAgICAgIGZvciAoaT0wOyBpPDc7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJzc2kgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpIC0gMjMgKyBpKTsKCSAgICAgICAgICAgIGlmICh0cnNzaSYweDgwKQoJICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyc3NpID0gKCh+KCh1OF90KXRyc3NpKSAmIDB4N2YpICsgMSkgJiAweDdmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbaV0gPSB0cnNzaTsKCiAgICAgICAgICAgIH0KICAgICAgICAgIGlmIChyeE1UPT0yKQogICAgICAgICAgewogICAgICAgICAgICAvL2lmIChyeEJXKQogICAgICAgICAgICAvL3sKICAgICAgICAgICAgCSAgZm9yIChpPTA7IGk8MTI7IGkrKykKICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1baV0gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpIC0gMTYgKyBpKTsKICAgICAgICAgICAgLy99CiAgICAgICAgICAgIC8vZWxzZQogICAgICAgICAgICAvL3sKICAgICAgICAgICAgLy8JICBmb3IgKGk9MDsgaTw0OyBpKyspCiAgICAgICAgICAgIC8vICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1baV0gPQogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSkgLSAxNiArIGkpOwogICAgICAgICAgICAvL30KICAgICAgICAgIH0KCiAgICAgICAgICAjaWYgMAogICAgICAgICAgLyogcHJpbnQgKi8KICAgICAgICAgICAgem1fZGJnKCgiTVQoJWQpIE1DUyglZCkgQlcoJWQpIFNHKCVkKSBSU1NJOiVkLCVkLCVkLCVkLCVkLCVkLCVkIEVWTTooJWQsJWQsJWQsJWQsJWQsJWQpKCVkLCVkLCVkLCVkLCVkLCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICByeE1ULAogICAgICAgICAgICAgICAgICAgICAgIHJ4TUNTLAogICAgICAgICAgICAgICAgICAgICAgIHJ4QlcsCiAgICAgICAgICAgICAgICAgICAgICAgcnhTRywKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVswXSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVszXSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVs0XSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVs1XSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVs2XSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzFdLAogICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bM10sCiAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzRdLAogICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs1XSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bNl0sCiAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzddLAogICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs4XSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bOV0sCiAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzEwXSwKICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMTFdCiAgICAgICAgICAgICAgICAgICAgICAgKSk7CiAgICAgICAgICAjZW5kaWYKICAgICAgfSAvKiBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8gJiYgemZJc0RhdGFGcmFtZShkZXYsIGJ1ZikpICovCgogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIE1pZCBvciBGaXJzdCBhZ2dyZWdhdGUgZnJhbWUgd2l0aG91dCBwaHkgcnggaW5mb3JtYXRpb24gKi8KICAgICAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDEgPSAwOwogICAgfQoKICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMiA9IDA7CiAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDMgPSAwOwogICAgYWRkSW5mby5UYWlsLkRhdGEuU2lnbmFsUXVhbGl0eSAgID0gMDsKCiAgICBhZGRJbmZvLlRhaWwuRGF0YS5TQUluZGV4ICAgICAgICAgICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDQpOwogICAgYWRkSW5mby5UYWlsLkRhdGEuREFJbmRleCAgICAgICAgICAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4gLSAzKTsKICAgIGFkZEluZm8uVGFpbC5EYXRhLkVycm9ySW5kaWNhdGlvbiAgID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gMik7CiAgICBhZGRJbmZvLlRhaWwuRGF0YS5SeE1hY1N0YXR1cyAgICAgICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDEpOwoKI2VuZGlmCiAgICAvKiBSZW1vdmUgQ1JDIGFuZCBSeCBTdGF0dXMgKi8KICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIChsZW4tY3JjUGx1c1J4U3RhdHVzTGVuKSk7CiAgICAvL3pmd0J1ZlNldFNpemUoZGV2LCBidWYsIHBheWxvYWRMZW4gKyBwbGNwSGRyTGVuKTsgICAgLyogcGF5bG9hZExlbiArIFBMQ1AgMTIgLSBGQ1MgNCovCgogICAgLy9TdG9yZSBQTENQIEhlYWRlciBJbmZvbWF0aW9uIGJlZm9yZSBSZW1vdmUtLUNXWWFuZygrKQogICAgaWYgKHBsY3BIZHJMZW4gIT0gMCkKICAgIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxjcEhkckxlbjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgYWRkSW5mby5QbGNwSGVhZGVyW2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGFkZEluZm8uUGxjcEhlYWRlclswXSA9IDA7CiAgICB9CiAgICAvKiBSZW1vdmUgUExDUCBoZWFkZXIgKi8KICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIHBsY3BIZHJMZW4pOwoKICAgIC8qIGhhbmRsZSA4MDIuMTEgZnJhbWUgKi8KICAgIHpmQ29yZVJlY3YoZGV2LCBidWYsICZhZGRJbmZvKTsKCiNlbHNlCiAgICAvKiBGaXJtd2FyZSBsb29wYmFjazogUnggZnJhbWUgPSBUeCBmcmFtZSAgICAgICAqLwogICAgLyogY29udmVydCBSeCBmcmFtZSB0byBmaXQgcmVjZWl2ZSBmcmFtZSBmb3JtYXQgKi8KICAgIHpidWZfdCAqbmV3X2J1ZjsKICAgIHU4X3QgICAgY3RybF9vZmZzZXQgPSA4OwogICAgdThfdCAgICBQTENQX0xlbiA9IDEyOwogICAgdThfdCAgICBkYXRhOwogICAgdThfdCAgICBpOwoKCiAgICAvKiBUeDogIHwgY3RybF9zZXR0aW5nIHwgTWFjIGhkciB8IGRhdGEgfCAqLwogICAgLyogICAgICAgICAgICA4ICAgICAgICAgICAgMjQgICAgICAgeCAgICAgKi8KCiAgICAvKiBSeDogICAgICAgICAgfCBQTENQIHwgTWFjIGhkciB8IGRhdGEgfCBGQ1MgfCBSeHN0YXR1cyB8ICovCiAgICAvKiAgICAgICAgICAgICAgICAgMTIgICAgICAyNCAgICAgICAgeCAgICAgNCAgICAgICA4ICAgICAgICovCgogICAgLyogbmV3IGFsbG9jYXRlIGEgcnggZm9ybWF0IHNpemUgYnVmICovCiAgICBuZXdfYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS04KzEyKzQrRVhUUkFfSU5GT19MRU4pOwoKICAgIGZvciAoaT0wOyBpPHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLWN0cmxfb2Zmc2V0OyBpKyspCiAgICB7CiAgICAgICAgZGF0YSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGN0cmxfb2Zmc2V0K2kpOwogICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgbmV3X2J1ZiwgUExDUF9MZW4raSwgZGF0YSk7CiAgICB9CgogICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld19idWYsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLTgrMTIrNCtFWFRSQV9JTkZPX0xFTik7CgogICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CgogICAgLyogcmVjZWl2ZSB0aGUgbmV3X2J1ZiAqLwogICAgLy96ZkNvcmVSZWN2KGRldiwgbmV3X2J1Zik7CgojZW5kaWYKCn0KCiNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCnZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCnsKICAgIHUxNl90IGluZGV4ID0gMDsKICAgIHUxNl90IGNoa0lkeDsKICAgIHUzMl90IHN0YXR1cyA9IDA7CiAgICB1MTZfdCBpaTsKICAgIHpidWZfdCAqbmV3QnVmOwogICAgemJ1Zl90ICpyeEJ1ZlBvb2xbOF07CiAgICB1MTZfdCByeEJ1ZlBvb2xJbmRleCA9IDA7CiAgICBzdHJ1Y3QgenNIcFByaXYgKmhhbFByaXY7CiAgICB1OF90ICpzcmNCdWZQdHI7CiAgICB1MzJfdCBidWZmZXJMZW5ndGg7CiAgICB1MTZfdCB1c2JSeFJlbWFpbkxlbjsKICAgIHUxNl90IHVzYlJ4UGt0TGVuOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICBoYWxQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKICAgIHNyY0J1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1Zik7CgogICAgYnVmZmVyTGVuZ3RoID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CgogICAgLyogWmVybyBMZW5ndGggVHJhbnNmZXIgKi8KICAgIGlmICghYnVmZmVyTGVuZ3RoKQogICAgewogICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB1c2JSeFJlbWFpbkxlbiA9IGhhbFByaXYtPnVzYlJ4UmVtYWluTGVuOwogICAgdXNiUnhQa3RMZW4gPSBoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuOwoKICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYW55IGRhdGEgaW4gdGhlIGxhc3QgdHJhbnNmZXIgKi8KICAgIGlmICh1c2JSeFJlbWFpbkxlbiAhPSAwICkKICAgIHsKICAgICAgICB6YnVmX3QgKnJlbWFpbkJ1ZlB0ciA9IGhhbFByaXYtPnJlbWFpbkJ1ZjsKICAgICAgICB1OF90KiBCdWZQdHIgPSBOVUxMOwoKICAgICAgICBpZiAoIHJlbWFpbkJ1ZlB0ciAhPSBOVUxMICkKICAgICAgICB7CiAgICAgICAgICAgIEJ1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIHJlbWFpbkJ1ZlB0cik7CiAgICAgICAgfQoKICAgICAgICBpbmRleCA9IHVzYlJ4UmVtYWluTGVuOwogICAgICAgIHVzYlJ4UmVtYWluTGVuIC09IGhhbFByaXYtPnVzYlJ4UGFkTGVuOwoKICAgICAgICAvKiAgQ29weSBkYXRhICovCiAgICAgICAgaWYgKCBCdWZQdHIgIT0gTlVMTCApCiAgICAgICAgewogICAgICAgICAgICB6ZndNZW1vcnlDb3B5KCYoQnVmUHRyW3VzYlJ4UGt0TGVuXSksIHNyY0J1ZlB0ciwgdXNiUnhSZW1haW5MZW4pOwogICAgICAgIH0KCiAgICAgICAgdXNiUnhQa3RMZW4gKz0gdXNiUnhSZW1haW5MZW47CiAgICAgICAgaGFsUHJpdi0+dXNiUnhSZW1haW5MZW4gPSAwOwoKICAgICAgICBpZiAoIHJlbWFpbkJ1ZlB0ciAhPSBOVUxMICkKICAgICAgICB7CiAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCByZW1haW5CdWZQdHIsIHVzYlJ4UGt0TGVuKTsKICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gcmVtYWluQnVmUHRyOwogICAgICAgIH0KICAgICAgICBoYWxQcml2LT5yZW1haW5CdWYgPSBOVUxMOwogICAgfQoKICAgIC8vem1fZGVidWdfbXNnMSgibGVuZ3RoOiAlZFxuIiwgKGludClwVXNiUnhUcmFuc2Zlci0+cFJ4VXJiLT5VcmJCdWxrT3JJbnRlcnJ1cHRUcmFuc2Zlci5UcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CgogICAgYnVmZmVyTGVuZ3RoID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7Ci8vcHJpbnRrKCJidWZmZXJMZW5ndGggJWRcbiIsIGJ1ZmZlckxlbmd0aCk7CiAgICB3aGlsZShpbmRleCA8IGJ1ZmZlckxlbmd0aCkKICAgIHsKICAgICAgICB1MTZfdCBwa3RMZW47CiAgICAgICAgdTE2X3QgcGt0VGFnOwogICAgICAgIC8vdThfdCAqcHRyID0gKHU4X3QqKSgoc3RydWN0IHpzQnVmZmVyKilwVXNiUnhUcmFuc2Zlci0+YnVmKS0+ZGF0YTsKICAgICAgICB1OF90ICpwdHIgPSBzcmNCdWZQdHI7CgogICAgICAgIC8qIFJldHJpZXZlIHBhY2tldCBsZW5ndGggYW5kIHRhZyAqLwogICAgICAgIHBrdExlbiA9IHB0cltpbmRleF0gKyAocHRyW2luZGV4KzFdIDw8IDgpOwogICAgICAgIHBrdFRhZyA9IHB0cltpbmRleCsyXSArIChwdHJbaW5kZXgrM10gPDwgOCk7CgogICAgICAgIGlmIChwa3RUYWcgPT0gWk1fVVNCX1NUUkVBTV9NT0RFX1RBRykKICAgICAgICB7CiAgICAgICAgICAgIHUxNl90IHBhZExlbjsKCiAgICAgICAgICAgIHptX2Fzc2VydChwa3RMZW4gPCBaTV9XTEFOX01BWF9SWF9TSVpFKTsKCiAgICAgICAgICAgIC8vcHJpbnRrKCJHZXQgYSBwYWNrZXQsIHBrdExlbjogMHglMDR4XG4iLCBwa3RMZW4pOwogICAgICAgICAgICAjaWYgMAogICAgICAgICAgICAvKiBEdW1wIGRhdGEgKi8KICAgICAgICAgICAgZm9yIChpaSA9IGluZGV4OyBpaSA8IHBrdF9sZW4rNDspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweCUwMnggIiwKICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoYWRhcHRlciwgcFVzYlJ4VHJhbnNmZXItPmJ1ZiwgaWkpICYgMHhmZikpOwoKICAgICAgICAgICAgICAgIGlmICgoKytpaSAlIDE2KSA9PSAwKQogICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCJcbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBEYmdQcmludCgiXG4iKTsKICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAvKiBDYWxjdWF0ZSB0aGUgcGFkZGluZyBsZW5ndGgsIGluIHRoZSBjdXJyZW50IGRlc2lnbiwKICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBzaG91bGQgYmUgcGFkZGVkIHRvIDQgYnl0ZSBib3VuZHJheS4gKi8KICAgICAgICAgICAgcGFkTGVuID0gWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU4gLSAocGt0TGVuICYgMHgzKTsKCiAgICAgICAgICAgIGlmKHBhZExlbiA9PSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTikKICAgICAgICAgICAgICAgIHBhZExlbiA9IDA7CgogICAgICAgICAgICBjaGtJZHggPSBpbmRleDsKICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOICsgcGt0TGVuICsgcGFkTGVuOwoKICAgICAgICAgICAgaWYgKGNoa0lkeCA+IFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY2hrSWR4IGlzIHRvbyBsYXJnZSwgY2hrSWR4OiAlZFxuIiwgY2hrSWR4KTsKICAgICAgICAgICAgICAgIHptX2Fzc2VydCgwKTsKICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGluZGV4ID4gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3N0cnVjdCB6c0J1ZmZlciogQnVmUHRyOwogICAgICAgICAgICAgICAgLy9zdHJ1Y3QgenNCdWZmZXIqIFVzYkJ1ZlB0cjsKICAgICAgICAgICAgICAgIHU4X3QgKkJ1ZlB0cjsKICAgICAgICAgICAgICAgIHU4X3QgKlVzYkJ1ZlB0cjsKCiAgICAgICAgICAgICAgICBoYWxQcml2LT51c2JSeFJlbWFpbkxlbiA9IGluZGV4IC0gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFOyAvLyAtIHBhZExlbjsKICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4gPSBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkUgLQogICAgICAgICAgICAgICAgICAgICAgICBjaGtJZHggLSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTjsKICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4UGFkTGVuID0gcGFkTGVuOwogICAgICAgICAgICAgICAgLy9jaGVja19pbmRleCA9IGluZGV4OwoKICAgICAgICAgICAgICAgIGlmIChoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuID4gWk1fV0xBTl9NQVhfUlhfU0laRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjaGVja19sZW4gaXMgdG9vIGxhcmdlLCBjaGtfbGVuOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4pOwogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCiAgICAgICAgICAgICAgICBuZXdCdWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX1dMQU5fTUFYX1JYX1NJWkUpOwoKICAgICAgICAgICAgICAgIGlmICggbmV3QnVmICE9IE5VTEwgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEJ1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIG5ld0J1Zik7CiAgICAgICAgICAgICAgICAgICAgVXNiQnVmUHRyID0gc3JjQnVmUHRyOwoKICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICB6ZndNZW1vcnlDb3B5KEJ1ZlB0ciwgJihVc2JCdWZQdHJbY2hrSWR4K1pNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOXSksIGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4pOwoKICAgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQgdGhlIGJ1ZmZlciBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgaGFsUHJpdi0+cmVtYWluQnVmID0gbmV3QnVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdThfdCogQnVmUHRyOwogICAgICAgICAgICAgICAgdThfdCogVXNiQnVmUHRyOwoKICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgbmV3QnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9XTEFOX01BWF9SWF9TSVpFKTsKICAgICAgICAgICAgICAgIGlmICggbmV3QnVmICE9IE5VTEwgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEJ1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIG5ld0J1Zik7CiAgICAgICAgICAgICAgICAgICAgVXNiQnVmUHRyID0gc3JjQnVmUHRyOwoKICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICB6ZndNZW1vcnlDb3B5KEJ1ZlB0ciwgJihVc2JCdWZQdHJbY2hrSWR4K1pNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOXSksIHBrdExlbik7CgogICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBuZXdCdWYsIHBrdExlbik7CiAgICAgICAgICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gbmV3QnVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICAgICB1MTZfdCBpOwoKICAgICAgICAgICAgICAgIERiZ1ByaW50KCJDYW4ndCBmaW5kIHRhZywgcGt0X2xlbjogMHglMDR4LCB0YWc6IDB4JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcGt0TGVuLCBwa3RUYWcpOwoKICAgICAgICAgICAgICAgICNpZiAwCiAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCIlMDJ4ICIsIGJ1Zi0+ZGF0YVtpbmRleC0xNitpXSk7CgogICAgICAgICAgICAgICAgICAgIGlmICgoaSAmIDB4ZikgPT0gMHhmKQogICAgICAgICAgICAgICAgICAgICAgICBEYmdQcmludCgiXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBGcmVlIGJ1ZmZlciAqLwogICAgLy96ZndCdWZGcmVlKGFkYXB0ZXIsIHBVc2JSeFRyYW5zZmVyLT5idWYsIDApOwogICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CgogICAgZm9yKGlpID0gMDsgaWkgPCByeEJ1ZlBvb2xJbmRleDsgaWkrKykKICAgIHsKICAgICAgICB6ZmlVc2JSZWN2UGVyUGt0KGRldiwgcnhCdWZQb29sW2lpXSk7CiAgICB9Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmVXNiSW5pdCAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIEluaXRpYWxpemUgVVNCIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHpmVXNiSW5pdCh6ZGV2X3QqIGRldikKewogICAgLyogSW5pdGlhbGl6ZSBSeCAmIElOVCBlbmRwb2ludCBmb3IgcmVjZWl2aW5nIGRhdGEgJiBpbnRlcnJ1cHQgKi8KICAgIHpmd1VzYkVuYWJsZVJ4RXB0KGRldiwgVVNCX0VORFBPSU5UX1JYX0lOREVYKTsKICAgIHpmd1VzYkVuYWJsZUludEVwdChkZXYsIFVTQl9FTkRQT0lOVF9JTlRfSU5ERVgpOwoKICAgIHJldHVybjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZVc2JGcmVlICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgRnJlZSBQQ0kgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTIgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZVc2JGcmVlKHpkZXZfdCogZGV2KQp7CiAgICBzdHJ1Y3QgenNIcFByaXYgKmhhbFByaXY7CgogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIGhhbFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOwoKI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKICAgIGlmICggaGFsUHJpdi0+cmVtYWluQnVmICE9IE5VTEwgKQogICAgewogICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBoYWxQcml2LT5yZW1haW5CdWYsIDApOwogICAgfQojZW5kaWYKCiAgICByZXR1cm47Cn0KCnZvaWQgemZIcFNlbmRCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBsZW4pCnsKICAgIHUzMl90IGh3LCBsdzsKICAgIHUxNl90IGk7CiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CgogICAgLyogV3JpdGUgdG8gYmVhY29uIGJ1ZmZlciAoWk1fQkVBQ09OX0JVRkZFUl9BRERSRVNTKSAqLwogICAgZm9yIChpID0gMDsgaTxsZW47IGkrPTQpCiAgICB7CiAgICAgICAgbHcgPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKICAgICAgICBodyA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIGkrMik7CgogICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fQkVBQ09OX0JVRkZFUl9BRERSRVNTK2ksIChodzw8MTYpK2x3KTsKICAgIH0KCiAgICAvKiBCZWFjb24gUENMUCBoZWFkZXIgKi8KICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5IDwgMzAwMCkKICAgIHsKICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUExDUCwgKChsZW4rNCk8PCgzKzE2KSkrMHgwNDAwKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BMQ1AsICgobGVuKzQpPDwoMTYpKSsweDAwMWIpOwogICAgfQoKICAgIC8qIEJlYWNvbiBsZW5ndGggKGluY2x1ZGUgQ1JDMzIpICovCiAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0xFTkdUSCwgbGVuKzQpOwoKICAgIC8qIEJlYWNvbiBSZWFkeSAqLwogICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9DVFJMLCAxKTsKICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CgogICAgLyogRnJlZSBiZWFjb24gYnVmICovCiAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKCiAgICByZXR1cm47Cn0KCgojZGVmaW5lIFpNX1NUQVRVU19UWF9DT01QICAgICAgIDB4MDAKI2RlZmluZSBaTV9TVEFUVVNfUkVUUllfQ09NUCAgICAweDAxCiNkZWZpbmUgWk1fU1RBVFVTX1RYX0ZBSUxFRCAgICAgMHgwMgp2b2lkIHpmaVVzYlJlZ0luKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pCnsKICAgIC8vdThfdCBsZW4sIHR5cGUsIGk7CiAgICB1OF90IHR5cGU7CiAgICB1OF90ICp1OHJzcDsKICAgIHUxNl90IHN0YXR1czsKICAgIHUzMl90IGJpdG1hcDsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJ6ZmlVc2JSZWdJbigpIik7CgogICAgdThyc3AgPSAodThfdCAqKXJzcDsKCiAgICAvL2xlbiA9ICp1OHJzcDsKICAgIHR5cGUgPSAqKHU4cnNwKzEpOwogICAgdThyc3AgPSB1OHJzcCs0OwoKCiAgICAvKiBJbnRlcnJ1cHQgZXZlbnQgKi8KICAgIGlmICgodHlwZSAmIDB4QzApID09IDB4QzApCiAgICB7CiAgICAgICAgaWYgKHR5cGUgPT0gMHhDMCkKICAgICAgICB7CiAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgMCwgdThyc3ApOwoKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEMxKQogICAgICAgIHsKI2lmIDAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdTE2X3QgaTsKICAgICAgICAgICAgICAgIERiZ1ByaW50KCJyc3BMZW49JWRcbiIsIHJzcExlbik7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwocnNwTGVuLzQpOyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoInJzcFslZF09MHglbHhcbiIsIGksIHJzcFtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgIHN0YXR1cyA9ICh1MTZfdCkocnNwWzNdID4+IDE2KTsKCiAgICAgICAgICAgIC8vLy82Nzg5CiAgICAgICAgICAgIHJzcFs4XSA9IHJzcFs4XSA+PiAyIHwgKHJzcFs5XSAmIDB4MSkgPDwgNjsKICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBaTV9TVEFUVVNfUkVUUllfQ09NUCA6CiAgICAgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDEsIHU4cnNwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFpNX1NUQVRVU19UWF9GQUlMRUQgOgogICAgICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCAyLCB1OHJzcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBaTV9TVEFUVVNfVFhfQ09NUCA6CiAgICAgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDMsIHU4cnNwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDMikKICAgICAgICB7CiAgICAgICAgICAgIHpmQmVhY29uQ2ZnSW50ZXJydXB0KGRldiwgdThyc3ApOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzMpCiAgICAgICAgewogICAgICAgICAgICB6ZkVuZE9mQXRpbVdpbmRvd0ludGVycnVwdChkZXYpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzQpCiAgICAgICAgewojaWYgMAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1MTZfdCBpOwogICAgICAgICAgICAgICAgRGJnUHJpbnQoIjB4QzI6cnNwTGVuPSVkXG4iLCByc3BMZW4pOwogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KHJzcExlbi80KTsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweEMyOnJzcFslZF09MHglbHhcbiIsIGksIHJzcFtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgIGJpdG1hcCA9IChyc3BbMV0gPj4gMTYpICsgKChyc3BbMl0gJiAweEZGRkYpIDw8IDE2ICk7CiAgICAgICAgICAgIC8vemZCYXdDb3JlKGRldiwgKHUxNl90KXJzcFsxXSAmIDB4RkZGRiwgYml0bWFwLCAodTE2X3QpKHJzcFsyXSA+PiAxNikgJiAweEZGKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM1KQogICAgICAgIHsKICAgICAgICAgICAgdTE2X3QgaTsKI2lmIDAKCiAgICAgICAgICAgIGZvciAoaT0wOyBpPChyc3BMZW4vNCk7IGkrKykgewogICAgICAgICAgICAgICAgRGJnUHJpbnQoIjB4QzU6cnNwWyVkXT0weCVseFxuIiwgaSwgcnNwW2ldKTsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgZm9yIChpPTE7IGk8KHJzcExlbi80KTsgaSsrKSB7CiAgICAgICAgICAgICAgICB1OHJzcCA9ICh1OF90ICopKHJzcCtpKTsKICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIjB4QzU6cnNwWyVkXT0weCVseFxuIiwgaSwgKCh1MzJfdCopdThyc3ApWzBdKTsKICAgICAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgNCwgdThyc3ApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDNikKICAgICAgICB7CiAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlxuXG4gV2F0Y2hEb2cgaW50ZXJydXB0ISEhIDogMHhDNiBcblxuIik7CiAgICAgICAgICAgIGlmICh3ZC0+emZjYkh3V2F0Y2hEb2dOb3RpZnkgIT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2QtPnpmY2JId1dhdGNoRG9nTm90aWZ5KGRldik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM4KQogICAgICAgIHsKICAgICAgICAgICAgLy9QWlNXX0FEQVBURVIgYWRhcHRlcjsKCiAgICAgICAgICAgIC8vIGZvciBTUEkgZmxhc2ggcHJvZ3JhbSBjaGsgRmxhZwogICAgICAgICAgICB6ZndEYmdQcm9ncmFtZUZsYXNoQ2hrRG9uZShkZXYpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzkpCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOwoKICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiIyMjIyMgVHggcmV0cmFuc21pc3Npb24gNSB0aW1lcyBldmVudCAjIyMjIyIpOwoKICAgICAgICAgICAgLyogY29ycmVjdCB0eCByZXRyYW5zbWlzc2lvbiBpc3N1ZSAqLwogICAgICAgICAgICBocFByaXYtPnJldHJhbnNtaXNzaW9uRXZlbnQgPSAxOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB6ZklkbFJzcChkZXYsIHJzcCwgcnNwTGVuKTsKICAgIH0KfQoKCiNkZWZpbmUgWk1fUFJPR1JBTV9SQU1fQUREUiAgICAgMHgyMDAwMDAgLy8weDEwMDAgLy8weDcwMDAwMAojZGVmaW5lIEZJUk1XQVJFX0RPV05MT0FEICAgICAgIDB4MzAKI2RlZmluZSBGSVJNV0FSRV9ET1dOTE9BRF9DT01QICAweDMxCiNkZWZpbmUgRklSTVdBUkVfQ09ORklSTSAgICAgICAgMHgzMgoKdTE2X3QgemZGaXJtd2FyZURvd25sb2FkKHpkZXZfdCogZGV2LCB1MzJfdCogZncsIHUzMl90IGxlbiwgdTMyX3Qgb2Zmc2V0KQp7CiAgICB1MTZfdCByZXQgPSBaTV9TVUNDRVNTOwogICAgdTMyX3QgdUNvZGVPZnN0ID0gb2Zmc2V0OwogICAgdThfdCAqaW1hZ2UsICpwdHI7CiAgICB1MzJfdCByZXN1bHQ7CgogICAgaW1hZ2UgPSAodThfdCopIGZ3OwogICAgcHRyID0gaW1hZ2U7CgogICAgd2hpbGUgKGxlbiA+IDApCiAgICB7CiAgICAgICAgdTMyX3QgdHJhbnNsZW4gPSAobGVuID4gNDA5NikgPyA0MDk2IDogbGVuOwoKICAgICAgICByZXN1bHQgPSB6ZndVc2JTdWJtaXRDb250cm9sKGRldiwgRklSTVdBUkVfRE9XTkxPQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QpICh1Q29kZU9mc3QgPj4gOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbWFnZSwgdHJhbnNsZW4pOwoKICAgICAgICBpZiAocmVzdWx0ICE9IFpNX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkZJUk1XQVJFX0RPV05MT0FEIGZhaWxlZCIpOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgfQoKICAgICAgICBsZW4gLT0gdHJhbnNsZW47CiAgICAgICAgaW1hZ2UgKz0gdHJhbnNsZW47CiAgICAgICAgdUNvZGVPZnN0ICs9IHRyYW5zbGVuOyAvLyBpbiBXb3JkICgxNiBiaXQpCgogICAgICAgIHJlc3VsdCA9IDA7CiAgICB9CgogICAgLyogSWYgZG93bmxvYWQgZmlybXdhcmUgc3VjY2VzcywgaXNzdWUgYSBjb21tYW5kIHRvIGZpcm13YXJlICovCiAgICBpZiAocmV0ID09IDApCiAgICB7CiAgICAgICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0RPV05MT0FEX0NPTVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLCAwKTsKCiAgICAgICAgaWYgKHJlc3VsdCAhPSBaTV9TVUNDRVNTKQogICAgICAgIHsKICAgICAgICAgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJGSVJNV0FSRV9ET1dOTE9BRF9DT01QIGZhaWxlZCIpOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgfQogICAgfQoKI2lmIDAKICAgIC8qIFBDSSBjb2RlICovCiAgICAvKiBXYWl0IGZvciBmaXJtd2FyZSByZWFkeSAqLwogICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0NPTkZJUk0sIFVTQl9ESVJfSU4gfCAweDQwLAogICAgICAgICAgICAgICAgICAgICAwLCAwLCAmcmV0X3ZhbHVlLCBzaXplb2YocmV0X3ZhbHVlKSwgSFopOwoKICAgIGlmIChyZXN1bHQgIT0gMCkKICAgIHsKICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkNhbid0IHJlY2VpdmUgZmlybXdhcmUgcmVhZHk6ICIsIHJlc3VsdCk7CiAgICAgICAgcmV0ID0gMTsKICAgIH0KI2VuZGlmCgpleGl0OgoKICAgIHJldHVybiByZXQ7Cgp9Cgp1MTZfdCB6ZkZpcm13YXJlRG93bmxvYWROb3RKdW1wKHpkZXZfdCogZGV2LCB1MzJfdCogZncsIHUzMl90IGxlbiwgdTMyX3Qgb2Zmc2V0KQp7CiAgICB1MTZfdCByZXQgPSBaTV9TVUNDRVNTOwogICAgdTMyX3QgdUNvZGVPZnN0ID0gb2Zmc2V0OwogICAgdThfdCAqaW1hZ2UsICpwdHI7CiAgICB1MzJfdCByZXN1bHQ7CgogICAgaW1hZ2UgPSAodThfdCopIGZ3OwogICAgcHRyID0gaW1hZ2U7CgogICAgd2hpbGUgKGxlbiA+IDApCiAgICB7CiAgICAgICAgdTMyX3QgdHJhbnNsZW4gPSAobGVuID4gNDA5NikgPyA0MDk2IDogbGVuOwoKICAgICAgICByZXN1bHQgPSB6ZndVc2JTdWJtaXRDb250cm9sKGRldiwgRklSTVdBUkVfRE9XTkxPQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QpICh1Q29kZU9mc3QgPj4gOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbWFnZSwgdHJhbnNsZW4pOwoKICAgICAgICBpZiAocmVzdWx0ICE9IFpNX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkZJUk1XQVJFX0RPV05MT0FEIGZhaWxlZCIpOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgfQoKICAgICAgICBsZW4gLT0gdHJhbnNsZW47CiAgICAgICAgaW1hZ2UgKz0gdHJhbnNsZW47CiAgICAgICAgdUNvZGVPZnN0ICs9IHRyYW5zbGVuOyAvLyBpbiBXb3JkICgxNiBiaXQpCgogICAgICAgIHJlc3VsdCA9IDA7CiAgICB9CgpleGl0OgoKICAgIHJldHVybiByZXQ7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmSWRsR2V0RnJlZVR4ZENvdW50ICAgICAgICAqLwovKiAgICAgIEdldCBmcmVlIFBDSSBQQ0kgVHhEIGNvdW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1MzJfdCB6ZkhwR2V0RnJlZVR4ZENvdW50KHpkZXZfdCogZGV2KQp7CiAgICByZXR1cm4gemZ3VXNiR2V0RnJlZVR4UVNpemUoZGV2KTsKfQoKdTMyX3QgemZIcEdldE1heFR4ZENvdW50KHpkZXZfdCogZGV2KQp7CiAgICAvL3JldHVybiA4OwogICAgcmV0dXJuIHpmd1VzYkdldE1heFR4UVNpemUoZGV2KTsKfQoKdm9pZCB6ZmlVc2JSZWdPdXRDb21wbGV0ZSh6ZGV2X3QqIGRldikKewogICAgcmV0dXJuOwp9CgpleHRlcm4gdm9pZCB6ZlB1c2hWdHhxKHpkZXZfdCogZGV2KTsKCnZvaWQgemZpVXNiT3V0Q29tcGxldGUoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90IHN0YXR1cywgdThfdCAqaGRyKSB7CiNpZm5kZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCiAgICBpZiAoYnVmKSB7CiAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CiAgICB9CiNlbHNlCiAgICAjaWZkZWYgWk1fQllQQVNTX0FHR1JfU0NIRURVTElORwogICAgLy9TaW1wbHkgZnJlZSB0aGUgYnVmIHNpbmNlIEJBIHJldHJhbnNtaXNzaW9uIGlzIGRvbmUgaW4gdGhlIGZpcm13YXJlCiAgICBpZiAoYnVmKQogICAgewogICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOwogICAgfQogICAgemZQdXNoVnR4cShkZXYpOwogICAgI2Vsc2UKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAjaWZkZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCiAgICAvL1NpbXBseSBmcmVlIHRoZSBidWYgc2luY2UgQkEgcmV0cmFuc21pc3Npb24gaXMgZG9uZSBpbiB0aGUgZmlybXdhcmUKICAgIGlmIChidWYpCiAgICB7CiAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CiAgICB9CiAgICAjZWxzZQogICAgdThfdCBhZ2c7CiAgICB1MTZfdCBmcmFtZVR5cGU7CgogICAgaWYoIWhkciAmJiBidWYpIHsKICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKICAgICAgICAvL3ptX2RlYnVnX21zZzAoImJ1ZiBGcmVlIGR1ZSB0byBoZHIgPT0gTlVMTCIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZihoZHIgJiYgYnVmKSB7CiAgICAgICAgZnJhbWVUeXBlID0gaGRyWzhdICYgMHhmOwogICAgICAgIGFnZyA9ICh1OF90KShoZHJbMl0gPj4gNSApICYgMHgxOwogICAgICAgIC8vem1fZGVidWdfbXNnMSgiQUdHPSIsIGFnZyk7CgogICAgICAgIGlmICghc3RhdHVzKSB7CiAgICAgICAgICAgIGlmIChhZ2cpIHsKICAgICAgICAgICAgICAgIC8vZGVsZXRlIGJ1ZiBpbiBiYSBmYWlsIHF1ZXVlPz8KICAgICAgICAgICAgICAgIC8vbm90IGdhbm5hIGhhcHBlbj8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoYWdnKSB7CiAgICAgICAgICAgICAgICAvL2Rvbid0IGRvIGFueXRoaW5nCiAgICAgICAgICAgICAgICAvL3pmd0J1ZkZyZWUoZGV2LCBidWYsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjZW5kaWYKCiAgICBpZiAod2QtPnN0YXRlICE9IFpNX1dMQU5fU1RBVEVfRU5BQkxFRCkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB8fAogICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAogICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pICkgewogICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKICAgIH0KICAgICNlbmRpZgojZW5kaWYKCiAgICByZXR1cm47Cgp9Cgo=