LyoKICogIFVEUCBNSUIgZ3JvdXAgVGFibGUgaW1wbGVtZW50YXRpb24gLSB1ZHBUYWJsZS5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlICJtaWJJSV9jb21tb24uaCIKCiNpZiBIQVZFX05FVElORVRfVURQX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHBfdmFyLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2lmZGVmIGxpbnV4CiNpbmNsdWRlICJ0Y3BUYWJsZS5oIgojZW5kaWYKI2luY2x1ZGUgInVkcC5oIgojaW5jbHVkZSAidWRwVGFibGUuaCIKI2luY2x1ZGUgInN5c09SVGFibGUuaCIKCiNpZmRlZiBocHV4MTEKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW1pYl91ZHBMc25FbnQgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxBRERSRVNTCUxvY2FsQWRkcmVzcyAKI2RlZmluZQlVRFBUQUJMRV9MT0NBTFBPUlQJTG9jYWxQb3J0IAojZGVmaW5lCVVEUFRBQkxFX0lTX1RBQkxFCiNlbHNlCgojaWZkZWYgc29sYXJpczIKdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF91ZHBFbnRyeV9zIG5ldHNubXBfdWRwRW50cnk7CnN0cnVjdCBuZXRzbm1wX3VkcEVudHJ5X3MgewogICAgbWliMl91ZHBFbnRyeV90ICAgZW50cnk7CiAgICBuZXRzbm1wX3VkcEVudHJ5ICppbnBfbmV4dDsKfTsKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW5ldHNubXBfdWRwRW50cnkKI2RlZmluZQlVRFBUQUJMRV9MT0NBTEFERFJFU1MJZW50cnkudWRwTG9jYWxBZGRyZXNzIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAllbnRyeS51ZHBMb2NhbFBvcnQgCiNkZWZpbmUJVURQVEFCTEVfSVNfTElOS0VEX0xJU1QKI2Vsc2UKCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQojaW5jbHVkZSA8aXBobHBhcGkuaD4KI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCU1JQl9VRFBST1cJCS8qID8/PyAqLwojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMQUREUkVTUwlkd0xvY2FsQWRkcgojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAlkd0xvY2FsUG9ydCAKI2RlZmluZQlVRFBUQUJMRV9JU19UQUJMRQojZWxzZQkJCS8qIGV2ZXJ5dGhpbmcgZWxzZSAqLwoKI2lmZGVmIGxpbnV4CiNkZWZpbmUgSU5QX05FWFRfU1lNQk9MCQlpbnBfbmV4dAojZW5kaWYKI2lmZGVmIG9wZW5ic2Q0CiNkZWZpbmUgSU5QX05FWFRfU1lNQk9MCQlpbnBfcXVldWUuY3FlX25leHQJLyogb3Igc2V0IHZpYSA8bmV0LXNubXAvc3lzdGVtL29wZW5ic2QuaD4gKi8KI2VuZGlmCgojaWYgZGVmaW5lZChmcmVlYnNkNCkgfHwgZGVmaW5lZChkYXJ3aW4pIHx8IGRlZmluZWQob3NmNSkKdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9pbnBjYl9zIG5ldHNubXBfaW5wY2I7CnN0cnVjdCBuZXRzbm1wX2lucGNiX3MgewogICAgc3RydWN0IGlucGNiICAgIHBjYjsKICAgIGludCAgICAgICAgICAgICBzdGF0ZTsKICAgIG5ldHNubXBfaW5wY2IgICppbnBfbmV4dDsKfTsKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW5ldHNubXBfaW5wY2IgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxBRERSRVNTCXBjYi5pbnBfbGFkZHIuc19hZGRyIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAlwY2IuaW5wX2xwb3J0CiNlbHNlCiNkZWZpbmUJVURQVEFCTEVfRU5UUllfVFlQRQlzdHJ1Y3QgaW5wY2IgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxBRERSRVNTCWlucF9sYWRkci5zX2FkZHIgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxQT1JUCWlucF9scG9ydAojZW5kaWYKI2RlZmluZQlVRFBUQUJMRV9JU19MSU5LRURfTElTVAoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKCQkJCS8qIEhlYWQgb2YgbGlua2VkIGxpc3QsIG9yIHJvb3Qgb2YgdGFibGUgKi8KVURQVEFCTEVfRU5UUllfVFlQRQkqdWRwX2hlYWQgID0gTlVMTDsKaW50ICAgICAgICAgICAgICAgICAgICAgIHVkcF9zaXplICA9IDA7CS8qIE9ubHkgdXNlZCBmb3IgdGFibGUtYmFzZWQgc3lzdGVtcyAqLwoKCgkvKgoJICoKCSAqIEluaXRpYWxpemF0aW9uIGFuZCBoYW5kbGVyIHJvdXRpbmVzIGFyZSBjb21tb24gdG8gYWxsIGFyY2hpdGVjdHVyZXMKCSAqCgkgKi8KI2lmbmRlZiBNSUJfU1RBVFNfQ0FDSEVfVElNRU9VVAojZGVmaW5lIE1JQl9TVEFUU19DQUNIRV9USU1FT1VUCTUKI2VuZGlmCiNpZm5kZWYgVURQX1NUQVRTX0NBQ0hFX1RJTUVPVVQKI2RlZmluZSBVRFBfU1RBVFNfQ0FDSEVfVElNRU9VVAlNSUJfU1RBVFNfQ0FDSEVfVElNRU9VVAojZW5kaWYKCiNpZmRlZiBVRFBfQUREUkVTU0VTX0lOX0hPU1RfT1JERVIKI2RlZmluZSBVRFBfQUREUkVTU19UT19IT1NUX09SREVSKHgpIHgKI2RlZmluZSBVRFBfQUREUkVTU19UT19ORVRXT1JLX09SREVSKHgpIGh0b25sKHgpCiNlbHNlCiNkZWZpbmUgVURQX0FERFJFU1NfVE9fSE9TVF9PUkRFUih4KSBudG9obCh4KQojZGVmaW5lIFVEUF9BRERSRVNTX1RPX05FVFdPUktfT1JERVIoeCkgeAojZW5kaWYKCiNpZmRlZiBVRFBfUE9SVFNfSU5fSE9TVF9PUkRFUgojZGVmaW5lIFVEUF9QT1JUX1RPX0hPU1RfT1JERVIoeCkgeAojZWxzZQojZGVmaW5lIFVEUF9QT1JUX1RPX0hPU1RfT1JERVIoeCkgbnRvaHMoeCkKI2VuZGlmCgoKb2lkICAgICAgICAgICAgIHVkcFRhYmxlX29pZFtdID0geyBTTk1QX09JRF9NSUIyLCA3LCA1IH07Cgp2b2lkCmluaXRfdWRwVGFibGUodm9pZCkKewogICAgbmV0c25tcF90YWJsZV9yZWdpc3RyYXRpb25faW5mbyAqdGFibGVfaW5mbzsKICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAgICAgICAgICAgKmlpbmZvOwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAgICAqcmVnaW5mbzsKICAgIGludCByYzsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiSW5pdGlhbGlzaW5nIFVEUCBUYWJsZVxuIikpOwogICAgLyoKICAgICAqIENyZWF0ZSB0aGUgdGFibGUgZGF0YSBzdHJ1Y3R1cmUsIGFuZCBkZWZpbmUgdGhlIGluZGV4aW5nLi4uLgogICAgICovCiAgICB0YWJsZV9pbmZvID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvKTsKICAgIGlmICghdGFibGVfaW5mbykgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG5ldHNubXBfdGFibGVfaGVscGVyX2FkZF9pbmRleGVzKHRhYmxlX2luZm8sIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fSU5URUdFUiwgMCk7CiAgICB0YWJsZV9pbmZvLT5taW5fY29sdW1uID0gVURQTE9DQUxBRERSRVNTOwogICAgdGFibGVfaW5mby0+bWF4X2NvbHVtbiA9IFVEUExPQ0FMUE9SVDsKCgogICAgLyoKICAgICAqIC4uLi4gYW5kIGl0ZXJhdGlvbiBpbmZvcm1hdGlvbiAuLi4uCiAgICAgKi8KICAgIGlpbmZvICAgICAgPSBTTk1QX01BTExPQ19UWVBFREVGKG5ldHNubXBfaXRlcmF0b3JfaW5mbyk7CiAgICBpZiAoIWlpbmZvKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWluZm8tPmdldF9maXJzdF9kYXRhX3BvaW50ID0gdWRwVGFibGVfZmlyc3RfZW50cnk7CiAgICBpaW5mby0+Z2V0X25leHRfZGF0YV9wb2ludCAgPSB1ZHBUYWJsZV9uZXh0X2VudHJ5OwogICAgaWluZm8tPnRhYmxlX3JlZ2luZm8gICAgICAgID0gdGFibGVfaW5mbzsKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICBpaW5mby0+ZmxhZ3MgICAgICAgICAgICAgICB8PSBORVRTTk1QX0lURVJBVE9SX0ZMQUdfU09SVEVEOwojZW5kaWYgLyogV0lOMzIgfHwgY3lnd2luICovCgoKICAgIC8qCiAgICAgKiAuLi4uIGFuZCByZWdpc3RlciB0aGUgdGFibGUgd2l0aCB0aGUgYWdlbnQuCiAgICAgKi8KICAgIHJlZ2luZm8gPSBuZXRzbm1wX2NyZWF0ZV9oYW5kbGVyX3JlZ2lzdHJhdGlvbigidWRwVGFibGUiLAogICAgICAgICAgICB1ZHBUYWJsZV9oYW5kbGVyLAogICAgICAgICAgICB1ZHBUYWJsZV9vaWQsIE9JRF9MRU5HVEgodWRwVGFibGVfb2lkKSwKICAgICAgICAgICAgSEFORExFUl9DQU5fUk9OTFkpLAogICAgcmMgPSBuZXRzbm1wX3JlZ2lzdGVyX3RhYmxlX2l0ZXJhdG9yKHJlZ2luZm8sIGlpbmZvKTsKICAgIGlmIChyYyAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgcmV0dXJuOwoKICAgIC8qCiAgICAgKiAuLi4uIHdpdGggYSBsb2NhbCBjYWNoZQogICAgICovCiAgICBuZXRzbm1wX2luamVjdF9oYW5kbGVyKCByZWdpbmZvLAoJCSAgICBuZXRzbm1wX2dldF9jYWNoZV9oYW5kbGVyKFVEUF9TVEFUU19DQUNIRV9USU1FT1VULAoJCQkgICAJCXVkcFRhYmxlX2xvYWQsIHVkcFRhYmxlX2ZyZWUsCgkJCQkJdWRwVGFibGVfb2lkLCBPSURfTEVOR1RIKHVkcFRhYmxlX29pZCkpKTsKfQoKCgppbnQKdWRwVGFibGVfaGFuZGxlcihuZXRzbm1wX21pYl9oYW5kbGVyICAgICAgICAgICpoYW5kbGVyLAogICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gICAqcmVxaW5mbywKICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAgICAgICAgICpyZXF1ZXN0cykKewogICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gICpyZXF1ZXN0OwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICpyZXF1ZXN0dmI7CiAgICBuZXRzbm1wX3RhYmxlX3JlcXVlc3RfaW5mbyAqdGFibGVfaW5mbzsKICAgIFVEUFRBQkxFX0VOVFJZX1RZUEUJICAqZW50cnk7CiAgICBvaWQgICAgICBzdWJpZDsKICAgIGxvbmcgICAgIHBvcnQ7CiAgICBpbl9hZGRyX3QgYWRkcjsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiSGFuZGxlciAtIG1vZGUgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc2VfZmluZF9sYWJlbF9pbl9zbGlzdCgiYWdlbnRfbW9kZSIsIHJlcWluZm8tPm1vZGUpKSk7CiAgICBzd2l0Y2ggKHJlcWluZm8tPm1vZGUpIHsKICAgIGNhc2UgTU9ERV9HRVQ6CiAgICAgICAgZm9yIChyZXF1ZXN0PXJlcXVlc3RzOyByZXF1ZXN0OyByZXF1ZXN0PXJlcXVlc3QtPm5leHQpIHsKICAgICAgICAgICAgcmVxdWVzdHZiID0gcmVxdWVzdC0+cmVxdWVzdHZiOwogICAgICAgICAgICBERUJVR01TR1RMKCggIm1pYklJL3VkcFRhYmxlIiwgIm9pZDogIikpOwogICAgICAgICAgICBERUJVR01TR09JRCgoIm1pYklJL3VkcFRhYmxlIiwgcmVxdWVzdHZiLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHZiLT5uYW1lX2xlbmd0aCkpOwogICAgICAgICAgICBERUJVR01TRygoICAgIm1pYklJL3VkcFRhYmxlIiwgIlxuIikpOwoKICAgICAgICAgICAgZW50cnkgPSAoVURQVEFCTEVfRU5UUllfVFlQRSAqKW5ldHNubXBfZXh0cmFjdF9pdGVyYXRvcl9jb250ZXh0KHJlcXVlc3QpOwogICAgICAgICAgICBpZiAoIWVudHJ5KQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIHRhYmxlX2luZm8gPSBuZXRzbm1wX2V4dHJhY3RfdGFibGVfaW5mbyhyZXF1ZXN0KTsKICAgICAgICAgICAgc3ViaWQgICAgICA9IHRhYmxlX2luZm8tPmNvbG51bTsKCiAgICAgICAgICAgIHN3aXRjaCAoc3ViaWQpIHsKICAgICAgICAgICAgY2FzZSBVRFBMT0NBTEFERFJFU1M6CiNpZiBkZWZpbmVkKG9zZjUpICYmIGRlZmluZWQoSU42X0VYVFJBQ1RfVjRBRERSKQogICAgICAgICAgICAgICAgYWRkciA9IG50b2hsKElONl9FWFRSQUNUX1Y0QUREUigmZW50cnktPnBjYi5pbnBfbGFkZHIpKTsKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lQQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKikmYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpKTsKI2Vsc2UKICAgICAgICAgICAgICAgIGFkZHIgPSBVRFBfQUREUkVTU19UT19IT1NUX09SREVSKGVudHJ5LT5VRFBUQUJMRV9MT0NBTEFERFJFU1MpOwoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSVBBRERSRVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikmYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBVRFBMT0NBTFBPUlQ6CiAgICAgICAgICAgICAgICBwb3J0ID0gVURQX1BPUlRfVE9fSE9TVF9PUkRFUigodV9zaG9ydCllbnRyeS0+VURQVEFCTEVfTE9DQUxQT1JUKTsKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikmcG9ydCwgc2l6ZW9mKHBvcnQpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE1PREVfR0VUTkVYVDoKICAgIGNhc2UgTU9ERV9HRVRCVUxLOgogICAgY2FzZSBNT0RFX1NFVF9SRVNFUlZFMToKICAgIGNhc2UgTU9ERV9TRVRfUkVTRVJWRTI6CiAgICBjYXNlIE1PREVfU0VUX0FDVElPTjoKICAgIGNhc2UgTU9ERV9TRVRfQ09NTUlUOgogICAgY2FzZSBNT0RFX1NFVF9GUkVFOgogICAgY2FzZSBNT0RFX1NFVF9VTkRPOgogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCAibWliSUkvdWRwVGFibGU6IFVuc3VwcG9ydGVkIG1vZGUgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcWluZm8tPm1vZGUpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywgIm1pYklJL3VkcFRhYmxlOiBVbnJlY29nbmlzZWQgbW9kZSAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxaW5mby0+bW9kZSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgkvKgoJICogVHdvIGZvcm1zIG9mIGl0ZXJhdGlvbiBob29rIHJvdXRpbmVzOgoJICogICAgT25lIGZvciB3aGVuIHRoZSBVRFAgdGFibGUgaXMgc3RvcmVkIGFzIGEgdGFibGUKCSAqICAgIE9uZSBmb3Igd2hlbiB0aGUgVURQIHRhYmxlIGlzIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0CgkgKgoJICogQWxzbyBhcHBsaWVzIHRvIHRoZSBjYWNoZS1oYW5kbGVyIGZyZWUgcm91dGluZQoJICovCgojaWZkZWYJVURQVEFCTEVfSVNfVEFCTEUKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKdWRwVGFibGVfZmlyc3RfZW50cnkodm9pZCAqKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICpkYXRhKQp7CiAgICAvKgogICAgICogWFhYIC0gSG93IGNhbiB3ZSB0ZWxsIGlmIHRoZSBjYWNoZSBpcyB2YWxpZD8KICAgICAqICAgICAgIE5vIGFjY2VzcyB0byAncmVxaW5mbycKICAgICAqLwogICAgaWYgKHVkcF9zaXplID09IDApCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIFBvaW50IHRvIHRoZSBmaXJzdCBlbnRyeSwgYW5kIHVzZSB0aGUKICAgICAqICduZXh0X2VudHJ5JyBob29rIHRvIHJldHJpZXZlIHRoaXMgcm93CiAgICAgKi8KICAgICpsb29wX2NvbnRleHQgPSAwOwogICAgcmV0dXJuIHVkcFRhYmxlX25leHRfZW50cnkoIGxvb3BfY29udGV4dCwgZGF0YV9jb250ZXh0LCBpbmRleCwgZGF0YSApOwp9CgpuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgp1ZHBUYWJsZV9uZXh0X2VudHJ5KCB2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmRhdGEpCnsKICAgIGludCBpID0gKGludCkqbG9vcF9jb250ZXh0OwogICAgbG9uZyBwb3J0OwoKICAgIGlmICh1ZHBfc2l6ZSA8IGkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIFNldCB1cCB0aGUgaW5kZXhpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcm93Li4uCiAgICAgKi8KI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICBwb3J0ID0gbnRvaGwoKHVfbG9uZyl1ZHBfaGVhZFtpXS5VRFBUQUJMRV9MT0NBTEFERFJFU1MpOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGluZGV4LCAodV9jaGFyICopJnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWRwX2hlYWRbaV0uVURQVEFCTEVfTE9DQUxBRERSRVNTKSk7CiNlbHNlCiAgICBzbm1wX3NldF92YXJfdmFsdWUoaW5kZXgsICh1X2NoYXIgKikmdWRwX2hlYWRbaV0uVURQVEFCTEVfTE9DQUxBRERSRVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVkcF9oZWFkW2ldLlVEUFRBQkxFX0xPQ0FMQUREUkVTUykpOwojZW5kaWYKICAgIHBvcnQgPSBVRFBfUE9SVF9UT19IT1NUX09SREVSKCh1X3Nob3J0KXVkcF9oZWFkW2ldLlVEUFRBQkxFX0xPQ0FMUE9SVCk7CiAgICBzbm1wX3NldF92YXJfdmFsdWUoaW5kZXgtPm5leHRfdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKikmcG9ydCwgc2l6ZW9mKHBvcnQpKTsKICAgIC8qCiAgICAgKiAuLi4gcmV0dXJuIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhpcyByb3csCiAgICAgKiBhbmQgdXBkYXRlIHRoZSBsb29wIGNvbnRleHQgcmVhZHkgZm9yIHRoZSBuZXh0IG9uZS4KICAgICAqLwogICAgKmRhdGFfY29udGV4dCA9ICh2b2lkKikmdWRwX2hlYWRbaV07CiAgICAqbG9vcF9jb250ZXh0ID0gKHZvaWQqKSsraTsKICAgIHJldHVybiBpbmRleDsKfQoKdm9pZAp1ZHBUYWJsZV9mcmVlKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICptYWdpYykKewojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIGlmICh1ZHBfaGVhZCkgewoJCS8qIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIGlzIGEgY291bnQgZm9sbG93ZWQgYnkgdGFibGUgZW50cmllcyAqLwoJCWZyZWUoKGNoYXIgKikodWRwX2hlYWQpIC0gc2l6ZW9mKERXT1JEKSk7Cgl9CiNlbHNlCiAgICBpZiAodWRwX2hlYWQpCiAgICAgICAgZnJlZSh1ZHBfaGVhZCk7CiNlbmRpZgogICAgdWRwX2hlYWQgPSBOVUxMOwogICAgdWRwX3NpemUgPSAwOwp9CiNlbHNlCiNpZmRlZiBVRFBUQUJMRV9JU19MSU5LRURfTElTVApuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgp1ZHBUYWJsZV9maXJzdF9lbnRyeSh2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmRhdGEpCnsKICAgIC8qCiAgICAgKiBYWFggLSBIb3cgY2FuIHdlIHRlbGwgaWYgdGhlIGNhY2hlIGlzIHZhbGlkPwogICAgICogICAgICAgTm8gYWNjZXNzIHRvICdyZXFpbmZvJwogICAgICovCiAgICBpZiAodWRwX2hlYWQgPT0gMCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogUG9pbnQgdG8gdGhlIGZpcnN0IGVudHJ5LCBhbmQgdXNlIHRoZQogICAgICogJ25leHRfZW50cnknIGhvb2sgdG8gcmV0cmlldmUgdGhpcyByb3cKICAgICAqLwogICAgKmxvb3BfY29udGV4dCA9ICh2b2lkKil1ZHBfaGVhZDsKICAgIHJldHVybiB1ZHBUYWJsZV9uZXh0X2VudHJ5KCBsb29wX2NvbnRleHQsIGRhdGFfY29udGV4dCwgaW5kZXgsIGRhdGEgKTsKfQoKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKdWRwVGFibGVfbmV4dF9lbnRyeSggdm9pZCAqKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICpkYXRhKQp7CiAgICBVRFBUQUJMRV9FTlRSWV9UWVBFCSAqZW50cnkgPSAoVURQVEFCTEVfRU5UUllfVFlQRSAqKSpsb29wX2NvbnRleHQ7CiAgICBsb25nIHBvcnQ7CiAgICBsb25nIGFkZHI7CgogICAgaWYgKCFlbnRyeSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogU2V0IHVwIHRoZSBpbmRleGluZyBmb3IgdGhlIHNwZWNpZmllZCByb3cuLi4KICAgICAqLwojaWYgZGVmaW5lZChvc2Y1KSAmJiBkZWZpbmVkKElONl9FWFRSQUNUX1Y0QUREUikKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciopJklONl9FWFRSQUNUX1Y0QUREUigmZW50cnktPnBjYi5pbnBfbGFkZHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9sYWRkcikpKTsKI2Vsc2UKICAgIGFkZHIgPSBVRFBfQUREUkVTU19UT19ORVRXT1JLX09SREVSKChpbl9hZGRyX3QpZW50cnktPlVEUFRBQkxFX0xPQ0FMQUREUkVTUyk7CiAgICBzbm1wX3NldF92YXJfdmFsdWUoaW5kZXgsICh1X2NoYXIgKikmYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkZHIpKTsKI2VuZGlmCiAgICBwb3J0ID0gVURQX1BPUlRfVE9fSE9TVF9PUkRFUihlbnRyeS0+VURQVEFCTEVfTE9DQUxQT1JUKTsKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpbmRleC0+bmV4dF92YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIqKSZwb3J0LCBzaXplb2YocG9ydCkpOwoKICAgIC8qCiAgICAgKiAuLi4gcmV0dXJuIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhpcyByb3csCiAgICAgKiBhbmQgdXBkYXRlIHRoZSBsb29wIGNvbnRleHQgcmVhZHkgZm9yIHRoZSBuZXh0IG9uZS4KICAgICAqLwogICAgKmRhdGFfY29udGV4dCA9ICh2b2lkKillbnRyeTsKICAgICpsb29wX2NvbnRleHQgPSAodm9pZCopZW50cnktPklOUF9ORVhUX1NZTUJPTDsKICAgIHJldHVybiBpbmRleDsKfQoKdm9pZAp1ZHBUYWJsZV9mcmVlKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICptYWdpYykKewogICAgVURQVEFCTEVfRU5UUllfVFlQRQkgKnA7CiAgICB3aGlsZSAodWRwX2hlYWQpIHsKICAgICAgICBwID0gdWRwX2hlYWQ7CiAgICAgICAgdWRwX2hlYWQgPSB1ZHBfaGVhZC0+SU5QX05FWFRfU1lNQk9MOwogICAgICAgIGZyZWUocCk7CiAgICB9CgogICAgdWRwX2hlYWQgPSBOVUxMOwp9CiNlbmRpZgkJLyogVURQVEFCTEVfSVNfTElOS0VEX0xJU1QgKi8KI2VuZGlmCQkvKiBVRFBUQUJMRV9JU19UQUJMRSAqLwoKCgkvKgoJICoKCSAqIFRoZSBjYWNoZS1oYW5kbGVyIGxvYWRpbmcgcm91dGluZSBpcyB0aGUgbWFpbgoJICogICAgcGxhY2UgZm9yIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlCgkgKgoJICogTG9hZCBpbnRvIGVpdGhlciBhIHRhYmxlIHN0cnVjdHVyZSwgb3IgYSBsaW5rZWQgbGlzdAoJICogICAgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlCgkgKi8KCgojaWZkZWYgaHB1eDExCmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIGludCAgICAgICAgICAgICBmZDsKICAgIHN0cnVjdCBubXBhcm1zICBwOwogICAgaW50ICAgICAgICAgICAgIHZhbCA9IDA7CiAgICB1bnNpZ25lZCBpbnQgICAgdWxlbjsKICAgIGludCAgICAgICAgICAgICByZXQ7CgogICAgdWRwVGFibGVfZnJlZShOVUxMLCBOVUxMKTsKCiAgICBpZiAoKGZkID0gb3Blbl9taWIoIi9kZXYvaXAiLCBPX1JET05MWSwgMCwgTk1fQVNZTkNfT0ZGKSkgPj0gMCkgewogICAgICAgIHAub2JqaWQgPSBJRF91ZHBMc25OdW1FbnQ7CiAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSAmdmFsOwogICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpID09IDApCiAgICAgICAgICAgIHVkcF9zaXplID0gdmFsOwoKICAgICAgICBpZiAodWRwX3NpemUgPiAwKSB7CiAgICAgICAgICAgIHVsZW4gPSAodW5zaWduZWQpIHVkcF9zaXplICpzaXplb2YobWliX3VkcExzbkVudCk7CiAgICAgICAgICAgIHVkcF9oZWFkID0gKG1pYl91ZHBMc25FbnQgKikgbWFsbG9jKHVsZW4pOwogICAgICAgICAgICBwLm9iamlkID0gSURfdWRwTHNuVGFibGU7CiAgICAgICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgdWRwX2hlYWQ7CiAgICAgICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpIDwgMCkgewogICAgICAgICAgICAgICAgdWRwX3NpemUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjbG9zZV9taWIoZmQpOwogICAgfQoKICAgIGlmICh1ZHBfc2l6ZSA+IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGVkIFVEUCBUYWJsZSAoaHB1eDExKVxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAoaHB1eDExKVxuIikpOwogICAgcmV0dXJuIC0xOwp9CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgojaWZkZWYgbGludXgKaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgRklMRSAgICAgICAgICAgKmluOwogICAgY2hhciAgICAgICAgICAgIGxpbmVbMjU2XTsKCiAgICB1ZHBUYWJsZV9mcmVlKGNhY2hlLCBOVUxMKTsKCiAgICBpZiAoIShpbiA9IGZvcGVuKCIvcHJvYy9uZXQvdWRwIiwgInIiKSkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlIChsaW51eClcbiIpKTsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic25tcGQ6IGNhbm5vdCBvcGVuIC9wcm9jL25ldC91ZHAgLi4uXG4iKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyoKICAgICAqIHNjYW4gcHJvYy1maWxlIGFuZCBidWlsZCB1cCBhIGxpbmtlZCBsaXN0IAogICAgICogVGhpcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0IHVwIGluIHJldmVyc2UsCiAgICAgKiAgIGJ1dCBzaW5jZSB0aGUgZW50cmllcyBhcmUgdW5zb3J0ZWQsIHRoYXQgZG9lc24ndCBtYXR0ZXIuCiAgICAgKi8KICAgIHdoaWxlIChsaW5lID09IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CiAgICAgICAgc3RydWN0IGlucGNiICAgIHBjYiwgKm5uZXc7CiAgICAgICAgdW5zaWduZWQgaW50ICAgIHN0YXRlLCBscG9ydDsKCiAgICAgICAgbWVtc2V0KCZwY2IsIDAsIHNpemVvZihwY2IpKTsKCiAgICAgICAgaWYgKDMgIT0gc3NjYW5mKGxpbmUsICIlKmQ6ICV4OiV4ICUqeDolKnggJXgiLAogICAgICAgICAgICAgICAgICAgICAgICAmcGNiLmlucF9sYWRkci5zX2FkZHIsICZscG9ydCwgJnN0YXRlKSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGlmIChzdGF0ZSAhPSA3KSAgICAgICAgIC8qIGZpeCBtZTogIFVEUF9MSVNURU4gPz8/ICovCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAvKiBzdG9yZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KICAgICAgICBwY2IuaW5wX2xhZGRyLnNfYWRkciA9IGh0b25sKHBjYi5pbnBfbGFkZHIuc19hZGRyKTsKICAgICAgICBwY2IuaW5wX2xwb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KSAobHBvcnQpKTsKCiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYoc3RydWN0IGlucGNiKTsKICAgICAgICBpZiAobm5ldyA9PSBOVUxMKQogICAgICAgICAgICBicmVhazsKICAgICAgICBtZW1jcHkobm5ldywgJnBjYiwgc2l6ZW9mKHN0cnVjdCBpbnBjYikpOwogICAgICAgIG5uZXctPmlucF9uZXh0ID0gdWRwX2hlYWQ7CiAgICAgICAgdWRwX2hlYWQgICAgICAgPSBubmV3OwogICAgfQoKICAgIGZjbG9zZShpbik7CgogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRlZCBVRFAgVGFibGUgKGxpbnV4KVxuIikpOwogICAgcmV0dXJuIDA7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwoKI2lmZGVmIHNvbGFyaXMyCnN0YXRpYyBpbnQKVURQX0NtcCh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgaWYgKG1lbWNtcCgobWliMl91ZHBFbnRyeV90ICopIGVwLCAobWliMl91ZHBFbnRyeV90ICopIGFkZHIsCiAgICAgICAgICAgICAgIHNpemVvZihtaWIyX3VkcEVudHJ5X3QpKSA9PSAwKQogICAgICAgIHJldHVybiAoMCk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICgxKTsKfQoKCmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIG1pYjJfdWRwRW50cnlfdCAgIGVudHJ5OwogICAgbmV0c25tcF91ZHBFbnRyeSAqbm5ldzsKICAgIG5ldHNubXBfdWRwRW50cnkgKnByZXZfZW50cnkgPSBOVUxMOwoKCiAgICB1ZHBUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmIChnZXRNaWJzdGF0KE1JQl9VRFBfTElTVEVOLCAmZW50cnksIHNpemVvZihtaWIyX3VkcEVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgR0VUX0ZJUlNULCAmVURQX0NtcCwgJmVudHJ5KSAhPSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAoc29sYXJpcylcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgd2hpbGUgKDEpIHsKICAgICAgICAvKgogICAgICAgICAqIE5vdCBpbnRlcmVzdGVkIGluICdpZGxlJyBlbnRyaWVzLCBhcHBhcmVudGx5Li4uLgogICAgICAgICAqLwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJVRFAgRW50cnkgJXg6JWQgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgZW50cnkudWRwTG9jYWxBZGRyZXNzLCBlbnRyeS51ZHBMb2NhbFBvcnQsIGVudHJ5LnVkcEVudHJ5SW5mby51ZV9zdGF0ZSkpOwogICAgICAgIGlmIChlbnRyeS51ZHBFbnRyeUluZm8udWVfc3RhdGUgPT0gTUlCMl9VRFBfaWRsZSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBCdWlsZCB1cCBhIGxpbmtlZCBsaXN0IGNvcHkgb2YgdGhlIGdldE1pYnN0YXQgcmVzdWx0cwogICAgICAgICAgICAgKiBOb3RlIHRoYXQgc2luY2UgZ2V0TWlic3RhdCByZXR1cm5zIHJvd3MgaW4gc29ydGVkIG9yZGVyLAoJICAgICAqICAgIHdlIG5lZWQgdG8gcmV0YWluIHRoaXMgb3JkZXIgd2hpbGUgYnVpbGRpbmcgdGhlIGxpc3QKCSAgICAgKiAgICBzbyBuZXcgZW50cmllcyBhcmUgYWRkZWQgb250byB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAgICAgICAgICAgKiB4eHgtcmtzOiBXQVJOSU5HOiB0aGlzIGlzIE5PVCBUUlVFIG9uIHRoZSBzZiBjZiBzb2xhcmlzIGJveGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF91ZHBFbnRyeSk7CiAgICAgICAgICAgIGlmIChubmV3ID09IE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgbWVtY3B5KCYobm5ldy0+ZW50cnkpLCAmZW50cnksIHNpemVvZihtaWIyX3VkcEVudHJ5X3QpKTsKICAgICAgICAgICAgaWYgKCFwcmV2X2VudHJ5KQoJICAgICAgICB1ZHBfaGVhZCA9IG5uZXc7CgkgICAgZWxzZQoJICAgICAgICBwcmV2X2VudHJ5LT5pbnBfbmV4dCA9IG5uZXc7CgkgICAgcHJldl9lbnRyeSA9IG5uZXc7Cgl9CgogICAgICAgIGlmIChnZXRNaWJzdGF0KE1JQl9VRFBfTElTVEVOLCAmZW50cnksIHNpemVvZihtaWIyX3VkcEVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgICAgIEdFVF9ORVhULCAmVURQX0NtcCwgJmVudHJ5KSAhPSAwKQoJICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh1ZHBfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkZWQgVURQIFRhYmxlIChzb2xhcmlzKVxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAoc29sYXJpcylcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgUE1JQl9VRFBUQUJMRSBwVWRwVGFibGUgPSBOVUxMOwogICAgRFdPUkQgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgRFdPUkQgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKCiAgICAvKgogICAgICogcXVlcnkgZm9yIHRoZSBidWZmZXIgc2l6ZSBuZWVkZWQgCiAgICAgKi8KICAgIHN0YXR1cyA9IEdldFVkcFRhYmxlKHBVZHBUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICBwVWRwVGFibGUgPSAoUE1JQl9VRFBUQUJMRSkgbWFsbG9jKGR3QWN0dWFsU2l6ZSk7CiAgICAgICAgaWYgKHBVZHBUYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEdldCB0aGUgc29ydGVkIFVEUCB0YWJsZSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0YXR1cyA9IEdldFVkcFRhYmxlKHBVZHBUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkZWQgVURQIFRhYmxlICh3aW4zMilcbiIpKTsKICAgICAgICB1ZHBfc2l6ZSA9IHBVZHBUYWJsZS0+ZHdOdW1FbnRyaWVzIC0xOyAgLyogZW50cmllcyBhcmUgY291bnRlZCBzdGFydGluZyB3aXRoIDAgKi8KICAgICAgICB1ZHBfaGVhZCA9IHBVZHBUYWJsZS0+dGFibGU7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlICh3aW4zMilcbiIpKTsKICAgIGlmIChwVWRwVGFibGUpCglmcmVlKHBVZHBUYWJsZSk7CiAgICByZXR1cm4gLTE7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4qLwoKI2lmIChkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpICYmIGRlZmluZWQoVURQQ1RMX1BDQkxJU1QpKQppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBzaXplX3QgICBsZW47CiAgICBpbnQgICAgICBzbmFtZVtdID0geyBDVExfTkVULCBQRl9JTkVULCBJUFBST1RPX1VEUCwgVURQQ1RMX1BDQkxJU1QgfTsKICAgIGNoYXIgICAgICp1ZHBjYl9idWYgPSBOVUxMOwojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICBzdHJ1Y3QgeGlucGNiICAqeGlnID0gTlVMTDsKI2Vsc2UKICAgIHN0cnVjdCB4aW5wZ2VuICp4aWcgPSBOVUxMOwojZW5kaWYKICAgIFVEUFRBQkxFX0VOVFJZX1RZUEUgICpubmV3OwoKICAgIHVkcFRhYmxlX2ZyZWUoTlVMTCwgTlVMTCk7CgogICAgLyoKICAgICAqICBSZWFkIGluIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVURQIHRhYmxlIGRhdGEKICAgICAqLwogICAgbGVuID0gMDsKICAgIGlmIChzeXNjdGwoc25hbWUsIDQsIDAsICZsZW4sIDAsIDApIDwgMCB8fAogICAgICAgKHVkcGNiX2J1ZiA9IG1hbGxvYyhsZW4pKSA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKICAgIGlmIChzeXNjdGwoc25hbWUsIDQsIHVkcGNiX2J1ZiwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgZnJlZSh1ZHBjYl9idWYpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogIFVucGljayB0aGlzIGludG8gdGhlIGNvbnN0aXR1ZW50ICd4aW5wZ2VuJyBzdHJ1Y3R1cmVzLCBhbmQgZXh0cmFjdAogICAgICogICAgIHRoZSAnaW5wY2InIGVsZW1lbnRzIGludG8gYSBsaW5rZWQgbGlzdCAoYnVpbHQgaW4gcmV2ZXJzZSkKICAgICAqLwojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICB4aWcgPSAoc3RydWN0IHhpbnBjYiAgKikgdWRwY2JfYnVmOwojZWxzZQogICAgeGlnID0gKHN0cnVjdCB4aW5wZ2VuICopIHVkcGNiX2J1ZjsKICAgIHhpZyA9IChzdHJ1Y3QgeGlucGdlbiAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aWdfbGVuKTsKI2VuZGlmCgojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICB3aGlsZSAoeGlnICYmICgoY2hhciAqKXhpZyArIHhpZy0+eGlfbGVuIDwgdWRwY2JfYnVmICsgbGVuKSkKI2Vsc2UKICAgIHdoaWxlICh4aWcgJiYgKHhpZy0+eGlnX2xlbiA+IHNpemVvZihzdHJ1Y3QgeGlucGdlbikpKQojZW5kaWYKICAgIHsKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihVRFBUQUJMRV9FTlRSWV9UWVBFKTsKICAgICAgICBpZiAoIW5uZXcpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1lbWNweSgmbm5ldy0+cGNiLCAmKChzdHJ1Y3QgeGlucGNiICopIHhpZyktPnhpX2lucCwgc2l6ZW9mKHN0cnVjdCBpbnBjYikpOwoJbm5ldy0+aW5wX25leHQgPSB1ZHBfaGVhZDsKCXVkcF9oZWFkICAgPSBubmV3OwojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICAgICAgeGlnID0gKHN0cnVjdCB4aW5wY2IgICopICgoY2hhciAqKSB4aWcgKyB4aWctPnhpX2xlbik7CiNlbHNlCiAgICAgICAgeGlnID0gKHN0cnVjdCB4aW5wZ2VuICopICgoY2hhciAqKSB4aWcgKyB4aWctPnhpZ19sZW4pOwojZW5kaWYKICAgIH0KCiAgICBmcmVlKHVkcGNiX2J1Zik7CiAgICBpZiAodWRwX2hlYWQpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGVkIFVEUCBUYWJsZSAoc3lzY3RsKVxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAoc3lzY3RsKVxuIikpOwogICAgcmV0dXJuIC0xOwp9CiNlbHNlCQkvKiAoZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKSAmJiBkZWZpbmVkKFVEUENUTF9QQ0JMSVNUKSkgKi8KI2lmZGVmIFBDQl9UQUJMRQppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBzdHJ1Y3QgaW5wY2J0YWJsZSB0YWJsZTsKICAgIHN0cnVjdCBpbnBjYiAgICpubmV3LCAqZW50cnk7CgogICAgdWRwVGFibGVfZnJlZShOVUxMLCBOVUxMKTsKCiAgICBpZiAoIWF1dG9fbmxpc3QoVURCX1NZTUJPTCwgKGNoYXIgKikgJnRhYmxlLCBzaXplb2YodGFibGUpKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gcmVhZCBpbnBjYnRhYmxlXG4iKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qCiAgICAgKiAgU2V0IHVwIGEgbGlua2VkIGxpc3QKICAgICAqLwogICAgZW50cnkgID0gdGFibGUuaW5wdF9xdWV1ZS5jcWhfZmlyc3Q7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgCiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYoc3RydWN0IGlucGNiKTsKICAgICAgICBpZiAoIW5uZXcpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChlbnRyeSwgKGNoYXIgKikgbm5ldywgc2l6ZW9mKHN0cnVjdCBpbnBjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZTp1ZHBUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgZW50cnkgICAgPSBubmV3LT5pbnBfcXVldWUuY3FlX25leHQ7CS8qIE5leHQga2VybmVsIGVudHJ5ICovCglubmV3LT5pbnBfcXVldWUuY3FlX25leHQgPSB1ZHBfaGVhZDsKCXVkcF9oZWFkID0gbm5ldzsKCiAgICAgICAgaWYgKGVudHJ5ID09IHRhYmxlLmlucHRfcXVldWUuY3FoX2ZpcnN0KQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAodWRwX2hlYWQpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGVkIFVEUCBUYWJsZSAocGNiX3RhYmxlKVxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAocGNiX3RhYmxlKVxuIikpOwogICAgcmV0dXJuIC0xOwp9CgojZWxzZQkJCQkvKiBQQ0JfVEFCTEUgKi8KI2lmZGVmIFVEQl9TWU1CT0wKaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgc3RydWN0IGlucGNiICAgdWRwX2lucGNiOwogICAgc3RydWN0IGlucGNiICAgKm5uZXcsICplbnRyeTsKCiAgICB1ZHBUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICghYXV0b19ubGlzdChVREJfU1lNQk9MLCAoY2hhciAqKSAmdWRwX2lucGNiLCBzaXplb2YodWRwX2lucGNiKSkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIHJlYWQgdWRiX3N5bWJvbFxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogIFNldCB1cCBhIGxpbmtlZCBsaXN0CiAgICAgKi8KICAgIGVudHJ5ICA9IHVkcF9pbnBjYi5JTlBfTkVYVF9TWU1CT0w7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgCiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYoc3RydWN0IGlucGNiKTsKICAgICAgICBpZiAoIW5uZXcpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChlbnRyeSwgKGNoYXIgKikgbm5ldywgc2l6ZW9mKHN0cnVjdCBpbnBjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZTp1ZHBUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgZW50cnkgICAgPSBubmV3LT5JTlBfTkVYVF9TWU1CT0w7CQkvKiBOZXh0IGtlcm5lbCBlbnRyeSAqLwoJbm5ldy0+SU5QX05FWFRfU1lNQk9MID0gdWRwX2hlYWQ7Cgl1ZHBfaGVhZCA9IG5uZXc7CgogICAgICAgIGlmIChlbnRyeSA9PSB1ZHBfaW5wY2IuSU5QX05FWFRfU1lNQk9MKQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAodWRwX2hlYWQpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGVkIFVEUCBUYWJsZSAodWRiX3N5bWJvbClcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKHVkYl9zeW1ib2wpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KCiNlbHNlCQkJCS8qIFVEQl9TWU1CT0wgKi8KaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRpbmcgVURQIFRhYmxlIG5vdCBpbXBsZW1lbnRlZFxuIikpOwogICAgcmV0dXJuIC0xOwp9CiNlbmRpZgkJCQkvKiBVREJfU1lNQk9MICovCiNlbmRpZgkJCQkvKiBQQ0JfVEFCTEUgKi8KI2VuZGlmCQkvKiAoZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKSAmJiBkZWZpbmVkKFVEUENUTF9QQ0JMSVNUKSkgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4qLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8K