LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKi0gVGhpcyBpcyBhIC0qLSBDIC0qLSBjb21wYXRpYmxlIGNvZGUgZmlsZQogKgogKiBDb2RlIGZvciBTVU5PUzVfSU5TVFJVTUVOVEFUSU9OCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmNsdWRlcyBvZiBzdGFuZGFyZCBhbmQgbG9jYWwgc3lzdGVtIGhlYWRlciBmaWxlcywKICogaW5jbHVkZXMgb2Ygb3RoZXIgYXBwbGljYXRpb24gaGVhZGVyIGZpbGVzLCBnbG9iYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMsCiAqIHN0YXRpYyB2YXJpYWJsZSBkZWZpbml0aW9ucywgc3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMsIGFuZCBmdW5jdGlvbgogKiBkZWZpbml0aW9ucy4KICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHRvIG9idGFpbiBzdGF0aXN0aWNzIGZyb20gU3VuT1MgNS54IGtlcm5lbAogKgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2lmZGVmIHNvbGFyaXMyCi8qLQogKiBJbmNsdWRlcyBvZiBzdGFuZGFyZCBBTlNJIEMgaGVhZGVyIGZpbGVzIAogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLyotCiAqIEluY2x1ZGVzIG9mIHN5c3RlbSBoZWFkZXIgZmlsZXMgKHdyYXBwZWQgaW4gZHVwbGljYXRlIGluY2x1ZGUgcHJldmVudGlvbikKICovCgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cm9wdHMuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8a3ZtLmg+CiNpbmNsdWRlIDxzeXMvZmNudGwuaD4KI2luY2x1ZGUgPGtzdGF0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CiNpbmNsdWRlIDxzeXMvc3Ryb3B0cy5oPgojaW5jbHVkZSA8c3lzL3RpaGRyLmg+CiNpbmNsdWRlIDxzeXMvdGl1c2VyLmg+CiNpbmNsdWRlIDxzeXMvZGxwaS5oPgojaW5jbHVkZSA8aW5ldC9jb21tb24uaD4KI2luY2x1ZGUgPGluZXQvbWliMi5oPgojaW5jbHVkZSA8aW5ldC9pcC5oPgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CgovKi0KICogSW5jbHVkZXMgb2YgbG9jYWwgYXBwbGljYXRpb24gaGVhZGVyIGZpbGVzIAogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlICJrZXJuZWxfc3Vub3M1LmgiCgprc3RhdF9jdGxfdCAgICAqa3N0YXRfZmQgPSAwOwoKLyotCiAqIEdsb2JhbCB2YXJpYWJsZSBkZWZpbml0aW9ucyAod2l0aCBpbml0aWFsaXphdGlvbikKICovCgovKi0KICogU3RhdGljIHZhcmlhYmxlIGRlZmluaXRpb25zICh3aXRoIGluaXRpYWxpemF0aW9uKQogKi8KCnN0YXRpYwptaWJjYWNoZSAgICAgICAgTWliY2FjaGVbTUlCQ0FDSEVfU0laRSsxXSA9IHsKICAgIHtNSUJfU1lTVEVNLCAwLCAodm9pZCAqKSAtMSwgMCwgMCwgMCwgMH0sCiAgICB7TUlCX0lOVEVSRkFDRVMsIDUwICogc2l6ZW9mKG1pYjJfaWZFbnRyeV90KSwgKHZvaWQgKikgLTEsIDAsIDMwLCAwLAogICAgIDB9LAogICAge01JQl9BVCwgMCwgKHZvaWQgKikgLTEsIDAsIDAsIDAsIDB9LAogICAge01JQl9JUCwgc2l6ZW9mKG1pYjJfaXBfdCksICh2b2lkICopIC0xLCAwLCA2MCwgMCwgMH0sCiAgICB7TUlCX0lQX0FERFIsIDIwICogc2l6ZW9mKG1pYjJfaXBBZGRyRW50cnlfdCksICh2b2lkICopIC0xLCAwLCA2MCwgMCwKICAgICAwfSwKICAgIHtNSUJfSVBfUk9VVEUsIDIwMCAqIHNpemVvZihtaWIyX2lwUm91dGVFbnRyeV90KSwgKHZvaWQgKikgLTEsIDAsIDMwLAogICAgIDAsIDB9LAogICAge01JQl9JUF9ORVQsIDEwMCAqIHNpemVvZihtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QpLCAodm9pZCAqKSAtMSwgMCwKICAgICAzMDAsIDAsIDB9LAogICAge01JQl9JQ01QLCBzaXplb2YobWliMl9pY21wX3QpLCAodm9pZCAqKSAtMSwgMCwgNjAsIDAsIDB9LAogICAge01JQl9UQ1AsIHNpemVvZihtaWIyX3RjcF90KSwgKHZvaWQgKikgLTEsIDAsIDYwLCAwLCAwfSwKICAgIHtNSUJfVENQX0NPTk4sIDEwMDAgKiBzaXplb2YobWliMl90Y3BDb25uRW50cnlfdCksICh2b2lkICopIC0xLCAwLCAzMCwKICAgICAwLCAwfSwKICAgIHtNSUJfVURQLCBzaXplb2YobWliMl91ZHBfdCksICh2b2lkICopIC0xLCAwLCAzMCwgMCwgMH0sCiAgICB7TUlCX1VEUF9MSVNURU4sIDEwMDAgKiBzaXplb2YobWliMl91ZHBFbnRyeV90KSwgKHZvaWQgKikgLTEsIDAsIDMwLCAwLAogICAgIDB9LAogICAge01JQl9FR1AsIDAsICh2b2lkICopIC0xLCAwLCAwLCAwLCAwfSwKICAgIHtNSUJfQ01PVCwgMCwgKHZvaWQgKikgLTEsIDAsIDAsIDAsIDB9LAogICAge01JQl9UUkFOU01JU1NJT04sIDAsICh2b2lkICopIC0xLCAwLCAwLCAwLCAwfSwKICAgIHtNSUJfU05NUCwgMCwgKHZvaWQgKikgLTEsIDAsIDAsIDAsIDB9LAojaWZkZWYgU09MQVJJU19IQVZFX0lQVjZfTUlCX1NVUFBPUlQKI2lmZGVmIFNPTEFSSVNfSEFWRV9SRkM0MjkzX1NVUFBPUlQKICAgIHtNSUJfSVBfVFJBRkZJQ19TVEFUUywgMjAgKiBzaXplb2YobWliMl9pcElmU3RhdHNFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwKICAgICAzMCwgMCwgMH0sCiAgICB7TUlCX0lQNiwgMjAgKiBzaXplb2YobWliMl9pcElmU3RhdHNFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwgMzAsIDAsIDB9LAojZWxzZQogICAge01JQl9JUDYsIDIwICogc2l6ZW9mKG1pYjJfaXB2NklmU3RhdHNFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwgMzAsIDAsIDB9LAojZW5kaWYKICAgIHtNSUJfSVA2X0FERFIsIDIwICogc2l6ZW9mKG1pYjJfaXB2NkFkZHJFbnRyeV90KSwgKHZvaWQgKiktMSwgMCwgMzAsIDAsIDB9LAogICAge01JQl9UQ1A2X0NPTk4sIDEwMDAgKiBzaXplb2YobWliMl90Y3A2Q29ubkVudHJ5X3QpLCAodm9pZCAqKSAtMSwgMCwgMzAsCiAgICAgMCwgMH0sCiAgICB7TUlCX1VEUDZfRU5EUE9JTlQsIDEwMDAgKiBzaXplb2YobWliMl91ZHA2RW50cnlfdCksICh2b2lkICopIC0xLCAwLCAzMCwKICAgICAwLCAwfSwKI2VuZGlmCiNpZmRlZiBNSUIyX1NDVFAKICAgIHtNSUJfU0NUUCwgc2l6ZW9mKG1pYjJfc2N0cF90KSwgKHZvaWQgKiktMSwgMCwgNjAsIDAsIDB9LAogICAge01JQl9TQ1RQX0NPTk4sIHNpemVvZihtaWIyX3NjdHBDb25uRW50cnlfdCksICh2b2lkICopLTEsIDAsIDYwLCAwLCAwfSwKICAgIHtNSUJfU0NUUF9DT05OX0xPQ0FMLCBzaXplb2YobWliMl9zY3RwQ29ubkxvY2FsRW50cnlfdCksICh2b2lkICopLTEsIDAsCiAgICAgNjAsIDAsIDB9LAogICAge01JQl9TQ1RQX0NPTk5fUkVNT1RFLCBzaXplb2YobWliMl9zY3RwQ29ublJlbW90ZUVudHJ5X3QpLCAodm9pZCAqKS0xLCAwLAogICAgIDYwLCAwLCAwfSwKI2VuZGlmCiAgICB7MH0sCn07CgpzdGF0aWMKbWlibWFwICAgICAgICAgIE1pYm1hcFtNSUJDQUNIRV9TSVpFKzFdID0gewogICAge01JQjJfU1lTVEVNLCAwLH0sCiAgICB7TUlCMl9JTlRFUkZBQ0VTLCAwLH0sCiAgICB7TUlCMl9BVCwgMCx9LAogICAge01JQjJfSVAsIDAsfSwKICAgIHtNSUIyX0lQLCBNSUIyX0lQXzIwLH0sCiAgICB7TUlCMl9JUCwgTUlCMl9JUF8yMSx9LAogICAge01JQjJfSVAsIE1JQjJfSVBfMjIsfSwKICAgIHtNSUIyX0lDTVAsIDAsfSwKICAgIHtNSUIyX1RDUCwgMCx9LAogICAge01JQjJfVENQLCBNSUIyX1RDUF8xMyx9LAogICAge01JQjJfVURQLCAwLH0sCiAgICB7TUlCMl9VRFAsIE1JQjJfVURQXzV9LAogICAge01JQjJfRUdQLCAwLH0sCiAgICB7TUlCMl9DTU9ULCAwLH0sCiAgICB7TUlCMl9UUkFOU01JU1NJT04sIDAsfSwKICAgIHtNSUIyX1NOTVAsIDAsfSwKI2lmZGVmIFNPTEFSSVNfSEFWRV9JUFY2X01JQl9TVVBQT1JUCiNpZmRlZiBTT0xBUklTX0hBVkVfUkZDNDI5M19TVVBQT1JUCiAgICB7TUlCMl9JUCwgTUlCMl9JUF9UUkFGRklDX1NUQVRTfSwKI2VuZGlmCiAgICB7TUlCMl9JUDYsIDB9LAogICAge01JQjJfSVA2LCBNSUIyX0lQNl9BRERSfSwKICAgIHtNSUIyX1RDUDYsIE1JQjJfVENQNl9DT05OfSwKICAgIHtNSUIyX1VEUDYsIE1JQjJfVURQNl9FTlRSWX0sCiNlbmRpZgojaWZkZWYgTUlCMl9TQ1RQCiAgICB7TUlCMl9TQ1RQLCAwfSwKICAgIHtNSUIyX1NDVFAsIE1JQjJfU0NUUF9DT05OfSwKICAgIHtNSUIyX1NDVFAsIE1JQjJfU0NUUF9DT05OX0xPQ0FMfSwKICAgIHtNSUIyX1NDVFAsIE1JQjJfU0NUUF9DT05OX1JFTU9URX0sCiNlbmRpZgogICAgezB9LAp9OwoKc3RhdGljIGludCAgICAgIHNkID0gLTI7ICAgICAgICAvKiAvZGV2L2FycCBzdHJlYW0gZGVzY3JpcHRvci4gKi8KCi8qLQogKiBTdGF0aWMgZnVuY3Rpb24gcHJvdG90eXBlcyAodXNlIHZvaWQgYXMgYXJndW1lbnQgdHlwZSBpZiB0aGVyZSBhcmUgbm9uZSkKICovCgpzdGF0aWMgZm91bmRfZQpnZXRlbnRyeShyZXFfZSByZXFfdHlwZSwgdm9pZCAqYnVmYWRkciwgc2l6ZV90IGxlbiwgc2l6ZV90IGVudHJ5c2l6ZSwKICAgICAgICAgdm9pZCAqcmVzcCwgaW50ICgqY29tcCkodm9pZCAqLCB2b2lkICopLCB2b2lkICphcmcpOwoKc3RhdGljIGludApnZXRtaWIoaW50IGdyb3VwbmFtZSwgaW50IHN1Ymdyb3VwbmFtZSwgdm9pZCAqKnN0YXRidWYsIHNpemVfdCAqc2l6ZSwKICAgICAgIHNpemVfdCBlbnRyeXNpemUsIHJlcV9lIHJlcV90eXBlLCB2b2lkICpyZXNwLCBzaXplX3QgKmxlbmd0aCwKICAgICAgIGludCAoKmNvbXApKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKTsKCnN0YXRpYyBpbnQKZ2V0aWYobWliMl9pZkVudHJ5X3QgKmlmYnVmLCBzaXplX3Qgc2l6ZSwgcmVxX2UgcmVxX3R5cGUsIG1pYjJfaWZFbnRyeV90ICpyZXNwLAogICAgICBzaXplX3QgKmxlbmd0aCwgaW50ICgqY29tcCkodm9pZCAqLCB2b2lkICopLCB2b2lkICphcmcpOwpzdGF0aWMgdm9pZCAKc2V0X2lmX2luZm8obWliMl9pZkVudHJ5X3QgKmlmcCwgdW5zaWduZWQgaW5kZXgsIGNoYXIgKm5hbWUsIHVpbnQ2NF90IGZsYWdzLAogICAgICAgICAgICBpbnQgbXR1KTsKc3RhdGljIGludCBnZXRfaWZfc3RhdHMobWliMl9pZkVudHJ5X3QgKmlmcCk7CgojaWYgZGVmaW5lZChIQVZFX0lGX05BTUVJTkRFWCkgJiYgZGVmaW5lZChORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUykKc3RhdGljIGludCBfZGxwaV9vcGVuKGNvbnN0IGNoYXIgKmRldm5hbWUpOwpzdGF0aWMgaW50IF9kbHBpX2dldF9waHlzX2FkZHJlc3MoaW50IGZkLCBjaGFyICpwYWRkciwgaW50IG1heGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGFkZHJsZW4pOwpzdGF0aWMgaW50IF9kbHBpX2dldF9pZnR5cGUoaW50IGZkLCB1bnNpZ25lZCBpbnQgKmlmdHlwZSk7CnN0YXRpYyBpbnQgX2RscGlfYXR0YWNoKGludCBmZCwgaW50IHBwYSk7CnN0YXRpYyBpbnQgX2RscGlfcGFyc2VfZGV2bmFtZShjaGFyICpkZXZuYW1lLCBpbnQgKnBwYXApOwojZW5kaWYKCgoKc3RhdGljIGludApOYW1lX2NtcCh2b2lkICosIHZvaWQgKik7CgpzdGF0aWMgdm9pZAppbml0X21pYmNhY2hlX2VsZW1lbnQobWliY2FjaGUgKiBjcCk7CgojZGVmaW5lCVNUUkVBTV9ERVYJIi9kZXYvYXJwIgojZGVmaW5lCUJVRlNJWkUJCTQwOTYwICAgLyogQnVmZmVyIGZvciAgbWVzc2FnZXMgKHNob3VsZCBiZSBtb2R1bG8ocGFnZXNpemUpICovCgovKi0KICogRnVuY3Rpb24gZGVmaW5pdGlvbnMKICovCgojaWZkZWYgX1NURENfQ09NUEFUCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gICAgICAgICAgIkMiIHsKI2VuZGlmCiNlbmRpZgoKLyoKICogSSBwcm9maWxlZCBzbm1wZCB1c2luZyBRdWFudGlmeSBvbiBhIFNvbGFyaXMgNyBib3gsIGFuZCBpdCB0dXJuZWQgb3V0IHRoYXQKICogdGhlIGNhbGxzIHRvIHRpbWUoKSBpbiBnZXRNaWJzdGF0KCkgd2VyZSB0YWtpbmcgMTglIG9mIHRoZSB0b3RhbCBleGVjdXRpb24KICogdGltZSBvZiBzbm1wZCB3aGVuIGRvaW5nIHNpbXBsZSB3YWxrcyBvdmVyIHRoZSB3aG9sZSB0cmVlLiAgSSBndWVzcyBpdCBtdXN0CiAqIGJlIGRpZmZpY3VsdCBmb3IgU3VuIGhhcmR3YXJlIHRvIHRlbGwgdGhlIHRpbWUgb3Igc29tZXRoaW5nIDstKS4gIEFueXdheSwKICogdGhpcyBzZWVtZWQgbGlrZSBpdCB3YXMgbmVnYXRpbmcgdGhlIHBvaW50IG9mIGhhdmluZyB0aGUgY2FjaGUsIHNvIEkgaGF2ZQogKiBjaGFuZ2VkIHRoZSBjb2RlIHNvIHRoYXQgaXQgcnVucyBhIHBlcmlvZGljIGFsYXJtIHRvIGFnZSB0aGUgY2FjaGUgZW50cmllcwogKiBpbnN0ZWFkLiAgVGhlIG1lYW5pbmcgb2YgdGhlIGNhY2hlX3R0bCBhbmQgY2FjaGVfdGltZSBtZW1iZXJzIGhhcyBjaGFuZ2VkIHRvCiAqIHN1cHBvcnQgdGhpcy4gIGNhY2hlX3R0bCBpcyBub3cgdGhlIHZhbHVlIHRoYXQgY2FjaGVfdGltZSBnZXRzIHJlc2V0IHRvIHdoZW4KICogd2UgZmV0Y2ggYSB2YWx1ZSBmcm9tIHRoZSBrZXJuZWw7IGNhY2hlX3RpbWUgdGhlbiB0aWNrcyBkb3duIHRvIHplcm8gaW4KICogc3RlcHMgb2YgcGVyaW9kIChzZWUgYmVsb3cpLiAgV2hlbiBpdCByZWFjaGVzIHplcm8sIHRoZSBjYWNoZSBlbnRyeSBpcyBubwogKiBsb25nZXIgdmFsaWQgYW5kIHdlIGZldGNoIGEgbmV3IG9uZS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKICogcHJldmlvdXMgY29kZSwgYnV0IG1vcmUgZWZmaWNpZW50IChiZWNhdXNlIGl0J3Mgbm90IGNhbGxpbmcgdGltZSgpIGZvciBldmVyeQogKiB2YXJpYWJsZSBmZXRjaGVkKSB3aGVuIHlvdSBhcmUgd2Fsa2luZyB0aGUgdGFibGVzLiAgamJwbiwgMjAwMjAyMjYuCiAqLwoKc3RhdGljIHZvaWQKa2VybmVsX3N1bm9zNV9jYWNoZV9hZ2UodW5zaWduZWQgaW50IHJlZ251bWJlciwgdm9pZCAqZGF0YSkKewogICAgaW50IGkgPSAwLCBwZXJpb2QgPSAoaW50KWRhdGE7CgogICAgZm9yIChpID0gMDsgaSA8IE1JQkNBQ0hFX1NJWkU7IGkrKykgewoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiY2FjaGVbJWRdIHRpbWUgJWxkIHR0bCAlZFxuIiwgaSwKCQkgICAgTWliY2FjaGVbaV0uY2FjaGVfdGltZSwgTWliY2FjaGVbaV0uY2FjaGVfdHRsKSk7CglpZiAoTWliY2FjaGVbaV0uY2FjaGVfdGltZSA8IHBlcmlvZCkgewoJICAgIE1pYmNhY2hlW2ldLmNhY2hlX3RpbWUgPSAwOwoJfSBlbHNlIHsKCSAgICBNaWJjYWNoZVtpXS5jYWNoZV90aW1lIC09IHBlcmlvZDsKCX0KICAgIH0KfQoKdm9pZAppbml0X2tlcm5lbF9zdW5vczUodm9pZCkKewogICAgc3RhdGljIGludCBjcmVnICAgPSAwOwogICAgY29uc3QgIGludCBwZXJpb2QgPSAzMDsKICAgIGludCAgICBhbGFybV9pZCAgID0gMDsKCiAgICBpZiAoY3JlZyA9PSAwKSB7CglhbGFybV9pZCA9IHNubXBfYWxhcm1fcmVnaXN0ZXIoNSwgTlVMTCwga2VybmVsX3N1bm9zNV9jYWNoZV9hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAicmVnaXN0ZXJlZCBhbGFybSAlZCB3aXRoIHBlcmlvZCA1c1xuIiwgCgkJICAgIGFsYXJtX2lkKSk7CglhbGFybV9pZCA9IHNubXBfYWxhcm1fcmVnaXN0ZXIocGVyaW9kLCBTQV9SRVBFQVQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxfc3Vub3M1X2NhY2hlX2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwZXJpb2QpOwoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAicmVnaXN0ZXJlZCBhbGFybSAlZCB3aXRoIHBlcmlvZCAlZHNcbiIsIAoJCSAgICBhbGFybV9pZCwgcGVyaW9kKSk7CiAgICAgICAgKytjcmVnOwogICAgfQp9CgovKgogKiBHZXQgdmFyaW91cyBrZXJuZWwgc3RhdGlzdGljcyB1c2luZyB1bmRvY3VtZW50ZWQgU29sYXJpcyBrc3RhdCBpbnRlcmZhY2UuCiAqIFdlIG5lZWQgaXQgbWFpbmx5IGZvciBnZXR0aW5nIG5ldHdvcmsgaW50ZXJmYWNlIHN0YXRpc3RpY3MsIGFsdGhvdWdoIGl0IGlzCiAqIGdlbmVyaWMgZW5vdWdoIHRvIGJlIHVzZWQgZm9yIGFueSBwdXJwb3NlLiAgSXQga25vd3MgYWJvdXQga3N0YXRfaGVhZGVycwogKiBtb2R1bGUgbmFtZXMgYW5kIGJ5IHRoZSBuYW1lIG9mIHRoZSBzdGF0aXN0aWNzIGl0IHRyaWVzIHRvIGZpZ3VyZSBvdXQgdGhlCiAqIHJlc3Qgb2YgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLiAgUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgPCAwIGlmCiAqIHRoZXJlIHdlcmUgYW55IGVycm9ycy4KIAogKiAKICogTk9URTogVG8gdXNlIHRoaXMgZnVuY3Rpb24gY29ycmVjdGx5IHlvdSBoYXZlIHRvIGtub3cgdGhlIGFjdHVhbCB0eXBlIG9mIHRoZQogKiB2YWx1ZSB0byBiZSByZXR1cm5lZCwgc28geW91IG1heSBidWlsZCB0aGUgdGVzdCBwcm9ncmFtLCBmaWd1cmUgb3V0IHRoZSB0eXBlCiAqIGFuZCB1c2UgaXQuIEV4cG9zaW5nIGtzdGF0IGRhdGEgdHlwZXMgdG8gdXBwZXIgbGF5ZXJzIGRvZXNuJ3Qgc2VlbSB0byBiZQogKiByZWFzb25hYmxlLiBJbiBhbnkgY2FzZSBJJ2QgZXhwZWN0IG1vcmUgcmVhc29uYWJsZSBrc3RhdCBpbnRlcmZhY2UuIDotKAogKi8KCgppbnQKZ2V0S3N0YXRJbnQoY29uc3QgY2hhciAqY2xhc3NuYW1lLCBjb25zdCBjaGFyICpzdGF0bmFtZSwgCgkgICAgY29uc3QgY2hhciAqdmFybmFtZSwgaW50ICp2YWx1ZSkKewogICAga3N0YXRfY3RsX3QgICAgKmtzYzsKICAgIGtzdGF0X3QgICAgICAgICprczsKICAgIGtpZF90ICAgICAgICAgICBraWQ7CiAgICBrc3RhdF9uYW1lZF90ICAqbmFtZWQ7CiAgICBpbnQgICAgICAgICAgICAgcmV0ID0gLTE7ICAgICAgICAvKiBmYWlsIHVubGVzcyAuLi4gKi8KCiAgICBpZiAoa3N0YXRfZmQgPT0gMCkgewoJa3N0YXRfZmQgPSBrc3RhdF9vcGVuKCk7CglpZiAoa3N0YXRfZmQgPT0gMCkgewoJICAgIHNubXBfbG9nX3BlcnJvcigia3N0YXRfb3BlbiIpOwoJfQogICAgfQogICAgaWYgKChrc2MgPSBrc3RhdF9mZCkgPT0gTlVMTCkgewoJZ290byBSZXR1cm47CiAgICB9CiAgICBrcyA9IGtzdGF0X2xvb2t1cChrc2MsIGNsYXNzbmFtZSwgLTEsIHN0YXRuYW1lKTsKICAgIGlmIChrcyA9PSBOVUxMKSB7CglERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJjbGFzcyAlcywgc3RhdCAlcyBub3QgZm91bmRcbiIsCgkJY2xhc3NuYW1lID8gY2xhc3NuYW1lIDogIk5VTEwiLAoJCXN0YXRuYW1lID8gc3RhdG5hbWUgOiAiTlVMTCIpKTsKCWdvdG8gUmV0dXJuOwogICAgfQogICAga2lkID0ga3N0YXRfcmVhZChrc2MsIGtzLCBOVUxMKTsKICAgIGlmIChraWQgPT0gLTEpIHsKCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgImNhbm5vdCByZWFkIGNsYXNzICVzIHN0YXRzICVzXG4iLAoJCWNsYXNzbmFtZSA/IGNsYXNzbmFtZSA6ICJOVUxMIiwgc3RhdG5hbWUgPyBzdGF0bmFtZSA6ICJOVUxMIikpOwoJZ290byBSZXR1cm47CiAgICB9CiAgICBuYW1lZCA9IGtzdGF0X2RhdGFfbG9va3VwKGtzLCB2YXJuYW1lKTsKICAgIGlmIChuYW1lZCA9PSBOVUxMKSB7CglERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJubyB2YXIgJXMgZm9yIGNsYXNzICVzIHN0YXQgJXNcbiIsCgkJdmFybmFtZSwgY2xhc3NuYW1lID8gY2xhc3NuYW1lIDogIk5VTEwiLAoJCXN0YXRuYW1lID8gc3RhdG5hbWUgOiAiTlVMTCIpKTsKCWdvdG8gUmV0dXJuOwogICAgfQoKICAgIHJldCA9IDA7ICAgICAgICAgICAgICAgIC8qIG1heWJlIHN1Y2Nlc3NmdWwgKi8KICAgIHN3aXRjaCAobmFtZWQtPmRhdGFfdHlwZSkgewojaWZkZWYgS1NUQVRfREFUQV9JTlQzMiAgICAgICAgIC8qIFNvbGFyaXMgMi42IGFuZCB1cCAqLwogICAgY2FzZSBLU1RBVF9EQVRBX0lOVDMyOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLmkzMjsKCWJyZWFrOwogICAgY2FzZSBLU1RBVF9EQVRBX1VJTlQzMjoKCSp2YWx1ZSA9IG5hbWVkLT52YWx1ZS51aTMyOwoJYnJlYWs7CiAgICBjYXNlIEtTVEFUX0RBVEFfSU5UNjQ6CgkqdmFsdWUgPSBuYW1lZC0+dmFsdWUuaTY0OwoJYnJlYWs7CiAgICBjYXNlIEtTVEFUX0RBVEFfVUlOVDY0OgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLnVpNjQ7CglicmVhazsKI2Vsc2UKICAgIGNhc2UgS1NUQVRfREFUQV9MT05HOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLmw7CglicmVhazsKICAgIGNhc2UgS1NUQVRfREFUQV9VTE9ORzoKCSp2YWx1ZSA9IG5hbWVkLT52YWx1ZS51bDsKCWJyZWFrOwogICAgY2FzZSBLU1RBVF9EQVRBX0xPTkdMT05HOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLmxsOwoJYnJlYWs7CiAgICBjYXNlIEtTVEFUX0RBVEFfVUxPTkdMT05HOgoJKnZhbHVlID0gbmFtZWQtPnZhbHVlLnVsbDsKCWJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6Cglzbm1wX2xvZyhMT0dfRVJSLAoJCSJub24taW50IHR5cGUgaW4ga3N0YXQgZGF0YTogXCIlc1wiIFwiJXNcIiBcIiVzXCIgJWRcbiIsCgkJY2xhc3NuYW1lID8gY2xhc3NuYW1lIDogIk5VTEwiLAoJCXN0YXRuYW1lID8gc3RhdG5hbWUgOiAiTlVMTCIsCgkJdmFybmFtZSA/IHZhcm5hbWUgOiAiTlVMTCIsIG5hbWVkLT5kYXRhX3R5cGUpOwoJcmV0ID0gLTE7ICAgICAgICAgICAgLyogZmFpbCAqLwoJYnJlYWs7CiAgICB9CiBSZXR1cm46CiAgICByZXR1cm4gcmV0Owp9CgppbnQKZ2V0S3N0YXQoY29uc3QgY2hhciAqc3RhdG5hbWUsIGNvbnN0IGNoYXIgKnZhcm5hbWUsIHZvaWQgKnZhbHVlKQp7CiAgICBrc3RhdF9jdGxfdCAgICAqa3NjOwogICAga3N0YXRfdCAgICAgICAgKmtzLCAqa3N0YXRfZGF0YTsKICAgIGtzdGF0X25hbWVkX3QgICpkOwogICAgdWludF90ICAgICAgICAgIGk7CiAgICBpbnQgICAgICAgICAgICAgaW5zdGFuY2U7CiAgICBjaGFyICAgICAgICAgICAgbW9kdWxlX25hbWVbNjRdOwogICAgaW50ICAgICAgICAgICAgIHJldDsKICAgIHVfbG9uZ2xvbmdfdCAgICB2YWw7ICAgIC8qIFRoZSBsYXJnZXN0IHZhbHVlICovCiAgICB2b2lkICAgICAgICAgICAqdjsKICAgIHN0YXRpYyBjaGFyICAgIGJ1ZlsxMjhdOwoKICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7ICAgICAgLyogUHJldHR5IHVzZWxlc3MgYnV0IC4uLiAqLwoJdiA9ICh2b2lkICopICZ2YWw7CiAgICB9IGVsc2UgewoJdiA9IHZhbHVlOwogICAgfQoKICAgIGlmIChrc3RhdF9mZCA9PSAwKSB7Cglrc3RhdF9mZCA9IGtzdGF0X29wZW4oKTsKCWlmIChrc3RhdF9mZCA9PSAwKSB7CgkgICAgc25tcF9sb2dfcGVycm9yKCJrc3RhdF9vcGVuIik7Cgl9CiAgICB9CiAgICBpZiAoKGtzYyA9IGtzdGF0X2ZkKSA9PSBOVUxMKSB7CglyZXQgPSAtMTA7Cglnb3RvIFJldHVybjsgICAgICAgIC8qIGtzdGF0IGVycm9ycyAqLwogICAgfQogICAgaWYgKHN0YXRuYW1lID09IE5VTEwgfHwgdmFybmFtZSA9PSBOVUxMKSB7CglyZXQgPSAtMjA7Cglnb3RvIFJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogRmlyc3QsIGdldCAia3N0YXRfaGVhZGVycyIgc3RhdGlzdGljcy4gSXQgc2hvdWxkCiAgICAgKiBjb250YWluIGFsbCBhdmFpbGFibGUgbW9kdWxlcy4gCiAgICAgKi8KCiAgICBpZiAoKGtzID0ga3N0YXRfbG9va3VwKGtzYywgInVuaXgiLCAwLCAia3N0YXRfaGVhZGVycyIpKSA9PSBOVUxMKSB7CglyZXQgPSAtMTA7Cglnb3RvIFJldHVybjsgICAgICAgIC8qIGtzdGF0IGVycm9ycyAqLwogICAgfQogICAgaWYgKGtzdGF0X3JlYWQoa3NjLCBrcywgTlVMTCkgPD0gMCkgewoJcmV0ID0gLTEwOwoJZ290byBSZXR1cm47ICAgICAgICAvKiBrc3RhdCBlcnJvcnMgKi8KICAgIH0KICAgIGtzdGF0X2RhdGEgPSBrcy0+a3NfZGF0YTsKICAgIAogICAgLyoKICAgICAqIE5vdywgbG9vayBmb3IgdGhlIG5hbWUgb2Ygb3VyIHN0YXQgaW4gdGhlIGhlYWRlcnMgYnVmIAogICAgICovCiAgICBmb3IgKGkgPSAwOyBpIDwga3MtPmtzX25kYXRhOyBpKyspIHsKCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwKCQkgICAgIm1vZHVsZTogJXMgaW5zdGFuY2U6ICVkIG5hbWU6ICVzIGNsYXNzOiAlcyB0eXBlOiAlZCBmbGFnczogJXhcbiIsCgkJICAgIGtzdGF0X2RhdGFbaV0ua3NfbW9kdWxlLCBrc3RhdF9kYXRhW2ldLmtzX2luc3RhbmNlLAoJCSAgICBrc3RhdF9kYXRhW2ldLmtzX25hbWUsIGtzdGF0X2RhdGFbaV0ua3NfY2xhc3MsCgkJICAgIGtzdGF0X2RhdGFbaV0ua3NfdHlwZSwga3N0YXRfZGF0YVtpXS5rc19mbGFncykpOwoJaWYgKHN0cmNtcChzdGF0bmFtZSwga3N0YXRfZGF0YVtpXS5rc19uYW1lKSA9PSAwKSB7CgkgICAgc3RyY3B5KG1vZHVsZV9uYW1lLCBrc3RhdF9kYXRhW2ldLmtzX21vZHVsZSk7CgkgICAgaW5zdGFuY2UgPSBrc3RhdF9kYXRhW2ldLmtzX2luc3RhbmNlOwoJICAgIGJyZWFrOwoJfQogICAgfQogICAgCiAgICBpZiAoaSA9PSBrcy0+a3NfbmRhdGEpIHsKCXJldCA9IC0xOwoJZ290byBSZXR1cm47ICAgICAgICAvKiBOb3QgZm91bmQgKi8KICAgIH0KICAgIAogICAgLyoKICAgICAqIEdldCB0aGUgbmFtZWQgc3RhdGlzdGljcyAKICAgICAqLwogICAgaWYgKChrcyA9IGtzdGF0X2xvb2t1cChrc2MsIG1vZHVsZV9uYW1lLCBpbnN0YW5jZSwgc3RhdG5hbWUpKSA9PSBOVUxMKSB7CglyZXQgPSAtMTA7Cglnb3RvIFJldHVybjsgICAgICAgIC8qIGtzdGF0IGVycm9ycyAqLwogICAgfQoKICAgIGlmIChrc3RhdF9yZWFkKGtzYywga3MsIE5VTEwpIDw9IDApIHsKCXJldCA9IC0xMDsKCWdvdG8gUmV0dXJuOyAgICAgICAgLyoga3N0YXQgZXJyb3JzICovCiAgICB9CiAgICAvKgogICAgICogVGhpcyBmdW5jdGlvbiBleHBlY3RzIG9ubHkgbmFtZS92YWx1ZSB0eXBlIG9mIHN0YXRpc3RpY3MsIHNvIGlmIGl0IGlzCiAgICAgKiBub3QgdGhlIGNhc2UgcmV0dXJuIGFuIGVycm9yCiAgICAgKi8KICAgIGlmIChrcy0+a3NfdHlwZSAhPSBLU1RBVF9UWVBFX05BTUVEKSB7CglyZXQgPSAtMjsKCWdvdG8gUmV0dXJuOyAgICAgICAgLyogSW52YWxpZCBzdGF0IHR5cGUgKi8KICAgIH0KICAgIAogICAgZm9yIChpID0gMCwgZCA9IEtTVEFUX05BTUVEX1BUUihrcyk7IGkgPCBrcy0+a3NfbmRhdGE7IGkrKywgZCsrKSB7CglERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YXJpYWJsZTogXCIlc1wiICh0eXBlICVkKVxuIiwgCgkJICAgIGQtPm5hbWUsIGQtPmRhdGFfdHlwZSkpOwoKCWlmIChzdHJjbXAoZC0+bmFtZSwgdmFybmFtZSkgPT0gMCkgewoJICAgIHN3aXRjaCAoZC0+ZGF0YV90eXBlKSB7CgkgICAgY2FzZSBLU1RBVF9EQVRBX0NIQVI6CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICVzXG4iLCBkLT52YWx1ZS5jKSk7CgkJKihjaGFyICoqKXYgPSBidWY7CgkJc3RybGNweShidWYsIGQtPnZhbHVlLmMsIHNpemVvZihidWYpKTsKCQlicmVhazsKI2lmZGVmIEtTVEFUX0RBVEFfSU5UMzIgICAgICAgICAvKiBTb2xhcmlzIDIuNiBhbmQgdXAgKi8KCSAgICBjYXNlIEtTVEFUX0RBVEFfSU5UMzI6CgkJKihDb3VudGVyICopdiA9IGQtPnZhbHVlLmkzMjsKCQlERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YWx1ZTogJWRcbiIsIGQtPnZhbHVlLmkzMikpOwoJCWJyZWFrOwoJICAgIGNhc2UgS1NUQVRfREFUQV9VSU5UMzI6CgkJKihDb3VudGVyICopdiA9IGQtPnZhbHVlLnVpMzI7CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICV1XG4iLCBkLT52YWx1ZS51aTMyKSk7CgkJYnJlYWs7CgkgICAgY2FzZSBLU1RBVF9EQVRBX0lOVDY0OgoJCSooaW50NjRfdCAqKXYgPSBkLT52YWx1ZS5pNjQ7CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICVsZFxuIiwgZC0+dmFsdWUuaTY0KSk7CgkJYnJlYWs7CgkgICAgY2FzZSBLU1RBVF9EQVRBX1VJTlQ2NDoKCQkqKHVpbnQ2NF90ICopdiA9IGQtPnZhbHVlLnVpNjQ7CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICVsdVxuIiwgZC0+dmFsdWUudWk2NCkpOwoJCWJyZWFrOwojZWxzZQoJICAgIGNhc2UgS1NUQVRfREFUQV9MT05HOgoJCSooQ291bnRlciAqKXYgPSBkLT52YWx1ZS5sOwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlbGRcbiIsIGQtPnZhbHVlLmwpKTsKCQlicmVhazsKCSAgICBjYXNlIEtTVEFUX0RBVEFfVUxPTkc6CgkJKihDb3VudGVyICopdiA9IGQtPnZhbHVlLnVsOwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlbHVcbiIsIGQtPnZhbHVlLnVsKSk7CgkJYnJlYWs7CgkgICAgY2FzZSBLU1RBVF9EQVRBX0xPTkdMT05HOgoJCSooQ291bnRlciAqKXYgPSBkLT52YWx1ZS5sbDsKCQlERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YWx1ZTogJWxsZFxuIiwKCQkJICAgIChsb25nKWQtPnZhbHVlLmxsKSk7CgkJYnJlYWs7CgkgICAgY2FzZSBLU1RBVF9EQVRBX1VMT05HTE9ORzoKCQkqKENvdW50ZXIgKil2ID0gZC0+dmFsdWUudWxsOwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlbGx1XG4iLAoJCQkgICAgKHVuc2lnbmVkIGxvbmcpZC0+dmFsdWUudWxsKSk7CgkJYnJlYWs7CiNlbmRpZgoJICAgIGNhc2UgS1NUQVRfREFUQV9GTE9BVDoKCQkqKGZsb2F0ICopdiA9IGQtPnZhbHVlLmY7CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAidmFsdWU6ICVmXG4iLCBkLT52YWx1ZS5mKSk7CgkJYnJlYWs7CgkgICAgY2FzZSBLU1RBVF9EQVRBX0RPVUJMRToKCQkqKGRvdWJsZSAqKXYgPSBkLT52YWx1ZS5kOwoJCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlZlxuIiwgZC0+dmFsdWUuZCkpOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLAoJCQkgICAgIlVOS05PV04gVFlQRSAlZCAoc3RhdCBcIiVzXCIgdmFyIFwiJXNcIilcbiIsCgkJCSAgICBkLT5kYXRhX3R5cGUsIHN0YXRuYW1lLCB2YXJuYW1lKSk7CgkJcmV0ID0gLTM7CgkJZ290byBSZXR1cm47ICAgICAgICAvKiBJbnZhbGlkIGRhdGEgdHlwZSAqLwoJICAgIH0KCSAgICByZXQgPSAwOyAgICAgICAgLyogU3VjY2VzcyAgKi8KCSAgICBnb3RvIFJldHVybjsKCX0KICAgIH0KICAgIHJldCA9IC00OyAgICAgICAgICAgICAgIC8qIE5hbWUgbm90IGZvdW5kICovCiBSZXR1cm46CiAgICByZXR1cm4gcmV0Owp9CgppbnQKZ2V0S3N0YXRTdHJpbmcoY29uc3QgY2hhciAqc3RhdG5hbWUsIGNvbnN0IGNoYXIgKnZhcm5hbWUsCiAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuKQp7CiAgICBrc3RhdF9jdGxfdCAgICAqa3NjOwogICAga3N0YXRfdCAgICAgICAgKmtzLCAqa3N0YXRfZGF0YTsKICAgIGtzdGF0X25hbWVkX3QgICpkOwogICAgc2l6ZV90ICAgICAgICAgIGksIGluc3RhbmNlOwogICAgY2hhciAgICAgICAgICAgIG1vZHVsZV9uYW1lWzY0XTsKICAgIGludCAgICAgICAgICAgICByZXQ7CgogICAgaWYgKGtzdGF0X2ZkID09IDApIHsKICAgICAgICBrc3RhdF9mZCA9IGtzdGF0X29wZW4oKTsKICAgICAgICBpZiAoa3N0YXRfZmQgPT0gMCkgewogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoImtzdGF0X29wZW4iKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKGtzYyA9IGtzdGF0X2ZkKSA9PSBOVUxMKSB7CiAgICAgICAgcmV0ID0gLTEwOwogICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyoga3N0YXQgZXJyb3JzICovCiAgICB9CiAgICBpZiAoc3RhdG5hbWUgPT0gTlVMTCB8fCB2YXJuYW1lID09IE5VTEwpIHsKICAgICAgICByZXQgPSAtMjA7CiAgICAgICAgZ290byBSZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIEZpcnN0LCBnZXQgImtzdGF0X2hlYWRlcnMiIHN0YXRpc3RpY3MuIEl0IHNob3VsZAogICAgICogY29udGFpbiBhbGwgYXZhaWxhYmxlIG1vZHVsZXMuCiAgICAgKi8KCiAgICBpZiAoKGtzID0ga3N0YXRfbG9va3VwKGtzYywgInVuaXgiLCAwLCAia3N0YXRfaGVhZGVycyIpKSA9PSBOVUxMKSB7CiAgICAgICAgcmV0ID0gLTEwOwogICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyoga3N0YXQgZXJyb3JzICovCiAgICB9CiAgICBpZiAoa3N0YXRfcmVhZChrc2MsIGtzLCBOVUxMKSA8PSAwKSB7CiAgICAgICAgcmV0ID0gLTEwOwogICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyoga3N0YXQgZXJyb3JzICovCiAgICB9CiAgICBrc3RhdF9kYXRhID0ga3MtPmtzX2RhdGE7CgogICAgLyoKICAgICAqIE5vdywgbG9vayBmb3IgdGhlIG5hbWUgb2Ygb3VyIHN0YXQgaW4gdGhlIGhlYWRlcnMgYnVmCiAgICAgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBrcy0+a3NfbmRhdGE7IGkrKykgewogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwKICAgICAgICAgICAgICAgICAgICAibW9kdWxlOiAlcyBpbnN0YW5jZTogJWQgbmFtZTogJXMgY2xhc3M6ICVzIHR5cGU6ICVkIGZsYWdzOiAleFxuIiwKICAgICAgICAgICAgICAgICAgICBrc3RhdF9kYXRhW2ldLmtzX21vZHVsZSwga3N0YXRfZGF0YVtpXS5rc19pbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBrc3RhdF9kYXRhW2ldLmtzX25hbWUsIGtzdGF0X2RhdGFbaV0ua3NfY2xhc3MsCiAgICAgICAgICAgICAgICAgICAga3N0YXRfZGF0YVtpXS5rc190eXBlLCBrc3RhdF9kYXRhW2ldLmtzX2ZsYWdzKSk7CiAgICAgICAgaWYgKHN0cmNtcChzdGF0bmFtZSwga3N0YXRfZGF0YVtpXS5rc19uYW1lKSA9PSAwKSB7CiAgICAgICAgICAgIHN0cmNweShtb2R1bGVfbmFtZSwga3N0YXRfZGF0YVtpXS5rc19tb2R1bGUpOwogICAgICAgICAgICBpbnN0YW5jZSA9IGtzdGF0X2RhdGFbaV0ua3NfaW5zdGFuY2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoaSA9PSBrcy0+a3NfbmRhdGEpIHsKICAgICAgICByZXQgPSAtMTsKICAgICAgICBnb3RvIFJldHVybjsgICAgICAgIC8qIE5vdCBmb3VuZCAqLwogICAgfQoKICAgIC8qCiAgICAgKiBHZXQgdGhlIG5hbWVkIHN0YXRpc3RpY3MKICAgICAqLwogICAgaWYgKChrcyA9IGtzdGF0X2xvb2t1cChrc2MsIG1vZHVsZV9uYW1lLCBpbnN0YW5jZSwgc3RhdG5hbWUpKSA9PSBOVUxMKSB7CiAgICAgICAgcmV0ID0gLTEwOwogICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyoga3N0YXQgZXJyb3JzICovCiAgICB9CgogICAgaWYgKGtzdGF0X3JlYWQoa3NjLCBrcywgTlVMTCkgPD0gMCkgewogICAgICAgIHJldCA9IC0xMDsKICAgICAgICBnb3RvIFJldHVybjsgICAgICAgIC8qIGtzdGF0IGVycm9ycyAqLwogICAgfQogICAgLyoKICAgICAqIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyBvbmx5IG5hbWUvdmFsdWUgdHlwZSBvZiBzdGF0aXN0aWNzLCBzbyBpZiBpdCBpcwogICAgICogbm90IHRoZSBjYXNlIHJldHVybiBhbiBlcnJvcgogICAgICovCiAgICBpZiAoa3MtPmtzX3R5cGUgIT0gS1NUQVRfVFlQRV9OQU1FRCkgewogICAgICAgIHJldCA9IC0yOwogICAgICAgIGdvdG8gUmV0dXJuOyAgICAgICAgLyogSW52YWxpZCBzdGF0IHR5cGUgKi8KICAgIH0KCiAgICBmb3IgKGkgPSAwLCBkID0gS1NUQVRfTkFNRURfUFRSKGtzKTsgaSA8IGtzLT5rc19uZGF0YTsgaSsrLCBkKyspIHsKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJ2YXJpYWJsZTogXCIlc1wiICh0eXBlICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICBkLT5uYW1lLCBkLT5kYXRhX3R5cGUpKTsKCiAgICAgICAgaWYgKHN0cmNtcChkLT5uYW1lLCB2YXJuYW1lKSA9PSAwKSB7CiAgICAgICAgICAgIHN3aXRjaCAoZC0+ZGF0YV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgS1NUQVRfREFUQV9DSEFSOgogICAgICAgICAgICAgICAgc3RybGNweSh2YWx1ZSwgZC0+dmFsdWUuYywgdmFsdWVfbGVuKTsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgInZhbHVlOiAlc1xuIiwgZC0+dmFsdWUuYykpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTk9OU1RSSU5HIFRZUEUgJWQgKHN0YXQgXCIlc1wiIHZhciBcIiVzXCIpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ZGF0YV90eXBlLCBzdGF0bmFtZSwgdmFybmFtZSkpOwogICAgICAgICAgICAgICAgcmV0ID0gLTM7CiAgICAgICAgICAgICAgICBnb3RvIFJldHVybjsgICAgICAgIC8qIEludmFsaWQgZGF0YSB0eXBlICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0ID0gMDsgICAgICAgIC8qIFN1Y2Nlc3MgICovCiAgICAgICAgICAgIGdvdG8gUmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIHJldCA9IC00OyAgICAgICAgICAgICAgIC8qIE5hbWUgbm90IGZvdW5kICovCiBSZXR1cm46CiAgICByZXR1cm4gcmV0Owp9CgovKgogKiBnZXQgTUlCLUlJIHN0YXRpc3RpY3MuIEl0IG1haW50YWluZXMgYSBzaW1wbGUgY2FjaGUgd2hpY2ggYnVmZmVycyB0aGUgbGFzdAogKiByZWFkIGJsb2NrIG9mIE1JQiBzdGF0aXN0aWNzICh3aGljaCBtYXkgY29udGFpbiB0aGUgd2hvbGUgdGFibGUpLiBJdCBjYWxscwogKiAqY29tcCB0byBjb21wYXJlIGV2ZXJ5IGVudHJ5IHdpdGggYW4gZW50cnkgcG9pbnRlZCBieSBhcmcuICpjb21wIHNob3VsZAogKiByZXR1cm4gMCBpZiBjb21wYXJpc29uIGlzIHN1Y2Nlc3NmdWwuICBSZXFfdHlwZSBtYXkgYmUgR0VUX0ZJUlNULCBHRVRfRVhBQ1QsCiAqIEdFVF9ORVhULiAgSWYgc2VhcmNoIGlzIHN1Y2Nlc3NmdWwgZ2V0TWlic3RhdCByZXR1cm5zIDAsIG90aGVyd2lzZSAxLgogKi8KaW50CmdldE1pYnN0YXQobWliZ3JvdXBfZSBncmlkLCB2b2lkICpyZXNwLCBzaXplX3QgZW50cnlzaXplLAoJICAgcmVxX2UgcmVxX3R5cGUsIGludCAoKmNvbXApICh2b2lkICosIHZvaWQgKiksIHZvaWQgKmFyZykKewogICAgaW50ICAgICAgICAgICAgIHJldCwgcmMgPSAtMSwgbWliZ3IsIG1pYnRiLCBjYWNoZV92YWxpZDsKICAgIHNpemVfdCAgICAgICAgICBsZW5ndGg7CiAgICBtaWJjYWNoZSAgICAgICAqY2FjaGVwOwogICAgZm91bmRfZSAgICAgICAgIHJlc3VsdCA9IE5PVF9GT1VORDsKICAgIHZvaWQgICAgICAgICAgICplcDsKCiAgICAvKgogICAgICogV2UgYXNzdW1lIHRoYXQgTWliY2FjaGUgaXMgaW5pdGlhbGl6ZWQgaW4gbWliZ3JvdXBfZSBlbnVtIG9yZGVyIHNvIHdlCiAgICAgKiBkb24ndCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgaW5kZXggaGVyZS4KICAgICAqLwoKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgImdldE1pYnN0YXQgKCVkLCAqLCAlZCwgJWQsICosICopXG4iLAoJCWdyaWQsIGVudHJ5c2l6ZSwgcmVxX3R5cGUpKTsKICAgIGNhY2hlcCA9ICZNaWJjYWNoZVtncmlkXTsKICAgIG1pYmdyID0gTWlibWFwW2dyaWRdLmdyb3VwOwogICAgbWlidGIgPSBNaWJtYXBbZ3JpZF0udGFibGU7CgogICAgaWYgKGNhY2hlcC0+Y2FjaGVfYWRkciA9PSAodm9pZCAqKSAtMSkgIC8qIEhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldCAqLwoJaW5pdF9taWJjYWNoZV9lbGVtZW50KGNhY2hlcCk7CiAgICBpZiAoY2FjaGVwLT5jYWNoZV9zaXplID09IDApIHsgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW1zICovCgljYWNoZXAtPmNhY2hlX2FkZHIgPSByZXNwOyAgLyogU28gdXNlIGNhbGxlciBzdXBwbGllZCBhZGRyZXNzIGluc3RlYWQgb2YgY2FjaGUgKi8KCWNhY2hlcC0+Y2FjaGVfc2l6ZSA9IGVudHJ5c2l6ZTsKCWNhY2hlcC0+Y2FjaGVfbGFzdF9mb3VuZCA9IDA7CiAgICB9CiAgICBpZiAocmVxX3R5cGUgIT0gR0VUX05FWFQpCgljYWNoZXAtPmNhY2hlX2xhc3RfZm91bmQgPSAwOwoKICAgIGNhY2hlX3ZhbGlkID0gKGNhY2hlcC0+Y2FjaGVfdGltZSA+IDApOwoKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwiLi4uIGNhY2hlX3ZhbGlkICVkIHRpbWUgJWxkIHR0bCAlZCBub3cgJWxkXG4iLAoJCWNhY2hlX3ZhbGlkLCBjYWNoZXAtPmNhY2hlX3RpbWUsIGNhY2hlcC0+Y2FjaGVfdHRsLAoJCXRpbWUoTlVMTCkpKTsKICAgIGlmIChjYWNoZV92YWxpZCkgewoJLyoKCSAqIElzIGl0IHJlYWxseT8gCgkgKi8KCWlmIChjYWNoZXAtPmNhY2hlX2NvbXAgIT0gKHZvaWQgKiljb21wIHx8IGNhY2hlcC0+Y2FjaGVfYXJnICE9IGFyZykgewoJICAgIGNhY2hlX3ZhbGlkID0gMDsgICAgICAgIC8qIE5vcGUuICovCgl9CiAgICB9CgogICAgaWYgKGNhY2hlX3ZhbGlkKSB7CgkvKgoJICogRW50cnkgaXMgdmFsaWQsIGxldCdzIHRyeSB0byBmaW5kIGEgbWF0Y2ggCgkgKi8KCglpZiAocmVxX3R5cGUgPT0gR0VUX05FWFQpIHsKCSAgICByZXN1bHQgPSBnZXRlbnRyeShyZXFfdHlwZSwKCQkJICAgICAgKHZvaWQgKikoKGNoYXIgKiljYWNoZXAtPmNhY2hlX2FkZHIgKwoJCQkJICAgICAgIChjYWNoZXAtPmNhY2hlX2xhc3RfZm91bmQgKiBlbnRyeXNpemUpKSwKCQkJICAgICAgY2FjaGVwLT5jYWNoZV9sZW5ndGggLQoJCQkgICAgICAoY2FjaGVwLT5jYWNoZV9sYXN0X2ZvdW5kICogZW50cnlzaXplKSwKCQkJICAgICAgZW50cnlzaXplLCAmZXAsIGNvbXAsIGFyZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXRlbnRyeShyZXFfdHlwZSwgY2FjaGVwLT5jYWNoZV9hZGRyLAoJCQkJICBjYWNoZXAtPmNhY2hlX2xlbmd0aCwgZW50cnlzaXplLCAmZXAsIGNvbXAsCgkJCQkgIGFyZyk7CiAgICAgICAgICAgIH0KICAgIH0KCiAgICBpZiAoKGNhY2hlX3ZhbGlkID09IDApIHx8IChyZXN1bHQgPT0gTk9UX0ZPVU5EKSB8fAoJKHJlc3VsdCA9PSBORUVEX05FWFQgJiYgY2FjaGVwLT5jYWNoZV9mbGFncyAmIENBQ0hFX01PUkVEQVRBKSkgewoJLyoKCSAqIEVpdGhlciB0aGUgY2FjaGUgaXMgb2xkLCBvciB3ZSBoYXZlbid0IGZvdW5kIGFueXRoaW5nLCBvciBuZWVkIHRoZQoJICogbmV4dCBpdGVtIHdoaWNoIGhhc24ndCBiZWVuIHJlYWQgeWV0LiAgSW4gYW55IGNhc2UsIGZpbGwgdGhlIGNhY2hlCgkgKiB1cCBhbmQgdHJ5IHRvIGZpbmQgb3VyIGVudHJ5LgoJICovCgoJaWYgKGdyaWQgPT0gTUlCX0lOVEVSRkFDRVMpIHsKCSAgICByYyA9IGdldGlmKChtaWIyX2lmRW50cnlfdCAqKSBjYWNoZXAtPmNhY2hlX2FkZHIsCgkJICAgICAgIGNhY2hlcC0+Y2FjaGVfc2l6ZSwgcmVxX3R5cGUsCgkJICAgICAgIChtaWIyX2lmRW50cnlfdCAqKSAmIGVwLCAmbGVuZ3RoLCBjb21wLCBhcmcpOwoJfSBlbHNlIHsKCSAgICByYyA9IGdldG1pYihtaWJnciwgbWlidGIsICYoY2FjaGVwLT5jYWNoZV9hZGRyKSwKCQkJJihjYWNoZXAtPmNhY2hlX3NpemUpLCBlbnRyeXNpemUsIHJlcV90eXBlLCAmZXAsCgkJCSZsZW5ndGgsIGNvbXAsIGFyZyk7Cgl9CgoJaWYgKHJjID49IDApIHsgICAgICAvKiBDYWNoZSBoYXMgYmVlbiBmaWxsZWQgdXAgKi8KCSAgICBjYWNoZXAtPmNhY2hlX3RpbWUgPSBjYWNoZXAtPmNhY2hlX3R0bDsKCSAgICBjYWNoZXAtPmNhY2hlX2xlbmd0aCA9IGxlbmd0aDsKCSAgICBpZiAocmMgPT0gMSkgICAgLyogRm91bmQgYnV0IHRoZXJlIGFyZSBtb3JlIHVucmVhZCBkYXRhICovCgkJY2FjaGVwLT5jYWNoZV9mbGFncyB8PSBDQUNIRV9NT1JFREFUQTsKCSAgICBlbHNlIHsKCQljYWNoZXAtPmNhY2hlX2ZsYWdzICY9IH5DQUNIRV9NT1JFREFUQTsKICAgICAgICAgICAgICAgIGlmIChyYyA+IDEpICB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVwLT5jYWNoZV90aW1lID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoJICAgIGNhY2hlcC0+Y2FjaGVfY29tcCA9ICh2b2lkICopIGNvbXA7CgkgICAgY2FjaGVwLT5jYWNoZV9hcmcgPSBhcmc7Cgl9IGVsc2UgewoJICAgIGNhY2hlcC0+Y2FjaGVfY29tcCA9IE5VTEw7CgkgICAgY2FjaGVwLT5jYWNoZV9hcmcgPSBOVUxMOwoJfQogICAgfQogICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uIHJlc3VsdCAlZCByYyAlZFxuIiwgcmVzdWx0LCByYykpOwogICAgCiAgICBpZiAocmVzdWx0ID09IEZPVU5EIHx8IHJjID09IDAgfHwgcmMgPT0gMSkgewoJLyoKCSAqIEVudHJ5IGhhcyBiZWVuIGZvdW5kLCBkZWxpdmVyIGl0IAoJICovCglpZiAocmVzcCAhPSBOVUxMKSB7CgkgICAgbWVtY3B5KHJlc3AsIGVwLCBlbnRyeXNpemUpOwoJfQoJcmV0ID0gMDsKCWNhY2hlcC0+Y2FjaGVfbGFzdF9mb3VuZCA9CgkgICAgKChjaGFyICopZXAgLSAoY2hhciAqKWNhY2hlcC0+Y2FjaGVfYWRkcikgLyBlbnRyeXNpemU7CiAgICB9IGVsc2UgewoJcmV0ID0gMTsgICAgICAgICAgICAvKiBOb3QgZm91bmQgKi8KICAgIH0KICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLiBnZXRNaWJzdGF0IHJldHVybnMgJWRcbiIsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQoKLyoKICogR2V0IGEgTUlCLUlJIGVudHJ5IGZyb20gdGhlIGJ1ZmZlciBidWZmYWRkciwgd2hpY2ggc2F0aXNmaWVzIHRoZSBjcml0ZXJpb24sCiAqIGNvbXB1dGVkIGJ5ICgqY29tcCksIHdoaWNoIGdldHMgYXJnIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgcG9pbnRlciB0byB0aGUKICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIGFzIHRoZSBzZWNvbmQuIElmIGZvdW5kIGVudHJ5IGlzIHBvaW50ZWQgYnkKICogcmVzcC4KICovCgpzdGF0aWMgZm91bmRfZQpnZXRlbnRyeShyZXFfZSByZXFfdHlwZSwgdm9pZCAqYnVmYWRkciwgc2l6ZV90IGxlbiwKCSBzaXplX3QgZW50cnlzaXplLCB2b2lkICpyZXNwLCBpbnQgKCpjb21wKSh2b2lkICosIHZvaWQgKiksCgkgdm9pZCAqYXJnKQp7CiAgICB2b2lkICpicCA9IGJ1ZmFkZHIsICoqcnAgPSByZXNwOwogICAgaW50IHByZXZpb3VzX2ZvdW5kID0gMDsKICAgIAogICAgaWYgKChsZW4gPiAwKSAmJiAobGVuICUgZW50cnlzaXplICE9IDApKSB7CiAgICAgICAgLyogCiAgICAgICAgICogVGhlIGRhdGEgaW4gdGhlIGNhY2hlIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIHRoZSBzaXplIG11c3QgYmUgYSAKICAgICAgICAgKiBtdWx0aXBsZSBvZiB0aGUgZW50cnkuIENvdWxkIGJlIGNhdXNlZCBieSBhbGlnbm1lbnQgaXNzdWVzIGV0Yy4gCiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAKICAgICAgICAgICAgImJhZCBjYWNoZSBsZW5ndGggJWQgLSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZSAlZFxuIiwgCiAgICAgICAgICAgIGxlbiwgZW50cnlzaXplKSk7CiAgICAgICAgcmV0dXJuIE5PVF9GT1VORDsKICAgIH0KCiAgICAvKgogICAgICogSGVyZSB3ZSBoYXZlIHRvIHBlcmZvcm0gYWRkcmVzcyBhcml0aG1ldGljIHdpdGggcG9pbnRlciB0byB2b2lkLiBVZ2x5Li4uCiAgICAgKi8KCiAgICBmb3IgKDsgbGVuID4gMDsgbGVuIC09IGVudHJ5c2l6ZSwgYnAgPSAoY2hhciAqKSBicCArIGVudHJ5c2l6ZSkgewoJaWYgKHJwICE9ICh2b2lkICopIE5VTEwpIHsKCSAgICAqcnAgPSBicDsKCX0KCglpZiAocmVxX3R5cGUgPT0gR0VUX0ZJUlNUIHx8IChyZXFfdHlwZSA9PSBHRVRfTkVYVCAmJiBwcmV2aW91c19mb3VuZCkpewoJICAgIHJldHVybiBGT1VORDsKCX0KCglpZiAoKCpjb21wKShhcmcsIGJwKSA9PSAwKSB7CgkgICAgaWYgKHJlcV90eXBlID09IEdFVF9FWEFDVCkgewoJCXJldHVybiBGT1VORDsKCSAgICB9IGVsc2UgeyAgICAgICAgLyogR0VUX05FWFQgKi8KCQlwcmV2aW91c19mb3VuZCsrOwoJCWNvbnRpbnVlOwoJICAgIH0KCX0KICAgIH0KCiAgICBpZiAocHJldmlvdXNfZm91bmQpIHsKCXJldHVybiBORUVEX05FWFQ7CiAgICB9IGVsc2UgewoJcmV0dXJuIE5PVF9GT1VORDsKICAgIH0KfQoKLyoKICogSW5pdGlhbGl6ZSBhIGNhY2hlIGVsZW1lbnQuIEl0IGFsbG9jYXRlcyB0aGUgbWVtb3J5IGFuZCBzZXRzIHRoZSB0aW1lIHN0YW1wCiAqIHRvIGludmFsaWRhdGUgdGhlIGVsZW1lbnQuCiAqLwpzdGF0aWMgdm9pZAppbml0X21pYmNhY2hlX2VsZW1lbnQobWliY2FjaGUgKiBjcCkKewogICAgaWYgKGNwID09IChtaWJjYWNoZSAqKU5VTEwpIHsKCXJldHVybjsKICAgIH0KICAgIGlmIChjcC0+Y2FjaGVfc2l6ZSkgewoJY3AtPmNhY2hlX2FkZHIgPSBtYWxsb2MoY3AtPmNhY2hlX3NpemUpOwogICAgfQogICAgY3AtPmNhY2hlX3RpbWUgPSAwOwogICAgY3AtPmNhY2hlX2NvbXAgPSBOVUxMOwogICAgY3AtPmNhY2hlX2FyZyA9IE5VTEw7Cn0KCi8qCiAqIEdldCBNSUItSUkgc3RhdGlzdGljcyBmcm9tIHRoZSBTb2xhcmlzIGtlcm5lbC4gIEl0IHVzZXMgdW5kb2N1bWVudGVkCiAqIGludGVyZmFjZSB0byBUQ1AvSVAgc3RyZWFtcyBtb2R1bGVzLCB3aGljaCBwcm92aWRlcyBleHRlbmRlZCBNSUItSUkgZm9yIHRoZQogKiBmb2xsb3dpbmcgZ3JvdXBzOiBpcCwgaWNtcCwgdGNwLCB1ZHAsIGVncC4KIAogKiAKICogVXNhZ2U6IGdyb3VwbmFtZSwgc3ViZ3JvdXBuYW1lIGFyZSBmcm9tIDxpbmV0L21pYjIuaD4sIAogKiAgICAgICAgc2l6ZSVzaXplb2Yoc3RhdGJ1ZikgPT0gMCwKICogICAgICAgIGVudHJ5c2l6ZSBzaG91bGQgYmUgZXhhY3Qgc2l6ZSBvZiBNSUItSUkgZW50cnksCiAqICAgICAgICByZXFfdHlwZToKICogICAgICAgICAgICAgICAgICAgR0VUX0ZJUlNUIC0gZ2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYnVmZmVyCiAqICAgICAgICAgICAgICAgICAgIEdFVF9FWEFDVCAtIGdldCBleGFjdCBtYXRjaAogKiAgICAgICAgICAgICAgICAgICBHRVRfTkVYVCAgLSBnZXQgbmV4dCBlbnRyeSBhZnRlciB0aGUgZXhhY3QgbWF0Y2gKICogCiAqICgqY29tcCkgaXMgYSBjb21wYXJlIGZ1bmN0aW9uLCBwcm92aWRlZCBieSB0aGUgY2FsbGVyLCB3aGljaCBnZXRzIGFyZyBhcyB0aGUKICogZmlyc3QgYXJndW1lbnQgYW5kIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZW50cnkgYXMgdGggc2Vjb25kLiBJZiBjb21wYXJlZCwKICogc2hvdWxkIHJldHVybiAwIGFuZCBmb3VuZCBlbnRyeSB3aWxsIGJlIHBvaW50ZWQgYnkgcmVzcC4KICogCiAqIElmIHNlYXJjaCBpcyBzdWNjZXNzZnVsIGFuZCBubyBtb3JlIGRhdGEgdG8gcmVhZCwgaXQgcmV0dXJucyAwLAogKiBpZiBzdWNjZXNzZnVsIGFuZCB0aGVyZSBpcyBtb3JlIGRhdGEgLS0gMSwKICogaWYgbm90IGZvdW5kIGFuZCBlbmQgb2YgZGF0YSAtLSAyLCBhbnkgb3RoZXIgZXJyb3JzIC0tIDwgMAogKiAobmVnYXRpdmUgZXJyb3IgbnVtYmVycyBhcmUgcHJldHR5IHJhbmRvbSkuCiAqIAogKiBOT1RFOiBuZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBtdXRleCBpbiByZWVudHJhbnQgZW52aXJvbm1lbnQgCiAqLwoKc3RhdGljIGludApnZXRtaWIoaW50IGdyb3VwbmFtZSwgaW50IHN1Ymdyb3VwbmFtZSwgdm9pZCAqKnN0YXRidWYsIHNpemVfdCAqc2l6ZSwKICAgICAgIHNpemVfdCBlbnRyeXNpemUsIHJlcV9lIHJlcV90eXBlLCB2b2lkICpyZXNwLAogICAgICAgc2l6ZV90ICpsZW5ndGgsIGludCAoKmNvbXApKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgICBpbnQgICAgICAgICAgICAgcmMsIHJldCA9IDAsIGZsYWdzOwogICAgY2hhciAgICAgICAgICAgIGJ1ZltCVUZTSVpFXTsKICAgIHN0cnVjdCBzdHJidWYgICBzdHJidWY7CiAgICBzdHJ1Y3QgVF9vcHRtZ210X3JlcSAqdG9yID0gKHN0cnVjdCBUX29wdG1nbXRfcmVxICopIGJ1ZjsKICAgIHN0cnVjdCBUX29wdG1nbXRfYWNrICp0b2EgPSAoc3RydWN0IFRfb3B0bWdtdF9hY2sgKikgYnVmOwogICAgc3RydWN0IFRfZXJyb3JfYWNrICp0ZWEgPSAoc3RydWN0IFRfZXJyb3JfYWNrICopIGJ1ZjsKICAgIHN0cnVjdCBvcHRoZHIgICpyZXE7CiAgICBmb3VuZF9lICAgICAgICAgcmVzdWx0ID0gRk9VTkQ7CiAgICBzaXplX3Qgb2xkc2l6ZTsKCiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICIuLi4uLi4gZ2V0bWliICglZCwgJWQsIC4uLilcbiIsCgkJZ3JvdXBuYW1lLCBzdWJncm91cG5hbWUpKTsKCiAgICAvKgogICAgICogT3BlbiB0aGUgc3RyZWFtIGRyaXZlciBhbmQgcHVzaCBhbGwgTUlCLXJlbGF0ZWQgbW9kdWxlcyAKICAgICAqLwoKICAgIGlmIChzZCA9PSAtMikgeyAgICAgICAgIC8qIEZpcnN0IHRpbWUgKi8KCWlmICgoc2QgPSBvcGVuKFNUUkVBTV9ERVYsIE9fUkRXUikpID09IC0xKSB7CgkgICAgc25tcF9sb2dfcGVycm9yKFNUUkVBTV9ERVYpOwoJICAgIHJldCA9IC0xOwoJICAgIGdvdG8gUmV0dXJuOwoJfQoJaWYgKGlvY3RsKHNkLCBJX1BVU0gsICJ0Y3AiKSA9PSAtMSkgewoJICAgIHNubXBfbG9nX3BlcnJvcigiSV9QVVNIIHRjcCIpOwoJICAgIHJldCA9IC0xOwoJICAgIGdvdG8gUmV0dXJuOwoJfQoJaWYgKGlvY3RsKHNkLCBJX1BVU0gsICJ1ZHAiKSA9PSAtMSkgewoJICAgIHNubXBfbG9nX3BlcnJvcigiSV9QVVNIIHVkcCIpOwoJICAgIHJldCA9IC0xOwoJICAgIGdvdG8gUmV0dXJuOwoJfQoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIG1vZHVsZXMgcHVzaGVkIE9LXG4iKSk7CiAgICB9CiAgICBpZiAoc2QgPT0gLTEpIHsKCXJldCA9IC0xOwoJZ290byBSZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIEZpcnN0LCB1c2UgYmlnZ2VyIGJ1ZmZlciwgdG8gYWNjZWxlcmF0ZSBza2lwcGluZyB1bndhbnRlZCBtZXNzYWdlcwogICAgICovCgogICAgc3RyYnVmLmJ1ZiA9IGJ1ZjsKICAgIHN0cmJ1Zi5tYXhsZW4gPSBCVUZTSVpFOwogICAgCiAgICB0b3ItPlBSSU1fdHlwZSA9IFRfT1BUTUdNVF9SRVE7CiAgICB0b3ItPk9QVF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IFRfb3B0bWdtdF9yZXEpOwogICAgdG9yLT5PUFRfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBvcHRoZHIpOwojaWZkZWYgTUlfVF9DVVJSRU5UCiAgICB0b3ItPk1HTVRfZmxhZ3MgPSBNSV9UX0NVUlJFTlQ7IC8qIFNvbGFyaXMgPCAyLjYgKi8KI2Vsc2UKICAgIHRvci0+TUdNVF9mbGFncyA9IFRfQ1VSUkVOVDsgICAgLyogU29sYXJpcyAyLjYgKi8KI2VuZGlmCiAgICByZXEgPSAoc3RydWN0IG9wdGhkciAqKSh0b3IgKyAxKTsKICAgIHJlcS0+bGV2ZWwgPSBncm91cG5hbWU7CiAgICByZXEtPm5hbWUgPSBzdWJncm91cG5hbWU7CiAgICAvKgogICAgICogbm9uLXplcm8gbGVuIGZpZWxkIGlzIHVzZWQgdG8gcmVxdWVzdCBleHRlbmRlZCBNSUIgc3RhdGlzdGljcwogICAgICogb24gU29sYXJpcyAxMCBVcGRhdGUgNCBhbmQgbGF0ZXIuIFRoZSBMRUdBQ1lfTUlCX1NJWkUgbWFjcm8gaXMgb25seQogICAgICogYXZhaWxhYmxlIGZvciBTMTBVNCssIHNvIHdlIHVzZSB0aGF0IHRvIHNlZSB3aGF0IGFjdGlvbiB0byB0YWtlLgogICAgICovCiNpZmRlZiBMRUdBQ1lfTUlCX1NJWkUKICAgIHJlcS0+bGVuID0gMTsJLyogYXNrIGZvciBleHRlbmRlZCBNSUJzICovCiNlbHNlCiAgICByZXEtPmxlbiA9IDA7CiNlbmRpZgogICAgc3RyYnVmLmxlbiA9IHRvci0+T1BUX2xlbmd0aCArIHRvci0+T1BUX29mZnNldDsKICAgIGZsYWdzID0gMDsKICAgIGlmICgocmMgPSBwdXRtc2coc2QsICZzdHJidWYsIE5VTEwsIGZsYWdzKSkpIHsKCXJldCA9IC0yOwoJZ290byBSZXR1cm47CiAgICB9CgogICAgcmVxID0gKHN0cnVjdCBvcHRoZHIgKikgKHRvYSArIDEpOwogICAgZm9yICg7OykgewoJZmxhZ3MgPSAwOwoJaWYgKChyYyA9IGdldG1zZyhzZCwgJnN0cmJ1ZiwgTlVMTCwgJmZsYWdzKSkgPT0gLTEpIHsKCSAgICByZXQgPSAtRUlPOwoJICAgIGJyZWFrOwoJfQoJaWYgKHJjID09IDAgJiYgc3RyYnVmLmxlbiA+PSBzaXplb2Yoc3RydWN0IFRfb3B0bWdtdF9hY2spICYmCgkgICAgdG9hLT5QUklNX3R5cGUgID09IFRfT1BUTUdNVF9BQ0sgJiYKCSAgICB0b2EtPk1HTVRfZmxhZ3MgPT0gVF9TVUNDRVNTICYmIHJlcS0+bGVuID09IDApIHsKCSAgICByZXQgPSAyOwoJICAgIGJyZWFrOwoJfQoJaWYgKHN0cmJ1Zi5sZW4gPj0gc2l6ZW9mKHN0cnVjdCBUX2Vycm9yX2FjaykgJiYKCSAgICB0ZWEtPlBSSU1fdHlwZSA9PSBUX0VSUk9SX0FDSykgewoJICAgIC8qIFByb3RvY29sIGVycm9yICovCgkgICAgcmV0ID0gLSgodGVhLT5UTElfZXJyb3IgPT0gVFNZU0VSUikgPyB0ZWEtPlVOSVhfZXJyb3IgOiBFUFJPVE8pOwoJICAgIGJyZWFrOwoJfQoJaWYgKHJjICE9IE1PUkVEQVRBIHx8IHN0cmJ1Zi5sZW4gPCBzaXplb2Yoc3RydWN0IFRfb3B0bWdtdF9hY2spIHx8CgkgICAgdG9hLT5QUklNX3R5cGUgIT0gVF9PUFRNR01UX0FDSyB8fAoJICAgIHRvYS0+TUdNVF9mbGFncyAhPSBUX1NVQ0NFU1MpIHsKCSAgICByZXQgPSAtRU5PTVNHOyAgLyogTm8gbW9yZSBtZXNzYWdlcyAqLwoJICAgIGJyZWFrOwoJfQoKCS8qCgkgKiBUaGUgb3JkZXIgaW4gd2hpY2ggd2UgZ2V0IHRoZSBzdGF0aXN0aWNzIGlzIGRldGVybWluZWQgYnkgdGhlIGtlcm5lbAoJICogYW5kIG5vdCBieSB0aGUgZ3JvdXAgbmFtZSwgc28gd2UgaGF2ZSB0byBsb29wIHVudGlsIHdlIGdldCB0aGUKCSAqIHJlcXVpcmVkIHN0YXRpc3RpY3MuCgkgKi8KCglpZiAocmVxLT5sZXZlbCAhPSBncm91cG5hbWUgfHwgcmVxLT5uYW1lICE9IHN1Ymdyb3VwbmFtZSkgewoJICAgIHN0cmJ1Zi5tYXhsZW4gPSBCVUZTSVpFOwoJICAgIHN0cmJ1Zi5idWYgPSBidWY7CgkgICAgZG8gewoJCXJjID0gZ2V0bXNnKHNkLCBOVUxMLCAmc3RyYnVmLCAmZmxhZ3MpOwoJICAgIH0gd2hpbGUgKHJjID09IE1PUkVEQVRBKTsKCSAgICBjb250aW51ZTsKCX0KICAgICAgICAKCS8qCgkgKiBOb3cgd2hlbiB3ZSBmb3VuZCBvdXIgc3RhdCwgc3dpdGNoIGJ1ZmZlciB0byBhIGNhbGxlci1wcm92aWRlZAoJICogb25lLiBNYW5pcHVsYXRpbmcgdGhlIHNpemUgb2YgaXQgb25lIGNhbiBjb250cm9sIHBlcmZvcm1hbmNlLAoJICogcmVkdWNpbmcgdGhlIG51bWJlciBvZiBnZXRtc2cgY2FsbHMKCSAqLwoKCXN0cmJ1Zi5idWYgPSAqc3RhdGJ1ZjsKCXN0cmJ1Zi5tYXhsZW4gPSAqc2l6ZTsKCXN0cmJ1Zi5sZW4gPSAwOwoJZmxhZ3MgPSAwOwoJZG8gewoJICAgIHJjID0gZ2V0bXNnKHNkLCBOVUxMLCAmc3RyYnVmLCAmZmxhZ3MpOwoJICAgIHN3aXRjaCAocmMpIHsKCSAgICBjYXNlIC0xOgoJCXJldCA9IC1FTk9TUjsKCQlzbm1wX3BlcnJvcigiZ2V0bXNnIik7CgkJZ290byBSZXR1cm47CgoJICAgIGRlZmF1bHQ6CgkJc25tcF9sb2coTE9HX0VSUiwgImtlcm5lbF9zdW5vczUvZ2V0bWliOiBnZXRtc2cgcmV0dXJuZWQgJWRcbiIsIHJjKTsKCQlyZXQgPSAtRU5PREFUQTsKCQlnb3RvIFJldHVybjsKCgkgICAgY2FzZSBNT1JFREFUQToKCQlERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICIuLi4uLi4gZ2V0bWliIGluY3JlYXNlZCBidWZmZXIgc2l6ZVxuIikpOwoJCW9sZHNpemUgPSAoIHN0cmJ1Zi5idWYgLSAoY2hhciAqKSpzdGF0YnVmKSArIHN0cmJ1Zi5sZW47CgkJc3RyYnVmLmJ1ZiA9IChjaGFyICopcmVhbGxvYygqc3RhdGJ1Ziwgb2xkc2l6ZSs0MDk2KTsKCQlpZihzdHJidWYuYnVmICE9IE5VTEwpIHsKCQkgICAgKnN0YXRidWYgPSBzdHJidWYuYnVmOwoJCSAgICAqc2l6ZSA9IG9sZHNpemUgKyA0MDk2OwoJCSAgICBzdHJidWYuYnVmID0gKGNoYXIgKikqc3RhdGJ1ZiArIG9sZHNpemU7CgkJICAgIHN0cmJ1Zi5tYXhsZW4gPSA0MDk2OwoJCSAgICByZXN1bHQgPSBOT1RfRk9VTkQ7CgkJICAgIGJyZWFrOwoJCX0KCQlzdHJidWYuYnVmID0gKGNoYXIgKikqc3RhdGJ1ZiArIChvbGRzaXplIC0gc3RyYnVmLmxlbik7CgkgICAgY2FzZSAwOgoJCS8qIGZpeCBidWZmZXIgdG8gcmVhbCBzaXplICYgcG9zaXRpb24gKi8KCQlzdHJidWYubGVuICs9IHN0cmJ1Zi5idWYgLSAoY2hhciopKnN0YXRidWY7CgkJc3RyYnVmLmJ1ZiA9ICpzdGF0YnVmOwoJCXN0cmJ1Zi5tYXhsZW4gPSAqc2l6ZTsKCgkJaWYgKHJlcV90eXBlID09IEdFVF9ORVhUICYmIHJlc3VsdCA9PSBORUVEX05FWFQpCgkJICAgIC8qCgkJICAgICAqIEVuZCBvZiBidWZmZXIsIHNvICJuZXh0IiBpcyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbmV4dAoJCSAgICAgKiBidWZmZXIgIAoJCSAgICAgKi8KCQkgICAgcmVxX3R5cGUgPSBHRVRfRklSU1Q7CgkJcmVzdWx0ID0gZ2V0ZW50cnkocmVxX3R5cGUsICh2b2lkICopIHN0cmJ1Zi5idWYsIHN0cmJ1Zi5sZW4sCgkJCQkgIGVudHJ5c2l6ZSwgcmVzcCwgY29tcCwgYXJnKTsKCQkqbGVuZ3RoID0gc3RyYnVmLmxlbjsgICAgICAgLyogVG8gdXNlIGluIGNhbGxlciBmb3IgY2FjaGVpbmcgKi8KCQlicmVhazsKCSAgICB9Cgl9IHdoaWxlIChyYyA9PSBNT1JFREFUQSAmJiByZXN1bHQgIT0gRk9VTkQpOwoKCURFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLi4uLiBnZXRtaWIgYnVmZmVyIHNpemUgaXMgJWRcbiIsICpzaXplKSk7CgoJaWYgKHJlc3VsdCA9PSBGT1VORCkgeyAgICAgIC8qIFNlYXJjaCBpcyBzdWNjZXNzZnVsICovCgkgICAgaWYgKHJjICE9IE1PUkVEQVRBKSB7CgkJcmV0ID0gMDsgICAgLyogRm91bmQgYW5kIG5vIG1vcmUgZGF0YSAqLwoJICAgIH0gZWxzZSB7CgkJcmV0ID0gMTsgICAgLyogRm91bmQgYW5kIHRoZXJlIGlzIGFub3RoZXIgdW5yZWFkIGRhdGEgYmxvY2sgKi8KCSAgICB9CgkgICAgYnJlYWs7Cgl9IGVsc2UgeyAgICAgICAgICAgIC8qIFJlc3RvcmUgYnVmZmVycywgY29udGludWUgc2VhcmNoICovCgkgICAgc3RyYnVmLmJ1ZiA9IGJ1ZjsKCSAgICBzdHJidWYubWF4bGVuID0gQlVGU0laRTsKCX0KICAgIH0KIFJldHVybjoKICAgIGlmIChzZCA+PSAwKSBpb2N0bChzZCwgSV9GTFVTSCwgRkxVU0hSVyk7CiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICIuLi4uLi4gZ2V0bWliIHJldHVybnMgJWRcbiIsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQogIAovKgogKiBHZXQgaW5mbyBmb3IgaW50ZXJmYWNlcyBncm91cC4gTWltaWNzIGdldG1pYiBpbnRlcmZhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZQogKiB0byBiZSBzdWJzdGl0dXRlZCBsYXRlciBpZiBTdW5Tb2Z0IGRlY2lkZXMgdG8gZXh0ZW5kIGl0cyBtaWIyIGludGVyZmFjZS4KICovCgojaWYgZGVmaW5lZChIQVZFX0lGX05BTUVJTkRFWCkgJiYgZGVmaW5lZChORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUykKCi8qCiAqIElmIElGVEFCTEVfUkVXUklURVMgaXMgZW5hYmxlZCwgdGhlbiB3ZSB3aWxsIGFsc28gcmVseSBvbiBETFBJIHRvIG9idGFpbgogKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBOSUMuCiAqLwoKLyoKICogT3BlbiBhIERMUEkgZGV2aWNlLgogKgogKiBPbiBzdWNjZXNzIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCiAqIE9uIGVycm9yIC0xIGlzIHJldHVybmVkLgogKi8Kc3RhdGljIGludApfZGxwaV9vcGVuKGNvbnN0IGNoYXIgKmRldm5hbWUpCnsKICAgIGNoYXIgKmRldnN0cjsKICAgIGludCBmZCA9IC0xOwogICAgaW50IHBwYSA9IC0xOwoKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIl9kbHBpX29wZW4gY2FsbGVkXG4iKSk7CgogICAgaWYgKGRldm5hbWUgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKC0xKTsKCiAgICBpZiAoKGRldnN0ciA9IG1hbGxvYyg1ICsgc3RybGVuKGRldm5hbWUpICsgMSkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuICgtMSk7CiAgICAodm9pZCkgc3ByaW50ZihkZXZzdHIsICIvZGV2LyVzIiwgZGV2bmFtZSk7CiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImRldnN0ciglcylcbiIsIGRldnN0cikpOwogICAgLyoKICAgICAqIEZpcnN0IHRyeSBvcGVuaW5nIHRoZSBkZXZpY2UgdXNpbmcgc3R5bGUgMSwgaWYgdGhlIGRldmljZSBkb2VzIG5vdAogICAgICogZXhpc3Qgd2UgdHJ5IHN0eWxlIDIuIE1vZHVsZXMgd2lsbCBub3QgYmUgcHVzaGVkLCBzbyBzb21ldGhpbmcgbGlrZQogICAgICogaXAgdHVubmVscyB3aWxsIG5vdCB3b3JrLiAKICAgICAqLwogICAKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUxIG9wZW4oJXMpXG4iLCBkZXZzdHIpKTsKICAgIGlmICgoZmQgPSBvcGVuKGRldnN0ciwgT19SRFdSIHwgT19OT05CTE9DSykpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUxIG9wZW4gZmFpbGVkXG4iKSk7CiAgICAgICAgaWYgKF9kbHBpX3BhcnNlX2Rldm5hbWUoZGV2c3RyLCAmcHBhKSA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUyIHBhcnNlOiAlcywgJWRcbiIsIAogICAgICAgICAgICAgICAgICAgICAgIGRldnN0ciwgcHBhKSk7CiAgICAgICAgICAgIC8qIHRyeSBzdHlsZSAyICovCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAic3R5bGUyIG9wZW4oJXMpXG4iLCBkZXZzdHIpKTsKCiAgICAgICAgICAgIGlmICgoZmQgPSBvcGVuKGRldnN0ciwgT19SRFdSIHwgT19OT05CTE9DSykpICE9IC0xKSB7CiAgICAgICAgICAgICAgICBpZiAoX2RscGlfYXR0YWNoKGZkLCBwcGEpID09IDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImF0dGFjaGVkXG4iKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAiYXR0YWNoZWQgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgICAgICAgIGZkID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgInN0eWxlMiBvcGVuIGZhaWxlZFxuIikpOwogICAgICAgICAgICB9CiAgICAgICAgfSAKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsICJzdHlsZTEgb3BlbiBzdWNjZWVkZWRcbiIpKTsKICAgIH0KCiAgICAvKiBjbGVhbiB1cCAqLwogICAgZnJlZShkZXZzdHIpOwoKICAgIHJldHVybiAoZmQpOwp9CgovKgogKiBPYnRhaW4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSB1c2luZyBETFBJCiAqLwpzdGF0aWMgaW50Cl9kbHBpX2dldF9waHlzX2FkZHJlc3MoaW50IGZkLCBjaGFyICphZGRyLCBpbnQgbWF4bGVuLCBpbnQgKmFkZHJsZW4pCnsKICAgIGRsX3BoeXNfYWRkcl9yZXFfdCAgcGFkZHJfcmVxOwogICAgdW5pb24gRExfcHJpbWl0aXZlcyAqZGxwOwogICAgc3RydWN0IHN0cmJ1ZiAgICAgICBjdGxidWY7CiAgICBjaGFyICAgICAgICAgICAgICAgIGJ1ZltNQVgoRExfUEhZU19BRERSX0FDS19TSVpFKzY0LCBETF9FUlJPUl9BQ0tfU0laRSldOwogICAgaW50ICAgICAgICAgICAgICAgICBmbGFnID0gMDsKCiAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgIl9kbHBpX2dldF9waHlzX2FkZHJlc3NcbiIpKTsKCiAgICBwYWRkcl9yZXEuZGxfcHJpbWl0aXZlID0gRExfUEhZU19BRERSX1JFUTsKICAgIHBhZGRyX3JlcS5kbF9hZGRyX3R5cGUgPSBETF9DVVJSX1BIWVNfQUREUjsKICAgIGN0bGJ1Zi5idWYgPSAoY2hhciAqKSZwYWRkcl9yZXE7CiAgICBjdGxidWYubGVuID0gRExfUEhZU19BRERSX1JFUV9TSVpFOwogICAgaWYgKHB1dG1zZyhmZCwgJmN0bGJ1ZiwgTlVMTCwgMCkgPCAwKQogICAgICAgIHJldHVybiAoLTEpOwogICAgCiAgICBjdGxidWYubWF4bGVuID0gc2l6ZW9mKGJ1Zik7CiAgICBjdGxidWYubGVuID0gMDsKICAgIGN0bGJ1Zi5idWYgPSBidWY7CiAgICBpZiAoZ2V0bXNnKGZkLCAmY3RsYnVmLCBOVUxMLCAmZmxhZykgPCAwKQogICAgICAgIHJldHVybiAoLTEpOwoKICAgIGlmIChjdGxidWYubGVuIDwgc2l6ZW9mKHVpbnQzMl90KSkKICAgICAgICByZXR1cm4gKC0xKTsKICAgIGRscCA9ICh1bmlvbiBETF9wcmltaXRpdmVzICopYnVmOwogICAgc3dpdGNoIChkbHAtPmRsX3ByaW1pdGl2ZSkgewogICAgY2FzZSBETF9QSFlTX0FERFJfQUNLOiB7CiAgICAgICAgZGxfcGh5c19hZGRyX2Fja190ICpwaHlwID0gKGRsX3BoeXNfYWRkcl9hY2tfdCAqKWJ1ZjsKCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsICJnb3QgQUNLXG4iKSk7CiAgICAgICAgaWYgKGN0bGJ1Zi5sZW4gPCBETF9QSFlTX0FERFJfQUNLX1NJWkUgfHwgcGh5cC0+ZGxfYWRkcl9sZW5ndGggPiBtYXhsZW4pCiAgICAgICAgICAgIHJldHVybiAoLTEpOyAKICAgICAgICAodm9pZCkgbWVtY3B5KGFkZHIsIGJ1ZitwaHlwLT5kbF9hZGRyX29mZnNldCwgcGh5cC0+ZGxfYWRkcl9sZW5ndGgpOwogICAgICAgICphZGRybGVuID0gcGh5cC0+ZGxfYWRkcl9sZW5ndGg7CiAgICAgICAgcmV0dXJuICgwKTsKICAgIH0KICAgIGNhc2UgRExfRVJST1JfQUNLOiB7CiAgICAgICAgZGxfZXJyb3JfYWNrX3QgKmVycnAgPSAoZGxfZXJyb3JfYWNrX3QgKilidWY7CgogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAiZ290IEVSUk9SIEFDS1xuIikpOwogICAgICAgIGlmIChjdGxidWYubGVuIDwgRExfRVJST1JfQUNLX1NJWkUpCiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIHJldHVybiAoZXJycC0+ZGxfZXJybm8pOwogICAgfQogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgImdvdCB0eXBlOiAleFxuIiwgZGxwLT5kbF9wcmltaXRpdmUpKTsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KfQoKLyoKICogUXVlcnkgdGhlIGludGVyZmFjZSBhYm91dCBpdCdzIHR5cGUuCiAqLwpzdGF0aWMgaW50Cl9kbHBpX2dldF9pZnR5cGUoaW50IGZkLCB1bnNpZ25lZCBpbnQgKmlmdHlwZSkKewogICAgZGxfaW5mb19yZXFfdCBpbmZvX3JlcTsKICAgIHVuaW9uIERMX3ByaW1pdGl2ZXMgKmRscDsKICAgIHN0cnVjdCBzdHJidWYgICAgICAgY3RsYnVmOwogICAgY2hhciAgICAgICAgICAgICAgICBidWZbTUFYKERMX0lORk9fQUNLX1NJWkUsIERMX0VSUk9SX0FDS19TSVpFKV07CiAgICBpbnQgICAgICAgICAgICAgICAgIGZsYWcgPSAwOwoKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAiX2RscGlfZ2V0X2lmdHlwZVxuIikpOwoKICAgIGluZm9fcmVxLmRsX3ByaW1pdGl2ZSA9IERMX0lORk9fUkVROwogICAgY3RsYnVmLmJ1ZiA9IChjaGFyICopJmluZm9fcmVxOwogICAgY3RsYnVmLmxlbiA9IERMX0lORk9fUkVRX1NJWkU7CiAgICBpZiAocHV0bXNnKGZkLCAmY3RsYnVmLCBOVUxMLCAwKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNTpkbHBpIiwgInB1dG1zZyBmYWlsZWQ6ICVkXG5uIiwgZXJybm8pKTsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgIAogICAgY3RsYnVmLm1heGxlbiA9IHNpemVvZihidWYpOwogICAgY3RsYnVmLmxlbiA9IDA7CiAgICBjdGxidWYuYnVmID0gYnVmOwogICAgaWYgKGdldG1zZyhmZCwgJmN0bGJ1ZiwgTlVMTCwgJmZsYWcpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLCAiZ2V0bXNnIGZhaWxlZDogJWRcbiIsIGVycm5vKSk7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CgogICAgaWYgKGN0bGJ1Zi5sZW4gPCBzaXplb2YodWludDMyX3QpKQogICAgICAgIHJldHVybiAoLTEpOwogICAgZGxwID0gKHVuaW9uIERMX3ByaW1pdGl2ZXMgKilidWY7CiAgICBzd2l0Y2ggKGRscC0+ZGxfcHJpbWl0aXZlKSB7CiAgICBjYXNlIERMX0lORk9fQUNLOiB7CiAgICAgICAgZGxfaW5mb19hY2tfdCAqaW5mbyA9IChkbF9pbmZvX2Fja190ICopYnVmOwoKICAgICAgICBpZiAoY3RsYnVmLmxlbiA8IERMX0lORk9fQUNLX1NJWkUpCiAgICAgICAgICAgIHJldHVybiAoLTEpOyAKCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsICJkbF9tYWNfdHlwZTogJXhcbiIsCgkgICAgICAgICAgIGluZm8tPmRsX21hY190eXBlKSk7Cglzd2l0Y2ggKGluZm8tPmRsX21hY190eXBlKSB7CgljYXNlIERMX0NTTUFDRDoKCWNhc2UgRExfRVRIRVI6CgljYXNlIERMX0VUSF9DU01BOgoJCSppZnR5cGUgPSA2OwoJCWJyZWFrOwoJY2FzZSBETF9UUEI6CS8qIFRva2VuIFBhc3NpbmcgQnVzICovCgkJKmlmdHlwZSA9IDg7CgkJYnJlYWs7CgljYXNlIERMX1RQUjoJLyogVG9rZW4gUGFzc2luZyBSaW5nICovCgkJKmlmdHlwZSA9IDk7CgkJYnJlYWs7CgljYXNlIERMX0hETEM6CgkJKmlmdHlwZSA9IDExODsKCQlicmVhazsKCWNhc2UgRExfRkRESToKCQkqaWZ0eXBlID0gMTU7CgkJYnJlYWs7CgljYXNlIERMX0ZDOgkvKiBGaWJyZSBjaGFubmVsICovCgkJKmlmdHlwZSA9IDU2OwoJCWJyZWFrOwoJY2FzZSBETF9BVE06CgkJKmlmdHlwZSA9IDM3OwoJCWJyZWFrOwoJY2FzZSBETF9YMjU6CgljYXNlIERMX0lTRE46CgkJKmlmdHlwZSA9IDYzOwoJCWJyZWFrOwoJY2FzZSBETF9ISVBQSToKCQkqaWZ0eXBlID0gNDc7CgkJYnJlYWs7CiNpZmRlZiBETF9JQgoJY2FzZSBETF9JQjoKCQkqaWZ0eXBlID0gMTk5OwoJCWJyZWFrOwojZW5kaWYKCWNhc2UgRExfRlJBTUU6CS8qIEZyYW1lIFJlbGF5ICovCgkJKmlmdHlwZSA9IDMyOwoJCWJyZWFrOwoJY2FzZSBETF9MT09QOgoJCSppZnR5cGUgPSAyNDsKCQlicmVhazsKI2lmZGVmIERMX1dJRkkKCWNhc2UgRExfV0lGSToKCQkqaWZ0eXBlID0gNzE7CgkJYnJlYWs7CiNlbmRpZgojaWZkZWYgRExfSVBWNAkvKiB0aGVuIElQdjYgaXMgYWxzbyBkZWZpbmVkICovCgljYXNlIERMX0lQVjQ6CS8qIElQdjQgVHVubmVsICovCgljYXNlIERMX0lQVjY6CS8qIElQdjYgVHVubmVsICovCgkJKmlmdHlwZSA9IDEzMTsKCQlicmVhazsKI2VuZGlmCglkZWZhdWx0OgoJCSppZnR5cGUgPSAxOwkvKiBPdGhlciAqLwoJCWJyZWFrOwoJfQoJCiAgICAgICAgcmV0dXJuICgwKTsKICAgIH0KICAgIGNhc2UgRExfRVJST1JfQUNLOiB7CiAgICAgICAgZGxfZXJyb3JfYWNrX3QgKmVycnAgPSAoZGxfZXJyb3JfYWNrX3QgKilidWY7CgogICAgICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1OmRscGkiLAogICAgICAgICAgICAgICAgICAgICJnb3QgRExfRVJST1JfQUNLOiBkbHBpICVkLCBlcnJvciAlZFxuIiwgZXJycC0+ZGxfZXJybm8sCiAgICAgICAgICAgICAgICAgICAgZXJycC0+ZGxfdW5peF9lcnJubykpOwoKICAgICAgICBpZiAoY3RsYnVmLmxlbiA8IERMX0VSUk9SX0FDS19TSVpFKQogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICByZXR1cm4gKGVycnAtPmRsX2Vycm5vKTsKICAgIH0KICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczU6ZGxwaSIsICJnb3QgdHlwZSAleFxuIiwgZGxwLT5kbF9wcmltaXRpdmUpKTsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KfQoKc3RhdGljIGludApfZGxwaV9hdHRhY2goaW50IGZkLCBpbnQgcHBhKQp7CiAgICBkbF9hdHRhY2hfcmVxX3QgICAgIGF0dGFjaF9yZXE7CiAgICBzdHJ1Y3Qgc3RyYnVmICAgICAgIGN0bGJ1ZjsKICAgIHVuaW9uIERMX3ByaW1pdGl2ZXMgKmRscDsKICAgIGNoYXIgICAgICAgICAgICAgICAgYnVmW01BWChETF9PS19BQ0tfU0laRSwgRExfRVJST1JfQUNLX1NJWkUpXTsKICAgIGludCAgICAgICAgICAgICAgICAgZmxhZyA9IDA7CiAgIAogICAgYXR0YWNoX3JlcS5kbF9wcmltaXRpdmUgPSBETF9BVFRBQ0hfUkVROwogICAgYXR0YWNoX3JlcS5kbF9wcGEgPSBwcGE7CiAgICBjdGxidWYuYnVmID0gKGNoYXIgKikmYXR0YWNoX3JlcTsKICAgIGN0bGJ1Zi5sZW4gPSBETF9BVFRBQ0hfUkVRX1NJWkU7CiAgICBpZiAocHV0bXNnKGZkLCAmY3RsYnVmLCBOVUxMLCAwKSAhPSAwKQogICAgICAgIHJldHVybiAoLTEpOwoKICAgIGN0bGJ1Zi5idWYgPSBidWY7CiAgICBjdGxidWYubGVuID0gMDsKICAgIGN0bGJ1Zi5tYXhsZW4gPSBzaXplb2YoYnVmKTsKICAgIGlmIChnZXRtc2coZmQsICZjdGxidWYsIE5VTEwsICZmbGFnKSAhPSAwKQogICAgICAgIHJldHVybiAoLTEpOwoKICAgIGlmIChjdGxidWYubGVuIDwgc2l6ZW9mKHVpbnQzMl90KSkKICAgICAgICByZXR1cm4gKC0xKTsgCgogICAgZGxwID0gKHVuaW9uIERMX3ByaW1pdGl2ZXMgKilidWY7CiAgICBpZiAoZGxwLT5kbF9wcmltaXRpdmUgPT0gRExfT0tfQUNLICYmIGN0bGJ1Zi5sZW4gPj0gRExfT0tfQUNLX1NJWkUpCiAgICAgICAgcmV0dXJuICgwKTsgCiAgICByZXR1cm4gKC0xKTsKfQoKc3RhdGljIGludApfZGxwaV9wYXJzZV9kZXZuYW1lKGNoYXIgKmRldm5hbWUsIGludCAqcHBhcCkKewogICAgaW50IHBwYSA9IDA7CiAgICBpbnQgbSA9IDE7CiAgICBpbnQgaSA9IHN0cmxlbihkZXZuYW1lKSAtIDE7CgogICAgd2hpbGUgKGkgPj0gMCAmJiBpc2RpZ2l0KGRldm5hbWVbaV0pKSB7CiAgICAgICAgcHBhICs9IG0gKiAoZGV2bmFtZVtpXSAtICcwJyk7IAogICAgICAgIG0gKj0gMTA7CiAgICAgICAgaS0tOwogICAgfQoKICAgIGlmIChtID09IDEpIHsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgICpwcGFwID0gcHBhOwogICAgZGV2bmFtZVtpICsgMV0gPSAnXDAnOwoKICAgIHJldHVybiAoMCk7Cn0Kc3RhdGljIGludApnZXRpZihtaWIyX2lmRW50cnlfdCAqaWZidWYsIHNpemVfdCBzaXplLCByZXFfZSByZXFfdHlwZSwKICAgICAgbWliMl9pZkVudHJ5X3QgKnJlc3AsICBzaXplX3QgKmxlbmd0aCwgaW50ICgqY29tcCkodm9pZCAqLCB2b2lkICopLAogICAgICB2b2lkICphcmcpCnsKICAgIGludCAgICAgICAgICAgICBmZCwgaSwgcmV0OwogICAgaW50ICAgICAgICAgICAgIGlmc2QsIGlmc2Q2ID0gLTE7CiAgICBzdHJ1Y3QgbGlmcmVxICAgbGlmcmVxLCAqbGlmcnA7CiAgICBtaWIyX2lmRW50cnlfdCAqaWZwOwogICAgaW50ICAgICAgICAgICAgIG5lbnRyaWVzID0gc2l6ZSAvIHNpemVvZihtaWIyX2lmRW50cnlfdCk7CiAgICBmb3VuZF9lICAgICAgICAgcmVzdWx0ID0gTk9UX0ZPVU5EOwogICAgYm9vbGVhbl90ICAgICAgIGlmX2lzdjY7CiAgICB1aW50NjRfdCAgICAgICAgaWZfZmxhZ3M7ICAgIAogICAgc3RydWN0IGlmX25hbWVpbmRleCAqaWZuYW1lLCAqaWZucDsKCiAgICBsaWZycCA9ICZsaWZyZXE7IAoKICAgIGlmICgoaWZzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJrZXJuZWxfc3Vub3M1IiwgIi4uLi4uLiB1c2luZyBpZl9uYW1laW5kZXhcbiIpKTsKICAgIGlmICgoaWZuYW1lID0gaWZfbmFtZWluZGV4KCkpID09IE5VTEwpIHsKICAgICAgICByZXQgPSAtMTsKICAgICAgICBnb3RvIFJldHVybjsKICAgIH0KICAgIAogICAgLyoKICAgICAqIEdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGludGVyZmFjZSBmb3VuZC4gV2UgdHJ5IHRvIGhhbmRsZSBlcnJvcnMKICAgICAqIGdyYWNlZnVsbHk6IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nIGFuIGludGVyZmFjZSB3ZSBzaW1wbHkKICAgICAqIG1vdmUgYWxvbmcgdG8gdGhlIG5leHQgb25lLiBQcmV2aW91c2x5LCB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgd2l0aCBhbgogICAgICogZXJyb3IgcmlnaHQgYXdheS4gCiAgICAgKgogICAgICogaWZfbmFtZWluZGV4KCkgYWxyZWFkeSBlbGltaW5hdGVzIGR1cGxpY2F0ZSBpbnRlcmZhY2VzLCBzbyBubyBleHRyYQogICAgICogY2hlY2tzIGFyZSBuZWVkZWQgZm9yIGludGVyZmFjZXMgdGhhdCBoYXZlIGJvdGggSVB2NCBhbmQgSVB2NiBwbHVtYmVkCiAgICAgKi8KIEFnYWluOgogICAgZm9yIChpID0gMCwgaWZucCA9IGlmbmFtZSwgaWZwID0gKG1pYjJfaWZFbnRyeV90ICopIGlmYnVmOyAKICAgICBpZm5wLT5pZl9pbmRleCAhPSAwICYmIChpIDwgbmVudHJpZXMpOyBpZm5wKyspIHsKCiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIGdldGlmICVzXG4iLCBpZm5wLT5pZl9uYW1lKSk7CiAgICAgICAgbWVtY3B5KGxpZnJwLT5saWZyX25hbWUsIGlmbnAtPmlmX25hbWUsIExJRk5BTVNJWik7CiAgICAgICAgaWZfaXN2NiA9IEJfRkFMU0U7CgogICAgICAgIGlmIChpb2N0bChpZnNkLCBTSU9DR0xJRkZMQUdTLCBsaWZycCkgPCAwKSB7CiAgICAgICAgICAgIGlmIChpZnNkNiA9PSAtMSkgewogICAgICAgICAgICAgICAgaWYgKChpZnNkNiA9IHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCkpIDwgMCkgewogICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOwogICAgICAgICAgICAgICAgICAgIGdvdG8gUmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpb2N0bChpZnNkNiwgU0lPQ0dMSUZGTEFHUywgbGlmcnApIDwgMCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlNJT0NHTElGRkxBR1MgJXM6ICVzXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGxpZnJwLT5saWZyX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZl9pc3Y2ID0gQl9UUlVFOwogICAgICAgIH0gCiAgICAgICAgaWZfZmxhZ3MgPSBsaWZycC0+bGlmcl9mbGFnczsKICAgICAgICAgICAgCiAgICAgICAgaWYgKGlvY3RsKGlmX2lzdjY/aWZzZDY6aWZzZCwgU0lPQ0dMSUZNVFUsIGxpZnJwKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIFNJT0NHTElGTVRVIGZhaWxlZFxuIikpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIG1lbXNldChpZnAsIDAsIHNpemVvZihtaWIyX2lmRW50cnlfdCkpOwoKICAgICAgICBpZiAoKGZkID0gX2RscGlfb3BlbihpZm5wLT5pZl9uYW1lKSkgIT0gLTEpIHsKICAgICAgICAgICAgLyogQ291bGQgb3BlbiBETFBJLi4uIG5vdyB0cnkgdG8gZ3JhYiBzb21lIGluZm8gKi8KICAgICAgICAgICAgKHZvaWQpIF9kbHBpX2dldF9waHlzX2FkZHJlc3MoZmQsIGlmcC0+aWZQaHlzQWRkcmVzcy5vX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpZnAtPmlmUGh5c0FkZHJlc3Mub19ieXRlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlmcC0+aWZQaHlzQWRkcmVzcy5vX2xlbmd0aCk7CiAgICAgICAgICAgICh2b2lkKSBfZGxwaV9nZXRfaWZ0eXBlKGZkLCAmaWZwLT5pZlR5cGUpOwogICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgfQoKICAgICAgICBzZXRfaWZfaW5mbyhpZnAsIGlmbnAtPmlmX2luZGV4LCBpZm5wLT5pZl9uYW1lLCBpZl9mbGFncywgCiAgICAgICAgICAgICAgICAgICAgbGlmcnAtPmxpZnJfbWV0cmljKTsKCiAgICAgICAgaWYgKGdldF9pZl9zdGF0cyhpZnApIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICIuLi4uLi4gZ2V0X2lmX3N0YXRzIGZhaWxlZFxuIikpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogT25jZSB3ZSByZWFjaCBoZXJlIHdlIGtub3cgdGhhdCBhbGwgd2VudCB3ZWxsLCBzbyBtb3ZlIHRvCiAgICAgICAgICogdGhlIG5leHQgaWZFbnRyeS4gCiAgICAgICAgICovCiAgICAgICAgaSsrOwogICAgICAgIGlmcCsrOwogICAgfQoKICAgIGlmICgocmVxX3R5cGUgPT0gR0VUX05FWFQpICYmIChyZXN1bHQgPT0gTkVFRF9ORVhUKSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBFbmQgb2YgYnVmZmVyLCBzbyAibmV4dCIgaXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG5leHQgYnVmZmVyIAogICAgICAgICAgICAgKi8KICAgICAgICByZXFfdHlwZSA9IEdFVF9GSVJTVDsKICAgIH0KCiAgICByZXN1bHQgPSBnZXRlbnRyeShyZXFfdHlwZSwgKHZvaWQgKikgaWZidWYsIHNpemUsIHNpemVvZihtaWIyX2lmRW50cnlfdCksCiAgICAgICAgICAgICAgKHZvaWQgKilyZXNwLCBjb21wLCBhcmcpOwoKICAgIGlmICgocmVzdWx0ICE9IEZPVU5EKSAmJiAoaSA9PSBuZW50cmllcykgJiYgaWZucC0+aWZfaW5kZXggIT0gMCkgeyAKICAgIC8qCiAgICAgKiBXZSByZWFjaGVkIHRoZSBlbmQgb2Ygc3VwcGxpZWQgYnVmZmVyLCBidXQgdGhlcmUgaXMKICAgICAqIHNvbWUgbW9yZSBzdHVmZiB0byByZWFkLCBzbyBjb250aW51ZS4KICAgICAqLwogICAgICAgIGdvdG8gQWdhaW47CiAgICB9CgogICAgaWYgKHJlc3VsdCAhPSBGT1VORCkgewogICAgICAgIHJldCA9IDI7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChpZm5wLT5pZl9pbmRleCAhPSAwKSB7CiAgICAgICAgICAgIHJldCA9IDE7ICAgICAgICAvKiBGb3VuZCBhbmQgbW9yZSBkYXRhIHRvIGZldGNoICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0ID0gMDsgICAgICAgIC8qIEZvdW5kIGFuZCBubyBtb3JlIGRhdGEgKi8KICAgICAgICB9CiAgICAgICAgKmxlbmd0aCA9IGkgKiBzaXplb2YobWliMl9pZkVudHJ5X3QpOyAgICAgICAvKiBBY3R1YWwgY2FjaGUgbGVuZ3RoICovCiAgICB9CgogUmV0dXJuOgogICAgaWYgKGlmbmFtZSkKICAgICAgICBpZl9mcmVlbmFtZWluZGV4KGlmbmFtZSk7CiAgICBjbG9zZShpZnNkKTsKICAgIGlmIChpZnNkNiAhPSAtMSkKICAgICAgICBjbG9zZShpZnNkNik7CiAgICByZXR1cm4gcmV0Owp9CiNlbHNlIC8qIG9ubHkgcmVseSBvbiBTSU9DR0lGQ09ORiB0byBnZXQgaW50ZXJmYWNlIGluZm9ybWF0aW9uICovIAoKc3RhdGljIGludApnZXRpZihtaWIyX2lmRW50cnlfdCAqaWZidWYsIHNpemVfdCBzaXplLCByZXFfZSByZXFfdHlwZSwKICAgICAgbWliMl9pZkVudHJ5X3QgKnJlc3AsICBzaXplX3QgKmxlbmd0aCwgaW50ICgqY29tcCkodm9pZCAqLCB2b2lkICopLAogICAgICB2b2lkICphcmcpCnsKICAgIGludCAgICAgICAgICAgICBpLCByZXQsIGlkeCA9IDE7CiAgICBpbnQgICAgICAgICAgICAgaWZzZDsKICAgIHN0YXRpYyBjaGFyICAgICpidWYgPSBOVUxMOwogICAgc3RhdGljIGludCAgICAgIGJ1ZnNpemUgPSAwOwogICAgc3RydWN0IGlmY29uZiAgIGlmY29uZjsKICAgIHN0cnVjdCBpZnJlcSAgICppZnJwOwogICAgbWliMl9pZkVudHJ5X3QgKmlmcDsKICAgIG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCBNZWRpYTsKICAgIGludCAgICAgICAgICAgICBuZW50cmllcyA9IHNpemUgLyBzaXplb2YobWliMl9pZkVudHJ5X3QpOwogICAgaW50ICAgICAgICAgICAgIGlmX2ZsYWdzID0gMDsKICAgIGZvdW5kX2UgICAgICAgICByZXN1bHQgPSBOT1RfRk9VTkQ7CgogICAgaWYgKChpZnNkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKCXJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoIWJ1ZikgewoJYnVmc2l6ZSA9IDEwMjQwOwoJYnVmID0gbWFsbG9jKGJ1ZnNpemUpOwoJaWYgKCFidWYpIHsKCSAgICByZXQgPSAtMTsKCSAgICBnb3RvIFJldHVybjsKCX0KICAgIH0KCiAgICBpZmNvbmYuaWZjX2J1ZiA9IGJ1ZjsKICAgIGlmY29uZi5pZmNfbGVuID0gYnVmc2l6ZTsKICAgIHdoaWxlIChpb2N0bChpZnNkLCBTSU9DR0lGQ09ORiwgJmlmY29uZikgPT0gLTEpIHsKCWJ1ZnNpemUgKz0gMTAyNDA7CglmcmVlKGJ1Zik7CglidWYgPSBtYWxsb2MoYnVmc2l6ZSk7CglpZiAoIWJ1ZikgewoJICAgIHJldCA9IC0xOwoJICAgIGdvdG8gUmV0dXJuOwoJfQoJaWZjb25mLmlmY19idWYgPSBidWY7CglpZmNvbmYuaWZjX2xlbiA9IGJ1ZnNpemU7CiAgICB9CgogQWdhaW46CiAgICBmb3IgKGkgPSAwLCBpZnAgPSAobWliMl9pZkVudHJ5X3QgKikgaWZidWYsIGlmcnAgPSBpZmNvbmYuaWZjX3JlcTsKCSAoKGNoYXIgKikgaWZycCA8ICgoY2hhciAqKSBpZmNvbmYuaWZjX2J1ZiArIGlmY29uZi5pZmNfbGVuKSkKICAgICAgICAgICAgICYmIChpIDwgbmVudHJpZXMpOyBpKyssIGlmcCsrLCBpZnJwKyssIGlkeCsrKSB7CgoJREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIGdldGlmICVzXG4iLCBpZnJwLT5pZnJfbmFtZSkpOwoKCWlmIChpb2N0bChpZnNkLCBTSU9DR0lGRkxBR1MsIGlmcnApIDwgMCkgewoJICAgIHJldCA9IC0xOwoJICAgIHNubXBfbG9nKExPR19FUlIsICJTSU9DR0lGRkxBR1MgJXM6ICVzXG4iLCBpZnJwLT5pZnJfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKCSAgICBnb3RvIFJldHVybjsKCX0KICAgICAgICBpZl9mbGFncyA9IGlmcnAtPmlmcl9mbGFnczsKCglpZiAoaW9jdGwoaWZzZCwgU0lPQ0dJRk1UVSwgaWZycCkgPCAwKSB7CgkgICAgcmV0ID0gLTE7CgkgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiLi4uLi4uIFNJT0NHSUZNVFUgZmFpbGVkXG4iKSk7CgkgICAgZ290byBSZXR1cm47Cgl9CgoJbWVtc2V0KGlmcCwgMCwgc2l6ZW9mKG1pYjJfaWZFbnRyeV90KSk7CglzZXRfaWZfaW5mbyhpZnAsIGlkeCwgaWZycC0+aWZyX25hbWUsIGlmX2ZsYWdzLCBpZnJwLT5pZnJfbWV0cmljKTsKCQogICAgICAgIGlmIChnZXRfaWZfc3RhdHMoaWZwKSA8IDApIHsKICAgICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgICAgIGdvdG8gUmV0dXJuOwogICAgICAgIH0KCS8qCgkgKiBBbiBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlLgoJICogVGhlcmUgc2hvdWxkIGJlIGEgbW9yZSBlbGVnYW50IHNvbHV0aW9uIHVzaW5nIERMUEksIGJ1dCAidGhlIG1hcmdpbgoJICogaXMgdG9vIHNtYWxsIHRvIHB1dCBpdCBoZXJlIC4uLiIKCSAqLwoKCWlmIChpb2N0bChpZnNkLCBTSU9DR0lGQUREUiwgaWZycCkgPCAwKSB7CgkgICAgcmV0ID0gLTE7CgkgICAgZ290byBSZXR1cm47Cgl9CgoJaWYgKGdldE1pYnN0YXQoTUlCX0lQX05FVCwgJk1lZGlhLCBzaXplb2YobWliMl9pcE5ldFRvTWVkaWFFbnRyeV90KSwKCQkgICAgICAgR0VUX0VYQUNULCAmTmFtZV9jbXAsIGlmcnApID09IDApIHsKCSAgICBpZnAtPmlmUGh5c0FkZHJlc3MgPSBNZWRpYS5pcE5ldFRvTWVkaWFQaHlzQWRkcmVzczsKCX0KICAgIH0KCiAgICBpZiAoKHJlcV90eXBlID09IEdFVF9ORVhUKSAmJiAocmVzdWx0ID09IE5FRURfTkVYVCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRW5kIG9mIGJ1ZmZlciwgc28gIm5leHQiIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBuZXh0IGJ1ZmZlciAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlcV90eXBlID0gR0VUX0ZJUlNUOwogICAgfQoKICAgIHJlc3VsdCA9IGdldGVudHJ5KHJlcV90eXBlLCAodm9pZCAqKSBpZmJ1Ziwgc2l6ZSwgc2l6ZW9mKG1pYjJfaWZFbnRyeV90KSwKCQkgICAgICAodm9pZCAqKXJlc3AsIGNvbXAsIGFyZyk7CgogICAgaWYgKChyZXN1bHQgIT0gRk9VTkQpICYmIChpID09IG5lbnRyaWVzKSAmJiAKCSgoY2hhciAqKWlmcnAgPCAoY2hhciAqKWlmY29uZi5pZmNfYnVmICsgaWZjb25mLmlmY19sZW4pKSB7CgkvKgoJICogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHN1cHBsaWVkIGJ1ZmZlciwgYnV0IHRoZXJlIGlzCgkgKiBzb21lIG1vcmUgc3R1ZmYgdG8gcmVhZCwgc28gY29udGludWUuCgkgKi8KCWlmY29uZi5pZmNfbGVuIC09IGkgKiBzaXplb2Yoc3RydWN0IGlmcmVxKTsKCWlmY29uZi5pZmNfcmVxID0gaWZycDsKCWdvdG8gQWdhaW47CiAgICB9CgogICAgaWYgKHJlc3VsdCAhPSBGT1VORCkgewogICAgICAgICAgICByZXQgPSAyOwogICAgfSBlbHNlIHsKCWlmICgoY2hhciAqKWlmcnAgPCAoY2hhciAqKWlmY29uZi5pZmNfYnVmICsgaWZjb25mLmlmY19sZW4pIHsKCSAgICByZXQgPSAxOyAgICAgICAgLyogRm91bmQgYW5kIG1vcmUgZGF0YSB0byBmZXRjaCAqLwoJfSBlbHNlIHsKCSAgICByZXQgPSAwOyAgICAgICAgLyogRm91bmQgYW5kIG5vIG1vcmUgZGF0YSAqLwoJfQoJKmxlbmd0aCA9IGkgKiBzaXplb2YobWliMl9pZkVudHJ5X3QpOyAgICAgICAvKiBBY3R1YWwgY2FjaGUgbGVuZ3RoICovCiAgICB9CgogUmV0dXJuOgogICAgY2xvc2UoaWZzZCk7CiAgICByZXR1cm4gcmV0Owp9CiNlbmRpZiAvKmRlZmluZWQoSEFWRV9JRl9OQU1FSU5ERVgpJiZkZWZpbmVkKE5FVFNOTVBfSU5DTFVERV9JRlRBQkxFX1JFV1JJVEVTKSovCgpzdGF0aWMgdm9pZApzZXRfaWZfaW5mbyhtaWIyX2lmRW50cnlfdCAqaWZwLCB1bnNpZ25lZCBpbmRleCwgY2hhciAqbmFtZSwgdWludDY0X3QgZmxhZ3MsCiAgICAgICAgICAgIGludCBtdHUpCnsgCiAgICBib29sZWFuX3QgaGF2ZXNwZWVkID0gQl9GQUxTRTsKCiAgICAvKgogICAgICogU2V0IGJhc2ljIGluZm9ybWF0aW9uIAogICAgICovCiAgICBpZnAtPmlmSW5kZXggPSBpbmRleDsKICAgIGlmcC0+aWZEZXNjci5vX2xlbmd0aCA9IHN0cmxlbihuYW1lKTsKICAgIHN0cmNweShpZnAtPmlmRGVzY3Iub19ieXRlcywgbmFtZSk7CiAgICBpZnAtPmlmQWRtaW5TdGF0dXMgPSAoZmxhZ3MgJiBJRkZfVVApID8gMSA6IDI7CiAgICBpZnAtPmlmT3BlclN0YXR1cyA9ICgoZmxhZ3MgJiBJRkZfVVApICYmIChmbGFncyAmIElGRl9SVU5OSU5HKSkgPyAxIDogMjsKICAgIGlmcC0+aWZMYXN0Q2hhbmdlID0gMDsgICAgICAvKiBXaG8ga25vd3MgLi4uICAqLwogICAgaWZwLT5mbGFncyA9IGZsYWdzOwogICAgaWZwLT5pZk10dSA9IG10dTsKICAgIGlmcC0+aWZTcGVlZCA9IDA7CgogICAgLyoKICAgICAqIEdldCBsaW5rIHNwZWVkCiAgICAgKi8KICAgIGlmICgoZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgImlmc3BlZWQiLCAmaWZwLT5pZlNwZWVkKSA9PSAwKSkgewogICAgICAgIC8qCiAgICAgICAgICogY2hlY2sgZm9yIFN1bk9TIHBhdGNoIHdpdGggaGFsZiBpbXBsZW1lbnRlZCBpZlNwZWVkIAogICAgICAgICAqLwogICAgICAgIGlmIChpZnAtPmlmU3BlZWQgPiAwICYmIGlmcC0+aWZTcGVlZCA8IDEwMDAwKSB7CiAgICAgICAgICAgIGlmcC0+aWZTcGVlZCAqPSAxMDAwMDAwOwogICAgICAgIH0KCWhhdmVzcGVlZCA9IEJfVFJVRTsKICAgIH0gZWxzZSBpZiAoZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgImlmU3BlZWQiLCAmaWZwLT5pZlNwZWVkKSA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiB0aGlzIGlzIGdvb2QgCiAgICAgICAgICovCgloYXZlc3BlZWQgPSBCX1RSVUU7CiAgICB9IGVsc2UgaWYgKGdldEtzdGF0SW50KCJsaW5rIiwgbmFtZSwgImlmc3BlZWQiLCAmaWZwLT5pZlNwZWVkKSA9PSAwKSB7CgloYXZlc3BlZWQgPSBCX1RSVUU7CiAgICB9CgogICAgLyogbWFrZSBpZk9wZXJTdGF0dXMgZGVwZW5kIG9uIGxpbmsgc3RhdHVzIGlmIGF2YWlsYWJsZSAqLwogICAgaWYgKGlmcC0+aWZBZG1pblN0YXR1cyA9PSAxKSB7CiAgICAgICAgaW50IGlfdG1wOwogICAgICAgIC8qIG9ubHkgVVBlZCBpbnRlcmZhY2VzIGdldCBjb3JyZWN0IGxpbmsgc3RhdHVzIC0gaWYgYW55ICovCiAgICAgICAgaWYgKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsImxpbmtfdXAiLCZpX3RtcCkgPT0gMCkgewogICAgICAgICAgICBpZnAtPmlmT3BlclN0YXR1cyA9IGlfdG1wID8gMSA6IDI7CiNpZmRlZiBJRkZfRkFJTEVECiAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIElGRl9GQUlMRUQpIHsKICAgICAgICAgICAgLyoKCSAgICAgKiBJZiBJUE1QIGlzIHVzZWQsIGFuZCBpZiB0aGUgZGFlbW9uIG1hcmtzIHRoZSBpbnRlcmZhY2UKCSAgICAgKiBhcyAnZmFpbGVkJywgdGhlbiB3ZSBrbm93IGZvciBzdXJlIHNvbWV0aGluZyBpcyBhbWlzcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmcC0+aWZPcGVyU3RhdHVzID0gMjsKI2VuZGlmCgl9IGVsc2UgaWYgKGhhdmVzcGVlZCA9PSBCX1RSVUUgJiYgaWZwLT5pZlNwZWVkID09IDApIHsKCSAgICAvKiBIZXVyaXN0aWMgKi8KCSAgICBpZnAtPmlmT3BlclN0YXR1cyA9IDI7Cgl9CiAgICB9CgogICAgLyoKICAgICAqIFNldCBsaW5rIFR5cGUgYW5kIFNwZWVkIChpZiBpdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIGtzdGF0KQogICAgICovCiAgICBpZiAoaWZwLT5pZlR5cGUgPT0gMjQpIHsKICAgICAgICBpZnAtPmlmU3BlZWQgPSAxMjcwMDAwMDA7CiAgICB9IGVsc2UgaWYgKGlmcC0+aWZUeXBlID09IDEgfHwgaWZwLT5pZlR5cGUgPT0gMCkgewogICAgICAgIC8qCgkgKiBDb3VsZCBub3QgZ2V0IHRoZSB0eXBlIGZyb20gRExQSSwgc28gbGV0cyBmYWxsIGJhY2sgdG8gdGhlIGhhcmRjb2RlZAoJICogdmFsdWVzLgoJICovCiAgICAgICAgc3dpdGNoIChuYW1lWzBdKSB7CiAgICAgICAgY2FzZSAnYSc6ICAgICAgICAgIC8qIGF0aCAoODAyLjExKSAqLwogICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAndCcgJiYgbmFtZVsyXSA9PSAnaCcpCiAgICAgICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDcxOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdsJzogICAgICAgICAgLyogbGUgLyBsbyAvIGxhbmUgKEFUTSBMQU4gRW11bGF0aW9uKSAqLwogICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAnbycpIHsKICAgICAgICAgICAgaWYgKCFpZnAtPmlmU3BlZWQpCiAgICAgICAgICAgICAgICBpZnAtPmlmU3BlZWQgPSAxMjcwMDAwMDA7CiAgICAgICAgICAgIGlmcC0+aWZUeXBlID0gMjQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKICAgICAgICAgICAgaWYgKCFpZnAtPmlmU3BlZWQpCiAgICAgICAgICAgICAgICBpZnAtPmlmU3BlZWQgPSAxMDAwMDAwMDsKICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSA2OwogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2EnKSB7CiAgICAgICAgICAgIGlmICghaWZwLT5pZlNwZWVkKQogICAgICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTU1MDAwMDAwOwogICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDM3OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgCiAgICAgICAgY2FzZSAnZyc6ICAgICAgICAgIC8qIGdlIChnaWdhYml0IGV0aGVybmV0IGNhcmQpICAqLwogICAgICAgIGNhc2UgJ2MnOiAgICAgICAgICAvKiBjZSAoQ2Fzc2luaSBHaWdhYml0LUV0aGVybmV0IChQQ0kpICovCiAgICAgICAgICAgIGlmICghaWZwLT5pZlNwZWVkKQogICAgICAgICAgICBpZnAtPmlmU3BlZWQgPSAxMDAwMDAwMDAwOwogICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDY7CiAgICAgICAgICAgIGJyZWFrOwogICAgCiAgICAgICAgY2FzZSAnaCc6ICAgICAgICAgIC8qIGhtZSAoU0J1cyBjYXJkKSAqLwogICAgICAgIGNhc2UgJ2UnOiAgICAgICAgICAvKiBlcmkgKFBDSSBjYXJkKSAqLwogICAgICAgIGNhc2UgJ2InOiAgICAgICAgICAvKiBiZSAqLwogICAgICAgIGNhc2UgJ2QnOiAgICAgICAgICAvKiBkbWZlIC0tIGZvdW5kIG9uIG5ldHJhIFgxICovCiAgICAgICAgICAgIGlmICghaWZwLT5pZlNwZWVkKQogICAgICAgICAgICBpZnAtPmlmU3BlZWQgPSAxMDAwMDAwMDA7CiAgICAgICAgICAgIGlmcC0+aWZUeXBlID0gNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAKICAgICAgICBjYXNlICdmJzogICAgICAgICAgLyogZmEgKEZvcmUgQVRNKSAqLwogICAgICAgICAgICBpZiAoIWlmcC0+aWZTcGVlZCkKICAgICAgICAgICAgaWZwLT5pZlNwZWVkID0gMTU1MDAwMDAwOwogICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDM3OwogICAgICAgICAgICBicmVhazsKICAgIAogICAgICAgIGNhc2UgJ3EnOiAgICAgICAgIC8qIHFlIChRdWFkRXRoZXIpL3FhIChGb3JlIEFUTSkvcWZlIChRdWFkRmFzdEV0aGVyKSAqLwogICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAnYScpIHsKICAgICAgICAgICAgaWYgKCFpZnAtPmlmU3BlZWQpCiAgICAgICAgICAgICAgICBpZnAtPmlmU3BlZWQgPSAxNTUwMDAwMDA7CiAgICAgICAgICAgIGlmcC0+aWZUeXBlID0gMzc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKICAgICAgICAgICAgICAgIGlmICghaWZwLT5pZlNwZWVkKQogICAgICAgICAgICAgICAgICAgIGlmcC0+aWZTcGVlZCA9IDEwMDAwMDAwOwogICAgICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSA2OwogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2YnKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlmcC0+aWZTcGVlZCkKICAgICAgICAgICAgICAgICAgICBpZnAtPmlmU3BlZWQgPSAxMDAwMDAwMDA7CiAgICAgICAgICAgICAgICBpZnAtPmlmVHlwZSA9IDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAKICAgICAgICBjYXNlICdpJzogICAgICAgICAgLyogaWJkIChJbmZpbmliYW5kKS9pcC50dW4gKElQIHR1bm5lbCkgKi8KICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ2InKQogICAgICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSAxOTk7CiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ3AnKQogICAgICAgICAgICAgICAgaWZwLT5pZlR5cGUgPSAxMzE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIGludCAKZ2V0X2lmX3N0YXRzKG1pYjJfaWZFbnRyeV90ICppZnApCnsKICAgIENvdW50ZXIgbF90bXA7CiAgICBjaGFyICpuYW1lID0gaWZwLT5pZkRlc2NyLm9fYnl0ZXM7CgogICAgaWYgKHN0cmNocihuYW1lLCAnOicpKQogICAgICAgIHJldHVybiAoMCk7IAoKICAgIC8qCiAgICAgKiBGaXJzdCB0cnkgdG8gZ3JhYiA2NC1iaXQgY291bnRlcnM7IGlmIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUsCiAgICAgKiBmYWxsIGJhY2sgdG8gMzItYml0LgogICAgICovCiAgICBpZiAoZ2V0S3N0YXQobmFtZSwgImlwYWNrZXRzNjQiLCAmaWZwLT5pZkhDSW5VY2FzdFBrdHMpICE9IDApIHsKICAgICAgICBpZiAoZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgImlwYWNrZXRzIiwgJmlmcC0+aWZJblVjYXN0UGt0cykgIT0gMCkgewogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CiAgICB9IGVsc2UgeyAKICAgICAgICAgICAgaWZwLT5pZkluVWNhc3RQa3RzID0gKHVpbnQzMl90KShpZnAtPmlmSENJblVjYXN0UGt0cyAmIDB4ZmZmZmZmZmYpOyAKICAgIH0KICAgIAogICAgaWYgKGdldEtzdGF0KG5hbWUsICJyYnl0ZXM2NCIsICZpZnAtPmlmSENJbk9jdGV0cykgIT0gMCkgewogICAgICAgIGlmIChnZXRLc3RhdEludChOVUxMLCBuYW1lLCAicmJ5dGVzIiwgJmlmcC0+aWZJbk9jdGV0cykgIT0gMCkgewogICAgICAgICAgICBpZnAtPmlmSW5PY3RldHMgPSBpZnAtPmlmSW5VY2FzdFBrdHMgKiAzMDg7IAogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmcC0+aWZJbk9jdGV0cyA9ICh1aW50MzJfdCkoaWZwLT5pZkhDSW5PY3RldHMgJiAweGZmZmZmZmZmKTsKICAgIH0KICAgCiAgICBpZiAoZ2V0S3N0YXQobmFtZSwgIm9wYWNrZXRzNjQiLCAmaWZwLT5pZkhDT3V0VWNhc3RQa3RzKSAhPSAwKSB7CiAgICAgICAgaWYgKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJvcGFja2V0cyIsICZpZnAtPmlmT3V0VWNhc3RQa3RzKSAhPSAwKSB7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgIGlmcC0+aWZPdXRVY2FzdFBrdHMgPSAodWludDMyX3QpKGlmcC0+aWZIQ091dFVjYXN0UGt0cyAmIDB4ZmZmZmZmZmYpOwogICAgfQogICAgCiAgICBpZiAoZ2V0S3N0YXQobmFtZSwgIm9ieXRlczY0IiwgJmlmcC0+aWZIQ091dE9jdGV0cykgIT0gMCkgewogICAgICAgIGlmIChnZXRLc3RhdEludChOVUxMLCBuYW1lLCAib2J5dGVzIiwgJmlmcC0+aWZPdXRPY3RldHMpICE9IDApIHsgCiAgICAgICAgICAgIGlmcC0+aWZPdXRPY3RldHMgPSBpZnAtPmlmT3V0VWNhc3RQa3RzICogMzA4OyAgICAvKiBYWFggKi8KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmcC0+aWZPdXRPY3RldHMgPSAodWludDMyX3QpKGlmcC0+aWZIQ091dE9jdGV0cyAmIDB4ZmZmZmZmZmYpOwogICAgfQoKICAgIGlmIChpZnAtPmlmVHlwZSA9PSAyNCkgIC8qIExvb3BiYWNrICovCiAgICAgICAgcmV0dXJuICgwKTsKCiAgICAvKiBzb21lPyBWTEFOIGludGVyZmFjZXMgZG9uJ3QgaGF2ZSBlcnJvciBjb3VudGVycywgc28gaWdub3JlIGZhaWx1cmUgKi8KICAgIGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJpZXJyb3JzIiwgJmlmcC0+aWZJbkVycm9ycyk7CiAgICBnZXRLc3RhdEludChOVUxMLCBuYW1lLCAib2Vycm9ycyIsICZpZnAtPmlmT3V0RXJyb3JzKTsKCiAgICAvKiBUcnkgdG8gZ3JhYiBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KICAgIGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJjb2xsaXNpb25zIiwgJmlmcC0+aWZDb2xsaXNpb25zKTsgCiAgICBnZXRLc3RhdEludChOVUxMLCBuYW1lLCAidW5rbm93bnMiLCAmaWZwLT5pZkluVW5rbm93blByb3Rvcyk7IAogICAgICAgICAgICAgICAgCgogICAgLyoKICAgICAqIFRPRE8gc29tZSBOSUNzIG1haW50YWluIDY0LWJpdCBjb3VudGVycyBmb3IgbXVsdGkvYnJvYWRjYXN0CiAgICAgKiBwYWNrZXRzOyBzaG91bGQgdHJ5IHRvIGdldCB0aGF0IGluZm9ybWF0aW9uLgogICAgICovCiAgICBpZiAoZ2V0S3N0YXRJbnQoTlVMTCwgbmFtZSwgImJyZGNzdHJjdiIsICZsX3RtcCkgPT0gMCkgCiAgICAgICAgaWZwLT5pZkhDSW5Ccm9hZGNhc3RQa3RzID0gbF90bXA7CgogICAgaWYgKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJtdWx0aXJjdiIsICZsX3RtcCkgPT0gMCkKICAgICAgICBpZnAtPmlmSENJbk11bHRpY2FzdFBrdHMgPSBsX3RtcDsKCiAgICBpZnAtPmlmSW5OVWNhc3RQa3RzID0gKHVpbnQzMl90KShpZnAtPmlmSENJbkJyb2FkY2FzdFBrdHMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcC0+aWZIQ0luTXVsdGljYXN0UGt0cyk7CgogICAgaWYgKGdldEtzdGF0SW50KE5VTEwsIG5hbWUsICJicmRjc3R4bXQiLCAmbF90bXApID09IDApCiAgICAgICAgaWZwLT5pZkhDT3V0QnJvYWRjYXN0UGt0cyA9IGxfdG1wOwoKICAgIGlmIChnZXRLc3RhdEludChOVUxMLCBuYW1lLCAibXVsdGl4bXQiLCAmbF90bXApID09IDApCiAgICAgICAgaWZwLT5pZkhDT3V0TXVsdGljYXN0UGt0cyA9IGxfdG1wOwoKICAgIGlmcC0+aWZPdXROVWNhc3RQa3RzID0gKHVpbnQzMl90KShpZnAtPmlmSENPdXRCcm9hZGNhc3RQa3RzICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZwLT5pZkhDT3V0TXVsdGljYXN0UGt0cyk7CiAgICByZXR1cm4oMCk7Cn0KLyoKICogQWx3YXlzIFRSVUUuIE1heSBiZSB1c2VkIGFzIGEgY29tcGFyaXNvbiBmdW5jdGlvbiBpbiBnZXRNaWJzdGF0CiAqIHRvIG9idGFpbiB0aGUgd2hvbGUgdGFibGUgKEdFVF9GSVJTVCBzaG91bGQgYmUgdXNlZCkgCiAqLwppbnQKR2V0X2V2ZXJ5dGhpbmcodm9pZCAqeCwgdm9pZCAqeSkKewogICAgcmV0dXJuIDA7ICAgICAgICAgICAgIC8qIEFsd2F5cyBUUlVFICovCn0KCi8qCiAqIENvbXBhcmUgbmFtZSBhbmQgSVAgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIHRvIEFSUCB0YWJsZSBlbnRyeS4KICogTmVlZGVkIHRvIG9idGFpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIGluIGdldGlmLgogKi8Kc3RhdGljIGludApOYW1lX2NtcCh2b2lkICppZnJwLCB2b2lkICplcCkKewogICAgc3RydWN0IHNvY2thZGRyX2luICpzID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKCgoc3RydWN0IGlmcmVxICopaWZycCktPmlmcl9hZGRyKTsKICAgIG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCAqRXAgPSAobWliMl9pcE5ldFRvTWVkaWFFbnRyeV90ICopZXA7CgogICAgaWYgKChzdHJuY21wKEVwLT5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fYnl0ZXMsCgkJICgoc3RydWN0IGlmcmVxICopaWZycCktPmlmcl9uYW1lLAoJCSBFcC0+aXBOZXRUb01lZGlhSWZJbmRleC5vX2xlbmd0aCkgPT0gMCkgJiYKCShzLT5zaW5fYWRkci5zX2FkZHIgPT0gRXAtPmlwTmV0VG9NZWRpYU5ldEFkZHJlc3MpKSB7CglyZXR1cm4gMDsKICAgIH0gZWxzZSB7CglyZXR1cm4gMTsKICAgIH0KfQoKLyoKICogVHJ5IHRvIGRldGVybWluZSB0aGUgaW5kZXggb2YgYSBwYXJ0aWN1bGFyIGludGVyZmFjZS4gSWYgbWZkLXJld3JpdGVzIGlzCiAqIHNwZWNpZmllZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBzeXN0ZW0gZG9lcyBub3QKICogaGF2ZSBpZl9uYW1ldG9pbmRleCgzU09DS0VUKS4KICovCmludApzb2xhcmlzMl9pZl9uYW1ldG9pbmRleChjb25zdCBjaGFyICpOYW1lLCBpbnQgTGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgaSwgc2QsIGxhc3RsZW4gPSAwLCBpbnRlcmZhY2VzID0gMDsKICAgIHN0cnVjdCBpZmNvbmYgICBpZmM7CiAgICBzdHJ1Y3QgaWZyZXEgICAqaWZycCA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAqYnVmID0gTlVMTDsKCiAgICBpZiAoTmFtZSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoKHNkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKgogICAgICogQ29wZSB3aXRoIGxvdHMgb2YgaW50ZXJmYWNlcyBhbmQgYnJva2VubmVzcyBvZiBpb2N0bCBTSU9DR0lGQ09ORgogICAgICogb24gc29tZSBwbGF0Zm9ybXM7IHNlZSBXLiBSLiBTdGV2ZW5zLCBgYFVuaXggTmV0d29yayBQcm9ncmFtbWluZwogICAgICogVm9sdW1lIEknJywgcC40MzUuICAKICAgICAqLwoKICAgIGZvciAoaSA9IDg7OyBpICs9IDgpIHsKICAgICAgICBidWYgPSBjYWxsb2MoaSwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpOwogICAgICAgIGlmIChidWYgPT0gTlVMTCkgewogICAgICAgICAgICBjbG9zZShzZCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZmMuaWZjX2xlbiA9IGkgKiBzaXplb2Yoc3RydWN0IGlmcmVxKTsKICAgICAgICBpZmMuaWZjX2J1ZiA9IChjYWRkcl90KSBidWY7CgogICAgICAgIGlmIChpb2N0bChzZCwgU0lPQ0dJRkNPTkYsIChjaGFyICopICZpZmMpIDwgMCkgewogICAgICAgICAgICBpZiAoZXJybm8gIT0gRUlOVkFMIHx8IGxhc3RsZW4gIT0gMCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFNvbWV0aGluZyBoYXMgZ29uZSBnZW51aW5lbHkgd3JvbmcuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogT3RoZXJ3aXNlLCBpdCBjb3VsZCBqdXN0IGJlIHRoYXQgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuICAKICAgICAgICAgICAgICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGlmYy5pZmNfbGVuID09IGxhc3RsZW4pIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUaGUgbGVuZ3RoIGlzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IHRpbWU7IHdlJ3JlIGRvbmUuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdGxlbiA9IGlmYy5pZmNfbGVuOwogICAgICAgIH0KICAgICAgICBmcmVlKGJ1Zik7CiAgICB9CgogICAgaWZycCA9IGlmYy5pZmNfcmVxOwogICAgaW50ZXJmYWNlcyA9IChpZmMuaWZjX2xlbiAvIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSArIDE7CgogICAgZm9yIChpID0gMTsgaSA8IGludGVyZmFjZXM7IGkrKywgaWZycCsrKSB7CiAgICAgICAgaWYgKHN0cm5jbXAoaWZycC0+aWZyX25hbWUsIE5hbWUsIExlbikgPT0gMCkgewogICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgfQoKICAgIGZyZWUoYnVmKTsKICAgIGNsb3NlKHNkKTsKICAgIHJldHVybiAwOwp9CgojaWZkZWYgX1NURENfQ09NUEFUCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgojZW5kaWYKCiNpZmRlZiBfR0VUS1NUQVRfVEVTVAoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpbnQgICAgICAgICAgICAgcmMgPSAwOwogICAgdV9sb25nICAgICAgICAgIHZhbCA9IDA7CgogICAgaWYgKGFyZ2MgIT0gMykgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVc2FnZTogJXMgc3RhdF9uYW1lIHZhcl9uYW1lXG4iLCBhcmd2WzBdKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIHNubXBfc2V0X2RvX2RlYnVnZ2luZygxKTsKICAgIHJjID0gZ2V0S3N0YXQoYXJndlsxXSwgYXJndlsyXSwgJnZhbCk7CgogICAgaWYgKHJjID09IDApCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzID0gJWx1XG4iLCBhcmd2WzJdLCB2YWwpOwogICAgZWxzZQogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJyYyA9JWRcbiIsIHJjKTsKICAgIHJldHVybiAwOwp9CiNlbmRpZiAvKl9HRVRLU1RBVF9URVNUICovCgojaWZkZWYgX0dFVE1JQlNUQVRfVEVTVAoKaW50CmlwMjBjb21wKHZvaWQgKmlmbmFtZSwgdm9pZCAqaXBwKQp7CiAgICByZXR1cm4gKHN0cm5jbXAoKGNoYXIgKikgaWZuYW1lLAogICAgICAgICAgICAgICAgICAgICgobWliMl9pcEFkZHJFbnRyeV90ICopIGlwcCktPmlwQWRFbnRJZkluZGV4Lm9fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgKChtaWIyX2lwQWRkckVudHJ5X3QgKikgaXBwKS0+aXBBZEVudElmSW5kZXguCiAgICAgICAgICAgICAgICAgICAgb19sZW5ndGgpKTsKfQoKaW50CkFSUF9DbXBfQWRkcih2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiQVJQOiAlbHggPD4gJWx4XG4iLAogICAgICAgICAgICAgICAgKChtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QgKikgZXApLT5pcE5ldFRvTWVkaWFOZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgKihJcEFkZHJlc3MgKikgYWRkcikpOwogICAgaWYgKCgobWliMl9pcE5ldFRvTWVkaWFFbnRyeV90ICopIGVwKS0+aXBOZXRUb01lZGlhTmV0QWRkcmVzcyA9PQogICAgICAgICooSXBBZGRyZXNzICopYWRkcikgewogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfQoKaW50CklGX2NtcCh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgaWYgKCgobWliMl9pZkVudHJ5X3QgKillcCktPmlmSW5kZXggPT0oKG1pYjJfaWZFbnRyeV90ICopYWRkciktPmlmSW5kZXgpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50ICAgICAgICAgICAgIHJjID0gMCwgaSwgaWR4OwogICAgbWliMl9pcEFkZHJFbnRyeV90IGlwYnVmLCAqaXBwID0gJmlwYnVmOwogICAgbWliMl9pcE5ldFRvTWVkaWFFbnRyeV90IGVudHJ5LCAqZXAgPSAmZW50cnk7CiAgICBtaWIyX2lmRW50cnlfdCAgaWZzdGF0OwogICAgcmVxX2UgICAgICAgICAgIHJlcV90eXBlOwogICAgSXBBZGRyZXNzICAgICAgIExhc3RBZGRyID0gMDsKCiAgICBpZiAoYXJnYyAhPSAzKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAiVXNhZ2U6ICVzIGlmX25hbWUgcmVxX3R5cGUgKDAgZmlyc3QsIDEgZXhhY3QsIDIgbmV4dCkgXG4iLAogICAgICAgICAgICAgICAgIGFyZ3ZbMF0pOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgc3dpdGNoIChhdG9pKGFyZ3ZbMl0pKSB7CiAgICBjYXNlIDA6CiAgICAgICAgcmVxX3R5cGUgPSBHRVRfRklSU1Q7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDE6CiAgICAgICAgcmVxX3R5cGUgPSBHRVRfRVhBQ1Q7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICAgICAgcmVxX3R5cGUgPSBHRVRfTkVYVDsKICAgICAgICBicmVhazsKICAgIH07CgogICAgc25tcF9zZXRfZG9fZGVidWdnaW5nKDApOwogICAgd2hpbGUgKChyYyA9CiAgICAgICAgICAgIGdldE1pYnN0YXQoTUlCX0lOVEVSRkFDRVMsICZpZnN0YXQsIHNpemVvZihtaWIyX2lmRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICAgICAgcmVxX3R5cGUsICZJRl9jbXAsICZpZHgpKSA9PSAwKSB7CiAgICAgICAgaWR4ID0gaWZzdGF0LmlmSW5kZXg7CiAgICAgICAgREVCVUdNU0dUTCgoImtlcm5lbF9zdW5vczUiLCAiSWZuYW1lID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgaWZzdGF0LmlmRGVzY3Iub19ieXRlcykpOwogICAgICAgIHJlcV90eXBlID0gR0VUX05FWFQ7CiAgICB9CiAgICByYyA9IGdldE1pYnN0YXQoTUlCX0lQX0FERFIsICZpcGJ1Ziwgc2l6ZW9mKG1pYjJfaXBBZGRyRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICAgcmVxX3R5cGUsIGlwMjBjb21wLCBhcmd2WzFdKTsKCiAgICBpZiAocmMgPT0gMCkKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJtdHUgPSAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgaXBwLT5pcEFkRW50SW5mby5hZV9tdHUpKTsKICAgIGVsc2UKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJyYyA9JWRcbiIsIHJjKSk7CgogICAgd2hpbGUgKChyYyA9CiAgICAgICAgICAgIGdldE1pYnN0YXQoTUlCX0lQX05FVCwgJmVudHJ5LAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QpLCByZXFfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAmQVJQX0NtcF9BZGRyLCAmTGFzdEFkZHIpKSA9PSAwKSB7CiAgICAgICAgTGFzdEFkZHIgPSBlcC0+aXBOZXRUb01lZGlhTmV0QWRkcmVzczsKICAgICAgICBERUJVR01TR1RMKCgia2VybmVsX3N1bm9zNSIsICJJcGFkZHIgPSAlbFhcbiIsICh1X2xvbmcpIExhc3RBZGRyKSk7CiAgICAgICAgcmVxX3R5cGUgPSBHRVRfTkVYVDsKICAgIH0KICAgIHJldHVybiAwOwp9CiNlbmRpZiAvKl9HRVRNSUJTVEFUX1RFU1QgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTVU5PUzUgKi8KCgovKi0KICogVGhlc2UgdmFyaWFibGVzIGRlc2NyaWJlIHRoZSBmb3JtYXR0aW5nIG9mIHRoaXMgZmlsZS4gIElmIHlvdSBkb24ndCBsaWtlIHRoZQogKiB0ZW1wbGF0ZSBkZWZhdWx0cywgZmVlbCBmcmVlIHRvIGNoYW5nZSB0aGVtIGhlcmUgKG5vdCBpbiB5b3VyIC5lbWFjcyBmaWxlKS4KICoKICogTG9jYWwgVmFyaWFibGVzOgogKiBjb21tZW50LWNvbHVtbjogMzIKICogYy1pbmRlbnQtbGV2ZWw6IDQKICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogNAogKiBjLWJyYWNlLW9mZnNldDogLTQKICogYy1hcmdkZWNsLWluZGVudDogMAogKiBjLWxhYmVsLW9mZnNldDogLTQKICogZmlsbC1jb2x1bW46IDc5CiAqIGZpbGwtcHJlZml4OiAiICogIgogKiBFbmQ6CiAqLwo=