LyoKICogIFRDUCBNSUIgZ3JvdXAgVGFibGUgaW1wbGVtZW50YXRpb24gLSB0Y3BUYWJsZS5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlICJtaWJJSV9jb21tb24uaCIKCiNpZiBIQVZFX05FVElORVRfVENQX0gKI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1RDUF9USU1FUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF90aW1lci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9UQ1BJUF9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcGlwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1RDUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC90Y3BfdmFyLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2luY2x1ZGUgInRjcC5oIgojaW5jbHVkZSAidGNwVGFibGUuaCIKI2luY2x1ZGUgInN5c09SVGFibGUuaCIKCiNpZmRlZiBocHV4MTEKI2RlZmluZQlUQ1BUQUJMRV9FTlRSWV9UWVBFCW1pYl90Y3BDb25uRW50IAojZGVmaW5lCVRDUFRBQkxFX1NUQVRFCQlTdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJTG9jYWxBZGRyZXNzIAojZGVmaW5lCVRDUFRBQkxFX0xPQ0FMUE9SVAlMb2NhbFBvcnQgCiNkZWZpbmUJVENQVEFCTEVfUkVNT1RFQUREUkVTUwlSZW1BZGRyZXNzIAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URVBPUlQJUmVtUG9ydCAKI2RlZmluZQlUQ1BUQUJMRV9JU19UQUJMRQojZWxzZQoKI2lmZGVmIHNvbGFyaXMyCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfdGNwQ29ubkVudHJ5X3MgbmV0c25tcF90Y3BDb25uRW50cnk7CnN0cnVjdCBuZXRzbm1wX3RjcENvbm5FbnRyeV9zIHsKICAgIG1pYjJfdGNwQ29ubkVudHJ5X3QgICBlbnRyeTsKICAgIG5ldHNubXBfdGNwQ29ubkVudHJ5ICppbnBfbmV4dDsKfTsKI2RlZmluZQlUQ1BUQUJMRV9FTlRSWV9UWVBFCW5ldHNubXBfdGNwQ29ubkVudHJ5CiNkZWZpbmUJVENQVEFCTEVfU1RBVEUJCWVudHJ5LnRjcENvbm5TdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJZW50cnkudGNwQ29ubkxvY2FsQWRkcmVzcyAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTFBPUlQJZW50cnkudGNwQ29ubkxvY2FsUG9ydCAKI2RlZmluZQlUQ1BUQUJMRV9SRU1PVEVBRERSRVNTCWVudHJ5LnRjcENvbm5SZW1BZGRyZXNzIAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URVBPUlQJZW50cnkudGNwQ29ublJlbVBvcnQgCiNkZWZpbmUJVENQVEFCTEVfSVNfTElOS0VEX0xJU1QKI2Vsc2UKCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQojaW5jbHVkZSA8aXBobHBhcGkuaD4KI2RlZmluZQlUQ1BUQUJMRV9FTlRSWV9UWVBFCU1JQl9UQ1BST1cKI2RlZmluZQlUQ1BUQUJMRV9TVEFURQkJZHdTdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJZHdMb2NhbEFkZHIKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTFBPUlQJZHdMb2NhbFBvcnQgCiNkZWZpbmUJVENQVEFCTEVfUkVNT1RFQUREUkVTUwlkd1JlbW90ZUFkZHIgCiNkZWZpbmUJVENQVEFCTEVfUkVNT1RFUE9SVAlkd1JlbW90ZVBvcnQgCiNkZWZpbmUJVENQVEFCTEVfSVNfVEFCTEUKI2Vsc2UKCiNpZmRlZiBsaW51eAojZGVmaW5lCVRDUFRBQkxFX0VOVFJZX1RZUEUJc3RydWN0IGlucGNiIAojZGVmaW5lCVRDUFRBQkxFX1NUQVRFCQlpbnBfc3RhdGUgCiNkZWZpbmUJVENQVEFCTEVfTE9DQUxBRERSRVNTCWlucF9sYWRkci5zX2FkZHIgCiNkZWZpbmUJVENQVEFCTEVfTE9DQUxQT1JUCWlucF9scG9ydAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URUFERFJFU1MJaW5wX2ZhZGRyLnNfYWRkciAKI2RlZmluZQlUQ1BUQUJMRV9SRU1PVEVQT1JUCWlucF9mcG9ydAojZGVmaW5lCVRDUFRBQkxFX0lTX0xJTktFRF9MSVNUCgojZWxzZQkJCS8qIGV2ZXJ5dGhpbmcgZWxzZSAqLwoKdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9pbnBjYl9zIG5ldHNubXBfaW5wY2I7CnN0cnVjdCBuZXRzbm1wX2lucGNiX3MgewogICAgc3RydWN0IGlucGNiICAgIHBjYjsKICAgIGludCAgICAgICAgICAgICBzdGF0ZTsKICAgIG5ldHNubXBfaW5wY2IgICppbnBfbmV4dDsKfTsKI2RlZmluZSBJTlBfTkVYVF9TWU1CT0wJCWlucF9uZXh0CiNkZWZpbmUJVENQVEFCTEVfRU5UUllfVFlQRQluZXRzbm1wX2lucGNiIAojZGVmaW5lCVRDUFRBQkxFX1NUQVRFCQlzdGF0ZSAKI2RlZmluZQlUQ1BUQUJMRV9MT0NBTEFERFJFU1MJcGNiLmlucF9sYWRkci5zX2FkZHIgCiNkZWZpbmUJVENQVEFCTEVfTE9DQUxQT1JUCXBjYi5pbnBfbHBvcnQKI2RlZmluZQlUQ1BUQUJMRV9SRU1PVEVBRERSRVNTCXBjYi5pbnBfZmFkZHIuc19hZGRyIAojZGVmaW5lCVRDUFRBQkxFX1JFTU9URVBPUlQJcGNiLmlucF9mcG9ydAojZGVmaW5lCVRDUFRBQkxFX0lTX0xJTktFRF9MSVNUCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCgkJCQkvKiBIZWFkIG9mIGxpbmtlZCBsaXN0LCBvciByb290IG9mIHRhYmxlICovClRDUFRBQkxFX0VOVFJZX1RZUEUJKnRjcF9oZWFkICA9IE5VTEw7CmludCAgICAgICAgICAgICAgICAgICAgICB0Y3Bfc2l6ZSAgPSAwOwkvKiBPbmx5IHVzZWQgZm9yIHRhYmxlLWJhc2VkIHN5c3RlbXMgKi8KaW50ICAgICAgICAgICAgICAgICAgICAgIHRjcF9lc3RhYiA9IDA7CgoKCS8qCgkgKgoJICogSW5pdGlhbGl6YXRpb24gYW5kIGhhbmRsZXIgcm91dGluZXMgYXJlIGNvbW1vbiB0byBhbGwgYXJjaGl0ZWN0dXJlcwoJICoKCSAqLwojaWZuZGVmIE1JQl9TVEFUU19DQUNIRV9USU1FT1VUCiNkZWZpbmUgTUlCX1NUQVRTX0NBQ0hFX1RJTUVPVVQJNQojZW5kaWYKI2lmbmRlZiBUQ1BfU1RBVFNfQ0FDSEVfVElNRU9VVAojZGVmaW5lIFRDUF9TVEFUU19DQUNIRV9USU1FT1VUCU1JQl9TVEFUU19DQUNIRV9USU1FT1VUCiNlbmRpZgoKI2lmIGRlZmluZWQoVENQX1BPUlRTX0lOX0hPU1RfT1JERVIpICYmIFRDUF9QT1JUU19JTl9IT1NUX09SREVSCiNkZWZpbmUgVENQX1BPUlRfVE9fSE9TVF9PUkRFUih4KSB4CiNlbHNlCiNkZWZpbmUgVENQX1BPUlRfVE9fSE9TVF9PUkRFUih4KSBudG9ocyh4KQojZW5kaWYKCm9pZCAgICAgICAgICAgICB0Y3BUYWJsZV9vaWRbXSA9IHsgU05NUF9PSURfTUlCMiwgNiwgMTMgfTsKCnZvaWQKaW5pdF90Y3BUYWJsZSh2b2lkKQp7CiAgICBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvICp0YWJsZV9pbmZvOwogICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICAgICAgICAgICAqaWluZm87CiAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICAgICpyZWdpbmZvOwogICAgaW50IHJjOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJJbml0aWFsaXNpbmcgVENQIFRhYmxlXG4iKSk7CiAgICAvKgogICAgICogQ3JlYXRlIHRoZSB0YWJsZSBkYXRhIHN0cnVjdHVyZSwgYW5kIGRlZmluZSB0aGUgaW5kZXhpbmcuLi4uCiAgICAgKi8KICAgIHRhYmxlX2luZm8gPSBTTk1QX01BTExPQ19UWVBFREVGKG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8pOwogICAgaWYgKCF0YWJsZV9pbmZvKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbmV0c25tcF90YWJsZV9oZWxwZXJfYWRkX2luZGV4ZXModGFibGVfaW5mbywgQVNOX0lQQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9JTlRFR0VSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lQQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9JTlRFR0VSLCAwKTsKICAgIHRhYmxlX2luZm8tPm1pbl9jb2x1bW4gPSBUQ1BDT05OU1RBVEU7CiAgICB0YWJsZV9pbmZvLT5tYXhfY29sdW1uID0gVENQQ09OTlJFTU9URVBPUlQ7CgoKICAgIC8qCiAgICAgKiAuLi4uIGFuZCBpdGVyYXRpb24gaW5mb3JtYXRpb24gLi4uLgogICAgICovCiAgICBpaW5mbyAgICAgID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX2l0ZXJhdG9yX2luZm8pOwogICAgaWYgKCFpaW5mbykgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlpbmZvLT5nZXRfZmlyc3RfZGF0YV9wb2ludCA9IHRjcFRhYmxlX2ZpcnN0X2VudHJ5OwogICAgaWluZm8tPmdldF9uZXh0X2RhdGFfcG9pbnQgID0gdGNwVGFibGVfbmV4dF9lbnRyeTsKICAgIGlpbmZvLT50YWJsZV9yZWdpbmZvICAgICAgICA9IHRhYmxlX2luZm87CiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgaWluZm8tPmZsYWdzICAgICAgICAgICAgICAgfD0gTkVUU05NUF9JVEVSQVRPUl9GTEFHX1NPUlRFRDsKI2VuZGlmIC8qIFdJTjMyIHx8IGN5Z3dpbiAqLwoKCiAgICAvKgogICAgICogLi4uLiBhbmQgcmVnaXN0ZXIgdGhlIHRhYmxlIHdpdGggdGhlIGFnZW50LgogICAgICovCiAgICByZWdpbmZvID0gbmV0c25tcF9jcmVhdGVfaGFuZGxlcl9yZWdpc3RyYXRpb24oInRjcFRhYmxlIiwKICAgICAgICAgICAgdGNwVGFibGVfaGFuZGxlciwKICAgICAgICAgICAgdGNwVGFibGVfb2lkLCBPSURfTEVOR1RIKHRjcFRhYmxlX29pZCksCiAgICAgICAgICAgIEhBTkRMRVJfQ0FOX1JPTkxZKSwKICAgIHJjID0gbmV0c25tcF9yZWdpc3Rlcl90YWJsZV9pdGVyYXRvcihyZWdpbmZvLCBpaW5mbyk7CiAgICBpZiAocmMgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogLi4uLiB3aXRoIGEgbG9jYWwgY2FjaGUKICAgICAqICAgIChleGNlcHQgZm9yIFNvbGFyaXMsIHdoaWNoIHVzZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2gpCiAgICAgKi8KICAgIG5ldHNubXBfaW5qZWN0X2hhbmRsZXIoIHJlZ2luZm8sCgkJICAgIG5ldHNubXBfZ2V0X2NhY2hlX2hhbmRsZXIoVENQX1NUQVRTX0NBQ0hFX1RJTUVPVVQsCgkJCSAgIAkJdGNwVGFibGVfbG9hZCwgdGNwVGFibGVfZnJlZSwKCQkJCQl0Y3BUYWJsZV9vaWQsIE9JRF9MRU5HVEgodGNwVGFibGVfb2lkKSkpOwp9CgoKCmludAp0Y3BUYWJsZV9oYW5kbGVyKG5ldHNubXBfbWliX2hhbmRsZXIgICAgICAgICAgKmhhbmRsZXIsCiAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbyAgICpyZXFpbmZvLAogICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICAgICAgICAgKnJlcXVlc3RzKQp7CiAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAgKnJlcXVlc3Q7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnJlcXVlc3R2YjsKICAgIG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvICp0YWJsZV9pbmZvOwogICAgVENQVEFCTEVfRU5UUllfVFlQRQkgICplbnRyeTsKICAgIG9pZCAgICAgIHN1YmlkOwogICAgbG9uZyAgICAgcG9ydDsKICAgIGxvbmcgICAgIHN0YXRlOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJIYW5kbGVyIC0gbW9kZSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBzZV9maW5kX2xhYmVsX2luX3NsaXN0KCJhZ2VudF9tb2RlIiwgcmVxaW5mby0+bW9kZSkpKTsKICAgIHN3aXRjaCAocmVxaW5mby0+bW9kZSkgewogICAgY2FzZSBNT0RFX0dFVDoKICAgICAgICBmb3IgKHJlcXVlc3Q9cmVxdWVzdHM7IHJlcXVlc3Q7IHJlcXVlc3Q9cmVxdWVzdC0+bmV4dCkgewogICAgICAgICAgICByZXF1ZXN0dmIgPSByZXF1ZXN0LT5yZXF1ZXN0dmI7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCAibWliSUkvdGNwVGFibGUiLCAib2lkOiAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgibWliSUkvdGNwVGFibGUiLCByZXF1ZXN0dmItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0dmItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCggICAibWliSUkvdGNwVGFibGUiLCAiXG4iKSk7CgogICAgICAgICAgICBlbnRyeSA9IChUQ1BUQUJMRV9FTlRSWV9UWVBFICopbmV0c25tcF9leHRyYWN0X2l0ZXJhdG9yX2NvbnRleHQocmVxdWVzdCk7CiAgICAgICAgICAgIGlmICghZW50cnkpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgdGFibGVfaW5mbyA9IG5ldHNubXBfZXh0cmFjdF90YWJsZV9pbmZvKHJlcXVlc3QpOwogICAgICAgICAgICBzdWJpZCAgICAgID0gdGFibGVfaW5mby0+Y29sbnVtOwoKICAgICAgICAgICAgc3dpdGNoIChzdWJpZCkgewogICAgICAgICAgICBjYXNlIFRDUENPTk5TVEFURToKICAgICAgICAgICAgICAgIHN0YXRlID0gZW50cnktPlRDUFRBQkxFX1NUQVRFOwoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSZzdGF0ZSwgc2l6ZW9mKHN0YXRlKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBUQ1BDT05OTE9DQUxBRERSRVNTOgojaWYgZGVmaW5lZChvc2Y1KSAmJiBkZWZpbmVkKElONl9FWFRSQUNUX1Y0QUREUikKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lQQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciopSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9sYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKElONl9FWFRSQUNUX1Y0QUREUigmZW50cnktPnBjYi5pbnBfbGFkZHIpKSk7CiNlbHNlCgkgICAgICAgIHNubXBfc2V0X3Zhcl90eXBlZF92YWx1ZShyZXF1ZXN0dmIsIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikmZW50cnktPlRDUFRBQkxFX0xPQ0FMQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlbnRyeS0+VENQVEFCTEVfTE9DQUxBRERSRVNTKSk7CiNlbmRpZgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVENQQ09OTkxPQ0FMUE9SVDoKICAgICAgICAgICAgICAgIHBvcnQgPSBUQ1BfUE9SVF9UT19IT1NUX09SREVSKCh1X3Nob3J0KWVudHJ5LT5UQ1BUQUJMRV9MT0NBTFBPUlQpOwoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSZwb3J0LCBzaXplb2YocG9ydCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVENQQ09OTlJFTU9URUFERFJFU1M6CiNpZiBkZWZpbmVkKG9zZjUpICYmIGRlZmluZWQoSU42X0VYVFJBQ1RfVjRBRERSKQoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSVBBRERSRVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKilJTjZfRVhUUkFDVF9WNEFERFIoJmVudHJ5LT5wY2IuaW5wX2xhZGRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSU42X0VYVFJBQ1RfVjRBRERSKCZlbnRyeS0+cGNiLmlucF9sYWRkcikpKTsKI2Vsc2UKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lQQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSZlbnRyeS0+VENQVEFCTEVfUkVNT1RFQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlbnRyeS0+VENQVEFCTEVfUkVNT1RFQUREUkVTUykpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFRDUENPTk5SRU1PVEVQT1JUOgogICAgICAgICAgICAgICAgcG9ydCA9IFRDUF9QT1JUX1RPX0hPU1RfT1JERVIoKHVfc2hvcnQpZW50cnktPlRDUFRBQkxFX1JFTU9URVBPUlQpOwoJICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUocmVxdWVzdHZiLCBBU05fSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSZwb3J0LCBzaXplb2YocG9ydCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgfQoJfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTU9ERV9HRVRORVhUOgogICAgY2FzZSBNT0RFX0dFVEJVTEs6CiAgICBjYXNlIE1PREVfU0VUX1JFU0VSVkUxOgogICAgY2FzZSBNT0RFX1NFVF9SRVNFUlZFMjoKICAgIGNhc2UgTU9ERV9TRVRfQUNUSU9OOgogICAgY2FzZSBNT0RFX1NFVF9DT01NSVQ6CiAgICBjYXNlIE1PREVfU0VUX0ZSRUU6CiAgICBjYXNlIE1PREVfU0VUX1VORE86CiAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJtaWJJSS90Y3BUYWJsZTogVW5zdXBwb3J0ZWQgbW9kZSAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxaW5mby0+bW9kZSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCAibWliSUkvdGNwVGFibGU6IFVucmVjb2duaXNlZCBtb2RlICglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFpbmZvLT5tb2RlKTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50ClRDUF9Db3VudF9Db25uZWN0aW9ucyggdm9pZCApIHsKICAgIHRjcFRhYmxlX2xvYWQoTlVMTCwgTlVMTCk7CiAgICByZXR1cm4gdGNwX2VzdGFiOwp9CgoJLyoKCSAqIFR3byBmb3JtcyBvZiBpdGVyYXRpb24gaG9vayByb3V0aW5lczoKCSAqICAgIE9uZSBmb3Igd2hlbiB0aGUgVENQIHRhYmxlIGlzIHN0b3JlZCBhcyBhIHRhYmxlCgkgKiAgICBPbmUgZm9yIHdoZW4gdGhlIFRDUCB0YWJsZSBpcyBzdG9yZWQgYXMgYSBsaW5rZWQgbGlzdAoJICoKCSAqIEFsc28gYXBwbGllcyB0byB0aGUgY2FjaGUtaGFuZGxlciBmcmVlIHJvdXRpbmUKCSAqLwoKI2lmZGVmCVRDUFRBQkxFX0lTX1RBQkxFCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnRjcFRhYmxlX2ZpcnN0X2VudHJ5KHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqZGF0YSkKewogICAgLyoKICAgICAqIFhYWCAtIEhvdyBjYW4gd2UgdGVsbCBpZiB0aGUgY2FjaGUgaXMgdmFsaWQ/CiAgICAgKiAgICAgICBObyBhY2Nlc3MgdG8gJ3JlcWluZm8nCiAgICAgKi8KICAgIGlmICh0Y3Bfc2l6ZSA9PSAwKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBQb2ludCB0byB0aGUgZmlyc3QgZW50cnksIGFuZCB1c2UgdGhlCiAgICAgKiAnbmV4dF9lbnRyeScgaG9vayB0byByZXRyaWV2ZSB0aGlzIHJvdwogICAgICovCiAgICAqbG9vcF9jb250ZXh0ID0gMDsKICAgIHJldHVybiB0Y3BUYWJsZV9uZXh0X2VudHJ5KCBsb29wX2NvbnRleHQsIGRhdGFfY29udGV4dCwgaW5kZXgsIGRhdGEgKTsKfQoKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKdGNwVGFibGVfbmV4dF9lbnRyeSggdm9pZCAqKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICpkYXRhKQp7CiAgICBpbnQgaSA9IChpbnQpKmxvb3BfY29udGV4dDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaWR4OwogICAgbG9uZyBwb3J0OwoKICAgIGlmICh0Y3Bfc2l6ZSA8IGkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIFNldCB1cCB0aGUgaW5kZXhpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcm93Li4uCiAgICAgKi8KICAgIGlkeCA9IGluZGV4OwojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIHBvcnQgPSBudG9obCgodV9sb25nKXRjcF9oZWFkW2ldLlRDUFRBQkxFX0xPQ0FMQUREUkVTUyk7CiAgICBzbm1wX3NldF92YXJfdmFsdWUoaWR4LCAodV9jaGFyICopJnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcF9oZWFkW2ldLlRDUFRBQkxFX0xPQ0FMQUREUkVTUykpOwojZWxzZQogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciAqKSZ0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9MT0NBTEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcF9oZWFkW2ldLlRDUFRBQkxFX0xPQ0FMQUREUkVTUykpOwojZW5kaWYKCiAgICBwb3J0ID0gVENQX1BPUlRfVE9fSE9TVF9PUkRFUigodV9zaG9ydCl0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9MT0NBTFBPUlQpOwogICAgaWR4ID0gaWR4LT5uZXh0X3ZhcmlhYmxlOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciopJnBvcnQsIHNpemVvZihwb3J0KSk7CgogICAgaWR4ID0gaWR4LT5uZXh0X3ZhcmlhYmxlOwojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIHBvcnQgPSBudG9obCgodV9sb25nKXRjcF9oZWFkW2ldLlRDUFRBQkxFX1JFTU9URUFERFJFU1MpOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciAqKSZwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BfaGVhZFtpXS5UQ1BUQUJMRV9SRU1PVEVBRERSRVNTKSk7CiNlbHNlCiAgICBzbm1wX3NldF92YXJfdmFsdWUoaWR4LCAodV9jaGFyICopJnRjcF9oZWFkW2ldLlRDUFRBQkxFX1JFTU9URUFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcF9oZWFkW2ldLlRDUFRBQkxFX1JFTU9URUFERFJFU1MpKTsKI2VuZGlmCgogICAgcG9ydCA9IFRDUF9QT1JUX1RPX0hPU1RfT1JERVIoKHVfc2hvcnQpdGNwX2hlYWRbaV0uVENQVEFCTEVfUkVNT1RFUE9SVCk7CiAgICBpZHggPSBpZHgtPm5leHRfdmFyaWFibGU7CiAgICBzbm1wX3NldF92YXJfdmFsdWUoaWR4LCAodV9jaGFyKikmcG9ydCwgc2l6ZW9mKHBvcnQpKTsKCiAgICAvKgogICAgICogLi4uIHJldHVybiB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoaXMgcm93LAogICAgICogYW5kIHVwZGF0ZSB0aGUgbG9vcCBjb250ZXh0IHJlYWR5IGZvciB0aGUgbmV4dCBvbmUuCiAgICAgKi8KICAgICpkYXRhX2NvbnRleHQgPSAodm9pZCopJnRjcF9oZWFkW2ldOwogICAgKmxvb3BfY29udGV4dCA9ICh2b2lkKikrK2k7CgogICAgcmV0dXJuIGluZGV4Owp9Cgp2b2lkCnRjcFRhYmxlX2ZyZWUobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKm1hZ2ljKQp7CiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgaWYgKHRjcF9oZWFkKSB7CgkJLyogdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgYSBjb3VudCBmb2xsb3dlZCBieSB0YWJsZSBlbnRyaWVzICovCgkJZnJlZSgoY2hhciAqKSh0Y3BfaGVhZCkgLSBzaXplb2YoRFdPUkQpKTsKCX0KI2Vsc2UKCWlmICh0Y3BfaGVhZCkKICAgICAgICBmcmVlKHRjcF9oZWFkKTsKI2VuZGlmCiAgICB0Y3BfaGVhZCAgPSBOVUxMOwogICAgdGNwX3NpemUgID0gMDsKICAgIHRjcF9lc3RhYiA9IDA7Cn0KI2Vsc2UKI2lmZGVmIFRDUFRBQkxFX0lTX0xJTktFRF9MSVNUCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnRjcFRhYmxlX2ZpcnN0X2VudHJ5KHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqZGF0YSkKewogICAgLyoKICAgICAqIFhYWCAtIEhvdyBjYW4gd2UgdGVsbCBpZiB0aGUgY2FjaGUgaXMgdmFsaWQ/CiAgICAgKiAgICAgICBObyBhY2Nlc3MgdG8gJ3JlcWluZm8nCiAgICAgKi8KICAgIGlmICh0Y3BfaGVhZCA9PSAwKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBQb2ludCB0byB0aGUgZmlyc3QgZW50cnksIGFuZCB1c2UgdGhlCiAgICAgKiAnbmV4dF9lbnRyeScgaG9vayB0byByZXRyaWV2ZSB0aGlzIHJvdwogICAgICovCiAgICAqbG9vcF9jb250ZXh0ID0gKHZvaWQqKXRjcF9oZWFkOwogICAgcmV0dXJuIHRjcFRhYmxlX25leHRfZW50cnkoIGxvb3BfY29udGV4dCwgZGF0YV9jb250ZXh0LCBpbmRleCwgZGF0YSApOwp9CgpuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgp0Y3BUYWJsZV9uZXh0X2VudHJ5KCB2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmRhdGEpCnsKICAgIFRDUFRBQkxFX0VOVFJZX1RZUEUJICplbnRyeSA9IChUQ1BUQUJMRV9FTlRSWV9UWVBFICopKmxvb3BfY29udGV4dDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaWR4OwogICAgbG9uZyBhZGRyLCBwb3J0OwoKICAgIGlmICghZW50cnkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIFNldCB1cCB0aGUgaW5kZXhpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcm93Li4uCiAgICAgKi8KICAgIGlkeCA9IGluZGV4OwojaWYgZGVmaW5lZChvc2Y1KSAmJiBkZWZpbmVkKElONl9FWFRSQUNUX1Y0QUREUikKICAgIGFkZHIgPSBudG9obChJTjZfRVhUUkFDVF9WNEFERFIoJmVudHJ5LT5wY2IuaW5wX2xhZGRyKSk7CiNlbHNlCiAgICBhZGRyID0gbnRvaGwoZW50cnktPlRDUFRBQkxFX0xPQ0FMQUREUkVTUyk7CiNlbmRpZgogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwoKICAgIHBvcnQgPSBUQ1BfUE9SVF9UT19IT1NUX09SREVSKGVudHJ5LT5UQ1BUQUJMRV9MT0NBTFBPUlQpOwogICAgaWR4ID0gaWR4LT5uZXh0X3ZhcmlhYmxlOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGlkeCwgKHVfY2hhciopJnBvcnQsIHNpemVvZihwb3J0KSk7CgogICAgaWR4ID0gaWR4LT5uZXh0X3ZhcmlhYmxlOwojaWYgZGVmaW5lZChvc2Y1KSAmJiBkZWZpbmVkKElONl9FWFRSQUNUX1Y0QUREUikKICAgIGFkZHIgPSBudG9obChJTjZfRVhUUkFDVF9WNEFERFIoJmVudHJ5LT5wY2IuaW5wX2ZhZGRyKSk7CiNlbHNlCiAgICBhZGRyID0gbnRvaGwoZW50cnktPlRDUFRBQkxFX1JFTU9URUFERFJFU1MpOwojZW5kaWYKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpZHgsICh1X2NoYXIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKCiAgICBwb3J0ID0gVENQX1BPUlRfVE9fSE9TVF9PUkRFUihlbnRyeS0+VENQVEFCTEVfUkVNT1RFUE9SVCk7CiAgICBpZHggPSBpZHgtPm5leHRfdmFyaWFibGU7CiAgICBzbm1wX3NldF92YXJfdmFsdWUoaWR4LCAodV9jaGFyKikmcG9ydCwgc2l6ZW9mKHBvcnQpKTsKCiAgICAvKgogICAgICogLi4uIHJldHVybiB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoaXMgcm93LAogICAgICogYW5kIHVwZGF0ZSB0aGUgbG9vcCBjb250ZXh0IHJlYWR5IGZvciB0aGUgbmV4dCBvbmUuCiAgICAgKi8KICAgICpkYXRhX2NvbnRleHQgPSAodm9pZCopZW50cnk7CiAgICAqbG9vcF9jb250ZXh0ID0gKHZvaWQqKWVudHJ5LT5JTlBfTkVYVF9TWU1CT0w7CiAgICByZXR1cm4gaW5kZXg7Cn0KCnZvaWQKdGNwVGFibGVfZnJlZShuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqbWFnaWMpCnsKICAgIFRDUFRBQkxFX0VOVFJZX1RZUEUgKnA7CiAgICB3aGlsZSAodGNwX2hlYWQpIHsKICAgICAgICBwID0gdGNwX2hlYWQ7CiAgICAgICAgdGNwX2hlYWQgPSB0Y3BfaGVhZC0+SU5QX05FWFRfU1lNQk9MOwogICAgICAgIGZyZWUocCk7CiAgICB9CgogICAgdGNwX2hlYWQgID0gTlVMTDsKICAgIHRjcF9zaXplICA9IDA7CiAgICB0Y3BfZXN0YWIgPSAwOwp9CiNlbmRpZgkJLyogVENQVEFCTEVfSVNfTElOS0VEX0xJU1QgKi8KI2VuZGlmCQkvKiBUQ1BUQUJMRV9JU19UQUJMRSAqLwoKCgkvKgoJICoKCSAqIFRoZSBjYWNoZS1oYW5kbGVyIGxvYWRpbmcgcm91dGluZSBpcyB0aGUgbWFpbgoJICogICAgcGxhY2UgZm9yIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlCgkgKgoJICogTG9hZCBpbnRvIGVpdGhlciBhIHRhYmxlIHN0cnVjdHVyZSwgb3IgYSBsaW5rZWQgbGlzdAoJICogICAgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlCgkgKi8KCgojaWZkZWYgaHB1eDExCmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIGludCAgICAgICAgICAgICBmZDsKICAgIHN0cnVjdCBubXBhcm1zICBwOwogICAgaW50ICAgICAgICAgICAgIHZhbCA9IDA7CiAgICB1bnNpZ25lZCBpbnQgICAgdWxlbjsKICAgIGludCAgICAgICAgICAgICByZXQ7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICB0Y3BUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICgoZmQgPSBvcGVuX21pYigiL2Rldi9pcCIsIE9fUkRPTkxZLCAwLCBOTV9BU1lOQ19PRkYpKSA+PSAwKSB7CiAgICAgICAgcC5vYmppZCA9IElEX3RjcENvbm5OdW1FbnQ7CiAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSAmdmFsOwogICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpID09IDApCiAgICAgICAgICAgIHRjcF9zaXplID0gdmFsOwoKICAgICAgICBpZiAodGNwX3NpemUgPiAwKSB7CiAgICAgICAgICAgIHVsZW4gPSAodW5zaWduZWQpIHRjcF9zaXplICpzaXplb2YobWliX3RjcENvbm5FbnQpOwogICAgICAgICAgICB0Y3BfaGVhZCA9IChtaWJfdGNwQ29ubkVudCAqKSBtYWxsb2ModWxlbik7CiAgICAgICAgICAgIHAub2JqaWQgPSBJRF90Y3BDb25uVGFibGU7CiAgICAgICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgdGNwX2hlYWQ7CiAgICAgICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpIDwgMCkgewogICAgICAgICAgICAgICAgdGNwX3NpemUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjbG9zZV9taWIoZmQpOwogICAgfQoKICAgIC8qCiAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zCiAgICAgKiBQcm9iYWJseSBub3QgYWN0dWFsbHkgbmVjZXNzYXJ5IGZvciBIUC1VWAogICAgICovCiAgICBmb3IgKGkgPSAwOyBpIDwgdGNwX3NpemU7IGkrKykgewogICAgICAgIGlmICh0Y3BfaGVhZFtpXS5TdGF0ZSA9PSA1IC8qIGVzdGFibGlzaGVkICovIHx8CiAgICAgICAgICAgIHRjcF9oZWFkW2ldLlN0YXRlID09IDggLyogIGNsb3NlV2FpdCAgKi8gKQogICAgICAgICAgICB0Y3BfZXN0YWIrKzsKICAgIH0KCiAgICBpZiAodGNwX3NpemUgPiAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkxvYWRlZCBUQ1AgVGFibGUgKGhwdXgxMSlcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBUQ1AgVGFibGUgKGhwdXgxMSlcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2lmZGVmIGxpbnV4CmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIEZJTEUgICAgICAgICAgICppbjsKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzI1Nl07CgogICAgdGNwVGFibGVfZnJlZShjYWNoZSwgTlVMTCk7CgogICAgaWYgKCEoaW4gPSBmb3BlbigiL3Byb2MvbmV0L3RjcCIsICJyIikpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFRDUCBUYWJsZSAobGludXgxKVxuIikpOwogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzbm1wZDogY2Fubm90IG9wZW4gL3Byb2MvbmV0L3RjcCAuLi5cbiIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogc2NhbiBwcm9jLWZpbGUgYW5kIGJ1aWxkIHVwIGEgbGlua2VkIGxpc3QgCiAgICAgKiBUaGlzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQgdXAgaW4gcmV2ZXJzZSwKICAgICAqICAgYnV0IHNpbmNlIHRoZSBlbnRyaWVzIGFyZSB1bnNvcnRlZCwgdGhhdCBkb2Vzbid0IG1hdHRlci4KICAgICAqLwogICAgd2hpbGUgKGxpbmUgPT0gZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikpIHsKICAgICAgICBzdHJ1Y3QgaW5wY2IgICAgcGNiLCAqbm5ldzsKICAgICAgICBzdGF0aWMgaW50ICAgICAgbGludXhfc3RhdGVzWzEyXSA9CiAgICAgICAgICAgIHsgMSwgNSwgMywgNCwgNiwgNywgMTEsIDEsIDgsIDksIDIsIDEwIH07CiAgICAgICAgaW50ICAgICAgICAgICAgIHN0YXRlLCBscCwgZnAsIHVpZDsKCiAgICAgICAgaWYgKDYgIT0gc3NjYW5mKGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICIlKmQ6ICV4OiV4ICV4OiV4ICV4ICUqWDolKlggJSpYOiUqWCAlKlggJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAmcGNiLmlucF9sYWRkci5zX2FkZHIsICZscCwKICAgICAgICAgICAgICAgICAgICAgICAgJnBjYi5pbnBfZmFkZHIuc19hZGRyLCAmZnAsICZzdGF0ZSwgJnVpZCkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBwY2IuaW5wX2xwb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KSBscCk7CiAgICAgICAgcGNiLmlucF9mcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCkgZnApOwoKICAgICAgICBwY2IuaW5wX3N0YXRlID0gKHN0YXRlICYgMHhmKSA8IDEyID8gbGludXhfc3RhdGVzW3N0YXRlICYgMHhmXSA6IDI7CiAgICAgICAgaWYgKHBjYi5pbnBfc3RhdGUgPT0gNSAvKiBlc3RhYmxpc2hlZCAqLyB8fAogICAgICAgICAgICBwY2IuaW5wX3N0YXRlID09IDggLyogIGNsb3NlV2FpdCAgKi8gKQogICAgICAgICAgICB0Y3BfZXN0YWIrKzsKICAgICAgICBwY2IudWlkID0gdWlkOwoKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihzdHJ1Y3QgaW5wY2IpOwogICAgICAgIGlmIChubmV3ID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1lbWNweShubmV3LCAmcGNiLCBzaXplb2Yoc3RydWN0IGlucGNiKSk7CiAgICAgICAgbm5ldy0+aW5wX25leHQgPSB0Y3BfaGVhZDsKICAgICAgICB0Y3BfaGVhZCAgICAgICA9IG5uZXc7CiAgICB9CgogICAgZmNsb3NlKGluKTsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiTG9hZGVkIFRDUCBUYWJsZSAobGludXgpXG4iKSk7CiAgICByZXR1cm4gMDsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCgojaWZkZWYgc29sYXJpczIKc3RhdGljIGludApUQ1BfQ21wKHZvaWQgKmFkZHIsIHZvaWQgKmVwKQp7CiAgICBpZiAobWVtY21wKChtaWIyX3RjcENvbm5FbnRyeV90ICopIGVwLCAobWliMl90Y3BDb25uRW50cnlfdCAqKSBhZGRyLAogICAgICAgICAgICAgICBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCkpID09IDApCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKDEpOwp9CgppbnQKdGNwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBtaWIyX3RjcENvbm5FbnRyeV90ICAgZW50cnk7CiAgICBuZXRzbm1wX3RjcENvbm5FbnRyeSAqbm5ldzsKICAgIG5ldHNubXBfdGNwQ29ubkVudHJ5ICpwcmV2X2VudHJ5ID0gTlVMTDsKCiAgICB0Y3BUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmIChnZXRNaWJzdGF0KE1JQl9UQ1BfQ09OTiwgJmVudHJ5LCBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICBHRVRfRklSU1QsICZUQ1BfQ21wLCAmZW50cnkpICE9IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVENQIFRhYmxlIChzb2xhcmlzKVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICB3aGlsZSAoMSkgewogICAgICAgIC8qCiAgICAgICAgICogQnVpbGQgdXAgYSBsaW5rZWQgbGlzdCBjb3B5IG9mIHRoZSBnZXRNaWJzdGF0IHJlc3VsdHMKICAgICAgICAgKiBOb3RlIHRoYXQgc2luY2UgZ2V0TWlic3RhdCByZXR1cm5zIHJvd3MgaW4gc29ydGVkIG9yZGVyLAogICAgICAgICAqICAgIHdlIG5lZWQgdG8gcmV0YWluIHRoaXMgb3JkZXIgd2hpbGUgYnVpbGRpbmcgdGhlIGxpc3QKICAgICAgICAgKiAgICBzbyBuZXcgZW50cmllcyBhcmUgYWRkZWQgb250byB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAgICAgICAqIE5vdGUgMjogYXQgbGVhc3QgU29sYXJpcyA4LTEwIGRvIG5vdCByZXR1cm4gcm93cyBpbgogICAgICAgICAqICAgIHNvcnRlZCBvcmRlciBhbnltb3JlCiAgICAgICAgICovCiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF90Y3BDb25uRW50cnkpOwogICAgICAgIGlmIChubmV3ID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1lbWNweSgmKG5uZXctPmVudHJ5KSwgJmVudHJ5LCBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCkpOwogICAgICAgIGlmICghcHJldl9lbnRyeSkKICAgICAgICAgICAgdGNwX2hlYWQgPSBubmV3OwogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJldl9lbnRyeS0+aW5wX25leHQgPSBubmV3OwogICAgICAgIHByZXZfZW50cnkgPSBubmV3OwoKICAgICAgICBpZiAoZ2V0TWlic3RhdChNSUJfVENQX0NPTk4sICZlbnRyeSwgc2l6ZW9mKG1pYjJfdGNwQ29ubkVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgICAgIEdFVF9ORVhULCAmVENQX0NtcCwgJmVudHJ5KSAhPSAwKQoJICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh0Y3BfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIChzb2xhcmlzKVxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFRDUCBUYWJsZSAoc29sYXJpcylcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKaW50CnRjcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgUE1JQl9UQ1BUQUJMRSBwVGNwVGFibGUgPSBOVUxMOwogICAgRFdPUkQgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgRFdPUkQgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKCiAgICAvKgogICAgICogcXVlcnkgZm9yIHRoZSBidWZmZXIgc2l6ZSBuZWVkZWQgCiAgICAgKi8KICAgIHN0YXR1cyA9IEdldFRjcFRhYmxlKHBUY3BUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICBwVGNwVGFibGUgPSAoUE1JQl9UQ1BUQUJMRSkgbWFsbG9jKGR3QWN0dWFsU2l6ZSk7CiAgICAgICAgaWYgKHBUY3BUYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEdldCB0aGUgc29ydGVkIFRDUCB0YWJsZSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0YXR1cyA9IEdldFRjcFRhYmxlKHBUY3BUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICBpbnQgICAgICAgICAgIGk7CgogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIChXSU4zMilcbiIpKTsKICAgICAgICB0Y3Bfc2l6ZSA9IHBUY3BUYWJsZS0+ZHdOdW1FbnRyaWVzIC0xOyAgLyogZW50cmllcyBhcmUgY291bnRlZCBzdGFydGluZyB3aXRoIDAgKi8KICAgICAgICB0Y3BfaGVhZCA9IHBUY3BUYWJsZS0+dGFibGU7CgoJLyoKCSAqIENvdW50IHRoZSBudW1iZXIgb2YgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMKCSAqIFByb2JhYmx5IG5vdCBhY3R1YWxseSBuZWNlc3NhcnkgZm9yIFdpbmRvd3MKCSAqLwoJZm9yIChpID0gMDsgaSA8IHRjcF9zaXplOyBpKyspIHsKCQlpZiAodGNwX2hlYWRbaV0uZHdTdGF0ZSA9PSA1IC8qIGVzdGFibGlzaGVkICovIHx8CgkJCXRjcF9oZWFkW2ldLmR3U3RhdGUgPT0gOCAvKiAgY2xvc2VXYWl0ICAqLyApCgkJCXRjcF9lc3RhYisrOwoJfQogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBUQ1AgVGFibGUgKHdpbjMyKVxuIikpOwoJaWYgKHBUY3BUYWJsZSkKCQlmcmVlKHBUY3BUYWJsZSk7CiAgICByZXR1cm4gLTE7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KCiNpZiAoZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKSAmJiBkZWZpbmVkKFRDUENUTF9QQ0JMSVNUKSkKCiNpZiBkZWZpbmVkKGZyZWVic2Q0KSB8fCBkZWZpbmVkKGRhcndpbikKICAgICNkZWZpbmUgTlNfRUxFTSBzdHJ1Y3QgeHRjcGNiCiNlbHNlCiAgICAjZGVmaW5lIE5TX0VMRU0gc3RydWN0IHhpbnBjYgojZW5kaWYKCmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIHNpemVfdCAgIGxlbjsKICAgIGludCAgICAgIHNuYW1lW10gPSB7IENUTF9ORVQsIFBGX0lORVQsIElQUFJPVE9fVENQLCBUQ1BDVExfUENCTElTVCB9OwogICAgY2hhciAgICAgKnRjcGNiX2J1ZiA9IE5VTEw7CiNpZiBkZWZpbmVkKGRyYWdvbmZseSkKICAgIHN0cnVjdCB4aW5wY2IgICp4aWcgPSBOVUxMOwogICAgaW50ICAgICAgU3RhdGVNYXBbXSA9IHsgMSwgMSwgMiwgMywgNCwgNSwgOCwgNiwgMTAsIDksIDcsIDExIH07CiNlbHNlCiAgICBzdHJ1Y3QgeGlucGdlbiAqeGlnID0gTlVMTDsKICAgIGludCAgICAgIFN0YXRlTWFwW10gPSB7IDEsIDIsIDMsIDQsIDUsIDgsIDYsIDEwLCA5LCA3LCAxMSB9OwojZW5kaWYKICAgIG5ldHNubXBfaW5wY2IgICpubmV3OwoKICAgIHRjcFRhYmxlX2ZyZWUoTlVMTCwgTlVMTCk7CgogICAgLyoKICAgICAqICBSZWFkIGluIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVENQIHRhYmxlIGRhdGEKICAgICAqLwogICAgbGVuID0gMDsKICAgIGlmIChzeXNjdGwoc25hbWUsIDQsIDAsICZsZW4sIDAsIDApIDwgMCB8fAogICAgICAgKHRjcGNiX2J1ZiA9IG1hbGxvYyhsZW4pKSA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKICAgIGlmIChzeXNjdGwoc25hbWUsIDQsIHRjcGNiX2J1ZiwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgZnJlZSh0Y3BjYl9idWYpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogIFVucGljayB0aGlzIGludG8gdGhlIGNvbnN0aXR1ZW50ICd4aW5wZ2VuJyBzdHJ1Y3R1cmVzLCBhbmQgZXh0cmFjdAogICAgICogICAgIHRoZSAnaW5wY2InIGVsZW1lbnRzIGludG8gYSBsaW5rZWQgbGlzdCAoYnVpbHQgaW4gcmV2ZXJzZSkKICAgICAqLwojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICB4aWcgPSAoc3RydWN0IHhpbnBjYiAgKikgdGNwY2JfYnVmOwojZWxzZQogICAgeGlnID0gKHN0cnVjdCB4aW5wZ2VuICopIHRjcGNiX2J1ZjsKICAgIHhpZyA9IChzdHJ1Y3QgeGlucGdlbiAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aWdfbGVuKTsKI2VuZGlmCgojaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICB3aGlsZSAoeGlnICYmICgoY2hhciAqKXhpZyArIHhpZy0+eGlfbGVuIDwgdGNwY2JfYnVmICsgbGVuKSkKI2Vsc2UKICAgIHdoaWxlICh4aWcgJiYgKHhpZy0+eGlnX2xlbiA+IHNpemVvZihzdHJ1Y3QgeGlucGdlbikpKQojZW5kaWYKICAgIHsKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX2lucGNiKTsKICAgICAgICBpZiAoIW5uZXcpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG5uZXctPnN0YXRlID0gU3RhdGVNYXBbKChOU19FTEVNICopIHhpZyktPnh0X3RwLnRfc3RhdGVdOwogICAgICAgIGlmIChubmV3LT5zdGF0ZSA9PSA1IC8qIGVzdGFibGlzaGVkICovIHx8CiAgICAgICAgICAgIG5uZXctPnN0YXRlID09IDggLyogIGNsb3NlV2FpdCAgKi8gKQogICAgICAgICAgICB0Y3BfZXN0YWIrKzsKICAgICAgICBtZW1jcHkoJihubmV3LT5wY2IpLCAmKCgoTlNfRUxFTSAqKSB4aWcpLT54dF9pbnApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGlucGNiKSk7CgoJaWYgKG5uZXctPnBjYi5pbnBfdmZsYWcgJiBJTlBfSVBWNikKCSAgICBmcmVlKG5uZXcpOwoJZWxzZSB7CgkgICAgbm5ldy0+aW5wX25leHQgPSB0Y3BfaGVhZDsKCSAgICB0Y3BfaGVhZCAgID0gbm5ldzsKCX0KI2lmIGRlZmluZWQoZHJhZ29uZmx5KQogICAgICAgIHhpZyA9IChzdHJ1Y3QgeGlucGNiICAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aV9sZW4pOwojZWxzZQogICAgICAgIHhpZyA9IChzdHJ1Y3QgeGlucGdlbiAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aWdfbGVuKTsKI2VuZGlmCiAgICB9CgogICAgZnJlZSh0Y3BjYl9idWYpOwogICAgaWYgKHRjcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkxvYWRlZCBUQ1AgVGFibGUgKHN5c2N0bClcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBUQ1AgVGFibGUgKHN5c2N0bClcbiIpKTsKICAgIHJldHVybiAtMTsKfQojdW5kZWYgTlNfRUxFTQoKI2Vsc2UJCS8qIChkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwpICYmIGRlZmluZWQoVENQQ1RMX1BDQkxJU1QpKSAqLwojaWZkZWYgUENCX1RBQkxFCmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIHN0cnVjdCBpbnBjYnRhYmxlIHRhYmxlOwogICAgc3RydWN0IGlucGNiICAgKmVudHJ5OwogICAgc3RydWN0IHRjcGNiICAgIHRjcGNiOwogICAgbmV0c25tcF9pbnBjYiAgKm5uZXc7CiAgICBpbnQgICAgICBTdGF0ZU1hcFtdID0geyAxLCAyLCAzLCA0LCA1LCA4LCA2LCAxMCwgOSwgNywgMTEgfTsKCiAgICB0Y3BUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICghYXV0b19ubGlzdChUQ1BfU1lNQk9MLCAoY2hhciAqKSAmdGFibGUsIHNpemVvZih0YWJsZSkpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkZhaWxlZCB0byByZWFkIGlucGNidGFibGVcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyoKICAgICAqICBTZXQgdXAgYSBsaW5rZWQgbGlzdAogICAgICovCiAgICBlbnRyeSAgPSB0YWJsZS5pbnB0X3F1ZXVlLmNxaF9maXJzdDsKICAgIHdoaWxlIChlbnRyeSkgewogICAKICAgICAgICBubmV3ID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX2lucGNiKTsKICAgICAgICBpZiAoIW5uZXcpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGVudHJ5LCAoY2hhciAqKSYobm5ldy0+cGNiKSwgc2l6ZW9mKHN0cnVjdCBpbnBjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZTpUY3BUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobm5ldy0+cGNiLmlucF9wcGNiLCAoY2hhciAqKSZ0Y3BjYiwgc2l6ZW9mKHN0cnVjdCB0Y3BjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZTpUY3BUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCW5uZXctPnN0YXRlID0gU3RhdGVNYXBbdGNwY2IudF9zdGF0ZV07CiAgICAgICAgaWYgKG5uZXctPnN0YXRlID09IDUgLyogZXN0YWJsaXNoZWQgKi8gfHwKICAgICAgICAgICAgbm5ldy0+c3RhdGUgPT0gOCAvKiAgY2xvc2VXYWl0ICAqLyApCiAgICAgICAgICAgIHRjcF9lc3RhYisrOwoKICAgICAgICBlbnRyeSAgICAgID0gbm5ldy0+SU5QX05FWFRfU1lNQk9MOwkvKiBOZXh0IGtlcm5lbCBlbnRyeSAqLwoJbm5ldy0+aW5wX25leHQgPSB0Y3BfaGVhZDsKCXRjcF9oZWFkICAgPSBubmV3OwoKICAgICAgICBpZiAoZW50cnkgPT0gdGFibGUuaW5wdF9xdWV1ZS5jcWhfZmlyc3QpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh0Y3BfaGVhZCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkZWQgVENQIFRhYmxlIChwY2JfdGFibGUpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVENQIFRhYmxlIChwY2JfdGFibGUpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KCiNlbHNlCQkJCS8qIFBDQl9UQUJMRSAqLwojaWZkZWYgVENQX1NZTUJPTAppbnQKdGNwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBzdHJ1Y3QgaW5wY2IgICB0Y3BfaW5wY2I7CiAgICBzdHJ1Y3QgdGNwY2IgICB0Y3BjYjsKICAgIG5ldHNubXBfaW5wY2IgICpubmV3OwogICAgc3RydWN0IGlucGNiICAgKmVudHJ5OwojaWZkZWYgaHB1eAogICAgaW50ICAgICAgU3RhdGVNYXBbXSA9IHsgMSwgMiwgMywgLTEsIDQsIDUsIDgsIDYsIDEwLCA5LCA3LCAxMSB9OwojZWxzZQogICAgaW50ICAgICAgU3RhdGVNYXBbXSA9IHsgMSwgMiwgMywgICAgIDQsIDUsIDgsIDYsIDEwLCA5LCA3LCAxMSB9OwojZW5kaWYKCiAgICB0Y3BUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIGlmICghYXV0b19ubGlzdChUQ1BfU1lNQk9MLCAoY2hhciAqKSAmdGNwX2lucGNiLCBzaXplb2YodGNwX2lucGNiKSkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIHJlYWQgdGNwX3N5bWJvbFxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogIFNldCB1cCBhIGxpbmtlZCBsaXN0CiAgICAgKi8KICAgIGVudHJ5ICA9IHRjcF9pbnBjYi5JTlBfTkVYVF9TWU1CT0w7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgCiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF9pbnBjYik7CiAgICAgICAgaWYgKCFubmV3KQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChlbnRyeSwgKGNoYXIgKikmKG5uZXctPnBjYiksIHNpemVvZihzdHJ1Y3QgaW5wY2IpKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGU6dGNwVGFibGVfbG9hZCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAobm5ldy0+cGNiLmlucF9wcGNiLCAoY2hhciAqKSZ0Y3BjYiwgc2l6ZW9mKHN0cnVjdCB0Y3BjYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZTp0Y3BUYWJsZV9sb2FkIiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCW5uZXctPnN0YXRlICAgID0gU3RhdGVNYXBbdGNwY2IudF9zdGF0ZV07CiAgICAgICAgaWYgKG5uZXctPnN0YXRlID09IDUgLyogZXN0YWJsaXNoZWQgKi8gfHwKICAgICAgICAgICAgbm5ldy0+c3RhdGUgPT0gOCAvKiAgY2xvc2VXYWl0ICAqLyApCiAgICAgICAgICAgIHRjcF9lc3RhYisrOwoKICAgICAgICBlbnRyeSAgICAgICAgICA9IG5uZXctPnBjYi5JTlBfTkVYVF9TWU1CT0w7CS8qIE5leHQga2VybmVsIGVudHJ5ICovCglubmV3LT5pbnBfbmV4dCA9IHRjcF9oZWFkOwoJdGNwX2hlYWQgICAgICAgPSBubmV3OwoKICAgICAgICBpZiAoZW50cnkgPT0gdGNwX2lucGNiLklOUF9ORVhUX1NZTUJPTCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHRjcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3RjcFRhYmxlIiwgIkxvYWRlZCBUQ1AgVGFibGUgKHRjcF9zeW1ib2wpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdGNwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVENQIFRhYmxlICh0Y3Bfc3ltYm9sKVxuIikpOwogICAgcmV0dXJuIC0xOwp9CgojZWxzZQkJCQkvKiBVREJfU1lNQk9MICovCmludAp0Y3BUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIERFQlVHTVNHVEwoKCJtaWJJSS90Y3BUYWJsZSIsICJMb2FkaW5nIFRDUCBUYWJsZSBub3QgaW1wbGVtZW50ZWRcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZW5kaWYJCQkJLyogVURCX1NZTUJPTCAqLwojZW5kaWYJCQkJLyogUENCX1RBQkxFICovCiNlbmRpZgkJLyogKGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX1NZU0NUTCkgJiYgZGVmaW5lZChUQ1BDVExfUENCTElTVCkpICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwo=