ZGlmZiAtLWdpdCBhL3VuaXgvQUJPVVQtTkxTIGIvdW5peC9BQk9VVC1OTFMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTBjNjYuLjAwMDAwMDAKLS0tIGEvdW5peC9BQk9VVC1OTFMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotTm90ZXMgb24gdGhlIEZyZWUgVHJhbnNsYXRpb24gUHJvamVjdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1GcmVlIHNvZnR3YXJlIGlzIGdvaW5nIGludGVybmF0aW9uYWwhICBUaGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IGlzCi1hIHdheSB0byBnZXQgbWFpbnRhaW5lcnMgb2YgZnJlZSBzb2Z0d2FyZSwgdHJhbnNsYXRvcnMsIGFuZCB1c2VycyBhbGwKLXRvZ2V0aGVyLCBzbyB0aGF0IHdpbGwgZ3JhZHVhbGx5IGJlY29tZSBhYmxlIHRvIHNwZWFrIG1hbnkgbGFuZ3VhZ2VzLgotQSBmZXcgcGFja2FnZXMgYWxyZWFkeSBwcm92aWRlIHRyYW5zbGF0aW9ucyBmb3IgdGhlaXIgbWVzc2FnZXMuCi0KLSAgIElmIHlvdSBmb3VuZCB0aGlzIGBBQk9VVC1OTFMnIGZpbGUgaW5zaWRlIGEgZGlzdHJpYnV0aW9uLCB5b3UgbWF5Ci1hc3N1bWUgdGhhdCB0aGUgZGlzdHJpYnV0ZWQgcGFja2FnZSBkb2VzIHVzZSBHTlUgYGdldHRleHQnIGludGVybmFsbHksCi1pdHNlbGYgYXZhaWxhYmxlIGF0IHlvdXIgbmVhcmVzdCBHTlUgYXJjaGl2ZSBzaXRlLiAgQnV0IHlvdSBkbyBfbm90XwotbmVlZCB0byBpbnN0YWxsIEdOVSBgZ2V0dGV4dCcgcHJpb3IgdG8gY29uZmlndXJpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcKLXRoaXMgcGFja2FnZSB3aXRoIG1lc3NhZ2VzIHRyYW5zbGF0ZWQuCi0KLSAgIEluc3RhbGxlcnMgd2lsbCBmaW5kIGhlcmUgc29tZSB1c2VmdWwgaGludHMuICBUaGVzZSBub3RlcyBhbHNvCi1leHBsYWluIGhvdyB1c2VycyBzaG91bGQgcHJvY2VlZCBmb3IgZ2V0dGluZyB0aGUgcHJvZ3JhbXMgdG8gdXNlIHRoZQotYXZhaWxhYmxlIHRyYW5zbGF0aW9ucy4gIFRoZXkgdGVsbCBob3cgcGVvcGxlIHdhbnRpbmcgdG8gY29udHJpYnV0ZSBhbmQKLXdvcmsgYXQgdHJhbnNsYXRpb25zIHNob3VsZCBjb250YWN0IHRoZSBhcHByb3ByaWF0ZSB0ZWFtLgotCi0gICBXaGVuIHJlcG9ydGluZyBidWdzIGluIHRoZSBgaW50bC8nIGRpcmVjdG9yeSBvciBidWdzIHdoaWNoIG1heSBiZQotcmVsYXRlZCB0byBpbnRlcm5hdGlvbmFsaXphdGlvbiwgeW91IHNob3VsZCB0ZWxsIGFib3V0IHRoZSB2ZXJzaW9uIG9mCi1gZ2V0dGV4dCcgd2hpY2ggaXMgdXNlZC4gIFRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCi1gaW50bC9WRVJTSU9OJyBmaWxlLCBpbiBpbnRlcm5hdGlvbmFsaXplZCBwYWNrYWdlcy4KLQotUXVpY2sgY29uZmlndXJhdGlvbiBhZHZpY2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdSB3YW50IHRvIGV4cGxvaXQgdGhlIGZ1bGwgcG93ZXIgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIHlvdQotc2hvdWxkIGNvbmZpZ3VyZSBpdCB1c2luZwotCi0gICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Ci0KLXRvIGZvcmNlIHVzYWdlIG9mIGludGVybmF0aW9uYWxpemluZyByb3V0aW5lcyBwcm92aWRlZCB3aXRoaW4gdGhpcwotcGFja2FnZSwgZGVzcGl0ZSB0aGUgZXhpc3RlbmNlIG9mIGludGVybmF0aW9uYWxpemluZyBjYXBhYmlsaXRpZXMgaW4gdGhlCi1vcGVyYXRpbmcgc3lzdGVtIHdoZXJlIHRoaXMgcGFja2FnZSBpcyBiZWluZyBpbnN0YWxsZWQuICBTbyBmYXIsIG9ubHkKLXRoZSBgZ2V0dGV4dCcgaW1wbGVtZW50YXRpb24gaW4gdGhlIEdOVSBDIGxpYnJhcnkgdmVyc2lvbiAyIHByb3ZpZGVzIGFzCi1tYW55IGZlYXR1cmVzIChzdWNoIGFzIGxvY2FsZSBhbGlhcywgbWVzc2FnZSBpbmhlcml0YW5jZSwgYXV0b21hdGljCi1jaGFyc2V0IGNvbnZlcnNpb24gb3IgcGx1cmFsIGZvcm0gaGFuZGxpbmcpIGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotSXQgaXMgYWxzbyBub3QgcG9zc2libGUgdG8gb2ZmZXIgdGhpcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgb24gdG9wCi1vZiBhIGBjYXRnZXRzJyBpbXBsZW1lbnRhdGlvbi4gIEZ1dHVyZSB2ZXJzaW9ucyBvZiBHTlUgYGdldHRleHQnIHdpbGwKLXZlcnkgbGlrZWx5IGNvbnZleSBldmVuIG1vcmUgZnVuY3Rpb25hbGl0eS4gIFNvIGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhCi10byBjaGFuZ2UgdG8gR05VIGBnZXR0ZXh0JyBhcyBzb29uIGFzIHBvc3NpYmxlLgotCi0gICBTbyB5b3UgbmVlZCBfbm90XyBwcm92aWRlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgdXNpbmcgR05VIGxpYmMgMiBvcgoteW91IGhhdmUgaW5zdGFsbGVkIGEgcmVjZW50IGNvcHkgb2YgdGhlIEdOVSBnZXR0ZXh0IHBhY2thZ2Ugd2l0aCB0aGUKLWluY2x1ZGVkIGBsaWJpbnRsJy4KLQotSU5TVEFMTCBNYXR0ZXJzCi09PT09PT09PT09PT09PT0KLQotU29tZSBwYWNrYWdlcyBhcmUgImxvY2FsaXphYmxlIiB3aGVuIHByb3Blcmx5IGluc3RhbGxlZDsgdGhlIHByb2dyYW1zCi10aGV5IGNvbnRhaW4gY2FuIGJlIG1hZGUgdG8gc3BlYWsgeW91ciBvd24gbmF0aXZlIGxhbmd1YWdlLiAgTW9zdCBzdWNoCi1wYWNrYWdlcyB1c2UgR05VIGBnZXR0ZXh0Jy4gIE90aGVyIHBhY2thZ2VzIGhhdmUgdGhlaXIgb3duIHdheXMgdG8KLWludGVybmF0aW9uYWxpemF0aW9uLCBwcmVkYXRpbmcgR05VIGBnZXR0ZXh0Jy4KLQotICAgQnkgZGVmYXVsdCwgdGhpcyBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkIHRvIGFsbG93IHRyYW5zbGF0aW9uIG9mCi1tZXNzYWdlcy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0aGUgc3lzdGVtIGFscmVhZHkKLXByb3ZpZGVzIHRoZSBHTlUgYGdldHRleHQnIGZ1bmN0aW9ucy4gIElmIG5vdCwgdGhlIEdOVSBgZ2V0dGV4dCcgb3duCi1saWJyYXJ5IHdpbGwgYmUgdXNlZC4gIFRoaXMgbGlicmFyeSBpcyB3aG9sbHkgY29udGFpbmVkIHdpdGhpbiB0aGlzCi1wYWNrYWdlLCB1c3VhbGx5IGluIHRoZSBgaW50bC8nIHN1YmRpcmVjdG9yeSwgc28gcHJpb3IgaW5zdGFsbGF0aW9uIG9mCi10aGUgR05VIGBnZXR0ZXh0JyBwYWNrYWdlIGlzIF9ub3RfIHJlcXVpcmVkLiAgSW5zdGFsbGVycyBtYXkgdXNlCi1zcGVjaWFsIG9wdGlvbnMgYXQgY29uZmlndXJhdGlvbiB0aW1lIGZvciBjaGFuZ2luZyB0aGUgZGVmYXVsdAotYmVoYXZpb3VyLiAgVGhlIGNvbW1hbmRzOgotCi0gICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Ci0gICAgIC4vY29uZmlndXJlIC0tZGlzYWJsZS1ubHMKLQotd2lsbCByZXNwZWN0aXZlbHkgYnlwYXNzIGFueSBwcmUtZXhpc3RpbmcgYGdldHRleHQnIHRvIHVzZSB0aGUKLWludGVybmF0aW9uYWxpemluZyByb3V0aW5lcyBwcm92aWRlZCB3aXRoaW4gdGhpcyBwYWNrYWdlLCBvciBlbHNlLAotX3RvdGFsbHlfIGRpc2FibGUgdHJhbnNsYXRpb24gb2YgbWVzc2FnZXMuCi0KLSAgIFdoZW4geW91IGFscmVhZHkgaGF2ZSBHTlUgYGdldHRleHQnIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbSBhbmQgcnVuCi1jb25maWd1cmUgd2l0aG91dCBhbiBvcHRpb24gZm9yIHlvdXIgbmV3IHBhY2thZ2UsIGBjb25maWd1cmUnIHdpbGwKLXByb2JhYmx5IGRldGVjdCB0aGUgcHJldmlvdXNseSBidWlsdCBhbmQgaW5zdGFsbGVkIGBsaWJpbnRsLmEnIGZpbGUgYW5kCi13aWxsIGRlY2lkZSB0byB1c2UgdGhpcy4gIFRoaXMgbWlnaHQgYmUgbm90IHdoYXQgaXMgZGVzaXJhYmxlLiAgWW91Ci1zaG91bGQgdXNlIHRoZSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBHTlUgYGdldHRleHQnIGxpYnJhcnkuICBJLmUuCi1pZiB0aGUgZmlsZSBgaW50bC9WRVJTSU9OJyBzaG93cyB0aGF0IHRoZSBsaWJyYXJ5IHdoaWNoIGNvbWVzIHdpdGggdGhpcwotcGFja2FnZSBpcyBtb3JlIHJlY2VudCwgeW91IHNob3VsZCB1c2UKLQotICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dAotCi10byBwcmV2ZW50IGF1dG8tZGV0ZWN0aW9uLgotCi0gICBUaGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIHdpbGwgbm90IHRlc3QgZm9yIHRoZSBgY2F0Z2V0cycgZnVuY3Rpb24KLWFuZCB0aGVyZWZvcmUgaXQgd2lsbCBub3QgYmUgdXNlZC4gIFRoZSByZWFzb24gaXMgdGhhdCBldmVuIGFuCi1lbXVsYXRpb24gb2YgYGdldHRleHQnIG9uIHRvcCBvZiBgY2F0Z2V0cycgY291bGQgbm90IHByb3ZpZGUgYWxsIHRoZQotZXh0ZW5zaW9ucyBvZiB0aGUgR05VIGBnZXR0ZXh0JyBsaWJyYXJ5LgotCi0gICBJbnRlcm5hdGlvbmFsaXplZCBwYWNrYWdlcyBoYXZlIHVzdWFsbHkgbWFueSBgcG8vTEwucG8nIGZpbGVzLCB3aGVyZQotTEwgZ2l2ZXMgYW4gSVNPIDYzOSB0d28tbGV0dGVyIGNvZGUgaWRlbnRpZnlpbmcgdGhlIGxhbmd1YWdlLiAgVW5sZXNzCi10cmFuc2xhdGlvbnMgaGF2ZSBiZWVuIGZvcmJpZGRlbiBhdCBgY29uZmlndXJlJyB0aW1lIGJ5IHVzaW5nIHRoZQotYC0tZGlzYWJsZS1ubHMnIHN3aXRjaCwgYWxsIGF2YWlsYWJsZSB0cmFuc2xhdGlvbnMgYXJlIGluc3RhbGxlZAotdG9nZXRoZXIgd2l0aCB0aGUgcGFja2FnZS4gIEhvd2V2ZXIsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgTElOR1VBUycKLW1heSBiZSBzZXQsIHByaW9yIHRvIGNvbmZpZ3VyYXRpb24sIHRvIGxpbWl0IHRoZSBpbnN0YWxsZWQgc2V0LgotYExJTkdVQVMnIHNob3VsZCB0aGVuIGNvbnRhaW4gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0d28tbGV0dGVyCi1jb2Rlcywgc3RhdGluZyB3aGljaCBsYW5ndWFnZXMgYXJlIGFsbG93ZWQuCi0KLVVzaW5nIFRoaXMgUGFja2FnZQotPT09PT09PT09PT09PT09PT09Ci0KLUFzIGEgdXNlciwgaWYgeW91ciBsYW5ndWFnZSBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcGFja2FnZSwgeW91Ci1vbmx5IGhhdmUgdG8gc2V0IHRoZSBgTEFORycgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlCi1gTExfQ0MnIGNvbWJpbmF0aW9uLiAgSGVyZSBgTEwnIGlzIGFuIElTTyA2MzkgdHdvLWxldHRlciBsYW5ndWFnZSBjb2RlLAotYW5kIGBDQycgaXMgYW4gSVNPIDMxNjYgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUuICBGb3IgZXhhbXBsZSwgbGV0J3MKLXN1cHBvc2UgdGhhdCB5b3Ugc3BlYWsgR2VybWFuIGFuZCBsaXZlIGluIEdlcm1hbnkuICBBdCB0aGUgc2hlbGwKLXByb21wdCwgbWVyZWx5IGV4ZWN1dGUgYHNldGVudiBMQU5HIGRlX0RFJyAoaW4gYGNzaCcpLAotYGV4cG9ydCBMQU5HOyBMQU5HPWRlX0RFJyAoaW4gYHNoJykgb3IgYGV4cG9ydCBMQU5HPWRlX0RFJyAoaW4gYGJhc2gnKS4KLVRoaXMgY2FuIGJlIGRvbmUgZnJvbSB5b3VyIGAubG9naW4nIG9yIGAucHJvZmlsZScgZmlsZSwgb25jZSBhbmQgZm9yCi1hbGwuCi0KLSAgIFlvdSBtaWdodCB0aGluayB0aGF0IHRoZSBjb3VudHJ5IGNvZGUgc3BlY2lmaWNhdGlvbiBpcyByZWR1bmRhbnQuCi1CdXQgaW4gZmFjdCwgc29tZSBsYW5ndWFnZXMgaGF2ZSBkaWFsZWN0cyBpbiBkaWZmZXJlbnQgY291bnRyaWVzLiAgRm9yCi1leGFtcGxlLCBgZGVfQVQnIGlzIHVzZWQgZm9yIEF1c3RyaWEsIGFuZCBgcHRfQlInIGZvciBCcmF6aWwuICBUaGUKLWNvdW50cnkgY29kZSBzZXJ2ZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGRpYWxlY3RzLgotCi0gICBUaGUgbG9jYWxlIG5hbWluZyBjb252ZW50aW9uIG9mIGBMTF9DQycsIHdpdGggYExMJyBkZW5vdGluZyB0aGUKLWxhbmd1YWdlIGFuZCBgQ0MnIGRlbm90aW5nIHRoZSBjb3VudHJ5LCBpcyB0aGUgb25lIHVzZSBvbiBzeXN0ZW1zIGJhc2VkCi1vbiBHTlUgbGliYy4gIE9uIG90aGVyIHN5c3RlbXMsIHNvbWUgdmFyaWF0aW9ucyBvZiB0aGlzIHNjaGVtZSBhcmUKLXVzZWQsIHN1Y2ggYXMgYExMJyBvciBgTExfQ0MuRU5DT0RJTkcnLiAgWW91IGNhbiBnZXQgdGhlIGxpc3Qgb2YKLWxvY2FsZXMgc3VwcG9ydGVkIGJ5IHlvdXIgc3lzdGVtIGZvciB5b3VyIGNvdW50cnkgYnkgcnVubmluZyB0aGUgY29tbWFuZAotYGxvY2FsZSAtYSB8IGdyZXAgJ15MTCcnLgotCi0gICBOb3QgYWxsIHByb2dyYW1zIGhhdmUgdHJhbnNsYXRpb25zIGZvciBhbGwgbGFuZ3VhZ2VzLiAgQnkgZGVmYXVsdCwgYW4KLUVuZ2xpc2ggbWVzc2FnZSBpcyBzaG93biBpbiBwbGFjZSBvZiBhIG5vbmV4aXN0ZW50IHRyYW5zbGF0aW9uLiAgSWYgeW91Ci11bmRlcnN0YW5kIG90aGVyIGxhbmd1YWdlcywgeW91IGNhbiBzZXQgdXAgYSBwcmlvcml0eSBsaXN0IG9mIGxhbmd1YWdlcy4KLVRoaXMgaXMgZG9uZSB0aHJvdWdoIGEgZGlmZmVyZW50IGVudmlyb25tZW50IHZhcmlhYmxlLCBjYWxsZWQKLWBMQU5HVUFHRScuICBHTlUgYGdldHRleHQnIGdpdmVzIHByZWZlcmVuY2UgdG8gYExBTkdVQUdFJyBvdmVyIGBMQU5HJwotZm9yIHRoZSBwdXJwb3NlIG9mIG1lc3NhZ2UgaGFuZGxpbmcsIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0byBoYXZlIGBMQU5HJwotc2V0IHRvIHRoZSBwcmltYXJ5IGxhbmd1YWdlOyB0aGlzIGlzIHJlcXVpcmVkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZQotc3lzdGVtIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBzb21lIFN3ZWRpc2ggdXNlcnMgd2hvIHdvdWxkIHJhdGhlcgotcmVhZCB0cmFuc2xhdGlvbnMgaW4gR2VybWFuIHRoYW4gRW5nbGlzaCBmb3Igd2hlbiBTd2VkaXNoIGlzIG5vdAotYXZhaWxhYmxlLCBzZXQgYExBTkdVQUdFJyB0byBgc3Y6ZGUnIHdoaWxlIGxlYXZpbmcgYExBTkcnIHRvIGBzdl9TRScuCi0KLSAgIFNwZWNpYWwgYWR2aWNlIGZvciBOb3J3ZWdpYW4gdXNlcnM6IFRoZSBsYW5ndWFnZSBjb2RlIGZvciBOb3J3ZWdpYW4KLWJva21hKmwgY2hhbmdlZCBmcm9tIGBubycgdG8gYG5iJyByZWNlbnRseSAoaW4gMjAwMykuICBEdXJpbmcgdGhlCi10cmFuc2l0aW9uIHBlcmlvZCwgd2hpbGUgc29tZSBtZXNzYWdlIGNhdGFsb2dzIGZvciB0aGlzIGxhbmd1YWdlIGFyZQotaW5zdGFsbGVkIHVuZGVyIGBuYicgYW5kIHNvbWUgb2xkZXIgb25lcyB1bmRlciBgbm8nLCBpdCdzIHJlY29tbWVuZGVkCi1mb3IgTm9yd2VnaWFuIHVzZXJzIHRvIHNldCBgTEFOR1VBR0UnIHRvIGBuYjpubycgc28gdGhhdCBib3RoIG5ld2VyIGFuZAotb2xkZXIgdHJhbnNsYXRpb25zIGFyZSB1c2VkLgotCi0gICBJbiB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYnV0IG5vdCBpbiB0aGUgYExBTkcnCi1lbnZpcm9ubWVudCB2YXJpYWJsZSwgYExMX0NDJyBjb21iaW5hdGlvbnMgY2FuIGJlIGFiYnJldmlhdGVkIGFzIGBMTCcKLXRvIGRlbm90ZSB0aGUgbGFuZ3VhZ2UncyBtYWluIGRpYWxlY3QuICBGb3IgZXhhbXBsZSwgYGRlJyBpcyBlcXVpdmFsZW50Ci10byBgZGVfREUnIChHZXJtYW4gYXMgc3Bva2VuIGluIEdlcm1hbnkpLCBhbmQgYHB0JyB0byBgcHRfUFQnCi0oUG9ydHVndWVzZSBhcyBzcG9rZW4gaW4gUG9ydHVnYWwpIGluIHRoaXMgY29udGV4dC4KLQotVHJhbnNsYXRpbmcgVGVhbXMKLT09PT09PT09PT09PT09PT09Ci0KLUZvciB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IHRvIGJlIGEgc3VjY2Vzcywgd2UgbmVlZCBpbnRlcmVzdGVkCi1wZW9wbGUgd2hvIGxpa2UgdGhlaXIgb3duIGxhbmd1YWdlIGFuZCB3cml0ZSBpdCB3ZWxsLCBhbmQgd2hvIGFyZSBhbHNvCi1hYmxlIHRvIHN5bmVyZ2l6ZSB3aXRoIG90aGVyIHRyYW5zbGF0b3JzIHNwZWFraW5nIHRoZSBzYW1lIGxhbmd1YWdlLgotRWFjaCB0cmFuc2xhdGlvbiB0ZWFtIGhhcyBpdHMgb3duIG1haWxpbmcgbGlzdC4gIFRoZSB1cC10by1kYXRlIGxpc3Qgb2YKLXRlYW1zIGNhbiBiZSBmb3VuZCBhdCB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0J3MgaG9tZXBhZ2UsCi1gaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL2NvbnRyaWIvcG8vSFRNTC8nLCBpbiB0aGUgIk5hdGlvbmFsIHRlYW1zIgotYXJlYS4KLQotICAgSWYgeW91J2QgbGlrZSB0byB2b2x1bnRlZXIgdG8gX3dvcmtfIGF0IHRyYW5zbGF0aW5nIG1lc3NhZ2VzLCB5b3UKLXNob3VsZCBiZWNvbWUgYSBtZW1iZXIgb2YgdGhlIHRyYW5zbGF0aW5nIHRlYW0gZm9yIHlvdXIgb3duIGxhbmd1YWdlLgotVGhlIHN1YnNjcmliaW5nIGFkZHJlc3MgaXMgX25vdF8gdGhlIHNhbWUgYXMgdGhlIGxpc3QgaXRzZWxmLCBpdCBoYXMKLWAtcmVxdWVzdCcgYXBwZW5kZWQuICBGb3IgZXhhbXBsZSwgc3BlYWtlcnMgb2YgU3dlZGlzaCBjYW4gc2VuZCBhCi1tZXNzYWdlIHRvIGBzdi1yZXF1ZXN0QGxpLm9yZycsIGhhdmluZyB0aGlzIG1lc3NhZ2UgYm9keToKLQotICAgICBzdWJzY3JpYmUKLQotICAgS2VlcCBpbiBtaW5kIHRoYXQgdGVhbSBtZW1iZXJzIGFyZSBleHBlY3RlZCB0byBwYXJ0aWNpcGF0ZQotX2FjdGl2ZWx5XyBpbiB0cmFuc2xhdGlvbnMsIG9yIGF0IHNvbHZpbmcgdHJhbnNsYXRpb25hbCBkaWZmaWN1bHRpZXMsCi1yYXRoZXIgdGhhbiBtZXJlbHkgbHVya2luZyBhcm91bmQuICBJZiB5b3VyIHRlYW0gZG9lcyBub3QgZXhpc3QgeWV0IGFuZAoteW91IHdhbnQgdG8gc3RhcnQgb25lLCBvciBpZiB5b3UgYXJlIHVuc3VyZSBhYm91dCB3aGF0IHRvIGRvIG9yIGhvdyB0bwotZ2V0IHN0YXJ0ZWQsIHBsZWFzZSB3cml0ZSB0byBgdHJhbnNsYXRpb25AaXJvLnVtb250cmVhbC5jYScgdG8gcmVhY2ggdGhlCi1jb29yZGluYXRvciBmb3IgYWxsIHRyYW5zbGF0b3IgdGVhbXMuCi0KLSAgIFRoZSBFbmdsaXNoIHRlYW0gaXMgc3BlY2lhbC4gIEl0IHdvcmtzIGF0IGltcHJvdmluZyBhbmQgdW5pZm9ybWl6aW5nCi10aGUgdGVybWlub2xvZ3kgaW4gdXNlLiAgUHJvdmVuIGxpbmd1aXN0aWMgc2tpbGwgYXJlIHByYWlzZWQgbW9yZSB0aGFuCi1wcm9ncmFtbWluZyBza2lsbCwgaGVyZS4KLQotQXZhaWxhYmxlIFBhY2thZ2VzCi09PT09PT09PT09PT09PT09PT0KLQotTGFuZ3VhZ2VzIGFyZSBub3QgZXF1YWxseSBzdXBwb3J0ZWQgaW4gYWxsIHBhY2thZ2VzLiAgVGhlIGZvbGxvd2luZwotbWF0cml4IHNob3dzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCBhcyBvZiBKYW51YXJ5Ci0yMDA0LiAgVGhlIG1hdHJpeCBzaG93cywgaW4gcmVnYXJkIG9mIGVhY2ggcGFja2FnZSwgZm9yIHdoaWNoIGxhbmd1YWdlcwotUE8gZmlsZXMgaGF2ZSBiZWVuIHN1Ym1pdHRlZCB0byB0cmFuc2xhdGlvbiBjb29yZGluYXRpb24sIHdpdGggYQotdHJhbnNsYXRpb24gcGVyY2VudGFnZSBvZiBhdCBsZWFzdCA1MCUuCi0KLSAgICAgUmVhZHkgUE8gZmlsZXMgICAgICAgYWYgYW0gYXIgYXogYmUgYmcgYnMgY2EgY3MgZGEgZGUgZWwgZW4gZW5fR0IgZW8gZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgfAotICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSB8Ci0gICAgIGJhdGNoZWxvciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gfAotICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdIHwKLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZGFya3N0YXQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgW10gfAotICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8Ci0gICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgIFtdICAgICAgICAgfAotICAgICBlcnJvciAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgW10gICAgICBbXSB8Ci0gICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKLSAgICAgZmlsZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAotICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8Ci0gICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZ2JpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZ2V0dGV4dCAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAotICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGdldHRleHQtcnVudGltZSAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgW10gfAotICAgICBnaW1wLXByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICAgW10gICAgICBbXSB8Ci0gICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgfAotICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICgpICAgICAgICBbXSAgICAgIFtdIHwKLSAgICAgZ251Y2FzaC1nbG9zc2FyeSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgICAgICAgICAgICAgW10gfAotICAgICBnbnVwZyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICBbXSBbXSAgICAgICAgICBbXSBbXSB8Ci0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtbG9naW4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS10YXNrbWFuYWdlciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS10b2RvICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgW10gfAotICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICgpICAgICAgICAgICgpIHwKLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSB8Ci0gICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgfAotICAgICBoZWxsbyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8Ci0gICAgIGlkLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgaW5kZW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgW10gW10gfAotICAgICBpc29fMzE2NiAgICAgICAgICAgfCAgICAgICAgICBbXSAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8Ci0gICAgIGlzb18zMTY2XzEgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKLSAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fMzE2Nl8zICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGlzb180MjE3ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGp0YWcgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICBbXSB8Ci0gICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gfAotICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSBbXSAgICAgICAgICAgICBbXSB8Ci0gICAgIGxpYmdwZXdpZGdldCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGliaWNvbnYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgW10gW10gfAotICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaW5nb3RlYWNoX2xlc3NvbnMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAoKSB8Ci0gICAgIGx5bnggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgICAgfAotICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gKCkgW10gW10gICAgICAgICAgICAgICAgKCkgfAotICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIG15c2VjcmV0ZGlhcnkgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gKCkgW10gW10gICAgICAgICAgICAgICAgW10gfAotICAgICBuYW5vXzFfMCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAoKSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgICAgW10gfAotICAgICBwdHggICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSB8Ci0gICAgIHB5dGhvbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8Ci0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgIFtdIFtdIHwKLSAgICAgc2gtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAotICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNoYXJ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKLSAgICAgc2lsa3kgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgfAotICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIHNrZXRjaCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAotICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHRhciAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgfAotICAgICB0ZXh0dXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIHRpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAoKSAgICAgICAgIHwKLSAgICAgdHAtcm9ib3QgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB0dXhwYWludCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSBbXSAgICAgW10gICAgICBbXSB8Ci0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgfAotICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIHdnZXQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gfAotICAgICB4ZnJlZTg2X3hrYl94bWwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICBhZiBhbSBhciBheiBiZSBiZyBicyBjYSBjcyBkYSBkZSBlbCBlbiBlbl9HQiBlbyBlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgMCAgMCAgMSAgOSAgNCAgMSA0MCA0MSA2MCA3OCAxNyAgMSAgIDUgICAxMyA2OAotICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXQgZXUgZmEgZmkgZnIgZ2EgZ2wgaGUgaHIgaHUgaWQgaXMgaXQgamEga28gbGcKLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICBhMnBzICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAoKSAgICAoKSAgICB8Ci0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGJhdGNoZWxvciAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIGJpc29uICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIHwKLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgW10gW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBjb3JldXRpbHMgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0gICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgIFtdICAgIHwKLSAgICAgZGFya3N0YXQgICAgICAgICAgIHwgICAgICAgICAgICAgKCkgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgICB8Ci0gICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgfAotICAgICBlcnJvciAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKLSAgICAgZmlsZXV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgfAotICAgICBmaW5kdXRpbHMgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSBbXSAgICBbXSBbXSBbXSAgICBbXSBbXSBbXSAgICB8Ci0gICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgIHwKLSAgICAgZ2JpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2V0dGV4dCAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgfAotICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIGdldHRleHQtcnVudGltZSAgICB8ICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgIHwKLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgfAotICAgICBnaW1wLXByaW50ICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgW10gICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLSAgICAgZ251Y2FzaC1nbG9zc2FyeSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotICAgICBnbnVwZyAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSAgICBbXSAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICB8Ci0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtbG9naW4gICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS10YXNrbWFuYWdlciAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS10b2RvICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgfAotICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICgpICgpICAgICAgIHwKLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncmVwICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgICBbXSBbXSAgICAgICB8Ci0gICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKLSAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBoZWxsbyAgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgICBbXSBbXSBbXSAgICB8Ci0gICAgIGlkLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgIFtdICAgICAgICAgIHwKLSAgICAgaW5kZW50ICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgICAgW10gW10gICAgW10gW10gICAgICAgfAotICAgICBpc29fMzE2NiAgICAgICAgICAgfCAgICBbXSAgICAgICBbXSBbXSAgICAgICBbXSBbXSBbXSAgICBbXSAgICAgICAgICB8Ci0gICAgIGlzb18zMTY2XzEgICAgICAgICB8ICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fMzE2Nl8zICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGlzb180MjE3ICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgIHwKLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICB8Ci0gICAgIGp0YWcgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgICAgfAotICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSBbXSAgICB8Ci0gICAgIGxpYmdwZXdpZGdldCAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgbGliaWNvbnYgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgW10gW10gW10gICAgW10gICAgICAgICAgfAotICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBsaW5nb3RlYWNoX2xlc3NvbnMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGx5bnggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgIHwKLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgICAgW10gICAgICAgfAotICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgICAgIFtdIFtdICAgIHwKLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgKCkgICAgICAgfAotICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIG15c2VjcmV0ZGlhcnkgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gICAgICAgICAgfAotICAgICBuYW5vXzFfMCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICAgICB8Ci0gICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgfAotICAgICBwdHggICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIHB5dGhvbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICBbXSBbXSAgICBbXSAgICAgICAgICB8Ci0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKLSAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgIHwKLSAgICAgc2gtdXRpbHMgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgfAotICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNoYXJ1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgIFtdICAgICAgIHwKLSAgICAgc2lsa3kgICAgICAgICAgICAgIHwgICAgICAgICAgKCkgW10gICAgICAgICAgICAgKCkgICAgICAgKCkgICAgICAgICAgfAotICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNrZXRjaCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAotICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICB8Ci0gICAgIHRhciAgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdICAgIFtdICAgIFtdIFtdIFtdICAgIFtdIFtdICAgICAgIHwKLSAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgfAotICAgICB0ZXh0dXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICBbXSAgICAgICAgICBbXSBbXSAgICB8Ci0gICAgIHRpbiAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgdHAtcm9ib3QgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB0dXhwYWludCAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICBbXSBbXSBbXSBbXSBbXSBbXSAgICB8Ci0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAoKSBbXSAgICAgICB8Ci0gICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB3ZGlmZiAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSBbXSBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIHdnZXQgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdICAgIFtdICAgIFtdIFtdICAgICAgICAgIFtdICAgICAgIHwKLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB4ZnJlZTg2X3hrYl94bWwgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICBldCBldSBmYSBmaSBmciBnYSBnbCBoZSBociBodSBpZCBpcyBpdCBqYSBrbyBsZwotICAgICAgICAgICAgICAgICAgICAgICAgICAyMiAgMiAgMSAyNiAxMDYgMjggMjQgIDggMTAgNDEgMzMgIDEgMjYgMzMgMTIgIDAKLSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGx0IGx2IG1rIG1uIG1zIG10IG5iIG5sIG5uIG5vIG5zbyBwbCBwdCBwdF9CUiBybyBydQotICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAoKSAgICAgKCkgICAgIFtdICAgW10gW10gfAotICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgKCkgKCkgfAotICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgKCkgICAgICAgICAgW10gICAgfAotICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgW10gW10gfAotICAgICBiYXRjaGVsb3IgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gW10gfAotICAgICBibHVlei1waW4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gICAgfAotICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBjb25zb2xlLXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gfAotICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBkYXJrc3RhdCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gICAgfAotICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBlbnNjcmlwdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gW10gfAotICAgICBlcnJvciAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gICAgfAotICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICgpICAgICAgW10gfAotICAgICBmaWxldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gICAgfAotICAgICBnYmlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnY2MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnZXR0ZXh0ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gICAgfAotICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBnZXR0ZXh0LXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgfAotICAgICBnaW1wLXByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gICAgfAotICAgICBnbHVuYXJjbG9jayAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gW10gfAotICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnbnVjYXNoICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICgpICAgICAgW10gfAotICAgICBnbnVjYXNoLWdsb3NzYXJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgICAgICAgfAotICAgICBnbnVwZyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBncGUtYWVyaWFsICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtY2xvY2sgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtZWRpdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtZ28gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gW10gfAotICAgICBncGUtbG9naW4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtc2tldGNoYm9vayAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtdGFza21hbmFnZXIgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtdGltZXNoZWV0ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gW10gfAotICAgICBncGhvdG8yICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgW10gICAgfAotICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAoKSAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBncmFtYWRvaXIgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gIFtdICAgW10gW10gfAotICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gW10gfAotICAgICBoZWxsbyAgICAgICAgICAgICAgfCAgICBbXSAgICAgICBbXSAgICBbXSBbXSBbXSBbXSAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBpZC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gW10gfAotICAgICBpbmRlbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gW10gfAotICAgICBpc29fMzE2NiAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fMzE2Nl8xICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fMzE2Nl8zICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fNDIxNyAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSBbXSAgICAgW10gW10gIFtdICAgICAgW10gfAotICAgICBpc29fNjM5ICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBqd2hvaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gKCkgfAotICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gICAgfAotICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgW10gICAgIFtdICAgICAgICAgfAotICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgW10gICAgfAotICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaW5nb3RlYWNoX2xlc3NvbnMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgW10gfAotICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgIFtdICAgICAgW10gfAotICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBteXNlY3JldGRpYXJ5ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgW10gICAgfAotICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBuYW5vXzFfMCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBvcGNvZGVzICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgW10gW10gIFtdICAgICAgICAgfAotICAgICBwdHggICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICAgW10gW10gIFtdICAgW10gW10gfAotICAgICBweXRob24gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gfAotICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICBycG0gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgW10gfAotICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICBzZWQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gICAgfAotICAgICBzaC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzaGFydXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICBzaWxreSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgfAotICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgfAotICAgICBza2V0Y2ggICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgfAotICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB0YXIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgW10gICAgIFtdICAgW10gICAgfAotICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICB0ZXh0dXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB0cC1yb2JvdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB0dXhwYWludCAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgW10gW10gIFtdICAgW10gICAgfAotICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgIFtdICAgICAgW10gfAotICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gW10gfAotICAgICB3YXN0ZXNlZGdlICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgW10gICAgIFtdICAgW10gW10gfAotICAgICB3Z2V0ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gW10gfAotICAgICB4Y2hhdCAgICAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICB4ZnJlZTg2X3hrYl94bWwgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAotICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgW10gICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICBsdCBsdiBtayBtbiBtcyBtdCBuYiBubCBubiBubyBuc28gcGwgcHQgcHRfQlIgcm8gcnUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIDIgIDAgIDMgMTIgIDAgMTAgNjkgIDYgIDcgIDEgIDQwIDI2ICAzNiAgIDc2IDYzCi0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICBzayBzbCBzciBzdiB0YSB0aCB0ciB1ayB2ZW4gdmkgd2EgeGggemhfQ04gemhfVFcgenUKLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgW10gICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKLSAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLSAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLSAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgIDgKLSAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwgMTQKLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgY29yZXV0aWxzICAgICAgICAgIHwgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTYKLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTQKLSAgICAgZGFya3N0YXQgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAoKSAgICAgIHwgMTIKLSAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMjMKLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKLSAgICAgZXJyb3IgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTUKLSAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKLSAgICAgZmlsZXV0aWxzICAgICAgICAgIHwgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgIHwgMTcKLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMjkKLSAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTMKLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKLSAgICAgZ2JpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgZ2V0dGV4dCAgICAgICAgICAgIHwgW10gW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTYKLSAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgW10gICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTQKLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICBbXSAgICBbXSAgICAgIHwgMjIKLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTQKLSAgICAgZ2ltcC1wcmludCAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwgMTMKLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgIDkKLSAgICAgZ251Y2FzaC1nbG9zc2FyeSAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgIDgKLSAgICAgZ251cGcgICAgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTcKLSAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwgMTMKLSAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKLSAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTEKLSAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwgMTIKLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwgMTMKLSAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTMKLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLSAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTIKLSAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwgMTMKLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgIHwgMTIKLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTEKLSAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgICAgW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjYKLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgaGVsbG8gICAgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzQKLSAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKLSAgICAgaW5kZW50ICAgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjEKLSAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgIHwgMjcKLSAgICAgaXNvXzMxNjZfMSAgICAgICAgIHwgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKLSAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLSAgICAgaXNvXzMxNjZfMyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgW10gW10gICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMjQKLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKLSAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgIFtdICAgICAgICBbXSAgICBbXSAgICAgIHwgIDkKLSAgICAganRhZyAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgKCkgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTEKLSAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMjAKLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwgMTMKLSAgICAgbGliaWNvbnYgICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgIFtdICAgICBbXSAgICAgICAgICAgIHwgMjcKLSAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgbGluZ290ZWFjaF9sZXNzb25zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgIHwgIDAKLSAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTUKLSAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTYKLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgbWluaWNvbSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKLSAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAKLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTcKLSAgICAgbmFub18xXzAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTcKLSAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTUKLSAgICAgcHR4ICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjIKLSAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLSAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKLSAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLSAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgIDIKLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTUKLSAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKLSAgICAgc2gtdXRpbHMgICAgICAgICAgIHwgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKLSAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTcKLSAgICAgc2lsa3kgICAgICAgICAgICAgIHwgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgdGFyICAgICAgICAgICAgICAgIHwgW10gW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMjQKLSAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTQKLSAgICAgdGV4dHV0aWxzICAgICAgICAgIHwgICAgW10gICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTYKLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKLSAgICAgdHAtcm9ib3QgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgIHwgMjkKLSAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgdXRpbC1saW51eCAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTUKLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLSAgICAgd2RpZmYgICAgICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTgKLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICBbXSAgICBbXSAgICAgIHwgMjQKLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgW10gW10gW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTUKLSAgICAgeGZyZWU4Nl94a2JfeG1sICAgIHwgW10gICAgW10gICAgICAgICAgW10gW10gICAgICAgICAgICAgICBbXSAgICAgICAgICAgIHwgMTEKLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICA2MyB0ZWFtcyAgICAgICAgICAgc2sgc2wgc3Igc3YgdGEgdGggdHIgdWsgdmVuIHZpIHdhIHhoIHpoX0NOIHpoX1RXIHp1Ci0gICAgICAxMzEgZG9tYWlucyAgICAgICAgIDQ3IDE5IDI4IDgzICAwICAwIDU5IDEzICAxICAgMSAxMSAgMCAgMjIgICAgMjIgICAgMCAgMTM3MwotCi0gICBTb21lIGNvdW50ZXJzIGluIHRoZSBwcmVjZWRpbmcgbWF0cml4IGFyZSBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mCi12aXNpYmxlIGJsb2NrcyBsZXQgdXMgZXhwZWN0LiAgVGhpcyBpcyBiZWNhdXNlIGEgZmV3IGV4dHJhIFBPIGZpbGVzIGFyZQotdXNlZCBmb3IgaW1wbGVtZW50aW5nIHJlZ2lvbmFsIHZhcmlhbnRzIG9mIGxhbmd1YWdlcywgb3IgbGFuZ3VhZ2UKLWRpYWxlY3RzLgotCi0gICBGb3IgYSBQTyBmaWxlIGluIHRoZSBtYXRyaXggYWJvdmUgdG8gYmUgZWZmZWN0aXZlLCB0aGUgcGFja2FnZSB0bwotd2hpY2ggaXQgYXBwbGllcyBzaG91bGQgYWxzbyBoYXZlIGJlZW4gaW50ZXJuYXRpb25hbGl6ZWQgYW5kCi1kaXN0cmlidXRlZCBhcyBzdWNoIGJ5IGl0cyBtYWludGFpbmVyLiAgVGhlcmUgbWlnaHQgYmUgYW4gb2JzZXJ2YWJsZQotbGFnIGJldHdlZW4gdGhlIG1lcmUgZXhpc3RlbmNlIGEgUE8gZmlsZSBhbmQgaXRzIHdpZGUgYXZhaWxhYmlsaXR5IGluIGEKLWRpc3RyaWJ1dGlvbi4KLQotICAgSWYgSmFudWFyeSAyMDA0IHNlZW1zIHRvIGJlIG9sZCwgeW91IG1heSBmZXRjaCBhIG1vcmUgcmVjZW50IGNvcHkgb2YKLXRoaXMgYEFCT1VULU5MUycgZmlsZSBvbiBtb3N0IEdOVSBhcmNoaXZlIHNpdGVzLiAgVGhlIG1vc3QgdXAtdG8tZGF0ZQotbWF0cml4IHdpdGggZnVsbCBwZXJjZW50YWdlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGF0Ci1gaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL2NvbnRyaWIvcG8vSFRNTC9tYXRyaXguaHRtbCcuCi0KLVVzaW5nIGBnZXR0ZXh0JyBpbiBuZXcgcGFja2FnZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSWYgeW91IGFyZSB3cml0aW5nIGEgZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtIGFuZCB3YW50IHRvCi1pbnRlcm5hdGlvbmFsaXplIGl0IHlvdSBhcmUgd2VsY29tZSB0byB1c2UgR05VIGBnZXR0ZXh0JyBpbiB5b3VyCi1wYWNrYWdlLiAgT2YgY291cnNlIHlvdSBoYXZlIHRvIHJlc3BlY3QgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHdoaWNoIGNvdmVycyB0aGUgdXNlIG9mIHRoZSBHTlUgYGdldHRleHQnIGxpYnJhcnkuICBUaGlzIG1lYW5zCi1pbiBwYXJ0aWN1bGFyIHRoYXQgZXZlbiBub24tZnJlZSBwcm9ncmFtcyBjYW4gdXNlIGBsaWJpbnRsJyBhcyBhIHNoYXJlZAotbGlicmFyeSwgd2hlcmVhcyBvbmx5IGZyZWUgc29mdHdhcmUgY2FuIHVzZSBgbGliaW50bCcgYXMgYSBzdGF0aWMKLWxpYnJhcnkgb3IgdXNlIG1vZGlmaWVkIHZlcnNpb25zIG9mIGBsaWJpbnRsJy4KLQotICAgT25jZSB0aGUgc291cmNlcyBhcmUgY2hhbmdlZCBhcHByb3ByaWF0ZWx5IGFuZCB0aGUgc2V0dXAgY2FuIGhhbmRsZQotdGhlIHVzZSBvZiBgZ2V0dGV4dCcgdGhlIG9ubHkgdGhpbmcgbWlzc2luZyBhcmUgdGhlIHRyYW5zbGF0aW9ucy4gIFRoZQotRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IGlzIGFsc28gYXZhaWxhYmxlIGZvciBwYWNrYWdlcyB3aGljaCBhcmUgbm90Ci1kZXZlbG9wZWQgaW5zaWRlIHRoZSBHTlUgcHJvamVjdC4gIFRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gZ2l2ZW4gYWJvdmUKLWFwcGxpZXMgYWxzbyBmb3IgZXZlcnkgb3RoZXIgRnJlZSBTb2Z0d2FyZSBQcm9qZWN0LiAgQ29udGFjdAotYHRyYW5zbGF0aW9uQGlyby51bW9udHJlYWwuY2EnIHRvIG1ha2UgdGhlIGAucG90JyBmaWxlcyBhdmFpbGFibGUgdG8KLXRoZSB0cmFuc2xhdGlvbiB0ZWFtcy4KLQpkaWZmIC0tZ2l0IGEvdW5peC9ib290c3RyYXAgYi91bml4L2Jvb3RzdHJhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM5NzkxNC4uMDAwMDAwMAotLS0gYS91bml4L2Jvb3RzdHJhcAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyEvYmluL3NoCi1ybSAtcmYgYXV0b200dGUuY2FjaGUKLWF1dG9yZWNvbmYgLWkKZGlmZiAtLWdpdCBhL3VuaXgvY29uZmlnLmggYi91bml4L2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3VuaXgvY29uZmlnLmgKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdW5peC9jb25maWd1cmUuYWMgYi91bml4L2NvbmZpZ3VyZS5hYwppbmRleCA2MzFkM2NiLi5lZWRkMjY3IDEwMDY0NAotLS0gYS91bml4L2NvbmZpZ3VyZS5hYworKysgYi91bml4L2NvbmZpZ3VyZS5hYwpAQCAtMTY4LDYgKzE2OCw1IEBACiAgICAgICAgICB2bmN2aWV3ZXIvTWFrZWZpbGUKICAgICAgICAgIHZuY2NvbmZpZy9NYWtlZmlsZQogICAgICAgICAgdm5jcGFzc3dkL01ha2VmaWxlCi0gICAgICAgICBpbnRsL01ha2VmaWxlCiAgICAgICAgICBwby9NYWtlZmlsZS5pbgogKQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL0NoYW5nZUxvZyBiL3VuaXgvaW50bC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MTI5MTkuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotMjAwNC0wMS0yOSAgR05VICA8YnVnLWdudS1nZXR0ZXh0QGdudS5vcmc+Ci0KLQkqIFZlcnNpb24gMC4xNC4xIHJlbGVhc2VkLgotCmRpZmYgLS1naXQgYS91bml4L2ludGwvTWFrZWZpbGUuaW4gYi91bml4L2ludGwvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDY4ZjkuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIG1lc3NhZ2UgY2F0YWxvZyBoYW5kbGluZyBsaWJyYXJ5IG9mIEdOVSBnZXR0ZXh0Ci0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotIyBVU0EuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi10b3BfYnVpbGRkaXIgPSAuLgotVlBBVEggPSAkKHNyY2RpcikKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1saWJkaXIgPSBAbGliZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKGRhdGFkaXIpL2dldHRleHQvaW50bAotYWxpYXNwYXRoID0gJChsb2NhbGVkaXIpCi1zdWJkaXIgPSBpbnRsCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJChNS0lOU1RBTExESVJTKQotCi1sID0gQElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYQAotCi1BUiA9IGFyCi1DQyA9IEBDQ0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLVJBTkxJQiA9IEBSQU5MSUJACi1ZQUNDID0gQElOVExCSVNPTkAgLXkgLWQKLVlGTEFHUyA9IC0tbmFtZS1wcmVmaXg9X19nZXR0ZXh0Ci0KLURFRlMgPSAtRExPQ0FMRURJUj1cIiQobG9jYWxlZGlyKVwiIC1ETE9DQUxFX0FMSUFTX1BBVEg9XCIkKGFsaWFzcGF0aClcIiBcCi0tRExJQkRJUj1cIiQobGliZGlyKVwiIC1ESU5fTElCSU5UTCBcCi0tREVOQUJMRV9SRUxPQ0FUQUJMRT0xIC1ESU5fTElCUkFSWSAtRElOU1RBTExESVI9XCIkKGxpYmRpcilcIiAtRE5PX1hNQUxMT0MgXAotLURzZXRfcmVsb2NhdGlvbl9wcmVmaXg9bGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggXAotLURyZWxvY2F0ZT1saWJpbnRsX3JlbG9jYXRlIFwKLS1EREVQRU5EU19PTl9MSUJJQ09OVj0xIEBERUZTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1DRkxBR1MgPSBAQ0ZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1IRUFERVJTID0gXAotICBnbW8uaCBcCi0gIGdldHRleHRQLmggXAotICBoYXNoLXN0cmluZy5oIFwKLSAgbG9hZGluZm8uaCBcCi0gIHBsdXJhbC1leHAuaCBcCi0gIGV2YWwtcGx1cmFsLmggXAotICBsb2NhbGNoYXJzZXQuaCBcCi0gIHJlbG9jYXRhYmxlLmggXAotICB4c2l6ZS5oIFwKLSAgcHJpbnRmLWFyZ3MuaCBwcmludGYtYXJncy5jIFwKLSAgcHJpbnRmLXBhcnNlLmggd3ByaW50Zi1wYXJzZS5oIHByaW50Zi1wYXJzZS5jIFwKLSAgdmFzbnByaW50Zi5oIHZhc253cHJpbnRmLmggdmFzbnByaW50Zi5jIFwKLSAgb3MyY29tcGF0LmggXAotICBsaWJnbnVpbnRsLmguaW4KLVNPVVJDRVMgPSBcCi0gIGJpbmR0ZXh0ZG9tLmMgXAotICBkY2dldHRleHQuYyBcCi0gIGRnZXR0ZXh0LmMgXAotICBnZXR0ZXh0LmMgXAotICBmaW5kZG9tYWluLmMgXAotICBsb2FkbXNnY2F0LmMgXAotICBsb2NhbGVhbGlhcy5jIFwKLSAgdGV4dGRvbWFpbi5jIFwKLSAgbDEwbmZsaXN0LmMgXAotICBleHBsb2RlbmFtZS5jIFwKLSAgZGNpZ2V0dGV4dC5jIFwKLSAgZGNuZ2V0dGV4dC5jIFwKLSAgZG5nZXR0ZXh0LmMgXAotICBuZ2V0dGV4dC5jIFwKLSAgcGx1cmFsLnkgXAotICBwbHVyYWwtZXhwLmMgXAotICBsb2NhbGNoYXJzZXQuYyBcCi0gIHJlbG9jYXRhYmxlLmMgXAotICBsb2NhbGVuYW1lLmMgXAotICBsb2cuYyBcCi0gIHByaW50Zi5jIFwKLSAgb3NkZXAuYyBcCi0gIG9zMmNvbXBhdC5jIFwKLSAgaW50bC1jb21wYXQuYwotT0JKRUNUUyA9IFwKLSAgYmluZHRleHRkb20uJGxvIFwKLSAgZGNnZXR0ZXh0LiRsbyBcCi0gIGRnZXR0ZXh0LiRsbyBcCi0gIGdldHRleHQuJGxvIFwKLSAgZmluZGRvbWFpbi4kbG8gXAotICBsb2FkbXNnY2F0LiRsbyBcCi0gIGxvY2FsZWFsaWFzLiRsbyBcCi0gIHRleHRkb21haW4uJGxvIFwKLSAgbDEwbmZsaXN0LiRsbyBcCi0gIGV4cGxvZGVuYW1lLiRsbyBcCi0gIGRjaWdldHRleHQuJGxvIFwKLSAgZGNuZ2V0dGV4dC4kbG8gXAotICBkbmdldHRleHQuJGxvIFwKLSAgbmdldHRleHQuJGxvIFwKLSAgcGx1cmFsLiRsbyBcCi0gIHBsdXJhbC1leHAuJGxvIFwKLSAgbG9jYWxjaGFyc2V0LiRsbyBcCi0gIHJlbG9jYXRhYmxlLiRsbyBcCi0gIGxvY2FsZW5hbWUuJGxvIFwKLSAgbG9nLiRsbyBcCi0gIHByaW50Zi4kbG8gXAotICBvc2RlcC4kbG8gXAotICBpbnRsLWNvbXBhdC4kbG8KLURJU1RGSUxFUy5jb21tb24gPSBNYWtlZmlsZS5pbiBcCi1jb25maWcuY2hhcnNldCBsb2NhbGUuYWxpYXMgcmVmLWFkZC5zaW4gcmVmLWRlbC5zaW4gJChIRUFERVJTKSAkKFNPVVJDRVMpCi1ESVNURklMRVMuZ2VuZXJhdGVkID0gcGx1cmFsLmMKLURJU1RGSUxFUy5ub3JtYWwgPSBWRVJTSU9OCi1ESVNURklMRVMuZ2V0dGV4dCA9IENPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgbGliaW50bC5nbGliYyBcCi1saWJnbnVpbnRsLmhfdm1zIE1ha2VmaWxlLnZtcyBcCi1saWJnbnVpbnRsLmgubXN2Yy1zdGF0aWMgbGliZ251aW50bC5oLm1zdmMtc2hhcmVkIFJFQURNRS53b2UzMiBNYWtlZmlsZS5tc3ZjCi1ESVNURklMRVMub2Jzb2xldGUgPSB4b3Blbi1tc2cuc2VkIGxpbnV4LW1zZy5zZWQgcG8ydGJsLnNlZC5pbiBjYXQtY29tcGF0LmMgXAotQ09QWUlORy5MSUItMiBnZXR0ZXh0LmggbGliZ2V0dGV4dC5oIHBsdXJhbC1ldmFsLmMgbGliZ251aW50bC5oCi0KLWFsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKLWFsbC15ZXM6IGxpYmludGwuJGxhIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCi1hbGwtbm86IGFsbC1uby1AQlVJTERfSU5DTFVERURfTElCSU5UTEAKLWFsbC1uby15ZXM6IGxpYmdudWludGwuJGxhCi1hbGwtbm8tbm86Ci0KLWxpYmludGwuYSBsaWJnbnVpbnRsLmE6ICQoT0JKRUNUUykKLQlybSAtZiAkQAotCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCi0JJChSQU5MSUIpICRACi0KLWxpYmludGwubGEgbGliZ251aW50bC5sYTogJChPQkpFQ1RTKQotCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgXAotCSAgJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBcCi0JICAkKE9CSkVDVFMpIEBMVExJQklDT05WQCAkKExJQlMpIC1sYyBcCi0JICAtdmVyc2lvbi1pbmZvICQoTFRWX0NVUlJFTlQpOiQoTFRWX1JFVklTSU9OKTokKExUVl9BR0UpIFwKLQkgIC1ycGF0aCAkKGxpYmRpcikgXAotCSAgLW5vLXVuZGVmaW5lZAotCi0jIExpYnRvb2wncyBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmludGwuCi0jIEJlZm9yZSBtYWtpbmcgYSBnZXR0ZXh0IHJlbGVhc2UsIHRoZSBnZXR0ZXh0IG1haW50YWluZXIgbXVzdCBjaGFuZ2UgdGhpcwotIyBhY2NvcmRpbmcgdG8gdGhlIGxpYnRvb2wgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAiTGlicmFyeSBpbnRlcmZhY2UgdmVyc2lvbnMiLgotIyBNYWludGFpbmVycyBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIGludGwgZGlyZWN0b3J5IG11c3QgKm5vdCoKLSMgY2hhbmdlIHRoZXNlIHZhbHVlcy4KLUxUVl9DVVJSRU5UPTcKLUxUVl9SRVZJU0lPTj0wCi1MVFZfQUdFPTQKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAueSAubyAubG8gLnNpbiAuc2VkCi0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ueS5jOgotCSQoWUFDQykgJChZRkxBR1MpIC0tb3V0cHV0ICRAICQ8Ci0Jcm0gLWYgJCouaAotCi1iaW5kdGV4dGRvbS5sbzogJChzcmNkaXIpL2JpbmR0ZXh0ZG9tLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2JpbmR0ZXh0ZG9tLmMKLWRjZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY2dldHRleHQuYwotZGdldHRleHQubG86ICQoc3JjZGlyKS9kZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kZ2V0dGV4dC5jCi1nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9nZXR0ZXh0LmMKLWZpbmRkb21haW4ubG86ICQoc3JjZGlyKS9maW5kZG9tYWluLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2ZpbmRkb21haW4uYwotbG9hZG1zZ2NhdC5sbzogJChzcmNkaXIpL2xvYWRtc2djYXQuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCi1sb2NhbGVhbGlhcy5sbzogJChzcmNkaXIpL2xvY2FsZWFsaWFzLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZWFsaWFzLmMKLXRleHRkb21haW4ubG86ICQoc3JjZGlyKS90ZXh0ZG9tYWluLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3RleHRkb21haW4uYwotbDEwbmZsaXN0LmxvOiAkKHNyY2RpcikvbDEwbmZsaXN0LmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2wxMG5mbGlzdC5jCi1leHBsb2RlbmFtZS5sbzogJChzcmNkaXIpL2V4cGxvZGVuYW1lLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2V4cGxvZGVuYW1lLmMKLWRjaWdldHRleHQubG86ICQoc3JjZGlyKS9kY2lnZXR0ZXh0LmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjaWdldHRleHQuYwotZGNuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjbmdldHRleHQuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCi1kbmdldHRleHQubG86ICQoc3JjZGlyKS9kbmdldHRleHQuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZG5nZXR0ZXh0LmMKLW5nZXR0ZXh0LmxvOiAkKHNyY2RpcikvbmdldHRleHQuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbmdldHRleHQuYwotcGx1cmFsLmxvOiAkKHNyY2RpcikvcGx1cmFsLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC5jCi1wbHVyYWwtZXhwLmxvOiAkKHNyY2RpcikvcGx1cmFsLWV4cC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKLWxvY2FsY2hhcnNldC5sbzogJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGNoYXJzZXQuYwotcmVsb2NhdGFibGUubG86ICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5jCi1sb2NhbGVuYW1lLmxvOiAkKHNyY2RpcikvbG9jYWxlbmFtZS5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKLWxvZy5sbzogJChzcmNkaXIpL2xvZy5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2cuYwotcHJpbnRmLmxvOiAkKHNyY2RpcikvcHJpbnRmLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3ByaW50Zi5jCi1vc2RlcC5sbzogJChzcmNkaXIpL29zZGVwLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL29zZGVwLmMKLWludGwtY29tcGF0LmxvOiAkKHNyY2RpcikvaW50bC1jb21wYXQuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvaW50bC1jb21wYXQuYwotCi1yZWYtYWRkLnNlZDogJChzcmNkaXIpL3JlZi1hZGQuc2luCi0Jc2VkIC1lICcvXiMvZCcgLWUgJ3MvQCcnUEFDS0FHRScnQC9AUEFDS0FHRUAvZycgJChzcmNkaXIpL3JlZi1hZGQuc2luID4gdC1yZWYtYWRkLnNlZAotCW12IHQtcmVmLWFkZC5zZWQgcmVmLWFkZC5zZWQKLXJlZi1kZWwuc2VkOiAkKHNyY2RpcikvcmVmLWRlbC5zaW4KLQlzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWRlbC5zaW4gPiB0LXJlZi1kZWwuc2VkCi0JbXYgdC1yZWYtZGVsLnNlZCByZWYtZGVsLnNlZAotCi1JTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKSAtSS4uCi0KLWxpYmdudWludGwuaDogJChzcmNkaXIpL2xpYmdudWludGwuaC5pbgotCXNlZCAtZSAncyxAJydIQVZFX1BPU0lYX1BSSU5URicnQCxASEFWRV9QT1NJWF9QUklOVEZALGcnIFwKLQkgICAgLWUgJ3MsQCcnSEFWRV9BU1BSSU5URicnQCxASEFWRV9BU1BSSU5URkAsZycgXAotCSAgICAtZSAncyxAJydIQVZFX1NOUFJJTlRGJydALEBIQVZFX1NOUFJJTlRGQCxnJyBcCi0JICAgIC1lICdzLEAnJ0hBVkVfV1BSSU5URicnQCxASEFWRV9XUFJJTlRGQCxnJyBcCi0JICA8ICQoc3JjZGlyKS9saWJnbnVpbnRsLmguaW4gPiBsaWJnbnVpbnRsLmgKLQotbGliaW50bC5oOiBsaWJnbnVpbnRsLmgKLQljcCBsaWJnbnVpbnRsLmggbGliaW50bC5oCi0KLWNoYXJzZXQuYWxpYXM6ICQoc3JjZGlyKS9jb25maWcuY2hhcnNldAotCSQoU0hFTEwpICQoc3JjZGlyKS9jb25maWcuY2hhcnNldCAnQGhvc3RAJyA+IHQtJEAKLQltdiB0LSRAICRACi0KLWNoZWNrOiBhbGwKLQotIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCi0jIHN5c3RlbSB3aGljaCBoYXMgdGhlIEdOVSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCi0jIHNlcGFyYXRlIGxpYnJhcnkuCi0jIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQotIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6IGFsbAotCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCi0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCi0JICAkKElOU1RBTExfREFUQSkgbGliaW50bC5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2xpYmludGwuaDsgXAotCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwuJGxhOyBcCi0JICBpZiB0ZXN0ICJAUkVMT0NBVEFCTEVAIiA9IHllczsgdGhlbiBcCi0JICAgIGRlcGVuZGVuY2llcz1gc2VkIC1uIC1lICdzLF5kZXBlbmRlbmN5X2xpYnM9XCguKlwpLFwxLHAnIDwgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhIHwgc2VkIC1lICJzLF4nLCwiIC1lICJzLCdcJCQsLCJgOyBcCi0JICAgIGlmIHRlc3QgLW4gIiQkZGVwZW5kZW5jaWVzIjsgdGhlbiBcCi0JICAgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiIFwKLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IG5vOyB0aGVuIFwKLQkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKTsgXAotCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSBsaWJnbnVpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuc28gJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCi0JICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAotCSAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0JaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0JICB0ZW1wPSQoREVTVERJUikkKGxpYmRpcikvdC1jaGFyc2V0LmFsaWFzOyBcCi0JICBkZXN0PSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAotCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAotCSAgICBvcmlnPSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAotCSAgICBzZWQgLWYgcmVmLWFkZC5zZWQgJCRvcmlnID4gJCR0ZW1wOyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCi0JICAgIHJtIC1mICQkdGVtcDsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgQEdMSUJDMjFAID0gbm87IHRoZW4gXAotCSAgICAgIG9yaWc9Y2hhcnNldC5hbGlhczsgXAotCSAgICAgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotCSAgICAgIHJtIC1mICQkdGVtcDsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobG9jYWxlZGlyKTsgXAotCSAgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhcyBcCi0JICAgICYmIG9yaWc9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXMgXAotCSAgICB8fCBvcmlnPSQoc3JjZGlyKS9sb2NhbGUuYWxpYXM7IFwKLQkgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAotCSAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAotCSAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKLQkgIHJtIC1mICQkdGVtcDsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbC1kYXRhOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0JICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCi0JICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCi0JICAkKElOU1RBTExfREFUQSkgQ2hhbmdlTG9nLmluc3QgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvQ2hhbmdlTG9nOyBcCi0JICBkaXN0cz0iQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pIjsgXAotCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSBcCi0JCQkgICAgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JICBjaG1vZCBhK3ggJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvY29uZmlnLmNoYXJzZXQ7IFwKLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5nZW5lcmF0ZWQpIjsgXAotCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRkaXIvJCRmaWxlIFwKLQkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5vYnNvbGV0ZSkiOyBcCi0JICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi1pbnN0YWxsLXN0cmlwOiBpbnN0YWxsCi0KLWluc3RhbGxkaXJzOgotCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCi0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAotCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAotCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0JaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0JICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0JICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCi0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgcm0gLWYgJChERVNURElSKSQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCi0JICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAotCSAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwuJGxhOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAotCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAotCSAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0JaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAotCSAgICB0ZW1wPSQoREVTVERJUikkKGxpYmRpcikvdC1jaGFyc2V0LmFsaWFzOyBcCi0JICAgIGRlc3Q9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCi0JICAgIHNlZCAtZiByZWYtZGVsLnNlZCAkJGRlc3QgPiAkJHRlbXA7IFwKLQkgICAgaWYgZ3JlcCAnXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAkJCcgJCR0ZW1wID4gL2Rldi9udWxsOyB0aGVuIFwKLQkgICAgICBybSAtZiAkJGRlc3Q7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKLQkgICAgZmk7IFwKLQkgICAgcm0gLWYgJCR0ZW1wOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgdGhlbiBcCi0JICAgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAotCSAgICBkZXN0PSQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyBcCi0JICAgIHNlZCAtZiByZWYtZGVsLnNlZCAkJGRlc3QgPiAkJHRlbXA7IFwKLQkgICAgaWYgZ3JlcCAnXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAkJCcgJCR0ZW1wID4gL2Rldi9udWxsOyB0aGVuIFwKLQkgICAgICBybSAtZiAkJGRlc3Q7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKLQkgICAgZmk7IFwKLQkgICAgcm0gLWYgJCR0ZW1wOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLQkgIGZvciBmaWxlIGluIFZFUlNJT04gQ2hhbmdlTG9nIENPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpOyBkbyBcCi0JICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi1pbmZvIGR2aSBwcyBwZGYgaHRtbDoKLQotJChPQkpFQ1RTKTogbGliZ251aW50bC5oCi1iaW5kdGV4dGRvbS4kbG8gZGNnZXR0ZXh0LiRsbyBkY2lnZXR0ZXh0LiRsbyBkY25nZXR0ZXh0LiRsbyBkZ2V0dGV4dC4kbG8gZG5nZXR0ZXh0LiRsbyBmaW5kZG9tYWluLiRsbyBnZXR0ZXh0LiRsbyBpbnRsLWNvbXBhdC4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIG5nZXR0ZXh0LiRsbyB0ZXh0ZG9tYWluLiRsbzogJChzcmNkaXIpL2dldHRleHRQLmggJChzcmNkaXIpL2dtby5oICQoc3JjZGlyKS9sb2FkaW5mby5oCi1kY2lnZXR0ZXh0LiRsbyBsb2FkbXNnY2F0LiRsbzogJChzcmNkaXIpL2hhc2gtc3RyaW5nLmgKLWV4cGxvZGVuYW1lLiRsbyBsMTBuZmxpc3QuJGxvOiAkKHNyY2RpcikvbG9hZGluZm8uaAotZGNpZ2V0dGV4dC4kbG8gbG9hZG1zZ2NhdC4kbG8gcGx1cmFsLiRsbyBwbHVyYWwtZXhwLiRsbzogJChzcmNkaXIpL3BsdXJhbC1leHAuaAotZGNpZ2V0dGV4dC4kbG86ICQoc3JjZGlyKS9ldmFsLXBsdXJhbC5oCi1sb2NhbGNoYXJzZXQuJGxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmgKLWxvY2FsZWFsaWFzLiRsbyBsb2NhbGNoYXJzZXQuJGxvIHJlbG9jYXRhYmxlLiRsbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmgKLXByaW50Zi4kbG86ICQoc3JjZGlyKS9wcmludGYtYXJncy5oICQoc3JjZGlyKS9wcmludGYtYXJncy5jICQoc3JjZGlyKS9wcmludGYtcGFyc2UuaCAkKHNyY2Rpcikvd3ByaW50Zi1wYXJzZS5oICQoc3JjZGlyKS94c2l6ZS5oICQoc3JjZGlyKS9wcmludGYtcGFyc2UuYyAkKHNyY2RpcikvdmFzbnByaW50Zi5oICQoc3JjZGlyKS92YXNud3ByaW50Zi5oICQoc3JjZGlyKS92YXNucHJpbnRmLmMKLQotdGFnczogVEFHUwotCi1UQUdTOiAkKEhFQURFUlMpICQoU09VUkNFUykKLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgZXRhZ3MgLW8gJCRoZXJlL1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0KLWN0YWdzOiBDVEFHUwotCi1DVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIGN0YWdzIC1vICQkaGVyZS9DVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKLQotaWQ6IElECi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykKLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgbWtpZCAtZiQkaGVyZS9JRCAkKEhFQURFUlMpICQoU09VUkNFUykKLQotCi1tb3N0bHljbGVhbjoKLQlybSAtZiAqLmEgKi5sYSAqLm8gKi5vYmogKi5sbyBjb3JlIGNvcmUuKgotCXJtIC1mIGxpYmdudWludGwuaCBsaWJpbnRsLmggY2hhcnNldC5hbGlhcyByZWYtYWRkLnNlZCByZWYtZGVsLnNlZAotCXJtIC1mIC1yIC5saWJzIF9saWJzCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgSUQgVEFHUwotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSIgfHwgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotCSAgcm0gLWYgQ2hhbmdlTG9nLmluc3QgJChESVNURklMRVMubm9ybWFsKTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotCi0jIEdOVSBnZXR0ZXh0IG5lZWRzIG5vdCBjb250YWluIHRoZSBmaWxlIGBWRVJTSU9OJyBidXQgY29udGFpbnMgc29tZQotIyBvdGhlciBmaWxlcyB3aGljaCBzaG91bGQgbm90IGJlIGRpc3RyaWJ1dGVkIGluIG90aGVyIHBhY2thZ2VzLgotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogTWFrZWZpbGUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0JICA6IDsgXAotCWVsc2UgXAotCSAgaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIjsgdGhlbiBcCi0JICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLmdldHRleHQpIjsgXAotCSAgZWxzZSBcCi0JICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCi0JICBmaTsgXAotCSAgJChNQUtFKSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCkgJCRhZGRpdGlvbmFsOyBcCi0JICBmb3IgZmlsZSBpbiBDaGFuZ2VMb2cgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpICQkYWRkaXRpb25hbDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAotCSAgICBjcCAtcCAkJGRpci8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCSAgZG9uZTsgXAotCWZpCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0jIFRoaXMgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsIGJ1dCBkb2Vzbid0IHdvcmsgYW55IG1vcmUgd2l0aCBhdXRvY29uZi0yLjU3LAotIyB3aGVuIEFDX0NPTkZJR19GSUxFUyhbaW50bC9NYWtlZmlsZTpzb21lZGlyL01ha2VmaWxlLmluXSkgaXMgdXNlZC4KLSMJY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS91bml4L2ludGwvVkVSU0lPTiBiL3VuaXgvaW50bC9WRVJTSU9OCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI4NDZjLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9WRVJTSU9OCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR05VIGdldHRleHQgbGlicmFyeSBmcm9tIGdldHRleHQtMC4xNC4xCmRpZmYgLS1naXQgYS91bml4L2ludGwvYmluZHRleHRkb20uYyBiL3VuaXgvaW50bC9iaW5kdGV4dGRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2RjNDAwLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9iaW5kdGV4dGRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLSNpZmRlZiBfTElCQwotLyogV2UgaGF2ZSB0byBoYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLSNlbHNlCi0vKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCi0jIGRlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUywgTkFNRSkKLSMgZGVmaW5lIF9fbGliY19yd2xvY2tfd3Jsb2NrKE5BTUUpCi0jIGRlZmluZSBfX2xpYmNfcndsb2NrX3VubG9jayhOQU1FKQotI2VuZGlmCi0KLS8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKLSAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCi0gICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KLSNpZiAhZGVmaW5lZCBfTElCQwotIyBkZWZpbmUgX25sX2RlZmF1bHRfZGlybmFtZSBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZQotIyBkZWZpbmUgX25sX2RvbWFpbl9iaW5kaW5ncyBsaWJpbnRsX25sX2RvbWFpbl9iaW5kaW5ncwotI2VuZGlmCi0KLS8qIFNvbWUgY29tcGlsZXJzLCBsaWtlIFN1bk9TNCBjYywgZG9uJ3QgaGF2ZSBvZmZzZXRvZiBpbiA8c3RkZGVmLmg+LiAgKi8KLSNpZm5kZWYgb2Zmc2V0b2YKLSMgZGVmaW5lIG9mZnNldG9mKHR5cGUsaWRlbnQpICgoc2l6ZV90KSYoKCh0eXBlKikwKS0+aWRlbnQpKQotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOwotI2lmZGVmIF9MSUJDCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lX2ludGVybmFsW10gYXR0cmlidXRlX2hpZGRlbjsKLSNlbHNlCi0jIGRlZmluZSBJTlRVU0UobmFtZSkgbmFtZQotI2VuZGlmCi0KLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLQotLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCi1fX2xpYmNfcndsb2NrX2RlZmluZSAoZXh0ZXJuLCBfbmxfc3RhdGVfbG9jayBhdHRyaWJ1dGVfaGlkZGVuKQotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgQklORFRFWFRET01BSU4gX19iaW5kdGV4dGRvbWFpbgotIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgX19iaW5kX3RleHRkb21haW5fY29kZXNldAotIyBpZm5kZWYgc3RyZHVwCi0jICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLSMgZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBCSU5EVEVYVERPTUFJTiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCi0jIGRlZmluZSBCSU5EX1RFWFRET01BSU5fQ09ERVNFVCBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0Ci0jZW5kaWYKLQotLyogU3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgbmFtZSAqRElSTkFNRVAgYW5kIHRoZSBvdXRwdXQgY29kZXNldCAqQ09ERVNFVFAKLSAgIHRvIGJlIHVzZWQgZm9yIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZy4KLSAgIElmICpESVJOQU1FUCBvciAqQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5vdAotICAgbW9kaWZpZWQsIG9ubHkgdGhlIGN1cnJlbnQgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICBJZiBESVJOQU1FUCBvciBDT0RFU0VUUCBpcyBOVUxMLCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgaXMgbmVpdGhlcgotICAgbW9kaWZpZWQgbm9yIHJldHVybmVkLiAgKi8KLXN0YXRpYyB2b2lkCi1zZXRfYmluZGluZ192YWx1ZXMgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0JCSAgICBjb25zdCBjaGFyICoqZGlybmFtZXAsIGNvbnN0IGNoYXIgKipjb2Rlc2V0cCkKLXsKLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0gIGludCBtb2RpZmllZDsKLQotICAvKiBTb21lIHNhbml0eSBjaGVja3MuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMIHx8IGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoZGlybmFtZXApCi0JKmRpcm5hbWVwID0gTlVMTDsKLSAgICAgIGlmIChjb2Rlc2V0cCkKLQkqY29kZXNldHAgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBfX2xpYmNfcndsb2NrX3dybG9jayAoX25sX3N0YXRlX2xvY2spOwotCi0gIG1vZGlmaWVkID0gMDsKLQotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZGlybmFtZXApCi0JewotCSAgY29uc3QgY2hhciAqZGlybmFtZSA9ICpkaXJuYW1lcDsKLQotCSAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKLQkgICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLwotCSAgICAqZGlybmFtZXAgPSBiaW5kaW5nLT5kaXJuYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAotCQkgb25lIGFyZSBlcXVhbCB3ZSBzaW1wbHkgZG8gbm90aGluZy4gIE90aGVyd2lzZSByZXBsYWNlIHRoZQotCQkgb2xkIGJpbmRpbmcuICAqLwotCSAgICAgIGNoYXIgKnJlc3VsdCA9IGJpbmRpbmctPmRpcm5hbWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgcmVzdWx0KSAhPSAwKQotCQl7Ci0JCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpKSA9PSAwKQotCQkgICAgcmVzdWx0ID0gKGNoYXIgKikgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOwotCQkgIGVsc2UKLQkJICAgIHsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLQkJICAgICAgcmVzdWx0ID0gc3RyZHVwIChkaXJuYW1lKTsKLSNlbHNlCi0JCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkJICAgICAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQotCQkJbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7Ci0jZW5kaWYKLQkJICAgIH0KLQotCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChiaW5kaW5nLT5kaXJuYW1lICE9IElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKSkKLQkJCWZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOwotCi0JCSAgICAgIGJpbmRpbmctPmRpcm5hbWUgPSByZXN1bHQ7Ci0JCSAgICAgIG1vZGlmaWVkID0gMTsKLQkJICAgIH0KLQkJfQotCSAgICAgICpkaXJuYW1lcCA9IHJlc3VsdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGNvZGVzZXRwKQotCXsKLQkgIGNvbnN0IGNoYXIgKmNvZGVzZXQgPSAqY29kZXNldHA7Ci0KLQkgIGlmIChjb2Rlc2V0ID09IE5VTEwpCi0JICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KLQkgICAgKmNvZGVzZXRwID0gYmluZGluZy0+Y29kZXNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKLQkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKLQkJIG9sZCBiaW5kaW5nLiAgKi8KLQkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5jb2Rlc2V0OwotCSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCBzdHJjbXAgKGNvZGVzZXQsIHJlc3VsdCkgIT0gMCkKLQkJewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCQkgIHJlc3VsdCA9IHN0cmR1cCAoY29kZXNldCk7Ci0jZWxzZQotCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGNvZGVzZXQpICsgMTsKLQkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKLQkJICAgIG1lbWNweSAocmVzdWx0LCBjb2Rlc2V0LCBsZW4pOwotI2VuZGlmCi0KLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQotCQkgICAgewotCQkgICAgICBpZiAoYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQotCQkJZnJlZSAoYmluZGluZy0+Y29kZXNldCk7Ci0KLQkJICAgICAgYmluZGluZy0+Y29kZXNldCA9IHJlc3VsdDsKLQkJICAgICAgYmluZGluZy0+Y29kZXNldF9jbnRyKys7Ci0JCSAgICAgIG1vZGlmaWVkID0gMTsKLQkJICAgIH0KLQkJfQotCSAgICAgICpjb2Rlc2V0cCA9IHJlc3VsdDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChkaXJuYW1lcCA9PSBOVUxMIHx8ICpkaXJuYW1lcCA9PSBOVUxMKQotCSAgICYmIChjb2Rlc2V0cCA9PSBOVUxMIHx8ICpjb2Rlc2V0cCA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBTaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCi0gICAgICBpZiAoZGlybmFtZXApCi0JKmRpcm5hbWVwID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOwotICAgICAgaWYgKGNvZGVzZXRwKQotCSpjb2Rlc2V0cCA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCi0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0gICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQotCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgYmluZGluZywgZG9tYWlubmFtZSkgKyBsZW4pOwotCi0gICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3X2JpbmRpbmcgPT0gTlVMTCwgMCkpCi0JZ290byBmYWlsZWQ7Ci0KLSAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7Ci0KLSAgICAgIGlmIChkaXJuYW1lcCkKLQl7Ci0JICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOwotCi0JICBpZiAoZGlybmFtZSA9PSBOVUxMKQotCSAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCi0JICAgIGRpcm5hbWUgPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpID09IDApCi0JCWRpcm5hbWUgPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcmVzdWx0OwotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCQkgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKLQkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7Ci0jZWxzZQotCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKLQkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7Ci0JCSAgbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7Ci0jZW5kaWYKLQkJICBkaXJuYW1lID0gcmVzdWx0OwotCQl9Ci0JICAgIH0KLQkgICpkaXJuYW1lcCA9IGRpcm5hbWU7Ci0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIGRpcm5hbWU7Ci0JfQotICAgICAgZWxzZQotCS8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KLQluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKLQotICAgICAgbmV3X2JpbmRpbmctPmNvZGVzZXRfY250ciA9IDA7Ci0KLSAgICAgIGlmIChjb2Rlc2V0cCkKLQl7Ci0JICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOwotCi0JICBpZiAoY29kZXNldCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqcmVzdWx0OwotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0JICAgICAgcmVzdWx0ID0gc3RyZHVwIChjb2Rlc2V0KTsKLQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQotCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OwotI2Vsc2UKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChjb2Rlc2V0KSArIDE7Ci0JICAgICAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCi0JCWdvdG8gZmFpbGVkX2NvZGVzZXQ7Ci0JICAgICAgbWVtY3B5IChyZXN1bHQsIGNvZGVzZXQsIGxlbik7Ci0jZW5kaWYKLQkgICAgICBjb2Rlc2V0ID0gcmVzdWx0OwotCSAgICAgIG5ld19iaW5kaW5nLT5jb2Rlc2V0X2NudHIrKzsKLQkgICAgfQotCSAgKmNvZGVzZXRwID0gY29kZXNldDsKLQkgIG5ld19iaW5kaW5nLT5jb2Rlc2V0ID0gKGNoYXIgKikgY29kZXNldDsKLQl9Ci0gICAgICBlbHNlCi0JbmV3X2JpbmRpbmctPmNvZGVzZXQgPSBOVUxMOwotCi0gICAgICAvKiBOb3cgZW5xdWV1ZSBpdC4gICovCi0gICAgICBpZiAoX25sX2RvbWFpbl9iaW5kaW5ncyA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kb21haW5fYmluZGluZ3MtPmRvbWFpbm5hbWUpIDwgMCkKLQl7Ci0JICBuZXdfYmluZGluZy0+bmV4dCA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0JICBfbmxfZG9tYWluX2JpbmRpbmdzID0gbmV3X2JpbmRpbmc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotCSAgd2hpbGUgKGJpbmRpbmctPm5leHQgIT0gTlVMTAotCQkgJiYgc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5uZXh0LT5kb21haW5uYW1lKSA+IDApCi0JICAgIGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0OwotCi0JICBuZXdfYmluZGluZy0+bmV4dCA9IGJpbmRpbmctPm5leHQ7Ci0JICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7Ci0JfQotCi0gICAgICBtb2RpZmllZCA9IDE7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZGVhbCB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLiAgKi8KLSAgICAgIGlmICgwKQotCXsKLQlmYWlsZWRfY29kZXNldDoKLQkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCi0JICAgIGZyZWUgKG5ld19iaW5kaW5nLT5kaXJuYW1lKTsKLQlmYWlsZWRfZGlybmFtZToKLQkgIGZyZWUgKG5ld19iaW5kaW5nKTsKLQlmYWlsZWQ6Ci0JICBpZiAoZGlybmFtZXApCi0JICAgICpkaXJuYW1lcCA9IE5VTEw7Ci0JICBpZiAoY29kZXNldHApCi0JICAgICpjb2Rlc2V0cCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBtb2RpZmllZCBhbnkgYmluZGluZywgd2UgZmx1c2ggdGhlIGNhY2hlcy4gICovCi0gIGlmIChtb2RpZmllZCkKLSAgICArK19ubF9tc2dfY2F0X2NudHI7Ci0KLSAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLX0KLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1jaGFyICoKLUJJTkRURVhURE9NQUlOIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpkaXJuYW1lKQotewotICBzZXRfYmluZGluZ192YWx1ZXMgKGRvbWFpbm5hbWUsICZkaXJuYW1lLCBOVUxMKTsKLSAgcmV0dXJuIChjaGFyICopIGRpcm5hbWU7Ci19Ci0KLS8qIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiB3aGljaCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUKLSAgIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgcmV0dXJuZWQuICAqLwotY2hhciAqCi1CSU5EX1RFWFRET01BSU5fQ09ERVNFVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKLXsKLSAgc2V0X2JpbmRpbmdfdmFsdWVzIChkb21haW5uYW1lLCBOVUxMLCAmY29kZXNldCk7Ci0gIHJldHVybiAoY2hhciAqKSBjb2Rlc2V0OwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzZXMgZm9yIGZ1bmN0aW9uIG5hbWVzIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOwotd2Vha19hbGlhcyAoX19iaW5kX3RleHRkb21haW5fY29kZXNldCwgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvY29uZmlnLmNoYXJzZXQgYi91bml4L2ludGwvY29uZmlnLmNoYXJzZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzZDQ1ZmIuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2NvbmZpZy5jaGFyc2V0CisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgT3V0cHV0IGEgc3lzdGVtIGRlcGVuZGVudCB0YWJsZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYWxpYXNlcy4KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jICAgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotIyAgIFVTQS4KLSMKLSMgVGhlIHRhYmxlIGNvbnNpc3RzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCi0jICAgIEFMSUFTICBDQU5PTklDQUwKLSMKLSMgQUxJQVMgaXMgdGhlIChzeXN0ZW0gZGVwZW5kZW50KSByZXN1bHQgb2YgIm5sX2xhbmdpbmZvIChDT0RFU0VUKSIuCi0jIEFMSUFTIGlzIGNvbXBhcmVkIGluIGEgY2FzZSBzZW5zaXRpdmUgd2F5LgotIwotIyBDQU5PTklDQUwgaXMgdGhlIEdOVSBjYW5vbmljYWwgbmFtZSBmb3IgdGhpcyBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0jIEl0IG11c3QgYmUgYW4gZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IGxpYmljb252LiBTdXBwb3J0IGJ5IEdOVSBsaWJjIGlzCi0jIGFsc28gZGVzaXJhYmxlLiBDQU5PTklDQUwgaXMgY2FzZSBpbnNlbnNpdGl2ZS4gVXN1YWxseSBhbiB1cHBlciBjYXNlCi0jIE1JTUUgY2hhcnNldCBuYW1lIGlzIHByZWZlcnJlZC4KLSMgVGhlIGN1cnJlbnQgbGlzdCBvZiBHTlUgY2Fub25pY2FsIGNoYXJzZXQgbmFtZXMgaXMgYXMgZm9sbG93cy4KLSMKLSMgICAgICAgbmFtZSAgICAgICAgICAgICAgTUlNRT8gICAgICAgICAgICAgdXNlZCBieSB3aGljaCBzeXN0ZW1zCi0jICAgQVNDSUksIEFOU0lfWDMuNC0xOTY4ICAgICAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KLSMgICBJU08tODg1OS0xICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgotIyAgIElTTy04ODU5LTIgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCi0jICAgSVNPLTg4NTktMyAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMKLSMgICBJU08tODg1OS00ICAgICAgICAgICAgICBZICAgb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KLSMgICBJU08tODg1OS01ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgotIyAgIElTTy04ODU5LTYgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBzb2xhcmlzCi0jICAgSVNPLTg4NTktNyAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKLSMgICBJU08tODg1OS04ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKLSMgICBJU08tODg1OS05ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcwotIyAgIElTTy04ODU5LTEzICAgICAgICAgICAgICAgICBnbGliYwotIyAgIElTTy04ODU5LTE0ICAgICAgICAgICAgICAgICBnbGliYwotIyAgIElTTy04ODU5LTE1ICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgZnJlZWJzZAotIyAgIEtPSTgtUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBzb2xhcmlzIGZyZWVic2QgZGFyd2luCi0jICAgS09JOC1VICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGZyZWVic2QgZGFyd2luCi0jICAgS09JOC1UICAgICAgICAgICAgICAgICAgICAgIGdsaWJjCi0jICAgQ1A0MzcgICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQNzc1ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDg1MCAgICAgICAgICAgICAgICAgICAgICAgYWl4IG9zZiBkb3MKLSMgICBDUDg1MiAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0jICAgQ1A4NTUgICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQODU2ICAgICAgICAgICAgICAgICAgICAgICBhaXgKLSMgICBDUDg1NyAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0jICAgQ1A4NjEgICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQODYyICAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDg2NCAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0jICAgQ1A4NjUgICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQODY2ICAgICAgICAgICAgICAgICAgICAgICBmcmVlYnNkIGRhcndpbiBkb3MKLSMgICBDUDg2OSAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0jICAgQ1A4NzQgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcwotIyAgIENQOTIyICAgICAgICAgICAgICAgICAgICAgICBhaXgKLSMgICBDUDkzMiAgICAgICAgICAgICAgICAgICAgICAgYWl4IHdvZTMyIGRvcwotIyAgIENQOTQzICAgICAgICAgICAgICAgICAgICAgICBhaXgKLSMgICBDUDk0OSAgICAgICAgICAgICAgICAgICAgICAgb3NmIHdvZTMyIGRvcwotIyAgIENQOTUwICAgICAgICAgICAgICAgICAgICAgICB3b2UzMiBkb3MKLSMgICBDUDEwNDYgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0jICAgQ1AxMTI0ICAgICAgICAgICAgICAgICAgICAgIGFpeAotIyAgIENQMTEyNSAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDExMjkgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0jICAgQ1AxMjUwICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCi0jICAgQ1AxMjUxICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMgZGFyd2luIHdvZTMyCi0jICAgQ1AxMjUyICAgICAgICAgICAgICAgICAgICAgIGFpeCB3b2UzMgotIyAgIENQMTI1MyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIENQMTI1NCAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIENQMTI1NSAgICAgICAgICAgICAgICAgICAgICBnbGliYyB3b2UzMgotIyAgIENQMTI1NiAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIENQMTI1NyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIEdCMjMxMiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KLSMgICBFVUMtSlAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgotIyAgIEVVQy1LUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCi0jICAgRVVDLVRXICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKLSMgICBCSUc1ICAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KLSMgICBCSUc1LUhLU0NTICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcwotIyAgIEdCSyAgICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgd29lMzIgZG9zCi0jICAgR0IxODAzMCAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMKLSMgICBTSElGVF9KSVMgICAgICAgICAgICAgICBZICAgaHB1eCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgotIyAgIEpPSEFCICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzIHdvZTMyCi0jICAgVElTLTYyMCAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzCi0jICAgVklTQ0lJICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjCi0jICAgVENWTjU3MTItMSAgICAgICAgICAgICAgICAgIGdsaWJjCi0jICAgR0VPUkdJQU4tUFMgICAgICAgICAgICAgICAgIGdsaWJjCi0jICAgSFAtUk9NQU44ICAgICAgICAgICAgICAgICAgIGhwdXgKLSMgICBIUC1BUkFCSUM4ICAgICAgICAgICAgICAgICAgaHB1eAotIyAgIEhQLUdSRUVLOCAgICAgICAgICAgICAgICAgICBocHV4Ci0jICAgSFAtSEVCUkVXOCAgICAgICAgICAgICAgICAgIGhwdXgKLSMgICBIUC1UVVJLSVNIOCAgICAgICAgICAgICAgICAgaHB1eAotIyAgIEhQLUtBTkE4ICAgICAgICAgICAgICAgICAgICBocHV4Ci0jICAgREVDLUtBTkpJICAgICAgICAgICAgICAgICAgIG9zZgotIyAgIERFQy1IQU5ZVSAgICAgICAgICAgICAgICAgICBvc2YKLSMgICBVVEYtOCAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKLSMKLSMgTm90ZTogTmFtZXMgd2hpY2ggYXJlIG5vdCBtYXJrZWQgYXMgYmVpbmcgYSBNSU1FIG5hbWUgc2hvdWxkIG5vdCBiZSB1c2VkIGluCi0jIEludGVybmV0IHByb3RvY29scyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2UgKG1haWwsIG5ld3MsIGV0Yy4pLgotIwotIyBOb3RlOiBBU0NJSSBhbmQgQU5TSV9YMy40LTE5NjggYXJlIHN5bm9ueW1vdXMgY2Fub25pY2FsIG5hbWVzLiBBcHBsaWNhdGlvbnMKLSMgbXVzdCB1bmRlcnN0YW5kIGJvdGggbmFtZXMgYW5kIHRyZWF0IHRoZW0gYXMgZXF1aXZhbGVudC4KLSMKLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIGZpbGUgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHNwZWNpZmljYXRpb24sCi0jICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yCi0jICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotCi1ob3N0PSIkMSIKLW9zPWBlY2hvICIkaG9zdCIgfCBzZWQgLWUgJ3MvXlteLV0qLVteLV0qLVwoLipcKSQvXDEvJ2AKLWVjaG8gIiMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFsaWFzZXMsIgotZWNobyAiIyBzdWl0YWJsZSBmb3Igb3BlcmF0aW5nIHN5c3RlbSAnJHtvc30nLiIKLWVjaG8gIiMgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gY29uZmlnLmNoYXJzZXQuIgotIyBMaXN0IG9mIHJlZmVyZW5jZXMsIHVwZGF0ZWQgZHVyaW5nIGluc3RhbGxhdGlvbjoKLWVjaG8gIiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAiCi1jYXNlICIkb3MiIGluCi0gICAgbGludXgtZ251bGliYzEqKQotCSMgTGludXggbGliYzUgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQllY2hvICJDIEFTQ0lJIgotCWVjaG8gIlBPU0lYIEFTQ0lJIgotCWZvciBsIGluIGFmIGFmX1pBIGNhIGNhX0VTIGRhIGRhX0RLIGRlIGRlX0FUIGRlX0JFIGRlX0NIIGRlX0RFIGRlX0xVIFwKLQkgICAgICAgICBlbiBlbl9BVSBlbl9CVyBlbl9DQSBlbl9ESyBlbl9HQiBlbl9JRSBlbl9OWiBlbl9VUyBlbl9aQSBcCi0JICAgICAgICAgZW5fWlcgZXMgZXNfQVIgZXNfQk8gZXNfQ0wgZXNfQ08gZXNfRE8gZXNfRUMgZXNfRVMgZXNfR1QgXAotCSAgICAgICAgIGVzX0hOIGVzX01YIGVzX1BBIGVzX1BFIGVzX1BZIGVzX1NWIGVzX1VTIGVzX1VZIGVzX1ZFIGV0IFwKLQkgICAgICAgICBldF9FRSBldSBldV9FUyBmaSBmaV9GSSBmbyBmb19GTyBmciBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBcCi0JICAgICAgICAgZnJfTFUgZ2EgZ2FfSUUgZ2wgZ2xfRVMgaWQgaWRfSUQgaW4gaW5fSUQgaXMgaXNfSVMgaXQgaXRfQ0ggXAotCSAgICAgICAgIGl0X0lUIGtsIGtsX0dMIG5sIG5sX0JFIG5sX05MIG5vIG5vX05PIHB0IHB0X0JSIHB0X1BUIHN2IFwKLQkgICAgICAgICBzdl9GSSBzdl9TRTsgZG8KLQkgIGVjaG8gIiRsIElTTy04ODU5LTEiCi0JICBlY2hvICIkbC5pc28tODg1OS0xIElTTy04ODU5LTEiCi0JICBlY2hvICIkbC5pc28tODg1OS0xNSBJU08tODg1OS0xNSIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTE1QGV1cm8gSVNPLTg4NTktMTUiCi0JICBlY2hvICIkbEBldXJvIElTTy04ODU5LTE1IgotCSAgZWNobyAiJGwuY3AtNDM3IENQNDM3IgotCSAgZWNobyAiJGwuY3AtODUwIENQODUwIgotCSAgZWNobyAiJGwuY3AtMTI1MiBDUDEyNTIiCi0JICBlY2hvICIkbC5jcC0xMjUyQGV1cm8gQ1AxMjUyIgotCSAgI2VjaG8gIiRsLmF0YXJpLXN0IEFUQVJJLVNUIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gY3MgY3NfQ1ogaHIgaHJfSFIgaHUgaHVfSFUgcGwgcGxfUEwgcm8gcm9fUk8gc2sgc2tfU0sgc2wgXAotCSAgICAgICAgIHNsX1NJIHNyIHNyX0NTIHNyX1lVOyBkbwotCSAgZWNobyAiJGwgSVNPLTg4NTktMiIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTIgSVNPLTg4NTktMiIKLQkgIGVjaG8gIiRsLmNwLTg1MiBDUDg1MiIKLQkgIGVjaG8gIiRsLmNwLTEyNTAgQ1AxMjUwIgotCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0JZG9uZQotCWZvciBsIGluIG1rIG1rX01LIHJ1IHJ1X1JVOyBkbwotCSAgZWNobyAiJGwgSVNPLTg4NTktNSIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTUgSVNPLTg4NTktNSIKLQkgIGVjaG8gIiRsLmtvaTgtciBLT0k4LVIiCi0JICBlY2hvICIkbC5jcC04NjYgQ1A4NjYiCi0JICBlY2hvICIkbC5jcC0xMjUxIENQMTI1MSIKLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotCWRvbmUKLQlmb3IgbCBpbiBhciBhcl9TQTsgZG8KLQkgIGVjaG8gIiRsIElTTy04ODU5LTYiCi0JICBlY2hvICIkbC5pc28tODg1OS02IElTTy04ODU5LTYiCi0JICBlY2hvICIkbC5jcC04NjQgQ1A4NjQiCi0JICAjZWNobyAiJGwuY3AtODY4IENQODY4IiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKLQkgIGVjaG8gIiRsLmNwLTEyNTYgQ1AxMjU2IgotCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0JZG9uZQotCWZvciBsIGluIGVsIGVsX0dSIGdyIGdyX0dSOyBkbwotCSAgZWNobyAiJGwgSVNPLTg4NTktNyIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTcgSVNPLTg4NTktNyIKLQkgIGVjaG8gIiRsLmNwLTg2OSBDUDg2OSIKLQkgIGVjaG8gIiRsLmNwLTEyNTMgQ1AxMjUzIgotCSAgZWNobyAiJGwuY3AtMTI1M0BldXJvIENQMTI1MyIKLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gaGUgaGVfSUwgaXcgaXdfSUw7IGRvCi0JICBlY2hvICIkbCBJU08tODg1OS04IgotCSAgZWNobyAiJGwuaXNvLTg4NTktOCBJU08tODg1OS04IgotCSAgZWNobyAiJGwuY3AtODYyIENQODYyIgotCSAgZWNobyAiJGwuY3AtMTI1NSBDUDEyNTUiCi0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gdHIgdHJfVFI7IGRvCi0JICBlY2hvICIkbCBJU08tODg1OS05IgotCSAgZWNobyAiJGwuaXNvLTg4NTktOSBJU08tODg1OS05IgotCSAgZWNobyAiJGwuY3AtODU3IENQODU3IgotCSAgZWNobyAiJGwuY3AtMTI1NCBDUDEyNTQiCi0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gbHQgbHRfTFQgbHYgbHZfTFY7IGRvCi0JICAjZWNobyAiJGwgQkFMVElDIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKLQkgIGVjaG8gIiRsIElTTy04ODU5LTEzIgotCWRvbmUKLQlmb3IgbCBpbiBydV9VQSB1ayB1a19VQTsgZG8KLQkgIGVjaG8gIiRsIEtPSTgtVSIKLQlkb25lCi0JZm9yIGwgaW4gemggemhfQ047IGRvCi0JICAjZWNobyAiJGwgR0JfMjMxMi04MCIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nLCB3cm9uZyBlbmNvZGluZyBuYW1lCi0JICBlY2hvICIkbCBHQjIzMTIiCi0JZG9uZQotCWZvciBsIGluIGphIGphX0pQIGphX0pQLkVVQzsgZG8KLQkgIGVjaG8gIiRsIEVVQy1KUCIKLQlkb25lCi0JZm9yIGwgaW4ga28ga29fS1I7IGRvCi0JICBlY2hvICIkbCBFVUMtS1IiCi0JZG9uZQotCWZvciBsIGluIHRoIHRoX1RIOyBkbwotCSAgZWNobyAiJGwgVElTLTYyMCIKLQlkb25lCi0JZm9yIGwgaW4gZmEgZmFfSVI7IGRvCi0JICAjZWNobyAiJGwgSVNJUkktMzM0MiIgIyBhIGJyb2tlbiBlbmNvZGluZwotCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0JZG9uZQotCTs7Ci0gICAgbGludXgqIHwgKi1nbnUqKQotCSMgV2l0aCBnbGliYy0yLjEgb3IgbmV3ZXIsIHdlIGRvbid0IG5lZWQgYW55IGNhbm9uaWNhbGl6YXRpb24sCi0JIyBiZWNhdXNlIGdsaWJjIGhhcyBpY29udiBhbmQgYm90aCBnbGliYyBhbmQgbGliaWNvbnYgc3VwcG9ydCBhbGwKLQkjIEdOVSBjYW5vbmljYWwgbmFtZXMgZGlyZWN0bHkuIFRoZXJlZm9yZSwgdGhlIE1ha2VmaWxlIGRvZXMgbm90Ci0JIyBuZWVkIHRvIGluc3RhbGwgdGhlIGFsaWFzIGZpbGUgYXQgYWxsLgotCSMgVGhlIGZvbGxvd2luZyBhcHBsaWVzIG9ubHkgdG8gZ2xpYmMtMi4wLnggYW5kIG9sZGVyIGxpYmNzLgotCWVjaG8gIklTT182NDYuSVJWOjE5ODMgQVNDSUkiCi0JOzsKLSAgICBhaXgqKQotCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgotCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgotCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgotCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgotCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgotCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCi0JZWNobyAiSUJNLTg1MCBDUDg1MCIKLQllY2hvICJJQk0tODU2IENQODU2IgotCWVjaG8gIklCTS05MjEgSVNPLTg4NTktMTMiCi0JZWNobyAiSUJNLTkyMiBDUDkyMiIKLQllY2hvICJJQk0tOTMyIENQOTMyIgotCWVjaG8gIklCTS05NDMgQ1A5NDMiCi0JZWNobyAiSUJNLTEwNDYgQ1AxMDQ2IgotCWVjaG8gIklCTS0xMTI0IENQMTEyNCIKLQllY2hvICJJQk0tMTEyOSBDUDExMjkiCi0JZWNobyAiSUJNLTEyNTIgQ1AxMjUyIgotCWVjaG8gIklCTS1ldWNDTiBHQjIzMTIiCi0JZWNobyAiSUJNLWV1Y0pQIEVVQy1KUCIKLQllY2hvICJJQk0tZXVjS1IgRVVDLUtSIgotCWVjaG8gIklCTS1ldWNUVyBFVUMtVFciCi0JZWNobyAiYmlnNSBCSUc1IgotCWVjaG8gIkdCSyBHQksiCi0JZWNobyAiVElTLTYyMCBUSVMtNjIwIgotCWVjaG8gIlVURi04IFVURi04IgotCTs7Ci0gICAgaHB1eCopCi0JZWNobyAiaXNvODg1OTEgSVNPLTg4NTktMSIKLQllY2hvICJpc284ODU5MiBJU08tODg1OS0yIgotCWVjaG8gImlzbzg4NTk1IElTTy04ODU5LTUiCi0JZWNobyAiaXNvODg1OTYgSVNPLTg4NTktNiIKLQllY2hvICJpc284ODU5NyBJU08tODg1OS03IgotCWVjaG8gImlzbzg4NTk4IElTTy04ODU5LTgiCi0JZWNobyAiaXNvODg1OTkgSVNPLTg4NTktOSIKLQllY2hvICJpc284ODU5MTUgSVNPLTg4NTktMTUiCi0JZWNobyAicm9tYW44IEhQLVJPTUFOOCIKLQllY2hvICJhcmFiaWM4IEhQLUFSQUJJQzgiCi0JZWNobyAiZ3JlZWs4IEhQLUdSRUVLOCIKLQllY2hvICJoZWJyZXc4IEhQLUhFQlJFVzgiCi0JZWNobyAidHVya2lzaDggSFAtVFVSS0lTSDgiCi0JZWNobyAia2FuYTggSFAtS0FOQTgiCi0JZWNobyAidGlzNjIwIFRJUy02MjAiCi0JZWNobyAiYmlnNSBCSUc1IgotCWVjaG8gImV1Y0pQIEVVQy1KUCIKLQllY2hvICJldWNLUiBFVUMtS1IiCi0JZWNobyAiZXVjVFcgRVVDLVRXIgotCWVjaG8gImhwMTVDTiBHQjIzMTIiCi0JI2VjaG8gImNjZGMgPyIgIyB3aGF0IGlzIHRoaXM/Ci0JZWNobyAiU0pJUyBTSElGVF9KSVMiCi0JZWNobyAidXRmOCBVVEYtOCIKLQk7OwotICAgIGlyaXgqKQotCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgotCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgotCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgotCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotCWVjaG8gImV1Y0NOIEdCMjMxMiIKLQllY2hvICJldWNKUCBFVUMtSlAiCi0JZWNobyAiZXVjS1IgRVVDLUtSIgotCWVjaG8gImV1Y1RXIEVVQy1UVyIKLQk7OwotICAgIG9zZiopCi0JZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCi0JZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCi0JZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCi0JZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCi0JZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCi0JZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCi0JZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCi0JZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLQllY2hvICJjcDg1MCBDUDg1MCIKLQllY2hvICJiaWc1IEJJRzUiCi0JZWNobyAiZGVjaGFueXUgREVDLUhBTllVIgotCWVjaG8gImRlY2hhbnppIEdCMjMxMiIKLQllY2hvICJkZWNrYW5qaSBERUMtS0FOSkkiCi0JZWNobyAiZGVja29yZWFuIEVVQy1LUiIKLQllY2hvICJldWNKUCBFVUMtSlAiCi0JZWNobyAiZXVjS1IgRVVDLUtSIgotCWVjaG8gImV1Y1RXIEVVQy1UVyIKLQllY2hvICJHQksgR0JLIgotCWVjaG8gIktTQzU2MDEgQ1A5NDkiCi0JZWNobyAic2RlY2thbmppIEVVQy1KUCIKLQllY2hvICJTSklTIFNISUZUX0pJUyIKLQllY2hvICJUQUNUSVMgVElTLTYyMCIKLQllY2hvICJVVEYtOCBVVEYtOCIKLQk7OwotICAgIHNvbGFyaXMqKQotCWVjaG8gIjY0NiBBU0NJSSIKLQllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKLQllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKLQllY2hvICJJU084ODU5LTMgSVNPLTg4NTktMyIKLQllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKLQllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKLQllY2hvICJJU084ODU5LTYgSVNPLTg4NTktNiIKLQllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKLQllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKLQllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKLQllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgotCWVjaG8gImtvaTgtciBLT0k4LVIiCi0JZWNobyAiYW5zaS0xMjUxIENQMTI1MSIKLQllY2hvICJCSUc1IEJJRzUiCi0JZWNobyAiQmlnNS1IS1NDUyBCSUc1LUhLU0NTIgotCWVjaG8gImdiMjMxMiBHQjIzMTIiCi0JZWNobyAiR0JLIEdCSyIKLQllY2hvICJHQjE4MDMwIEdCMTgwMzAiCi0JZWNobyAiY25zMTE2NDMgRVVDLVRXIgotCWVjaG8gIjU2MDEgRVVDLUtSIgotCWVjaG8gImtvX0tSLmpvaGFwOTIgSk9IQUIiCi0JZWNobyAiZXVjSlAgRVVDLUpQIgotCWVjaG8gIlBDSyBTSElGVF9KSVMiCi0JZWNobyAiVElTNjIwLjI1MzMgVElTLTYyMCIKLQkjZWNobyAic3VuX2V1X2dyZWVrID8iICMgd2hhdCBpcyB0aGlzPwotCWVjaG8gIlVURi04IFVURi04IgotCTs7Ci0gICAgZnJlZWJzZCogfCBvczIqKQotCSMgRnJlZUJTRCA0LjIgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQkjIExpa2V3aXNlIGZvciBPUy8yLiBPUy8yIGhhcyBYRnJlZTg2IGp1c3QgbGlrZSBGcmVlQlNELiBKdXN0Ci0JIyByZXVzZSBGcmVlQlNEJ3MgbG9jYWxlIGRhdGEgZm9yIE9TLzIuCi0JZWNobyAiQyBBU0NJSSIKLQllY2hvICJVUy1BU0NJSSBBU0NJSSIKLQlmb3IgbCBpbiBsYV9MTiBsdF9MTjsgZG8KLQkgIGVjaG8gIiRsLkFTQ0lJIEFTQ0lJIgotCWRvbmUKLQlmb3IgbCBpbiBkYV9ESyBkZV9BVCBkZV9DSCBkZV9ERSBlbl9BVSBlbl9DQSBlbl9HQiBlbl9VUyBlc19FUyBcCi0JICAgICAgICAgZmlfRkkgZnJfQkUgZnJfQ0EgZnJfQ0ggZnJfRlIgaXNfSVMgaXRfQ0ggaXRfSVQgbGFfTE4gXAotCSAgICAgICAgIGx0X0xOIG5sX0JFIG5sX05MIG5vX05PIHB0X1BUIHN2X1NFOyBkbwotCSAgZWNobyAiJGwuSVNPXzg4NTktMSBJU08tODg1OS0xIgotCSAgZWNobyAiJGwuRElTXzg4NTktMTUgSVNPLTg4NTktMTUiCi0JZG9uZQotCWZvciBsIGluIGNzX0NaIGhyX0hSIGh1X0hVIGxhX0xOIGx0X0xOIHBsX1BMIHNsX1NJOyBkbwotCSAgZWNobyAiJGwuSVNPXzg4NTktMiBJU08tODg1OS0yIgotCWRvbmUKLQlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KLQkgIGVjaG8gIiRsLklTT184ODU5LTQgSVNPLTg4NTktNCIKLQlkb25lCi0JZm9yIGwgaW4gcnVfUlUgcnVfU1U7IGRvCi0JICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgotCSAgZWNobyAiJGwuSVNPXzg4NTktNSBJU08tODg1OS01IgotCSAgZWNobyAiJGwuQ1A4NjYgQ1A4NjYiCi0JZG9uZQotCWVjaG8gInVrX1VBLktPSTgtVSBLT0k4LVUiCi0JZWNobyAiemhfVFcuQklHNSBCSUc1IgotCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKLQllY2hvICJ6aF9DTi5FVUMgR0IyMzEyIgotCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCi0JZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCi0JZWNobyAiamFfSlAuU2hpZnRfSklTIFNISUZUX0pJUyIKLQllY2hvICJrb19LUi5FVUMgRVVDLUtSIgotCTs7Ci0gICAgbmV0YnNkKikKLQllY2hvICI2NDYgQVNDSUkiCi0JZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCi0JZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCi0JZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCi0JZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCi0JZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLQllY2hvICJldWNDTiBHQjIzMTIiCi0JZWNobyAiZXVjSlAgRVVDLUpQIgotCWVjaG8gImV1Y0tSIEVVQy1LUiIKLQllY2hvICJldWNUVyBFVUMtVFciCi0JZWNobyAiQklHNSBCSUc1IgotCWVjaG8gIlNKSVMgU0hJRlRfSklTIgotCTs7Ci0gICAgZGFyd2luKikKLQkjIERhcndpbiA2LjggZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQllY2hvICJDIEFTQ0lJIgotCWZvciBsIGluIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGxhX0xOOyBkbwotCSAgZWNobyAiJGwuVVMtQVNDSUkgQVNDSUkiCi0JZG9uZQotCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKLQkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBubF9CRSBcCi0JICAgICAgICAgbmxfTkwgbm9fTk8gcHRfUFQgc3ZfU0U7IGRvCi0JICBlY2hvICIkbCBJU08tODg1OS0xIgotCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCi0JICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgotCWRvbmUKLQlmb3IgbCBpbiBsYV9MTjsgZG8KLQkgIGVjaG8gIiRsLklTTzg4NTktMSBJU08tODg1OS0xIgotCSAgZWNobyAiJGwuSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLQlkb25lCi0JZm9yIGwgaW4gY3NfQ1ogaHJfSFIgaHVfSFUgbGFfTE4gcGxfUEwgc2xfU0k7IGRvCi0JICBlY2hvICIkbC5JU084ODU5LTIgSVNPLTg4NTktMiIKLQlkb25lCi0JZm9yIGwgaW4gbGFfTE4gbHRfTFQ7IGRvCi0JICBlY2hvICIkbC5JU084ODU5LTQgSVNPLTg4NTktNCIKLQlkb25lCi0JZm9yIGwgaW4gcnVfUlU7IGRvCi0JICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgotCSAgZWNobyAiJGwuSVNPODg1OS01IElTTy04ODU5LTUiCi0JICBlY2hvICIkbC5DUDg2NiBDUDg2NiIKLQlkb25lCi0JZm9yIGwgaW4gYmdfQkc7IGRvCi0JICBlY2hvICIkbC5DUDEyNTEgQ1AxMjUxIgotCWRvbmUKLQllY2hvICJ1a19VQS5LT0k4LVUgS09JOC1VIgotCWVjaG8gInpoX1RXLkJJRzUgQklHNSIKLQllY2hvICJ6aF9UVy5CaWc1IEJJRzUiCi0JZWNobyAiemhfQ04uRVVDIEdCMjMxMiIKLQllY2hvICJqYV9KUC5FVUMgRVVDLUpQIgotCWVjaG8gImphX0pQLlNKSVMgU0hJRlRfSklTIgotCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCi0JOzsKLSAgICBiZW9zKikKLQkjIEJlT1MgaGFzIGEgc2luZ2xlIGxvY2FsZSwgYW5kIGl0IGhhcyBVVEYtOCBlbmNvZGluZy4KLQllY2hvICIqIFVURi04IgotCTs7Ci0gICAgbXNkb3NkamdwcCopCi0JIyBESkdQUCAyLjAzIGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCi0JIyBsb2NhbGNoYXJzZXQuYyBmYWxscyBiYWNrIHRvIHVzaW5nIHRoZSBmdWxsIGxvY2FsZSBuYW1lCi0JIyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0JZWNobyAiIyIKLQllY2hvICIjIFRoZSBlbmNvZGluZ3MgZ2l2ZW4gaGVyZSBtYXkgbm90IGFsbCBiZSBjb3JyZWN0LiIKLQllY2hvICIjIElmIHlvdSBmaW5kIHRoYXQgdGhlIGVuY29kaW5nIGdpdmVuIGZvciB5b3VyIGxhbmd1YWdlIGFuZCIKLQllY2hvICIjIGNvdW50cnkgaXMgbm90IHRoZSBvbmUgeW91ciBET1MgbWFjaGluZSBhY3R1YWxseSB1c2VzLCBqdXN0IgotCWVjaG8gIiMgY29ycmVjdCBpdCBpbiB0aGlzIGZpbGUsIGFuZCBzZW5kIGEgbWFpbCB0byIKLQllY2hvICIjIEp1YW4gTWFudWVsIEd1ZXJyZXJvIDxzdDAwMTkwNkBocnoxLmhyei50dS1kYXJtc3RhZHQuZGU+IgotCWVjaG8gIiMgYW5kIEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4iCi0JZWNobyAiIyIKLQllY2hvICJDIEFTQ0lJIgotCSMgSVNPLTg4NTktMSBsYW5ndWFnZXMKLQllY2hvICJjYSBDUDg1MCIKLQllY2hvICJjYV9FUyBDUDg1MCIKLQllY2hvICJkYSBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJkYV9ESyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJkZSBDUDg1MCIKLQllY2hvICJkZV9BVCBDUDg1MCIKLQllY2hvICJkZV9DSCBDUDg1MCIKLQllY2hvICJkZV9ERSBDUDg1MCIKLQllY2hvICJlbiBDUDg1MCIKLQllY2hvICJlbl9BVSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJlbl9DQSBDUDg1MCIKLQllY2hvICJlbl9HQiBDUDg1MCIKLQllY2hvICJlbl9OWiBDUDQzNyIKLQllY2hvICJlbl9VUyBDUDQzNyIKLQllY2hvICJlbl9aQSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJlcyBDUDg1MCIKLQllY2hvICJlc19BUiBDUDg1MCIKLQllY2hvICJlc19CTyBDUDg1MCIKLQllY2hvICJlc19DTCBDUDg1MCIKLQllY2hvICJlc19DTyBDUDg1MCIKLQllY2hvICJlc19DUiBDUDg1MCIKLQllY2hvICJlc19DVSBDUDg1MCIKLQllY2hvICJlc19ETyBDUDg1MCIKLQllY2hvICJlc19FQyBDUDg1MCIKLQllY2hvICJlc19FUyBDUDg1MCIKLQllY2hvICJlc19HVCBDUDg1MCIKLQllY2hvICJlc19ITiBDUDg1MCIKLQllY2hvICJlc19NWCBDUDg1MCIKLQllY2hvICJlc19OSSBDUDg1MCIKLQllY2hvICJlc19QQSBDUDg1MCIKLQllY2hvICJlc19QWSBDUDg1MCIKLQllY2hvICJlc19QRSBDUDg1MCIKLQllY2hvICJlc19TViBDUDg1MCIKLQllY2hvICJlc19VWSBDUDg1MCIKLQllY2hvICJlc19WRSBDUDg1MCIKLQllY2hvICJldCBDUDg1MCIKLQllY2hvICJldF9FRSBDUDg1MCIKLQllY2hvICJldSBDUDg1MCIKLQllY2hvICJldV9FUyBDUDg1MCIKLQllY2hvICJmaSBDUDg1MCIKLQllY2hvICJmaV9GSSBDUDg1MCIKLQllY2hvICJmciBDUDg1MCIKLQllY2hvICJmcl9CRSBDUDg1MCIKLQllY2hvICJmcl9DQSBDUDg1MCIKLQllY2hvICJmcl9DSCBDUDg1MCIKLQllY2hvICJmcl9GUiBDUDg1MCIKLQllY2hvICJnYSBDUDg1MCIKLQllY2hvICJnYV9JRSBDUDg1MCIKLQllY2hvICJnZCBDUDg1MCIKLQllY2hvICJnZF9HQiBDUDg1MCIKLQllY2hvICJnbCBDUDg1MCIKLQllY2hvICJnbF9FUyBDUDg1MCIKLQllY2hvICJpZCBDUDg1MCIgICAgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJpZF9JRCBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJpcyBDUDg2MSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJpc19JUyBDUDg2MSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJpdCBDUDg1MCIKLQllY2hvICJpdF9DSCBDUDg1MCIKLQllY2hvICJpdF9JVCBDUDg1MCIKLQllY2hvICJsdCBDUDc3NSIKLQllY2hvICJsdF9MVCBDUDc3NSIKLQllY2hvICJsdiBDUDc3NSIKLQllY2hvICJsdl9MViBDUDc3NSIKLQllY2hvICJuYiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJuYl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJubCBDUDg1MCIKLQllY2hvICJubF9CRSBDUDg1MCIKLQllY2hvICJubF9OTCBDUDg1MCIKLQllY2hvICJubiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJubl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJubyBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJub19OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJwdCBDUDg1MCIKLQllY2hvICJwdF9CUiBDUDg1MCIKLQllY2hvICJwdF9QVCBDUDg1MCIKLQllY2hvICJzdiBDUDg1MCIKLQllY2hvICJzdl9TRSBDUDg1MCIKLQkjIElTTy04ODU5LTIgbGFuZ3VhZ2VzCi0JZWNobyAiY3MgQ1A4NTIiCi0JZWNobyAiY3NfQ1ogQ1A4NTIiCi0JZWNobyAiaHIgQ1A4NTIiCi0JZWNobyAiaHJfSFIgQ1A4NTIiCi0JZWNobyAiaHUgQ1A4NTIiCi0JZWNobyAiaHVfSFUgQ1A4NTIiCi0JZWNobyAicGwgQ1A4NTIiCi0JZWNobyAicGxfUEwgQ1A4NTIiCi0JZWNobyAicm8gQ1A4NTIiCi0JZWNobyAicm9fUk8gQ1A4NTIiCi0JZWNobyAic2sgQ1A4NTIiCi0JZWNobyAic2tfU0sgQ1A4NTIiCi0JZWNobyAic2wgQ1A4NTIiCi0JZWNobyAic2xfU0kgQ1A4NTIiCi0JZWNobyAic3EgQ1A4NTIiCi0JZWNobyAic3FfQUwgQ1A4NTIiCi0JZWNobyAic3IgQ1A4NTIiICAgICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KLQllY2hvICJzcl9DUyBDUDg1MiIgIyBDUDg1MiBvciBDUDg2NiBvciBDUDg1NSA/PwotCWVjaG8gInNyX1lVIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/Ci0JIyBJU08tODg1OS0zIGxhbmd1YWdlcwotCWVjaG8gIm10IENQODUwIgotCWVjaG8gIm10X01UIENQODUwIgotCSMgSVNPLTg4NTktNSBsYW5ndWFnZXMKLQllY2hvICJiZSBDUDg2NiIKLQllY2hvICJiZV9CRSBDUDg2NiIKLQllY2hvICJiZyBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJiZ19CRyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJtayBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJta19NSyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJydSBDUDg2NiIKLQllY2hvICJydV9SVSBDUDg2NiIKLQllY2hvICJ1ayBDUDExMjUiCi0JZWNobyAidWtfVUEgQ1AxMTI1IgotCSMgSVNPLTg4NTktNiBsYW5ndWFnZXMKLQllY2hvICJhciBDUDg2NCIKLQllY2hvICJhcl9BRSBDUDg2NCIKLQllY2hvICJhcl9EWiBDUDg2NCIKLQllY2hvICJhcl9FRyBDUDg2NCIKLQllY2hvICJhcl9JUSBDUDg2NCIKLQllY2hvICJhcl9JUiBDUDg2NCIKLQllY2hvICJhcl9KTyBDUDg2NCIKLQllY2hvICJhcl9LVyBDUDg2NCIKLQllY2hvICJhcl9NQSBDUDg2NCIKLQllY2hvICJhcl9PTSBDUDg2NCIKLQllY2hvICJhcl9RQSBDUDg2NCIKLQllY2hvICJhcl9TQSBDUDg2NCIKLQllY2hvICJhcl9TWSBDUDg2NCIKLQkjIElTTy04ODU5LTcgbGFuZ3VhZ2VzCi0JZWNobyAiZWwgQ1A4NjkiCi0JZWNobyAiZWxfR1IgQ1A4NjkiCi0JIyBJU08tODg1OS04IGxhbmd1YWdlcwotCWVjaG8gImhlIENQODYyIgotCWVjaG8gImhlX0lMIENQODYyIgotCSMgSVNPLTg4NTktOSBsYW5ndWFnZXMKLQllY2hvICJ0ciBDUDg1NyIKLQllY2hvICJ0cl9UUiBDUDg1NyIKLQkjIEphcGFuZXNlCi0JZWNobyAiamEgQ1A5MzIiCi0JZWNobyAiamFfSlAgQ1A5MzIiCi0JIyBDaGluZXNlCi0JZWNobyAiemhfQ04gR0JLIgotCWVjaG8gInpoX1RXIENQOTUwIiAjIG5vdCBDUDkzOCA/PwotCSMgS29yZWFuCi0JZWNobyAia3IgQ1A5NDkiICAgICMgbm90IENQOTM0ID8/Ci0JZWNobyAia3JfS1IgQ1A5NDkiICMgbm90IENQOTM0ID8/Ci0JIyBUaGFpCi0JZWNobyAidGggQ1A4NzQiCi0JZWNobyAidGhfVEggQ1A4NzQiCi0JIyBPdGhlcgotCWVjaG8gImVvIENQODUwIgotCWVjaG8gImVvX0VPIENQODUwIgotCTs7Ci1lc2FjCmRpZmYgLS1naXQgYS91bml4L2ludGwvZGNnZXR0ZXh0LmMgYi91bml4L2ludGwvZGNnZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MGFjZGUuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2RjZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAotIyBkZWZpbmUgRENJR0VUVEVYVCBfX2RjaWdldHRleHQKLSNlbHNlCi0jIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKLSMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotY2hhciAqCi1EQ0dFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkLCBpbnQgY2F0ZWdvcnkpCi17Ci0gIHJldHVybiBEQ0lHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTlVMTCwgMCwgMCwgY2F0ZWdvcnkpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotSU5UREVGKF9fZGNnZXR0ZXh0KQotd2Vha19hbGlhcyAoX19kY2dldHRleHQsIGRjZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9kY2lnZXR0ZXh0LmMgYi91bml4L2ludGwvZGNpZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTIzOGUyLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9kY2lnZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE5ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBkY2lnZXR0ZXh0IGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLS8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KLSAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQotICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotI2lmbmRlZiBfR05VX1NPVVJDRQotIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0jaWZuZGVmIF9fc2V0X2Vycm5vCi0jIGRlZmluZSBfX3NldF9lcnJubyh2YWwpIGVycm5vID0gKHZhbCkKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNpZmRlZiBfTElCQwotICAvKiBHdWVzcyB3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgc2lnbmFsIFNJR0ZQRS4KLSAgICAgU2V0IHRvIDEgb25seSBpZiB5b3Uga25vdyBmb3Igc3VyZS4gIEluIGNhc2Ugb2YgZG91YnQsIHNldCB0byAwLiAgKi8KLSMgaWYgZGVmaW5lZCBfX2FscGhhX18gfHwgZGVmaW5lZCBfX2FybV9fIHx8IGRlZmluZWQgX19pMzg2X18gXAotICAgICB8fCBkZWZpbmVkIF9fbTY4a19fIHx8IGRlZmluZWQgX19zMzkwX18KLSMgIGRlZmluZSBJTlRESVYwX1JBSVNFU19TSUdGUEUgMQotIyBlbHNlCi0jICBkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFIDAKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKLSMgaW5jbHVkZSA8c2lnbmFsLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgotCi0vKiBUaHJlYWQgc2FmZXR5bmVzcy4gICovCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLSNlbHNlCi0vKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCi0jIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsIE5BTUUpCi0jIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpCi0jIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkKLSMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLCBOQU1FKQotIyBkZWZpbmUgX19saWJjX3J3bG9ja19yZGxvY2soTkFNRSkKLSMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCi0jZW5kaWYKLQotLyogQWxpZ25tZW50IG9mIHR5cGVzLiAgKi8KLSNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKLSMgZGVmaW5lIGFsaWdub2YoVFlQRSkgX19hbGlnbm9mX18gKFRZUEUpCi0jZWxzZQotIyBkZWZpbmUgYWxpZ25vZihUWVBFKSBcCi0gICAgKChpbnQpICYoKHN0cnVjdCB7IGNoYXIgZHVtbXkxOyBUWVBFIGR1bW15MjsgfSAqKSAwKS0+ZHVtbXkyKQotI2VuZGlmCi0KLS8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKLSAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCi0gICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KLSNpZiAhZGVmaW5lZCBfTElCQwotIyBkZWZpbmUgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluCi0jIGRlZmluZSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4KLSMgZGVmaW5lIF9ubF9kZWZhdWx0X2Rpcm5hbWUgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWUKLSMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKLSNlbmRpZgotCi0vKiBTb21lIGNvbXBpbGVycywgbGlrZSBTdW5PUzQgY2MsIGRvbid0IGhhdmUgb2Zmc2V0b2YgaW4gPHN0ZGRlZi5oPi4gICovCi0jaWZuZGVmIG9mZnNldG9mCi0jIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKLSMgaWZuZGVmIHN0cGNweQotIyAgZGVmaW5lIHN0cGNweSBfX3N0cGNweQotIyBlbmRpZgotIyBkZWZpbmUgdGZpbmQgX190ZmluZAotI2Vsc2UKLSMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKLWNoYXIgKmdldHdkICgpOwotIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKLSMgZWxzZQotIyAgaWYgVk1TCi0jICAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgKGdldGN3ZCkgKGJ1ZiwgbWF4LCAwKQotIyAgZWxzZQotY2hhciAqZ2V0Y3dkICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOwotIyBlbmRpZgotIyBpZm5kZWYgSEFWRV9NRU1QQ1BZCi1zdGF0aWMgdm9pZCAqbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7Ci0jIGVuZGlmCi0jZW5kaWYKLQotLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KLSNkZWZpbmUgUEFUSF9JTkNSIDMyCi0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLwotLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCi0gICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKLSAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KLSNpZiBkZWZpbmVkIF9QT1NJWF9WRVJTSU9OIHx8IChkZWZpbmVkIEhBVkVfTElNSVRTX0ggJiYgIWRlZmluZWQgX19HTlVDX18pCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCi0jIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIFBBVEhfTUFYICYmIGRlZmluZWQgX1BDX1BBVEhfTUFYCi0jIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKLSNlbmRpZgotCi0vKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLwotI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCAmJiAhZGVmaW5lZCBQQVRIX01BWCAmJiAhZGVmaW5lZCBNQVhQQVRITEVOCi0jIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCBQQVRIX01BWCAmJiBkZWZpbmVkIE1BWFBBVEhMRU4KLSMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KLSNlbmRpZgotCi0jaWZuZGVmIFBBVEhfTUFYCi0jIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKLSNlbmRpZgotCi0vKiBQYXRobmFtZSBzdXBwb3J0LgotICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0gICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCi0gICBJU19QQVRIX1dJVEhfRElSKFApICB0ZXN0cyB3aGV0aGVyIFAgY29udGFpbnMgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KLSAqLwotI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCi0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQotIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCi0gICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAotICAgICAmJiAoUClbMV0gPT0gJzonKQotIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKLSMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgXAotICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCi0jZWxzZQotICAvKiBVbml4ICovCi0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQotIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCi0jIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgZm9yIHRoZSBzZWFyY2ggdHJlZSB3aGVyZSBrbm93biB0cmFuc2xhdGlvbnMKLSAgIGFyZSBzdG9yZWQuICAqLwotc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QKLXsKLSAgLyogRG9tYWluIGluIHdoaWNoIHRvIHNlYXJjaC4gICovCi0gIGNoYXIgKmRvbWFpbm5hbWU7Ci0KLSAgLyogVGhlIGNhdGVnb3J5LiAgKi8KLSAgaW50IGNhdGVnb3J5OwotCi0gIC8qIFN0YXRlIG9mIHRoZSBjYXRhbG9nIGNvdW50ZXIgYXQgdGhlIHBvaW50IHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KLSAgaW50IGNvdW50ZXI7Ci0KLSAgLyogQ2F0YWxvZyB3aGVyZSB0aGUgc3RyaW5nIHdhcyBmb3VuZC4gICovCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKLQotICAvKiBBbmQgZmluYWxseSB0aGUgdHJhbnNsYXRpb24uICAqLwotICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbjsKLSAgc2l6ZV90IHRyYW5zbGF0aW9uX2xlbmd0aDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gcXVlc3Rpb24uICAqLwotICBjaGFyIG1zZ2lkW1pFUk9dOwotfTsKLQotLyogUm9vdCBvZiB0aGUgc2VhcmNoIHRyZWUgd2l0aCBrbm93biB0cmFuc2xhdGlvbnMuICBXZSBjYW4gdXNlIHRoaXMKLSAgIG9ubHkgaWYgdGhlIHN5c3RlbSBwcm92aWRlcyB0aGUgYHRzZWFyY2gnIGZ1bmN0aW9uIGZhbWlseS4gICovCi0jaWYgZGVmaW5lZCBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzZWFyY2guaD4KLQotc3RhdGljIHZvaWQgKnJvb3Q7Ci0KLSMgaWZkZWYgX0xJQkMKLSMgIGRlZmluZSB0c2VhcmNoIF9fdHNlYXJjaAotIyBlbmRpZgotCi0vKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBrbm93biB0cmFuc2xhdGlvbnMuICAqLwotc3RhdGljIGludAotdHJhbnNjbXAgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnMxOwotICBjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqczI7Ci0gIGludCByZXN1bHQ7Ci0KLSAgczEgPSAoY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikgcDE7Ci0gIHMyID0gKGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIHAyOwotCi0gIHJlc3VsdCA9IHN0cmNtcCAoczEtPm1zZ2lkLCBzMi0+bXNnaWQpOwotICBpZiAocmVzdWx0ID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gc3RyY21wIChzMS0+ZG9tYWlubmFtZSwgczItPmRvbWFpbm5hbWUpOwotICAgICAgaWYgKHJlc3VsdCA9PSAwKQotCS8qIFdlIGNvbXBhcmUgdGhlIGNhdGVnb3J5IGxhc3QgKHRob3VnaCB0aGlzIGlzIHRoZSBjaGVhcGVzdAotCSAgIG9wZXJhdGlvbikgc2luY2UgaXQgaXMgaG9wZWZ1bGx5IGFsd2F5cyB0aGUgc2FtZSAobmFtZWx5Ci0JICAgTENfTUVTU0FHRVMpLiAgKi8KLQlyZXN1bHQgPSBzMS0+Y2F0ZWdvcnkgLSBzMi0+Y2F0ZWdvcnk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBJTlRWQVJERUYKLSMgZGVmaW5lIElOVFZBUkRFRihuYW1lKQotI2VuZGlmCi0jaWZuZGVmIElOVFVTRQotIyBkZWZpbmUgSU5UVVNFKG5hbWUpIG5hbWUKLSNlbmRpZgotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCi0gICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gYXR0cmlidXRlX2hpZGRlbiA9ICJtZXNzYWdlcyI7Ci0KLS8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KLWNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW4KLSAgICAgPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKLQotLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLwotI2lmIGRlZmluZWQgX19FTVhfXwotZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOwotI2Vsc2UKLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gTE9DQUxFRElSOwotSU5UVkFSREVGIChfbmxfZGVmYXVsdF9kaXJuYW1lKQotI2VuZGlmCi0KLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zIGNyZWF0ZWQgYnkgYmluZHRleHRkb21haW4oKQotICAgY2FsbHMuICAqLwotc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY2hhciAqcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgaW50IG4sCi0JCQkgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksCi0JCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCi0jIGRlZmluZSBjYXRlZ29yeV90b19uYW1lKGNhdGVnb3J5KQlfbmxfY2F0ZWdvcnlfbmFtZXNbY2F0ZWdvcnldCi0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKmNhdGVnb3J5X3RvX25hbWUgKGludCBjYXRlZ29yeSkgaW50ZXJuYWxfZnVuY3Rpb247Ci0jZW5kaWYKLQotCi0vKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0jaWZkZWYgSEFWRV9BTExPQ0EKLS8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLwotIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KLSNlbHNlCi1zdHJ1Y3QgYmxvY2tfbGlzdAotewotICB2b2lkICphZGRyZXNzOwotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKLX07Ci0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCi0gICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAotICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAotICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKLSAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKLSAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAotICAgICAgZnJlZSAob2xkLT5hZGRyZXNzKTsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQotI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCi0KLQotI2lmZGVmIF9MSUJDCi0vKiBMaXN0IG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIHRyYW5zbGF0aW9ucy4gICovCi10eXBlZGVmIHN0cnVjdCB0cmFuc21lbV9saXN0Ci17Ci0gIHN0cnVjdCB0cmFuc21lbV9saXN0ICpuZXh0OwotICBjaGFyIGRhdGFbWkVST107Ci19IHRyYW5zbWVtX2Jsb2NrX3Q7Ci1zdGF0aWMgc3RydWN0IHRyYW5zbWVtX2xpc3QgKnRyYW5zbWVtX2xpc3Q7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRyYW5zbWVtX2Jsb2NrX3Q7Ci0jZW5kaWYKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKLSNlbmRpZgotCi0vKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KLSNpZmRlZiBfTElCQwotX19saWJjX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKCwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKLSNlbmRpZgotCi0vKiBDaGVja2luZyB3aGV0aGVyIHRoZSBiaW5hcmllcyBydW5zIFNVSUQgbXVzdCBiZSBkb25lIGFuZCBnbGliYyBwcm92aWRlcwotICAgZWFzaWVyIG1ldGhvZHMgdGhlcmVmb3JlIHdlIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBFTkFCTEVfU0VDVVJFIF9fbGliY19lbmFibGVfc2VjdXJlCi0jIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFCi0jZWxzZQotIyBpZm5kZWYgSEFWRV9HRVRVSUQKLSMgIGRlZmluZSBnZXR1aWQoKSAwCi0jIGVuZGlmCi0jIGlmbmRlZiBIQVZFX0dFVEdJRAotIyAgZGVmaW5lIGdldGdpZCgpIDAKLSMgZW5kaWYKLSMgaWZuZGVmIEhBVkVfR0VURVVJRAotIyAgZGVmaW5lIGdldGV1aWQoKSBnZXR1aWQoKQotIyBlbmRpZgotIyBpZm5kZWYgSEFWRV9HRVRFR0lECi0jICBkZWZpbmUgZ2V0ZWdpZCgpIGdldGdpZCgpCi0jIGVuZGlmCi1zdGF0aWMgaW50IGVuYWJsZV9zZWN1cmU7Ci0jIGRlZmluZSBFTkFCTEVfU0VDVVJFIChlbmFibGVfc2VjdXJlID09IDEpCi0jIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFIFwKLSAgaWYgKGVuYWJsZV9zZWN1cmUgPT0gMCkJCQkJCQkgICAgICBcCi0gICAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAgIGlmIChnZXR1aWQgKCkgIT0gZ2V0ZXVpZCAoKSB8fCBnZXRnaWQgKCkgIT0gZ2V0ZWdpZCAoKSkJCSAgICAgIFwKLQllbmFibGVfc2VjdXJlID0gMTsJCQkJCQkgICAgICBcCi0gICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0JZW5hYmxlX3NlY3VyZSA9IC0xOwkJCQkJCSAgICAgIFwKLSAgICB9Ci0jZW5kaWYKLQotLyogR2V0IHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24uICAqLwotI2luY2x1ZGUgImV2YWwtcGx1cmFsLmgiCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgQ0FURUdPUlkgbG9jYWxlIGFuZCwgaWYgUExVUkFMIGlzIG5vbnplcm8sIHNlYXJjaCBvdmVyIHN0cmluZwotICAgZGVwZW5kaW5nIG9uIHRoZSBwbHVyYWwgZm9ybSBkZXRlcm1pbmVkIGJ5IE4uICAqLwotY2hhciAqCi1EQ0lHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKLQkgICAgaW50IHBsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgbiwgaW50IGNhdGVnb3J5KQotewotI2lmbmRlZiBIQVZFX0FMTE9DQQotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7Ci0jZW5kaWYKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOwotICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKLSAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOwotICBjb25zdCBjaGFyICpjYXRlZ29yeXZhbHVlOwotICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7Ci0gIGNoYXIgKnNpbmdsZV9sb2NhbGU7Ci0gIGNoYXIgKnJldHZhbDsKLSAgc2l6ZV90IHJldGxlbjsKLSAgaW50IHNhdmVkX2Vycm5vOwotI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKLSAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnNlYXJjaDsKLSAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKipmb3VuZHAgPSBOVUxMOwotICBzaXplX3QgbXNnaWRfbGVuOwotI2VuZGlmCi0gIHNpemVfdCBkb21haW5uYW1lX2xlbjsKLQotICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KLSAgaWYgKG1zZ2lkMSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0jaWZkZWYgX0xJQkMKLSAgaWYgKGNhdGVnb3J5IDwgMCB8fCBjYXRlZ29yeSA+PSBfX0xDX0xBU1QgfHwgY2F0ZWdvcnkgPT0gTENfQUxMKQotICAgIC8qIEJvZ3VzLiAgKi8KLSAgICByZXR1cm4gKHBsdXJhbCA9PSAwCi0JICAgID8gKGNoYXIgKikgbXNnaWQxCi0JICAgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLwotCSAgICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7Ci0jZW5kaWYKLQotICBfX2xpYmNfcndsb2NrX3JkbG9jayAoX25sX3N0YXRlX2xvY2spOwotCi0gIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKLSAgICAgQ0FURUdPUlkgaXMgbm90IExDX01FU1NBR0VTIHRoaXMgbWlnaHQgbm90IG1ha2UgbXVjaCBzZW5zZSBidXQgdGhlCi0gICAgIGRlZmluaXRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIC8qIE9TLzIgc3BlY2lmaWM6IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaWJpbnRsIHZlcnNpb25zICAqLwotI2lmZGVmIExDX01FU1NBR0VTX0NPTVBBVAotICBpZiAoY2F0ZWdvcnkgPT0gTENfTUVTU0FHRVNfQ09NUEFUKQotICAgIGNhdGVnb3J5ID0gTENfTUVTU0FHRVM7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKLSAgbXNnaWRfbGVuID0gc3RybGVuIChtc2dpZDEpICsgMTsKLQotICAvKiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gYW1vbmcgdGhvc2Ugd2hpY2ggd2UgZm91bmQgYXQKLSAgICAgc29tZSB0aW1lLiAgKi8KLSAgc2VhcmNoID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopCi0JICAgYWxsb2NhIChvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKSArIG1zZ2lkX2xlbik7Ci0gIG1lbWNweSAoc2VhcmNoLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOwotICBzZWFyY2gtPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBkb21haW5uYW1lOwotICBzZWFyY2gtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0KLSAgZm91bmRwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqKSB0ZmluZCAoc2VhcmNoLCAmcm9vdCwgdHJhbnNjbXApOwotICBmcmVlYSAoc2VhcmNoKTsKLSAgaWYgKGZvdW5kcCAhPSBOVUxMICYmICgqZm91bmRwKS0+Y291bnRlciA9PSBfbmxfbXNnX2NhdF9jbnRyKQotICAgIHsKLSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KLSAgICAgIGlmIChwbHVyYWwpCi0JcmV0dmFsID0gcGx1cmFsX2xvb2t1cCAoKCpmb3VuZHApLT5kb21haW4sIG4sICgqZm91bmRwKS0+dHJhbnNsYXRpb24sCi0JCQkJKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGgpOwotICAgICAgZWxzZQotCXJldHZhbCA9IChjaGFyICopICgqZm91bmRwKS0+dHJhbnNsYXRpb247Ci0KLSAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0gICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFByZXNlcnZlIHRoZSBgZXJybm8nIHZhbHVlLiAgKi8KLSAgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQotICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgb3Igbm90LiAgKi8KLSAgREVURVJNSU5FX1NFQ1VSRTsKLQotICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLwotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKLSAgICBkaXJuYW1lID0gKGNoYXIgKikgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOwotICBlbHNlIGlmIChJU19BQlNPTFVURV9QQVRIIChiaW5kaW5nLT5kaXJuYW1lKSkKLSAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLwotICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7Ci0gICAgICBzaXplX3QgcGF0aF9tYXg7Ci0gICAgICBjaGFyICpyZXQ7Ci0KLSAgICAgIHBhdGhfbWF4ID0gKHVuc2lnbmVkIGludCkgUEFUSF9NQVg7Ci0gICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KLQotICAgICAgZm9yICg7OykKLQl7Ci0JICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLQkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7Ci0KLQkgIF9fc2V0X2Vycm5vICgwKTsKLQkgIHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpOwotCSAgaWYgKHJldCAhPSBOVUxMIHx8IGVycm5vICE9IEVSQU5HRSkKLQkgICAgYnJlYWs7Ci0KLQkgIHBhdGhfbWF4ICs9IHBhdGhfbWF4IC8gMjsKLQkgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKLQl9Ci0KLSAgICAgIGlmIChyZXQgPT0gTlVMTCkKLQkvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCi0JICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KLQlnb3RvIHJldHVybl91bnRyYW5zbGF0ZWQ7Ci0KLSAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KLSAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOwotICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOwotCi0gIGRvbWFpbm5hbWVfbGVuID0gc3RybGVuIChkb21haW5uYW1lKTsKLSAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQotCQkJCSArIGRvbWFpbm5hbWVfbGVuICsgNSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgeGRvbWFpbm5hbWUpOwotCi0gIHN0cGNweSAobWVtcGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAotCQkgIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuKSwKLQkgICIubW8iKTsKLQotICAvKiBDcmVhdGluZyB3b3JraW5nIGFyZWEuICAqLwotICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7Ci0KLQotICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKLSAgICAgZ290IGFuIG9yZGVyZWQgbGlzdCBvZiBsYW5ndWFnZXMgdG8gY29uc2lkZXIgZm9yIHRoZSB0cmFuc2xhdGlvbi4gICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIE1ha2UgQ0FURUdPUllWQUxVRSBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgKi8KLSAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCi0JKytjYXRlZ29yeXZhbHVlOwotICAgICAgaWYgKGNhdGVnb3J5dmFsdWVbMF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKLQkgICAgIG5vIHZhbGlkIGVudHJ5IGhhcyBiZWVuIGZvdW5kLiAgV2Ugc29sdmUgdGhpcyBzaXR1YXRpb24KLQkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCi0JICAgICB3aWxsIHRha2UgcGxhY2UuICAqLwotCSAgc2luZ2xlX2xvY2FsZVswXSA9ICdDJzsKLQkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7Ci0JICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gIT0gJzonKQotCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7Ci0JICAqY3AgPSAnXDAnOwotCi0JICAvKiBXaGVuIHRoaXMgaXMgYSBTVUlEIGJpbmFyeSB3ZSBtdXN0IG5vdCBhbGxvdyBhY2Nlc3NpbmcgZmlsZXMKLQkgICAgIG91dHNpZGUgdGhlIGRlZGljYXRlZCBkaXJlY3Rvcmllcy4gICovCi0JICBpZiAoRU5BQkxFX1NFQ1VSRSAmJiBJU19QQVRIX1dJVEhfRElSIChzaW5nbGVfbG9jYWxlKSkKLQkgICAgLyogSW5nb3JlIHRoaXMgZW50cnkuICAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCi0JIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCi0JICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKLQkgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkuICAqLwotICAgICAgZG9tYWluID0gX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBzaW5nbGVfbG9jYWxlLCB4ZG9tYWlubmFtZSwgYmluZGluZyk7Ci0KLSAgICAgIGlmIChkb21haW4gIT0gTlVMTCkKLQl7Ci0JICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbiwgYmluZGluZywgbXNnaWQxLCAmcmV0bGVuKTsKLQotCSAgaWYgKHJldHZhbCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGNudDsKLQotCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQkJewotCQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLT5zdWNjZXNzb3JbY250XSwgYmluZGluZywKLQkJCQkJIG1zZ2lkMSwgJnJldGxlbik7Ci0KLQkJICBpZiAocmV0dmFsICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGRvbWFpbiA9IGRvbWFpbi0+c3VjY2Vzc29yW2NudF07Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKHJldHZhbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogRm91bmQgdGhlIHRyYW5zbGF0aW9uIG9mIE1TR0lEMSBpbiBkb21haW4gRE9NQUlOOgotCQkgc3RhcnRpbmcgYXQgUkVUVkFMLCBSRVRMRU4gYnl0ZXMuICAqLwotCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSNpZiBkZWZpbmVkIEhBVkVfVFNFQVJDSCB8fCBkZWZpbmVkIF9MSUJDCi0JICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMKQotCQl7Ci0JCSAgLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIHNlYXJjaCB0cmVlLiAgKi8KLQkJICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqbmV3cDsKLQotCQkgIG5ld3AgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikKLQkJICAgIG1hbGxvYyAob2Zmc2V0b2YgKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90LCBtc2dpZCkKLQkJCSAgICArIG1zZ2lkX2xlbiArIGRvbWFpbm5hbWVfbGVuICsgMSk7Ci0JCSAgaWYgKG5ld3AgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgbmV3cC0+ZG9tYWlubmFtZSA9Ci0JCQltZW1wY3B5IChuZXdwLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOwotCQkgICAgICBtZW1jcHkgKG5ld3AtPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuICsgMSk7Ci0JCSAgICAgIG5ld3AtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCSAgICAgIG5ld3AtPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOwotCQkgICAgICBuZXdwLT5kb21haW4gPSBkb21haW47Ci0JCSAgICAgIG5ld3AtPnRyYW5zbGF0aW9uID0gcmV0dmFsOwotCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47Ci0KLQkJICAgICAgLyogSW5zZXJ0IHRoZSBlbnRyeSBpbiB0aGUgc2VhcmNoIHRyZWUuICAqLwotCQkgICAgICBmb3VuZHAgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKiopCi0JCQl0c2VhcmNoIChuZXdwLCAmcm9vdCwgdHJhbnNjbXApOwotCQkgICAgICBpZiAoZm91bmRwID09IE5VTEwKLQkJCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKmZvdW5kcCAhPSBuZXdwLCAwKSkKLQkJCS8qIFRoZSBpbnNlcnQgZmFpbGVkLiAgKi8KLQkJCWZyZWUgKG5ld3ApOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgY2FuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkuICAqLwotCQkgICgqZm91bmRwKS0+Y291bnRlciA9IF9ubF9tc2dfY2F0X2NudHI7Ci0JCSAgKCpmb3VuZHApLT5kb21haW4gPSBkb21haW47Ci0JCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbiA9IHJldHZhbDsKLQkJICAoKmZvdW5kcCktPnRyYW5zbGF0aW9uX2xlbmd0aCA9IHJldGxlbjsKLQkJfQotI2VuZGlmCi0JICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQotCSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KLQkgICAgICBpZiAocGx1cmFsKQotCQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwIChkb21haW4sIG4sIHJldHZhbCwgcmV0bGVuKTsKLQotCSAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0JICAgICAgcmV0dXJuIHJldHZhbDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSByZXR1cm5fdW50cmFuc2xhdGVkOgotICAvKiBSZXR1cm4gdGhlIHVudHJhbnNsYXRlZCBNU0dJRC4gICovCi0gIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLSNpZm5kZWYgX0xJQkMKLSAgaWYgKCFFTkFCTEVfU0VDVVJFKQotICAgIHsKLSAgICAgIGV4dGVybiB2b2lkIF9ubF9sb2dfdW50cmFuc2xhdGVkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwKLQkJCQkJY29uc3QgY2hhciAqZG9tYWlubmFtZSwKLQkJCQkJY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCi0JCQkJCWludCBwbHVyYWwpOwotICAgICAgY29uc3QgY2hhciAqbG9nZmlsZW5hbWUgPSBnZXRlbnYgKCJHRVRURVhUX0xPR19VTlRSQU5TTEFURUQiKTsKLQotICAgICAgaWYgKGxvZ2ZpbGVuYW1lICE9IE5VTEwgJiYgbG9nZmlsZW5hbWVbMF0gIT0gJ1wwJykKLQlfbmxfbG9nX3VudHJhbnNsYXRlZCAobG9nZmlsZW5hbWUsIGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBwbHVyYWwpOwotICAgIH0KLSNlbmRpZgotICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotICByZXR1cm4gKHBsdXJhbCA9PSAwCi0JICA/IChjaGFyICopIG1zZ2lkMQotCSAgLyogVXNlIHRoZSBHZXJtYW5pYyBwbHVyYWwgcnVsZS4gICovCi0JICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7Ci19Ci0KLQotY2hhciAqCi1pbnRlcm5hbF9mdW5jdGlvbgotX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLQkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywgY29uc3QgY2hhciAqbXNnaWQsCi0JICAgICAgc2l6ZV90ICpsZW5ndGhwKQotewotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICBzaXplX3QgYWN0OwotICBjaGFyICpyZXN1bHQ7Ci0gIHNpemVfdCByZXN1bHRsZW47Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkID09IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZyk7Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOwotCi0gIG5zdHJpbmdzID0gZG9tYWluLT5uc3RyaW5nczsKLQotICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLwotICBpZiAoZG9tYWluLT5oYXNoX3RhYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFVzZSB0aGUgaGFzaGluZyB0YWJsZS4gICovCi0gICAgICBubHNfdWludDMyIGxlbiA9IHN0cmxlbiAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7Ci0gICAgICBubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7Ci0gICAgICBubHNfdWludDMyIGluY3IgPSAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBubHNfdWludDMyIG5zdHIgPQotCSAgICBXIChkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKLQotCSAgaWYgKG5zdHIgPT0gMCkKLQkgICAgLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBuc3RyLS07Ci0KLQkgIC8qIENvbXBhcmUgbXNnaWQgd2l0aCB0aGUgb3JpZ2luYWwgc3RyaW5nIGF0IGluZGV4IG5zdHIuCi0JICAgICBXZSBjb21wYXJlIHRoZSBsZW5ndGhzIHdpdGggPj0sIG5vdCA9PSwgYmVjYXVzZSBwbHVyYWwgZW50cmllcwotCSAgICAgYXJlIHJlcHJlc2VudGVkIGJ5IHN0cmluZ3Mgd2l0aCBhbiBlbWJlZGRlZCBOVUwuICAqLwotCSAgaWYgKG5zdHIgPCBuc3RyaW5ncwotCSAgICAgID8gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ubGVuZ3RoKSA+PSBsZW4KLQkJJiYgKHN0cmNtcCAobXNnaWQsCi0JCQkgICAgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJCSAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ub2Zmc2V0KSkKLQkJICAgID09IDApCi0JICAgICAgOiBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLmxlbmd0aCA+IGxlbgotCQkmJiAoc3RyY21wIChtc2dpZCwKLQkJCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLnBvaW50ZXIpCi0JCSAgICA9PSAwKSkKLQkgICAgewotCSAgICAgIGFjdCA9IG5zdHI7Ci0JICAgICAgZ290byBmb3VuZDsKLQkgICAgfQotCi0JICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKLQkgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKLQkgIGVsc2UKLQkgICAgaWR4ICs9IGluY3I7Ci0JfQotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQgYXJyYXkgb2YKLQkgbWVzc2FnZXMuICAqLwotICAgICAgc2l6ZV90IHRvcCwgYm90dG9tOwotCi0gICAgICBib3R0b20gPSAwOwotICAgICAgdG9wID0gbnN0cmluZ3M7Ci0gICAgICB3aGlsZSAoYm90dG9tIDwgdG9wKQotCXsKLQkgIGludCBjbXBfdmFsOwotCi0JICBhY3QgPSAoYm90dG9tICsgdG9wKSAvIDI7Ci0JICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgKGRvbWFpbi0+ZGF0YQotCQkJCSAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgZG9tYWluLT5vcmlnX3RhYlthY3RdLm9mZnNldCkpKTsKLQkgIGlmIChjbXBfdmFsIDwgMCkKLQkgICAgdG9wID0gYWN0OwotCSAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCi0JICAgIGJvdHRvbSA9IGFjdCArIDE7Ci0JICBlbHNlCi0JICAgIGdvdG8gZm91bmQ7Ci0JfQotICAgICAgLyogTm8gdHJhbnNsYXRpb24gd2FzIGZvdW5kLiAgKi8KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotIGZvdW5kOgotICAvKiBUaGUgdHJhbnNsYXRpb24gd2FzIGZvdW5kIGF0IGluZGV4IEFDVC4gIElmIHdlIGhhdmUgdG8gY29udmVydCB0aGUKLSAgICAgc3RyaW5nIHRvIHVzZSBhIGRpZmZlcmVudCBjaGFyYWN0ZXIgc2V0LCB0aGlzIGlzIHRoZSB0aW1lLiAgKi8KLSAgaWYgKGFjdCA8IG5zdHJpbmdzKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChjaGFyICopCi0JKGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYlthY3RdLm9mZnNldCkpOwotICAgICAgcmVzdWx0bGVuID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ubGVuZ3RoKSArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gKGNoYXIgKikgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5wb2ludGVyOwotICAgICAgcmVzdWx0bGVuID0gZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5sZW5ndGg7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX0lDT05WCi0gIGlmIChkb21haW4tPmNvZGVzZXRfY250cgotICAgICAgIT0gKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCA/IGRvbWFpbmJpbmRpbmctPmNvZGVzZXRfY250ciA6IDApKQotICAgIHsKLSAgICAgIC8qIFRoZSBkb21haW4ncyBjb2Rlc2V0IGhhcyBjaGFuZ2VkIHRocm91Z2ggYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKQotCSBzaW5jZSB0aGUgbWVzc2FnZSBjYXRhbG9nIHdhcyBpbml0aWFsaXplZCBvciBsYXN0IGFjY2Vzc2VkLiAgV2UKLQkgaGF2ZSB0byByZWluaXRpYWxpemUgdGhlIGNvbnZlcnRlci4gICovCi0gICAgICBfbmxfZnJlZV9kb21haW5fY29udiAoZG9tYWluKTsKLSAgICAgIF9ubF9pbml0X2RvbWFpbl9jb252IChkb21haW5fZmlsZSwgZG9tYWluLCBkb21haW5iaW5kaW5nKTsKLSAgICB9Ci0KLSAgaWYgKAotIyBpZmRlZiBfTElCQwotICAgICAgZG9tYWluLT5jb252ICE9IChfX2djb252X3QpIC0xCi0jIGVsc2UKLSMgIGlmIEhBVkVfSUNPTlYKLSAgICAgIGRvbWFpbi0+Y29udiAhPSAoaWNvbnZfdCkgLTEKLSMgIGVuZGlmCi0jIGVuZGlmCi0gICAgICApCi0gICAgewotICAgICAgLyogV2UgYXJlIHN1cHBvc2VkIHRvIGRvIGEgY29udmVyc2lvbi4gIEZpcnN0IGFsbG9jYXRlIGFuCi0JIGFwcHJvcHJpYXRlIHRhYmxlIHdpdGggdGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZSB0YWJsZQotCSBvZiB0cmFuc2xhdGlvbnMgaW4gdGhlIGZpbGUsIHdoZXJlIHdlIGNhbiBwdXQgdGhlIHBvaW50ZXJzCi0JIHRvIHRoZSBjb252ZXJ0ZWQgc3RyaW5ncyBpbi4KLQkgVGhlcmUgaXMgYSBzbGlnaHQgY29tcGxpY2F0aW9uIHdpdGggcGx1cmFsIGVudHJpZXMuICBUaGV5Ci0JIGFyZSByZXByZXNlbnRlZCBieSBjb25zZWN1dGl2ZSBOVUwgdGVybWluYXRlZCBzdHJpbmdzLiAgV2UKLQkgaGFuZGxlIHRoaXMgY2FzZSBieSBjb252ZXJ0aW5nIFJFU1VMVExFTiBieXRlcywgaW5jbHVkaW5nCi0JIE5VTHMuICAqLwotCi0gICAgICBpZiAoZG9tYWluLT5jb252X3RhYiA9PSBOVUxMCi0JICAmJiAoKGRvbWFpbi0+Y29udl90YWIgPQotCQkgKGNoYXIgKiopIGNhbGxvYyAobnN0cmluZ3MgKyBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MsCi0JCQkJICAgc2l6ZW9mIChjaGFyICopKSkKLQkgICAgICA9PSBOVUxMKSkKLQkvKiBNYXJrIHRoYXQgd2UgZGlkbid0IHN1Y2NlZWQgYWxsb2NhdGluZyBhIHRhYmxlLiAgKi8KLQlkb21haW4tPmNvbnZfdGFiID0gKGNoYXIgKiopIC0xOwotCi0gICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoZG9tYWluLT5jb252X3RhYiA9PSAoY2hhciAqKikgLTEsIDApKQotCS8qIE5vdGhpbmcgd2UgY2FuIGRvLCBubyBtb3JlIG1lbW9yeS4gICovCi0JZ290byBjb252ZXJ0ZWQ7Ci0KLSAgICAgIGlmIChkb21haW4tPmNvbnZfdGFiW2FjdF0gPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBoYXZlbid0IHVzZWQgdGhpcyBzdHJpbmcgc28gZmFyLCBzbyBpdCBpcyBub3QKLQkgICAgIHRyYW5zbGF0ZWQgeWV0LiAgRG8gdGhpcyBub3cuICAqLwotCSAgLyogV2UgdXNlIGEgYml0IG1vcmUgZWZmaWNpZW50IG1lbW9yeSBoYW5kbGluZy4KLQkgICAgIFdlIGFsbG9jYXRlIGFsd2F5cyBsYXJnZXIgYmxvY2tzIHdoaWNoIGdldCB1c2VkIG92ZXIKLQkgICAgIHRpbWUuICBUaGlzIGlzIGZhc3RlciB0aGFuIG1hbnkgc21hbGwgYWxsb2NhdGlvbnMuICAgKi8KLQkgIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZCAoc3RhdGljLCBsb2NrKQotIyBkZWZpbmUgSU5JVElBTF9CTE9DS19TSVpFCTQwODAKLQkgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpmcmVlbWVtOwotCSAgc3RhdGljIHNpemVfdCBmcmVlbWVtX3NpemU7Ci0KLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmOwotCSAgdW5zaWduZWQgY2hhciAqb3V0YnVmOwotCSAgaW50IG1hbGxvY19jb3VudDsKLSMgaWZuZGVmIF9MSUJDCi0JICB0cmFuc21lbV9ibG9ja190ICp0cmFuc21lbV9saXN0ID0gTlVMTDsKLSMgZW5kaWYKLQotCSAgX19saWJjX2xvY2tfbG9jayAobG9jayk7Ci0KLQkgIGluYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcmVzdWx0OwotCSAgb3V0YnVmID0gZnJlZW1lbSArIHNpemVvZiAoc2l6ZV90KTsKLQotCSAgbWFsbG9jX2NvdW50ID0gMDsKLQkgIHdoaWxlICgxKQotCSAgICB7Ci0JICAgICAgdHJhbnNtZW1fYmxvY2tfdCAqbmV3bWVtOwotIyBpZmRlZiBfTElCQwotCSAgICAgIHNpemVfdCBub25fcmV2ZXJzaWJsZTsKLQkgICAgICBpbnQgcmVzOwotCi0JICAgICAgaWYgKGZyZWVtZW1fc2l6ZSA8IHNpemVvZiAoc2l6ZV90KSkKLQkJZ290byByZXNpemVfZnJlZW1lbTsKLQotCSAgICAgIHJlcyA9IF9fZ2NvbnYgKGRvbWFpbi0+Y29udiwKLQkJCSAgICAgJmluYnVmLCBpbmJ1ZiArIHJlc3VsdGxlbiwKLQkJCSAgICAgJm91dGJ1ZiwKLQkJCSAgICAgb3V0YnVmICsgZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpLAotCQkJICAgICAmbm9uX3JldmVyc2libGUpOwotCi0JICAgICAgaWYgKHJlcyA9PSBfX0dDT05WX09LIHx8IHJlcyA9PSBfX0dDT05WX0VNUFRZX0lOUFVUKQotCQlicmVhazsKLQotCSAgICAgIGlmIChyZXMgIT0gX19HQ09OVl9GVUxMX09VVFBVVCkKLQkJewotCQkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0JCSAgZ290byBjb252ZXJ0ZWQ7Ci0JCX0KLQotCSAgICAgIGluYnVmID0gcmVzdWx0OwotIyBlbHNlCi0jICBpZiBIQVZFX0lDT05WCi0JICAgICAgY29uc3QgY2hhciAqaW5wdHIgPSAoY29uc3QgY2hhciAqKSBpbmJ1ZjsKLQkgICAgICBzaXplX3QgaW5sZWZ0ID0gcmVzdWx0bGVuOwotCSAgICAgIGNoYXIgKm91dHB0ciA9IChjaGFyICopIG91dGJ1ZjsKLQkgICAgICBzaXplX3Qgb3V0bGVmdDsKLQotCSAgICAgIGlmIChmcmVlbWVtX3NpemUgPCBzaXplb2YgKHNpemVfdCkpCi0JCWdvdG8gcmVzaXplX2ZyZWVtZW07Ci0KLQkgICAgICBvdXRsZWZ0ID0gZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpOwotCSAgICAgIGlmIChpY29udiAoZG9tYWluLT5jb252LAotCQkJIChJQ09OVl9DT05TVCBjaGFyICoqKSAmaW5wdHIsICZpbmxlZnQsCi0JCQkgJm91dHB0ciwgJm91dGxlZnQpCi0JCSAgIT0gKHNpemVfdCkgKC0xKSkKLQkJewotCQkgIG91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG91dHB0cjsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGlmIChlcnJubyAhPSBFMkJJRykKLQkJewotCQkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0JCSAgZ290byBjb252ZXJ0ZWQ7Ci0JCX0KLSMgIGVuZGlmCi0jIGVuZGlmCi0KLQkgICAgcmVzaXplX2ZyZWVtZW06Ci0JICAgICAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgb3IgcmVzaXplIHRoZSBvbGQgb25lLiAgKi8KLQkgICAgICBpZiAobWFsbG9jX2NvdW50ID4gMCkKLQkJewotCQkgICsrbWFsbG9jX2NvdW50OwotCQkgIGZyZWVtZW1fc2l6ZSA9IG1hbGxvY19jb3VudCAqIElOSVRJQUxfQkxPQ0tfU0laRTsKLQkJICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSByZWFsbG9jICh0cmFuc21lbV9saXN0LAotCQkJCQkJCSBmcmVlbWVtX3NpemUpOwotIyBpZmRlZiBfTElCQwotCQkgIGlmIChuZXdtZW0gIT0gTlVMTCkKLQkJICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IHRyYW5zbWVtX2xpc3QgKm9sZCA9IHRyYW5zbWVtX2xpc3Q7Ci0KLQkJICAgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7Ci0JCSAgICAgIGZyZWUgKG9sZCk7Ci0JCSAgICB9Ci0jIGVuZGlmCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYWxsb2NfY291bnQgPSAxOwotCQkgIGZyZWVtZW1fc2l6ZSA9IElOSVRJQUxfQkxPQ0tfU0laRTsKLQkJICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSBtYWxsb2MgKGZyZWVtZW1fc2l6ZSk7Ci0JCX0KLQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3bWVtID09IE5VTEwsIDApKQotCQl7Ci0JCSAgZnJlZW1lbSA9IE5VTEw7Ci0JCSAgZnJlZW1lbV9zaXplID0gMDsKLQkJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOwotCQkgIGdvdG8gY29udmVydGVkOwotCQl9Ci0KLSMgaWZkZWYgX0xJQkMKLQkgICAgICAvKiBBZGQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGJsb2NrcyB3ZSBoYXZlIHRvIGZyZWUKLSAgICAgICAgICAgICAgICAgYXQgc29tZSBwb2ludC4gICovCi0JICAgICAgbmV3bWVtLT5uZXh0ID0gdHJhbnNtZW1fbGlzdDsKLQkgICAgICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOwotCi0JICAgICAgZnJlZW1lbSA9IG5ld21lbS0+ZGF0YTsKLQkgICAgICBmcmVlbWVtX3NpemUgLT0gb2Zmc2V0b2YgKHN0cnVjdCB0cmFuc21lbV9saXN0LCBkYXRhKTsKLSMgZWxzZQotCSAgICAgIHRyYW5zbWVtX2xpc3QgPSBuZXdtZW07Ci0JICAgICAgZnJlZW1lbSA9IG5ld21lbTsKLSMgZW5kaWYKLQotCSAgICAgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7Ci0JICAgIH0KLQotCSAgLyogV2UgaGF2ZSBub3cgaW4gb3VyIGJ1ZmZlciBhIGNvbnZlcnRlZCBzdHJpbmcuICBQdXQgdGhpcwotCSAgICAgaW50byB0aGUgdGFibGUgb2YgY29udmVyc2lvbnMuICAqLwotCSAgKihzaXplX3QgKikgZnJlZW1lbSA9IG91dGJ1ZiAtIGZyZWVtZW0gLSBzaXplb2YgKHNpemVfdCk7Ci0JICBkb21haW4tPmNvbnZfdGFiW2FjdF0gPSAoY2hhciAqKSBmcmVlbWVtOwotCSAgLyogU2hyaW5rIGZyZWVtZW0sIGJ1dCBrZWVwIGl0IGFsaWduZWQuICAqLwotCSAgZnJlZW1lbV9zaXplIC09IG91dGJ1ZiAtIGZyZWVtZW07Ci0JICBmcmVlbWVtID0gb3V0YnVmOwotCSAgZnJlZW1lbSArPSBmcmVlbWVtX3NpemUgJiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOwotCSAgZnJlZW1lbV9zaXplID0gZnJlZW1lbV9zaXplICYgfiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOwotCi0JICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOwotCX0KLQotICAgICAgLyogTm93IGRvbWFpbi0+Y29udl90YWJbYWN0XSBjb250YWlucyB0aGUgdHJhbnNsYXRpb24gb2YgYWxsCi0JIHRoZSBwbHVyYWwgdmFyaWFudHMuICAqLwotICAgICAgcmVzdWx0ID0gZG9tYWluLT5jb252X3RhYlthY3RdICsgc2l6ZW9mIChzaXplX3QpOwotICAgICAgcmVzdWx0bGVuID0gKihzaXplX3QgKikgZG9tYWluLT5jb252X3RhYlthY3RdOwotICAgIH0KLQotIGNvbnZlcnRlZDoKLSAgLyogVGhlIHJlc3VsdCBzdHJpbmcgaXMgY29udmVydGVkLiAgKi8KLQotI2VuZGlmIC8qIF9MSUJDIHx8IEhBVkVfSUNPTlYgKi8KLQotICAqbGVuZ3RocCA9IHJlc3VsdGxlbjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBMb29rIHVwIGEgcGx1cmFsIHZhcmlhbnQuICAqLwotc3RhdGljIGNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLXBsdXJhbF9sb29rdXAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKLQkgICAgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCi17Ci0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW5kYXRhID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbi0+ZGF0YTsKLSAgdW5zaWduZWQgbG9uZyBpbnQgaW5kZXg7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0KLSAgaW5kZXggPSBwbHVyYWxfZXZhbCAoZG9tYWluZGF0YS0+cGx1cmFsLCBuKTsKLSAgaWYgKGluZGV4ID49IGRvbWFpbmRhdGEtPm5wbHVyYWxzKQotICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhbmQgdGhlCi0gICAgICAgZ2l2ZW4gbWF4aW11bSB2YWx1ZSBkbyBub3QgbWF0Y2guICAqLwotICAgIGluZGV4ID0gMDsKLQotICAvKiBTa2lwIElOREVYIHN0cmluZ3MgYXQgVFJBTlNMQVRJT04uICAqLwotICBwID0gdHJhbnNsYXRpb247Ci0gIHdoaWxlIChpbmRleC0tID4gMCkKLSAgICB7Ci0jaWZkZWYgX0xJQkMKLSAgICAgIHAgPSBfX3Jhd21lbWNociAocCwgJ1wwJyk7Ci0jZWxzZQotICAgICAgcCA9IHN0cmNociAocCwgJ1wwJyk7Ci0jZW5kaWYKLSAgICAgIC8qIEFuZCBza2lwIG92ZXIgdGhlIE5VTCBieXRlLiAgKi8KLSAgICAgIHArKzsKLQotICAgICAgaWYgKHAgPj0gdHJhbnNsYXRpb24gKyB0cmFuc2xhdGlvbl9sZW4pCi0JLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSXQgbWVhbnMgdGhlIHBsdXJhbCBleHByZXNzaW9uCi0JICAgZXZhbHVhdGVkIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB2YXJpYW50cwotCSAgIGF2YWlsYWJsZSBmb3IgTVNHSUQxLiAgKi8KLQlyZXR1cm4gKGNoYXIgKikgdHJhbnNsYXRpb247Ci0gICAgfQotICByZXR1cm4gKGNoYXIgKikgcDsKLX0KLQotI2lmbmRlZiBfTElCQwotLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGUgQ0FURUdPUlkuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLWNhdGVnb3J5X3RvX25hbWUgKGludCBjYXRlZ29yeSkKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gIHN3aXRjaCAoY2F0ZWdvcnkpCi0gIHsKLSNpZmRlZiBMQ19DT0xMQVRFCi0gIGNhc2UgTENfQ09MTEFURToKLSAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19DVFlQRQotICBjYXNlIExDX0NUWVBFOgotICAgIHJldHZhbCA9ICJMQ19DVFlQRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NT05FVEFSWQotICBjYXNlIExDX01PTkVUQVJZOgotICAgIHJldHZhbCA9ICJMQ19NT05FVEFSWSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19OVU1FUklDCi0gIGNhc2UgTENfTlVNRVJJQzoKLSAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19USU1FCi0gIGNhc2UgTENfVElNRToKLSAgICByZXR2YWwgPSAiTENfVElNRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NRVNTQUdFUwotICBjYXNlIExDX01FU1NBR0VTOgotICAgIHJldHZhbCA9ICJMQ19NRVNTQUdFUyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19SRVNQT05TRQotICBjYXNlIExDX1JFU1BPTlNFOgotICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19BTEwKLSAgY2FzZSBMQ19BTEw6Ci0gICAgLyogVGhpcyBtaWdodCBub3QgbWFrZSBzZW5zZSBidXQgaXMgcGVyaGFwcyBiZXR0ZXIgdGhhbiBhbnkgb3RoZXIKLSAgICAgICB2YWx1ZS4gICovCi0gICAgcmV0dmFsID0gIkxDX0FMTCI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICAvKiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGZvciBhIGRlZmF1bHQgdmFsdWUgbGV0IG1lIGtub3cuICAqLwotICAgIHJldHZhbCA9ICJMQ19YWFgiOwotICB9Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgotCi0vKiBHdWVzcyB2YWx1ZSBvZiBjdXJyZW50IGxvY2FsZSBmcm9tIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLWd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKLXsKLSAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAotICAgICB2YXJpYWJsZS4gIEJ1dCB3ZSBkb24ndCB1c2UgdGhlIHZhbHVlIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgICAgbG9jYWxlIGlzIHRoZSBDIGxvY2FsZS4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLSAgbGFuZ3VhZ2UgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOwotICBpZiAobGFuZ3VhZ2UgIT0gTlVMTCAmJiBsYW5ndWFnZVswXSA9PSAnXDAnKQotICAgIGxhbmd1YWdlID0gTlVMTDsKLQotICAvKiBXZSBoYXZlIHRvIHByb2NlZWQgd2l0aCB0aGUgUE9TSVggbWV0aG9kcyBvZiBsb29raW5nIHRvIGBMQ19BTEwnLAotICAgICBgTENfeHh4JywgYW5kIGBMQU5HJy4gIE9uIHNvbWUgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZQotICAgICBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLwotI2lmZGVmIF9MSUJDCi0gIHJldHZhbCA9IF9fY3VycmVudF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnkpOwotI2Vsc2UKLSAgcmV0dmFsID0gX25sX2xvY2FsZV9uYW1lIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKLSNlbmRpZgotCi0gIC8qIElnbm9yZSBMQU5HVUFHRSBpZiB0aGUgbG9jYWxlIGlzIHNldCB0byAiQyIgYmVjYXVzZQotICAgICAxLiAiQyIgbG9jYWxlIHVzdWFsbHkgdXNlcyB0aGUgQVNDSUkgZW5jb2RpbmcsIGFuZCBtb3N0IGludGVybmF0aW9uYWwKLQltZXNzYWdlcyB1c2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoZXNlIGNoYXJhY3RlcnMgZ2V0IGRpc3BsYXllZAotCWFzIHF1ZXN0aW9uIG1hcmtzIChpZiB1c2luZyBnbGliYydzIGljb252KCkpIG9yIGFzIGludmFsaWQgOC1iaXQKLQljaGFyYWN0ZXJzIChiZWNhdXNlIG90aGVyIGljb252KClzIHJlZnVzZSB0byBjb252ZXJ0IG1vc3Qgbm9uLUFTQ0lJCi0JY2hhcmFjdGVycyB0byBBU0NJSSkuIEluIGFueSBjYXNlLCB0aGUgb3V0cHV0IGlzIHVnbHkuCi0gICAgIDIuIFRoZSBwcmVjaXNlIG91dHB1dCBvZiBzb21lIHByb2dyYW1zIGluIHRoZSAiQyIgbG9jYWxlIGlzIHNwZWNpZmllZAotCWJ5IFBPU0lYIGFuZCBzaG91bGQgbm90IGRlcGVuZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbGlrZQotCSJMQU5HVUFHRSIuICBXZSBhbGxvdyBzdWNoIHByb2dyYW1zIHRvIHVzZSBnZXR0ZXh0KCkuICAqLwotICByZXR1cm4gbGFuZ3VhZ2UgIT0gTlVMTCAmJiBzdHJjbXAgKHJldHZhbCwgIkMiKSAhPSAwID8gbGFuZ3VhZ2UgOiByZXR2YWw7Ci19Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKLXsKLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotICAgIC8qIERvIG5vdGhpbmcuICovIDsKLSAgcmV0dXJuIGRlc3QgLSAxOwotfQotI2VuZGlmCi0KLSNpZiAhX0xJQkMgJiYgIUhBVkVfTUVNUENQWQotc3RhdGljIHZvaWQgKgotbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKLXsKLSAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgbikgKyBuKTsKLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBfTElCQwotLyogSWYgd2Ugd2FudCB0byBmcmVlIGFsbCByZXNvdXJjZXMgd2UgaGF2ZSB0byBkbyBzb21lIHdvcmsgYXQKLSAgIHByb2dyYW0ncyBlbmQuICAqLwotbGliY19mcmVlcmVzX2ZuIChmcmVlX21lbSkKLXsKLSAgdm9pZCAqb2xkOwotCi0gIHdoaWxlIChfbmxfZG9tYWluX2JpbmRpbmdzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRpbmcgKm9sZHAgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotICAgICAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IF9ubF9kb21haW5fYmluZGluZ3MtPm5leHQ7Ci0gICAgICBpZiAob2xkcC0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCi0JLyogWWVzLCB0aGlzIGlzIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KLQlmcmVlIChvbGRwLT5kaXJuYW1lKTsKLSAgICAgIGZyZWUgKG9sZHAtPmNvZGVzZXQpOwotICAgICAgZnJlZSAob2xkcCk7Ci0gICAgfQotCi0gIGlmIChfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKLSAgICAvKiBZZXMsIGFnYWluIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KLSAgICBmcmVlICgoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbik7Ci0KLSAgLyogUmVtb3ZlIHRoZSBzZWFyY2ggdHJlZSB3aXRoIHRoZSBrbm93biB0cmFuc2xhdGlvbnMuICAqLwotICBfX3RkZXN0cm95IChyb290LCBmcmVlKTsKLSAgcm9vdCA9IE5VTEw7Ci0KLSAgd2hpbGUgKHRyYW5zbWVtX2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBvbGQgPSB0cmFuc21lbV9saXN0OwotICAgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7Ci0gICAgICBmcmVlIChvbGQpOwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2RjbmdldHRleHQuYyBiL3VuaXgvaW50bC9kY25nZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTNlMDkuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2RjbmdldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY25nZXR0ZXh0KDMpIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKLSMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKLSMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotY2hhciAqCi1EQ05HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAotCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKLQkgICAgaW50IGNhdGVnb3J5KQotewotICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIDEsIG4sIGNhdGVnb3J5KTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGNuZ2V0dGV4dCwgZGNuZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9kZ2V0dGV4dC5jIGIvdW5peC9pbnRsL2RnZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGIwZjUuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2RnZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGdldHRleHQoMykgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAotIyBkZWZpbmUgRENHRVRURVhUIElOVFVTRShfX2RjZ2V0dGV4dCkKLSNlbHNlCi0jIGRlZmluZSBER0VUVEVYVCBsaWJpbnRsX2RnZXR0ZXh0Ci0jIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBvZiB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWNoYXIgKgotREdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkKQotewotICByZXR1cm4gRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19kZ2V0dGV4dCwgZGdldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvZG5nZXR0ZXh0LmMgYi91bml4L2ludGwvZG5nZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTU2MzcuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2RuZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotI2luY2x1ZGUgPGxvY2FsZS5oPgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBETkdFVFRFWFQgX19kbmdldHRleHQKLSMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgRE5HRVRURVhUIGxpYmludGxfZG5nZXR0ZXh0Ci0jIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUgYW5kIHNraXAgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIHBsdXJhbCBmb3JtLiAgKi8KLWNoYXIgKgotRE5HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAotCSAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQotewotICByZXR1cm4gRENOR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4sIExDX01FU1NBR0VTKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZG5nZXR0ZXh0LCBkbmdldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvZXZhbC1wbHVyYWwuaCBiL3VuaXgvaW50bC9ldmFsLXBsdXJhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWJkNWFmLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9ldmFsLXBsdXJhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIFBsdXJhbCBleHByZXNzaW9uIGV2YWx1YXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgU1RBVElDCi0jZGVmaW5lIFNUQVRJQyBzdGF0aWMKLSNlbmRpZgotCi0vKiBFdmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYW5kIHJldHVybiBhbiBpbmRleCB2YWx1ZS4gICovCi1TVEFUSUMKLXVuc2lnbmVkIGxvbmcgaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotcGx1cmFsX2V2YWwgKHN0cnVjdCBleHByZXNzaW9uICpwZXhwLCB1bnNpZ25lZCBsb25nIGludCBuKQotewotICBzd2l0Y2ggKHBleHAtPm5hcmdzKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBzd2l0Y2ggKHBleHAtPm9wZXJhdGlvbikKLQl7Ci0JY2FzZSB2YXI6Ci0JICByZXR1cm4gbjsKLQljYXNlIG51bToKLQkgIHJldHVybiBwZXhwLT52YWwubnVtOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICB7Ci0JLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgbG5vdC4gICovCi0JdW5zaWduZWQgbG9uZyBpbnQgYXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKLQlyZXR1cm4gISBhcmc7Ci0gICAgICB9Ci0gICAgY2FzZSAyOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgaW50IGxlZnRhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOwotCWlmIChwZXhwLT5vcGVyYXRpb24gPT0gbG9yKQotCSAgcmV0dXJuIGxlZnRhcmcgfHwgcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKLQllbHNlIGlmIChwZXhwLT5vcGVyYXRpb24gPT0gbGFuZCkKLQkgIHJldHVybiBsZWZ0YXJnICYmIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7Ci0JZWxzZQotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGludCByaWdodGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7Ci0KLQkgICAgc3dpdGNoIChwZXhwLT5vcGVyYXRpb24pCi0JICAgICAgewotCSAgICAgIGNhc2UgbXVsdDoKLQkJcmV0dXJuIGxlZnRhcmcgKiByaWdodGFyZzsKLQkgICAgICBjYXNlIGRpdmlkZToKLSNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCi0JCWlmIChyaWdodGFyZyA9PSAwKQotCQkgIHJhaXNlIChTSUdGUEUpOwotI2VuZGlmCi0JCXJldHVybiBsZWZ0YXJnIC8gcmlnaHRhcmc7Ci0JICAgICAgY2FzZSBtb2R1bGU6Ci0jaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQotCQlpZiAocmlnaHRhcmcgPT0gMCkKLQkJICByYWlzZSAoU0lHRlBFKTsKLSNlbmRpZgotCQlyZXR1cm4gbGVmdGFyZyAlIHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgcGx1czoKLQkJcmV0dXJuIGxlZnRhcmcgKyByaWdodGFyZzsKLQkgICAgICBjYXNlIG1pbnVzOgotCQlyZXR1cm4gbGVmdGFyZyAtIHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgbGVzc190aGFuOgotCQlyZXR1cm4gbGVmdGFyZyA8IHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgZ3JlYXRlcl90aGFuOgotCQlyZXR1cm4gbGVmdGFyZyA+IHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgbGVzc19vcl9lcXVhbDoKLQkJcmV0dXJuIGxlZnRhcmcgPD0gcmlnaHRhcmc7Ci0JICAgICAgY2FzZSBncmVhdGVyX29yX2VxdWFsOgotCQlyZXR1cm4gbGVmdGFyZyA+PSByaWdodGFyZzsKLQkgICAgICBjYXNlIGVxdWFsOgotCQlyZXR1cm4gbGVmdGFyZyA9PSByaWdodGFyZzsKLQkgICAgICBjYXNlIG5vdF9lcXVhbDoKLQkJcmV0dXJuIGxlZnRhcmcgIT0gcmlnaHRhcmc7Ci0JICAgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCS8qIE5PVFJFQUNIRUQgKi8KLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIDM6Ci0gICAgICB7Ci0JLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgcW1vcC4gICovCi0JdW5zaWduZWQgbG9uZyBpbnQgYm9vbGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7Ci0JcmV0dXJuIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1tib29sYXJnID8gMSA6IDJdLCBuKTsKLSAgICAgIH0KLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS91bml4L2ludGwvZXhwbG9kZW5hbWUuYyBiL3VuaXgvaW50bC9leHBsb2RlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmMyNWU3Li4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9leHBsb2RlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLSNpZm5kZWYgTlVMTAotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotY2hhciAqCi1fbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgd2hpbGUgKG5hbWVbMF0gIT0gJ1wwJyAmJiBuYW1lWzBdICE9ICdfJyAmJiBuYW1lWzBdICE9ICdAJwotCSAmJiBuYW1lWzBdICE9ICcrJyAmJiBuYW1lWzBdICE9ICcsJykKLSAgICArK25hbWU7Ci0KLSAgcmV0dXJuIChjaGFyICopIG5hbWU7Ci19Ci0KLQotaW50Ci1fbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLAotCQkgIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwgY29uc3QgY2hhciAqKm1vZGlmaWVyLAotCQkgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAotCQkgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsIGNvbnN0IGNoYXIgKipzcGVjaWFsLAotCQkgIGNvbnN0IGNoYXIgKipzcG9uc29yLCBjb25zdCBjaGFyICoqcmV2aXNpb24pCi17Ci0gIGVudW0geyB1bmRlY2lkZWQsIHhwZywgY2VuIH0gc3ludGF4OwotICBjaGFyICpjcDsKLSAgaW50IG1hc2s7Ci0KLSAgKm1vZGlmaWVyID0gTlVMTDsKLSAgKnRlcnJpdG9yeSA9IE5VTEw7Ci0gICpjb2Rlc2V0ID0gTlVMTDsKLSAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IE5VTEw7Ci0gICpzcGVjaWFsID0gTlVMTDsKLSAgKnNwb25zb3IgPSBOVUxMOwotICAqcmV2aXNpb24gPSBOVUxMOwotCi0gIC8qIE5vdyB3ZSBkZXRlcm1pbmUgdGhlIHNpbmdsZSBwYXJ0cyBvZiB0aGUgbG9jYWxlIG5hbWUuICBGaXJzdAotICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycgYW5kIGBAJyBpZgotICAgICB3ZSB1c2UgWFBHNCBzdHlsZSwgYW5kIGBfJywgYCsnLCBhbmQgYCwnIGlmIHdlIHVzZSBDRU4gc3ludGF4LiAgKi8KLSAgbWFzayA9IDA7Ci0gIHN5bnRheCA9IHVuZGVjaWRlZDsKLSAgKmxhbmd1YWdlID0gY3AgPSBuYW1lOwotICBjcCA9IF9ubF9maW5kX2xhbmd1YWdlICgqbGFuZ3VhZ2UpOwotCi0gIGlmICgqbGFuZ3VhZ2UgPT0gY3ApCi0gICAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlOiBsYW5ndWFnZSBoYXMgdG8gYmUgc3BlY2lmaWVkLiAgVXNlCi0gICAgICAgdGhpcyBlbnRyeSBhcyBpdCBpcyB3aXRob3V0IGV4cGxvZGluZy4gIFBlcmhhcHMgaXQgaXMgYW4gYWxpYXMuICAqLwotICAgIGNwID0gc3RyY2hyICgqbGFuZ3VhZ2UsICdcMCcpOwotICBlbHNlIGlmIChjcFswXSA9PSAnXycpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgdGVycml0b3J5LiAgKi8KLSAgICAgIGNwWzBdID0gJ1wwJzsKLSAgICAgICp0ZXJyaXRvcnkgPSArK2NwOwotCi0gICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLicgJiYgY3BbMF0gIT0gJ0AnCi0JICAgICAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkrK2NwOwotCi0gICAgICBtYXNrIHw9IFRFUlJJVE9SWTsKLQotICAgICAgaWYgKGNwWzBdID09ICcuJykKLQl7Ci0JICAvKiBOZXh0IGlzIHRoZSBjb2Rlc2V0LiAgKi8KLQkgIHN5bnRheCA9IHhwZzsKLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpjb2Rlc2V0ID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ0AnKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IFhQR19DT0RFU0VUOwotCi0JICBpZiAoKmNvZGVzZXQgIT0gY3AgJiYgKCpjb2Rlc2V0KVswXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IF9ubF9ub3JtYWxpemVfY29kZXNldCAoKmNvZGVzZXQsCi0JCQkJCQkJICAgY3AgLSAqY29kZXNldCk7Ci0JICAgICAgaWYgKHN0cmNtcCAoKmNvZGVzZXQsICpub3JtYWxpemVkX2NvZGVzZXQpID09IDApCi0JCWZyZWUgKChjaGFyICopICpub3JtYWxpemVkX2NvZGVzZXQpOwotCSAgICAgIGVsc2UKLQkJbWFzayB8PSBYUEdfTk9STV9DT0RFU0VUOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoY3BbMF0gPT0gJ0AnIHx8IChzeW50YXggIT0geHBnICYmIGNwWzBdID09ICcrJykpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgbW9kaWZpZXIuICAqLwotICAgICAgc3ludGF4ID0gY3BbMF0gPT0gJ0AnID8geHBnIDogY2VuOwotICAgICAgY3BbMF0gPSAnXDAnOwotICAgICAgKm1vZGlmaWVyID0gKytjcDsKLQotICAgICAgd2hpbGUgKHN5bnRheCA9PSBjZW4gJiYgY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnKycKLQkgICAgICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JKytjcDsKLQotICAgICAgbWFzayB8PSBYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0U7Ci0gICAgfQotCi0gIGlmIChzeW50YXggIT0geHBnICYmIChjcFswXSA9PSAnKycgfHwgY3BbMF0gPT0gJywnIHx8IGNwWzBdID09ICdfJykpCi0gICAgewotICAgICAgc3ludGF4ID0gY2VuOwotCi0gICAgICBpZiAoY3BbMF0gPT0gJysnKQotCXsKLSAJICAvKiBOZXh0IGlzIHNwZWNpYWwgYXBwbGljYXRpb24gKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpzcGVjaWFsID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBDRU5fU1BFQ0lBTDsKLQl9Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnLCcpCi0JewotIAkgIC8qIE5leHQgaXMgc3BvbnNvciAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnNwb25zb3IgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1NQT05TT1I7Ci0JfQotCi0gICAgICBpZiAoY3BbMF0gPT0gJ18nKQotCXsKLSAJICAvKiBOZXh0IGlzIHJldmlzaW9uIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqcmV2aXNpb24gPSArK2NwOwotCi0JICBtYXNrIHw9IENFTl9SRVZJU0lPTjsKLQl9Ci0gICAgfQotCi0gIC8qIEZvciBDRU4gc3ludGF4IHZhbHVlcyBpdCBtaWdodCBiZSBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUKLSAgICAgc2VwYXJhdG9yIGNoYXJhY3RlciBpbiB0aGUgZmlsZSBuYW1lLCBub3QgZm9yIFhQRyBzeW50YXguICAqLwotICBpZiAoc3ludGF4ID09IHhwZykKLSAgICB7Ci0gICAgICBpZiAoKnRlcnJpdG9yeSAhPSBOVUxMICYmICgqdGVycml0b3J5KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflRFUlJJVE9SWTsKLQotICAgICAgaWYgKCpjb2Rlc2V0ICE9IE5VTEwgJiYgKCpjb2Rlc2V0KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflhQR19DT0RFU0VUOwotCi0gICAgICBpZiAoKm1vZGlmaWVyICE9IE5VTEwgJiYgKCptb2RpZmllcilbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5YUEdfTU9ESUZJRVI7Ci0gICAgfQotCi0gIHJldHVybiBtYXNrOwotfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2ZpbmRkb21haW4uYyBiL3VuaXgvaW50bC9maW5kZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTJhOGMuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2ZpbmRkb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0vKiBMaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMuICAqLwotc3RhdGljIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9sb2FkZWRfZG9tYWluczsKLQotCi0vKiBSZXR1cm4gYSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgZGVzY3JpYmVkIGJ5Ci0gICB0aGUgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkgcGFyYW1ldGVycyB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnRseQotICAgZXN0YWJsaXNoZWQgYmluZGluZ3MuICAqLwotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1pbnRlcm5hbF9mdW5jdGlvbgotX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpkaXJuYW1lLCBjaGFyICpsb2NhbGUsCi0JCSBjb25zdCBjaGFyICpkb21haW5uYW1lLCBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKLXsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwotICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgY29uc3QgY2hhciAqbW9kaWZpZXI7Ci0gIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKLSAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OwotICBjb25zdCBjaGFyICpzcGVjaWFsOwotICBjb25zdCBjaGFyICpzcG9uc29yOwotICBjb25zdCBjaGFyICpyZXZpc2lvbjsKLSAgY29uc3QgY2hhciAqYWxpYXNfdmFsdWU7Ci0gIGludCBtYXNrOwotCi0gIC8qIExPQ0FMRSBjYW4gY29uc2lzdCBvZiB1cCB0byBmb3VyIHJlY29nbml6ZWQgcGFydHMgZm9yIHRoZSBYUEcgc3ludGF4OgotCi0JCWxhbmd1YWdlW190ZXJyaXRvcnlbLmNvZGVzZXRdXVtAbW9kaWZpZXJdCi0KLSAgICAgYW5kIHNpeCBwYXJ0cyBmb3IgdGhlIENFTiBzeW50YXg6Ci0KLQlsYW5ndWFnZVtfdGVycml0b3J5XVsrYXVkaWVuY2VdWytzcGVjaWFsXVssW3Nwb25zb3JdW19yZXZpc2lvbl1dCi0KLSAgICAgQmVzaWRlIHRoZSBmaXJzdCBwYXJ0IGFsbCBvZiB0aGVtIGFyZSBhbGxvd2VkIHRvIGJlIG1pc3NpbmcuICBJZgotICAgICB0aGUgZnVsbCBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZCwgdGhlIGxlc3Mgc3BlY2lmaWMgb25lIGFyZQotICAgICBsb29rZWQgZm9yLiAgVGhlIHZhcmlvdXMgcGFydHMgd2lsbCBiZSBzdHJpcHBlZCBvZmYgYWNjb3JkaW5nIHRvCi0gICAgIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0JCSgxKSByZXZpc2lvbgotCQkoMikgc3BvbnNvcgotCQkoMykgc3BlY2lhbAotCQkoNCkgY29kZXNldAotCQkoNSkgbm9ybWFsaXplZCBjb2Rlc2V0Ci0JCSg2KSB0ZXJyaXRvcnkKLQkJKDcpIGF1ZGllbmNlL21vZGlmaWVyCi0gICAqLwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMgbG9jYWxlIGVudHJ5IHRoZXJlIGhhcyB0bwotICAgICBiZSBvbmUgZGF0YSBzZXQgaW4gdGhlIGxpc3Qgb2YgbG9hZGVkIGRvbWFpbnMuICAqLwotICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0JCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIDAsIGxvY2FsZSwgTlVMTCwgTlVMTCwKLQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkb21haW5uYW1lLCAwKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMgbG9jYWxlLiAgKi8KLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKLQlfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRhdGEgIT0gTlVMTCkKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JewotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKLQkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLCBkb21haW5iaW5kaW5nKTsKLQotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgcmV0dXJuIGNudCA+PSAwID8gcmV0dmFsIDogTlVMTDsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogU2VlIHdoZXRoZXIgdGhlIGxvY2FsZSB2YWx1ZSBpcyBhbiBhbGlhcy4gIElmIHllcyBpdHMgdmFsdWUKLSAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCi0gICAgIGRvbmUuICAqLwotICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7Ci0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotICAgIHsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIGxvY2FsZSA9IHN0cmR1cCAoYWxpYXNfdmFsdWUpOwotICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotI2Vsc2UKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7Ci0gICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobG9jYWxlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLSAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKLSAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCi0gIG1hc2sgPSBfbmxfZXhwbG9kZV9uYW1lIChsb2NhbGUsICZsYW5ndWFnZSwgJm1vZGlmaWVyLCAmdGVycml0b3J5LAotCQkJICAgJmNvZGVzZXQsICZub3JtYWxpemVkX2NvZGVzZXQsICZzcGVjaWFsLAotCQkJICAgJnNwb25zb3IsICZyZXZpc2lvbik7Ci0KLSAgLyogQ3JlYXRlIGFsbCBwb3NzaWJsZSBsb2NhbGUgZW50cmllcyB3aGljaCBtaWdodCBiZSBpbnRlcmVzdGVkIGluCi0gICAgIGdlbmVyYWxpemF0aW9uLiAgKi8KLSAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAotCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCBtYXNrLCBsYW5ndWFnZSwgdGVycml0b3J5LAotCQkJICAgICAgIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCQkgICAgICAgc3BvbnNvciwgcmV2aXNpb24sIGRvbWFpbm5hbWUsIDEpOwotICBpZiAocmV0dmFsID09IE5VTEwpCi0gICAgLyogVGhpcyBtZWFucyB3ZSBhcmUgb3V0IG9mIGNvcmUuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKLSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7Ci0gIGlmIChyZXR2YWwtPmRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgY250OwotICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCXsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCi0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSwgZG9tYWluYmluZGluZyk7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSByb29tIGZvciBhbiBhbGlhcyB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdCBub3cuICAqLwotICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKLSAgICBmcmVlIChsb2NhbGUpOwotCi0gIC8qIFRoZSBzcGFjZSBmb3Igbm9ybWFsaXplZF9jb2Rlc2V0IGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQuICAqLwotICBpZiAobWFzayAmIFhQR19OT1JNX0NPREVTRVQpCi0gICAgZnJlZSAoKHZvaWQgKikgbm9ybWFsaXplZF9jb2Rlc2V0KTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLSNpZmRlZiBfTElCQwotbGliY19mcmVlcmVzX2ZuIChmcmVlX21lbSkKLXsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcnVucCA9IF9ubF9sb2FkZWRfZG9tYWluczsKLQotICB3aGlsZSAocnVucCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmhlcmUgPSBydW5wOwotICAgICAgaWYgKHJ1bnAtPmRhdGEgIT0gTlVMTCkKLQlfbmxfdW5sb2FkX2RvbWFpbiAoKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIHJ1bnAtPmRhdGEpOwotICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7Ci0gICAgICBmcmVlICgoY2hhciAqKSBoZXJlLT5maWxlbmFtZSk7Ci0gICAgICBmcmVlIChoZXJlKTsKLSAgICB9Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9nZXR0ZXh0LmMgYi91bml4L2ludGwvZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmM0MmZhLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9nZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIF9fbmVlZF9OVUxMCi0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBKdXN0IGZvciBOVUxMLiAgKi8KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEdFVFRFWFQgX19nZXR0ZXh0Ci0jIGRlZmluZSBEQ0dFVFRFWFQgSU5UVVNFKF9fZGNnZXR0ZXh0KQotI2Vsc2UKLSMgZGVmaW5lIEdFVFRFWFQgbGliaW50bF9nZXR0ZXh0Ci0jIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWNoYXIgKgotR0VUVEVYVCAoY29uc3QgY2hhciAqbXNnaWQpCi17Ci0gIHJldHVybiBEQ0dFVFRFWFQgKE5VTEwsIG1zZ2lkLCBMQ19NRVNTQUdFUyk7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2dldHRleHQsIGdldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvZ2V0dGV4dC5oIGIvdW5peC9pbnRsL2dldHRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyNjJmNC4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvZ2V0dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogQ29udmVuaWVuY2UgaGVhZGVyIGZvciBjb25kaXRpb25hbCB1c2Ugb2YgR05VIDxsaWJpbnRsLmg+LgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQkdFVFRFWFRfSAotI2RlZmluZSBfTElCR0VUVEVYVF9IIDEKLQotLyogTkxTIGNhbiBiZSBkaXNhYmxlZCB0aHJvdWdoIHRoZSBjb25maWd1cmUgLS1kaXNhYmxlLW5scyBvcHRpb24uICAqLwotI2lmIEVOQUJMRV9OTFMKLQotLyogR2V0IGRlY2xhcmF0aW9ucyBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZ1bmN0aW9ucy4gICovCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLQotI2Vsc2UKLQotLyogU29sYXJpcyAvdXNyL2luY2x1ZGUvbG9jYWxlLmggaW5jbHVkZXMgL3Vzci9pbmNsdWRlL2xpYmludGwuaCwgd2hpY2gKLSAgIGNob2tlcyBpZiBkY2dldHRleHQgaXMgZGVmaW5lZCBhcyBhIG1hY3JvLiAgU28gaW5jbHVkZSBpdCBub3csIHRvIG1ha2UKLSAgIGxhdGVyIGluY2x1c2lvbnMgb2YgPGxvY2FsZS5oPiBhIE5PUC4gIFdlIGRvbid0IGluY2x1ZGUgPGxpYmludGwuaD4KLSAgIGFzIHdlbGwgYmVjYXVzZSBwZW9wbGUgdXNpbmcgImdldHRleHQuaCIgd2lsbCBub3QgaW5jbHVkZSA8bGliaW50bC5oPiwKLSAgIGFuZCBhbHNvIGluY2x1ZGluZyA8bGliaW50bC5oPiB3b3VsZCBmYWlsIG9uIFN1bk9TIDQsIHdoZXJlYXMgPGxvY2FsZS5oPgotICAgaXMgT0suICAqLwotI2lmIGRlZmluZWQoX19zdW4pCi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLS8qIERpc2FibGVkIE5MUy4KLSAgIFRoZSBjYXN0cyB0byAnY29uc3QgY2hhciAqJyBzZXJ2ZSB0aGUgcHVycG9zZSBvZiBwcm9kdWNpbmcgd2FybmluZ3MKLSAgIGZvciBpbnZhbGlkIHVzZXMgb2YgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlc2UgZnVuY3Rpb25zLgotICAgT24gcHJlLUFOU0kgc3lzdGVtcyB3aXRob3V0ICdjb25zdCcsIHRoZSBjb25maWcuaCBmaWxlIGlzIHN1cHBvc2VkIHRvCi0gICBjb250YWluICIjZGVmaW5lIGNvbnN0Ii4gICovCi0jIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpICgoY29uc3QgY2hhciAqKSAoTXNnaWQpKQotIyBkZWZpbmUgbmdldHRleHQoTXNnaWQxLCBNc2dpZDIsIE4pIFwKLSAgICAoKE4pID09IDEgPyAoY29uc3QgY2hhciAqKSAoTXNnaWQxKSA6IChjb25zdCBjaGFyICopIChNc2dpZDIpKQotIyBkZWZpbmUgZG5nZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkMSwgTXNnaWQyLCBOKSBcCi0gICAgKChOKSA9PSAxID8gKGNvbnN0IGNoYXIgKikgKE1zZ2lkMSkgOiAoY29uc3QgY2hhciAqKSAoTXNnaWQyKSkKLSMgZGVmaW5lIGRjbmdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQxLCBNc2dpZDIsIE4sIENhdGVnb3J5KSBcCi0gICAgKChOKSA9PSAxID8gKGNvbnN0IGNoYXIgKikgKE1zZ2lkMSkgOiAoY29uc3QgY2hhciAqKSAoTXNnaWQyKSkKLSMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgKChjb25zdCBjaGFyICopIChEb21haW5uYW1lKSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpICgoY29uc3QgY2hhciAqKSAoRGlybmFtZSkpCi0jIGRlZmluZSBiaW5kX3RleHRkb21haW5fY29kZXNldChEb21haW5uYW1lLCBDb2Rlc2V0KSAoKGNvbnN0IGNoYXIgKikgKENvZGVzZXQpKQotCi0jZW5kaWYKLQotLyogQSBwc2V1ZG8gZnVuY3Rpb24gY2FsbCB0aGF0IHNlcnZlcyBhcyBhIG1hcmtlciBmb3IgdGhlIGF1dG9tYXRlZAotICAgZXh0cmFjdGlvbiBvZiBtZXNzYWdlcywgYnV0IGRvZXMgbm90IGNhbGwgZ2V0dGV4dCgpLiAgVGhlIHJ1bi10aW1lCi0gICB0cmFuc2xhdGlvbiBpcyBkb25lIGF0IGEgZGlmZmVyZW50IHBsYWNlIGluIHRoZSBjb2RlLgotICAgVGhlIGFyZ3VtZW50LCBTdHJpbmcsIHNob3VsZCBiZSBhIGxpdGVyYWwgc3RyaW5nLiAgQ29uY2F0ZW5hdGVkIHN0cmluZ3MKLSAgIGFuZCBvdGhlciBzdHJpbmcgZXhwcmVzc2lvbnMgd29uJ3Qgd29yay4KLSAgIFRoZSBtYWNybydzIGV4cGFuc2lvbiBpcyBub3QgcGFyZW50aGVzaXplZCwgc28gdGhhdCBpdCBpcyBzdWl0YWJsZSBhcwotICAgaW5pdGlhbGl6ZXIgZm9yIHN0YXRpYyAnY2hhcltdJyBvciAnY29uc3QgY2hhcltdJyB2YXJpYWJsZXMuICAqLwotI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyaW5nKSBTdHJpbmcKLQotI2VuZGlmIC8qIF9MSUJHRVRURVhUX0ggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9nZXR0ZXh0UC5oIGIvdW5peC9pbnRsL2dldHRleHRQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjZjM2QuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2dldHRleHRQLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyogSGVhZGVyIGRlc2NyaWJpbmcgaW50ZXJuYWxzIG9mIGxpYmludGwgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfR0VUVEVYVFBfSAotI2RlZmluZSBfR0VUVEVYVFBfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+CQkvKiBHZXQgc2l6ZV90LiAgKi8KLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgIi4uL2ljb252L2djb252X2ludC5oIgotI2Vsc2UKLSMgaWYgSEFWRV9JQ09OVgotIyAgaW5jbHVkZSA8aWNvbnYuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotI2luY2x1ZGUgImdtby5oIgkJLyogR2V0IG5sc191aW50MzIuICAqLwotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCi0jIGRlZmluZSBhdHRyaWJ1dGVfaGlkZGVuCi0jZW5kaWYKLQotLyogVGVsbCB0aGUgY29tcGlsZXIgd2hlbiBhIGNvbmRpdGlvbmFsIG9yIGludGVnZXIgZXhwcmVzc2lvbiBpcwotICAgYWxtb3N0IGFsd2F5cyB0cnVlIG9yIGFsbW9zdCBhbHdheXMgZmFsc2UuICAqLwotI2lmbmRlZiBIQVZFX0JVSUxUSU5fRVhQRUNUCi0jIGRlZmluZSBfX2J1aWx0aW5fZXhwZWN0KGV4cHIsIHZhbCkgKGV4cHIpCi0jZW5kaWYKLQotI2lmbmRlZiBXCi0jIGRlZmluZSBXKGZsYWcsIGRhdGEpICgoZmxhZykgPyBTV0FQIChkYXRhKSA6IChkYXRhKSkKLSNlbmRpZgotCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxieXRlc3dhcC5oPgotIyBkZWZpbmUgU1dBUChpKSBic3dhcF8zMiAoaSkKLSNlbHNlCi1zdGF0aWMgaW5saW5lIG5sc191aW50MzIKLVNXQVAgKGkpCi0gICAgIG5sc191aW50MzIgaTsKLXsKLSAgcmV0dXJuIChpIDw8IDI0KSB8ICgoaSAmIDB4ZmYwMCkgPDwgOCkgfCAoKGkgPj4gOCkgJiAweGZmMDApIHwgKGkgPj4gMjQpOwotfQotI2VuZGlmCi0KLQotLyogSW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nLiAgKi8KLXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MKLXsKLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KLSAgc2l6ZV90IGxlbmd0aDsKLSAgLyogUG9pbnRlciB0byBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KLSAgY29uc3QgY2hhciAqcG9pbnRlcjsKLX07Ci0KLS8qIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLiAgKi8KLXN0cnVjdCBsb2FkZWRfZG9tYWluCi17Ci0gIC8qIFBvaW50ZXIgdG8gbWVtb3J5IGNvbnRhaW5pbmcgdGhlIC5tbyBmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqZGF0YTsKLSAgLyogMSBpZiB0aGUgbWVtb3J5IGlzIG1tYXAoKWVkLCAwIGlmIHRoZSBtZW1vcnkgaXMgbWFsbG9jKCllZC4gICovCi0gIGludCB1c2VfbW1hcDsKLSAgLyogU2l6ZSBvZiBtbWFwKCllZCBtZW1vcnkuICAqLwotICBzaXplX3QgbW1hcF9zaXplOwotICAvKiAxIGlmIHRoZSAubW8gZmlsZSB1c2VzIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MgdGhhbiB0aGlzIG1hY2hpbmUuICAqLwotICBpbnQgbXVzdF9zd2FwOwotICAvKiBQb2ludGVyIHRvIGFkZGl0aW9uYWwgbWFsbG9jKCllZCBtZW1vcnkuICAqLwotICB2b2lkICptYWxsb2NlZDsKLQotICAvKiBOdW1iZXIgb2Ygc3RhdGljIHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIG9yaWdpbmFsIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLwotICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOwotICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncyBpbiB0aGUgZmlsZS4gICovCi0gIGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOwotCi0gIC8qIE51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7Ci0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLwotICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICpvcmlnX3N5c2RlcF90YWI7Ci0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCi0gIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKnRyYW5zX3N5c2RlcF90YWI7Ci0KLSAgLyogU2l6ZSBvZiBoYXNoIHRhYmxlLiAgKi8KLSAgbmxzX3VpbnQzMiBoYXNoX3NpemU7Ci0gIC8qIFBvaW50ZXIgdG8gaGFzaCB0YWJsZS4gICovCi0gIGNvbnN0IG5sc191aW50MzIgKmhhc2hfdGFiOwotICAvKiAxIGlmIHRoZSBoYXNoIHRhYmxlIHVzZXMgYSBkaWZmZXJlbnQgZW5kaWFubmVzcyB0aGFuIHRoaXMgbWFjaGluZS4gICovCi0gIGludCBtdXN0X3N3YXBfaGFzaF90YWI7Ci0KLSAgaW50IGNvZGVzZXRfY250cjsKLSNpZmRlZiBfTElCQwotICBfX2djb252X3QgY29udjsKLSNlbHNlCi0jIGlmIEhBVkVfSUNPTlYKLSAgaWNvbnZfdCBjb252OwotIyBlbmRpZgotI2VuZGlmCi0gIGNoYXIgKipjb252X3RhYjsKLQotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcGx1cmFsOwotICB1bnNpZ25lZCBsb25nIGludCBucGx1cmFsczsKLX07Ci0KLS8qIFdlIHdhbnQgdG8gYWxsb2NhdGUgYSBzdHJpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0LiAgQnV0IElTTyBDCi0gICBkb2Vzbid0IGFsbG93IHplcm8gc2l6ZWQgYXJyYXlzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgWkVSTyAwCi0jZWxzZQotIyBkZWZpbmUgWkVSTyAxCi0jZW5kaWYKLQotLyogQSBzZXQgb2Ygc2V0dGluZ3MgYm91bmQgdG8gYSBtZXNzYWdlIGRvbWFpbi4gIFVzZWQgdG8gc3RvcmUgc2V0dGluZ3MKLSAgIGZyb20gYmluZHRleHRkb21haW4oKSBhbmQgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKS4gICovCi1zdHJ1Y3QgYmluZGluZwotewotICBzdHJ1Y3QgYmluZGluZyAqbmV4dDsKLSAgY2hhciAqZGlybmFtZTsKLSAgaW50IGNvZGVzZXRfY250cjsJLyogSW5jcmVtZW50ZWQgZWFjaCB0aW1lIGNvZGVzZXQgY2hhbmdlcy4gICovCi0gIGNoYXIgKmNvZGVzZXQ7Ci0gIGNoYXIgZG9tYWlubmFtZVtaRVJPXTsKLX07Ci0KLS8qIEEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgc29tZSBwcmV2aW91cyB0cmFuc2xhdGlvbnMKLSAgIGJlY29tZSBpbnZhbGlkLgotICAgVGhpcyB2YXJpYWJsZSBpcyBwYXJ0IG9mIHRoZSBleHRlcm5hbCBBQkkgb2YgdGhlIEdOVSBsaWJpbnRsLiAgKi8KLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQotI2lmbmRlZiBfTElCQwotY29uc3QgY2hhciAqX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSk7Ci0jZW5kaWYKLQotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpfX2Rpcm5hbWUsIGNoYXIgKl9fbG9jYWxlLAotCQkJCQkgY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCQkgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci12b2lkIF9ubF9sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW4sCi0JCSAgICAgIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotdm9pZCBfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLWNvbnN0IGNoYXIgKl9ubF9pbml0X2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbl9maWxlLAotCQkJCSAgc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluLAotCQkJCSAgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci12b2lkIF9ubF9mcmVlX2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqX19kb21haW4pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotCi1jaGFyICpfbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCQkgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcsIGNvbnN0IGNoYXIgKm1zZ2lkLAotCQkgICAgc2l6ZV90ICpsZW5ndGhwKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotI2lmZGVmIF9MSUJDCi1leHRlcm4gY2hhciAqX19nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKTsKLWV4dGVybiBjaGFyICpfX2RnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpOwotZXh0ZXJuIGNoYXIgKl9fZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkgIGludCBfX2NhdGVnb3J5KTsKLWV4dGVybiBjaGFyICpfX25nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0JCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uKTsKLWV4dGVybiBjaGFyICpfX2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0JCQkgIHVuc2lnbmVkIGxvbmcgaW50IG4pOwotZXh0ZXJuIGNoYXIgKl9fZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSk7Ci1leHRlcm4gY2hhciAqX19kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0JCQkgICBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKLQkJCSAgIGludCBfX2NhdGVnb3J5KTsKLWV4dGVybiBjaGFyICpfX3RleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSk7Ci1leHRlcm4gY2hhciAqX19iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7Ci1leHRlcm4gY2hhciAqX19iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCQljb25zdCBjaGFyICpfX2NvZGVzZXQpOwotI2Vsc2UKLS8qIERlY2xhcmUgdGhlIGV4cG9ydGVkIGxpYmludGxfKiBmdW5jdGlvbnMsIGluIGEgd2F5IHRoYXQgYWxsb3dzIHVzIHRvCi0gICBjYWxsIHRoZW0gdW5kZXIgdGhlaXIgcmVhbCBuYW1lLiAgKi8KLSMgdW5kZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0jIHVuZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLWV4dGVybiBjaGFyICpsaWJpbnRsX2RjaWdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJCSBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKLQkJCQkgaW50IF9fY2F0ZWdvcnkpOwotI2VuZGlmCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYgLyogZ2V0dGV4dFAuaCAgKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9nbW8uaCBiL3VuaXgvaW50bC9nbW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjOWNjMS4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvZ21vLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IGdlbmVyYWwgZmlsZSBsYXlvdXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVFRFWFRfSAotI2RlZmluZSBfR0VUVEVYVF9IIDEKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KLSNkZWZpbmUgX01BR0lDIDB4OTUwNDEyZGUKLSNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQotCi0vKiBSZXZpc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSB1c2VkIC5tbyAoYmluYXJ5KSBmaWxlIGZvcm1hdC4gICovCi0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCi0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUl9XSVRIX1NZU0RFUF9JIDEKLQotLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCi0gICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCi0gICBhbHRlcm5hdGl2ZSBhcHByb2FjaCBpcyB0byB1c2UgYXV0b2NvbmYncyBBQ19DSEVDS19TSVpFT0YgbWFjcm8sIGJ1dAotICAgYXMgb2YgdmVyc2lvbiBhdXRvY29uZi0yLjEzLCB0aGUgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvIGRvZXNuJ3Qgd29yawotICAgd2hlbiBjcm9zcy1jb21waWxpbmcuICAqLwotCi0jaWYgX19TVERDX18KLSMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgNDI5NDk2NzI5NVUKLSNlbHNlCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKLSNlbmRpZgotCi0vKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgotICAgVGhpcyBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBzeXN0ZW1zIEdOVSBjYXJlcyBhYm91dCBiZWNhdXNlCi0gICB0aGF0IGRvZXNuJ3QgaW5jbHVkZSAxNi1iaXQgc3lzdGVtcywgYW5kIG9ubHkgbW9kZXJuIHN5c3RlbXMKLSAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCi0KLSNpZm5kZWYgVUlOVF9NQVgKLSMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKLSNlbmRpZgotCi0jaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotdHlwZWRlZiB1bnNpZ25lZCBubHNfdWludDMyOwotI2Vsc2UKLSMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbmxzX3VpbnQzMjsKLSMgZWxzZQotIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBubHNfdWludDMyOwotIyAgZWxzZQotICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKLSAgICAgbm90IHBvcnRhYmxlIGVub3VnaC4gICovCi0gICJDYW5ub3QgZGV0ZXJtaW5lIHVuc2lnbmVkIDMyLWJpdCBkYXRhIHR5cGUuIgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0KLS8qIEhlYWRlciBmb3IgYmluYXJ5IC5tbyBmaWxlIGZvcm1hdC4gICovCi1zdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKLXsKLSAgLyogVGhlIG1hZ2ljIG51bWJlci4gICovCi0gIG5sc191aW50MzIgbWFnaWM7Ci0gIC8qIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0LiAgKi8KLSAgbmxzX3VpbnQzMiByZXZpc2lvbjsKLQotICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWFqb3IgcmV2aXNpb24gMCBvciAxLiAgKi8KLQotICAvKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIG9yaWdfdGFiX29mZnNldDsKLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGVkIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIHRyYW5zX3RhYl9vZmZzZXQ7Ci0gIC8qIFNpemUgb2YgaGFzaCB0YWJsZS4gICovCi0gIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKLSAgLyogT2Zmc2V0IG9mIGZpcnN0IGhhc2ggdGFibGUgZW50cnkuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKLQotICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWlub3IgcmV2aXNpb24gPj0gMS4gICovCi0KLSAgLyogVGhlIG51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KLSAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zZWdtZW50czsKLSAgLyogT2Zmc2V0IG9mIHRhYmxlIGRlc2NyaWJpbmcgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCi0gIG5sc191aW50MzIgc3lzZGVwX3NlZ21lbnRzX29mZnNldDsKLSAgLyogVGhlIG51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIG9yaWdfc3lzZGVwX3RhYl9vZmZzZXQ7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCi0gIG5sc191aW50MzIgdHJhbnNfc3lzZGVwX3RhYl9vZmZzZXQ7Ci19OwotCi0vKiBEZXNjcmlwdG9yIGZvciBzdGF0aWMgc3RyaW5nIGNvbnRhaW5lZCBpbiB0aGUgYmluYXJ5IC5tbyBmaWxlLiAgKi8KLXN0cnVjdCBzdHJpbmdfZGVzYwotewotICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgbm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KLSAgbmxzX3VpbnQzMiBsZW5ndGg7Ci0gIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCi0gIG5sc191aW50MzIgb2Zmc2V0OwotfTsKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1pbm9yIHJldmlzaW9uID49IDEuICAqLwotCi0vKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LiAgKi8KLXN0cnVjdCBzeXNkZXBfc2VnbWVudAotewotICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLwotICBubHNfdWludDMyIGxlbmd0aDsKLSAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KLSAgbmxzX3VpbnQzMiBvZmZzZXQ7Ci19OwotCi0vKiBEZXNjcmlwdG9yIGZvciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZy4gICovCi1zdHJ1Y3Qgc3lzZGVwX3N0cmluZwotewotICAvKiBPZmZzZXQgb2Ygc3RhdGljIHN0cmluZyBzZWdtZW50cyBpbiBmaWxlLiAgKi8KLSAgbmxzX3VpbnQzMiBvZmZzZXQ7Ci0gIC8qIEFsdGVybmF0aW5nIHNlcXVlbmNlIG9mIHN0YXRpYyBhbmQgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4KLSAgICAgVGhlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXRpYyBzZWdtZW50LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCi0gIHN0cnVjdCBzZWdtZW50X3BhaXIKLSAgewotICAgIC8qIFNpemUgb2Ygc3RhdGljIHNlZ21lbnQuICAqLwotICAgIG5sc191aW50MzIgc2Vnc2l6ZTsKLSAgICAvKiBSZWZlcmVuY2UgdG8gc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudCwgb3IgfjAgYXQgdGhlIGVuZC4gICovCi0gICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7Ci0gIH0gc2VnbWVudHNbMV07Ci19OwotCi0vKiBNYXJrZXIgZm9yIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnRzW10gYXJyYXkuICBUaGlzIGhhcyB0aGUgdmFsdWUgMHhGRkZGRkZGRiwKLSAgIHJlZ2FyZGxlc3Mgd2hldGhlciAnaW50JyBpcyAxNiBiaXQsIDMyIGJpdCwgb3IgNjQgYml0LiAgKi8KLSNkZWZpbmUgU0VHTUVOVFNfRU5EICgobmxzX3VpbnQzMikgfjApCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYJLyogZ2V0dGV4dC5oICAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2hhc2gtc3RyaW5nLmggYi91bml4L2ludGwvaGFzaC1zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzZTNiMS4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvaGFzaC1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIERlc2NyaXB0aW9uIG9mIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0OiBzdHJpbmcgaGFzaGluZyBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5Ny0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFdlIGFzc3VtZSB0byBoYXZlIGB1bnNpZ25lZCBsb25nIGludCcgdmFsdWUgd2l0aCBhdCBsZWFzdCAzMiBiaXRzLiAgKi8KLSNkZWZpbmUgSEFTSFdPUkRCSVRTIDMyCi0KLQotLyogRGVmaW5lcyB0aGUgc28gY2FsbGVkIGBoYXNocGp3JyBmdW5jdGlvbiBieSBQLkouIFdlaW5iZXJnZXIKLSAgIFtzZWUgQWhvL1NldGhpL1VsbG1hbiwgQ09NUElMRVJTOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzIGFuZCBUb29scywKLSAgIDE5ODYsIDE5ODcgQmVsbCBUZWxlcGhvbmUgTGFib3JhdG9yaWVzLCBJbmMuXSAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpbnQKLWhhc2hfc3RyaW5nIChjb25zdCBjaGFyICpzdHJfcGFyYW0pCi17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwsIGc7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9IHN0cl9wYXJhbTsKLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgKi8KLSAgaHZhbCA9IDA7Ci0gIHdoaWxlICgqc3RyICE9ICdcMCcpCi0gICAgewotICAgICAgaHZhbCA8PD0gNDsKLSAgICAgIGh2YWwgKz0gKHVuc2lnbmVkIGNoYXIpICpzdHIrKzsKLSAgICAgIGcgPSBodmFsICYgKCh1bnNpZ25lZCBsb25nIGludCkgMHhmIDw8IChIQVNIV09SREJJVFMgLSA0KSk7Ci0gICAgICBpZiAoZyAhPSAwKQotCXsKLQkgIGh2YWwgXj0gZyA+PiAoSEFTSFdPUkRCSVRTIC0gOCk7Ci0JICBodmFsIF49IGc7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGh2YWw7Ci19CmRpZmYgLS1naXQgYS91bml4L2ludGwvaW50bC1jb21wYXQuYyBiL3VuaXgvaW50bC9pbnRsLWNvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY5ZDk1Li4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9pbnRsLWNvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qIGludGwtY29tcGF0LmMgLSBTdHViIGZ1bmN0aW9ucyB0byBjYWxsIGdldHRleHQgZnVuY3Rpb25zIGZyb20gR05VIGdldHRleHQKLSAgIExpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDIwMDAtMjAwMyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBUaGlzIGZpbGUgcmVkaXJlY3RzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9ucyAod2l0aG91dCBwcmVmaXgpIHRvIHRob3NlCi0gICBkZWZpbmVkIGluIHRoZSBpbmNsdWRlZCBHTlUgbGliaW50bCBsaWJyYXJ5ICh3aXRoICJsaWJpbnRsXyIgcHJlZml4KS4KLSAgIEl0IGlzIGNvbXBpbGVkIGludG8gbGliaW50bCBpbiBvcmRlciB0byBtYWtlIHRoZSBBTV9HTlVfR0VUVEVYVCB0ZXN0Ci0gICBvZiBnZXR0ZXh0IDw9IDAuMTEuMiB3b3JrIHdpdGggdGhlIGxpYmludGwgbGlicmFyeSA+PSAwLjExLjMgd2hpY2gKLSAgIGhhcyB0aGUgcmVkaXJlY3Rpb25zIHByaW1hcmlseSBpbiB0aGUgPGxpYmludGwuaD4gaW5jbHVkZSBmaWxlLgotICAgSXQgaXMgYWxzbyBjb21waWxlZCBpbnRvIGxpYmdudWludGwgc28gdGhhdCBsaWJnbnVpbnRsLnNvIGNhbiBiZSB1c2VkCi0gICBhcyBMRF9QUkVMT0FEYWJsZSBsaWJyYXJ5IG9uIGdsaWJjIHN5c3RlbXMsIHRvIHByb3ZpZGUgdGhlIGV4dHJhCi0gICBmZWF0dXJlcyB0aGF0IHRoZSBmdW5jdGlvbnMgaW4gdGhlIGxpYmMgZG9uJ3QgaGF2ZSAobmFtZWx5LCBsb2dnaW5nKS4gICovCi0KLQotI3VuZGVmIGdldHRleHQKLSN1bmRlZiBkZ2V0dGV4dAotI3VuZGVmIGRjZ2V0dGV4dAotI3VuZGVmIG5nZXR0ZXh0Ci0jdW5kZWYgZG5nZXR0ZXh0Ci0jdW5kZWYgZGNuZ2V0dGV4dAotI3VuZGVmIHRleHRkb21haW4KLSN1bmRlZiBiaW5kdGV4dGRvbWFpbgotI3VuZGVmIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0Ci0KLQotLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQotICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKLSAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKLSMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNlbHNlCi0jIGRlZmluZSBETExfRVhQT1JURUQKLSNlbmRpZgotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1nZXR0ZXh0IChjb25zdCBjaGFyICptc2dpZCkKLXsKLSAgcmV0dXJuIGxpYmludGxfZ2V0dGV4dCAobXNnaWQpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1kZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQpCi17Ci0gIHJldHVybiBsaWJpbnRsX2RnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCk7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLWRjZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKLXsKLSAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1uZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCi17Ci0gIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChtc2dpZDEsIG1zZ2lkMiwgbik7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLWRuZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKLQkgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKLXsKLSAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbik7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLWRjbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0JICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuLAotCSAgICBpbnQgY2F0ZWdvcnkpCi17Ci0gIHJldHVybiBsaWJpbnRsX2RjbmdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBjYXRlZ29yeSk7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLXRleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCi17Ci0gIHJldHVybiBsaWJpbnRsX3RleHRkb21haW4gKGRvbWFpbm5hbWUpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSkKLXsKLSAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKLXsKLSAgcmV0dXJuIGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGRvbWFpbm5hbWUsIGNvZGVzZXQpOwotfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2wxMG5mbGlzdC5jIGIvdW5peC9pbnRsL2wxMG5mbGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk5NWFhLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9sMTBuZmxpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc3RwY3B5KCkuCi0gICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKLSAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9BUkdaX0gKLSMgaW5jbHVkZSA8YXJnei5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLwotI2lmbmRlZiBOVUxMCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBpZm5kZWYgc3RwY3B5Ci0jICBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQotIyBlbmRpZgotI2Vsc2UKLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFBhdGhuYW1lIHN1cHBvcnQuCi0gICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSAgIElTX0FCU09MVVRFX1BBVEgoUCkgIHRlc3RzIHdoZXRoZXIgUCBpcyBhbiBhYnNvbHV0ZSBwYXRoLiAgSWYgaXQgaXMgbm90LAotICAgICAgICAgICAgICAgICAgICAgICAgaXQgbWF5IGJlIGNvbmNhdGVuYXRlZCB0byBhIGRpcmVjdG9yeSBwYXRobmFtZS4KLSAqLwotI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCi0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQotIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCi0gICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAotICAgICAmJiAoUClbMV0gPT0gJzonKQotIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKLSNlbHNlCi0gIC8qIFVuaXggKi8KLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCi0jIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIElTU0xBU0ggKChQKVswXSkKLSNlbmRpZgotCi0vKiBEZWZpbmUgZnVuY3Rpb24gd2hpY2ggYXJlIHVzdWFsbHkgbm90IGF2YWlsYWJsZS4gICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9DT1VOVAotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCi1zdGF0aWMgc2l6ZV90Ci1hcmd6X2NvdW50X18gKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pCi17Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotIyB1bmRlZiBfX2FyZ3pfY291bnQKLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotI2Vsc2UKLSMgaWZkZWYgX0xJQkMKLSMgIGRlZmluZSBfX2FyZ3pfY291bnQoYXJneiwgbGVuKSBJTlRVU0UoX19hcmd6X2NvdW50KSAoYXJneiwgbGVuKQotIyBlbmRpZgotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfQ09VTlQgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQotLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncwotICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLwotc3RhdGljIHZvaWQKLWFyZ3pfc3RyaW5naWZ5X18gKGNoYXIgKmFyZ3osIHNpemVfdCBsZW4sIGludCBzZXApCi17Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuOwotICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKLSAgICAgIGlmIChsZW4gPiAwKQotCSphcmd6KysgPSBzZXA7Ci0gICAgfQotfQotIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5Ci0jIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBhcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKLSNlbHNlCi0jIGlmZGVmIF9MSUJDCi0jICBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgXAotICBJTlRVU0UoX19hcmd6X3N0cmluZ2lmeSkgKGFyZ3osIGxlbiwgc2VwKQotIyBlbmRpZgotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCi1zdGF0aWMgY2hhciAqCi1hcmd6X25leHRfXyAoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLCBjb25zdCBjaGFyICplbnRyeSkKLXsKLSAgaWYgKGVudHJ5KQotICAgIHsKLSAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKLSAgICAgICAgZW50cnkgPSBzdHJjaHIgKGVudHJ5LCAnXDAnKSArIDE7Ci0KLSAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7Ci0gICAgfQotICBlbHNlCi0gICAgaWYgKGFyZ3pfbGVuID4gMCkKLSAgICAgIHJldHVybiBhcmd6OwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotfQotIyB1bmRlZiBfX2FyZ3pfbmV4dAotIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9ORVhUICovCi0KLQotLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3AgKGludCB4KQotewotICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCi0gIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKLSAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOwotICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7Ci0gIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLQwKLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKLQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwKLQkJICAgIGludCBtYXNrLCBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAotCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAotCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKnNwZWNpYWwsCi0JCSAgICBjb25zdCBjaGFyICpzcG9uc29yLCBjb25zdCBjaGFyICpyZXZpc2lvbiwKLQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpCi17Ci0gIGNoYXIgKmFic19maWxlbmFtZTsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmxhc3RwOwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0gIGNoYXIgKmNwOwotICBzaXplX3QgZGlybGlzdF9jb3VudDsKLSAgc2l6ZV90IGVudHJpZXM7Ci0gIGludCBjbnQ7Ci0KLSAgLyogSWYgTEFOR1VBR0UgY29udGFpbnMgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24sIHdlIGlnbm9yZQotICAgICBESVJMSVNULiAgKi8KLSAgaWYgKElTX0FCU09MVVRFX1BBVEggKGxhbmd1YWdlKSkKLSAgICBkaXJsaXN0X2xlbiA9IDA7Ci0KLSAgLyogQWxsb2NhdGUgcm9vbSBmb3IgdGhlIGZ1bGwgZmlsZSBuYW1lLiAgKi8KLSAgYWJzX2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJsaXN0X2xlbgotCQkJCSAgKyBzdHJsZW4gKGxhbmd1YWdlKQotCQkJCSAgKyAoKG1hc2sgJiBURVJSSVRPUlkpICE9IDAKLQkJCQkgICAgID8gc3RybGVuICh0ZXJyaXRvcnkpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAoY29kZXNldCkgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKG5vcm1hbGl6ZWRfY29kZXNldCkgKyAxIDogMCkKLQkJCQkgICsgKCgobWFzayAmIFhQR19NT0RJRklFUikgIT0gMAotCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwKQotCQkJCSAgICAgPyBzdHJsZW4gKG1vZGlmaWVyKSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKHNwZWNpYWwpICsgMSA6IDApCi0JCQkJICArICgoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAotCQkJCSAgICAgIHx8IChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwKQotCQkJCSAgICAgPyAoMSArICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCi0JCQkJCSAgICAgPyBzdHJsZW4gKHNwb25zb3IpIDogMCkKLQkJCQkJKyAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDAKLQkJCQkJICAgPyBzdHJsZW4gKHJldmlzaW9uKSArIDEgOiAwKSkgOiAwKQotCQkJCSAgKyAxICsgc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKLQotICBpZiAoYWJzX2ZpbGVuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ29uc3RydWN0IGZpbGUgbmFtZS4gICovCi0gIGNwID0gYWJzX2ZpbGVuYW1lOwotICBpZiAoZGlybGlzdF9sZW4gPiAwKQotICAgIHsKLSAgICAgIG1lbWNweSAoY3AsIGRpcmxpc3QsIGRpcmxpc3RfbGVuKTsKLSAgICAgIF9fYXJnel9zdHJpbmdpZnkgKGNwLCBkaXJsaXN0X2xlbiwgUEFUSF9TRVBBUkFUT1IpOwotICAgICAgY3AgKz0gZGlybGlzdF9sZW47Ci0gICAgICBjcFstMV0gPSAnLyc7Ci0gICAgfQotCi0gIGNwID0gc3RwY3B5IChjcCwgbGFuZ3VhZ2UpOwotCi0gIGlmICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICdfJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgdGVycml0b3J5KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJy4nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBjb2Rlc2V0KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLic7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIG5vcm1hbGl6ZWRfY29kZXNldCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiAoWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFKSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNvbXBvbmVudCBjYW4gYmUgcGFydCBvZiBib3RoIHN5bnRhY2VzIGJ1dCBoYXMgZGlmZmVyZW50Ci0JIGxlYWRpbmcgY2hhcmFjdGVycy4gIEZvciBDRU4gd2UgdXNlIGArJywgZWxzZSBgQCcuICAqLwotICAgICAgKmNwKysgPSAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCA/ICcrJyA6ICdAJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOwotICAgIH0KLSAgaWYgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnKyc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIHNwZWNpYWwpOwotICAgIH0KLSAgaWYgKChtYXNrICYgKENFTl9TUE9OU09SIHwgQ0VOX1JFVklTSU9OKSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcsJzsKLSAgICAgIGlmICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwKQotCWNwID0gc3RwY3B5IChjcCwgc3BvbnNvcik7Ci0gICAgICBpZiAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCi0JewotCSAgKmNwKysgPSAnXyc7Ci0JICBjcCA9IHN0cGNweSAoY3AsIHJldmlzaW9uKTsKLQl9Ci0gICAgfQotCi0gICpjcCsrID0gJy8nOwotICBzdHBjcHkgKGNwLCBmaWxlbmFtZSk7Ci0KLSAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5Ci0gICAgIGF2YWlsYWJsZS4gICovCi0gIGxhc3RwID0gbDEwbmZpbGVfbGlzdDsKLSAgZm9yIChyZXR2YWwgPSAqbDEwbmZpbGVfbGlzdDsgcmV0dmFsICE9IE5VTEw7IHJldHZhbCA9IHJldHZhbC0+bmV4dCkKLSAgICBpZiAocmV0dmFsLT5maWxlbmFtZSAhPSBOVUxMKQotICAgICAgewotCWludCBjb21wYXJlID0gc3RyY21wIChyZXR2YWwtPmZpbGVuYW1lLCBhYnNfZmlsZW5hbWUpOwotCWlmIChjb21wYXJlID09IDApCi0JICAvKiBXZSBmb3VuZCBpdCEgICovCi0JICBicmVhazsKLQlpZiAoY29tcGFyZSA8IDApCi0JICB7Ci0JICAgIC8qIEl0J3Mgbm90IGluIHRoZSBsaXN0LiAgKi8KLQkgICAgcmV0dmFsID0gTlVMTDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlsYXN0cCA9ICZyZXR2YWwtPm5leHQ7Ci0gICAgICB9Ci0KLSAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCi0gICAgewotICAgICAgZnJlZSAoYWJzX2ZpbGVuYW1lKTsKLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gIGRpcmxpc3RfY291bnQgPSAoZGlybGlzdF9sZW4gPiAwID8gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgOiAxKTsKLQotICAvKiBBbGxvY2F0ZSBhIG5ldyBsb2FkZWRfbDEwbmZpbGUuICAqLwotICByZXR2YWwgPQotICAgIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCi0gICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpCi0JICAgICsgKCgoZGlybGlzdF9jb3VudCA8PCBwb3AgKG1hc2spKSArIChkaXJsaXN0X2NvdW50ID4gMSA/IDEgOiAwKSkKLQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikpKTsKLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHZhbC0+ZmlsZW5hbWUgPSBhYnNfZmlsZW5hbWU7Ci0KLSAgLyogV2Ugc2V0IHJldHZhbC0+ZGF0YSB0byBOVUxMIGhlcmU7IGl0IGlzIGZpbGxlZCBpbiBsYXRlci4KLSAgICAgU2V0dGluZyByZXR2YWwtPmRlY2lkZWQgdG8gMSBoZXJlIG1lYW5zIHRoYXQgcmV0dmFsIGRvZXMgbm90Ci0gICAgIGNvcnJlc3BvbmQgdG8gYSByZWFsIGZpbGUgKGRpcmxpc3RfY291bnQgPiAxKSBvciBpcyBub3Qgd29ydGgKLSAgICAgbG9va2luZyB1cCAoaWYgYW4gdW5ub3JtYWxpemVkIGNvZGVzZXQgd2FzIHNwZWNpZmllZCkuICAqLwotICByZXR2YWwtPmRlY2lkZWQgPSAoZGlybGlzdF9jb3VudCA+IDEKLQkJICAgICB8fCAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAotCQkJICYmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpOwotICByZXR2YWwtPmRhdGEgPSBOVUxMOwotCi0gIHJldHZhbC0+bmV4dCA9ICpsYXN0cDsKLSAgKmxhc3RwID0gcmV0dmFsOwotCi0gIGVudHJpZXMgPSAwOwotICAvKiBSZWN1cnNlIHRvIGZpbGwgdGhlIGluaGVyaXRhbmNlIGxpc3Qgb2YgUkVUVkFMLgotICAgICBJZiB0aGUgRElSTElTVCBpcyBhIHJlYWwgbGlzdCAoaS5lLiBESVJMSVNUX0NPVU5UID4gMSksIHRoZSBSRVRWQUwKLSAgICAgZW50cnkgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZTsgcmV0dmFsLT5maWxlbmFtZSBjb250YWlucwotICAgICBjb2xvbnMuICBJbiB0aGlzIGNhc2Ugd2UgbG9vcCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIERJUkxJU1QgYW5kCi0gICAgIGFjcm9zcyBhbGwgYml0IHBhdHRlcm5zIGRvbWluYXRlZCBieSBNQVNLLgotICAgICBJZiB0aGUgRElSTElTVCBpcyBhIHNpbmdsZSBkaXJlY3Rvcnkgb3IgZW50aXJlbHkgcmVkdW5kYW50IChpLmUuCi0gICAgIERJUkxJU1RfQ09VTlQgPT0gMSksIHdlIGxvb3AgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5Ci0gICAgIE1BU0ssIGV4Y2x1ZGluZyBNQVNLIGl0c2VsZi4KLSAgICAgSW4gZWl0aGVyIGNhc2UsIHdlIGxvb3AgZG93biBmcm9tIE1BU0sgdG8gMC4gIFRoaXMgaGFzIHRoZSBlZmZlY3QKLSAgICAgdGhhdCB0aGUgZXh0cmEgYml0cyBpbiB0aGUgbG9jYWxlIG5hbWUgYXJlIGRyb3BwZWQgaW4gdGhpcyBvcmRlcjoKLSAgICAgZmlyc3QgdGhlIG1vZGlmaWVyLCB0aGVuIHRoZSB0ZXJyaXRvcnksIHRoZW4gdGhlIGNvZGVzZXQsIHRoZW4gdGhlCi0gICAgIG5vcm1hbGl6ZWRfY29kZXNldC4gICovCi0gIGZvciAoY250ID0gZGlybGlzdF9jb3VudCA+IDEgPyBtYXNrIDogbWFzayAtIDE7IGNudCA+PSAwOyAtLWNudCkKLSAgICBpZiAoKGNudCAmIH5tYXNrKSA9PSAwCi0JJiYgKChjbnQgJiBDRU5fU1BFQ0lGSUMpID09IDAgfHwgKGNudCAmIFhQR19TUEVDSUZJQykgPT0gMCkKLQkmJiAoKGNudCAmIFhQR19DT0RFU0VUKSA9PSAwIHx8IChjbnQgJiBYUEdfTk9STV9DT0RFU0VUKSA9PSAwKSkKLSAgICAgIHsKLQlpZiAoZGlybGlzdF9jb3VudCA+IDEpCi0JICB7Ci0JICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgdGhlIERJUkxJU1QuICAqLwotCSAgICBjaGFyICpkaXIgPSBOVUxMOwotCi0JICAgIHdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQotCQkgICAhPSBOVUxMKQotCSAgICAgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KLQkJPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpciwgc3RybGVuIChkaXIpICsgMSwKLQkJCQkgICAgICBjbnQsIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCi0JCQkJICAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJCQkgICAgICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIDEpOwotCSAgfQotCWVsc2UKLQkgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KLQkgICAgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLAotCQkJCSAgY250LCBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAotCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJCQkgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7Ci0gICAgICB9Ci0gIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXNdID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAotICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KLSAgIG5hbWVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZQotICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCi1jb25zdCBjaGFyICoKLV9ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwgc2l6ZV90IG5hbWVfbGVuKQotewotICBpbnQgbGVuID0gMDsKLSAgaW50IG9ubHlfZGlnaXQgPSAxOwotICBjaGFyICpyZXR2YWw7Ci0gIGNoYXIgKndwOwotICBzaXplX3QgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotICAgIGlmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKLSAgICAgIHsKLQkrK2xlbjsKLQotCWlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKLQkgIG9ubHlfZGlnaXQgPSAwOwotICAgICAgfQotCi0gIHJldHZhbCA9IChjaGFyICopIG1hbGxvYyAoKG9ubHlfZGlnaXQgPyAzIDogMCkgKyBsZW4gKyAxKTsKLQotICBpZiAocmV0dmFsICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG9ubHlfZGlnaXQpCi0Jd3AgPSBzdHBjcHkgKHJldHZhbCwgImlzbyIpOwotICAgICAgZWxzZQotCXdwID0gcmV0dmFsOwotCi0gICAgICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKLQlpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCi0JICAqd3ArKyA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pOwotCWVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQotCSAgKndwKysgPSBjb2Rlc2V0W2NudF07Ci0KLSAgICAgICp3cCA9ICdcMCc7Ci0gICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqKSByZXR2YWw7Ci19Ci0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9saWJnbnVpbnRsLmguaW4gYi91bml4L2ludGwvbGliZ251aW50bC5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmU3ZWI5Li4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9saWJnbnVpbnRsLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCSU5UTF9ICi0jZGVmaW5lIF9MSUJJTlRMX0gJMQotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLS8qIFRoZSBMQ19NRVNTQUdFUyBsb2NhbGUgY2F0ZWdvcnkgaXMgdGhlIGNhdGVnb3J5IHVzZWQgYnkgdGhlIGZ1bmN0aW9ucwotICAgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpLiAgSXQgaXMgc3BlY2lmaWVkIGluIFBPU0lYLCBidXQgbm90IGluIEFOU0kgQy4KLSAgIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBkZWZpbmUgaXQsIHVzZSBhbiBhcmJpdHJhcnkgdmFsdWUgaW5zdGVhZC4KLSAgIE9uIFNvbGFyaXMsIDxsb2NhbGUuaD4gZGVmaW5lcyBfX0xPQ0FMRV9IIChvciBfTE9DQUxFX0ggaW4gU29sYXJpcyAyLjUpCi0gICB0aGVuIGluY2x1ZGVzIDxsaWJpbnRsLmg+IChpLmUuIHRoaXMgZmlsZSEpIGFuZCB0aGVuIG9ubHkgZGVmaW5lcwotICAgTENfTUVTU0FHRVMuICBUbyBhdm9pZCBhIHJlZGVmaW5pdGlvbiB3YXJuaW5nLCBkb24ndCBkZWZpbmUgTENfTUVTU0FHRVMKLSAgIGluIHRoaXMgY2FzZS4gICovCi0jaWYgIWRlZmluZWQgTENfTUVTU0FHRVMgJiYgIShkZWZpbmVkIF9fTE9DQUxFX0ggfHwgKGRlZmluZWQgX0xPQ0FMRV9IICYmIGRlZmluZWQgX19zdW4pKQotIyBkZWZpbmUgTENfTUVTU0FHRVMgMTcyOQotI2VuZGlmCi0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotLyogUHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIGZpbGUgZm9ybWF0cy4gIFJldHVybnMgdGhlCi0gICBtYXhpbXVtIG1pbm9yIHJldmlzaW9uIG51bWJlciBzdXBwb3J0ZWQgZm9yIGEgZ2l2ZW4gbWFqb3IgcmV2aXNpb24uICAqLwotI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgXAotICAoKG1ham9yKSA9PSAwID8gMSA6IC0xKQotCi0vKiBSZXNvbHZlIGEgcGxhdGZvcm0gc3BlY2lmaWMgY29uZmxpY3Qgb24gREpHUFAuICBHTlUgZ2V0dGV4dCB0YWtlcwotICAgcHJlY2VkZW5jZSBvdmVyIF9jb25pb19nZXR0ZXh0LiAgKi8KLSNpZmRlZiBfX0RKR1BQX18KLSMgdW5kZWYgZ2V0dGV4dAotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiBXZSByZWRpcmVjdCB0aGUgZnVuY3Rpb25zIHRvIHRob3NlIHByZWZpeGVkIHdpdGggImxpYmludGxfIi4gIFRoaXMgaXMKLSAgIG5lY2Vzc2FyeSwgYmVjYXVzZSBzb21lIHN5c3RlbXMgZGVmaW5lIGdldHRleHQvdGV4dGRvbWFpbi8uLi4gaW4gdGhlIEMKLSAgIGxpYnJhcnkgKG5hbWVseSwgU29sYXJpcyAyLjQgYW5kIG5ld2VyLCBhbmQgR05VIGxpYmMgMi4wIGFuZCBuZXdlcikuCi0gICBJZiB3ZSB1c2VkIHRoZSB1bnByZWZpeGVkIG5hbWVzLCB0aGVyZSB3b3VsZCBiZSBjYXNlcyB3aGVyZSB0aGUKLSAgIGRlZmluaXRpb24gaW4gdGhlIEMgbGlicmFyeSB3b3VsZCBvdmVycmlkZSB0aGUgb25lIGluIHRoZSBsaWJpbnRsLnNvCi0gICBzaGFyZWQgbGlicmFyeS4gIFJlY2FsbCB0aGF0IG9uIEVMRiBzeXN0ZW1zLCB0aGUgc3ltYm9scyBhcmUgbG9va2VkCi0gICB1cCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICAgICAxLiBpbiB0aGUgZXhlY3V0YWJsZSwKLSAgICAgMi4gaW4gdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSwgaW4gb3JkZXIsCi0gICAgIDMuIGluIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rCi0gICAgICAgIGNvbW1hbmQgbGluZSwKLSAgICAgNC4gaW4gdGhlIGRsb3BlbigpZWQgc2hhcmVkIGxpYnJhcmllcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQotICAgICAgICBkbG9wZW4oKWVkLgotICAgVGhlIGRlZmluaXRpb24gaW4gdGhlIEMgbGlicmFyeSB3b3VsZCBvdmVycmlkZSB0aGUgb25lIGluIGxpYmludGwuc28gaWYKLSAgIGVpdGhlcgotICAgICAqIC1sYyBpcyBnaXZlbiBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUgYW5kIC1saW50bCBpc24ndCwgb3IKLSAgICAgKiAtbGMgaXMgZ2l2ZW4gb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lIGJlZm9yZSAtbGludGwsIG9yCi0gICAgICogbGliaW50bC5zbyBpcyBhIGRlcGVuZGVuY3kgb2YgYSBkbG9wZW4oKWVkIHNoYXJlZCBsaWJyYXJ5IGJ1dCBub3QKLSAgICAgICBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYXQgbGluayB0aW1lLgotICAgU2luY2UgU29sYXJpcyBnZXR0ZXh0KCkgYmVoYXZlcyBkaWZmZXJlbnRseSB0aGFuIEdOVSBnZXR0ZXh0KCksIHRoaXMKLSAgIHdvdWxkIGJlIHVuYWNjZXB0YWJsZS4KLQotICAgVGhlIHJlZGlyZWN0aW9uIGhhcHBlbnMgYnkgZGVmYXVsdCB0aHJvdWdoIG1hY3JvcyBpbiBDLCBzbyB0aGF0ICZnZXR0ZXh0Ci0gICBpcyBpbmRlcGVuZGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgYnV0IHRocm91Z2ggaW5saW5lIGZ1bmN0aW9ucyBpbgotICAgQysrLCBpbiBvcmRlciBub3QgdG8gaW50ZXJmZXJlIHdpdGggdGhlIG5hbWUgbWFuZ2xpbmcgb2YgY2xhc3MgZmllbGRzIG9yCi0gICBjbGFzcyBtZXRob2RzIGNhbGxlZCAnZ2V0dGV4dCcuICAqLwotCi0vKiBUaGUgdXNlciBjYW4gZGVmaW5lIF9JTlRMX1JFRElSRUNUX0lOTElORSBvciBfSU5UTF9SRURJUkVDVF9NQUNST1MuCi0gICBJZiBoZSBkb2Vzbid0LCB3ZSBjaG9vc2UgdGhlIG1ldGhvZC4gIEEgdGhpcmQgcG9zc2libGUgbWV0aG9kIGlzCi0gICBfSU5UTF9SRURJUkVDVF9BU00sIHN1cHBvcnRlZCBvbmx5IGJ5IEdDQy4gICovCi0jaWYgIShkZWZpbmVkIF9JTlRMX1JFRElSRUNUX0lOTElORSB8fCBkZWZpbmVkIF9JTlRMX1JFRElSRUNUX01BQ1JPUykKLSMgaWYgX19HTlVDX18gPj0gMiAmJiAhZGVmaW5lZCBfX0FQUExFX0NDX18gJiYgIWRlZmluZWQgX19NSU5HVzMyX18gJiYgIShfX0dOVUNfXyA9PSAyICYmIGRlZmluZWQgX0FJWCkgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cykKLSMgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9BU00KLSMgZWxzZQotIyAgaWZkZWYgX19jcGx1c3BsdXMKLSMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0jICBlbHNlCi0jICAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotLyogQXV4aWxpYXJ5IG1hY3Jvcy4gICovCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfQVNNCi0jIGRlZmluZSBfSU5UTF9BU00oY25hbWUpIF9fYXNtX18gKF9JTlRMX0FTTU5BTUUgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgI2NuYW1lKSkKLSMgZGVmaW5lIF9JTlRMX0FTTU5BTUUocHJlZml4LGNuYW1lc3RyaW5nKSBfSU5UTF9TVFJJTkdJRlkgKHByZWZpeCkgY25hbWVzdHJpbmcKLSMgZGVmaW5lIF9JTlRMX1NUUklOR0lGWShwcmVmaXgpICNwcmVmaXgKLSNlbHNlCi0jIGRlZmluZSBfSU5UTF9BU00oY25hbWUpCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi1leHRlcm4gY2hhciAqbGliaW50bF9nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKTsKLXN0YXRpYyBpbmxpbmUgY2hhciAqZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCkKLXsKLSAgcmV0dXJuIGxpYmludGxfZ2V0dGV4dCAoX19tc2dpZCk7Ci19Ci0jZWxzZQotI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyBkZWZpbmUgZ2V0dGV4dCBsaWJpbnRsX2dldHRleHQKLSNlbmRpZgotZXh0ZXJuIGNoYXIgKmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpCi0gICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2dldHRleHQpOwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLWV4dGVybiBjaGFyICpsaWJpbnRsX2RnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpOwotc3RhdGljIGlubGluZSBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQotewotICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkKTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBkZ2V0dGV4dCBsaWJpbnRsX2RnZXR0ZXh0Ci0jZW5kaWYKLWV4dGVybiBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kZ2V0dGV4dCk7Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkJaW50IF9fY2F0ZWdvcnkpOwotc3RhdGljIGlubGluZSBjaGFyICpkY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLQkJCSAgICAgICBpbnQgX19jYXRlZ29yeSkKLXsKLSAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQsIF9fY2F0ZWdvcnkpOwotfQotI2Vsc2UKLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLSMgZGVmaW5lIGRjZ2V0dGV4dCBsaWJpbnRsX2RjZ2V0dGV4dAotI2VuZGlmCi1leHRlcm4gY2hhciAqZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQlpbnQgX19jYXRlZ29yeSkKLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGNnZXR0ZXh0KTsKLSNlbmRpZgotCi0KLS8qIFNpbWlsYXIgdG8gYGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICBudW1iZXIgTi4gICovCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi1leHRlcm4gY2hhciAqbGliaW50bF9uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7Ci1zdGF0aWMgaW5saW5lIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pCi17Ci0gIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChfX21zZ2lkMSwgX19tc2dpZDIsIF9fbik7Ci19Ci0jZWxzZQotI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyBkZWZpbmUgbmdldHRleHQgbGliaW50bF9uZ2V0dGV4dAotI2VuZGlmCi1leHRlcm4gY2hhciAqbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfbmdldHRleHQpOwotI2VuZGlmCi0KLS8qIFNpbWlsYXIgdG8gYGRnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgbnVtYmVyIE4uICAqLwotI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotZXh0ZXJuIGNoYXIgKmxpYmludGxfZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAotCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24pOwotc3RhdGljIGlubGluZSBjaGFyICpkbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZDEsCi0JCQkgICAgICAgY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKLXsKLSAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uKTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBkbmdldHRleHQgbGliaW50bF9kbmdldHRleHQKLSNlbmRpZgotZXh0ZXJuIGNoYXIgKmRuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uKQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kbmdldHRleHQpOwotI2VuZGlmCi0KLS8qIFNpbWlsYXIgdG8gYGRjZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKLSAgIG51bWJlciBOLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLWV4dGVybiBjaGFyICpsaWJpbnRsX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KTsKLXN0YXRpYyBpbmxpbmUgY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLQkJCQl1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQotewotICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uLCBfX2NhdGVnb3J5KTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBkY25nZXR0ZXh0IGxpYmludGxfZGNuZ2V0dGV4dAotI2VuZGlmCi1leHRlcm4gY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY25nZXR0ZXh0KTsKLSNlbmRpZgotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotZXh0ZXJuIGNoYXIgKmxpYmludGxfdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKTsKLXN0YXRpYyBpbmxpbmUgY2hhciAqdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKQotewotICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChfX2RvbWFpbm5hbWUpOwotfQotI2Vsc2UKLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLSMgZGVmaW5lIHRleHRkb21haW4gbGliaW50bF90ZXh0ZG9tYWluCi0jZW5kaWYKLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpCi0gICAgICAgX0lOVExfQVNNIChsaWJpbnRsX3RleHRkb21haW4pOwotI2VuZGlmCi0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotZXh0ZXJuIGNoYXIgKmxpYmludGxfYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7Ci1zdGF0aWMgaW5saW5lIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkKLXsKLSAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKF9fZG9tYWlubmFtZSwgX19kaXJuYW1lKTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCi0jZW5kaWYKLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX2Rpcm5hbWUpCi0gICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluKTsKLSNlbmRpZgotCi0vKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCi0gICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLWV4dGVybiBjaGFyICpsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCk7Ci1zdGF0aWMgaW5saW5lIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJCSAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQotewotICByZXR1cm4gbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoX19kb21haW5uYW1lLCBfX2NvZGVzZXQpOwotfQotI2Vsc2UKLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLSMgZGVmaW5lIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKLSNlbmRpZgotZXh0ZXJuIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCk7Ci0jZW5kaWYKLQotCi0vKiBTdXBwb3J0IGZvciBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucyBpbiAqcHJpbnRmKCksIGZvbGxvd2luZyB0aGUKLSAgIFBPU0lYL1hTSSBzcGVjaWZpY2F0aW9uLgotICAgTm90ZTogVGhlc2UgcmVwbGFjZW1lbnRzIGZvciB0aGUgKnByaW50ZigpIGZ1bmN0aW9ucyBhcmUgdmlzaWJsZSBvbmx5Ci0gICBpbiBzb3VyY2UgZmlsZXMgdGhhdCAjaW5jbHVkZSA8bGliaW50bC5oPiBvciAjaW5jbHVkZSAiZ2V0dGV4dC5oIi4KLSAgIFBhY2thZ2VzIHRoYXQgdXNlICpwcmludGYoKSBpbiBzb3VyY2UgZmlsZXMgdGhhdCBkb24ndCByZWZlciB0byBfKCkKLSAgIG9yIGdldHRleHQoKSBidXQgZm9yIHdoaWNoIHRoZSBmb3JtYXQgc3RyaW5nIGNvdWxkIGJlIHRoZSByZXR1cm4gdmFsdWUKLSAgIG9mIF8oKSBvciBnZXR0ZXh0KCkgbmVlZCB0byBhZGQgdGhpcyAjaW5jbHVkZS4gIE9oIHdlbGwuICAqLwotCi0jaWYgIUBIQVZFX1BPU0lYX1BSSU5URkAKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIEdldCB2YV9saXN0LiAgKi8KLSNpZiBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIKLSMgaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI3VuZGVmIGZwcmludGYKLSNkZWZpbmUgZnByaW50ZiBsaWJpbnRsX2ZwcmludGYKLWV4dGVybiBpbnQgZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7Ci0jdW5kZWYgdmZwcmludGYKLSNkZWZpbmUgdmZwcmludGYgbGliaW50bF92ZnByaW50ZgotZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwotCi0jdW5kZWYgcHJpbnRmCi0jZGVmaW5lIHByaW50ZiBsaWJpbnRsX3ByaW50ZgotZXh0ZXJuIGludCBwcmludGYgKGNvbnN0IGNoYXIgKiwgLi4uKTsKLSN1bmRlZiB2cHJpbnRmCi0jZGVmaW5lIHZwcmludGYgbGliaW50bF92cHJpbnRmCi1leHRlcm4gaW50IHZwcmludGYgKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7Ci0KLSN1bmRlZiBzcHJpbnRmCi0jZGVmaW5lIHNwcmludGYgbGliaW50bF9zcHJpbnRmCi1leHRlcm4gaW50IHNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotI3VuZGVmIHZzcHJpbnRmCi0jZGVmaW5lIHZzcHJpbnRmIGxpYmludGxfdnNwcmludGYKLWV4dGVybiBpbnQgdnNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLQotI2lmIEBIQVZFX1NOUFJJTlRGQAotCi0jdW5kZWYgc25wcmludGYKLSNkZWZpbmUgc25wcmludGYgbGliaW50bF9zbnByaW50ZgotZXh0ZXJuIGludCBzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLSN1bmRlZiB2c25wcmludGYKLSNkZWZpbmUgdnNucHJpbnRmIGxpYmludGxfdnNucHJpbnRmCi1leHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7Ci0KLSNlbmRpZgotCi0jaWYgQEhBVkVfQVNQUklOVEZACi0KLSN1bmRlZiBhc3ByaW50ZgotI2RlZmluZSBhc3ByaW50ZiBsaWJpbnRsX2FzcHJpbnRmCi1leHRlcm4gaW50IGFzcHJpbnRmIChjaGFyICoqLCBjb25zdCBjaGFyICosIC4uLik7Ci0jdW5kZWYgdmFzcHJpbnRmCi0jZGVmaW5lIHZhc3ByaW50ZiBsaWJpbnRsX3Zhc3ByaW50ZgotZXh0ZXJuIGludCB2YXNwcmludGYgKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7Ci0KLSNlbmRpZgotCi0jaWYgQEhBVkVfV1BSSU5URkAKLQotI3VuZGVmIGZ3cHJpbnRmCi0jZGVmaW5lIGZ3cHJpbnRmIGxpYmludGxfZndwcmludGYKLWV4dGVybiBpbnQgZndwcmludGYgKEZJTEUgKiwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOwotI3VuZGVmIHZmd3ByaW50ZgotI2RlZmluZSB2ZndwcmludGYgbGliaW50bF92ZndwcmludGYKLWV4dGVybiBpbnQgdmZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7Ci0KLSN1bmRlZiB3cHJpbnRmCi0jZGVmaW5lIHdwcmludGYgbGliaW50bF93cHJpbnRmCi1leHRlcm4gaW50IHdwcmludGYgKGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKLSN1bmRlZiB2d3ByaW50ZgotI2RlZmluZSB2d3ByaW50ZiBsaWJpbnRsX3Z3cHJpbnRmCi1leHRlcm4gaW50IHZ3cHJpbnRmIChjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOwotCi0jdW5kZWYgc3dwcmludGYKLSNkZWZpbmUgc3dwcmludGYgbGliaW50bF9zd3ByaW50ZgotZXh0ZXJuIGludCBzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKLSN1bmRlZiB2c3dwcmludGYKLSNkZWZpbmUgdnN3cHJpbnRmIGxpYmludGxfdnN3cHJpbnRmCi1leHRlcm4gaW50IHZzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7Ci0KLSNlbmRpZgotCi0jZW5kaWYKLQotCi0vKiBTdXBwb3J0IGZvciByZWxvY2F0YWJsZSBwYWNrYWdlcy4gICovCi0KLS8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgotICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKLSAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCi0gICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCi0gICBpbnN0ZWFkIG9mICIvIikuICAqLwotI2RlZmluZSBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeAotZXh0ZXJuIHZvaWQKLSAgICAgICBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCi0JCQkJICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXgpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBsaWJpbnRsLmggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2FkaW5mby5oIGIvdW5peC9pbnRsL2xvYWRpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTVlYmQuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2xvYWRpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9MT0FESU5GT19ICi0jZGVmaW5lIF9MT0FESU5GT19ICTEKLQotLyogRGVjbGFyYXRpb25zIG9mIGxvY2FsZSBkZXBlbmRlbnQgY2F0YWxvZyBsb29rdXAgZnVuY3Rpb25zLgotICAgSW1wbGVtZW50ZWQgaW4KLQotICAgICBsb2NhbGVhbGlhcy5jICAgIFBvc3NpYmx5IHJlcGxhY2UgYSBsb2NhbGUgbmFtZSBieSBhbm90aGVyLgotICAgICBleHBsb2RlbmFtZS5jICAgIFNwbGl0IGEgbG9jYWxlIG5hbWUgaW50byBpdHMgdmFyaW91cyBmaWVsZHMuCi0gICAgIGwxMG5mbGlzdC5jICAgICAgR2VuZXJhdGUgYSBsaXN0IG9mIGZpbGVuYW1lcyBvZiBwb3NzaWJsZSBtZXNzYWdlIGNhdGFsb2dzLgotICAgICBmaW5kZG9tYWluLmMgICAgIEZpbmQgYW5kIG9wZW4gdGhlIHJlbGV2YW50IG1lc3NhZ2UgY2F0YWxvZ3MuCi0KLSAgIFRoZSBtYWluIGZ1bmN0aW9uIF9ubF9maW5kX2RvbWFpbigpIGluIGZpbmRkb21haW4uYyBpcyBkZWNsYXJlZAotICAgaW4gZ2V0dGV4dFAuaC4KLSAqLwotCi0jaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCi0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotI2VuZGlmCi0KLS8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKLSAgIGFsbW9zdCBhbHdheXMgdHJ1ZSBvciBhbG1vc3QgYWx3YXlzIGZhbHNlLiAgKi8KLSNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAotIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQotI2VuZGlmCi0KLS8qIFNlcGFyYXRvciBpbiBQQVRIIGxpa2UgbGlzdHMgb2YgcGF0aG5hbWVzLiAgKi8KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLSAgLyogV2luMzIsIE9TLzIsIERPUyAqLwotIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzsnCi0jZWxzZQotICAvKiBVbml4ICovCi0jIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKLSNlbmRpZgotCi0vKiBFbmNvZGluZyBvZiBsb2NhbGUgbmFtZSBwYXJ0cy4gICovCi0jZGVmaW5lIENFTl9SRVZJU0lPTgkJMQotI2RlZmluZSBDRU5fU1BPTlNPUgkJMgotI2RlZmluZSBDRU5fU1BFQ0lBTAkJNAotI2RlZmluZSBYUEdfTk9STV9DT0RFU0VUCTgKLSNkZWZpbmUgWFBHX0NPREVTRVQJCTE2Ci0jZGVmaW5lIFRFUlJJVE9SWQkJMzIKLSNkZWZpbmUgQ0VOX0FVRElFTkNFCQk2NAotI2RlZmluZSBYUEdfTU9ESUZJRVIJCTEyOAotCi0jZGVmaW5lIENFTl9TUEVDSUZJQwkoQ0VOX1JFVklTSU9OfENFTl9TUE9OU09SfENFTl9TUEVDSUFMfENFTl9BVURJRU5DRSkKLSNkZWZpbmUgWFBHX1NQRUNJRklDCShYUEdfQ09ERVNFVHxYUEdfTk9STV9DT0RFU0VUfFhQR19NT0RJRklFUikKLQotCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlCi17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBpbnQgZGVjaWRlZDsKLQotICBjb25zdCB2b2lkICpkYXRhOwotCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKm5leHQ7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnN1Y2Nlc3NvclsxXTsKLX07Ci0KLQotLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAotICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KLSAgIG5hbWVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZQotICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCi1leHRlcm4gY29uc3QgY2hhciAqX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJCQkgIHNpemVfdCBuYW1lX2xlbik7Ci0KLS8qIExvb2t1cCBhIGxvY2FsZSBkZXBlbmRlbnQgZmlsZS4KLSAgICpMMTBORklMRV9MSVNUIGRlbm90ZXMgYSBwb29sIG9mIGxvb2t1cCByZXN1bHRzIG9mIGxvY2FsZSBkZXBlbmRlbnQKLSAgIGZpbGVzIG9mIHRoZSBzYW1lIGtpbmQsIHNvcnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIC0+ZmlsZW5hbWUuCi0gICBESVJMSVNUIGFuZCBESVJMSVNUX0xFTiBhcmUgYW4gYXJneiBsaXN0IG9mIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRvCi0gICBsb29rLCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBkaXJlY3RvcnkgKGkuZS4gRElSTElTVF9MRU4gPiAwKS4KLSAgIE1BU0ssIExBTkdVQUdFLCBURVJSSVRPUlksIENPREVTRVQsIE5PUk1BTElaRURfQ09ERVNFVCwgTU9ESUZJRVIsCi0gICBTUEVDSUFMLCBTUE9OU09SLCBSRVZJU0lPTiBhcmUgdGhlIHBpZWNlcyBvZiB0aGUgbG9jYWxlIG5hbWUsIGFzCi0gICBwcm9kdWNlZCBieSBfbmxfZXhwbG9kZV9uYW1lKCkuICBGSUxFTkFNRSBpcyB0aGUgZmlsZW5hbWUgc3VmZml4LgotICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbG9va3VwIHJlc3VsdCwgZWl0aGVyIGZvdW5kIGluICpMMTBORklMRV9MSVNULAotICAgb3IgLSBpZiBET19BTExPQ0FURSBpcyBub256ZXJvIC0gZnJlc2hseSBhbGxvY2F0ZWQsIG9yIHBvc3NpYmx5IE5VTEwuCi0gICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbi1OVUxMLCBpdCBpcyBhZGRlZCB0byAqTDEwTkZJTEVfTElTVCwgYW5kCi0gICBpdHMgLT5uZXh0IGZpZWxkIGRlbm90ZXMgdGhlIGNoYWluaW5nIGluc2lkZSAqTDEwTkZJTEVfTElTVCwgYW5kCi0gICBmdXJ0aGVybW9yZSBpdHMgLT5zdWNjZXNzb3JbXSBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2Ygb3RoZXIgbG9va3VwCi0gICByZXN1bHRzIGZyb20gd2hpY2ggdGhpcyBsb29rdXAgcmVzdWx0IGluaGVyaXRzLiAgKi8KLWV4dGVybiBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9tYWtlX2wxMG5mbGlzdCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3QsCi0JCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sIGludCBtYXNrLAotCQkgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKLQkJICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQsIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAotCQkgICAgY29uc3QgY2hhciAqc3BvbnNvciwgY29uc3QgY2hhciAqcmV2aXNpb24sCi0JCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKTsKLQotLyogTG9va3VwIHRoZSByZWFsIGxvY2FsZSBuYW1lIGZvciBhIGxvY2FsZSBhbGlhcyBOQU1FLCBvciBOVUxMIGlmCi0gICBOQU1FIGlzIG5vdCBhIGxvY2FsZSBhbGlhcyAoYnV0IHBvc3NpYmx5IGEgcmVhbCBsb2NhbGUgbmFtZSkuCi0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBtdXN0IG5vdCBiZSBmcmVlZC4gICovCi1leHRlcm4gY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIFNwbGl0IGEgbG9jYWxlIG5hbWUgTkFNRSBpbnRvIGl0cyBwaWVjZXM6IGxhbmd1YWdlLCBtb2RpZmllciwKLSAgIHRlcnJpdG9yeSwgY29kZXNldCwgc3BlY2lhbCwgc3BvbnNvciwgcmV2aXNpb24uCi0gICBOQU1FIGdldHMgZGVzdHJ1Y3RpdmVseSBtb2RpZmllZDogTlVMIGJ5dGVzIGFyZSBpbnNlcnRlZCBoZXJlIGFuZAotICAgdGhlcmUuICAqTEFOR1VBR0UgZ2V0cyBhc3NpZ25lZCBOQU1FLiAgRWFjaCBvZiAqTU9ESUZJRVIsICpURVJSSVRPUlksCi0gICAqQ09ERVNFVCwgKlNQRUNJQUwsICpTUE9OU09SLCAqUkVWSVNJT04gZ2V0cyBhc3NpZ25lZCBlaXRoZXIgYQotICAgcG9pbnRlciBpbnRvIHRoZSBvbGQgTkFNRSBzdHJpbmcsIG9yIE5VTEwuICAqTk9STUFMSVpFRF9DT0RFU0VUCi0gICBnZXRzIGFzc2lnbmVkIHRoZSBleHBhbmRlZCAqQ09ERVNFVCwgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gKkNPREVTRVQ7Ci0gICB0aGlzIG9uZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGJpdG1hc2ssIHdoZXJlIGVhY2ggYml0IGNvcnJlc3BvbmRzIHRvIG9uZQotICAgZmlsbGVkLWluIHZhbHVlOgotICAgICBYUEdfTU9ESUZJRVIsIENFTl9BVURJRU5DRSAgZm9yICpNT0RJRklFUiwKLSAgICAgVEVSUklUT1JZICAgICAgICAgICAgICAgICAgIGZvciAqVEVSUklUT1JZLAotICAgICBYUEdfQ09ERVNFVCAgICAgICAgICAgICAgICAgZm9yICpDT0RFU0VULAotICAgICBYUEdfTk9STV9DT0RFU0VUICAgICAgICAgICAgZm9yICpOT1JNQUxJWkVEX0NPREVTRVQsCi0gICAgIENFTl9TUEVDSUFMICAgICAgICAgICAgICAgICBmb3IgKlNQRUNJQUwsCi0gICAgIENFTl9TUE9OU09SICAgICAgICAgICAgICAgICBmb3IgKlNQT05TT1IsCi0gICAgIENFTl9SRVZJU0lPTiAgICAgICAgICAgICAgICBmb3IgKlJFVklTSU9OLgotICovCi1leHRlcm4gaW50IF9ubF9leHBsb2RlX25hbWUgKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwKLQkJCSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyLCBjb25zdCBjaGFyICoqdGVycml0b3J5LAotCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKLQkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWwsIGNvbnN0IGNoYXIgKipzcG9uc29yLAotCQkJICAgICBjb25zdCBjaGFyICoqcmV2aXNpb24pOwotCi0vKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBhIGxlYWRpbmcgbGFuZ3VhZ2UgcGFydCBhbmQgYWxsIHRoZQotICAgcmVzdC4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgbGFuZ3VhZ2UsCi0gICBpLmUuIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXN0LiAgKi8KLWV4dGVybiBjaGFyICpfbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLSNlbmRpZgkvKiBsb2FkaW5mby5oICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9hZG1zZ2NhdC5jIGIvdW5peC9pbnRsL2xvYWRtc2djYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljNTFiNC4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvbG9hZG1zZ2NhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyMCArMCwwIEBACi0vKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLS8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KLSAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQotICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotI2lmbmRlZiBfR05VX1NPVVJDRQotIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgdW5kZWYgIGFsbG9jYQotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYQotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsYW5naW5mby5oPgotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IChkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgX1BPU0lYX01BUFBFRF9GSUxFUykKLSMgaW5jbHVkZSA8c3lzL21tYW4uaD4KLSMgdW5kZWYgSEFWRV9NTUFQCi0jIGRlZmluZSBIQVZFX01NQVAJMQotI2Vsc2UKLSMgdW5kZWYgSEFWRV9NTUFQCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2lmIGRlZmluZWQgSEFWRV9JTlRUWVBFU19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ21vLmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgotI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCi0jZW5kaWYKLQotLyogUHJvdmlkZSBmYWxsYmFjayB2YWx1ZXMgZm9yIG1hY3JvcyB0aGF0IG91Z2h0IHRvIGJlIGRlZmluZWQgaW4gPGludHR5cGVzLmg+LgotICAgTm90ZSB0aGF0IG91ciBmYWxsYmFjayB2YWx1ZXMgbmVlZCBub3QgYmUgbGl0ZXJhbCBzdHJpbmdzLCBiZWNhdXNlIHdlIGRvbid0Ci0gICB1c2UgdGhlbSB3aXRoIHByZXByb2Nlc3NvciBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gICovCi0jaWYgIWRlZmluZWQgUFJJZDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZDgKLSMgZGVmaW5lIFBSSWQ4ICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaTggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaTgKLSMgZGVmaW5lIFBSSWk4ICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJbzggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJbzgKLSMgZGVmaW5lIFBSSW84ICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdTggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdTgKLSMgZGVmaW5lIFBSSXU4ICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeDgKLSMgZGVmaW5lIFBSSXg4ICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWDgKLSMgZGVmaW5lIFBSSVg4ICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWQxNgotIyBkZWZpbmUgUFJJZDE2ICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaTE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWkxNgotIyBkZWZpbmUgUFJJaTE2ICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJbzE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW8xNgotIyBkZWZpbmUgUFJJbzE2ICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdTE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXUxNgotIyBkZWZpbmUgUFJJdTE2ICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXgxNgotIyBkZWZpbmUgUFJJeDE2ICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVgxNgotIyBkZWZpbmUgUFJJWDE2ICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWQzMgotIyBkZWZpbmUgUFJJZDMyICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaTMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWkzMgotIyBkZWZpbmUgUFJJaTMyICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJbzMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW8zMgotIyBkZWZpbmUgUFJJbzMyICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdTMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXUzMgotIyBkZWZpbmUgUFJJdTMyICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXgzMgotIyBkZWZpbmUgUFJJeDMyICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVgzMgotIyBkZWZpbmUgUFJJWDMyICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWQ2NAotIyBkZWZpbmUgUFJJZDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGQiIDogImxsZCIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaTY0Ci0jIGRlZmluZSBQUklpNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsaSIgOiAibGxpIikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSW82NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvNjQKLSMgZGVmaW5lIFBSSW82NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxvIiA6ICJsbG8iKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdTY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXU2NAotIyBkZWZpbmUgUFJJdTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHUiIDogImxsdSIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4NjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeDY0Ci0jIGRlZmluZSBQUkl4NjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJseCIgOiAibGx4IikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSVg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYNjQKLSMgZGVmaW5lIFBSSVg2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxYIiA6ICJsbFgiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkTEVBU1Q4Ci0jIGRlZmluZSBQUklkTEVBU1Q4ICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUxFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpTEVBU1Q4Ci0jIGRlZmluZSBQUklpTEVBU1Q4ICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0xFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvTEVBU1Q4Ci0jIGRlZmluZSBQUklvTEVBU1Q4ICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUxFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1TEVBU1Q4Ci0jIGRlZmluZSBQUkl1TEVBU1Q4ICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4TEVBU1Q4Ci0jIGRlZmluZSBQUkl4TEVBU1Q4ICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYTEVBU1Q4Ci0jIGRlZmluZSBQUklYTEVBU1Q4ICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZExFQVNUMTYKLSMgZGVmaW5lIFBSSWRMRUFTVDE2ICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUxFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaUxFQVNUMTYKLSMgZGVmaW5lIFBSSWlMRUFTVDE2ICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0xFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJb0xFQVNUMTYKLSMgZGVmaW5lIFBSSW9MRUFTVDE2ICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUxFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdUxFQVNUMTYKLSMgZGVmaW5lIFBSSXVMRUFTVDE2ICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeExFQVNUMTYKLSMgZGVmaW5lIFBSSXhMRUFTVDE2ICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWExFQVNUMTYKLSMgZGVmaW5lIFBSSVhMRUFTVDE2ICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZExFQVNUMzIKLSMgZGVmaW5lIFBSSWRMRUFTVDMyICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUxFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaUxFQVNUMzIKLSMgZGVmaW5lIFBSSWlMRUFTVDMyICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0xFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJb0xFQVNUMzIKLSMgZGVmaW5lIFBSSW9MRUFTVDMyICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUxFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdUxFQVNUMzIKLSMgZGVmaW5lIFBSSXVMRUFTVDMyICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeExFQVNUMzIKLSMgZGVmaW5lIFBSSXhMRUFTVDMyICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWExFQVNUMzIKLSMgZGVmaW5lIFBSSVhMRUFTVDMyICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZExFQVNUNjQKLSMgZGVmaW5lIFBSSWRMRUFTVDY0IFBSSWQ2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUxFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaUxFQVNUNjQKLSMgZGVmaW5lIFBSSWlMRUFTVDY0IFBSSWk2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0xFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJb0xFQVNUNjQKLSMgZGVmaW5lIFBSSW9MRUFTVDY0IFBSSW82NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUxFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdUxFQVNUNjQKLSMgZGVmaW5lIFBSSXVMRUFTVDY0IFBSSXU2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeExFQVNUNjQKLSMgZGVmaW5lIFBSSXhMRUFTVDY0IFBSSXg2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWExFQVNUNjQKLSMgZGVmaW5lIFBSSVhMRUFTVDY0IFBSSVg2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWRGQVNUOAotIyBkZWZpbmUgUFJJZEZBU1Q4ICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWlGQVNUOAotIyBkZWZpbmUgUFJJaUZBU1Q4ICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0ZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW9GQVNUOAotIyBkZWZpbmUgUFJJb0ZBU1Q4ICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXVGQVNUOAotIyBkZWZpbmUgUFJJdUZBU1Q4ICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXhGQVNUOAotIyBkZWZpbmUgUFJJeEZBU1Q4ICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVhGQVNUOAotIyBkZWZpbmUgUFJJWEZBU1Q4ICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkRkFTVDE2Ci0jIGRlZmluZSBQUklkRkFTVDE2ICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpRkFTVDE2Ci0jIGRlZmluZSBQUklpRkFTVDE2ICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0ZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvRkFTVDE2Ci0jIGRlZmluZSBQUklvRkFTVDE2ICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1RkFTVDE2Ci0jIGRlZmluZSBQUkl1RkFTVDE2ICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4RkFTVDE2Ci0jIGRlZmluZSBQUkl4RkFTVDE2ICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYRkFTVDE2Ci0jIGRlZmluZSBQUklYRkFTVDE2ICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkRkFTVDMyCi0jIGRlZmluZSBQUklkRkFTVDMyICJkIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpRkFTVDMyCi0jIGRlZmluZSBQUklpRkFTVDMyICJpIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0ZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvRkFTVDMyCi0jIGRlZmluZSBQUklvRkFTVDMyICJvIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1RkFTVDMyCi0jIGRlZmluZSBQUkl1RkFTVDMyICJ1IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4RkFTVDMyCi0jIGRlZmluZSBQUkl4RkFTVDMyICJ4IgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYRkFTVDMyCi0jIGRlZmluZSBQUklYRkFTVDMyICJYIgotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkRkFTVDY0Ci0jIGRlZmluZSBQUklkRkFTVDY0IFBSSWQ2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaUZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpRkFTVDY0Ci0jIGRlZmluZSBQUklpRkFTVDY0IFBSSWk2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJb0ZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvRkFTVDY0Ci0jIGRlZmluZSBQUklvRkFTVDY0IFBSSW82NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdUZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1RkFTVDY0Ci0jIGRlZmluZSBQUkl1RkFTVDY0IFBSSXU2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4RkFTVDY0Ci0jIGRlZmluZSBQUkl4RkFTVDY0IFBSSXg2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYRkFTVDY0Ci0jIGRlZmluZSBQUklYRkFTVDY0IFBSSVg2NAotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkTUFYCi0jIGRlZmluZSBQUklkTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiAibGxkIikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSWlNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaU1BWAotIyBkZWZpbmUgUFJJaU1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibGkiIDogImxsaSIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW9NQVgKLSMgZGVmaW5lIFBSSW9NQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxvIiA6ICJsbG8iKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1TUFYCi0jIGRlZmluZSBQUkl1TUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiAibGx1IikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSXhNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeE1BWAotIyBkZWZpbmUgUFJJeE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibHgiIDogImxseCIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVhNQVgKLSMgZGVmaW5lIFBSSVhNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxYIiA6ICJsbFgiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJZFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkUFRSCi0jIGRlZmluZSBQUklkUFRSIFwKLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxkIiA6IFwKLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiZCIgOiBcCi0gICAibGxkIikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSWlQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaVBUUgotIyBkZWZpbmUgUFJJaVBUUiBcCi0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsaSIgOiBcCi0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gImkiIDogXAotICAgImxsaSIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW9QVFIKLSMgZGVmaW5lIFBSSW9QVFIgXAotICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibG8iIDogXAotICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJvIiA6IFwKLSAgICJsbG8iKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJdVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1UFRSCi0jIGRlZmluZSBQUkl1UFRSIFwKLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx1IiA6IFwKLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAidSIgOiBcCi0gICAibGx1IikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSXhQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeFBUUgotIyBkZWZpbmUgUFJJeFBUUiBcCi0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJseCIgOiBcCi0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIngiIDogXAotICAgImxseCIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVhQVFIKLSMgZGVmaW5lIFBSSVhQVFIgXAotICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibFgiIDogXAotICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJYIiA6IFwKLSAgICJsbFgiKQotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBJU08gQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIElTTyBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBvcGVuICAgX19vcGVuCi0jIGRlZmluZSBjbG9zZSAgX19jbG9zZQotIyBkZWZpbmUgcmVhZCAgIF9fcmVhZAotIyBkZWZpbmUgbW1hcCAgIF9fbW1hcAotIyBkZWZpbmUgbXVubWFwIF9fbXVubWFwCi0jZW5kaWYKLQotLyogRm9yIHRob3NlIGxvc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0jaWZkZWYgSEFWRV9BTExPQ0EKLSMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KLSNlbHNlCi0jIGRlZmluZSBhbGxvY2EobikgbWFsbG9jIChuKQotIyBkZWZpbmUgZnJlZWEocCkgZnJlZSAocCkKLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB0aGF0IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGV4dCBhbmQgYmluYXJ5IEkvTy4KLSAgIE9fQklOQVJZIGlzIHVzdWFsbHkgZGVjbGFyZWQgaW4gPGZjbnRsLmg+LiAqLwotI2lmICFkZWZpbmVkIE9fQklOQVJZICYmIGRlZmluZWQgX09fQklOQVJZCi0gIC8qIEZvciBNU0MtY29tcGF0aWJsZSBjb21waWxlcnMuICAqLwotIyBkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCi0jIGRlZmluZSBPX1RFWFQgX09fVEVYVAotI2VuZGlmCi0jaWZkZWYgX19CRU9TX18KLSAgLyogQmVPUyA1IGhhcyBPX0JJTkFSWSBhbmQgT19URVhULCBidXQgdGhleSBoYXZlIG5vIGVmZmVjdC4gICovCi0jIHVuZGVmIE9fQklOQVJZCi0jIHVuZGVmIE9fVEVYVAotI2VuZGlmCi0vKiBPbiByZWFzb25hYmxlIHN5c3RlbXMsIGJpbmFyeSBJL08gaXMgdGhlIGRlZmF1bHQuICAqLwotI2lmbmRlZiBPX0JJTkFSWQotIyBkZWZpbmUgT19CSU5BUlkgMAotI2VuZGlmCi0KLQotLyogV2UgbmVlZCBhIHNpZ24sIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZAotICAgd2l0aCBhbGwgdHJhbnNsYXRpb25zLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgdGhlIHRyYW5zbGF0aW9ucyBhcmUKLSAgIGNhY2hlZCBieSBvbmUgb2YgR0NDJ3MgZmVhdHVyZXMuICAqLwotaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0KLQotLyogRXhwYW5kIGEgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudC4gIFJldHVybiBOVUxMIGlmIHVuc3VwcG9ydGVkLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgLyogVGVzdCBmb3IgYW4gSVNPIEMgOTkgc2VjdGlvbiA3LjguMSBmb3JtYXQgc3RyaW5nIGRpcmVjdGl2ZS4KLSAgICAgU3ludGF4OgotICAgICBQIFIgSSB7IGQgfCBpIHwgbyB8IHUgfCB4IHwgWCB9Ci0gICAgIHsgeyB8IExFQVNUIHwgRkFTVCB9IHsgOCB8IDE2IHwgMzIgfCA2NCB9IHwgTUFYIHwgUFRSIH0gICovCi0gIC8qIFdlIGRvbid0IHVzZSBhIHRhYmxlIG9mIDE0IHRpbWVzIDYgJ2NvbnN0IGNoYXIgKicgc3RyaW5ncyBoZXJlLCBiZWNhdXNlCi0gICAgIGRhdGEgcmVsb2NhdGlvbnMgY29zdCBzdGFydHVwIHRpbWUuICAqLwotICBpZiAobmFtZVswXSA9PSAnUCcgJiYgbmFtZVsxXSA9PSAnUicgJiYgbmFtZVsyXSA9PSAnSScpCi0gICAgewotICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnIHx8IG5hbWVbM10gPT0gJ2knIHx8IG5hbWVbM10gPT0gJ28nIHx8IG5hbWVbM10gPT0gJ3UnCi0JICB8fCBuYW1lWzNdID09ICd4JyB8fCBuYW1lWzNdID09ICdYJykKLQl7Ci0JICBpZiAobmFtZVs0XSA9PSAnOCcgJiYgbmFtZVs1XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQlyZXR1cm4gUFJJZDg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQlyZXR1cm4gUFJJaTg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQlyZXR1cm4gUFJJbzg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQlyZXR1cm4gUFJJdTg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQlyZXR1cm4gUFJJeDg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQlyZXR1cm4gUFJJWDg7Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGlmIChuYW1lWzRdID09ICcxJyAmJiBuYW1lWzVdID09ICc2JyAmJiBuYW1lWzZdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCXJldHVybiBQUklkMTY7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQlyZXR1cm4gUFJJaTE2OwotCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKLQkJcmV0dXJuIFBSSW8xNjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0JCXJldHVybiBQUkl1MTY7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQlyZXR1cm4gUFJJeDE2OwotCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKLQkJcmV0dXJuIFBSSVgxNjsKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaWYgKG5hbWVbNF0gPT0gJzMnICYmIG5hbWVbNV0gPT0gJzInICYmIG5hbWVbNl0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKLQkJcmV0dXJuIFBSSWQzMjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0JCXJldHVybiBQUklpMzI7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQlyZXR1cm4gUFJJbzMyOwotCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLQkJcmV0dXJuIFBSSXUzMjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0JCXJldHVybiBQUkl4MzI7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQlyZXR1cm4gUFJJWDMyOwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpZiAobmFtZVs0XSA9PSAnNicgJiYgbmFtZVs1XSA9PSAnNCcgJiYgbmFtZVs2XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQlyZXR1cm4gUFJJZDY0OwotCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKLQkJcmV0dXJuIFBSSWk2NDsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCi0JCXJldHVybiBQUklvNjQ7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQlyZXR1cm4gUFJJdTY0OwotCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKLQkJcmV0dXJuIFBSSXg2NDsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCXJldHVybiBQUklYNjQ7Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGlmIChuYW1lWzRdID09ICdMJyAmJiBuYW1lWzVdID09ICdFJyAmJiBuYW1lWzZdID09ICdBJwotCSAgICAgICYmIG5hbWVbN10gPT0gJ1MnICYmIG5hbWVbOF0gPT0gJ1QnKQotCSAgICB7Ci0JICAgICAgaWYgKG5hbWVbOV0gPT0gJzgnICYmIG5hbWVbMTBdID09ICdcMCcpCi0JCXsKLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCSAgICByZXR1cm4gUFJJZExFQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0JCSAgICByZXR1cm4gUFJJaUxFQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0JCSAgICByZXR1cm4gUFJJb0xFQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0JCSAgICByZXR1cm4gUFJJdUxFQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0JCSAgICByZXR1cm4gUFJJeExFQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCSAgICByZXR1cm4gUFJJWExFQVNUODsKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGlmIChuYW1lWzldID09ICcxJyAmJiBuYW1lWzEwXSA9PSAnNicgJiYgbmFtZVsxMV0gPT0gJ1wwJykKLQkJewotCQkgIGlmIChuYW1lWzNdID09ICdkJykKLQkJICAgIHJldHVybiBQUklkTEVBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0JCSAgICByZXR1cm4gUFJJaUxFQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQkgICAgcmV0dXJuIFBSSW9MRUFTVDE2OwotCQkgIGlmIChuYW1lWzNdID09ICd1JykKLQkJICAgIHJldHVybiBQUkl1TEVBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0JCSAgICByZXR1cm4gUFJJeExFQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQkgICAgcmV0dXJuIFBSSVhMRUFTVDE2OwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgaWYgKG5hbWVbOV0gPT0gJzMnICYmIG5hbWVbMTBdID09ICcyJyAmJiBuYW1lWzExXSA9PSAnXDAnKQotCQl7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQkgICAgcmV0dXJuIFBSSWRMRUFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICdpJykKLQkJICAgIHJldHVybiBQUklpTEVBU1QzMjsKLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0JCSAgICByZXR1cm4gUFJJb0xFQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQkgICAgcmV0dXJuIFBSSXVMRUFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICd4JykKLQkJICAgIHJldHVybiBQUkl4TEVBU1QzMjsKLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCSAgICByZXR1cm4gUFJJWExFQVNUMzI7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBpZiAobmFtZVs5XSA9PSAnNicgJiYgbmFtZVsxMF0gPT0gJzQnICYmIG5hbWVbMTFdID09ICdcMCcpCi0JCXsKLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCSAgICByZXR1cm4gUFJJZExFQVNUNjQ7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQkgICAgcmV0dXJuIFBSSWlMRUFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICdvJykKLQkJICAgIHJldHVybiBQUklvTEVBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0JCSAgICByZXR1cm4gUFJJdUxFQVNUNjQ7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQkgICAgcmV0dXJuIFBSSXhMRUFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICdYJykKLQkJICAgIHJldHVybiBQUklYTEVBU1Q2NDsKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICB9Ci0JICBpZiAobmFtZVs0XSA9PSAnRicgJiYgbmFtZVs1XSA9PSAnQScgJiYgbmFtZVs2XSA9PSAnUycKLQkgICAgICAmJiBuYW1lWzddID09ICdUJykKLQkgICAgewotCSAgICAgIGlmIChuYW1lWzhdID09ICc4JyAmJiBuYW1lWzldID09ICdcMCcpCi0JCXsKLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCSAgICByZXR1cm4gUFJJZEZBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICdpJykKLQkJICAgIHJldHVybiBQUklpRkFTVDg7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQkgICAgcmV0dXJuIFBSSW9GQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0JCSAgICByZXR1cm4gUFJJdUZBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICd4JykKLQkJICAgIHJldHVybiBQUkl4RkFTVDg7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQkgICAgcmV0dXJuIFBSSVhGQVNUODsKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGlmIChuYW1lWzhdID09ICcxJyAmJiBuYW1lWzldID09ICc2JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQotCQl7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQkgICAgcmV0dXJuIFBSSWRGQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQkgICAgcmV0dXJuIFBSSWlGQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQkgICAgcmV0dXJuIFBSSW9GQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQkgICAgcmV0dXJuIFBSSXVGQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQkgICAgcmV0dXJuIFBSSXhGQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQkgICAgcmV0dXJuIFBSSVhGQVNUMTY7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBpZiAobmFtZVs4XSA9PSAnMycgJiYgbmFtZVs5XSA9PSAnMicgJiYgbmFtZVsxMF0gPT0gJ1wwJykKLQkJewotCQkgIGlmIChuYW1lWzNdID09ICdkJykKLQkJICAgIHJldHVybiBQUklkRkFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICdpJykKLQkJICAgIHJldHVybiBQUklpRkFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICdvJykKLQkJICAgIHJldHVybiBQUklvRkFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICd1JykKLQkJICAgIHJldHVybiBQUkl1RkFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICd4JykKLQkJICAgIHJldHVybiBQUkl4RkFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICdYJykKLQkJICAgIHJldHVybiBQUklYRkFTVDMyOwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgaWYgKG5hbWVbOF0gPT0gJzYnICYmIG5hbWVbOV0gPT0gJzQnICYmIG5hbWVbMTBdID09ICdcMCcpCi0JCXsKLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCSAgICByZXR1cm4gUFJJZEZBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0JCSAgICByZXR1cm4gUFJJaUZBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0JCSAgICByZXR1cm4gUFJJb0ZBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0JCSAgICByZXR1cm4gUFJJdUZBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0JCSAgICByZXR1cm4gUFJJeEZBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCSAgICByZXR1cm4gUFJJWEZBU1Q2NDsKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICB9Ci0JICBpZiAobmFtZVs0XSA9PSAnTScgJiYgbmFtZVs1XSA9PSAnQScgJiYgbmFtZVs2XSA9PSAnWCcKLQkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCXJldHVybiBQUklkTUFYOwotCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKLQkJcmV0dXJuIFBSSWlNQVg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQlyZXR1cm4gUFJJb01BWDsKLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0JCXJldHVybiBQUkl1TUFYOwotCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKLQkJcmV0dXJuIFBSSXhNQVg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQlyZXR1cm4gUFJJWE1BWDsKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaWYgKG5hbWVbNF0gPT0gJ1AnICYmIG5hbWVbNV0gPT0gJ1QnICYmIG5hbWVbNl0gPT0gJ1InCi0JICAgICAgJiYgbmFtZVs3XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQlyZXR1cm4gUFJJZFBUUjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0JCXJldHVybiBQUklpUFRSOwotCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKLQkJcmV0dXJuIFBSSW9QVFI7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQlyZXR1cm4gUFJJdVBUUjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0JCXJldHVybiBQUkl4UFRSOwotCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKLQkJcmV0dXJuIFBSSVhQVFI7Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBUZXN0IGZvciBhIGdsaWJjIHNwZWNpZmljIHByaW50ZigpIGZvcm1hdCBkaXJlY3RpdmUgZmxhZy4gICovCi0gIGlmIChuYW1lWzBdID09ICdJJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotI2lmIGRlZmluZWQgX0xJQkMgfHwgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpCi0gICAgICAvKiBUaGUgJ0knIGZsYWcsIGluIG51bWVyaWMgZm9ybWF0IGRpcmVjdGl2ZXMsIHJlcGxhY2VzIEFTQ0lJIGRpZ2l0cwotCSB3aXRoIHRoZSAnb3V0ZGlnaXRzJyBkZWZpbmVkIGluIHRoZSBMQ19DVFlQRSBsb2NhbGUgZmFjZXQuICBUaGlzIGlzCi0JIHVzZWQgZm9yIEZhcnNpIChQZXJzaWFuKSBhbmQgbWF5YmUgQXJhYmljLiAgKi8KLSAgICAgIHJldHVybiAiSSI7Ci0jZWxzZQotICAgICAgcmV0dXJuICIiOwotI2VuZGlmCi0gICAgfQotICAvKiBPdGhlciBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgYXJlIG5vdCB2YWxpZC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBjb2Rlc2V0IGRlcGVuZGVudCBwYXJ0cyBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLgotICAgUmV0dXJuIHRoZSBoZWFkZXIgZW50cnkuICAqLwotY29uc3QgY2hhciAqCi1pbnRlcm5hbF9mdW5jdGlvbgotX25sX2luaXRfZG9tYWluX2NvbnYgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCQkgICAgICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluLAotCQkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKLXsKLSAgLyogRmluZCBvdXQgYWJvdXQgdGhlIGNoYXJhY3RlciBzZXQgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoLgotICAgICBUaGlzIGNhbiBiZSBmb3VuZCAoaW4gdGV4dHVhbCBmb3JtKSBpbiB0aGUgZW50cnkgIiIuICBJZiB0aGlzCi0gICAgIGVudHJ5IGRvZXMgbm90IGV4aXN0IG9yIGlmIHRoaXMgZG9lcyBub3QgY29udGFpbiB0aGUgYGNoYXJzZXQ9JwotICAgICBpbmZvcm1hdGlvbiwgd2Ugd2lsbCBhc3N1bWUgdGhlIGNoYXJzZXQgbWF0Y2hlcyB0aGUgb25lIHRoZQotICAgICBjdXJyZW50IGxvY2FsZSBhbmQgd2UgZG9uJ3QgaGF2ZSB0byBwZXJmb3JtIGFueSBjb252ZXJzaW9uLiAgKi8KLSAgY2hhciAqbnVsbGVudHJ5OwotICBzaXplX3QgbnVsbGVudHJ5bGVuOwotCi0gIC8qIFByZWluaXRpYWxpemUgZmllbGRzLCB0byBhdm9pZCByZWN1cnNpb24gZHVyaW5nIF9ubF9maW5kX21zZy4gICovCi0gIGRvbWFpbi0+Y29kZXNldF9jbnRyID0KLSAgICAoZG9tYWluYmluZGluZyAhPSBOVUxMID8gZG9tYWluYmluZGluZy0+Y29kZXNldF9jbnRyIDogMCk7Ci0jaWZkZWYgX0xJQkMKLSAgZG9tYWluLT5jb252ID0gKF9fZ2NvbnZfdCkgLTE7Ci0jZWxzZQotIyBpZiBIQVZFX0lDT05WCi0gIGRvbWFpbi0+Y29udiA9IChpY29udl90KSAtMTsKLSMgZW5kaWYKLSNlbmRpZgotICBkb21haW4tPmNvbnZfdGFiID0gTlVMTDsKLQotICAvKiBHZXQgdGhlIGhlYWRlciBlbnRyeS4gICovCi0gIG51bGxlbnRyeSA9IF9ubF9maW5kX21zZyAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcsICIiLCAmbnVsbGVudHJ5bGVuKTsKLQotICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCi0gICAgewotI2lmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVgotICAgICAgY29uc3QgY2hhciAqY2hhcnNldHN0cjsKLQotICAgICAgY2hhcnNldHN0ciA9IHN0cnN0ciAobnVsbGVudHJ5LCAiY2hhcnNldD0iKTsKLSAgICAgIGlmIChjaGFyc2V0c3RyICE9IE5VTEwpCi0JewotCSAgc2l6ZV90IGxlbjsKLQkgIGNoYXIgKmNoYXJzZXQ7Ci0JICBjb25zdCBjaGFyICpvdXRjaGFyc2V0OwotCi0JICBjaGFyc2V0c3RyICs9IHN0cmxlbiAoImNoYXJzZXQ9Iik7Ci0JICBsZW4gPSBzdHJjc3BuIChjaGFyc2V0c3RyLCAiIFx0XG4iKTsKLQotCSAgY2hhcnNldCA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMSk7Ci0jIGlmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9NRU1QQ1BZCi0JICAqKChjaGFyICopIG1lbXBjcHkgKGNoYXJzZXQsIGNoYXJzZXRzdHIsIGxlbikpID0gJ1wwJzsKLSMgZWxzZQotCSAgbWVtY3B5IChjaGFyc2V0LCBjaGFyc2V0c3RyLCBsZW4pOwotCSAgY2hhcnNldFtsZW5dID0gJ1wwJzsKLSMgZW5kaWYKLQotCSAgLyogVGhlIG91dHB1dCBjaGFyc2V0IHNob3VsZCBub3JtYWxseSBiZSBkZXRlcm1pbmVkIGJ5IHRoZQotCSAgICAgbG9jYWxlLiAgQnV0IHNvbWV0aW1lcyB0aGUgbG9jYWxlIGlzIG5vdCB1c2VkIG9yIG5vdCBjb3JyZWN0bHkKLQkgICAgIHNldCB1cCwgc28gd2UgcHJvdmlkZSBhIHBvc3NpYmlsaXR5IGZvciB0aGUgdXNlciB0byBvdmVycmlkZQotCSAgICAgdGhpcy4gIE1vcmVvdmVyLCB0aGUgdmFsdWUgc3BlY2lmaWVkIHRocm91Z2gKLQkgICAgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IG92ZXJyaWRlcyBib3RoLiAgKi8KLQkgIGlmIChkb21haW5iaW5kaW5nICE9IE5VTEwgJiYgZG9tYWluYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQotCSAgICBvdXRjaGFyc2V0ID0gZG9tYWluYmluZGluZy0+Y29kZXNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dGNoYXJzZXQgPSBnZXRlbnYgKCJPVVRQVVRfQ0hBUlNFVCIpOwotCSAgICAgIGlmIChvdXRjaGFyc2V0ID09IE5VTEwgfHwgb3V0Y2hhcnNldFswXSA9PSAnXDAnKQotCQl7Ci0jIGlmZGVmIF9MSUJDCi0JCSAgb3V0Y2hhcnNldCA9IF9OTF9DVVJSRU5UIChMQ19DVFlQRSwgQ09ERVNFVCk7Ci0jIGVsc2UKLSMgIGlmIEhBVkVfSUNPTlYKLQkJICBleHRlcm4gY29uc3QgY2hhciAqbG9jYWxlX2NoYXJzZXQgKHZvaWQpOwotCQkgIG91dGNoYXJzZXQgPSBsb2NhbGVfY2hhcnNldCAoKTsKLSMgIGVuZGlmCi0jIGVuZGlmCi0JCX0KLQkgICAgfQotCi0jIGlmZGVmIF9MSUJDCi0JICAvKiBXZSBhbHdheXMgd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0aW9uLiAgKi8KLQkgIG91dGNoYXJzZXQgPSBub3JtX2FkZF9zbGFzaGVzIChvdXRjaGFyc2V0LCAiVFJBTlNMSVQiKTsKLQkgIGNoYXJzZXQgPSBub3JtX2FkZF9zbGFzaGVzIChjaGFyc2V0LCBOVUxMKTsKLQkgIGlmIChfX2djb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQsICZkb21haW4tPmNvbnYsCi0JCQkgICAgR0NPTlZfQVZPSURfTk9DT05WKQotCSAgICAgICE9IF9fR0NPTlZfT0spCi0JICAgIGRvbWFpbi0+Y29udiA9IChfX2djb252X3QpIC0xOwotIyBlbHNlCi0jICBpZiBIQVZFX0lDT05WCi0JICAvKiBXaGVuIHVzaW5nIEdOVSBsaWJjID49IDIuMiBvciBHTlUgbGliaWNvbnYgPj0gMS41LAotCSAgICAgd2Ugd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0aW9uLiAgKi8KLSMgICBpZiAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDIpIHx8IF9fR0xJQkNfXyA+IDIgXAotICAgICAgIHx8IF9MSUJJQ09OVl9WRVJTSU9OID49IDB4MDEwNQotCSAgaWYgKHN0cmNociAob3V0Y2hhcnNldCwgJy8nKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqdG1wOwotCi0JICAgICAgbGVuID0gc3RybGVuIChvdXRjaGFyc2V0KTsKLQkgICAgICB0bXAgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEwICsgMSk7Ci0JICAgICAgbWVtY3B5ICh0bXAsIG91dGNoYXJzZXQsIGxlbik7Ci0JICAgICAgbWVtY3B5ICh0bXAgKyBsZW4sICIvL1RSQU5TTElUIiwgMTAgKyAxKTsKLQkgICAgICBvdXRjaGFyc2V0ID0gdG1wOwotCi0JICAgICAgZG9tYWluLT5jb252ID0gaWNvbnZfb3BlbiAob3V0Y2hhcnNldCwgY2hhcnNldCk7Ci0KLQkgICAgICBmcmVlYSAob3V0Y2hhcnNldCk7Ci0JICAgIH0KLQkgIGVsc2UKLSMgICBlbmRpZgotCSAgICBkb21haW4tPmNvbnYgPSBpY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0KTsKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLQkgIGZyZWVhIChjaGFyc2V0KTsKLQl9Ci0jZW5kaWYgLyogX0xJQkMgfHwgSEFWRV9JQ09OViAqLwotICAgIH0KLQotICByZXR1cm4gbnVsbGVudHJ5OwotfQotCi0vKiBGcmVlcyB0aGUgY29kZXNldCBkZXBlbmRlbnQgcGFydHMgb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4gICovCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX25sX2ZyZWVfZG9tYWluX2NvbnYgKHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4pCi17Ci0gIGlmIChkb21haW4tPmNvbnZfdGFiICE9IE5VTEwgJiYgZG9tYWluLT5jb252X3RhYiAhPSAoY2hhciAqKikgLTEpCi0gICAgZnJlZSAoZG9tYWluLT5jb252X3RhYik7Ci0KLSNpZmRlZiBfTElCQwotICBpZiAoZG9tYWluLT5jb252ICE9IChfX2djb252X3QpIC0xKQotICAgIF9fZ2NvbnZfY2xvc2UgKGRvbWFpbi0+Y29udik7Ci0jZWxzZQotIyBpZiBIQVZFX0lDT05WCi0gIGlmIChkb21haW4tPmNvbnYgIT0gKGljb252X3QpIC0xKQotICAgIGljb252X2Nsb3NlIChkb21haW4tPmNvbnYpOwotIyBlbmRpZgotI2VuZGlmCi19Ci0KLS8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKLSAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCQkgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCi17Ci0gIGludCBmZDsKLSAgc2l6ZV90IHNpemU7Ci0jaWZkZWYgX0xJQkMKLSAgc3RydWN0IHN0YXQ2NCBzdDsKLSNlbHNlCi0gIHN0cnVjdCBzdGF0IHN0OwotI2VuZGlmCi0gIHN0cnVjdCBtb19maWxlX2hlYWRlciAqZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTE7Ci0gIGludCB1c2VfbW1hcCA9IDA7Ci0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0gIGludCByZXZpc2lvbjsKLSAgY29uc3QgY2hhciAqbnVsbGVudHJ5OwotCi0gIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gMTsKLSAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOwotCi0gIC8qIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VsZXNzIHRvIHN0b3JlIGRvbWFpbmJpbmRpbmcgaW4gZG9tYWluX2ZpbGUKLSAgICAgYmVjYXVzZSBkb21haW5iaW5kaW5nIG1pZ2h0IGJlID09IE5VTEwgbm93IGJ1dCAhPSBOVUxMIGxhdGVyIChhZnRlcgotICAgICBhIGNhbGwgdG8gYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpLiAgKi8KLQotICAvKiBJZiB0aGUgcmVjb3JkIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGxvY2FsZSB0aGUgRklMRU5BTUUKLSAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgc3BlY2lmaWNhdGlvbiB0aGUgbG9jYWxlIGZpbGUgbmFtZSBpcyBkaWZmZXJlbnQgZm9yIFhQRyBhbmQgQ0VOCi0gICAgIHN5bnRheC4gICovCi0gIGlmIChkb21haW5fZmlsZS0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIG11c3Qga25vdyBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gICovCi0gIGlmICgKLSNpZmRlZiBfTElCQwotICAgICAgX19idWlsdGluX2V4cGVjdCAoZnN0YXQ2NCAoZmQsICZzdCkgIT0gMCwgMCkKLSNlbHNlCi0gICAgICBfX2J1aWx0aW5fZXhwZWN0IChmc3RhdCAoZmQsICZzdCkgIT0gMCwgMCkKLSNlbmRpZgotICAgICAgfHwgX19idWlsdGluX2V4cGVjdCAoKHNpemUgPSAoc2l6ZV90KSBzdC5zdF9zaXplKSAhPSBzdC5zdF9zaXplLCAwKQotICAgICAgfHwgX19idWlsdGluX2V4cGVjdCAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyKSwgMCkpCi0gICAgewotICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLwotICAgICAgY2xvc2UgKGZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBIQVZFX01NQVAKLSAgLyogTm93IHdlIGFyZSByZWFkeSB0byBsb2FkIHRoZSBmaWxlLiAgSWYgbW1hcCgpIGlzIGF2YWlsYWJsZSB3ZSB0cnkKLSAgICAgdGhpcyBmaXJzdC4gIElmIG5vdCBhdmFpbGFibGUgb3IgaXQgZmFpbGVkIHdlIHRyeSB0byBsb2FkIGl0LiAgKi8KLSAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbW1hcCAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFELAotCQkJCQkgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLQotICBpZiAoX19idWlsdGluX2V4cGVjdCAoZGF0YSAhPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xLCAxKSkKLSAgICB7Ci0gICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgdXNlX21tYXAgPSAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHRoZSBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIChpLmUuIG1tYXAnZWQpIHdlIHRyeSB0byBsb2FkCi0gICAgIGl0IG1hbnVhbGx5LiAgKi8KLSAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLSAgICB7Ci0gICAgICBzaXplX3QgdG9fcmVhZDsKLSAgICAgIGNoYXIgKnJlYWRfcHRyOwotCi0gICAgICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIHRvX3JlYWQgPSBzaXplOwotICAgICAgcmVhZF9wdHIgPSAoY2hhciAqKSBkYXRhOwotICAgICAgZG8KLQl7Ci0JICBsb25nIGludCBuYiA9IChsb25nIGludCkgcmVhZCAoZmQsIHJlYWRfcHRyLCB0b19yZWFkKTsKLQkgIGlmIChuYiA8PSAwKQotCSAgICB7Ci0jaWZkZWYgRUlOVFIKLQkgICAgICBpZiAobmIgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCi0JCWNvbnRpbnVlOwotI2VuZGlmCi0JICAgICAgY2xvc2UgKGZkKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHJlYWRfcHRyICs9IG5iOwotCSAgdG9fcmVhZCAtPSBuYjsKLQl9Ci0gICAgICB3aGlsZSAodG9fcmVhZCA+IDApOwotCi0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICAvKiBVc2luZyB0aGUgbWFnaWMgbnVtYmVyIHdlIGNhbiB0ZXN0IHdoZXRoZXIgaXQgcmVhbGx5IGlzIGEgbWVzc2FnZQotICAgICBjYXRhbG9nIGZpbGUuICAqLwotICBpZiAoX19idWlsdGluX2V4cGVjdCAoZGF0YS0+bWFnaWMgIT0gX01BR0lDICYmIGRhdGEtPm1hZ2ljICE9IF9NQUdJQ19TV0FQUEVELAotCQkJMCkpCi0gICAgewotICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBpcyB3cm9uZzogbm90IGEgbWVzc2FnZSBjYXRhbG9nIGZpbGUuICAqLwotI2lmZGVmIEhBVkVfTU1BUAotICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHNpemUpOwotICAgICAgZWxzZQotI2VuZGlmCi0JZnJlZSAoZGF0YSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKLSAgaWYgKGRvbWFpbiA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgZG9tYWluX2ZpbGUtPmRhdGEgPSBkb21haW47Ci0KLSAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKLSAgZG9tYWluLT51c2VfbW1hcCA9IHVzZV9tbWFwOwotICBkb21haW4tPm1tYXBfc2l6ZSA9IHNpemU7Ci0gIGRvbWFpbi0+bXVzdF9zd2FwID0gZGF0YS0+bWFnaWMgIT0gX01BR0lDOwotICBkb21haW4tPm1hbGxvY2VkID0gTlVMTDsKLQotICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXZhaWxhYmxlIHRhYmxlcy4gICovCi0gIHJldmlzaW9uID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKTsKLSAgLyogV2Ugc3VwcG9ydCBvbmx5IHRoZSBtYWpvciByZXZpc2lvbnMgMCBhbmQgMS4gICovCi0gIHN3aXRjaCAocmV2aXNpb24gPj4gMTYpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgICBkb21haW4tPm5zdHJpbmdzID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5zdHJpbmdzKTsKLSAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ190YWJfb2Zmc2V0KSk7Ci0gICAgICBkb21haW4tPnRyYW5zX3RhYiA9IChjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc190YWJfb2Zmc2V0KSk7Ci0gICAgICBkb21haW4tPmhhc2hfc2l6ZSA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9zaXplKTsKLSAgICAgIGRvbWFpbi0+aGFzaF90YWIgPQotCShkb21haW4tPmhhc2hfc2l6ZSA+IDIKLQkgPyAoY29uc3QgbmxzX3VpbnQzMiAqKQotCSAgICgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX29mZnNldCkpCi0JIDogTlVMTCk7Ci0gICAgICBkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiA9IGRvbWFpbi0+bXVzdF9zd2FwOwotCi0gICAgICAvKiBOb3cgZGlzcGF0Y2ggb24gdGhlIG1pbm9yIHJldmlzaW9uLiAgKi8KLSAgICAgIHN3aXRjaCAocmV2aXNpb24gJiAweGZmZmYpCi0JewotCWNhc2UgMDoKLQkgIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IDA7Ci0JICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7Ci0JICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKLQotCSAgICBpZiAoZG9tYWluLT5oYXNoX3RhYiA9PSBOVUxMKQotCSAgICAgIC8qIFRoaXMgaXMgaW52YWxpZC4gIFRoZXNlIG1pbm9yIHJldmlzaW9ucyBuZWVkIGEgaGFzaCB0YWJsZS4gICovCi0JICAgICAgZ290byBpbnZhbGlkOwotCi0JICAgIG5fc3lzZGVwX3N0cmluZ3MgPQotCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uX3N5c2RlcF9zdHJpbmdzKTsKLQkgICAgaWYgKG5fc3lzZGVwX3N0cmluZ3MgPiAwKQotCSAgICAgIHsKLQkJbmxzX3VpbnQzMiBuX3N5c2RlcF9zZWdtZW50czsKLQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zZWdtZW50ICpzeXNkZXBfc2VnbWVudHM7Ci0JCWNvbnN0IGNoYXIgKipzeXNkZXBfc2VnbWVudF92YWx1ZXM7Ci0JCWNvbnN0IG5sc191aW50MzIgKm9yaWdfc3lzZGVwX3RhYjsKLQkJY29uc3QgbmxzX3VpbnQzMiAqdHJhbnNfc3lzZGVwX3RhYjsKLQkJbmxzX3VpbnQzMiBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOwotCQlzaXplX3QgbWVtbmVlZDsKLQkJY2hhciAqbWVtOwotCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV9vcmlnX3N5c2RlcF90YWI7Ci0JCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX3RyYW5zX3N5c2RlcF90YWI7Ci0JCW5sc191aW50MzIgKmlubWVtX2hhc2hfdGFiOwotCQl1bnNpZ25lZCBpbnQgaSwgajsKLQotCQkvKiBHZXQgdGhlIHZhbHVlcyBvZiB0aGUgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCi0JCW5fc3lzZGVwX3NlZ21lbnRzID0KLQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bl9zeXNkZXBfc2VnbWVudHMpOwotCQlzeXNkZXBfc2VnbWVudHMgPSAoY29uc3Qgc3RydWN0IHN5c2RlcF9zZWdtZW50ICopCi0JCSAgKChjaGFyICopIGRhdGEKLQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+c3lzZGVwX3NlZ21lbnRzX29mZnNldCkpOwotCQlzeXNkZXBfc2VnbWVudF92YWx1ZXMgPQotCQkgIGFsbG9jYSAobl9zeXNkZXBfc2VnbWVudHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOwotCQlmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc2VnbWVudHM7IGkrKykKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lID0KLQkJICAgICAgKGNoYXIgKikgZGF0YQotCQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc2VnbWVudHNbaV0ub2Zmc2V0KTsKLQkJICAgIG5sc191aW50MzIgbmFtZWxlbiA9Ci0JCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc2VnbWVudHNbaV0ubGVuZ3RoKTsKLQotCQkgICAgaWYgKCEobmFtZWxlbiA+IDAgJiYgbmFtZVtuYW1lbGVuIC0gMV0gPT0gJ1wwJykpCi0JCSAgICAgIHsKLQkJCWZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOwotCQkJZ290byBpbnZhbGlkOwotCQkgICAgICB9Ci0KLQkJICAgIHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tpXSA9IGdldF9zeXNkZXBfc2VnbWVudF92YWx1ZSAobmFtZSk7Ci0JCSAgfQotCi0JCW9yaWdfc3lzZGVwX3RhYiA9IChjb25zdCBubHNfdWludDMyICopCi0JCSAgKChjaGFyICopIGRhdGEKLQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ19zeXNkZXBfdGFiX29mZnNldCkpOwotCQl0cmFuc19zeXNkZXBfdGFiID0gKGNvbnN0IG5sc191aW50MzIgKikKLQkJICAoKGNoYXIgKikgZGF0YQotCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT50cmFuc19zeXNkZXBfdGFiX29mZnNldCkpOwotCi0JCS8qIENvbXB1dGUgdGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIG1lbW9yeSBuZWVkZWQgZm9yIHRoZQotCQkgICBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgYW5kIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4KLQkJICAgQXQgdGhlIHNhbWUgdGltZSwgYWxzbyBkcm9wIHN0cmluZyBwYWlycyB3aGljaCByZWZlciB0bwotCQkgICBhbiB1bmRlZmluZWQgc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50LiAgKi8KLQkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncyA9IDA7Ci0JCW1lbW5lZWQgPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7Ci0JCWZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zdHJpbmdzOyBpKyspCi0JCSAgewotCQkgICAgaW50IHZhbGlkID0gMTsKLQkJICAgIHNpemVfdCBuZWVkc1syXTsKLQotCQkgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLQkJICAgICAgewotCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQotCQkJICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKLQkJCSAgKChjaGFyICopIGRhdGEKLQkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJaiA9PSAwCi0JCQkJPyBvcmlnX3N5c2RlcF90YWJbaV0KLQkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKLQkJCXNpemVfdCBuZWVkID0gMDsKLQkJCWNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czsKLQotCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpICE9IFNFR01FTlRTX0VORCkKLQkJCSAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCi0JCQkgICAgewotCQkJICAgICAgbmxzX3VpbnQzMiBzeXNkZXByZWY7Ci0KLQkJCSAgICAgIG5lZWQgKz0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOwotCi0JCQkgICAgICBzeXNkZXByZWYgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKLQkJCSAgICAgIGlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQotCQkJCWJyZWFrOwotCi0JCQkgICAgICBpZiAoc3lzZGVwcmVmID49IG5fc3lzZGVwX3NlZ21lbnRzKQotCQkJCXsKLQkJCQkgIC8qIEludmFsaWQuICAqLwotCQkJCSAgZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7Ci0JCQkJICBnb3RvIGludmFsaWQ7Ci0JCQkJfQotCi0JCQkgICAgICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKLQkJCQl7Ci0JCQkJICAvKiBUaGlzIHBhcnRpY3VsYXIgc3RyaW5nIHBhaXIgaXMgaW52YWxpZC4gICovCi0JCQkJICB2YWxpZCA9IDA7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0KLQkJCSAgICAgIG5lZWQgKz0gc3RybGVuIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSk7Ci0JCQkgICAgfQotCi0JCQluZWVkc1tqXSA9IG5lZWQ7Ci0JCQlpZiAoIXZhbGlkKQotCQkJICBicmVhazsKLQkJICAgICAgfQotCi0JCSAgICBpZiAodmFsaWQpCi0JCSAgICAgIHsKLQkJCW5faW5tZW1fc3lzZGVwX3N0cmluZ3MrKzsKLQkJCW1lbW5lZWQgKz0gbmVlZHNbMF0gKyBuZWVkc1sxXTsKLQkJICAgICAgfQotCQkgIH0KLQkJbWVtbmVlZCArPSAyICogbl9pbm1lbV9zeXNkZXBfc3RyaW5ncwotCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOwotCi0JCWlmIChuX2lubWVtX3N5c2RlcF9zdHJpbmdzID4gMCkKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBpbnQgazsKLQotCQkgICAgLyogQWxsb2NhdGUgYWRkaXRpb25hbCBtZW1vcnkuICAqLwotCQkgICAgbWVtID0gKGNoYXIgKikgbWFsbG9jIChtZW1uZWVkKTsKLQkJICAgIGlmIChtZW0gPT0gTlVMTCkKLQkJICAgICAgZ290byBpbnZhbGlkOwotCi0JCSAgICBkb21haW4tPm1hbGxvY2VkID0gbWVtOwotCQkgICAgaW5tZW1fb3JpZ19zeXNkZXBfdGFiID0gKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKikgbWVtOwotCQkgICAgbWVtICs9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MKLQkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKLQkJICAgIGlubWVtX3RyYW5zX3N5c2RlcF90YWIgPSAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqKSBtZW07Ci0JCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncwotCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOwotCQkgICAgaW5tZW1faGFzaF90YWIgPSAobmxzX3VpbnQzMiAqKSBtZW07Ci0JCSAgICBtZW0gKz0gZG9tYWluLT5oYXNoX3NpemUgKiBzaXplb2YgKG5sc191aW50MzIpOwotCi0JCSAgICAvKiBDb21wdXRlIHRoZSBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MuICAqLwotCQkgICAgayA9IDA7Ci0JCSAgICBmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQotCQkgICAgICB7Ci0JCQlpbnQgdmFsaWQgPSAxOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotCQkJICB7Ci0JCQkgICAgY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQotCQkJICAgICAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCi0JCQkgICAgICAoKGNoYXIgKikgZGF0YQotCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgIGogPT0gMAotCQkJCSAgICA/IG9yaWdfc3lzZGVwX3RhYltpXQotCQkJCSAgICA6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKLQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KLQkJCSAgICAgIHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOwotCi0JCQkgICAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpCi0JCQkJIT0gU0VHTUVOVFNfRU5EKQotCQkJICAgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCi0JCQkJewotCQkJCSAgbmxzX3VpbnQzMiBzeXNkZXByZWY7Ci0KLQkJCQkgIHN5c2RlcHJlZiA9Ci0JCQkJICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOwotCQkJCSAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCi0JCQkJICAgIGJyZWFrOwotCi0JCQkJICBpZiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0gPT0gTlVMTCkKLQkJCQkgICAgewotCQkJCSAgICAgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcwotCQkJCQkgaW52YWxpZC4gICovCi0JCQkJICAgICAgdmFsaWQgPSAwOwotCQkJCSAgICAgIGJyZWFrOwotCQkJCSAgICB9Ci0JCQkJfQotCi0JCQkgICAgaWYgKCF2YWxpZCkKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0KLQkJCWlmICh2YWxpZCkKLQkJCSAgewotCQkJICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0JCQkgICAgICB7Ci0JCQkJY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKnN5c2RlcF9zdHJpbmcgPQotCQkJCSAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCi0JCQkJICAoKGNoYXIgKikgZGF0YQotCQkJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJCWogPT0gMAotCQkJCQk/IG9yaWdfc3lzZGVwX3RhYltpXQotCQkJCQk6IHRyYW5zX3N5c2RlcF90YWJbaV0pKTsKLQkJCQljb25zdCBjaGFyICpzdGF0aWNfc2VnbWVudHMgPQotCQkJCSAgKGNoYXIgKikgZGF0YQotCQkJCSAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3N0cmluZy0+b2Zmc2V0KTsKLQkJCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0KLQkJCQkgIHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOwotCi0JCQkJLyogQ29uY2F0ZW5hdGUgdGhlIHNlZ21lbnRzLCBhbmQgZmlsbAotCQkJCSAgIGlubWVtX29yaWdfc3lzZGVwX3RhYltrXSAoZm9yIGogPT0gMCkgYW5kCi0JCQkJICAgaW5tZW1fdHJhbnNfc3lzZGVwX3RhYltrXSAoZm9yIGogPT0gMSkuICAqLwotCi0JCQkJc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqaW5tZW1fdGFiX2VudHJ5ID0KLQkJCQkgIChqID09IDAKLQkJCQkgICA/IGlubWVtX29yaWdfc3lzZGVwX3RhYgotCQkJCSAgIDogaW5tZW1fdHJhbnNfc3lzZGVwX3RhYikKLQkJCQkgICsgazsKLQotCQkJCWlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKQotCQkJCSAgICA9PSBTRUdNRU5UU19FTkQpCi0JCQkJICB7Ci0JCQkJICAgIC8qIE9ubHkgb25lIHN0YXRpYyBzZWdtZW50LiAgKi8KLQkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQotCQkJCSAgICAgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKLQkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyID0gc3RhdGljX3NlZ21lbnRzOwotCQkJCSAgfQotCQkJCWVsc2UKLQkJCQkgIHsKLQkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyID0gbWVtOwotCi0JCQkJICAgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQotCQkJCSAgICAgIHsKLQkJCQkJbmxzX3VpbnQzMiBzZWdzaXplID0KLQkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7Ci0JCQkJCW5sc191aW50MzIgc3lzZGVwcmVmID0KLQkJCQkJICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKLQkJCQkJc2l6ZV90IG47Ci0KLQkJCQkJaWYgKHNlZ3NpemUgPiAwKQotCQkJCQkgIHsKLQkJCQkJICAgIG1lbWNweSAobWVtLCBzdGF0aWNfc2VnbWVudHMsIHNlZ3NpemUpOwotCQkJCQkgICAgbWVtICs9IHNlZ3NpemU7Ci0JCQkJCSAgICBzdGF0aWNfc2VnbWVudHMgKz0gc2Vnc2l6ZTsKLQkJCQkJICB9Ci0KLQkJCQkJaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCi0JCQkJCSAgYnJlYWs7Ci0KLQkJCQkJbiA9IHN0cmxlbiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0pOwotCQkJCQltZW1jcHkgKG1lbSwgc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0sIG4pOwotCQkJCQltZW0gKz0gbjsKLQkJCQkgICAgICB9Ci0KLQkJCQkgICAgaW5tZW1fdGFiX2VudHJ5LT5sZW5ndGggPQotCQkJCSAgICAgIG1lbSAtIGlubWVtX3RhYl9lbnRyeS0+cG9pbnRlcjsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQotCQkJICAgIGsrKzsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBpZiAoayAhPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzKQotCQkgICAgICBhYm9ydCAoKTsKLQotCQkgICAgLyogQ29tcHV0ZSB0aGUgYXVnbWVudGVkIGhhc2ggdGFibGUuICAqLwotCQkgICAgZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+aGFzaF9zaXplOyBpKyspCi0JCSAgICAgIGlubWVtX2hhc2hfdGFiW2ldID0KLQkJCVcgKGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiLCBkb21haW4tPmhhc2hfdGFiW2ldKTsKLQkJICAgIGZvciAoaSA9IDA7IGkgPCBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOyBpKyspCi0JCSAgICAgIHsKLQkJCWNvbnN0IGNoYXIgKm1zZ2lkID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiW2ldLnBvaW50ZXI7Ci0JCQlubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKLQkJCW5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKLQkJCW5sc191aW50MzIgaW5jciA9Ci0JCQkgIDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7Ci0KLQkJCWZvciAoOzspCi0JCQkgIHsKLQkJCSAgICBpZiAoaW5tZW1faGFzaF90YWJbaWR4XSA9PSAwKQotCQkJICAgICAgewotCQkJCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICBVc2UgaXQuICAqLwotCQkJCWlubWVtX2hhc2hfdGFiW2lkeF0gPSAxICsgZG9tYWluLT5uc3RyaW5ncyArIGk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICB9Ci0KLQkJCSAgICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKLQkJCSAgICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgaWR4ICs9IGluY3I7Ci0JCQkgIH0KLQkJICAgICAgfQotCi0JCSAgICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzOwotCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWI7Ci0JCSAgICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBpbm1lbV90cmFuc19zeXNkZXBfdGFiOwotCi0JCSAgICBkb21haW4tPmhhc2hfdGFiID0gaW5tZW1faGFzaF90YWI7Ci0JCSAgICBkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiA9IDA7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKLQkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKLQkJICAgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7Ci0JCSAgfQotCi0JCWZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKLQkJZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBOVUxMOwotCQlkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgcmV2aXNpb24uICAqLwotICAgIGludmFsaWQ6Ci0gICAgICAvKiBUaGlzIGlzIGFuIGludmFsaWQgLm1vIGZpbGUuICAqLwotICAgICAgaWYgKGRvbWFpbi0+bWFsbG9jZWQpCi0JZnJlZSAoZG9tYWluLT5tYWxsb2NlZCk7Ci0jaWZkZWYgSEFWRV9NTUFQCi0gICAgICBpZiAodXNlX21tYXApCi0JbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc2l6ZSk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlmcmVlIChkYXRhKTsKLSAgICAgIGZyZWUgKGRvbWFpbik7Ci0gICAgICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIE5vdyBpbml0aWFsaXplIHRoZSBjaGFyYWN0ZXIgc2V0IGNvbnZlcnRlciBmcm9tIHRoZSBjaGFyYWN0ZXIgc2V0Ci0gICAgIHRoZSBmaWxlIGlzIGVuY29kZWQgd2l0aCAoZm91bmQgaW4gdGhlIGhlYWRlciBlbnRyeSkgdG8gdGhlIGRvbWFpbidzCi0gICAgIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0IG9yIHRoZSBsb2NhbGUncyBjaGFyYWN0ZXIgc2V0LiAgKi8KLSAgbnVsbGVudHJ5ID0gX25sX2luaXRfZG9tYWluX2NvbnYgKGRvbWFpbl9maWxlLCBkb21haW4sIGRvbWFpbmJpbmRpbmcpOwotCi0gIC8qIEFsc28gbG9vayBmb3IgYSBwbHVyYWwgc3BlY2lmaWNhdGlvbi4gICovCi0gIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKG51bGxlbnRyeSwgJmRvbWFpbi0+cGx1cmFsLCAmZG9tYWluLT5ucGx1cmFscyk7Ci19Ci0KLQotI2lmZGVmIF9MSUJDCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX25sX3VubG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4pCi17Ci0gIGlmIChkb21haW4tPnBsdXJhbCAhPSAmX19nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbCkKLSAgICBfX2dldHRleHRfZnJlZV9leHAgKGRvbWFpbi0+cGx1cmFsKTsKLQotICBfbmxfZnJlZV9kb21haW5fY29udiAoZG9tYWluKTsKLQotICBpZiAoZG9tYWluLT5tYWxsb2NlZCkKLSAgICBmcmVlIChkb21haW4tPm1hbGxvY2VkKTsKLQotIyBpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCi0gIGlmIChkb21haW4tPnVzZV9tbWFwKQotICAgIG11bm1hcCAoKGNhZGRyX3QpIGRvbWFpbi0+ZGF0YSwgZG9tYWluLT5tbWFwX3NpemUpOwotICBlbHNlCi0jIGVuZGlmCS8qIF9QT1NJWF9NQVBQRURfRklMRVMgKi8KLSAgICBmcmVlICgodm9pZCAqKSBkb21haW4tPmRhdGEpOwotCi0gIGZyZWUgKGRvbWFpbik7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2NhbGNoYXJzZXQuYyBiL3VuaXgvaW50bC9sb2NhbGNoYXJzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2NWYxMC4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvbG9jYWxjaGFyc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KLQotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLS8qIFNwZWNpZmljYXRpb24uICAqLwotI2luY2x1ZGUgImxvY2FsY2hhcnNldC5oIgotCi0jaWYgSEFWRV9TVERERUZfSAotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBIQVZFX1NUUklOR19ICi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaWYgSEFWRV9TVERMSUJfSAotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KLSMgdW5kZWYgV0lOMzIgICAvKiBhdm9pZCB3YXJuaW5nIG9uIG1pbmd3MzIgKi8KLSMgZGVmaW5lIFdJTjMyCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX19FTVhfXwotLyogQXNzdW1lIEVNWCBwcm9ncmFtIHJ1bnMgb24gT1MvMiwgZXZlbiBpZiBjb21waWxlZCB1bmRlciBET1MuICAqLwotIyBkZWZpbmUgT1MyCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIFdJTjMyCi0jIGlmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAotIyAgaW5jbHVkZSA8bGFuZ2luZm8uaD4KLSMgZWxzZQotIyAgaWYgSEFWRV9TRVRMT0NBTEUKLSMgICBpbmNsdWRlIDxsb2NhbGUuaD4KLSMgIGVuZGlmCi0jIGVuZGlmCi0jZWxpZiBkZWZpbmVkIFdJTjMyCi0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2lmIGRlZmluZWQgT1MyCi0jIGRlZmluZSBJTkNMX0RPUwotIyBpbmNsdWRlIDxvczIuaD4KLSNlbmRpZgotCi0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0jIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCi0jZWxzZQotIyBkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0gIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCi0jZW5kaWYKLQotI2lmbmRlZiBESVJFQ1RPUllfU0VQQVJBVE9SCi0jIGRlZmluZSBESVJFQ1RPUllfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0KLSNpZm5kZWYgSVNTTEFTSAotIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09IERJUkVDVE9SWV9TRVBBUkFUT1IpCi0jZW5kaWYKLQotI2lmIEhBVkVfREVDTF9HRVRDX1VOTE9DS0VECi0jIHVuZGVmIGdldGMKLSMgZGVmaW5lIGdldGMgZ2V0Y191bmxvY2tlZAotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3RhdGljIHZhcmlhYmxlIGlzIGRlY2xhcmVkICd2b2xhdGlsZScgdG8gYXZvaWQgYQotICAgcG9zc2libGUgbXVsdGl0aHJlYWQgcHJvYmxlbSBpbiB0aGUgZnVuY3Rpb24gZ2V0X2NoYXJzZXRfYWxpYXNlcy4gSWYgd2UKLSAgIGFyZSBydW5uaW5nIGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQsIGFuZCBpZiB0d28gdGhyZWFkcyBpbml0aWFsaXplCi0gICAnY2hhcnNldF9hbGlhc2VzJyBzaW11bHRhbmVvdXNseSwgYm90aCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgdmFsdWUsCi0gICBhbmQgZXZlcnl0aGluZyB3aWxsIGJlIG9rIGlmIHRoZSB0d28gYXNzaWdubWVudHMgdG8gJ2NoYXJzZXRfYWxpYXNlcycKLSAgIGFyZSBhdG9taWMuIEJ1dCBJIGRvbid0IGtub3cgd2hhdCB3aWxsIGhhcHBlbiBpZiB0aGUgdHdvIGFzc2lnbm1lbnRzIG1peC4gICovCi0jaWYgX19TVERDX18gIT0gMQotIyBkZWZpbmUgdm9sYXRpbGUgLyogZW1wdHkgKi8KLSNlbmRpZgotLyogUG9pbnRlciB0byB0aGUgY29udGVudHMgb2YgdGhlIGNoYXJzZXQuYWxpYXMgZmlsZSwgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgotICAgcmVhZCwgZWxzZSBOVUxMLiAgSXRzIGZvcm1hdCBpczoKLSAgIEFMSUFTXzEgJ1wwJyBDQU5PTklDQUxfMSAnXDAnIC4uLiBBTElBU19uICdcMCcgQ0FOT05JQ0FMX24gJ1wwJyAnXDAnICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiB2b2xhdGlsZSBjaGFyc2V0X2FsaWFzZXM7Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2NoYXJzZXRfYWxpYXNlcyAoKQotewotICBjb25zdCBjaGFyICpjcDsKLQotICBjcCA9IGNoYXJzZXRfYWxpYXNlczsKLSAgaWYgKGNwID09IE5VTEwpCi0gICAgewotI2lmICEoZGVmaW5lZCBWTVMgfHwgZGVmaW5lZCBXSU4zMikKLSAgICAgIEZJTEUgKmZwOwotICAgICAgY29uc3QgY2hhciAqZGlyID0gcmVsb2NhdGUgKExJQkRJUik7Ci0gICAgICBjb25zdCBjaGFyICpiYXNlID0gImNoYXJzZXQuYWxpYXMiOwotICAgICAgY2hhciAqZmlsZV9uYW1lOwotCi0gICAgICAvKiBDb25jYXRlbmF0ZSBkaXIgYW5kIGJhc2UgaW50byBmcmVzaGx5IGFsbG9jYXRlZCBmaWxlX25hbWUuICAqLwotICAgICAgewotCXNpemVfdCBkaXJfbGVuID0gc3RybGVuIChkaXIpOwotCXNpemVfdCBiYXNlX2xlbiA9IHN0cmxlbiAoYmFzZSk7Ci0JaW50IGFkZF9zbGFzaCA9IChkaXJfbGVuID4gMCAmJiAhSVNTTEFTSCAoZGlyW2Rpcl9sZW4gLSAxXSkpOwotCWZpbGVfbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlyX2xlbiArIGFkZF9zbGFzaCArIGJhc2VfbGVuICsgMSk7Ci0JaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQotCSAgewotCSAgICBtZW1jcHkgKGZpbGVfbmFtZSwgZGlyLCBkaXJfbGVuKTsKLQkgICAgaWYgKGFkZF9zbGFzaCkKLQkgICAgICBmaWxlX25hbWVbZGlyX2xlbl0gPSBESVJFQ1RPUllfU0VQQVJBVE9SOwotCSAgICBtZW1jcHkgKGZpbGVfbmFtZSArIGRpcl9sZW4gKyBhZGRfc2xhc2gsIGJhc2UsIGJhc2VfbGVuICsgMSk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCB8fCAoZnAgPSBmb3BlbiAoZmlsZV9uYW1lLCAiciIpKSA9PSBOVUxMKQotCS8qIE91dCBvZiBtZW1vcnkgb3IgZmlsZSBub3QgZm91bmQsIHRyZWF0IGl0IGFzIGVtcHR5LiAgKi8KLQljcCA9ICIiOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFBhcnNlIHRoZSBmaWxlJ3MgY29udGVudHMuICAqLwotCSAgaW50IGM7Ci0JICBjaGFyIGJ1ZjFbNTArMV07Ci0JICBjaGFyIGJ1ZjJbNTArMV07Ci0JICBjaGFyICpyZXNfcHRyID0gTlVMTDsKLQkgIHNpemVfdCByZXNfc2l6ZSA9IDA7Ci0JICBzaXplX3QgbDEsIGwyOwotCi0JICBmb3IgKDs7KQotCSAgICB7Ci0JICAgICAgYyA9IGdldGMgKGZwKTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCWJyZWFrOwotCSAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoYyA9PSAnIycpCi0JCXsKLQkJICAvKiBTa2lwIGNvbW1lbnQsIHRvIGVuZCBvZiBsaW5lLiAgKi8KLQkJICBkbwotCQkgICAgYyA9IGdldGMgKGZwKTsKLQkJICB3aGlsZSAoIShjID09IEVPRiB8fCBjID09ICdcbicpKTsKLQkJICBpZiAoYyA9PSBFT0YpCi0JCSAgICBicmVhazsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIHVuZ2V0YyAoYywgZnApOwotCSAgICAgIGlmIChmc2NhbmYgKGZwLCAiJTUwcyAlNTBzIiwgYnVmMSwgYnVmMikgPCAyKQotCQlicmVhazsKLQkgICAgICBsMSA9IHN0cmxlbiAoYnVmMSk7Ci0JICAgICAgbDIgPSBzdHJsZW4gKGJ1ZjIpOwotCSAgICAgIGlmIChyZXNfc2l6ZSA9PSAwKQotCQl7Ci0JCSAgcmVzX3NpemUgPSBsMSArIDEgKyBsMiArIDE7Ci0JCSAgcmVzX3B0ciA9IChjaGFyICopIG1hbGxvYyAocmVzX3NpemUgKyAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlc19zaXplICs9IGwxICsgMSArIGwyICsgMTsKLQkJICByZXNfcHRyID0gKGNoYXIgKikgcmVhbGxvYyAocmVzX3B0ciwgcmVzX3NpemUgKyAxKTsKLQkJfQotCSAgICAgIGlmIChyZXNfcHRyID09IE5VTEwpCi0JCXsKLQkJICAvKiBPdXQgb2YgbWVtb3J5LiAqLwotCQkgIHJlc19zaXplID0gMDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIHN0cmNweSAocmVzX3B0ciArIHJlc19zaXplIC0gKGwyICsgMSkgLSAobDEgKyAxKSwgYnVmMSk7Ci0JICAgICAgc3RyY3B5IChyZXNfcHRyICsgcmVzX3NpemUgLSAobDIgKyAxKSwgYnVmMik7Ci0JICAgIH0KLQkgIGZjbG9zZSAoZnApOwotCSAgaWYgKHJlc19zaXplID09IDApCi0JICAgIGNwID0gIiI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqKHJlc19wdHIgKyByZXNfc2l6ZSkgPSAnXDAnOwotCSAgICAgIGNwID0gcmVzX3B0cjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQotCWZyZWUgKGZpbGVfbmFtZSk7Ci0KLSNlbHNlCi0KLSMgaWYgZGVmaW5lZCBWTVMKLSAgICAgIC8qIFRvIGF2b2lkIHRoZSB0cm91YmxlcyBvZiBhbiBleHRyYSBmaWxlIGNoYXJzZXQuYWxpYXNfdm1zIGluIHRoZQotCSBzb3VyY2VzIG9mIG1hbnkgR05VIHBhY2thZ2VzLCBzaW1wbHkgaW5saW5lIHRoZSBhbGlhc2VzIGhlcmUuICAqLwotICAgICAgLyogVGhlIGxpc3Qgb2YgZW5jb2RpbmdzIGlzIHRha2VuIGZyb20gdGhlIE9wZW5WTVMgNy4zLTEgZG9jdW1lbnRhdGlvbgotCSAiQ29tcGFxIEMgUnVuLVRpbWUgTGlicmFyeSBSZWZlcmVuY2UgTWFudWFsIGZvciBPcGVuVk1TIHN5c3RlbXMiCi0JIHNlY3Rpb24gMTAuNyAiSGFuZGxpbmcgRGlmZmVyZW50IENoYXJhY3RlciBTZXRzIi4gICovCi0gICAgICBjcCA9ICJJU084ODU5LTEiICJcMCIgIklTTy04ODU5LTEiICJcMCIKLQkgICAiSVNPODg1OS0yIiAiXDAiICJJU08tODg1OS0yIiAiXDAiCi0JICAgIklTTzg4NTktNSIgIlwwIiAiSVNPLTg4NTktNSIgIlwwIgotCSAgICJJU084ODU5LTciICJcMCIgIklTTy04ODU5LTciICJcMCIKLQkgICAiSVNPODg1OS04IiAiXDAiICJJU08tODg1OS04IiAiXDAiCi0JICAgIklTTzg4NTktOSIgIlwwIiAiSVNPLTg4NTktOSIgIlwwIgotCSAgIC8qIEphcGFuZXNlICovCi0JICAgImV1Y0pQIiAiXDAiICJFVUMtSlAiICJcMCIKLQkgICAiU0pJUyIgIlwwIiAiU0hJRlRfSklTIiAiXDAiCi0JICAgIkRFQ0tBTkpJIiAiXDAiICJERUMtS0FOSkkiICJcMCIKLQkgICAiU0RFQ0tBTkpJIiAiXDAiICJFVUMtSlAiICJcMCIKLQkgICAvKiBDaGluZXNlICovCi0JICAgImV1Y1RXIiAiXDAiICJFVUMtVFciICJcMCIKLQkgICAiREVDSEFOWVUiICJcMCIgIkRFQy1IQU5ZVSIgIlwwIgotCSAgICJERUNIQU5aSSIgIlwwIiAiR0IyMzEyIiAiXDAiCi0JICAgLyogS29yZWFuICovCi0JICAgIkRFQ0tPUkVBTiIgIlwwIiAiRVVDLUtSIiAiXDAiOwotIyBlbmRpZgotCi0jIGlmIGRlZmluZWQgV0lOMzIKLSAgICAgIC8qIFRvIGF2b2lkIHRoZSB0cm91YmxlcyBvZiBpbnN0YWxsaW5nIGEgc2VwYXJhdGUgZmlsZSBpbiB0aGUgc2FtZQotCSBkaXJlY3RvcnkgYXMgdGhlIERMTCBhbmQgb2YgcmV0cmlldmluZyB0aGUgRExMJ3MgZGlyZWN0b3J5IGF0Ci0JIHJ1bnRpbWUsIHNpbXBseSBpbmxpbmUgdGhlIGFsaWFzZXMgaGVyZS4gICovCi0KLSAgICAgIGNwID0gIkNQOTM2IiAiXDAiICJHQksiICJcMCIKLQkgICAiQ1AxMzYxIiAiXDAiICJKT0hBQiIgIlwwIgotCSAgICJDUDIwMTI3IiAiXDAiICJBU0NJSSIgIlwwIgotCSAgICJDUDIwODY2IiAiXDAiICJLT0k4LVIiICJcMCIKLQkgICAiQ1AyMTg2NiIgIlwwIiAiS09JOC1SVSIgIlwwIgotCSAgICJDUDI4NTkxIiAiXDAiICJJU08tODg1OS0xIiAiXDAiCi0JICAgIkNQMjg1OTIiICJcMCIgIklTTy04ODU5LTIiICJcMCIKLQkgICAiQ1AyODU5MyIgIlwwIiAiSVNPLTg4NTktMyIgIlwwIgotCSAgICJDUDI4NTk0IiAiXDAiICJJU08tODg1OS00IiAiXDAiCi0JICAgIkNQMjg1OTUiICJcMCIgIklTTy04ODU5LTUiICJcMCIKLQkgICAiQ1AyODU5NiIgIlwwIiAiSVNPLTg4NTktNiIgIlwwIgotCSAgICJDUDI4NTk3IiAiXDAiICJJU08tODg1OS03IiAiXDAiCi0JICAgIkNQMjg1OTgiICJcMCIgIklTTy04ODU5LTgiICJcMCIKLQkgICAiQ1AyODU5OSIgIlwwIiAiSVNPLTg4NTktOSIgIlwwIgotCSAgICJDUDI4NjA1IiAiXDAiICJJU08tODg1OS0xNSIgIlwwIjsKLSMgZW5kaWYKLSNlbmRpZgotCi0gICAgICBjaGFyc2V0X2FsaWFzZXMgPSBjcDsKLSAgICB9Ci0KLSAgcmV0dXJuIGNwOwotfQotCi0vKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgY2Fub25pY2FsaXplIGl0Ci0gICBpbnRvIG9uZSBvZiB0aGUgY2Fub25pY2FsIG5hbWVzIGxpc3RlZCBpbiBjb25maWcuY2hhcnNldC4KLSAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLgotICAgSWYgdGhlIGNhbm9uaWNhbCBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB0aGUgcmVzdWx0IGlzIGEgbm9uLWNhbm9uaWNhbAotICAgbmFtZS4gICovCi0KLSNpZmRlZiBTVEFUSUMKLVNUQVRJQwotI2VuZGlmCi1jb25zdCBjaGFyICoKLWxvY2FsZV9jaGFyc2V0ICgpCi17Ci0gIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gIGNvbnN0IGNoYXIgKmFsaWFzZXM7Ci0KLSNpZiAhKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBPUzIpCi0KLSMgaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCi0KLSAgLyogTW9zdCBzeXN0ZW1zIHN1cHBvcnQgbmxfbGFuZ2luZm8gKENPREVTRVQpIG5vd2FkYXlzLiAgKi8KLSAgY29kZXNldCA9IG5sX2xhbmdpbmZvIChDT0RFU0VUKTsKLQotIyBlbHNlCi0KLSAgLyogT24gb2xkIHN5c3RlbXMgd2hpY2ggbGFjayBpdCwgdXNlIHNldGxvY2FsZSBvciBnZXRlbnYuICAqLwotICBjb25zdCBjaGFyICpsb2NhbGUgPSBOVUxMOwotCi0gIC8qIEJ1dCBtb3N0IG9sZCBzeXN0ZW1zIGRvbid0IGhhdmUgYSBjb21wbGV0ZSBzZXQgb2YgbG9jYWxlcy4gIFNvbWUKLSAgICAgKGxpa2UgU3VuT1MgNCBvciBESkdQUCkgaGF2ZSBvbmx5IHRoZSBDIGxvY2FsZS4gIFRoZXJlZm9yZSB3ZSBkb24ndAotICAgICB1c2Ugc2V0bG9jYWxlIGhlcmU7IGl0IHdvdWxkIHJldHVybiAiQyIgd2hlbiBpdCBkb2Vzbid0IHN1cHBvcnQgdGhlCi0gICAgIGxvY2FsZSBuYW1lIHRoZSB1c2VyIGhhcyBzZXQuICAqLwotIyAgaWYgSEFWRV9TRVRMT0NBTEUgJiYgMAotICBsb2NhbGUgPSBzZXRsb2NhbGUgKExDX0NUWVBFLCBOVUxMKTsKLSMgIGVuZGlmCi0gIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLQl7Ci0JICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19DVFlQRSIpOwotCSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotCSAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7Ci0JfQotICAgIH0KLQotICAvKiBPbiBzb21lIG9sZCBzeXN0ZW1zLCBvbmUgdXNlZCB0byBzZXQgbG9jYWxlID0gImlzbzg4NTlfMSIuIE9uIG90aGVycywKLSAgICAgeW91IHNldCBpdCB0byAibGFuZ3VhZ2VfQ09VTlRSWS5jaGFyc2V0Ii4gSW4gYW55IGNhc2UsIHdlIHJlc29sdmUgaXQKLSAgICAgdGhyb3VnaCB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KLSAgY29kZXNldCA9IGxvY2FsZTsKLQotIyBlbmRpZgotCi0jZWxpZiBkZWZpbmVkIFdJTjMyCi0KLSAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOwotCi0gIC8qIFdvZTMyIGhhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbG9jYWxlJ3MgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLwotICBzcHJpbnRmIChidWYsICJDUCV1IiwgR2V0QUNQICgpKTsKLSAgY29kZXNldCA9IGJ1ZjsKLQotI2VsaWYgZGVmaW5lZCBPUzIKLQotICBjb25zdCBjaGFyICpsb2NhbGU7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsyICsgMTAgKyAxXTsKLSAgVUxPTkcgY3BbM107Ci0gIFVMT05HIGNwbGVuOwotCi0gIC8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGNvZGVzZXQsIGFzIHNldCBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSwKLSAgICAgd2l0aCBzdGFuZGFyZCBsYW5ndWFnZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLwotICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7Ci0gICAgICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCi0JbG9jYWxlID0gZ2V0ZW52ICgiTEFORyIpOwotICAgIH0KLSAgaWYgKGxvY2FsZSAhPSBOVUxMICYmIGxvY2FsZVswXSAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBsb2NhbGUgbmFtZSBjb250YWlucyBhbiBlbmNvZGluZyBhZnRlciB0aGUgZG90LCByZXR1cm4gaXQuICAqLwotICAgICAgY29uc3QgY2hhciAqZG90ID0gc3RyY2hyIChsb2NhbGUsICcuJyk7Ci0KLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICptb2RpZmllcjsKLQotCSAgZG90Kys7Ci0JICAvKiBMb29rIGZvciB0aGUgcG9zc2libGUgQC4uLiB0cmFpbGVyIGFuZCByZW1vdmUgaXQsIGlmIGFueS4gICovCi0JICBtb2RpZmllciA9IHN0cmNociAoZG90LCAnQCcpOwotCSAgaWYgKG1vZGlmaWVyID09IE5VTEwpCi0JICAgIHJldHVybiBkb3Q7Ci0JICBpZiAobW9kaWZpZXIgLSBkb3QgPCBzaXplb2YgKGJ1ZikpCi0JICAgIHsKLQkgICAgICBtZW1jcHkgKGJ1ZiwgZG90LCBtb2RpZmllciAtIGRvdCk7Ci0JICAgICAgYnVmIFttb2RpZmllciAtIGRvdF0gPSAnXDAnOwotCSAgICAgIHJldHVybiBidWY7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlc29sdmUgdGhyb3VnaCB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KLSAgICAgIGNvZGVzZXQgPSBsb2NhbGU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT1MvMiBoYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxvY2FsZSdzIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChEb3NRdWVyeUNwIChzaXplb2YgKGNwKSwgY3AsICZjcGxlbikpCi0JY29kZXNldCA9ICIiOwotICAgICAgZWxzZQotCXsKLQkgIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBjcFswXSk7Ci0JICBjb2Rlc2V0ID0gYnVmOwotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmIChjb2Rlc2V0ID09IE5VTEwpCi0gICAgLyogVGhlIGNhbm9uaWNhbCBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgKi8KLSAgICBjb2Rlc2V0ID0gIiI7Ci0KLSAgLyogUmVzb2x2ZSBhbGlhcy4gKi8KLSAgZm9yIChhbGlhc2VzID0gZ2V0X2NoYXJzZXRfYWxpYXNlcyAoKTsKLSAgICAgICAqYWxpYXNlcyAhPSAnXDAnOwotICAgICAgIGFsaWFzZXMgKz0gc3RybGVuIChhbGlhc2VzKSArIDEsIGFsaWFzZXMgKz0gc3RybGVuIChhbGlhc2VzKSArIDEpCi0gICAgaWYgKHN0cmNtcCAoY29kZXNldCwgYWxpYXNlcykgPT0gMAotCXx8IChhbGlhc2VzWzBdID09ICcqJyAmJiBhbGlhc2VzWzFdID09ICdcMCcpKQotICAgICAgewotCWNvZGVzZXQgPSBhbGlhc2VzICsgc3RybGVuIChhbGlhc2VzKSArIDE7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgLyogRG9uJ3QgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gIEdOVSBsaWJjIGFuZCBHTlUgbGliaWNvbnYgaW50ZXJwcmV0Ci0gICAgIHRoZSBlbXB0eSBzdHJpbmcgYXMgZGVub3RpbmcgInRoZSBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmciLAotICAgICB0aHVzIEdOVSBsaWJpY29udiB3b3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYSBzZWNvbmQgdGltZS4gICovCi0gIGlmIChjb2Rlc2V0WzBdID09ICdcMCcpCi0gICAgY29kZXNldCA9ICJBU0NJSSI7Ci0KLSAgcmV0dXJuIGNvZGVzZXQ7Ci19CmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9jYWxjaGFyc2V0LmggYi91bml4L2ludGwvbG9jYWxjaGFyc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTM3ZTcuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL2xvY2FsY2hhcnNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDSEFSU0VUIExpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9MT0NBTENIQVJTRVRfSAotI2RlZmluZSBfTE9DQUxDSEFSU0VUX0gKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAotICAgaW50byBvbmUgb2YgdGhlIGNhbm9uaWNhbCBuYW1lcyBsaXN0ZWQgaW4gY29uZmlnLmNoYXJzZXQuCi0gICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4KLSAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKLSAgIG5hbWUuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKiBsb2NhbGVfY2hhcnNldCAodm9pZCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLyogX0xPQ0FMQ0hBUlNFVF9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9jYWxlLmFsaWFzIGIvdW5peC9pbnRsL2xvY2FsZS5hbGlhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2YmIyNS4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvbG9jYWxlLmFsaWFzCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyBMb2NhbGUgbmFtZSBhbGlhcyBkYXRhIGJhc2UuCi0jIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotIyBVU0EuCi0KLSMgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgb2YKLSMgdGhlIFggV2luZG93IFN5c3RlbSwgd2hpY2ggbm9ybWFsbHkgY2FuIGJlIGZvdW5kIGluCi0jCS91c3IvbGliL1gxMS9sb2NhbGUvbG9jYWxlLmFsaWFzCi0jIEEgc2luZ2xlIGxpbmUgY29udGFpbnMgdHdvIGZpZWxkczogYW4gYWxpYXMgYW5kIGEgc3Vic3RpdHV0aW9uIHZhbHVlLgotIyBBbGwgZW50cmllcyBhcmUgY2FzZSBpbmRlcGVuZGVudC4KLQotIyBOb3RlOiBUaGlzIGZpbGUgaXMgZmFyIGZyb20gYmVpbmcgY29tcGxldGUuICBJZiB5b3UgaGF2ZSBhIHZhbHVlIGZvcgotIyB5b3VyIG93biBzaXRlIHdoaWNoIHlvdSB0aGluayBtaWdodCBiZSB1c2VmdWwgZm9yIG90aGVycyB0b28sIHNoYXJlCi0jIGl0IHdpdGggdGhlIHJlc3Qgb2YgdXMuICBTZW5kIGl0IHVzaW5nIHRoZSBgZ2xpYmNidWcnIHNjcmlwdCB0bwotIyBidWdzQGdudS5vcmcuCi0KLSMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAKLQotYm9rbWFsCQluYl9OTy5JU08tODg1OS0xCi1ib2tt5WwJCW5iX05PLklTTy04ODU5LTEKLWNhdGFsYW4JCWNhX0VTLklTTy04ODU5LTEKLWNyb2F0aWFuCWhyX0hSLklTTy04ODU5LTIKLWN6ZWNoCQljc19DWi5JU08tODg1OS0yCi1kYW5pc2ggICAgICAgICAgZGFfREsuSVNPLTg4NTktMQotZGFuc2sJCWRhX0RLLklTTy04ODU5LTEKLWRldXRzY2gJCWRlX0RFLklTTy04ODU5LTEKLWR1dGNoCQlubF9OTC5JU08tODg1OS0xCi1lZXN0aQkJZXRfRUUuSVNPLTg4NTktMQotZXN0b25pYW4JZXRfRUUuSVNPLTg4NTktMQotZmlubmlzaCAgICAgICAgIGZpX0ZJLklTTy04ODU5LTEKLWZyYW7nYWlzCWZyX0ZSLklTTy04ODU5LTEKLWZyZW5jaAkJZnJfRlIuSVNPLTg4NTktMQotZ2FsZWdvCQlnbF9FUy5JU08tODg1OS0xCi1nYWxpY2lhbglnbF9FUy5JU08tODg1OS0xCi1nZXJtYW4JCWRlX0RFLklTTy04ODU5LTEKLWdyZWVrICAgICAgICAgICBlbF9HUi5JU08tODg1OS03Ci1oZWJyZXcgICAgICAgICAgaGVfSUwuSVNPLTg4NTktOAotaHJ2YXRza2kJaHJfSFIuSVNPLTg4NTktMgotaHVuZ2FyaWFuICAgICAgIGh1X0hVLklTTy04ODU5LTIKLWljZWxhbmRpYyAgICAgICBpc19JUy5JU08tODg1OS0xCi1pdGFsaWFuICAgICAgICAgaXRfSVQuSVNPLTg4NTktMQotamFwYW5lc2UJamFfSlAuZXVjSlAKLWphcGFuZXNlLmV1YwlqYV9KUC5ldWNKUAotamFfSlAJCWphX0pQLmV1Y0pQCi1qYV9KUC51amlzCWphX0pQLmV1Y0pQCi1qYXBhbmVzZS5zamlzCWphX0pQLlNKSVMKLWtvcmVhbgkJa29fS1IuZXVjS1IKLWtvcmVhbi5ldWMgCWtvX0tSLmV1Y0tSCi1rb19LUgkJa29fS1IuZXVjS1IKLWxpdGh1YW5pYW4gICAgICBsdF9MVC5JU08tODg1OS0xMwotbm9fTk8JCW5iX05PLklTTy04ODU5LTEKLW5vX05PLklTTy04ODU5LTEgbmJfTk8uSVNPLTg4NTktMQotbm9yd2VnaWFuICAgICAgIG5iX05PLklTTy04ODU5LTEKLW55bm9yc2sJCW5uX05PLklTTy04ODU5LTEKLXBvbGlzaCAgICAgICAgICBwbF9QTC5JU08tODg1OS0yCi1wb3J0dWd1ZXNlICAgICAgcHRfUFQuSVNPLTg4NTktMQotcm9tYW5pYW4gICAgICAgIHJvX1JPLklTTy04ODU5LTIKLXJ1c3NpYW4gICAgICAgICBydV9SVS5JU08tODg1OS01Ci1zbG92YWsgICAgICAgICAgc2tfU0suSVNPLTg4NTktMgotc2xvdmVuZSAgICAgICAgIHNsX1NJLklTTy04ODU5LTIKLXNsb3ZlbmlhbiAgICAgICBzbF9TSS5JU08tODg1OS0yCi1zcGFuaXNoICAgICAgICAgZXNfRVMuSVNPLTg4NTktMQotc3dlZGlzaCAgICAgICAgIHN2X1NFLklTTy04ODU5LTEKLXRoYWkJCXRoX1RILlRJUy02MjAKLXR1cmtpc2ggICAgICAgICB0cl9UUi5JU08tODg1OS05CmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9jYWxlYWxpYXMuYyBiL3VuaXgvaW50bC9sb2NhbGVhbGlhcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFmODgxLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9sb2NhbGVhbGlhcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qIEhhbmRsZSBhbGlhc2VzIGZvciBsb2NhbGUgbmFtZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgotICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9fX0ZTRVRMT0NLSU5HCi0jIGluY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0jIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCi0jZWxzZQotIyBkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBzdHJjYXNlY21wIF9fc3RyY2FzZWNtcAotCi0jIGlmbmRlZiBtZW1wY3B5Ci0jICBkZWZpbmUgbWVtcGNweSBfX21lbXBjcHkKLSMgZW5kaWYKLSMgZGVmaW5lIEhBVkVfTUVNUENQWQkxCi0jIGRlZmluZSBIQVZFX19fRlNFVExPQ0tJTkcJMQotCi0vKiBXZSBuZWVkIGxvY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYW4gYmUgY2FsbGVkIGZyb20gZGlmZmVyZW50IHBsYWNlcy4gICovCi0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0KLV9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZCAoc3RhdGljLCBsb2NrKTsKLSNlbmRpZgotCi0jaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCi0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotI2VuZGlmCi0KLS8qIFNvbWUgb3B0aW1pemF0aW9ucyBmb3IgZ2xpYmMuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBGRU9GKGZwKQkJZmVvZl91bmxvY2tlZCAoZnApCi0jIGRlZmluZSBGR0VUUyhidWYsIG4sIGZwKQlmZ2V0c191bmxvY2tlZCAoYnVmLCBuLCBmcCkKLSNlbHNlCi0jIGRlZmluZSBGRU9GKGZwKQkJZmVvZiAoZnApCi0jIGRlZmluZSBGR0VUUyhidWYsIG4sIGZwKQlmZ2V0cyAoYnVmLCBuLCBmcCkKLSNlbmRpZgotCi0vKiBGb3IgdGhvc2UgbG9zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLwotI2Vsc2UKLSMgZGVmaW5lIGFsbG9jYShuKSBtYWxsb2MgKG4pCi0jIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9MSUJDX1JFRU5UUkFOVCB8fCBIQVZFX0RFQ0xfRkdFVFNfVU5MT0NLRUQKLSMgdW5kZWYgZmdldHMKLSMgZGVmaW5lIGZnZXRzKGJ1ZiwgbGVuLCBzKSBmZ2V0c191bmxvY2tlZCAoYnVmLCBsZW4sIHMpCi0jZW5kaWYKLSNpZiBkZWZpbmVkIF9MSUJDX1JFRU5UUkFOVCB8fCBIQVZFX0RFQ0xfRkVPRl9VTkxPQ0tFRAotIyB1bmRlZiBmZW9mCi0jIGRlZmluZSBmZW9mKHMpIGZlb2ZfdW5sb2NrZWQgKHMpCi0jZW5kaWYKLQotCi1zdHJ1Y3QgYWxpYXNfbWFwCi17Ci0gIGNvbnN0IGNoYXIgKmFsaWFzOwotICBjb25zdCBjaGFyICp2YWx1ZTsKLX07Ci0KLQotI2lmbmRlZiBfTElCQwotIyBkZWZpbmUgbGliY19mcmVlcmVzX3B0cihkZWNsKSBkZWNsCi0jZW5kaWYKLQotbGliY19mcmVlcmVzX3B0ciAoc3RhdGljIGNoYXIgKnN0cmluZ19zcGFjZSk7Ci1zdGF0aWMgc2l6ZV90IHN0cmluZ19zcGFjZV9hY3Q7Ci1zdGF0aWMgc2l6ZV90IHN0cmluZ19zcGFjZV9tYXg7Ci1saWJjX2ZyZWVyZXNfcHRyIChzdGF0aWMgc3RydWN0IGFsaWFzX21hcCAqbWFwKTsKLXN0YXRpYyBzaXplX3Qgbm1hcDsKLXN0YXRpYyBzaXplX3QgbWF4bWFwOwotCi0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc2l6ZV90IHJlYWRfYWxpYXNfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotc3RhdGljIGludCBleHRlbmRfYWxpYXNfdGFibGUgKHZvaWQpOwotc3RhdGljIGludCBhbGlhc19jb21wYXJlIChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLAotCQkJICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKTsKLQotCi1jb25zdCBjaGFyICoKLV9ubF9leHBhbmRfYWxpYXMgKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aDsKLSAgc3RydWN0IGFsaWFzX21hcCAqcmV0dmFsOwotICBjb25zdCBjaGFyICpyZXN1bHQgPSBOVUxMOwotICBzaXplX3QgYWRkZWQ7Ci0KLSNpZmRlZiBfTElCQwotICBfX2xpYmNfbG9ja19sb2NrIChsb2NrKTsKLSNlbmRpZgotCi0gIGlmIChsb2NhbGVfYWxpYXNfcGF0aCA9PSBOVUxMKQotICAgIGxvY2FsZV9hbGlhc19wYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxpYXNfbWFwIGl0ZW07Ci0KLSAgICAgIGl0ZW0uYWxpYXMgPSBuYW1lOwotCi0gICAgICBpZiAobm1hcCA+IDApCi0JcmV0dmFsID0gKHN0cnVjdCBhbGlhc19tYXAgKikgYnNlYXJjaCAoJml0ZW0sIG1hcCwgbm1hcCwKLQkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0JCQkJCSAgICAgICAoaW50ICgqKSAoY29uc3Qgdm9pZCAqLAotCQkJCQkJCSBjb25zdCB2b2lkICopCi0JCQkJCQkpIGFsaWFzX2NvbXBhcmUpOwotICAgICAgZWxzZQotCXJldHZhbCA9IE5VTEw7Ci0KLSAgICAgIC8qIFdlIHJlYWxseSBmb3VuZCBhbiBhbGlhcy4gIFJldHVybiB0aGUgdmFsdWUuICAqLwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIHJlc3VsdCA9IHJldHZhbC0+dmFsdWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIFBlcmhhcHMgd2UgY2FuIGZpbmQgYW5vdGhlciBhbGlhcyBmaWxlLiAgKi8KLSAgICAgIGFkZGVkID0gMDsKLSAgICAgIHdoaWxlIChhZGRlZCA9PSAwICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcpCi0JewotCSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSA9PSBQQVRIX1NFUEFSQVRPUikKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQkgIHN0YXJ0ID0gbG9jYWxlX2FsaWFzX3BhdGg7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnCi0JCSAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSBQQVRIX1NFUEFSQVRPUikKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQotCSAgaWYgKHN0YXJ0IDwgbG9jYWxlX2FsaWFzX3BhdGgpCi0JICAgIGFkZGVkID0gcmVhZF9hbGlhc19maWxlIChzdGFydCwgbG9jYWxlX2FsaWFzX3BhdGggLSBzdGFydCk7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGFkZGVkICE9IDApOwotCi0jaWZkZWYgX0xJQkMKLSAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHNpemVfdAotaW50ZXJuYWxfZnVuY3Rpb24KLXJlYWRfYWxpYXNfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pCi17Ci0gIEZJTEUgKmZwOwotICBjaGFyICpmdWxsX2ZuYW1lOwotICBzaXplX3QgYWRkZWQ7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGFsaWFzZmlsZVtdID0gIi9sb2NhbGUuYWxpYXMiOwotCi0gIGZ1bGxfZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGZuYW1lX2xlbiArIHNpemVvZiBhbGlhc2ZpbGUpOwotI2lmZGVmIEhBVkVfTUVNUENQWQotICBtZW1wY3B5IChtZW1wY3B5IChmdWxsX2ZuYW1lLCBmbmFtZSwgZm5hbWVfbGVuKSwKLQkgICBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOwotI2Vsc2UKLSAgbWVtY3B5IChmdWxsX2ZuYW1lLCBmbmFtZSwgZm5hbWVfbGVuKTsKLSAgbWVtY3B5ICgmZnVsbF9mbmFtZVtmbmFtZV9sZW5dLCBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOwotI2VuZGlmCi0KLSAgZnAgPSBmb3BlbiAocmVsb2NhdGUgKGZ1bGxfZm5hbWUpLCAiciIpOwotICBmcmVlYSAoZnVsbF9mbmFtZSk7Ci0gIGlmIChmcCA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0jaWZkZWYgSEFWRV9fX0ZTRVRMT0NLSU5HCi0gIC8qIE5vIHRocmVhZHMgcHJlc2VudC4gICovCi0gIF9fZnNldGxvY2tpbmcgKGZwLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0jZW5kaWYKLQotICBhZGRlZCA9IDA7Ci0gIHdoaWxlICghRkVPRiAoZnApKQotICAgIHsKLSAgICAgIC8qIEl0IGlzIGEgcmVhc29uYWJsZSBhcHByb2FjaCB0byB1c2UgYSBmaXggYnVmZmVyIGhlcmUgYmVjYXVzZQotCSBhKSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCB0d28gZmllbGRzCi0JIGIpIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHVzYWJsZSBhcyBmaWxlIG5hbWVzIGFuZCBzbyBtdXN0IG5vdAotCSAgICBiZSB0aGF0IGxvbmcKLQkgV2UgYXZvaWQgYSBtdWx0aS1raWxvYnl0ZSBidWZmZXIgaGVyZSBzaW5jZSB0aGlzIHdvdWxkIHVzZSB1cAotCSBzdGFjayBzcGFjZSB3aGljaCB3ZSBtaWdodCBub3QgaGF2ZSBpZiB0aGUgcHJvZ3JhbSByYW4gb3V0IG9mCi0JIG1lbW9yeS4gICovCi0gICAgICBjaGFyIGJ1Zls0MDBdOwotICAgICAgY2hhciAqYWxpYXM7Ci0gICAgICBjaGFyICp2YWx1ZTsKLSAgICAgIGNoYXIgKmNwOwotCi0gICAgICBpZiAoRkdFVFMgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZnApID09IE5VTEwpCi0JLyogRU9GIHJlYWNoZWQuICAqLwotCWJyZWFrOwotCi0gICAgICBjcCA9IGJ1ZjsKLSAgICAgIC8qIElnbm9yZSBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQotCSsrY3A7Ci0KLSAgICAgIC8qIEEgbGVhZGluZyAnIycgc2lnbmFscyBhIGNvbW1lbnQgbGluZS4gICovCi0gICAgICBpZiAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnIycpCi0JewotCSAgYWxpYXMgPSBjcCsrOwotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCi0JICAgICsrY3A7Ci0JICAvKiBUZXJtaW5hdGUgYWxpYXMgbmFtZS4gICovCi0JICBpZiAoY3BbMF0gIT0gJ1wwJykKLQkgICAgKmNwKysgPSAnXDAnOwotCi0JICAvKiBOb3cgbG9vayBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFsdWUuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCi0JICAgICsrY3A7Ci0KLQkgIGlmIChjcFswXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGFsaWFzX2xlbjsKLQkgICAgICBzaXplX3QgdmFsdWVfbGVuOwotCi0JICAgICAgdmFsdWUgPSBjcCsrOwotCSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQotCQkrK2NwOwotCSAgICAgIC8qIFRlcm1pbmF0ZSB2YWx1ZS4gICovCi0JICAgICAgaWYgKGNwWzBdID09ICdcbicpCi0JCXsKLQkJICAvKiBUaGlzIGhhcyB0byBiZSBkb25lIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB0ZXN0Ci0JCSAgICAgZm9yIHRoZSBlbmQgb2YgbGluZSBwb3NzaWJsZS4gIFdlIGFyZSBsb29raW5nIGZvcgotCQkgICAgIHRoZSB0ZXJtaW5hdGluZyAnXG4nIHdoaWNoIGRvIG5vdCBvdmVyd3JpdGUgaGVyZS4gICovCi0JCSAgKmNwKysgPSAnXDAnOwotCQkgICpjcCA9ICdcbic7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjcFswXSAhPSAnXDAnKQotCQkqY3ArKyA9ICdcMCc7Ci0KLQkgICAgICBpZiAobm1hcCA+PSBtYXhtYXApCi0JCWlmIChfX2J1aWx0aW5fZXhwZWN0IChleHRlbmRfYWxpYXNfdGFibGUgKCksIDApKQotCQkgIHJldHVybiBhZGRlZDsKLQotCSAgICAgIGFsaWFzX2xlbiA9IHN0cmxlbiAoYWxpYXMpICsgMTsKLQkgICAgICB2YWx1ZV9sZW4gPSBzdHJsZW4gKHZhbHVlKSArIDE7Ci0KLQkgICAgICBpZiAoc3RyaW5nX3NwYWNlX2FjdCArIGFsaWFzX2xlbiArIHZhbHVlX2xlbiA+IHN0cmluZ19zcGFjZV9tYXgpCi0JCXsKLQkJICAvKiBJbmNyZWFzZSBzaXplIG9mIG1lbW9yeSBwb29sLiAgKi8KLQkJICBzaXplX3QgbmV3X3NpemUgPSAoc3RyaW5nX3NwYWNlX21heAotCQkJCSAgICAgKyAoYWxpYXNfbGVuICsgdmFsdWVfbGVuID4gMTAyNAotCQkJCQk/IGFsaWFzX2xlbiArIHZhbHVlX2xlbiA6IDEwMjQpKTsKLQkJICBjaGFyICpuZXdfcG9vbCA9IChjaGFyICopIHJlYWxsb2MgKHN0cmluZ19zcGFjZSwgbmV3X3NpemUpOwotCQkgIGlmIChuZXdfcG9vbCA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGFkZGVkOwotCi0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHN0cmluZ19zcGFjZSAhPSBuZXdfcG9vbCwgMCkpCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBpOwotCi0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBubWFwOyBpKyspCi0JCQl7Ci0JCQkgIG1hcFtpXS5hbGlhcyArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKLQkJCSAgbWFwW2ldLnZhbHVlICs9IG5ld19wb29sIC0gc3RyaW5nX3NwYWNlOwotCQkJfQotCQkgICAgfQotCi0JCSAgc3RyaW5nX3NwYWNlID0gbmV3X3Bvb2w7Ci0JCSAgc3RyaW5nX3NwYWNlX21heCA9IG5ld19zaXplOwotCQl9Ci0KLQkgICAgICBtYXBbbm1hcF0uYWxpYXMgPSBtZW1jcHkgKCZzdHJpbmdfc3BhY2Vbc3RyaW5nX3NwYWNlX2FjdF0sCi0JCQkJCWFsaWFzLCBhbGlhc19sZW4pOwotCSAgICAgIHN0cmluZ19zcGFjZV9hY3QgKz0gYWxpYXNfbGVuOwotCi0JICAgICAgbWFwW25tYXBdLnZhbHVlID0gbWVtY3B5ICgmc3RyaW5nX3NwYWNlW3N0cmluZ19zcGFjZV9hY3RdLAotCQkJCQl2YWx1ZSwgdmFsdWVfbGVuKTsKLQkgICAgICBzdHJpbmdfc3BhY2VfYWN0ICs9IHZhbHVlX2xlbjsKLQotCSAgICAgICsrbm1hcDsKLQkgICAgICArK2FkZGVkOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBQb3NzaWJseSBub3QgdGhlIHdob2xlIGxpbmUgZml0cyBpbnRvIHRoZSBidWZmZXIuICBJZ25vcmUKLQkgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuICAqLwotICAgICAgd2hpbGUgKHN0cmNociAoYnVmLCAnXG4nKSA9PSBOVUxMKQotCWlmIChGR0VUUyAoYnVmLCBzaXplb2YgYnVmLCBmcCkgPT0gTlVMTCkKLQkgIC8qIE1ha2Ugc3VyZSB0aGUgaW5uZXIgbG9vcCB3aWxsIGJlIGxlZnQuICBUaGUgb3V0ZXIgbG9vcAotCSAgICAgd2lsbCBleGl0IGF0IHRoZSBgZmVvZicgdGVzdC4gICovCi0JICBicmVhazsKLSAgICB9Ci0KLSAgLyogU2hvdWxkIHdlIHRlc3QgZm9yIGZlcnJvcigpPyAgSSB0aGluayB3ZSBoYXZlIHRvIHNpbGVudGx5IGlnbm9yZQotICAgICBlcnJvcnMuICAtLWRyZXBwZXIgICovCi0gIGZjbG9zZSAoZnApOwotCi0gIGlmIChhZGRlZCA+IDApCi0gICAgcXNvcnQgKG1hcCwgbm1hcCwgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLQkgICAoaW50ICgqKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSBhbGlhc19jb21wYXJlKTsKLQotICByZXR1cm4gYWRkZWQ7Ci19Ci0KLQotc3RhdGljIGludAotZXh0ZW5kX2FsaWFzX3RhYmxlICgpCi17Ci0gIHNpemVfdCBuZXdfc2l6ZTsKLSAgc3RydWN0IGFsaWFzX21hcCAqbmV3X21hcDsKLQotICBuZXdfc2l6ZSA9IG1heG1hcCA9PSAwID8gMTAwIDogMiAqIG1heG1hcDsKLSAgbmV3X21hcCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIHJlYWxsb2MgKG1hcCwgKG5ld19zaXplCi0JCQkJCQkqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpKTsKLSAgaWYgKG5ld19tYXAgPT0gTlVMTCkKLSAgICAvKiBTaW1wbHkgZG9uJ3QgZXh0ZW5kOiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNvcmUuICAqLwotICAgIHJldHVybiAtMTsKLQotICBtYXAgPSBuZXdfbWFwOwotICBtYXhtYXAgPSBuZXdfc2l6ZTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotYWxpYXNfY29tcGFyZSAoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMikKLXsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJDQVNFQ01QCi0gIHJldHVybiBzdHJjYXNlY21wIChtYXAxLT5hbGlhcywgbWFwMi0+YWxpYXMpOwotI2Vsc2UKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAxLT5hbGlhczsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBtYXAyLT5hbGlhczsKLSAgdW5zaWduZWQgY2hhciBjMSwgYzI7Ci0KLSAgaWYgKHAxID09IHAyKQotICAgIHJldHVybiAwOwotCi0gIGRvCi0gICAgewotICAgICAgLyogSSBrbm93IHRoaXMgc2VlbXMgdG8gYmUgb2RkIGJ1dCB0aGUgdG9sb3dlcigpIGZ1bmN0aW9uIGluCi0JIHNvbWUgc3lzdGVtcyBsaWJjIGNhbm5vdCBoYW5kbGUgbm9uYWxwaGEgY2hhcmFjdGVycy4gICovCi0gICAgICBjMSA9IGlzdXBwZXIgKCpwMSkgPyB0b2xvd2VyICgqcDEpIDogKnAxOwotICAgICAgYzIgPSBpc3VwcGVyICgqcDIpID8gdG9sb3dlciAoKnAyKSA6ICpwMjsKLSAgICAgIGlmIChjMSA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgKytwMTsKLSAgICAgICsrcDI7Ci0gICAgfQotICB3aGlsZSAoYzEgPT0gYzIpOwotCi0gIHJldHVybiBjMSAtIGMyOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9jYWxlbmFtZS5jIGIvdW5peC9pbnRsL2xvY2FsZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2MmU1NC4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvbG9jYWxlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MiArMCwwIEBACi0vKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbG9jYWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuICAqLwotLyogV2luMzIgY29kZSB3cml0dGVuIGJ5IFRvciBMaWxscXZpc3QgPHRtbEBpa2kuZmk+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotCi0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KLSMgdW5kZWYgV0lOMzIgICAvKiBhdm9pZCB3YXJuaW5nIG9uIG1pbmd3MzIgKi8KLSMgZGVmaW5lIFdJTjMyCi0jZW5kaWYKLQotI2lmZGVmIFdJTjMyCi0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLS8qIExpc3Qgb2YgbGFuZ3VhZ2UgY29kZXMsIHNvcnRlZCBieSB2YWx1ZToKLSAgIDB4MDEgTEFOR19BUkFCSUMKLSAgIDB4MDIgTEFOR19CVUxHQVJJQU4KLSAgIDB4MDMgTEFOR19DQVRBTEFOCi0gICAweDA0IExBTkdfQ0hJTkVTRQotICAgMHgwNSBMQU5HX0NaRUNICi0gICAweDA2IExBTkdfREFOSVNICi0gICAweDA3IExBTkdfR0VSTUFOCi0gICAweDA4IExBTkdfR1JFRUsKLSAgIDB4MDkgTEFOR19FTkdMSVNICi0gICAweDBhIExBTkdfU1BBTklTSAotICAgMHgwYiBMQU5HX0ZJTk5JU0gKLSAgIDB4MGMgTEFOR19GUkVOQ0gKLSAgIDB4MGQgTEFOR19IRUJSRVcKLSAgIDB4MGUgTEFOR19IVU5HQVJJQU4KLSAgIDB4MGYgTEFOR19JQ0VMQU5ESUMKLSAgIDB4MTAgTEFOR19JVEFMSUFOCi0gICAweDExIExBTkdfSkFQQU5FU0UKLSAgIDB4MTIgTEFOR19LT1JFQU4KLSAgIDB4MTMgTEFOR19EVVRDSAotICAgMHgxNCBMQU5HX05PUldFR0lBTgotICAgMHgxNSBMQU5HX1BPTElTSAotICAgMHgxNiBMQU5HX1BPUlRVR1VFU0UKLSAgIDB4MTcgTEFOR19SSEFFVE9fUk9NQU5DRQotICAgMHgxOCBMQU5HX1JPTUFOSUFOCi0gICAweDE5IExBTkdfUlVTU0lBTgotICAgMHgxYSBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgotICAgMHgxYiBMQU5HX1NMT1ZBSwotICAgMHgxYyBMQU5HX0FMQkFOSUFOCi0gICAweDFkIExBTkdfU1dFRElTSAotICAgMHgxZSBMQU5HX1RIQUkKLSAgIDB4MWYgTEFOR19UVVJLSVNICi0gICAweDIwIExBTkdfVVJEVQotICAgMHgyMSBMQU5HX0lORE9ORVNJQU4KLSAgIDB4MjIgTEFOR19VS1JBSU5JQU4KLSAgIDB4MjMgTEFOR19CRUxBUlVTSUFOCi0gICAweDI0IExBTkdfU0xPVkVOSUFOCi0gICAweDI1IExBTkdfRVNUT05JQU4KLSAgIDB4MjYgTEFOR19MQVRWSUFOCi0gICAweDI3IExBTkdfTElUSFVBTklBTgotICAgMHgyOCBMQU5HX1RBSklLCi0gICAweDI5IExBTkdfRkFSU0kKLSAgIDB4MmEgTEFOR19WSUVUTkFNRVNFCi0gICAweDJiIExBTkdfQVJNRU5JQU4KLSAgIDB4MmMgTEFOR19BWkVSSQotICAgMHgyZCBMQU5HX0JBU1FVRQotICAgMHgyZSBMQU5HX1NPUkJJQU4KLSAgIDB4MmYgTEFOR19NQUNFRE9OSUFOCi0gICAweDMwIExBTkdfU1VUVQotICAgMHgzMSBMQU5HX1RTT05HQQotICAgMHgzMiBMQU5HX1RTV0FOQQotICAgMHgzMyBMQU5HX1ZFTkRBCi0gICAweDM0IExBTkdfWEhPU0EKLSAgIDB4MzUgTEFOR19aVUxVCi0gICAweDM2IExBTkdfQUZSSUtBQU5TCi0gICAweDM3IExBTkdfR0VPUkdJQU4KLSAgIDB4MzggTEFOR19GQUVST0VTRQotICAgMHgzOSBMQU5HX0hJTkRJCi0gICAweDNhIExBTkdfTUFMVEVTRQotICAgMHgzYiBMQU5HX1NBQU1JCi0gICAweDNjIExBTkdfR0FFTElDCi0gICAweDNkIExBTkdfWUlERElTSAotICAgMHgzZSBMQU5HX01BTEFZCi0gICAweDNmIExBTkdfS0FaQUsKLSAgIDB4NDAgTEFOR19LWVJHWVoKLSAgIDB4NDEgTEFOR19TV0FISUxJCi0gICAweDQyIExBTkdfVFVSS01FTgotICAgMHg0MyBMQU5HX1VaQkVLCi0gICAweDQ0IExBTkdfVEFUQVIKLSAgIDB4NDUgTEFOR19CRU5HQUxJCi0gICAweDQ2IExBTkdfUFVOSkFCSQotICAgMHg0NyBMQU5HX0dVSkFSQVRJCi0gICAweDQ4IExBTkdfT1JJWUEKLSAgIDB4NDkgTEFOR19UQU1JTAotICAgMHg0YSBMQU5HX1RFTFVHVQotICAgMHg0YiBMQU5HX0tBTk5BREEKLSAgIDB4NGMgTEFOR19NQUxBWUFMQU0KLSAgIDB4NGQgTEFOR19BU1NBTUVTRQotICAgMHg0ZSBMQU5HX01BUkFUSEkKLSAgIDB4NGYgTEFOR19TQU5TS1JJVAotICAgMHg1MCBMQU5HX01PTkdPTElBTgotICAgMHg1MSBMQU5HX1RJQkVUQU4KLSAgIDB4NTIgTEFOR19XRUxTSAotICAgMHg1MyBMQU5HX0NBTUJPRElBTgotICAgMHg1NCBMQU5HX0xBTwotICAgMHg1NSBMQU5HX0JVUk1FU0UKLSAgIDB4NTYgTEFOR19HQUxJQ0lBTgotICAgMHg1NyBMQU5HX0tPTktBTkkKLSAgIDB4NTggTEFOR19NQU5JUFVSSQotICAgMHg1OSBMQU5HX1NJTkRISQotICAgMHg1YSBMQU5HX1NZUklBQwotICAgMHg1YiBMQU5HX1NJTkhBTEVTRQotICAgMHg1YyBMQU5HX0NIRVJPS0VFCi0gICAweDVkIExBTkdfSU5VS1RJVFVUCi0gICAweDVlIExBTkdfQU1IQVJJQwotICAgMHg1ZiBMQU5HX1RBTUFaSUdIVAotICAgMHg2MCBMQU5HX0tBU0hNSVJJCi0gICAweDYxIExBTkdfTkVQQUxJCi0gICAweDYyIExBTkdfRlJJU0lBTgotICAgMHg2MyBMQU5HX1BBU0hUTwotICAgMHg2NCBMQU5HX1RBR0FMT0cKLSAgIDB4NjUgTEFOR19ESVZFSEkKLSAgIDB4NjYgTEFOR19FRE8KLSAgIDB4NjcgTEFOR19GVUxGVUxERQotICAgMHg2OCBMQU5HX0hBVVNBCi0gICAweDY5IExBTkdfSUJJQklPCi0gICAweDZhIExBTkdfWU9SVUJBCi0gICAweDcwIExBTkdfSUdCTwotICAgMHg3MSBMQU5HX0tBTlVSSQotICAgMHg3MiBMQU5HX09ST01PCi0gICAweDczIExBTkdfVElHUklOWUEKLSAgIDB4NzQgTEFOR19HVUFSQU5JCi0gICAweDc1IExBTkdfSEFXQUlJQU4KLSAgIDB4NzYgTEFOR19MQVRJTgotICAgMHg3NyBMQU5HX1NPTUFMSQotICAgMHg3OCBMQU5HX1lJCi0gICAweDc5IExBTkdfUEFQSUFNRU5UVQotKi8KLS8qIE1pbmd3IGhlYWRlcnMgZG9uJ3QgaGF2ZSBsYXRlc3QgbGFuZ3VhZ2UgYW5kIHN1Ymxhbmd1YWdlIGNvZGVzLiAgKi8KLSMgaWZuZGVmIExBTkdfQUZSSUtBQU5TCi0jIGRlZmluZSBMQU5HX0FGUklLQUFOUyAweDM2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0FMQkFOSUFOCi0jIGRlZmluZSBMQU5HX0FMQkFOSUFOIDB4MWMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQU1IQVJJQwotIyBkZWZpbmUgTEFOR19BTUhBUklDIDB4NWUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQVJBQklDCi0jIGRlZmluZSBMQU5HX0FSQUJJQyAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0FSTUVOSUFOCi0jIGRlZmluZSBMQU5HX0FSTUVOSUFOIDB4MmIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQVNTQU1FU0UKLSMgZGVmaW5lIExBTkdfQVNTQU1FU0UgMHg0ZAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19BWkVSSQotIyBkZWZpbmUgTEFOR19BWkVSSSAweDJjCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0JBU1FVRQotIyBkZWZpbmUgTEFOR19CQVNRVUUgMHgyZAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19CRUxBUlVTSUFOCi0jIGRlZmluZSBMQU5HX0JFTEFSVVNJQU4gMHgyMwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19CRU5HQUxJCi0jIGRlZmluZSBMQU5HX0JFTkdBTEkgMHg0NQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19CVVJNRVNFCi0jIGRlZmluZSBMQU5HX0JVUk1FU0UgMHg1NQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19DQU1CT0RJQU4KLSMgZGVmaW5lIExBTkdfQ0FNQk9ESUFOIDB4NTMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQ0FUQUxBTgotIyBkZWZpbmUgTEFOR19DQVRBTEFOIDB4MDMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQ0hFUk9LRUUKLSMgZGVmaW5lIExBTkdfQ0hFUk9LRUUgMHg1YwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19ESVZFSEkKLSMgZGVmaW5lIExBTkdfRElWRUhJIDB4NjUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfRURPCi0jIGRlZmluZSBMQU5HX0VETyAweDY2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0VTVE9OSUFOCi0jIGRlZmluZSBMQU5HX0VTVE9OSUFOIDB4MjUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfRkFFUk9FU0UKLSMgZGVmaW5lIExBTkdfRkFFUk9FU0UgMHgzOAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19GQVJTSQotIyBkZWZpbmUgTEFOR19GQVJTSSAweDI5Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0ZSSVNJQU4KLSMgZGVmaW5lIExBTkdfRlJJU0lBTiAweDYyCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0ZVTEZVTERFCi0jIGRlZmluZSBMQU5HX0ZVTEZVTERFIDB4NjcKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfR0FFTElDCi0jIGRlZmluZSBMQU5HX0dBRUxJQyAweDNjCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0dBTElDSUFOCi0jIGRlZmluZSBMQU5HX0dBTElDSUFOIDB4NTYKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfR0VPUkdJQU4KLSMgZGVmaW5lIExBTkdfR0VPUkdJQU4gMHgzNwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19HVUFSQU5JCi0jIGRlZmluZSBMQU5HX0dVQVJBTkkgMHg3NAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19HVUpBUkFUSQotIyBkZWZpbmUgTEFOR19HVUpBUkFUSSAweDQ3Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0hBVVNBCi0jIGRlZmluZSBMQU5HX0hBVVNBIDB4NjgKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSEFXQUlJQU4KLSMgZGVmaW5lIExBTkdfSEFXQUlJQU4gMHg3NQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19IRUJSRVcKLSMgZGVmaW5lIExBTkdfSEVCUkVXIDB4MGQKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSElOREkKLSMgZGVmaW5lIExBTkdfSElOREkgMHgzOQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19JQklCSU8KLSMgZGVmaW5lIExBTkdfSUJJQklPIDB4NjkKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSUdCTwotIyBkZWZpbmUgTEFOR19JR0JPIDB4NzAKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSU5ET05FU0lBTgotIyBkZWZpbmUgTEFOR19JTkRPTkVTSUFOIDB4MjEKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSU5VS1RJVFVUCi0jIGRlZmluZSBMQU5HX0lOVUtUSVRVVCAweDVkCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0tBTk5BREEKLSMgZGVmaW5lIExBTkdfS0FOTkFEQSAweDRiCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0tBTlVSSQotIyBkZWZpbmUgTEFOR19LQU5VUkkgMHg3MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19LQVNITUlSSQotIyBkZWZpbmUgTEFOR19LQVNITUlSSSAweDYwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0tBWkFLCi0jIGRlZmluZSBMQU5HX0tBWkFLIDB4M2YKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfS09OS0FOSQotIyBkZWZpbmUgTEFOR19LT05LQU5JIDB4NTcKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfS1lSR1laCi0jIGRlZmluZSBMQU5HX0tZUkdZWiAweDQwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0xBTwotIyBkZWZpbmUgTEFOR19MQU8gMHg1NAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19MQVRJTgotIyBkZWZpbmUgTEFOR19MQVRJTiAweDc2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0xBVFZJQU4KLSMgZGVmaW5lIExBTkdfTEFUVklBTiAweDI2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0xJVEhVQU5JQU4KLSMgZGVmaW5lIExBTkdfTElUSFVBTklBTiAweDI3Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BQ0VET05JQU4KLSMgZGVmaW5lIExBTkdfTUFDRURPTklBTiAweDJmCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BTEFZCi0jIGRlZmluZSBMQU5HX01BTEFZIDB4M2UKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfTUFMQVlBTEFNCi0jIGRlZmluZSBMQU5HX01BTEFZQUxBTSAweDRjCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BTFRFU0UKLSMgZGVmaW5lIExBTkdfTUFMVEVTRSAweDNhCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BTklQVVJJCi0jIGRlZmluZSBMQU5HX01BTklQVVJJIDB4NTgKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfTUFSQVRISQotIyBkZWZpbmUgTEFOR19NQVJBVEhJIDB4NGUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfTU9OR09MSUFOCi0jIGRlZmluZSBMQU5HX01PTkdPTElBTiAweDUwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX05FUEFMSQotIyBkZWZpbmUgTEFOR19ORVBBTEkgMHg2MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19PUklZQQotIyBkZWZpbmUgTEFOR19PUklZQSAweDQ4Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX09ST01PCi0jIGRlZmluZSBMQU5HX09ST01PIDB4NzIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfUEFQSUFNRU5UVQotIyBkZWZpbmUgTEFOR19QQVBJQU1FTlRVIDB4NzkKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfUEFTSFRPCi0jIGRlZmluZSBMQU5HX1BBU0hUTyAweDYzCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1BVTkpBQkkKLSMgZGVmaW5lIExBTkdfUFVOSkFCSSAweDQ2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1JIQUVUT19ST01BTkNFCi0jIGRlZmluZSBMQU5HX1JIQUVUT19ST01BTkNFIDB4MTcKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfU0FBTUkKLSMgZGVmaW5lIExBTkdfU0FBTUkgMHgzYgotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TQU5TS1JJVAotIyBkZWZpbmUgTEFOR19TQU5TS1JJVCAweDRmCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1NFUkJJQU4KLSMgZGVmaW5lIExBTkdfU0VSQklBTiAweDFhCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1NJTkRISQotIyBkZWZpbmUgTEFOR19TSU5ESEkgMHg1OQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TSU5IQUxFU0UKLSMgZGVmaW5lIExBTkdfU0lOSEFMRVNFIDB4NWIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfU0xPVkFLCi0jIGRlZmluZSBMQU5HX1NMT1ZBSyAweDFiCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1NPTUFMSQotIyBkZWZpbmUgTEFOR19TT01BTEkgMHg3NwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TT1JCSUFOCi0jIGRlZmluZSBMQU5HX1NPUkJJQU4gMHgyZQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TVVRVCi0jIGRlZmluZSBMQU5HX1NVVFUgMHgzMAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TV0FISUxJCi0jIGRlZmluZSBMQU5HX1NXQUhJTEkgMHg0MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TWVJJQUMKLSMgZGVmaW5lIExBTkdfU1lSSUFDIDB4NWEKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVEFHQUxPRwotIyBkZWZpbmUgTEFOR19UQUdBTE9HIDB4NjQKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVEFKSUsKLSMgZGVmaW5lIExBTkdfVEFKSUsgMHgyOAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19UQU1BWklHSFQKLSMgZGVmaW5lIExBTkdfVEFNQVpJR0hUIDB4NWYKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVEFNSUwKLSMgZGVmaW5lIExBTkdfVEFNSUwgMHg0OQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19UQVRBUgotIyBkZWZpbmUgTEFOR19UQVRBUiAweDQ0Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1RFTFVHVQotIyBkZWZpbmUgTEFOR19URUxVR1UgMHg0YQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19USEFJCi0jIGRlZmluZSBMQU5HX1RIQUkgMHgxZQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19USUJFVEFOCi0jIGRlZmluZSBMQU5HX1RJQkVUQU4gMHg1MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19USUdSSU5ZQQotIyBkZWZpbmUgTEFOR19USUdSSU5ZQSAweDczCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1RTT05HQQotIyBkZWZpbmUgTEFOR19UU09OR0EgMHgzMQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19UU1dBTkEKLSMgZGVmaW5lIExBTkdfVFNXQU5BIDB4MzIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVFVSS01FTgotIyBkZWZpbmUgTEFOR19UVVJLTUVOIDB4NDIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVUtSQUlOSUFOCi0jIGRlZmluZSBMQU5HX1VLUkFJTklBTiAweDIyCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1VSRFUKLSMgZGVmaW5lIExBTkdfVVJEVSAweDIwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1VaQkVLCi0jIGRlZmluZSBMQU5HX1VaQkVLIDB4NDMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVkVOREEKLSMgZGVmaW5lIExBTkdfVkVOREEgMHgzMwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19WSUVUTkFNRVNFCi0jIGRlZmluZSBMQU5HX1ZJRVROQU1FU0UgMHgyYQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19XRUxTSAotIyBkZWZpbmUgTEFOR19XRUxTSCAweDUyCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1hIT1NBCi0jIGRlZmluZSBMQU5HX1hIT1NBIDB4MzQKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfWUkKLSMgZGVmaW5lIExBTkdfWUkgMHg3OAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19ZSURESVNICi0jIGRlZmluZSBMQU5HX1lJRERJU0ggMHgzZAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19ZT1JVQkEKLSMgZGVmaW5lIExBTkdfWU9SVUJBIDB4NmEKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfWlVMVQotIyBkZWZpbmUgTEFOR19aVUxVIDB4MzUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQQotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBIDB4MDEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0lSQVEKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0lSQVEgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfRUdZUFQKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0VHWVBUIDB4MDMKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xJQllBCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19MSUJZQSAweDA0Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19BTEdFUklBCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19BTEdFUklBIDB4MDUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX01PUk9DQ08KLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX01PUk9DQ08gMHgwNgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVFVOSVNJQQotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfVFVOSVNJQSAweDA3Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19PTUFOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19PTUFOIDB4MDgKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1lFTUVOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19ZRU1FTiAweDA5Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TWVJJQQotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU1lSSUEgMHgwYQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfSk9SREFOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19KT1JEQU4gMHgwYgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfTEVCQU5PTgotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTEVCQU5PTiAweDBjCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19LVVdBSVQKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0tVV0FJVCAweDBkCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19VQUUKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1VBRSAweDBlCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1FBVEFSCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19RQVRBUiAweDEwCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0xBVElOCi0jIGRlZmluZSBTVUJMQU5HX0FaRVJJX0xBVElOIDB4MDEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMKLSMgZGVmaW5lIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0lORElBCi0jIGRlZmluZSBTVUJMQU5HX0JFTkdBTElfSU5ESUEgMHgwMAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0gKLSMgZGVmaW5lIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIIDB4MDEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVQotIyBkZWZpbmUgU1VCTEFOR19DSElORVNFX01BQ0FVIDB4MDUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EgMHgwNwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBIDB4MDgKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4KLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4gMHgwOQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0JFTElaRQotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0JFTElaRSAweDBhCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCAweDBiCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0UKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRSAweDBjCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVMKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9QSElMSVBQSU5FUyAweDBkCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBCi0jIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBIDB4MGUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9IT05HS09ORwotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9JTkRJQQotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0lORElBIDB4MTAKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQQotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBIDB4MTEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUgMHgxMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRwotIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRyAweDA1Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT05BQ08KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PTkFDTyAweDA2Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTCi0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTIDB4MDcKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04gMHgwOAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ09OR08KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NPTkdPIDB4MDkKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwKLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwgMHgwYQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ0FNRVJPT04KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OIDB4MGIKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFCi0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRSAweDBjCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NQUxJCi0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NQUxJIDB4MGQKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08gMHgwZQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfSEFJVEkKLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0hBSVRJIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcKLSMgZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcgMHgwNAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTgotIyBkZWZpbmUgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTiAweDA1Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0tBU0hNSVJJX0lORElBCi0jIGRlZmluZSBTVUJMQU5HX0tBU0hNSVJJX0lORElBIDB4MDIKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEKLSMgZGVmaW5lIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEgMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTQotIyBkZWZpbmUgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAweDAyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX05FUEFMSV9JTkRJQQotIyBkZWZpbmUgU1VCTEFOR19ORVBBTElfSU5ESUEgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX0lORElBCi0jIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfSU5ESUEgMHgwMAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX1BBS0lTVEFOCi0jIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU4gMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9ST01BTklBCi0jIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUEgMHgwMAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBCi0jIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkEgMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0xBVElOCi0jIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU4gMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDCi0jIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgMHgwMwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TSU5ESElfSU5ESUEKLSMgZGVmaW5lIFNVQkxBTkdfU0lOREhJX0lORElBIDB4MDAKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOCi0jIGRlZmluZSBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTiAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBIDB4MDQKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQSAweDA1Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BIDB4MDYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgMHgwNwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSAweDA4Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSAweDA5Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEVSVQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BFUlUgMHgwYQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSAweDBiCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUgotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IgMHgwYwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NISUxFCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUgMHgwZAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZIDB4MGUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQSAweDEwCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUiAweDExCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVMKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUyAweDEyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBIDB4MTMKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTwotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPIDB4MTQKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5ECi0jIGRlZmluZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORCAweDAyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUMKLSMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQyAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9MQVRJTgotIyBkZWZpbmUgU1VCTEFOR19UQU1BWklHSFRfTEFUSU4gMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQQotIyBkZWZpbmUgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQSAweDAwCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEKLSMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVJJVFJFQSAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1VSRFVfUEFLSVNUQU4KLSMgZGVmaW5lIFNVQkxBTkdfVVJEVV9QQUtJU1RBTiAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1VSRFVfSU5ESUEKLSMgZGVmaW5lIFNVQkxBTkdfVVJEVV9JTkRJQSAweDAyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0xBVElOCi0jIGRlZmluZSBTVUJMQU5HX1VaQkVLX0xBVElOIDB4MDEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMKLSMgZGVmaW5lIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMgMHgwMgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mICdzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6Ci0gICAiRGlyZWN0cyAnc2V0bG9jYWxlKCknIHRvIHF1ZXJ5ICdjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgIHNldHRpbmcgb2YgJ2xvY2FsJy4iCi0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIE5laXRoZXIgZG8gU1VTVjIgYW5kCi0gICBJU08gQyA5OS4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQgc3lzdGVtcyAoZS5nLgotICAgdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgX19HTlVfTElCUkFSWV9fICYmIF9fR05VX0xJQlJBUllfXyA+PSAyKQotIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotI2VuZGlmCi0KLS8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBuYW1lLCBhbmQgY2Fub25pY2FsaXplIGl0IGludG8gWFBHIHN5bnRheAotICAgICBsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQotICAgVGhlIGNvZGVzZXQgcGFydCBpbiB0aGUgcmVzdWx0IGlzIG5vdCByZWxpYWJsZTsgdGhlIGxvY2FsZV9jaGFyc2V0KCkKLSAgIHNob3VsZCBiZSB1c2VkIGZvciBjb2Rlc2V0IGluZm9ybWF0aW9uIGluc3RlYWQuCi0gICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gICovCi0KLWNvbnN0IGNoYXIgKgotX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0jaWZuZGVmIFdJTjMyCi0KLSAgLyogVXNlIHRoZSBQT1NJWCBtZXRob2RzIG9mIGxvb2tpbmcgdG8gJ0xDX0FMTCcsICdMQ194eHgnLCBhbmQgJ0xBTkcnLgotICAgICBPbiBzb21lIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgJ3NldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLSMgaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCi0gIHJldHZhbCA9IHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpOwotIyBlbHNlCi0gIC8qIFNldHRpbmcgb2YgTENfQUxMIG92ZXJ3cml0ZXMgYWxsIG90aGVyLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7Ci0gIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KLSAgICAgIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKLSAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBMYXN0IHBvc3NpYmlsaXR5IGlzIHRoZSBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KLQkgIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKLQkgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKLQkgICAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzCi0JICAgICAgIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICAqLwotCSAgICByZXR2YWwgPSAiQyI7Ci0JfQotICAgIH0KLSMgZW5kaWYKLQotICByZXR1cm4gcmV0dmFsOwotCi0jZWxzZSAvKiBXSU4zMiAqLwotCi0gIC8qIFJldHVybiBhbiBYUEcgc3R5bGUgbG9jYWxlIG5hbWUgbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bQG1vZGlmaWVyXS4KLSAgICAgRG9uJ3QgZXZlbiBib3RoZXIgZGV0ZXJtaW5pbmcgdGhlIGNvZGVzZXQ7IGl0J3Mgbm90IHVzZWZ1bCBpbiB0aGlzCi0gICAgIGNvbnRleHQsIGJlY2F1c2UgbWVzc2FnZSBjYXRhbG9ncyBhcmUgbm90IHNwZWNpZmljIHRvIGEgc2luZ2xlCi0gICAgIGNvZGVzZXQuICAqLwotCi0gIExDSUQgbGNpZDsKLSAgTEFOR0lEIGxhbmdpZDsKLSAgaW50IHByaW1hcnksIHN1YjsKLQotICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHN5c3RlbSBzZXR0aW5ncyB0aHJvdWdoIGVudmlyb25tZW50Ci0gICAgIHZhcmlhYmxlcywgYXMgb24gUE9TSVggc3lzdGVtcy4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLSAgcmV0dmFsID0gZ2V0ZW52IChjYXRlZ29yeW5hbWUpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBVc2UgbmF0aXZlIFdpbjMyIEFQSSBsb2NhbGUgSUQuICAqLwotICBsY2lkID0gR2V0VGhyZWFkTG9jYWxlICgpOwotCi0gIC8qIFN0cmlwIG9mZiB0aGUgc29ydGluZyBydWxlcywga2VlcCBvbmx5IHRoZSBsYW5ndWFnZSBwYXJ0LiAgKi8KLSAgbGFuZ2lkID0gTEFOR0lERlJPTUxDSUQgKGxjaWQpOwotCi0gIC8qIFNwbGl0IGludG8gbGFuZ3VhZ2UgYW5kIHRlcnJpdG9yeSBwYXJ0LiAgKi8KLSAgcHJpbWFyeSA9IFBSSU1BUllMQU5HSUQgKGxhbmdpZCk7Ci0gIHN1YiA9IFNVQkxBTkdJRCAobGFuZ2lkKTsKLQotICAvKiBEaXNwYXRjaCBvbiBsYW5ndWFnZS4KLSAgICAgU2VlIGFsc28gaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL29ubGluZWRhdC9sYW5ndWFnZXMuaHRtbCAuCi0gICAgIEZvciBkZXRhaWxzIGFib3V0IGxhbmd1YWdlcywgc2VlIGh0dHA6Ly93d3cuZXRobm9sb2d1ZS5jb20vIC4gICovCi0gIHN3aXRjaCAocHJpbWFyeSkKLSAgICB7Ci0gICAgY2FzZSBMQU5HX0FGUklLQUFOUzogcmV0dXJuICJhZl9aQSI7Ci0gICAgY2FzZSBMQU5HX0FMQkFOSUFOOiByZXR1cm4gInNxX0FMIjsKLSAgICBjYXNlIExBTkdfQU1IQVJJQzogcmV0dXJuICJhbV9FVCI7Ci0gICAgY2FzZSBMQU5HX0FSQUJJQzoKLSAgICAgIHN3aXRjaCAoc3ViKQotCXsKLQljYXNlIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQTogcmV0dXJuICJhcl9TQSI7Ci0JY2FzZSBTVUJMQU5HX0FSQUJJQ19JUkFROiByZXR1cm4gImFyX0lRIjsKLQljYXNlIFNVQkxBTkdfQVJBQklDX0VHWVBUOiByZXR1cm4gImFyX0VHIjsKLQljYXNlIFNVQkxBTkdfQVJBQklDX0xJQllBOiByZXR1cm4gImFyX0xZIjsKLQljYXNlIFNVQkxBTkdfQVJBQklDX0FMR0VSSUE6IHJldHVybiAiYXJfRFoiOwotCWNhc2UgU1VCTEFOR19BUkFCSUNfTU9ST0NDTzogcmV0dXJuICJhcl9NQSI7Ci0JY2FzZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBOiByZXR1cm4gImFyX1ROIjsKLQljYXNlIFNVQkxBTkdfQVJBQklDX09NQU46IHJldHVybiAiYXJfT00iOwotCWNhc2UgU1VCTEFOR19BUkFCSUNfWUVNRU46IHJldHVybiAiYXJfWUUiOwotCWNhc2UgU1VCTEFOR19BUkFCSUNfU1lSSUE6IHJldHVybiAiYXJfU1kiOwotCWNhc2UgU1VCTEFOR19BUkFCSUNfSk9SREFOOiByZXR1cm4gImFyX0pPIjsKLQljYXNlIFNVQkxBTkdfQVJBQklDX0xFQkFOT046IHJldHVybiAiYXJfTEIiOwotCWNhc2UgU1VCTEFOR19BUkFCSUNfS1VXQUlUOiByZXR1cm4gImFyX0tXIjsKLQljYXNlIFNVQkxBTkdfQVJBQklDX1VBRTogcmV0dXJuICJhcl9BRSI7Ci0JY2FzZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOOiByZXR1cm4gImFyX0JIIjsKLQljYXNlIFNVQkxBTkdfQVJBQklDX1FBVEFSOiByZXR1cm4gImFyX1FBIjsKLQl9Ci0gICAgICByZXR1cm4gImFyIjsKLSAgICBjYXNlIExBTkdfQVJNRU5JQU46IHJldHVybiAiaHlfQU0iOwotICAgIGNhc2UgTEFOR19BU1NBTUVTRTogcmV0dXJuICJhc19JTiI7Ci0gICAgY2FzZSBMQU5HX0FaRVJJOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIEF6ZXJiYWlqYW5pIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLwotCWNhc2UgU1VCTEFOR19BWkVSSV9MQVRJTjogcmV0dXJuICJhel9BWkBsYXRpbiI7Ci0JY2FzZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDOiByZXR1cm4gImF6X0FaQGN5cmlsbGljIjsKLQl9Ci0gICAgICByZXR1cm4gImF6IjsKLSAgICBjYXNlIExBTkdfQkFTUVVFOgotICAgICAgcmV0dXJuICJldSI7IC8qIEFtYmlndW91czogY291bGQgYmUgImV1X0VTIiBvciAiZXVfRlIiLiAgKi8KLSAgICBjYXNlIExBTkdfQkVMQVJVU0lBTjogcmV0dXJuICJiZV9CWSI7Ci0gICAgY2FzZSBMQU5HX0JFTkdBTEk6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX0JFTkdBTElfSU5ESUE6IHJldHVybiAiYm5fSU4iOwotCWNhc2UgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0g6IHJldHVybiAiYm5fQkQiOwotCX0KLSAgICAgIHJldHVybiAiYm4iOwotICAgIGNhc2UgTEFOR19CVUxHQVJJQU46IHJldHVybiAiYmdfQkciOwotICAgIGNhc2UgTEFOR19CVVJNRVNFOiByZXR1cm4gIm15X01NIjsKLSAgICBjYXNlIExBTkdfQ0FNQk9ESUFOOiByZXR1cm4gImttX0tIIjsKLSAgICBjYXNlIExBTkdfQ0FUQUxBTjogcmV0dXJuICJjYV9FUyI7Ci0gICAgY2FzZSBMQU5HX0NIRVJPS0VFOiByZXR1cm4gImNocl9VUyI7Ci0gICAgY2FzZSBMQU5HX0NISU5FU0U6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX0NISU5FU0VfVFJBRElUSU9OQUw6IHJldHVybiAiemhfVFciOwotCWNhc2UgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQ6IHJldHVybiAiemhfQ04iOwotCWNhc2UgU1VCTEFOR19DSElORVNFX0hPTkdLT05HOiByZXR1cm4gInpoX0hLIjsKLQljYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU5HQVBPUkU6IHJldHVybiAiemhfU0ciOwotCWNhc2UgU1VCTEFOR19DSElORVNFX01BQ0FVOiByZXR1cm4gInpoX01PIjsKLQl9Ci0gICAgICByZXR1cm4gInpoIjsKLSAgICBjYXNlIExBTkdfQ1JPQVRJQU46CQkvKiBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgotCQkJCSAqIFdoYXQgdXNlZCB0byBiZSBjYWxsZWQgU2VyYm8tQ3JvYXRpYW4KLQkJCQkgKiBzaG91bGQgcmVhbGx5IG5vdyBiZSB0d28gc2VwYXJhdGUKLQkJCQkgKiBsYW5ndWFnZXMgYmVjYXVzZSBvZiBwb2xpdGljYWwgcmVhc29ucy4KLQkJCQkgKiAoU2F5cyB0bWwsIHdobyBrbm93cyBub3RoaW5nIGFib3V0IFNlcmJpYW4KLQkJCQkgKiBvciBDcm9hdGlhbi4pCi0JCQkJICogKEkgY2FuIGZlZWwgdGhvc2UgZmxhbWVzIGNvbWluZyBhbHJlYWR5LikKLQkJCQkgKi8KLSAgICAgIHN3aXRjaCAoc3ViKQotCXsKLQljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJocl9IUiI7Ci0JY2FzZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU46IHJldHVybiAic3JfQ1MiOwotCWNhc2UgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDOiByZXR1cm4gInNyX0NTQGN5cmlsbGljIjsKLQl9Ci0gICAgICByZXR1cm4gImhyIjsKLSAgICBjYXNlIExBTkdfQ1pFQ0g6IHJldHVybiAiY3NfQ1oiOwotICAgIGNhc2UgTEFOR19EQU5JU0g6IHJldHVybiAiZGFfREsiOwotICAgIGNhc2UgTEFOR19ESVZFSEk6IHJldHVybiAiZHZfTVYiOwotICAgIGNhc2UgTEFOR19EVVRDSDoKLSAgICAgIHN3aXRjaCAoc3ViKQotCXsKLQljYXNlIFNVQkxBTkdfRFVUQ0g6IHJldHVybiAibmxfTkwiOwotCWNhc2UgU1VCTEFOR19EVVRDSF9CRUxHSUFOOiAvKiBGTEVNSVNILCBWTEFBTVMgKi8gcmV0dXJuICJubF9CRSI7Ci0JfQotICAgICAgcmV0dXJuICJubCI7Ci0gICAgY2FzZSBMQU5HX0VETzogcmV0dXJuICJiaW5fTkciOwotICAgIGNhc2UgTEFOR19FTkdMSVNIOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCS8qIFNVQkxBTkdfRU5HTElTSF9VUyA9PSBTVUJMQU5HX0RFRkFVTFQuIEhlaC4gSSB0aG91Z2h0Ci0JICogRW5nbGlzaCB3YXMgdGhlIGxhbmd1YWdlIHNwb2tlbiBpbiBFbmdsYW5kLgotCSAqIE9oIHdlbGwuCi0JICovCi0JY2FzZSBTVUJMQU5HX0VOR0xJU0hfVVM6IHJldHVybiAiZW5fVVMiOwotCWNhc2UgU1VCTEFOR19FTkdMSVNIX1VLOiByZXR1cm4gImVuX0dCIjsKLQljYXNlIFNVQkxBTkdfRU5HTElTSF9BVVM6IHJldHVybiAiZW5fQVUiOwotCWNhc2UgU1VCTEFOR19FTkdMSVNIX0NBTjogcmV0dXJuICJlbl9DQSI7Ci0JY2FzZSBTVUJMQU5HX0VOR0xJU0hfTlo6IHJldHVybiAiZW5fTloiOwotCWNhc2UgU1VCTEFOR19FTkdMSVNIX0VJUkU6IHJldHVybiAiZW5fSUUiOwotCWNhc2UgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQTogcmV0dXJuICJlbl9aQSI7Ci0JY2FzZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQTogcmV0dXJuICJlbl9KTSI7Ci0JY2FzZSBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOOiByZXR1cm4gImVuX0dEIjsgLyogR3JlbmFkYT8gKi8KLQljYXNlIFNVQkxBTkdfRU5HTElTSF9CRUxJWkU6IHJldHVybiAiZW5fQloiOwotCWNhc2UgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEOiByZXR1cm4gImVuX1RUIjsKLQljYXNlIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRTogcmV0dXJuICJlbl9aVyI7Ci0JY2FzZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVM6IHJldHVybiAiZW5fUEgiOwotCWNhc2UgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQTogcmV0dXJuICJlbl9JRCI7Ci0JY2FzZSBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkc6IHJldHVybiAiZW5fSEsiOwotCWNhc2UgU1VCTEFOR19FTkdMSVNIX0lORElBOiByZXR1cm4gImVuX0lOIjsKLQljYXNlIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQTogcmV0dXJuICJlbl9NWSI7Ci0JY2FzZSBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFOiByZXR1cm4gImVuX1NHIjsKLQl9Ci0gICAgICByZXR1cm4gImVuIjsKLSAgICBjYXNlIExBTkdfRVNUT05JQU46IHJldHVybiAiZXRfRUUiOwotICAgIGNhc2UgTEFOR19GQUVST0VTRTogcmV0dXJuICJmb19GTyI7Ci0gICAgY2FzZSBMQU5HX0ZBUlNJOiByZXR1cm4gImZhX0lSIjsKLSAgICBjYXNlIExBTkdfRklOTklTSDogcmV0dXJuICJmaV9GSSI7Ci0gICAgY2FzZSBMQU5HX0ZSRU5DSDoKLSAgICAgIHN3aXRjaCAoc3ViKQotCXsKLQljYXNlIFNVQkxBTkdfRlJFTkNIOiByZXR1cm4gImZyX0ZSIjsKLQljYXNlIFNVQkxBTkdfRlJFTkNIX0JFTEdJQU46IC8qIFdBTExPT04gKi8gcmV0dXJuICJmcl9CRSI7Ci0JY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTjogcmV0dXJuICJmcl9DQSI7Ci0JY2FzZSBTVUJMQU5HX0ZSRU5DSF9TV0lTUzogcmV0dXJuICJmcl9DSCI7Ci0JY2FzZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHOiByZXR1cm4gImZyX0xVIjsKLQljYXNlIFNVQkxBTkdfRlJFTkNIX01PTkFDTzogcmV0dXJuICJmcl9NQyI7Ci0JY2FzZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTOiByZXR1cm4gImZyIjsgLyogQ2FyaWJiZWFuPyAqLwotCWNhc2UgU1VCTEFOR19GUkVOQ0hfUkVVTklPTjogcmV0dXJuICJmcl9SRSI7Ci0JY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT05HTzogcmV0dXJuICJmcl9DRyI7Ci0JY2FzZSBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMOiByZXR1cm4gImZyX1NOIjsKLQljYXNlIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OOiByZXR1cm4gImZyX0NNIjsKLQljYXNlIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFOiByZXR1cm4gImZyX0NJIjsKLQljYXNlIFNVQkxBTkdfRlJFTkNIX01BTEk6IHJldHVybiAiZnJfTUwiOwotCWNhc2UgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTzogcmV0dXJuICJmcl9NQSI7Ci0JY2FzZSBTVUJMQU5HX0ZSRU5DSF9IQUlUSTogcmV0dXJuICJmcl9IVCI7Ci0JfQotICAgICAgcmV0dXJuICJmciI7Ci0gICAgY2FzZSBMQU5HX0ZSSVNJQU46IHJldHVybiAiZnlfTkwiOwotICAgIGNhc2UgTEFOR19GVUxGVUxERToKLSAgICAgIC8qIFNwb2tlbiBpbiBOaWdlcmlhLCBHdWluZWEsIFNlbmVnYWwsIE1hbGksIE5pZ2VyLCBDYW1lcm9vbiwgQmVuaW4uICovCi0gICAgICByZXR1cm4gImZmX05HIjsKLSAgICBjYXNlIExBTkdfR0FFTElDOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCWNhc2UgMHgwMTogLyogU0NPVFRJU0ggKi8gcmV0dXJuICJnZF9HQiI7Ci0JY2FzZSAweDAyOiAvKiBJUklTSCAqLyByZXR1cm4gImdhX0lFIjsKLQl9Ci0gICAgICByZXR1cm4gIkMiOwotICAgIGNhc2UgTEFOR19HQUxJQ0lBTjogcmV0dXJuICJnbF9FUyI7Ci0gICAgY2FzZSBMQU5HX0dFT1JHSUFOOiByZXR1cm4gImthX0dFIjsKLSAgICBjYXNlIExBTkdfR0VSTUFOOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCWNhc2UgU1VCTEFOR19HRVJNQU46IHJldHVybiAiZGVfREUiOwotCWNhc2UgU1VCTEFOR19HRVJNQU5fU1dJU1M6IHJldHVybiAiZGVfQ0giOwotCWNhc2UgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU46IHJldHVybiAiZGVfQVQiOwotCWNhc2UgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRzogcmV0dXJuICJkZV9MVSI7Ci0JY2FzZSBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOOiByZXR1cm4gImRlX0xJIjsKLQl9Ci0gICAgICByZXR1cm4gImRlIjsKLSAgICBjYXNlIExBTkdfR1JFRUs6IHJldHVybiAiZWxfR1IiOwotICAgIGNhc2UgTEFOR19HVUFSQU5JOiByZXR1cm4gImduX1BZIjsKLSAgICBjYXNlIExBTkdfR1VKQVJBVEk6IHJldHVybiAiZ3VfSU4iOwotICAgIGNhc2UgTEFOR19IQVVTQTogcmV0dXJuICJoYV9ORyI7Ci0gICAgY2FzZSBMQU5HX0hBV0FJSUFOOgotICAgICAgLyogRklYTUU6IERvIHRoZXkgbWVhbiBIYXdhaWlhbiAoImhhd19VUyIsIDEwMDAgc3BlYWtlcnMpCi0JIG9yIEhhd2FpaSBDcmVvbGUgRW5nbGlzaCAoImNwZV9VUyIsIDYwMDAwMCBzcGVha2Vycyk/ICAqLwotICAgICAgcmV0dXJuICJjcGVfVVMiOwotICAgIGNhc2UgTEFOR19IRUJSRVc6IHJldHVybiAiaGVfSUwiOwotICAgIGNhc2UgTEFOR19ISU5ESTogcmV0dXJuICJoaV9JTiI7Ci0gICAgY2FzZSBMQU5HX0hVTkdBUklBTjogcmV0dXJuICJodV9IVSI7Ci0gICAgY2FzZSBMQU5HX0lCSUJJTzogcmV0dXJuICJuaWNfTkciOwotICAgIGNhc2UgTEFOR19JQ0VMQU5ESUM6IHJldHVybiAiaXNfSVMiOwotICAgIGNhc2UgTEFOR19JR0JPOiByZXR1cm4gImlnX05HIjsKLSAgICBjYXNlIExBTkdfSU5ET05FU0lBTjogcmV0dXJuICJpZF9JRCI7Ci0gICAgY2FzZSBMQU5HX0lOVUtUSVRVVDogcmV0dXJuICJpdV9DQSI7Ci0gICAgY2FzZSBMQU5HX0lUQUxJQU46Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX0lUQUxJQU46IHJldHVybiAiaXRfSVQiOwotCWNhc2UgU1VCTEFOR19JVEFMSUFOX1NXSVNTOiByZXR1cm4gIml0X0NIIjsKLQl9Ci0gICAgICByZXR1cm4gIml0IjsKLSAgICBjYXNlIExBTkdfSkFQQU5FU0U6IHJldHVybiAiamFfSlAiOwotICAgIGNhc2UgTEFOR19LQU5OQURBOiByZXR1cm4gImtuX0lOIjsKLSAgICBjYXNlIExBTkdfS0FOVVJJOiByZXR1cm4gImtyX05HIjsKLSAgICBjYXNlIExBTkdfS0FTSE1JUkk6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAia3NfUEsiOwotCWNhc2UgU1VCTEFOR19LQVNITUlSSV9JTkRJQTogcmV0dXJuICJrc19JTiI7Ci0JfQotICAgICAgcmV0dXJuICJrcyI7Ci0gICAgY2FzZSBMQU5HX0tBWkFLOiByZXR1cm4gImtrX0taIjsKLSAgICBjYXNlIExBTkdfS09OS0FOSToKLSAgICAgIC8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCi0gICAgICByZXR1cm4gImtva19JTiI7Ci0gICAgY2FzZSBMQU5HX0tPUkVBTjogcmV0dXJuICJrb19LUiI7Ci0gICAgY2FzZSBMQU5HX0tZUkdZWjogcmV0dXJuICJreV9LRyI7Ci0gICAgY2FzZSBMQU5HX0xBTzogcmV0dXJuICJsb19MQSI7Ci0gICAgY2FzZSBMQU5HX0xBVElOOiByZXR1cm4gImxhX1ZBIjsKLSAgICBjYXNlIExBTkdfTEFUVklBTjogcmV0dXJuICJsdl9MViI7Ci0gICAgY2FzZSBMQU5HX0xJVEhVQU5JQU46IHJldHVybiAibHRfTFQiOwotICAgIGNhc2UgTEFOR19NQUNFRE9OSUFOOiByZXR1cm4gIm1rX01LIjsKLSAgICBjYXNlIExBTkdfTUFMQVk6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX01BTEFZX01BTEFZU0lBOiByZXR1cm4gIm1zX01ZIjsKLQljYXNlIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU06IHJldHVybiAibXNfQk4iOwotCX0KLSAgICAgIHJldHVybiAibXMiOwotICAgIGNhc2UgTEFOR19NQUxBWUFMQU06IHJldHVybiAibWxfSU4iOwotICAgIGNhc2UgTEFOR19NQUxURVNFOiByZXR1cm4gIm10X01UIjsKLSAgICBjYXNlIExBTkdfTUFOSVBVUkk6Ci0gICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLwotICAgICAgcmV0dXJuICJtbmlfSU4iOwotICAgIGNhc2UgTEFOR19NQVJBVEhJOiByZXR1cm4gIm1yX0lOIjsKLSAgICBjYXNlIExBTkdfTU9OR09MSUFOOgotICAgICAgcmV0dXJuICJtbiI7IC8qIEFtYmlndW91czogY291bGQgYmUgIm1uX0NOIiBvciAibW5fTU4iLiAgKi8KLSAgICBjYXNlIExBTkdfTkVQQUxJOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCWNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gIm5lX05QIjsKLQljYXNlIFNVQkxBTkdfTkVQQUxJX0lORElBOiByZXR1cm4gIm5lX0lOIjsKLQl9Ci0gICAgICByZXR1cm4gIm5lIjsKLSAgICBjYXNlIExBTkdfTk9SV0VHSUFOOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCWNhc2UgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMOiByZXR1cm4gIm5vX05PIjsKLQljYXNlIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0s6IHJldHVybiAibm5fTk8iOwotCX0KLSAgICAgIHJldHVybiAibm8iOwotICAgIGNhc2UgTEFOR19PUklZQTogcmV0dXJuICJvcl9JTiI7Ci0gICAgY2FzZSBMQU5HX09ST01POiByZXR1cm4gIm9tX0VUIjsKLSAgICBjYXNlIExBTkdfUEFQSUFNRU5UVTogcmV0dXJuICJwYXBfQU4iOwotICAgIGNhc2UgTEFOR19QQVNIVE86Ci0gICAgICByZXR1cm4gInBzIjsgLyogQW1iaWd1b3VzOiBjb3VsZCBiZSAicHNfUEsiIG9yICJwc19BRiIuICAqLwotICAgIGNhc2UgTEFOR19QT0xJU0g6IHJldHVybiAicGxfUEwiOwotICAgIGNhc2UgTEFOR19QT1JUVUdVRVNFOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFOiByZXR1cm4gInB0X1BUIjsKLQkvKiBIbW0uIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4gPT0gU1VCTEFOR19ERUZBVUxULgotCSAgIFNhbWUgcGhlbm9tZW5vbiBhcyBTVUJMQU5HX0VOR0xJU0hfVVMgPT0gU1VCTEFOR19ERUZBVUxULiAqLwotCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTjogcmV0dXJuICJwdF9CUiI7Ci0JfQotICAgICAgcmV0dXJuICJwdCI7Ci0gICAgY2FzZSBMQU5HX1BVTkpBQkk6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX1BVTkpBQklfSU5ESUE6IHJldHVybiAicGFfSU4iOyAvKiBHdXJtdWtoaSBzY3JpcHQgKi8KLQljYXNlIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTjogcmV0dXJuICJwYV9QSyI7IC8qIEFyYWJpYyBzY3JpcHQgKi8KLQl9Ci0gICAgICByZXR1cm4gInBhIjsKLSAgICBjYXNlIExBTkdfUkhBRVRPX1JPTUFOQ0U6IHJldHVybiAicm1fQ0giOwotICAgIGNhc2UgTEFOR19ST01BTklBTjoKLSAgICAgIHN3aXRjaCAoc3ViKQotCXsKLQljYXNlIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQTogcmV0dXJuICJyb19STyI7Ci0JY2FzZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkE6IHJldHVybiAicm9fTUQiOwotCX0KLSAgICAgIHJldHVybiAicm8iOwotICAgIGNhc2UgTEFOR19SVVNTSUFOOgotICAgICAgcmV0dXJuICJydSI7IC8qIEFtYmlndW91czogY291bGQgYmUgInJ1X1JVIiBvciAicnVfVUEiIG9yICJydV9NRCIuICAqLwotICAgIGNhc2UgTEFOR19TQUFNSTogLyogYWN0dWFsbHkgTm9ydGhlcm4gU2FtaSAqLyByZXR1cm4gInNlX05PIjsKLSAgICBjYXNlIExBTkdfU0FOU0tSSVQ6IHJldHVybiAic2FfSU4iOwotICAgIGNhc2UgTEFOR19TSU5ESEk6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX1NJTkRISV9JTkRJQTogcmV0dXJuICJzZF9JTiI7Ci0JY2FzZSBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTjogcmV0dXJuICJzZF9QSyI7Ci0JfQotICAgICAgcmV0dXJuICJzZCI7Ci0gICAgY2FzZSBMQU5HX1NJTkhBTEVTRTogcmV0dXJuICJzaV9MSyI7Ci0gICAgY2FzZSBMQU5HX1NMT1ZBSzogcmV0dXJuICJza19TSyI7Ci0gICAgY2FzZSBMQU5HX1NMT1ZFTklBTjogcmV0dXJuICJzbF9TSSI7Ci0gICAgY2FzZSBMQU5HX1NPTUFMSTogcmV0dXJuICJzb19TTyI7Ci0gICAgY2FzZSBMQU5HX1NPUkJJQU46Ci0gICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLwotICAgICAgcmV0dXJuICJ3ZW5fREUiOwotICAgIGNhc2UgTEFOR19TUEFOSVNIOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCWNhc2UgU1VCTEFOR19TUEFOSVNIOiByZXR1cm4gImVzX0VTIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOOiByZXR1cm4gImVzX01YIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9NT0RFUk46Ci0JICByZXR1cm4gImVzX0VTQG1vZGVybiI7CS8qIG5vdCBzZWVuIG9uIFVuaXggKi8KLQljYXNlIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEE6IHJldHVybiAiZXNfR1QiOwotCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0E6IHJldHVybiAiZXNfQ1IiOwotCWNhc2UgU1VCTEFOR19TUEFOSVNIX1BBTkFNQTogcmV0dXJuICJlc19QQSI7Ci0JY2FzZSBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDOiByZXR1cm4gImVzX0RPIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEE6IHJldHVybiAiZXNfVkUiOwotCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBOiByZXR1cm4gImVzX0NPIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9QRVJVOiByZXR1cm4gImVzX1BFIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkE6IHJldHVybiAiZXNfQVIiOwotCWNhc2UgU1VCTEFOR19TUEFOSVNIX0VDVUFET1I6IHJldHVybiAiZXNfRUMiOwotCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NISUxFOiByZXR1cm4gImVzX0NMIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZOiByZXR1cm4gImVzX1VZIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWTogcmV0dXJuICJlc19QWSI7Ci0JY2FzZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQTogcmV0dXJuICJlc19CTyI7Ci0JY2FzZSBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1I6IHJldHVybiAiZXNfU1YiOwotCWNhc2UgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTOiByZXR1cm4gImVzX0hOIjsKLQljYXNlIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUE6IHJldHVybiAiZXNfTkkiOwotCWNhc2UgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPOiByZXR1cm4gImVzX1BSIjsKLQl9Ci0gICAgICByZXR1cm4gImVzIjsKLSAgICBjYXNlIExBTkdfU1VUVTogcmV0dXJuICJibnRfVFoiOyAvKiBvciAic3RfTFMiIG9yICJuc29fWkEiPyAqLwotICAgIGNhc2UgTEFOR19TV0FISUxJOiByZXR1cm4gInN3X0tFIjsKLSAgICBjYXNlIExBTkdfU1dFRElTSDoKLSAgICAgIHN3aXRjaCAoc3ViKQotCXsKLQljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJzdl9TRSI7Ci0JY2FzZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORDogcmV0dXJuICJzdl9GSSI7Ci0JfQotICAgICAgcmV0dXJuICJzdiI7Ci0gICAgY2FzZSBMQU5HX1NZUklBQzogcmV0dXJuICJzeXJfVFIiOyAvKiBBbiBleHRpbmN0IGxhbmd1YWdlLiAgKi8KLSAgICBjYXNlIExBTkdfVEFHQUxPRzogcmV0dXJuICJ0bF9QSCI7Ci0gICAgY2FzZSBMQU5HX1RBSklLOiByZXR1cm4gInRnX1RKIjsKLSAgICBjYXNlIExBTkdfVEFNQVpJR0hUOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIFRhbWF6aWdodCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KLQljYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQzogcmV0dXJuICJiZXJfTUFAYXJhYmljIjsKLQljYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0xBVElOOiByZXR1cm4gImJlcl9NQUBsYXRpbiI7Ci0JfQotICAgICAgcmV0dXJuICJiZXJfTUEiOwotICAgIGNhc2UgTEFOR19UQU1JTDoKLSAgICAgIHJldHVybiAidGEiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJ0YV9JTiIgb3IgInRhX0xLIiBvciAidGFfU0ciLiAgKi8KLSAgICBjYXNlIExBTkdfVEFUQVI6IHJldHVybiAidHRfUlUiOwotICAgIGNhc2UgTEFOR19URUxVR1U6IHJldHVybiAidGVfSU4iOwotICAgIGNhc2UgTEFOR19USEFJOiByZXR1cm4gInRoX1RIIjsKLSAgICBjYXNlIExBTkdfVElCRVRBTjogcmV0dXJuICJib19DTiI7Ci0gICAgY2FzZSBMQU5HX1RJR1JJTllBOgotICAgICAgc3dpdGNoIChzdWIpCi0JewotCWNhc2UgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQTogcmV0dXJuICJ0aV9FVCI7Ci0JY2FzZSBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUE6IHJldHVybiAidGlfRVIiOwotCX0KLSAgICAgIHJldHVybiAidGkiOwotICAgIGNhc2UgTEFOR19UU09OR0E6IHJldHVybiAidHNfWkEiOwotICAgIGNhc2UgTEFOR19UU1dBTkE6IHJldHVybiAidG5fQlciOwotICAgIGNhc2UgTEFOR19UVVJLSVNIOiByZXR1cm4gInRyX1RSIjsKLSAgICBjYXNlIExBTkdfVFVSS01FTjogcmV0dXJuICJ0a19UTSI7Ci0gICAgY2FzZSBMQU5HX1VLUkFJTklBTjogcmV0dXJuICJ1a19VQSI7Ci0gICAgY2FzZSBMQU5HX1VSRFU6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU46IHJldHVybiAidXJfUEsiOwotCWNhc2UgU1VCTEFOR19VUkRVX0lORElBOiByZXR1cm4gInVyX0lOIjsKLQl9Ci0gICAgICByZXR1cm4gInVyIjsKLSAgICBjYXNlIExBTkdfVVpCRUs6Ci0gICAgICBzd2l0Y2ggKHN1YikKLQl7Ci0JY2FzZSBTVUJMQU5HX1VaQkVLX0xBVElOOiByZXR1cm4gInV6X1VaIjsKLQljYXNlIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUM6IHJldHVybiAidXpfVVpAY3lyaWxsaWMiOwotCX0KLSAgICAgIHJldHVybiAidXoiOwotICAgIGNhc2UgTEFOR19WRU5EQTogcmV0dXJuICJ2ZV9aQSI7Ci0gICAgY2FzZSBMQU5HX1ZJRVROQU1FU0U6IHJldHVybiAidmlfVk4iOwotICAgIGNhc2UgTEFOR19XRUxTSDogcmV0dXJuICJjeV9HQiI7Ci0gICAgY2FzZSBMQU5HX1hIT1NBOiByZXR1cm4gInhoX1pBIjsKLSAgICBjYXNlIExBTkdfWUk6IHJldHVybiAic2l0X0NOIjsKLSAgICBjYXNlIExBTkdfWUlERElTSDogcmV0dXJuICJ5aV9JTCI7Ci0gICAgY2FzZSBMQU5HX1lPUlVCQTogcmV0dXJuICJ5b19ORyI7Ci0gICAgY2FzZSBMQU5HX1pVTFU6IHJldHVybiAienVfWkEiOwotICAgIGRlZmF1bHQ6IHJldHVybiAiQyI7Ci0gICAgfQotCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2cuYyBiL3VuaXgvaW50bC9sb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2MDc2ZS4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvbG9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBMb2cgZmlsZSBvdXRwdXQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBQcmludCBhbiBBU0NJSSBzdHJpbmcgd2l0aCBxdW90ZXMgYW5kIGVzY2FwZSBzZXF1ZW5jZXMgd2hlcmUgbmVlZGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9lc2NhcGVkIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgcHV0YyAoJyInLCBzdHJlYW0pOwotICBmb3IgKDsgKnN0ciAhPSAnXDAnOyBzdHIrKykKLSAgICBpZiAoKnN0ciA9PSAnXG4nKQotICAgICAgewotCWZwdXRzICgiXFxuXCIiLCBzdHJlYW0pOwotCWlmIChzdHJbMV0gPT0gJ1wwJykKLQkgIHJldHVybjsKLQlmcHV0cyAoIlxuXCIiLCBzdHJlYW0pOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpZiAoKnN0ciA9PSAnIicgfHwgKnN0ciA9PSAnXFwnKQotCSAgcHV0YyAoJ1xcJywgc3RyZWFtKTsKLQlwdXRjICgqc3RyLCBzdHJlYW0pOwotICAgICAgfQotICBwdXRjICgnIicsIHN0cmVhbSk7Ci19Ci0KLS8qIEFkZCB0byB0aGUgbG9nIGZpbGUgYW4gZW50cnkgZGVub3RpbmcgYSBmYWlsZWQgdHJhbnNsYXRpb24uICAqLwotdm9pZAotX25sX2xvZ191bnRyYW5zbGF0ZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAotCQkgICAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgaW50IHBsdXJhbCkKLXsKLSAgc3RhdGljIGNoYXIgKmxhc3RfbG9nZmlsZW5hbWUgPSBOVUxMOwotICBzdGF0aWMgRklMRSAqbGFzdF9sb2dmaWxlID0gTlVMTDsKLSAgRklMRSAqbG9nZmlsZTsKLQotICAvKiBDYW4gd2UgcmV1c2UgdGhlIGxhc3Qgb3BlbmVkIGxvZ2ZpbGU/ICAqLwotICBpZiAobGFzdF9sb2dmaWxlbmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAobG9nZmlsZW5hbWUsIGxhc3RfbG9nZmlsZW5hbWUpICE9IDApCi0gICAgewotICAgICAgLyogQ2xvc2UgdGhlIGxhc3QgdXNlZCBsb2dmaWxlLiAgKi8KLSAgICAgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lICE9IE5VTEwpCi0JewotCSAgaWYgKGxhc3RfbG9nZmlsZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZmNsb3NlIChsYXN0X2xvZ2ZpbGUpOwotCSAgICAgIGxhc3RfbG9nZmlsZSA9IE5VTEw7Ci0JICAgIH0KLQkgIGZyZWUgKGxhc3RfbG9nZmlsZW5hbWUpOwotCSAgbGFzdF9sb2dmaWxlbmFtZSA9IE5VTEw7Ci0JfQotICAgICAgLyogT3BlbiB0aGUgbG9nZmlsZS4gICovCi0gICAgICBsYXN0X2xvZ2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKGxvZ2ZpbGVuYW1lKSArIDEpOwotICAgICAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgPT0gTlVMTCkKLQlyZXR1cm47Ci0gICAgICBzdHJjcHkgKGxhc3RfbG9nZmlsZW5hbWUsIGxvZ2ZpbGVuYW1lKTsKLSAgICAgIGxhc3RfbG9nZmlsZSA9IGZvcGVuIChsb2dmaWxlbmFtZSwgImEiKTsKLSAgICAgIGlmIChsYXN0X2xvZ2ZpbGUgPT0gTlVMTCkKLQlyZXR1cm47Ci0gICAgfQotICBsb2dmaWxlID0gbGFzdF9sb2dmaWxlOwotCi0gIGZwcmludGYgKGxvZ2ZpbGUsICJkb21haW4gIik7Ci0gIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIGRvbWFpbm5hbWUpOwotICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZCAiKTsKLSAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgbXNnaWQxKTsKLSAgaWYgKHBsdXJhbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZF9wbHVyYWwgIik7Ci0gICAgICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBtc2dpZDIpOwotICAgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnc3RyWzBdIFwiXCJcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ3N0ciBcIlwiXG4iKTsKLSAgcHV0YyAoJ1xuJywgbG9nZmlsZSk7Ci19CmRpZmYgLS1naXQgYS91bml4L2ludGwvbmdldHRleHQuYyBiL3VuaXgvaW50bC9uZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzNlMDBjLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9uZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgbmdldHRleHQoMykgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgX19uZWVkX05VTEwKLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLwotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBOR0VUVEVYVCBfX25nZXR0ZXh0Ci0jIGRlZmluZSBEQ05HRVRURVhUIF9fZGNuZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIE5HRVRURVhUIGxpYmludGxfbmdldHRleHQKLSMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1jaGFyICoKLU5HRVRURVhUIChjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKLXsKLSAgcmV0dXJuIERDTkdFVFRFWFQgKE5VTEwsIG1zZ2lkMSwgbXNnaWQyLCBuLCBMQ19NRVNTQUdFUyk7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX25nZXR0ZXh0LCBuZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9vczJjb21wYXQuYyBiL3VuaXgvaW50bC9vczJjb21wYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkYzMzZS4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvb3MyY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBPUy8yIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jZGVmaW5lIE9TMl9BV0FSRQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIEEgdmVyc2lvbiBvZiBnZXRlbnYoKSB0aGF0IHdvcmtzIGZyb20gRExMcyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgRG9zU2NhbkVudiAoY29uc3QgdW5zaWduZWQgY2hhciAqcHN6TmFtZSwgdW5zaWduZWQgY2hhciAqKnBwc3pWYWx1ZSk7Ci0KLWNoYXIgKgotX25sX2dldGVudiAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgdW5zaWduZWQgY2hhciAqdmFsdWU7Ci0gIGlmIChEb3NTY2FuRW52IChuYW1lLCAmdmFsdWUpKQotICAgIHJldHVybiBOVUxMOwotICBlbHNlCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBBIGZpeGVkIHNpemUgYnVmZmVyLiAgKi8KLWNoYXIgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWVbTUFYUEFUSExFTisxXTsKLQotY2hhciAqX25sb3MyX2xpYmRpciA9IE5VTEw7Ci1jaGFyICpfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gTlVMTDsKLWNoYXIgKl9ubG9zMl9sb2NhbGVkaXIgPSBOVUxMOwotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkCi1ubG9zMl9pbml0aWFsaXplICgpCi17Ci0gIGNoYXIgKnJvb3QgPSBnZXRlbnYgKCJVTklYUk9PVCIpOwotICBjaGFyICpnbnVsb2NhbGVkaXIgPSBnZXRlbnYgKCJHTlVMT0NBTEVESVIiKTsKLQotICBfbmxvczJfbGliZGlyID0gZ251bG9jYWxlZGlyOwotICBpZiAoIV9ubG9zMl9saWJkaXIpCi0gICAgewotICAgICAgaWYgKHJvb3QpCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOwotICAgICAgICAgIF9ubG9zMl9saWJkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMSUJESVIpICsgMSk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyLCByb290LCBzbCk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyICsgc2wsIExJQkRJUiwgc3RybGVuIChMSUJESVIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgX25sb3MyX2xpYmRpciA9IExJQkRJUjsKLSAgICB9Ci0KLSAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IGdudWxvY2FsZWRpcjsKLSAgaWYgKCFfbmxvczJfbG9jYWxlYWxpYXNwYXRoKQotICAgIHsKLSAgICAgIGlmIChyb290KQotICAgICAgICB7Ci0gICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKLSAgICAgICAgICBfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTE9DQUxFX0FMSUFTX1BBVEgpICsgMSk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoLCByb290LCBzbCk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoICsgc2wsIExPQ0FMRV9BTElBU19QQVRILCBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOwotICAgICAgICB9Ci0gICAgIGVsc2UKLSAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOwotICAgIH0KLQotICBfbmxvczJfbG9jYWxlZGlyID0gZ251bG9jYWxlZGlyOwotICBpZiAoIV9ubG9zMl9sb2NhbGVkaXIpCi0gICAgewotICAgICAgaWYgKHJvb3QpCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOwotICAgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMT0NBTEVESVIpICsgMSk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlZGlyLCByb290LCBzbCk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlZGlyICsgc2wsIExPQ0FMRURJUiwgc3RybGVuIChMT0NBTEVESVIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgX25sb3MyX2xvY2FsZWRpciA9IExPQ0FMRURJUjsKLSAgICB9Ci0KLSAgaWYgKHN0cmxlbiAoX25sb3MyX2xvY2FsZWRpcikgPD0gTUFYUEFUSExFTikKLSAgICBzdHJjcHkgKGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lLCBfbmxvczJfbG9jYWxlZGlyKTsKLX0KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9vczJjb21wYXQuaCBiL3VuaXgvaW50bC9vczJjb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3NGU4Yy4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvb3MyY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBPUy8yIGNvbXBhdGliaWxpdHkgZGVmaW5lcy4KLSAgIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBmcm9tIGNvbmZpZy5oCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLS8qIFdoZW4gaW5jbHVkZWQgZnJvbSBvczJjb21wYXQuaCB3ZSBuZWVkIGFsbCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbnMgKi8KLSNpZm5kZWYgT1MyX0FXQVJFCi0KLSN1bmRlZiBMSUJESVIKLSNkZWZpbmUgTElCRElSCQkJX25sb3MyX2xpYmRpcgotZXh0ZXJuIGNoYXIgKl9ubG9zMl9saWJkaXI7Ci0KLSN1bmRlZiBMT0NBTEVESVIKLSNkZWZpbmUgTE9DQUxFRElSCQlfbmxvczJfbG9jYWxlZGlyCi1leHRlcm4gY2hhciAqX25sb3MyX2xvY2FsZWRpcjsKLQotI3VuZGVmIExPQ0FMRV9BTElBU19QQVRICi0jZGVmaW5lIExPQ0FMRV9BTElBU19QQVRICV9ubG9zMl9sb2NhbGVhbGlhc3BhdGgKLWV4dGVybiBjaGFyICpfbmxvczJfbG9jYWxlYWxpYXNwYXRoOwotCi0jZW5kaWYKLQotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotI2RlZmluZSBIQVZFX1NUUkNBU0VDTVAgMQotI2RlZmluZSBzdHJjYXNlY21wIHN0cmljbXAKLSNkZWZpbmUgc3RybmNhc2VjbXAgc3RybmljbXAKLQotLyogV2UgaGF2ZSBvdXIgb3duIGdldGVudigpIHdoaWNoIHdvcmtzIGV2ZW4gaWYgbGlicmFyeSBpcyBjb21waWxlZCBhcyBETEwgKi8KLSNkZWZpbmUgZ2V0ZW52IF9ubF9nZXRlbnYKLQotLyogT2xkZXIgdmVyc2lvbnMgb2YgZ2V0dGV4dCB1c2VkIC0xIGFzIHRoZSB2YWx1ZSBvZiBMQ19NRVNTQUdFUyAqLwotI2RlZmluZSBMQ19NRVNTQUdFU19DT01QQVQgKC0xKQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL29zZGVwLmMgYi91bml4L2ludGwvb3NkZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM3MjU5OC4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvb3NkZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qIE9TIGRlcGVuZGVudCBwYXJ0cyBvZiBsaWJpbnRsLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWYgZGVmaW5lZCBfX0VNWF9fCi0jIGluY2x1ZGUgIm9zMmNvbXBhdC5jIgotI2Vsc2UKLS8qIEF2b2lkIEFJWCBjb21waWxlciB3YXJuaW5nLiAgKi8KLXR5cGVkZWYgaW50IGR1bW15OwotI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvcGx1cmFsLWV4cC5jIGIvdW5peC9pbnRsL3BsdXJhbC1leHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwNGU2NC4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvcGx1cmFsLWV4cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCi0KLSNpZiAoZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX0FQUExFX0NDX18pIFwKLSAgICB8fCAoZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKLQotLyogVGhlc2Ugc3RydWN0cyBhcmUgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIHRoZSBnZXJtYW5pYyBwbHVyYWwKLSAgIGZvcm0gZGV0ZXJtaW5hdGlvbi4gIEl0IHJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gICJuICE9IDEiLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhciA9Ci17Ci0gIC5uYXJncyA9IDAsCi0gIC5vcGVyYXRpb24gPSB2YXIsCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uIHBsb25lID0KLXsKLSAgLm5hcmdzID0gMCwKLSAgLm9wZXJhdGlvbiA9IG51bSwKLSAgLnZhbCA9Ci0gIHsKLSAgICAubnVtID0gMQotICB9Ci19Owotc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMID0KLXsKLSAgLm5hcmdzID0gMiwKLSAgLm9wZXJhdGlvbiA9IG5vdF9lcXVhbCwKLSAgLnZhbCA9Ci0gIHsKLSAgICAuYXJncyA9Ci0gICAgewotICAgICAgWzBdID0gKHN0cnVjdCBleHByZXNzaW9uICopICZwbHZhciwKLSAgICAgIFsxXSA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSAmcGxvbmUKLSAgICB9Ci0gIH0KLX07Ci0KLSMgZGVmaW5lIElOSVRfR0VSTUFOSUNfUExVUkFMKCkKLQotI2Vsc2UKLQotLyogRm9yIGNvbXBpbGVycyB3aXRob3V0IHN1cHBvcnQgZm9yIElTTyBDIDk5IHN0cnVjdC91bmlvbiBpbml0aWFsaXplcnM6Ci0gICBJbml0aWFsaXphdGlvbiBhdCBydW4tdGltZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhcjsKLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZTsKLXN0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTDsKLQotc3RhdGljIHZvaWQKLWluaXRfZ2VybWFuaWNfcGx1cmFsICgpCi17Ci0gIGlmIChwbG9uZS52YWwubnVtID09IDApCi0gICAgewotICAgICAgcGx2YXIubmFyZ3MgPSAwOwotICAgICAgcGx2YXIub3BlcmF0aW9uID0gdmFyOwotCi0gICAgICBwbG9uZS5uYXJncyA9IDA7Ci0gICAgICBwbG9uZS5vcGVyYXRpb24gPSBudW07Ci0gICAgICBwbG9uZS52YWwubnVtID0gMTsKLQotICAgICAgR0VSTUFOSUNfUExVUkFMLm5hcmdzID0gMjsKLSAgICAgIEdFUk1BTklDX1BMVVJBTC5vcGVyYXRpb24gPSBub3RfZXF1YWw7Ci0gICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMF0gPSAmcGx2YXI7Ci0gICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMV0gPSAmcGxvbmU7Ci0gICAgfQotfQotCi0jIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpIGluaXRfZ2VybWFuaWNfcGx1cmFsICgpCi0KLSNlbmRpZgotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAoY29uc3QgY2hhciAqbnVsbGVudHJ5LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKnBsdXJhbHAsCi0JCQkgICB1bnNpZ25lZCBsb25nIGludCAqbnBsdXJhbHNwKQotewotICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqcGx1cmFsOwotICAgICAgY29uc3QgY2hhciAqbnBsdXJhbHM7Ci0KLSAgICAgIHBsdXJhbCA9IHN0cnN0ciAobnVsbGVudHJ5LCAicGx1cmFsPSIpOwotICAgICAgbnBsdXJhbHMgPSBzdHJzdHIgKG51bGxlbnRyeSwgIm5wbHVyYWxzPSIpOwotICAgICAgaWYgKHBsdXJhbCA9PSBOVUxMIHx8IG5wbHVyYWxzID09IE5VTEwpCi0JZ290byBub19wbHVyYWw7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqZW5kcDsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IG47Ci0JICBzdHJ1Y3QgcGFyc2VfYXJncyBhcmdzOwotCi0JICAvKiBGaXJzdCBnZXQgdGhlIG51bWJlci4gICovCi0JICBucGx1cmFscyArPSA5OwotCSAgd2hpbGUgKCpucGx1cmFscyAhPSAnXDAnICYmIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqbnBsdXJhbHMpKQotCSAgICArK25wbHVyYWxzOwotCSAgaWYgKCEoKm5wbHVyYWxzID49ICcwJyAmJiAqbnBsdXJhbHMgPD0gJzknKSkKLQkgICAgZ290byBub19wbHVyYWw7Ci0jaWYgZGVmaW5lZCBIQVZFX1NUUlRPVUwgfHwgZGVmaW5lZCBfTElCQwotCSAgbiA9IHN0cnRvdWwgKG5wbHVyYWxzLCAmZW5kcCwgMTApOwotI2Vsc2UKLQkgIGZvciAoZW5kcCA9IG5wbHVyYWxzLCBuID0gMDsgKmVuZHAgPj0gJzAnICYmICplbmRwIDw9ICc5JzsgZW5kcCsrKQotCSAgICBuID0gbiAqIDEwICsgKCplbmRwIC0gJzAnKTsKLSNlbmRpZgotCSAgaWYgKG5wbHVyYWxzID09IGVuZHApCi0JICAgIGdvdG8gbm9fcGx1cmFsOwotCSAgKm5wbHVyYWxzcCA9IG47Ci0KLQkgIC8qIER1ZSB0byB0aGUgcmVzdHJpY3Rpb25zIGJpc29uIGltcG9zZXMgb250byB0aGUgaW50ZXJmYWNlIG9mIHRoZQotCSAgICAgc2Nhbm5lciBmdW5jdGlvbiB3ZSBoYXZlIHRvIHB1dCB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgcmVzdWx0Ci0JICAgICBwYXNzZWQgdXAgZnJvbSB0aGUgcGFyc2VyIGludG8gdGhlIHNhbWUgc3RydWN0dXJlIHdoaWNoIGFkZHJlc3MKLQkgICAgIGlzIHBhc3NlZCBkb3duIHRvIHRoZSBwYXJzZXIuICAqLwotCSAgcGx1cmFsICs9IDc7Ci0JICBhcmdzLmNwID0gcGx1cmFsOwotCSAgaWYgKFBMVVJBTF9QQVJTRSAoJmFyZ3MpICE9IDApCi0JICAgIGdvdG8gbm9fcGx1cmFsOwotCSAgKnBsdXJhbHAgPSBhcmdzLnJlczsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQnkgZGVmYXVsdCB3ZSBhcmUgdXNpbmcgdGhlIEdlcm1hbmljIGZvcm06IHNpbmd1bGFyIGZvcm0gb25seQotICAgICAgICAgZm9yIGBvbmUnLCB0aGUgcGx1cmFsIGZvcm0gb3RoZXJ3aXNlLiAgWWVzLCB0aGlzIGlzIGFsc28gd2hhdAotICAgICAgICAgRW5nbGlzaCBpcyB1c2luZyBzaW5jZSBFbmdsaXNoIGlzIGEgR2VybWFuaWMgbGFuZ3VhZ2UuICAqLwotICAgIG5vX3BsdXJhbDoKLSAgICAgIElOSVRfR0VSTUFOSUNfUExVUkFMICgpOwotICAgICAgKnBsdXJhbHAgPSAmR0VSTUFOSUNfUExVUkFMOwotICAgICAgKm5wbHVyYWxzcCA9IDI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3BsdXJhbC1leHAuaCBiL3VuaXgvaW50bC9wbHVyYWwtZXhwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTJjNWIuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL3BsdXJhbC1leHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiBFeHByZXNzaW9uIHBhcnNpbmcgYW5kIGV2YWx1YXRpb24gZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX1BMVVJBTF9FWFBfSAotI2RlZmluZSBfUExVUkFMX0VYUF9ICi0KLSNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCi0jIGRlZmluZSBhdHRyaWJ1dGVfaGlkZGVuCi0jZW5kaWYKLQotCi0vKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHRoZQotICAgcGx1cmFsIGZvcm0uICAqLwotc3RydWN0IGV4cHJlc3Npb24KLXsKLSAgaW50IG5hcmdzOwkJCS8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBlbnVtIG9wZXJhdG9yCi0gIHsKLSAgICAvKiBXaXRob3V0IGFyZ3VtZW50czogICovCi0gICAgdmFyLAkJCS8qIFRoZSB2YXJpYWJsZSAibiIuICAqLwotICAgIG51bSwJCQkvKiBEZWNpbWFsIG51bWJlci4gICovCi0gICAgLyogVW5hcnkgb3BlcmF0b3JzOiAgKi8KLSAgICBsbm90LAkJCS8qIExvZ2ljYWwgTk9ULiAgKi8KLSAgICAvKiBCaW5hcnkgb3BlcmF0b3JzOiAgKi8KLSAgICBtdWx0LAkJCS8qIE11bHRpcGxpY2F0aW9uLiAgKi8KLSAgICBkaXZpZGUsCQkJLyogRGl2aXNpb24uICAqLwotICAgIG1vZHVsZSwJCQkvKiBNb2R1bG8gb3BlcmF0aW9uLiAgKi8KLSAgICBwbHVzLAkJCS8qIEFkZGl0aW9uLiAgKi8KLSAgICBtaW51cywJCQkvKiBTdWJ0cmFjdGlvbi4gICovCi0gICAgbGVzc190aGFuLAkJCS8qIENvbXBhcmlzb24uICAqLwotICAgIGdyZWF0ZXJfdGhhbiwJCS8qIENvbXBhcmlzb24uICAqLwotICAgIGxlc3Nfb3JfZXF1YWwsCQkvKiBDb21wYXJpc29uLiAgKi8KLSAgICBncmVhdGVyX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCi0gICAgZXF1YWwsCQkJLyogQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkuICAqLwotICAgIG5vdF9lcXVhbCwJCQkvKiBDb21wYXJpc29uIGZvciBpbmVxdWFsaXR5LiAgKi8KLSAgICBsYW5kLAkJCS8qIExvZ2ljYWwgQU5ELiAgKi8KLSAgICBsb3IsCQkJLyogTG9naWNhbCBPUi4gICovCi0gICAgLyogVGVybmFyeSBvcGVyYXRvcnM6ICAqLwotICAgIHFtb3AJCQkvKiBRdWVzdGlvbiBtYXJrIG9wZXJhdG9yLiAgKi8KLSAgfSBvcGVyYXRpb247Ci0gIHVuaW9uCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGludCBudW07CS8qIE51bWJlciB2YWx1ZSBmb3IgYG51bScuICAqLwotICAgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwkvKiBVcCB0byB0aHJlZSBhcmd1bWVudHMuICAqLwotICB9IHZhbDsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIHBhcnNlciBhbmQgZ2V0Ci0gICB0aGUgcmVzdWx0IGluIGEgdGhyZWFkLXNhZmUgd2F5LiAgKi8KLXN0cnVjdCBwYXJzZV9hcmdzCi17Ci0gIGNvbnN0IGNoYXIgKmNwOwotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmVzOwotfTsKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGlzIHNvdXJjZSBjb2RlIGlzIHVzZWQKLSAgIDEuIGluIHRoZSBHTlUgQyBMaWJyYXJ5IGxpYnJhcnksCi0gICAyLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSwKLSAgIDMuIGluIHRoZSBHTlUgZ2V0dGV4dCB0b29scy4KLSAgIFRoZSBmdW5jdGlvbiBuYW1lcyBpbiBlYWNoIHNpdHVhdGlvbiBtdXN0IGJlIGRpZmZlcmVudCwgdG8gYWxsb3cgZm9yCi0gICBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4gJ3N0cnVjdCBleHByZXNzaW9uJy4gIEZ1cnRoZXJtb3JlLAotICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwgdGhlIG5hbWVzIGhhdmUgYSBfXyBwcmVmaXgsCi0gICAyLiszLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSBhbmQgaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLCB0aGUgbmFtZXMKLSAgICAgICAgIG11c3QgZm9sbG93IEFOU0kgQyBhbmQgbm90IHN0YXJ0IHdpdGggX18uCi0gICBTbyB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHRoZSB0aHJlZSBjYXNlcy4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBfX2dldHRleHRfZnJlZV9leHAKLSMgZGVmaW5lIFBMVVJBTF9QQVJTRSBfX2dldHRleHRwYXJzZQotIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIF9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwKLSMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gX19nZXR0ZXh0X2V4dHJhY3RfcGx1cmFsCi0jZWxpZiBkZWZpbmVkIChJTl9MSUJJTlRMKQotIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9mcmVlX2V4cAotIyBkZWZpbmUgUExVUkFMX1BBUlNFIGxpYmludGxfZ2V0dGV4dHBhcnNlCi0jIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgbGliaW50bF9nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAotIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBsaWJpbnRsX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKLSNlbHNlCi0jIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gZnJlZV9wbHVyYWxfZXhwcmVzc2lvbgotIyBkZWZpbmUgUExVUkFMX1BBUlNFIHBhcnNlX3BsdXJhbF9leHByZXNzaW9uCi0jIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgZ2VybWFuaWNfcGx1cmFsCi0jIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGV4dHJhY3RfcGx1cmFsX2V4cHJlc3Npb24KLSNlbmRpZgotCi1leHRlcm4gdm9pZCBGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIGludCBQTFVSQUxfUEFSU0UgKHZvaWQgKmFyZyk7Ci1leHRlcm4gc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gdm9pZCBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChjb25zdCBjaGFyICpudWxsZW50cnksCi0JCQkJICAgICAgIHN0cnVjdCBleHByZXNzaW9uICoqcGx1cmFscCwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLSNpZiAhZGVmaW5lZCAoX0xJQkMpICYmICFkZWZpbmVkIChJTl9MSUJJTlRMKQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHBsdXJhbF9ldmFsIChzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBuKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX1BMVVJBTF9FWFBfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3BsdXJhbC5jIGIvdW5peC9pbnRsL3BsdXJhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQ5NGY5Li4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9wbHVyYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OTAgKzAsMCBAQAotLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBwbHVyYWwueQotICAgYnkgR05VIGJpc29uIDEuMzUuICAqLwotCi0jZGVmaW5lIFlZQklTT04gMSAgLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KLQotI2RlZmluZSB5eXBhcnNlIF9fZ2V0dGV4dHBhcnNlCi0jZGVmaW5lIHl5bGV4IF9fZ2V0dGV4dGxleAotI2RlZmluZSB5eWVycm9yIF9fZ2V0dGV4dGVycm9yCi0jZGVmaW5lIHl5bHZhbCBfX2dldHRleHRsdmFsCi0jZGVmaW5lIHl5Y2hhciBfX2dldHRleHRjaGFyCi0jZGVmaW5lIHl5ZGVidWcgX19nZXR0ZXh0ZGVidWcKLSNkZWZpbmUgeXluZXJycyBfX2dldHRleHRuZXJycwotIyBkZWZpbmUJRVFVT1AyCTI1NwotIyBkZWZpbmUJQ01QT1AyCTI1OAotIyBkZWZpbmUJQURET1AyCTI1OQotIyBkZWZpbmUJTVVMT1AyCTI2MAotIyBkZWZpbmUJTlVNQkVSCTI2MQotCi0jbGluZSAxICJwbHVyYWwueSIKLQotLyogRXhwcmVzc2lvbiBwYXJzaW5nIGZvciBwbHVyYWwgZm9ybSBzZWxlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0vKiBUaGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNlciB1c2VzIGFsbG9jYS4gIEFJWCAzIGZvcmNlcyB1cyB0byBwdXQgdGhpcwotICAgZGVjbGFyYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZSBkZWNsYXJhdGlvbiBpbiBiaXNvbidzCi0gICBza2VsZXRvbiBmaWxlIGNvbWVzIHRvbyBsYXRlLiAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4KLSAgIGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZSBhcmJpdHJhcnkgc3lzdGVtIGhlYWRlcnMuICAqLwotI2lmIGRlZmluZWQgX0FJWCAmJiAhZGVmaW5lZCBfX0dOVUNfXwotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLQotLyogVGhlIG1haW4gZnVuY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIgaXMgY2FsbGVkIF9fZ2V0dGV4dHBhcnNlLAotICAgYnV0IHdlIHdhbnQgaXQgdG8gYmUgY2FsbGVkIFBMVVJBTF9QQVJTRS4gICovCi0jaWZuZGVmIF9MSUJDCi0jIGRlZmluZSBfX2dldHRleHRwYXJzZSBQTFVSQUxfUEFSU0UKLSNlbmRpZgotCi0jZGVmaW5lIFlZTEVYX1BBUkFNCSYoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPmNwCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU0JYXJnCi0KLSNsaW5lIDQ5ICJwbHVyYWwueSIKLSNpZm5kZWYgWVlTVFlQRQotdHlwZWRlZiB1bmlvbiB7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IG51bTsKLSAgZW51bSBvcGVyYXRvciBvcDsKLSAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKLX0geXlzdHlwZTsKLSMgZGVmaW5lIFlZU1RZUEUgeXlzdHlwZQotIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKLSNlbmRpZgotI2xpbmUgNTUgInBsdXJhbC55IgotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCB5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApOwotc3RhdGljIHZvaWQgeXllcnJvciAoY29uc3QgY2hhciAqc3RyKTsKLQotLyogQWxsb2NhdGlvbiBvZiBleHByZXNzaW9ucy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwIChpbnQgbmFyZ3MsIGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICogY29uc3QgKmFyZ3MpCi17Ci0gIGludCBpOwotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmV3cDsKLQotICAvKiBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBtYWxsb2MnZWQsIGp1c3QgcmV0dXJuIE5VTEwuICAqLwotICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIGlmIChhcmdzW2ldID09IE5VTEwpCi0gICAgICBnb3RvIGZhaWw7Ci0KLSAgLyogQWxsb2NhdGUgYSBuZXcgZXhwcmVzc2lvbi4gICovCi0gIG5ld3AgPSAoc3RydWN0IGV4cHJlc3Npb24gKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7Ci0gIGlmIChuZXdwICE9IE5VTEwpCi0gICAgewotICAgICAgbmV3cC0+bmFyZ3MgPSBuYXJnczsKLSAgICAgIG5ld3AtPm9wZXJhdGlvbiA9IG9wOwotICAgICAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKLQluZXdwLT52YWwuYXJnc1tpXSA9IGFyZ3NbaV07Ci0gICAgICByZXR1cm4gbmV3cDsKLSAgICB9Ci0KLSBmYWlsOgotICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIEZSRUVfRVhQUkVTU0lPTiAoYXJnc1tpXSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotbmV3X2V4cF8wIChlbnVtIG9wZXJhdG9yIG9wKQotewotICByZXR1cm4gbmV3X2V4cCAoMCwgb3AsIE5VTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKLW5ld19leHBfMSAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQotewotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1sxXTsKLQotICBhcmdzWzBdID0gcmlnaHQ7Ci0gIHJldHVybiBuZXdfZXhwICgxLCBvcCwgYXJncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwXzIgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpsZWZ0LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCi17Ci0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzJdOwotCi0gIGFyZ3NbMF0gPSBsZWZ0OwotICBhcmdzWzFdID0gcmlnaHQ7Ci0gIHJldHVybiBuZXdfZXhwICgyLCBvcCwgYXJncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotbmV3X2V4cF8zIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqYmV4cCwKLQkgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqdGJyYW5jaCwgc3RydWN0IGV4cHJlc3Npb24gKmZicmFuY2gpCi17Ci0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwotCi0gIGFyZ3NbMF0gPSBiZXhwOwotICBhcmdzWzFdID0gdGJyYW5jaDsKLSAgYXJnc1syXSA9IGZicmFuY2g7Ci0gIHJldHVybiBuZXdfZXhwICgzLCBvcCwgYXJncyk7Ci19Ci0KLSNpZm5kZWYgWVlERUJVRwotIyBkZWZpbmUgWVlERUJVRyAwCi0jZW5kaWYKLQotCi0KLSNkZWZpbmUJWVlGSU5BTAkJMjcKLSNkZWZpbmUJWVlGTEFHCQktMzI3NjgKLSNkZWZpbmUJWVlOVEJBU0UJMTYKLQotLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHRva2VuIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAqLwotI2RlZmluZSBZWVRSQU5TTEFURSh4KSAoKHVuc2lnbmVkKSh4KSA8PSAyNjEgPyB5eXRyYW5zbGF0ZVt4XSA6IDE4KQotCi0vKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICovCi1zdGF0aWMgY29uc3QgY2hhciB5eXRyYW5zbGF0ZVtdID0KLXsKLSAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDUsICAgICAyLAotICAgICAgMTQsICAgIDE1LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAxMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICA2LCAgICAgNywgICAgIDgsCi0gICAgICAgOSwgICAgMTEKLX07Ci0KLSNpZiBZWURFQlVHCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwcmhzW10gPQotewotICAgICAgIDAsICAgICAwLCAgICAgMiwgICAgIDgsICAgIDEyLCAgICAxNiwgICAgMjAsICAgIDI0LCAgICAyOCwgICAgMzIsCi0gICAgICAzNSwgICAgMzcsICAgIDM5Ci19Owotc3RhdGljIGNvbnN0IHNob3J0IHl5cmhzW10gPQotewotICAgICAgMTcsICAgICAwLCAgICAxNywgICAgIDMsICAgIDE3LCAgICAxMiwgICAgMTcsICAgICAwLCAgICAxNywgICAgIDQsCi0gICAgICAxNywgICAgIDAsICAgIDE3LCAgICAgNSwgICAgMTcsICAgICAwLCAgICAxNywgICAgIDYsICAgIDE3LCAgICAgMCwKLSAgICAgIDE3LCAgICAgNywgICAgMTcsICAgICAwLCAgICAxNywgICAgIDgsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA5LAotICAgICAgMTcsICAgICAwLCAgICAxMCwgICAgMTcsICAgICAwLCAgICAxMywgICAgIDAsICAgIDExLCAgICAgMCwgICAgMTQsCi0gICAgICAxNywgICAgMTUsICAgICAwCi19OwotCi0jZW5kaWYKLQotI2lmIFlZREVCVUcKLS8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICovCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlybGluZVtdID0KLXsKLSAgICAgICAwLCAgIDE1MCwgICAxNTgsICAgMTYyLCAgIDE2NiwgICAxNzAsICAgMTc0LCAgIDE3OCwgICAxODIsICAgMTg2LAotICAgICAxOTAsICAgMTk0LCAgIDE5OQotfTsKLSNlbmRpZgotCi0KLSNpZiAoWVlERUJVRykgfHwgZGVmaW5lZCBZWUVSUk9SX1ZFUkJPU0UKLQotLyogWVlUTkFNRVtUT0tFTl9OVU1dIC0tIFN0cmluZyBuYW1lIG9mIHRoZSB0b2tlbiBUT0tFTl9OVU0uICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KLXsKLSAgIiQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZC4iLCAiJz8nIiwgIid8JyIsICInJiciLCAiRVFVT1AyIiwgIkNNUE9QMiIsIAotICAiQURET1AyIiwgIk1VTE9QMiIsICInISciLCAiTlVNQkVSIiwgIic6JyIsICInbiciLCAiJygnIiwgIicpJyIsIAotICAic3RhcnQiLCAiZXhwIiwgMAotfTsKLSNlbmRpZgotCi0vKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAqLwotc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9Ci17Ci0gICAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywKLSAgICAgIDE3LCAgICAxNywgICAgMTcKLX07Ci0KLS8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAqLwotc3RhdGljIGNvbnN0IHNob3J0IHl5cjJbXSA9Ci17Ci0gICAgICAgMCwgICAgIDEsICAgICA1LCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMiwKLSAgICAgICAxLCAgICAgMSwgICAgIDMKLX07Ci0KLS8qIFlZREVGQUNUW1NdIC0tIGRlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZSBTIHdoZW4gWVlUQUJMRQotICAgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybyBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbgotICAgZXJyb3IuICovCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZhY3RbXSA9Ci17Ci0gICAgICAgMCwgICAgIDAsICAgIDExLCAgICAxMCwgICAgIDAsICAgICAxLCAgICAgOSwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTIsICAgICAwLCAgICAgMywgICAgIDQsICAgICA1LAotICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDAsICAgICAyLCAgICAgMCwgICAgIDAsICAgICAwCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPQotewotICAgICAgMjUsICAgICA1Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPQotewotICAgICAgLTksICAgIC05LC0zMjc2OCwtMzI3NjgsICAgIC05LCAgICAzNCwtMzI3NjgsICAgIDExLCAgICAtOSwgICAgLTksCi0gICAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwgICAgLTksLTMyNzY4LCAgICAyNCwgICAgMzksICAgIDQzLCAgICAxNiwKLSAgICAgIDI2LCAgICAtMywtMzI3NjgsICAgIC05LCAgICAzNCwgICAgMjEsICAgIDUzLC0zMjc2OAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9Ci17Ci0gIC0zMjc2OCwgICAgLTEKLX07Ci0KLQotI2RlZmluZQlZWUxBU1QJCTUzCi0KLQotc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9Ci17Ci0gICAgICAgNiwgICAgIDEsICAgICAyLCAgICAgNywgICAgIDMsICAgICA0LCAgICAxNCwgICAgMTYsICAgIDE3LCAgICAxOCwKLSAgICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAotICAgICAgMTQsICAgIDI2LCAgICAyNCwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTMsICAgIDE0LCAgICAyMywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDExLAotICAgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMjcKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPQotewotICAgICAgIDEsICAgIDEwLCAgICAxMSwgICAgIDQsICAgIDEzLCAgICAxNCwgICAgIDksICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwKLSAgICAgICA5LCAgICAgMCwgICAgMjMsICAgICA3LCAgICAgOCwgICAgIDksICAgIDE1LCAgICAgMywgICAgIDQsICAgICA1LAotICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA4LCAgICAgOSwgICAgMTIsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAgNiwKLSAgICAgICA3LCAgICAgOCwgICAgIDksICAgICAwCi19OwotI2RlZmluZSBZWVBVUkUgMQotCi0vKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLwotI2xpbmUgMyAiL3Vzci9sb2NhbC9zaGFyZS9iaXNvbi9iaXNvbi5zaW1wbGUiCi0KLS8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQotICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCi0KLS8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyIHdoZW4KLSAgIHRoZSAlc2VtYW50aWNfcGFyc2VyIGRlY2xhcmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIuCi0gICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKLSAgIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCi0KLS8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCi0gICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKLSAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCi0gICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCi0gICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgotICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCi0KLSNpZiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKLQotLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLwotCi0jIGlmIFlZU1RBQ0tfVVNFX0FMTE9DQQotIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCi0jIGVsc2UKLSMgIGlmbmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKLSMgICBpZiBkZWZpbmVkIChhbGxvY2EpIHx8IGRlZmluZWQgKF9BTExPQ0FfSCkKLSMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZmRlZiBfX0dOVUNfXwotIyAgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotCi0jIGlmZGVmIFlZU1RBQ0tfQUxMT0MKLSAgIC8qIFBhY2lmeSBHQ0MncyBgZW1wdHkgaWYtYm9keScgd2FybmluZy4gKi8KLSMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlICgwKQotIyBlbHNlCi0jICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi0jICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLSMgICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90Ci0jICBlbmRpZgotIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgbWFsbG9jCi0jICBkZWZpbmUgWVlTVEFDS19GUkVFIGZyZWUKLSMgZW5kaWYKLSNlbmRpZiAvKiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkgKi8KLQotCi0jaWYgKCEgZGVmaW5lZCAoeXlvdmVyZmxvdykgXAotICAgICAmJiAoISBkZWZpbmVkIChfX2NwbHVzcGx1cykgXAotCSB8fCAoWVlMVFlQRV9JU19UUklWSUFMICYmIFlZU1RZUEVfSVNfVFJJVklBTCkpKQotCi0vKiBBIHR5cGUgdGhhdCBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBhbnkgc3RhY2sgbWVtYmVyLiAgKi8KLXVuaW9uIHl5YWxsb2MKLXsKLSAgc2hvcnQgeXlzczsKLSAgWVlTVFlQRSB5eXZzOwotIyBpZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxzOwotIyBlbmRpZgotfTsKLQotLyogVGhlIHNpemUgb2YgdGhlIG1heGltdW0gZ2FwIGJldHdlZW4gb25lIGFsaWduZWQgc3RhY2sgYW5kIHRoZSBuZXh0LiAgKi8KLSMgZGVmaW5lIFlZU1RBQ0tfR0FQX01BWCAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCi0KLS8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAotICAgTiBlbGVtZW50cy4gICovCi0jIGlmIFlZTFNQX05FRURFRAotIyAgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAotICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQpICsgc2l6ZW9mIChZWVNUWVBFKSArIHNpemVvZiAoWVlMVFlQRSkpCVwKLSAgICAgICsgMiAqIFlZU1RBQ0tfR0FQX01BWCkKLSMgZWxzZQotIyAgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAotICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQpICsgc2l6ZW9mIChZWVNUWVBFKSkJCQkJXAotICAgICAgKyBZWVNUQUNLX0dBUF9NQVgpCi0jIGVuZGlmCi0KLS8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbwotICAgbm90IG92ZXJsYXAuICAqLwotIyBpZm5kZWYgWVlDT1BZCi0jICBpZiAxIDwgX19HTlVDX18KLSMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAotICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQotIyAgZWxzZQotIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAotICAgICAgZG8JCQkJCVwKLQl7CQkJCQlcCi0JICByZWdpc3RlciBZWVNJWkVfVCB5eWk7CQlcCi0JICBmb3IgKHl5aSA9IDA7IHl5aSA8IChDb3VudCk7IHl5aSsrKQlcCi0JICAgIChUbylbeXlpXSA9IChGcm9tKVt5eWldOwkJXAotCX0JCQkJCVwKLSAgICAgIHdoaWxlICgwKQotIyAgZW5kaWYKLSMgZW5kaWYKLQotLyogUmVsb2NhdGUgU1RBQ0sgZnJvbSBpdHMgb2xkIGxvY2F0aW9uIHRvIHRoZSBuZXcgb25lLiAgVGhlCi0gICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKLSAgIGVsZW1lbnRzIGluIHRoZSBzdGFjaywgYW5kIFlZUFRSIGdpdmVzIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlCi0gICBzdGFjay4gIEFkdmFuY2UgWVlQVFIgdG8gYSBwcm9wZXJseSBhbGlnbmVkIGxvY2F0aW9uIGZvciB0aGUgbmV4dAotICAgc3RhY2suICAqLwotIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFjaykJCQkJCVwKLSAgICBkbwkJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCi0JWVlDT1BZICgmeXlwdHItPlN0YWNrLCBTdGFjaywgeXlzaXplKTsJCQkJXAotCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCi0JeXluZXdieXRlcyA9IHl5c3RhY2tzaXplICogc2l6ZW9mICgqU3RhY2spICsgWVlTVEFDS19HQVBfTUFYOwlcCi0JeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICB3aGlsZSAoMCkKLQotI2VuZGlmCi0KLQotI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKF9fU0laRV9UWVBFX18pCi0jIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCi0jZW5kaWYKLSNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChzaXplX3QpCi0jIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKLSNlbmRpZgotI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCi0jIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90Ci0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQotIyBkZWZpbmUgWVlTSVpFX1QgdW5zaWduZWQgaW50Ci0jZW5kaWYKLQotI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQotI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCi0jZGVmaW5lIFlZRU1QVFkJCS0yCi0jZGVmaW5lIFlZRU9GCQkwCi0jZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKLSNkZWZpbmUgWVlBQk9SVCAJZ290byB5eWFib3J0bGFiCi0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCi0vKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4gIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5Ci0gICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLwotI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotI2RlZmluZSBZWUJBQ0tVUChUb2tlbiwgVmFsdWUpCQkJCQlcCi1kbwkJCQkJCQkJXAotICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAotICAgIHsJCQkJCQkJCVwKLSAgICAgIHl5Y2hhciA9IChUb2tlbik7CQkJCQkJXAotICAgICAgeXlsdmFsID0gKFZhbHVlKTsJCQkJCQlcCi0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKLSAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAotICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotICBlbHNlCQkJCQkJCQlcCi0gICAgeyAJCQkJCQkJCVwKLSAgICAgIHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7CQkJXAotICAgICAgWVlFUlJPUjsJCQkJCQkJXAotICAgIH0JCQkJCQkJCVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIFlZVEVSUk9SCTEKLSNkZWZpbmUgWVlFUlJDT0RFCTI1NgotCi0KLS8qIFlZTExPQ19ERUZBVUxUIC0tIENvbXB1dGUgdGhlIGRlZmF1bHQgbG9jYXRpb24gKGJlZm9yZSB0aGUgYWN0aW9ucwotICAgYXJlIHJ1bikuCi0KLSAgIFdoZW4gWVlMTE9DX0RFRkFVTFQgaXMgcnVuLCBDVVJSRU5UIGlzIHNldCB0aGUgbG9jYXRpb24gb2YgdGhlCi0gICBmaXJzdCB0b2tlbi4gIEJ5IGRlZmF1bHQsIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciByYW5nZXMsIGV4dGVuZAotICAgaXRzIHJhbmdlIHRvIHRoZSBsYXN0IHN5bWJvbC4gICovCi0KLSNpZm5kZWYgWVlMTE9DX0RFRkFVTFQKLSMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikgICAgICAgCVwKLSAgIEN1cnJlbnQubGFzdF9saW5lICAgPSBSaHNbTl0ubGFzdF9saW5lOwlcCi0gICBDdXJyZW50Lmxhc3RfY29sdW1uID0gUmhzW05dLmxhc3RfY29sdW1uOwotI2VuZGlmCi0KLQotLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCi0KLSNpZiBZWVBVUkUKLSMgaWYgWVlMU1BfTkVFREVECi0jICBpZmRlZiBZWUxFWF9QQVJBTQotIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQotIyAgZWxzZQotIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwsICZ5eWxsb2MpCi0jICBlbmRpZgotIyBlbHNlIC8qICFZWUxTUF9ORUVERUQgKi8KLSMgIGlmZGVmIFlZTEVYX1BBUkFNCi0jICAgZGVmaW5lIFlZTEVYCQl5eWxleCAoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCi0jICBlbHNlCi0jICAgZGVmaW5lIFlZTEVYCQl5eWxleCAoJnl5bHZhbCkKLSMgIGVuZGlmCi0jIGVuZGlmIC8qICFZWUxTUF9ORUVERUQgKi8KLSNlbHNlIC8qICFZWVBVUkUgKi8KLSMgZGVmaW5lIFlZTEVYCQkJeXlsZXggKCkKLSNlbmRpZiAvKiAhWVlQVVJFICovCi0KLQotLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLwotI2lmIFlZREVCVUcKLQotIyBpZm5kZWYgWVlGUFJJTlRGCi0jICBpbmNsdWRlIDxzdGRpby5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICBkZWZpbmUgWVlGUFJJTlRGIGZwcmludGYKLSMgZW5kaWYKLQotIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCQkJXAotZG8gewkJCQkJCVwKLSAgaWYgKHl5ZGVidWcpCQkJCQlcCi0gICAgWVlGUFJJTlRGIEFyZ3M7CQkJCVwKLX0gd2hpbGUgKDApCi0vKiBOb256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlLiAgSXQgaXMgbGVmdCB1bmluaXRpYWxpemVkIHNvIHRoYXQKLSAgIG11bHRpcGxlIHBhcnNlcnMgY2FuIGNvZXhpc3QuICAqLwotaW50IHl5ZGVidWc7Ci0jZWxzZSAvKiAhWVlERUJVRyAqLwotIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCi0jZW5kaWYgLyogIVlZREVCVUcgKi8KLQotLyogWVlJTklUREVQVEggLS0gaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MuICAqLwotI2lmbmRlZglZWUlOSVRERVBUSAotIyBkZWZpbmUgWVlJTklUREVQVEggMjAwCi0jZW5kaWYKLQotLyogWVlNQVhERVBUSCAtLSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0byAoZWZmZWN0aXZlIG9ubHkKLSAgIGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLgotCi0gICBEbyBub3QgbWFrZSB0aGlzIHZhbHVlIHRvbyBsYXJnZTsgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpZgotICAgU0laRV9NQVggPCBZWVNUQUNLX0JZVEVTIChZWU1BWERFUFRIKQotICAgZXZhbHVhdGVkIHdpdGggaW5maW5pdGUtcHJlY2lzaW9uIGludGVnZXIgYXJpdGhtZXRpYy4gICovCi0KLSNpZiBZWU1BWERFUFRIID09IDAKLSMgdW5kZWYgWVlNQVhERVBUSAotI2VuZGlmCi0KLSNpZm5kZWYgWVlNQVhERVBUSAotIyBkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAotI2VuZGlmCi0MCi0jaWZkZWYgWVlFUlJPUl9WRVJCT1NFCi0KLSMgaWZuZGVmIHl5c3RybGVuCi0jICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkKLSMgICBkZWZpbmUgeXlzdHJsZW4gc3RybGVuCi0jICBlbHNlCi0vKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBZWVNUUi4gICovCi1zdGF0aWMgWVlTSVpFX1QKLSMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi15eXN0cmxlbiAoY29uc3QgY2hhciAqeXlzdHIpCi0jICAgZWxzZQoteXlzdHJsZW4gKHl5c3RyKQotICAgICBjb25zdCBjaGFyICp5eXN0cjsKLSMgICBlbmRpZgotewotICByZWdpc3RlciBjb25zdCBjaGFyICp5eXMgPSB5eXN0cjsKLQotICB3aGlsZSAoKnl5cysrICE9ICdcMCcpCi0gICAgY29udGludWU7Ci0KLSAgcmV0dXJuIHl5cyAtIHl5c3RyIC0gMTsKLX0KLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSMgaWZuZGVmIHl5c3RwY3B5Ci0jICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkgJiYgZGVmaW5lZCAoX0dOVV9TT1VSQ0UpCi0jICAgZGVmaW5lIHl5c3RwY3B5IHN0cGNweQotIyAgZWxzZQotLyogQ29weSBZWVNSQyB0byBZWURFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbgotICAgWVlERVNULiAgKi8KLXN0YXRpYyBjaGFyICoKLSMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCi15eXN0cGNweSAoY2hhciAqeXlkZXN0LCBjb25zdCBjaGFyICp5eXNyYykKLSMgICBlbHNlCi15eXN0cGNweSAoeXlkZXN0LCB5eXNyYykKLSAgICAgY2hhciAqeXlkZXN0OwotICAgICBjb25zdCBjaGFyICp5eXNyYzsKLSMgICBlbmRpZgotewotICByZWdpc3RlciBjaGFyICp5eWQgPSB5eWRlc3Q7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOwotCi0gIHdoaWxlICgoKnl5ZCsrID0gKnl5cysrKSAhPSAnXDAnKQotICAgIGNvbnRpbnVlOwotCi0gIHJldHVybiB5eWQgLSAxOwotfQotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotDAotI2xpbmUgMzE1ICIvdXNyL2xvY2FsL3NoYXJlL2Jpc29uL2Jpc29uLnNpbXBsZSIKLQotCi0vKiBUaGUgdXNlciBjYW4gZGVmaW5lIFlZUEFSU0VfUEFSQU0gYXMgdGhlIG5hbWUgb2YgYW4gYXJndW1lbnQgdG8gYmUgcGFzc2VkCi0gICBpbnRvIHl5cGFyc2UuICBUaGUgYXJndW1lbnQgc2hvdWxkIGhhdmUgdHlwZSB2b2lkICouCi0gICBJdCBzaG91bGQgYWN0dWFsbHkgcG9pbnQgdG8gYW4gb2JqZWN0LgotICAgR3JhbW1hciBhY3Rpb25zIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlIGJ5IGNhc3RpbmcgaXQKLSAgIHRvIHRoZSBwcm9wZXIgcG9pbnRlciB0eXBlLiAgKi8KLQotI2lmZGVmIFlZUEFSU0VfUEFSQU0KLSMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQotIyAgZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KLSMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSMgZWxzZQotIyAgZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIFlZUEFSU0VfUEFSQU0KLSMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKLSMgZW5kaWYKLSNlbHNlIC8qICFZWVBBUlNFX1BBUkFNICovCi0jIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRwotIyBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZW5kaWYgLyogIVlZUEFSU0VfUEFSQU0gKi8KLQotLyogUHJldmVudCB3YXJuaW5nIGlmIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jIGlmZGVmIFlZUEFSU0VfUEFSQU0KLWludCB5eXBhcnNlICh2b2lkICopOwotIyBlbHNlCi1pbnQgeXlwYXJzZSAodm9pZCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotLyogWVlfREVDTF9WQVJJQUJMRVMgLS0gZGVwZW5kaW5nIHdoZXRoZXIgd2UgdXNlIGEgcHVyZSBwYXJzZXIsCi0gICB2YXJpYWJsZXMgYXJlIGdsb2JhbCwgb3IgbG9jYWwgdG8gWVlQQVJTRS4gICovCi0KLSNkZWZpbmUgWVlfREVDTF9OT05fTFNQX1ZBUklBQkxFUwkJCVwKLS8qIFRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8JCQkJXAotaW50IHl5Y2hhcjsJCQkJCQlcCi0JCQkJCQkJXAotLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAqLwlcCi1ZWVNUWVBFIHl5bHZhbDsJCQkJCQlcCi0JCQkJCQkJXAotLyogTnVtYmVyIG9mIHBhcnNlIGVycm9ycyBzbyBmYXIuICAqLwkJCVwKLWludCB5eW5lcnJzOwotCi0jaWYgWVlMU1BfTkVFREVECi0jIGRlZmluZSBZWV9ERUNMX1ZBUklBQkxFUwkJCVwKLVlZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMJCQlcCi0JCQkJCQlcCi0vKiBMb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9va2FoZWFkIHN5bWJvbC4gICovCVwKLVlZTFRZUEUgeXlsbG9jOwotI2Vsc2UKLSMgZGVmaW5lIFlZX0RFQ0xfVkFSSUFCTEVTCQkJXAotWVlfREVDTF9OT05fTFNQX1ZBUklBQkxFUwotI2VuZGlmCi0KLQotLyogSWYgbm9ucmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUuICovCi0KLSNpZiAhWVlQVVJFCi1ZWV9ERUNMX1ZBUklBQkxFUwotI2VuZGlmICAvKiAhWVlQVVJFICovCi0KLWludAoteXlwYXJzZSAoWVlQQVJTRV9QQVJBTV9BUkcpCi0gICAgIFlZUEFSU0VfUEFSQU1fREVDTAotewotICAvKiBJZiByZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZS4gKi8KLSNpZiBZWVBVUkUKLSAgWVlfREVDTF9WQVJJQUJMRVMKLSNlbmRpZiAgLyogIVlZUFVSRSAqLwotCi0gIHJlZ2lzdGVyIGludCB5eXN0YXRlOwotICByZWdpc3RlciBpbnQgeXluOwotICBpbnQgeXlyZXN1bHQ7Ci0gIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLwotICBpbnQgeXllcnJzdGF0dXM7Ci0gIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KLSAgaW50IHl5Y2hhcjEgPSAwOwotCi0gIC8qIFRocmVlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6Ci0gICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMsCi0gICAgIGB5eXZzJzogcmVsYXRlZCB0byBzZW1hbnRpYyB2YWx1ZXMsCi0gICAgIGB5eWxzJzogcmVsYXRlZCB0byBsb2NhdGlvbnMuCi0KLSAgICAgUmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzLCB0byBhbGxvdyB5eW92ZXJmbG93Ci0gICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLwotCi0gIC8qIFRoZSBzdGF0ZSBzdGFjay4gKi8KLSAgc2hvcnQJeXlzc2FbWVlJTklUREVQVEhdOwotICBzaG9ydCAqeXlzcyA9IHl5c3NhOwotICByZWdpc3RlciBzaG9ydCAqeXlzc3A7Ci0KLSAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KLSAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07Ci0gIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsKLSAgcmVnaXN0ZXIgWVlTVFlQRSAqeXl2c3A7Ci0KLSNpZiBZWUxTUF9ORUVERUQKLSAgLyogVGhlIGxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgWVlMVFlQRSB5eWxzYVtZWUlOSVRERVBUSF07Ci0gIFlZTFRZUEUgKnl5bHMgPSB5eWxzYTsKLSAgWVlMVFlQRSAqeXlsc3A7Ci0jZW5kaWYKLQotI2lmIFlZTFNQX05FRURFRAotIyBkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tLCB5eWxzcC0tKQotI2Vsc2UKLSMgZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKLSNlbmRpZgotCi0gIFlZU0laRV9UIHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7Ci0KLQotICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQotICAgICBhY3Rpb24gcm91dGluZXMuICAqLwotICBZWVNUWVBFIHl5dmFsOwotI2lmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bG9jOwotI2VuZGlmCi0KLSAgLyogV2hlbiByZWR1Y2luZywgdGhlIG51bWJlciBvZiBzeW1ib2xzIG9uIHRoZSBSSFMgb2YgdGhlIHJlZHVjZWQKLSAgICAgcnVsZS4gKi8KLSAgaW50IHl5bGVuOwotCi0gIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7Ci0KLSAgeXlzdGF0ZSA9IDA7Ci0gIHl5ZXJyc3RhdHVzID0gMDsKLSAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotCi0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCi0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQotICB5eXNzcCA9IHl5c3M7Ci0gIHl5dnNwID0geXl2czsKLSNpZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgPSB5eWxzOwotI2VuZGlmCi0gIGdvdG8geXlzZXRzdGF0ZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5bmV3c3RhdGUgLS0gUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4geXlzdGF0ZS4gIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotIHl5bmV3c3RhdGU6Ci0gIC8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCi0gICAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gc28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4KLSAgICAgKi8KLSAgeXlzc3ArKzsKLQotIHl5c2V0c3RhdGU6Ci0gICp5eXNzcCA9IHl5c3RhdGU7Ci0KLSAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0gICAgewotICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCi0gICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOwotCi0jaWZkZWYgeXlvdmVyZmxvdwotICAgICAgewotCS8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjay4gVXNlIGNvcGllcyBvZgotCSAgIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8KLQkgICBtZW1vcnkuICAqLwotCVlZU1RZUEUgKnl5dnMxID0geXl2czsKLQlzaG9ydCAqeXlzczEgPSB5eXNzOwotCi0JLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCi0JICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICAqLwotIyBpZiBZWUxTUF9ORUVERUQKLQlZWUxUWVBFICp5eWxzMSA9IHl5bHM7Ci0JLyogVGhpcyB1c2VkIHRvIGJlIGEgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLAotCSAgIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLwotCXl5b3ZlcmZsb3cgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICAgICZ5eWxzMSwgeXlzaXplICogc2l6ZW9mICgqeXlsc3ApLAotCQkgICAgJnl5c3RhY2tzaXplKTsKLQl5eWxzID0geXlsczE7Ci0jIGVsc2UKLQl5eW92ZXJmbG93ICgicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAgICAmeXlzdGFja3NpemUpOwotIyBlbmRpZgotCXl5c3MgPSB5eXNzMTsKLQl5eXZzID0geXl2czE7Ci0gICAgICB9Ci0jZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCi0jIGlmbmRlZiBZWVNUQUNLX1JFTE9DQVRFCi0gICAgICBnb3RvIHl5b3ZlcmZsb3dsYWI7Ci0jIGVsc2UKLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCi0JZ290byB5eW92ZXJmbG93bGFiOwotICAgICAgeXlzdGFja3NpemUgKj0gMjsKLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+IFlZTUFYREVQVEgpCi0JeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwotCi0gICAgICB7Ci0Jc2hvcnQgKnl5c3MxID0geXlzczsKLQl1bmlvbiB5eWFsbG9jICp5eXB0ciA9Ci0JICAodW5pb24geXlhbGxvYyAqKSBZWVNUQUNLX0FMTE9DIChZWVNUQUNLX0JZVEVTICh5eXN0YWNrc2l6ZSkpOwotCWlmICghIHl5cHRyKQotCSAgZ290byB5eW92ZXJmbG93bGFiOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3MpOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnMpOwotIyBpZiBZWUxTUF9ORUVERUQKLQlZWVNUQUNLX1JFTE9DQVRFICh5eWxzKTsKLSMgZW5kaWYKLSMgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQotCWlmICh5eXNzMSAhPSB5eXNzYSkKLQkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOwotICAgICAgfQotIyBlbmRpZgotI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLQotICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKLSAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7Ci0jaWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzcCA9IHl5bHMgKyB5eXNpemUgLSAxOwotI2VuZGlmCi0KLSAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVsdVxuIiwKLQkJICAodW5zaWduZWQgbG9uZyBpbnQpIHl5c3RhY2tzaXplKSk7Ci0KLSAgICAgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotCVlZQUJPUlQ7Ci0gICAgfQotCi0gIFlZRFBSSU5URiAoKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKSk7Ci0KLSAgZ290byB5eWJhY2t1cDsKLQotCi0vKi0tLS0tLS0tLS0tLgotfCB5eWJhY2t1cC4gIHwKLWAtLS0tLS0tLS0tLSovCi15eWJhY2t1cDoKLQotLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCi0vKiBSZWFkIGEgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLS8qIHl5cmVzdW1lOiAqLwotCi0gIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLQotICAvKiB5eWNoYXIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0YKLSAgICAgb3IgYSB2YWxpZCB0b2tlbiBpbiBleHRlcm5hbCBmb3JtLiAgKi8KLQotICBpZiAoeXljaGFyID09IFlZRU1QVFkpCi0gICAgewotICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7Ci0gICAgICB5eWNoYXIgPSBZWUxFWDsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0b2tlbiB0byBpbnRlcm5hbCBmb3JtIChpbiB5eWNoYXIxKSBmb3IgaW5kZXhpbmcgdGFibGVzIHdpdGggKi8KLQotICBpZiAoeXljaGFyIDw9IDApCQkvKiBUaGlzIG1lYW5zIGVuZCBvZiBpbnB1dC4gKi8KLSAgICB7Ci0gICAgICB5eWNoYXIxID0gMDsKLSAgICAgIHl5Y2hhciA9IFlZRU9GOwkJLyogRG9uJ3QgY2FsbCBZWUxFWCBhbnkgbW9yZSAqLwotCi0gICAgICBZWURQUklOVEYgKChzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKLQotI2lmIFlZREVCVUcKLSAgICAgLyogV2UgaGF2ZSB0byBrZWVwIHRoaXMgYCNpZiBZWURFQlVHJywgc2luY2Ugd2UgdXNlIHZhcmlhYmxlcwotCXdoaWNoIGFyZSBkZWZpbmVkIG9ubHkgaWYgYFlZREVCVUcnIGlzIHNldC4gICovCi0gICAgICBpZiAoeXlkZWJ1ZykKLQl7Ci0JICBZWUZQUklOVEYgKHN0ZGVyciwgIk5leHQgdG9rZW4gaXMgJWQgKCVzIiwKLQkJICAgICB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UKLQkgICAgIG1lYW5pbmcgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLwotIyBpZmRlZiBZWVBSSU5UCi0JICBZWVBSSU5UIChzdGRlcnIsIHl5Y2hhciwgeXlsdmFsKTsKLSMgZW5kaWYKLQkgIFlZRlBSSU5URiAoc3RkZXJyLCAiKVxuIik7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gIHl5biArPSB5eWNoYXIxOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IHl5Y2hhcjEpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotCi0gIC8qIHl5biBpcyB3aGF0IHRvIGRvIGZvciB0aGlzIHRva2VuIHR5cGUgaW4gdGhpcyBzdGF0ZS4KLSAgICAgTmVnYXRpdmUgPT4gcmVkdWNlLCAteXluIGlzIHJ1bGUgbnVtYmVyLgotICAgICBQb3NpdGl2ZSA9PiBzaGlmdCwgeXluIGlzIG5ldyBzdGF0ZS4KLSAgICAgICBOZXcgc3RhdGUgaXMgZmluYWwgc3RhdGUgPT4gZG9uJ3QgYm90aGVyIHRvIHNoaWZ0LAotICAgICAgIGp1c3QgcmV0dXJuIHN1Y2Nlc3MuCi0gICAgIDAsIG9yIG1vc3QgbmVnYXRpdmUgbnVtYmVyID0+IGVycm9yLiAgKi8KLQotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJybGFiOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KLSAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwKLQkgICAgICB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pKTsKLQotICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLwotICBpZiAoeXljaGFyICE9IFlZRU9GKQotICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgLyogQ291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvcgotICAgICBzdGF0dXMuICAqLwotICBpZiAoeXllcnJzdGF0dXMpCi0gICAgeXllcnJzdGF0dXMtLTsKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXlkZWZhdWx0IC0tIGRvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXlkZWZhdWx0OgotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0gIGdvdG8geXlyZWR1Y2U7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXlyZWR1Y2UgLS0gRG8gYSByZWR1Y3Rpb24uICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXlyZWR1Y2U6Ci0gIC8qIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCi0gIHl5bGVuID0geXlyMlt5eW5dOwotCi0gIC8qIElmIFlZTEVOIGlzIG5vbnplcm8sIGltcGxlbWVudCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uOgotICAgICBgJCQgPSAkMScuCi0KLSAgICAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyBZWVZBTCB0byB0aGUgc2VtYW50aWMgdmFsdWUgb2YKLSAgICAgdGhlIGxvb2thaGVhZCB0b2tlbi4gIFRoaXMgYmVoYXZpb3IgaXMgdW5kb2N1bWVudGVkIGFuZCBCaXNvbgotICAgICB1c2VycyBzaG91bGQgbm90IHJlbHkgdXBvbiBpdC4gIEFzc2lnbmluZyB0byBZWVZBTAotICAgICB1bmNvbmRpdGlvbmFsbHkgbWFrZXMgdGhlIHBhcnNlciBhIGJpdCBzbWFsbGVyLCBhbmQgaXQgYXZvaWRzIGEKLSAgICAgR0NDIHdhcm5pbmcgdGhhdCBZWVZBTCBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkLiAgKi8KLSAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsKLQotI2lmIFlZTFNQX05FRURFRAotICAvKiBTaW1pbGFybHkgZm9yIHRoZSBkZWZhdWx0IGxvY2F0aW9uLiAgTGV0IHRoZSB1c2VyIHJ1biBhZGRpdGlvbmFsCi0gICAgIGNvbW1hbmRzIGlmIGZvciBpbnN0YW5jZSBsb2NhdGlvbnMgYXJlIHJhbmdlcy4gICovCi0gIHl5bG9jID0geXlsc3BbMS15eWxlbl07Ci0gIFlZTExPQ19ERUZBVUxUICh5eWxvYywgKHl5bHNwIC0geXlsZW4pLCB5eWxlbik7Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcKLSAgLyogV2UgaGF2ZSB0byBrZWVwIHRoaXMgYCNpZiBZWURFQlVHJywgc2luY2Ugd2UgdXNlIHZhcmlhYmxlcyB3aGljaAotICAgICBhcmUgZGVmaW5lZCBvbmx5IGlmIGBZWURFQlVHJyBpcyBzZXQuICAqLwotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBpbnQgeXlpOwotCi0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlJlZHVjaW5nIHZpYSBydWxlICVkIChsaW5lICVkKSwgIiwKLQkJIHl5biwgeXlybGluZVt5eW5dKTsKLQotICAgICAgLyogUHJpbnQgdGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZCwgYW5kIHRoZWlyIHJlc3VsdC4gICovCi0gICAgICBmb3IgKHl5aSA9IHl5cHJoc1t5eW5dOyB5eXJoc1t5eWldID4gMDsgeXlpKyspCi0JWVlGUFJJTlRGIChzdGRlcnIsICIlcyAiLCB5eXRuYW1lW3l5cmhzW3l5aV1dKTsKLSAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiIC0+ICVzXG4iLCB5eXRuYW1lW3l5cjFbeXluXV0pOwotICAgIH0KLSNlbmRpZgotCi0gIHN3aXRjaCAoeXluKSB7Ci0KLWNhc2UgMToKLSNsaW5lIDE1MSAicGx1cmFsLnkiCi17Ci0JICAgIGlmICh5eXZzcFswXS5leHAgPT0gTlVMTCkKLQkgICAgICBZWUFCT1JUOwotCSAgICAoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPnJlcyA9IHl5dnNwWzBdLmV4cDsKLQkgIH0KLSAgICBicmVhazsKLWNhc2UgMjoKLSNsaW5lIDE1OSAicGx1cmFsLnkiCi17Ci0JICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMyAocW1vcCwgeXl2c3BbLTRdLmV4cCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKLQkgIH0KLSAgICBicmVhazsKLWNhc2UgMzoKLSNsaW5lIDE2MyAicGx1cmFsLnkiCi17Ci0JICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAobG9yLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOwotCSAgfQotICAgIGJyZWFrOwotY2FzZSA0OgotI2xpbmUgMTY3ICJwbHVyYWwueSIKLXsKLQkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yIChsYW5kLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOwotCSAgfQotICAgIGJyZWFrOwotY2FzZSA1OgotI2xpbmUgMTcxICJwbHVyYWwueSIKLXsKLQkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yICh5eXZzcFstMV0ub3AsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7Ci0JICB9Ci0gICAgYnJlYWs7Ci1jYXNlIDY6Ci0jbGluZSAxNzUgInBsdXJhbC55IgotewotCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKHl5dnNwWy0xXS5vcCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKLQkgIH0KLSAgICBicmVhazsKLWNhc2UgNzoKLSNsaW5lIDE3OSAicGx1cmFsLnkiCi17Ci0JICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOwotCSAgfQotICAgIGJyZWFrOwotY2FzZSA4OgotI2xpbmUgMTgzICJwbHVyYWwueSIKLXsKLQkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yICh5eXZzcFstMV0ub3AsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7Ci0JICB9Ci0gICAgYnJlYWs7Ci1jYXNlIDk6Ci0jbGluZSAxODcgInBsdXJhbC55IgotewotCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzEgKGxub3QsIHl5dnNwWzBdLmV4cCk7Ci0JICB9Ci0gICAgYnJlYWs7Ci1jYXNlIDEwOgotI2xpbmUgMTkxICJwbHVyYWwueSIKLXsKLQkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8wICh2YXIpOwotCSAgfQotICAgIGJyZWFrOwotY2FzZSAxMToKLSNsaW5lIDE5NSAicGx1cmFsLnkiCi17Ci0JICAgIGlmICgoeXl2YWwuZXhwID0gbmV3X2V4cF8wIChudW0pKSAhPSBOVUxMKQotCSAgICAgIHl5dmFsLmV4cC0+dmFsLm51bSA9IHl5dnNwWzBdLm51bTsKLQkgIH0KLSAgICBicmVhazsKLWNhc2UgMTI6Ci0jbGluZSAyMDAgInBsdXJhbC55IgotewotCSAgICB5eXZhbC5leHAgPSB5eXZzcFstMV0uZXhwOwotCSAgfQotICAgIGJyZWFrOwotfQotCi0jbGluZSA3MDUgIi91c3IvbG9jYWwvc2hhcmUvYmlzb24vYmlzb24uc2ltcGxlIgotCi0MCi0gIHl5dnNwIC09IHl5bGVuOwotICB5eXNzcCAtPSB5eWxlbjsKLSNpZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgLT0geXlsZW47Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnl5c3NwMSA9IHl5c3MgLSAxOwotICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlICh5eXNzcDEgIT0geXlzc3ApCi0JWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCAqKyt5eXNzcDEpOwotICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi0gICorK3l5dnNwID0geXl2YWw7Ci0jaWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsb2M7Ci0jZW5kaWYKLQotICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQotICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKLSAgICAgbnVtYmVyIHJlZHVjZWQgYnkuICAqLwotCi0gIHl5biA9IHl5cjFbeXluXTsKLQotICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UQkFTRV0gKyAqeXlzc3A7Ci0gIGlmICh5eXN0YXRlID49IDAgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCi0gICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07Ci0gIGVsc2UKLSAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRCQVNFXTsKLQotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXllcnJsYWI6Ci0gIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwotICBpZiAoIXl5ZXJyc3RhdHVzKQotICAgIHsKLSAgICAgICsreXluZXJyczsKLQotI2lmZGVmIFlZRVJST1JfVkVSQk9TRQotICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotCi0gICAgICBpZiAoeXluID4gWVlGTEFHICYmIHl5biA8IFlZTEFTVCkKLQl7Ci0JICBZWVNJWkVfVCB5eXNpemUgPSAwOwotCSAgY2hhciAqeXltc2c7Ci0JICBpbnQgeXl4LCB5eWNvdW50OwotCi0JICB5eWNvdW50ID0gMDsKLQkgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KLQkgICAgIFlZQ0hFQ0suICAqLwotCSAgZm9yICh5eXggPSB5eW4gPCAwID8gLXl5biA6IDA7Ci0JICAgICAgIHl5eCA8IChpbnQpIChzaXplb2YgKHl5dG5hbWUpIC8gc2l6ZW9mIChjaGFyICopKTsgeXl4KyspCi0JICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4KQotCSAgICAgIHl5c2l6ZSArPSB5eXN0cmxlbiAoeXl0bmFtZVt5eXhdKSArIDE1LCB5eWNvdW50Kys7Ci0JICB5eXNpemUgKz0geXlzdHJsZW4gKCJwYXJzZSBlcnJvciwgdW5leHBlY3RlZCAiKSArIDE7Ci0JICB5eXNpemUgKz0geXlzdHJsZW4gKHl5dG5hbWVbWVlUUkFOU0xBVEUgKHl5Y2hhcildKTsKLQkgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlzaXplKTsKLQkgIGlmICh5eW1zZyAhPSAwKQotCSAgICB7Ci0JICAgICAgY2hhciAqeXlwID0geXlzdHBjcHkgKHl5bXNnLCAicGFyc2UgZXJyb3IsIHVuZXhwZWN0ZWQgIik7Ci0JICAgICAgeXlwID0geXlzdHBjcHkgKHl5cCwgeXl0bmFtZVtZWVRSQU5TTEFURSAoeXljaGFyKV0pOwotCi0JICAgICAgaWYgKHl5Y291bnQgPCA1KQotCQl7Ci0JCSAgeXljb3VudCA9IDA7Ci0JCSAgZm9yICh5eXggPSB5eW4gPCAwID8gLXl5biA6IDA7Ci0JCSAgICAgICB5eXggPCAoaW50KSAoc2l6ZW9mICh5eXRuYW1lKSAvIHNpemVvZiAoY2hhciAqKSk7Ci0JCSAgICAgICB5eXgrKykKLQkJICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4KQotCQkgICAgICB7Ci0JCQljb25zdCBjaGFyICp5eXEgPSAhIHl5Y291bnQgPyAiLCBleHBlY3RpbmcgIiA6ICIgb3IgIjsKLQkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5cSk7Ci0JCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5eF0pOwotCQkJeXljb3VudCsrOwotCQkgICAgICB9Ci0JCX0KLQkgICAgICB5eWVycm9yICh5eW1zZyk7Ci0JICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgeXllcnJvciAoInBhcnNlIGVycm9yOyBhbHNvIHZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpICovCi0JeXllcnJvciAoInBhcnNlIGVycm9yIik7Ci0gICAgfQotICBnb3RvIHl5ZXJybGFiMTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWVycmxhYjEgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWVycmxhYjE6Ci0gIGlmICh5eWVycnN0YXR1cyA9PSAzKQotICAgIHsKLSAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KLQkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLwotCi0gICAgICAvKiByZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQgKi8KLSAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCi0JWVlBQk9SVDsKLSAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIkRpc2NhcmRpbmcgdG9rZW4gJWQgKCVzKS5cbiIsCi0JCSAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKSk7Ci0gICAgICB5eWNoYXIgPSBZWUVNUFRZOwotICAgIH0KLQotICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKLSAgICAgdG9rZW4uICAqLwotCi0gIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLwotCi0gIGdvdG8geXllcnJoYW5kbGU7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWVycmRlZmF1bHQgLS0gY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGUgfAotfCBlcnJvciB0b2tlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXllcnJkZWZhdWx0OgotI2lmIDAKLSAgLyogVGhpcyBpcyB3cm9uZzsgb25seSBzdGF0ZXMgdGhhdCBleHBsaWNpdGx5IHdhbnQgZXJyb3IgdG9rZW5zCi0gICAgIHNob3VsZCBzaGlmdCB0aGVtLiAgKi8KLQotICAvKiBJZiBpdHMgZGVmYXVsdCBpcyB0byBhY2NlcHQgYW55IHRva2VuLCBvay4gIE90aGVyd2lzZSBwb3AgaXQuICAqLwotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5bikKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLSNlbmRpZgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWVycnBvcCAtLSBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSB8Ci18IGVycm9yIHRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXllcnJwb3A6Ci0gIGlmICh5eXNzcCA9PSB5eXNzKQotICAgIFlZQUJPUlQ7Ci0gIHl5dnNwLS07Ci0gIHl5c3RhdGUgPSAqLS15eXNzcDsKLSNpZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AtLTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRwotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqeXlzc3AxID0geXlzcyAtIDE7Ci0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIkVycm9yOiBzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlICh5eXNzcDEgIT0geXlzc3ApCi0JWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCAqKyt5eXNzcDEpOwotICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLgotfCB5eWVycmhhbmRsZS4gIHwKLWAtLS0tLS0tLS0tLS0tLSovCi15eWVycmhhbmRsZToKLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gKz0gWVlURVJST1I7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0gWVlURVJST1IpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJycG9wOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJycG9wOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotICBZWURQUklOVEYgKChzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIikpOwotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5YWNjZXB0bGFiIC0tIFlZQUNDRVBUIGNvbWVzIGhlcmUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWFjY2VwdGxhYjoKLSAgeXlyZXN1bHQgPSAwOwotICBnb3RvIHl5cmV0dXJuOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWFib3J0bGFiIC0tIFlZQUJPUlQgY29tZXMgaGVyZS4gIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWFib3J0bGFiOgotICB5eXJlc3VsdCA9IDE7Ci0gIGdvdG8geXlyZXR1cm47Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eW92ZXJmbG93YWIgLS0gcGFyc2VyIG92ZXJmbG93IGNvbWVzIGhlcmUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXl5b3ZlcmZsb3dsYWI6Ci0gIHl5ZXJyb3IgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKLSAgeXlyZXN1bHQgPSAyOwotICAvKiBGYWxsIHRocm91Z2guICAqLwotCi15eXJldHVybjoKLSNpZm5kZWYgeXlvdmVyZmxvdwotICBpZiAoeXlzcyAhPSB5eXNzYSkKLSAgICBZWVNUQUNLX0ZSRUUgKHl5c3MpOwotI2VuZGlmCi0gIHJldHVybiB5eXJlc3VsdDsKLX0KLSNsaW5lIDIwNSAicGx1cmFsLnkiCi0KLQotdm9pZAotaW50ZXJuYWxfZnVuY3Rpb24KLUZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKLXsKLSAgaWYgKGV4cCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBIYW5kbGUgdGhlIHJlY3Vyc2l2ZSBjYXNlLiAgKi8KLSAgc3dpdGNoIChleHAtPm5hcmdzKQotICAgIHsKLSAgICBjYXNlIDM6Ci0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMl0pOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIDI6Ci0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMV0pOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIDE6Ci0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMF0pOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZyZWUgKGV4cCk7Ci19Ci0KLQotc3RhdGljIGludAoteXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKQotewotICBjb25zdCBjaGFyICpleHAgPSAqcGV4cDsKLSAgaW50IHJlc3VsdDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoZXhwWzBdID09ICdcMCcpCi0JewotCSAgKnBleHAgPSBleHA7Ci0JICByZXR1cm4gWVlFT0Y7Ci0JfQotCi0gICAgICBpZiAoZXhwWzBdICE9ICcgJyAmJiBleHBbMF0gIT0gJ1x0JykKLQlicmVhazsKLQotICAgICAgKytleHA7Ci0gICAgfQotCi0gIHJlc3VsdCA9ICpleHArKzsKLSAgc3dpdGNoIChyZXN1bHQpCi0gICAgewotICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBpbnQgbiA9IHJlc3VsdCAtICcwJzsKLQl3aGlsZSAoZXhwWzBdID49ICcwJyAmJiBleHBbMF0gPD0gJzknKQotCSAgewotCSAgICBuICo9IDEwOwotCSAgICBuICs9IGV4cFswXSAtICcwJzsKLQkgICAgKytleHA7Ci0JICB9Ci0JbHZhbC0+bnVtID0gbjsKLQlyZXN1bHQgPSBOVU1CRVI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJz0nOgotICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0JewotCSAgKytleHA7Ci0JICBsdmFsLT5vcCA9IGVxdWFsOwotCSAgcmVzdWx0ID0gRVFVT1AyOwotCX0KLSAgICAgIGVsc2UKLQlyZXN1bHQgPSBZWUVSUkNPREU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyEnOgotICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0JewotCSAgKytleHA7Ci0JICBsdmFsLT5vcCA9IG5vdF9lcXVhbDsKLQkgIHJlc3VsdCA9IEVRVU9QMjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ3wnOgotICAgICAgaWYgKGV4cFswXSA9PSByZXN1bHQpCi0JKytleHA7Ci0gICAgICBlbHNlCi0JcmVzdWx0ID0gWVlFUlJDT0RFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc8JzoKLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotCXsKLQkgICsrZXhwOwotCSAgbHZhbC0+b3AgPSBsZXNzX29yX2VxdWFsOwotCX0KLSAgICAgIGVsc2UKLQlsdmFsLT5vcCA9IGxlc3NfdGhhbjsKLSAgICAgIHJlc3VsdCA9IENNUE9QMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPic6Ci0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLQl7Ci0JICArK2V4cDsKLQkgIGx2YWwtPm9wID0gZ3JlYXRlcl9vcl9lcXVhbDsKLQl9Ci0gICAgICBlbHNlCi0JbHZhbC0+b3AgPSBncmVhdGVyX3RoYW47Ci0gICAgICByZXN1bHQgPSBDTVBPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyonOgotICAgICAgbHZhbC0+b3AgPSBtdWx0OwotICAgICAgcmVzdWx0ID0gTVVMT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcvJzoKLSAgICAgIGx2YWwtPm9wID0gZGl2aWRlOwotICAgICAgcmVzdWx0ID0gTVVMT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICclJzoKLSAgICAgIGx2YWwtPm9wID0gbW9kdWxlOwotICAgICAgcmVzdWx0ID0gTVVMT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcrJzoKLSAgICAgIGx2YWwtPm9wID0gcGx1czsKLSAgICAgIHJlc3VsdCA9IEFERE9QMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICBsdmFsLT5vcCA9IG1pbnVzOwotICAgICAgcmVzdWx0ID0gQURET1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICduJzoKLSAgICBjYXNlICc/JzoKLSAgICBjYXNlICc6JzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgIC8qIE5vdGhpbmcsIGp1c3QgcmV0dXJuIHRoZSBjaGFyYWN0ZXIuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc7JzoKLSAgICBjYXNlICdcbic6Ci0gICAgY2FzZSAnXDAnOgotICAgICAgLyogQmUgc2FmZSBhbmQgbGV0IHRoZSB1c2VyIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2Fpbi4gICovCi0gICAgICAtLWV4cDsKLSAgICAgIHJlc3VsdCA9IFlZRU9GOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmVzdWx0ID0gWVlFUlJDT0RFOwotI2lmIFlZREVCVUcgIT0gMAotICAgICAgLS1leHA7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAqcGV4cCA9IGV4cDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyB2b2lkCi15eWVycm9yIChjb25zdCBjaGFyICpzdHIpCi17Ci0gIC8qIERvIG5vdGhpbmcuICBXZSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlLiAgKi8KLX0KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wbHVyYWwueSBiL3VuaXgvaW50bC9wbHVyYWwueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzM2JkNy4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvcGx1cmFsLnkKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotJXsKLS8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotLyogVGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzZXIgdXNlcyBhbGxvY2EuICBBSVggMyBmb3JjZXMgdXMgdG8gcHV0IHRoaXMKLSAgIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4gYmlzb24ncwotICAgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+Ci0gICBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUgYXJiaXRyYXJ5IHN5c3RlbSBoZWFkZXJzLiAgKi8KLSNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCi0KLS8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKLSAgIGJ1dCB3ZSB3YW50IGl0IHRvIGJlIGNhbGxlZCBQTFVSQUxfUEFSU0UuICAqLwotI2lmbmRlZiBfTElCQwotIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCi0jZW5kaWYKLQotI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAotI2RlZmluZSBZWVBBUlNFX1BBUkFNCWFyZwotJX0KLSVwdXJlX3BhcnNlcgotJWV4cGVjdCA3Ci0KLSV1bmlvbiB7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IG51bTsKLSAgZW51bSBvcGVyYXRvciBvcDsKLSAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKLX0KLQotJXsKLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgaW50IHl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCk7Ci1zdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOwotCi0vKiBBbGxvY2F0aW9uIG9mIGV4cHJlc3Npb25zLiAgKi8KLQotc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKLW5ld19leHAgKGludCBuYXJncywgZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOwotCi0gIC8qIElmIGFueSBvZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIG1hbGxvYydlZCwganVzdCByZXR1cm4gTlVMTC4gICovCi0gIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKLSAgICAgIGdvdG8gZmFpbDsKLQotICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KLSAgbmV3cCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsKLSAgaWYgKG5ld3AgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBuZXdwLT5uYXJncyA9IG5hcmdzOwotICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7Ci0gICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotCW5ld3AtPnZhbC5hcmdzW2ldID0gYXJnc1tpXTsKLSAgICAgIHJldHVybiBuZXdwOwotICAgIH0KLQotIGZhaWw6Ci0gIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgRlJFRV9FWFBSRVNTSU9OIChhcmdzW2ldKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwXzAgKGVudW0gb3BlcmF0b3Igb3ApCi17Ci0gIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotbmV3X2V4cF8xIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCi17Ci0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzFdOwotCi0gIGFyZ3NbMF0gPSByaWdodDsKLSAgcmV0dXJuIG5ld19leHAgKDEsIG9wLCBhcmdzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKLW5ld19leHBfMiAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmxlZnQsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKLXsKLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07Ci0KLSAgYXJnc1swXSA9IGxlZnQ7Ci0gIGFyZ3NbMV0gPSByaWdodDsKLSAgcmV0dXJuIG5ld19leHAgKDIsIG9wLCBhcmdzKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwXzMgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpiZXhwLAotCSAgIHN0cnVjdCBleHByZXNzaW9uICp0YnJhbmNoLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZmJyYW5jaCkKLXsKLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107Ci0KLSAgYXJnc1swXSA9IGJleHA7Ci0gIGFyZ3NbMV0gPSB0YnJhbmNoOwotICBhcmdzWzJdID0gZmJyYW5jaDsKLSAgcmV0dXJuIG5ld19leHAgKDMsIG9wLCBhcmdzKTsKLX0KLQotJX0KLQotLyogVGhpcyBkZWNsYXJlcyB0aGF0IGFsbCBvcGVyYXRvcnMgaGF2ZSB0aGUgc2FtZSBhc3NvY2lhdGl2aXR5IGFuZCB0aGUKLSAgIHByZWNlZGVuY2Ugb3JkZXIgYXMgaW4gQy4gIFNlZSBbSGFyYmlzb24sIFN0ZWVsZTogQywgQSBSZWZlcmVuY2UgTWFudWFsXS4KLSAgIFRoZXJlIGlzIG5vIHVuYXJ5IG1pbnVzIGFuZCBubyBiaXR3aXNlIG9wZXJhdG9ycy4KLSAgIE9wZXJhdG9ycyB3aXRoIHRoZSBzYW1lIHN5bnRhY3RpYyBiZWhhdmlvdXIgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlCi0gICB0b2tlbiwgdG8gc2F2ZSBzcGFjZSBpbiB0aGUgYXJyYXkgZ2VuZXJhdGVkIGJ5IGJpc29uLiAgKi8KLSVyaWdodCAnPycJCS8qICAgPwkJKi8KLSVsZWZ0ICd8JwkJLyogICB8fAkJKi8KLSVsZWZ0ICcmJwkJLyogICAmJgkJKi8KLSVsZWZ0IEVRVU9QMgkJLyogICA9PSAhPQkqLwotJWxlZnQgQ01QT1AyCQkvKiAgIDwgPiA8PSA+PQkqLwotJWxlZnQgQURET1AyCQkvKiAgICsgLQkqLwotJWxlZnQgTVVMT1AyCQkvKiAgICogLyAlCSovCi0lcmlnaHQgJyEnCQkvKiAgICEJCSovCi0KLSV0b2tlbiA8b3A+IEVRVU9QMiBDTVBPUDIgQURET1AyIE1VTE9QMgotJXRva2VuIDxudW0+IE5VTUJFUgotJXR5cGUgPGV4cD4gZXhwCi0KLSUlCi0KLXN0YXJ0OgkgIGV4cAotCSAgewotCSAgICBpZiAoJDEgPT0gTlVMTCkKLQkgICAgICBZWUFCT1JUOwotCSAgICAoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPnJlcyA9ICQxOwotCSAgfQotCTsKLQotZXhwOgkgIGV4cCAnPycgZXhwICc6JyBleHAKLQkgIHsKLQkgICAgJCQgPSBuZXdfZXhwXzMgKHFtb3AsICQxLCAkMywgJDUpOwotCSAgfQotCXwgZXhwICd8JyBleHAKLQkgIHsKLQkgICAgJCQgPSBuZXdfZXhwXzIgKGxvciwgJDEsICQzKTsKLQkgIH0KLQl8IGV4cCAnJicgZXhwCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8yIChsYW5kLCAkMSwgJDMpOwotCSAgfQotCXwgZXhwIEVRVU9QMiBleHAKLQkgIHsKLQkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOwotCSAgfQotCXwgZXhwIENNUE9QMiBleHAKLQkgIHsKLQkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOwotCSAgfQotCXwgZXhwIEFERE9QMiBleHAKLQkgIHsKLQkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOwotCSAgfQotCXwgZXhwIE1VTE9QMiBleHAKLQkgIHsKLQkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOwotCSAgfQotCXwgJyEnIGV4cAotCSAgewotCSAgICAkJCA9IG5ld19leHBfMSAobG5vdCwgJDIpOwotCSAgfQotCXwgJ24nCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8wICh2YXIpOwotCSAgfQotCXwgTlVNQkVSCi0JICB7Ci0JICAgIGlmICgoJCQgPSBuZXdfZXhwXzAgKG51bSkpICE9IE5VTEwpCi0JICAgICAgJCQtPnZhbC5udW0gPSAkMTsKLQkgIH0KLQl8ICcoJyBleHAgJyknCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi0lJQotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQotewotICBpZiAoZXhwID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLwotICBzd2l0Y2ggKGV4cC0+bmFyZ3MpCi0gICAgewotICAgIGNhc2UgMzoKLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1syXSk7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgMjoKLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1sxXSk7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgMToKLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1swXSk7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZnJlZSAoZXhwKTsKLX0KLQotCi1zdGF0aWMgaW50Ci15eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCi17Ci0gIGNvbnN0IGNoYXIgKmV4cCA9ICpwZXhwOwotICBpbnQgcmVzdWx0OwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChleHBbMF0gPT0gJ1wwJykKLQl7Ci0JICAqcGV4cCA9IGV4cDsKLQkgIHJldHVybiBZWUVPRjsKLQl9Ci0KLSAgICAgIGlmIChleHBbMF0gIT0gJyAnICYmIGV4cFswXSAhPSAnXHQnKQotCWJyZWFrOwotCi0gICAgICArK2V4cDsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gKmV4cCsrOwotICBzd2l0Y2ggKHJlc3VsdCkKLSAgICB7Ci0gICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIGludCBuID0gcmVzdWx0IC0gJzAnOwotCXdoaWxlIChleHBbMF0gPj0gJzAnICYmIGV4cFswXSA8PSAnOScpCi0JICB7Ci0JICAgIG4gKj0gMTA7Ci0JICAgIG4gKz0gZXhwWzBdIC0gJzAnOwotCSAgICArK2V4cDsKLQkgIH0KLQlsdmFsLT5udW0gPSBuOwotCXJlc3VsdCA9IE5VTUJFUjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPSc6Ci0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLQl7Ci0JICArK2V4cDsKLQkgIGx2YWwtPm9wID0gZXF1YWw7Ci0JICByZXN1bHQgPSBFUVVPUDI7Ci0JfQotICAgICAgZWxzZQotCXJlc3VsdCA9IFlZRVJSQ09ERTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnISc6Ci0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLQl7Ci0JICArK2V4cDsKLQkgIGx2YWwtPm9wID0gbm90X2VxdWFsOwotCSAgcmVzdWx0ID0gRVFVT1AyOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJic6Ci0gICAgY2FzZSAnfCc6Ci0gICAgICBpZiAoZXhwWzBdID09IHJlc3VsdCkKLQkrK2V4cDsKLSAgICAgIGVsc2UKLQlyZXN1bHQgPSBZWUVSUkNPREU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzwnOgotICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0JewotCSAgKytleHA7Ci0JICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7Ci0JfQotICAgICAgZWxzZQotCWx2YWwtPm9wID0gbGVzc190aGFuOwotICAgICAgcmVzdWx0ID0gQ01QT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc+JzoKLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotCXsKLQkgICsrZXhwOwotCSAgbHZhbC0+b3AgPSBncmVhdGVyX29yX2VxdWFsOwotCX0KLSAgICAgIGVsc2UKLQlsdmFsLT5vcCA9IGdyZWF0ZXJfdGhhbjsKLSAgICAgIHJlc3VsdCA9IENNUE9QMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKic6Ci0gICAgICBsdmFsLT5vcCA9IG11bHQ7Ci0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJy8nOgotICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7Ci0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyUnOgotICAgICAgbHZhbC0+b3AgPSBtb2R1bGU7Ci0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJysnOgotICAgICAgbHZhbC0+b3AgPSBwbHVzOwotICAgICAgcmVzdWx0ID0gQURET1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICctJzoKLSAgICAgIGx2YWwtPm9wID0gbWludXM7Ci0gICAgICByZXN1bHQgPSBBRERPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOgotICAgIGNhc2UgJz8nOgotICAgIGNhc2UgJzonOgotICAgIGNhc2UgJygnOgotICAgIGNhc2UgJyknOgotICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzsnOgotICAgIGNhc2UgJ1xuJzoKLSAgICBjYXNlICdcMCc6Ci0gICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KLSAgICAgIC0tZXhwOwotICAgICAgcmVzdWx0ID0gWVlFT0Y7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXN1bHQgPSBZWUVSUkNPREU7Ci0jaWYgWVlERUJVRyAhPSAwCi0gICAgICAtLWV4cDsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICpwZXhwID0gZXhwOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgLyogRG8gbm90aGluZy4gIFdlIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUuICAqLwotfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmMgYi91bml4L2ludGwvcHJpbnRmLWFyZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmMzIxOS4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvcHJpbnRmLWFyZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLSNpbmNsdWRlICJwcmludGYtYXJncy5oIgotCi0jaWZkZWYgU1RBVElDCi1TVEFUSUMKLSNlbmRpZgotaW50Ci1wcmludGZfZmV0Y2hhcmdzICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSkKLXsKLSAgc2l6ZV90IGk7Ci0gIGFyZ3VtZW50ICphcDsKLQotICBmb3IgKGkgPSAwLCBhcCA9ICZhLT5hcmdbMF07IGkgPCBhLT5jb3VudDsgaSsrLCBhcCsrKQotICAgIHN3aXRjaCAoYXAtPnR5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIFRZUEVfU0NIQVI6Ci0JYXAtPmEuYV9zY2hhciA9IHZhX2FyZyAoYXJncywgLypzaWduZWQgY2hhciovIGludCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfVUNIQVI6Ci0JYXAtPmEuYV91Y2hhciA9IHZhX2FyZyAoYXJncywgLyp1bnNpZ25lZCBjaGFyKi8gaW50KTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9TSE9SVDoKLQlhcC0+YS5hX3Nob3J0ID0gdmFfYXJnIChhcmdzLCAvKnNob3J0Ki8gaW50KTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9VU0hPUlQ6Ci0JYXAtPmEuYV91c2hvcnQgPSB2YV9hcmcgKGFyZ3MsIC8qdW5zaWduZWQgc2hvcnQqLyBpbnQpOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX0lOVDoKLQlhcC0+YS5hX2ludCA9IHZhX2FyZyAoYXJncywgaW50KTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9VSU5UOgotCWFwLT5hLmFfdWludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgaW50KTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9MT05HSU5UOgotCWFwLT5hLmFfbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQpOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX1VMT05HSU5UOgotCWFwLT5hLmFfdWxvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgaW50KTsKLQlicmVhazsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgICAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgotCWFwLT5hLmFfbG9uZ2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQpOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKLQlhcC0+YS5hX3Vsb25nbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBsb25nIGludCk7Ci0JYnJlYWs7Ci0jZW5kaWYKLSAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0JYXAtPmEuYV9kb3VibGUgPSB2YV9hcmcgKGFyZ3MsIGRvdWJsZSk7Ci0JYnJlYWs7Ci0jaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6Ci0JYXAtPmEuYV9sb25nZG91YmxlID0gdmFfYXJnIChhcmdzLCBsb25nIGRvdWJsZSk7Ci0JYnJlYWs7Ci0jZW5kaWYKLSAgICAgIGNhc2UgVFlQRV9DSEFSOgotCWFwLT5hLmFfY2hhciA9IHZhX2FyZyAoYXJncywgaW50KTsKLQlicmVhazsKLSNpZmRlZiBIQVZFX1dJTlRfVAotICAgICAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKLQlhcC0+YS5hX3dpZGVfY2hhciA9IHZhX2FyZyAoYXJncywgd2ludF90KTsKLQlicmVhazsKLSNlbmRpZgotICAgICAgY2FzZSBUWVBFX1NUUklORzoKLQlhcC0+YS5hX3N0cmluZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLQlicmVhazsKLSNpZmRlZiBIQVZFX1dDSEFSX1QKLSAgICAgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKLQlhcC0+YS5hX3dpZGVfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB3Y2hhcl90ICopOwotCWJyZWFrOwotI2VuZGlmCi0gICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKLQlhcC0+YS5hX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHZvaWQgKik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKLQlhcC0+YS5hX2NvdW50X3NjaGFyX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHNpZ25lZCBjaGFyICopOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6Ci0JYXAtPmEuYV9jb3VudF9zaG9ydF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaG9ydCAqKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjoKLQlhcC0+YS5hX2NvdW50X2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBpbnQgKik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOgotCWFwLT5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGludCAqKTsKLQlicmVhazsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgICAgY2FzZSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI6Ci0JYXAtPmEuYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGxvbmcgaW50ICopOwotCWJyZWFrOwotI2VuZGlmCi0gICAgICBkZWZhdWx0OgotCS8qIFVua25vd24gdHlwZS4gICovCi0JcmV0dXJuIC0xOwotICAgICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYtYXJncy5oIGIvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWU2NGMuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyogRGVjb21wb3NlZCBwcmludGYgYXJndW1lbnQgbGlzdC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfUFJJTlRGX0FSR1NfSAotI2RlZmluZSBfUFJJTlRGX0FSR1NfSAotCi0vKiBHZXQgc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotLyogR2V0IHdjaGFyX3QuICAqLwotI2lmZGVmIEhBVkVfV0NIQVJfVAotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0vKiBHZXQgd2ludF90LiAgKi8KLSNpZmRlZiBIQVZFX1dJTlRfVAotIyBpbmNsdWRlIDx3Y2hhci5oPgotI2VuZGlmCi0KLS8qIEdldCB2YV9saXN0LiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotCi0vKiBBcmd1bWVudCB0eXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRZUEVfTk9ORSwKLSAgVFlQRV9TQ0hBUiwKLSAgVFlQRV9VQ0hBUiwKLSAgVFlQRV9TSE9SVCwKLSAgVFlQRV9VU0hPUlQsCi0gIFRZUEVfSU5ULAotICBUWVBFX1VJTlQsCi0gIFRZUEVfTE9OR0lOVCwKLSAgVFlQRV9VTE9OR0lOVCwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICBUWVBFX0xPTkdMT05HSU5ULAotICBUWVBFX1VMT05HTE9OR0lOVCwKLSNlbmRpZgotICBUWVBFX0RPVUJMRSwKLSNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0gIFRZUEVfTE9OR0RPVUJMRSwKLSNlbmRpZgotICBUWVBFX0NIQVIsCi0jaWZkZWYgSEFWRV9XSU5UX1QKLSAgVFlQRV9XSURFX0NIQVIsCi0jZW5kaWYKLSAgVFlQRV9TVFJJTkcsCi0jaWZkZWYgSEFWRV9XQ0hBUl9UCi0gIFRZUEVfV0lERV9TVFJJTkcsCi0jZW5kaWYKLSAgVFlQRV9QT0lOVEVSLAotICBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVIsCi0gIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUiwKLSAgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUiwKLSAgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVIKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotLCBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVIKLSNlbmRpZgotfSBhcmdfdHlwZTsKLQotLyogUG9seW1vcnBoaWMgYXJndW1lbnQgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGFyZ190eXBlIHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICBzaWduZWQgY2hhcgkJCWFfc2NoYXI7Ci0gICAgdW5zaWduZWQgY2hhcgkJYV91Y2hhcjsKLSAgICBzaG9ydAkJCWFfc2hvcnQ7Ci0gICAgdW5zaWduZWQgc2hvcnQJCWFfdXNob3J0OwotICAgIGludAkJCQlhX2ludDsKLSAgICB1bnNpZ25lZCBpbnQJCWFfdWludDsKLSAgICBsb25nIGludAkJCWFfbG9uZ2ludDsKLSAgICB1bnNpZ25lZCBsb25nIGludAkJYV91bG9uZ2ludDsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGxvbmcgbG9uZyBpbnQJCWFfbG9uZ2xvbmdpbnQ7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIGludAlhX3Vsb25nbG9uZ2ludDsKLSNlbmRpZgotICAgIGZsb2F0CQkJYV9mbG9hdDsKLSAgICBkb3VibGUJCQlhX2RvdWJsZTsKLSNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0gICAgbG9uZyBkb3VibGUJCQlhX2xvbmdkb3VibGU7Ci0jZW5kaWYKLSAgICBpbnQJCQkJYV9jaGFyOwotI2lmZGVmIEhBVkVfV0lOVF9UCi0gICAgd2ludF90CQkJYV93aWRlX2NoYXI7Ci0jZW5kaWYKLSAgICBjb25zdCBjaGFyKgkJCWFfc3RyaW5nOwotI2lmZGVmIEhBVkVfV0NIQVJfVAotICAgIGNvbnN0IHdjaGFyX3QqCQlhX3dpZGVfc3RyaW5nOwotI2VuZGlmCi0gICAgdm9pZCoJCQlhX3BvaW50ZXI7Ci0gICAgc2lnbmVkIGNoYXIgKgkJYV9jb3VudF9zY2hhcl9wb2ludGVyOwotICAgIHNob3J0ICoJCQlhX2NvdW50X3Nob3J0X3BvaW50ZXI7Ci0gICAgaW50ICoJCQlhX2NvdW50X2ludF9wb2ludGVyOwotICAgIGxvbmcgaW50ICoJCQlhX2NvdW50X2xvbmdpbnRfcG9pbnRlcjsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGxvbmcgbG9uZyBpbnQgKgkJYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyOwotI2VuZGlmCi0gIH0KLSAgYTsKLX0KLWFyZ3VtZW50OwotCi10eXBlZGVmIHN0cnVjdAotewotICBzaXplX3QgY291bnQ7Ci0gIGFyZ3VtZW50ICphcmc7Ci19Ci1hcmd1bWVudHM7Ci0KLQotLyogRmV0Y2ggdGhlIGFyZ3VtZW50cywgcHV0dGluZyB0aGVtIGludG8gYS4gKi8KLSNpZmRlZiBTVEFUSUMKLVNUQVRJQwotI2Vsc2UKLWV4dGVybgotI2VuZGlmCi1pbnQgcHJpbnRmX2ZldGNoYXJncyAodmFfbGlzdCBhcmdzLCBhcmd1bWVudHMgKmEpOwotCi0jZW5kaWYgLyogX1BSSU5URl9BUkdTX0ggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYtcGFyc2UuYyBiL3VuaXgvaW50bC9wcmludGYtcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5ZjkwMy4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvcHJpbnRmLXBhcnNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyogRm9ybWF0dGVkIG91dHB1dCB0byBzdHJpbmdzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAsIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLS8qIFNwZWNpZmljYXRpb24uICAqLwotI2lmIFdJREVfQ0hBUl9WRVJTSU9OCi0jIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKLSNlbHNlCi0jIGluY2x1ZGUgInByaW50Zi1wYXJzZS5oIgotI2VuZGlmCi0KLS8qIEdldCBzaXplX3QsIE5VTEwuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0vKiBHZXQgaW50bWF4X3QuICAqLwotI2lmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCi0jIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0jaWYgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWAotIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0KLS8qIG1hbGxvYygpLCByZWFsbG9jKCksIGZyZWUoKS4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCi0jaW5jbHVkZSAieHNpemUuaCIKLQotI2lmIFdJREVfQ0hBUl9WRVJTSU9OCi0jIGRlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQotIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKLSMgZGVmaW5lIERJUkVDVElWRSB3Y2hhcl90X2RpcmVjdGl2ZQotIyBkZWZpbmUgRElSRUNUSVZFUyB3Y2hhcl90X2RpcmVjdGl2ZXMKLSNlbHNlCi0jIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCi0jIGRlZmluZSBDSEFSX1QgY2hhcgotIyBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCi0jIGRlZmluZSBESVJFQ1RJVkVTIGNoYXJfZGlyZWN0aXZlcwotI2VuZGlmCi0KLSNpZmRlZiBTVEFUSUMKLVNUQVRJQwotI2VuZGlmCi1pbnQKLVBSSU5URl9QQVJTRSAoY29uc3QgQ0hBUl9UICpmb3JtYXQsIERJUkVDVElWRVMgKmQsIGFyZ3VtZW50cyAqYSkKLXsKLSAgY29uc3QgQ0hBUl9UICpjcCA9IGZvcm1hdDsJCS8qIHBvaW50ZXIgaW50byBmb3JtYXQgKi8KLSAgc2l6ZV90IGFyZ19wb3NuID0gMDsJCS8qIG51bWJlciBvZiByZWd1bGFyIGFyZ3VtZW50cyBjb25zdW1lZCAqLwotICBzaXplX3QgZF9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGQtPmRpciAqLwotICBzaXplX3QgYV9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGEtPmFyZyAqLwotICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aCA9IDA7Ci0gIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDA7Ci0KLSAgZC0+Y291bnQgPSAwOwotICBkX2FsbG9jYXRlZCA9IDE7Ci0gIGQtPmRpciA9IG1hbGxvYyAoZF9hbGxvY2F0ZWQgKiBzaXplb2YgKERJUkVDVElWRSkpOwotICBpZiAoZC0+ZGlyID09IE5VTEwpCi0gICAgLyogT3V0IG9mIG1lbW9yeS4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIGEtPmNvdW50ID0gMDsKLSAgYV9hbGxvY2F0ZWQgPSAwOwotICBhLT5hcmcgPSBOVUxMOwotCi0jZGVmaW5lIFJFR0lTVEVSX0FSRyhfaW5kZXhfLF90eXBlXykgXAotICB7CQkJCQkJCQkJXAotICAgIHNpemVfdCBuID0gKF9pbmRleF8pOwkJCQkJCVwKLSAgICBpZiAobiA+PSBhX2FsbG9jYXRlZCkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQlcCi0JYXJndW1lbnQgKm1lbW9yeTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JYV9hbGxvY2F0ZWQgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCAyKTsJCQkJXAotCWlmIChhX2FsbG9jYXRlZCA8PSBuKQkJCQkJCVwKLQkgIGFfYWxsb2NhdGVkID0geHN1bSAobiwgMSk7CQkJCQlcCi0JbWVtb3J5X3NpemUgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCBzaXplb2YgKGFyZ3VtZW50KSk7CQlcCi0JaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQkJCQlcCi0JICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8JCQlcCi0JICBnb3RvIGVycm9yOwkJCQkJCQlcCi0JbWVtb3J5ID0gKGEtPmFyZwkJCQkJCVwKLQkJICA/IHJlYWxsb2MgKGEtPmFyZywgbWVtb3J5X3NpemUpCQkJXAotCQkgIDogbWFsbG9jIChtZW1vcnlfc2l6ZSkpOwkJCQlcCi0JaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCVwKLQkgIC8qIE91dCBvZiBtZW1vcnkuICAqLwkJCQkJCVwKLQkgIGdvdG8gZXJyb3I7CQkJCQkJCVwKLQlhLT5hcmcgPSBtZW1vcnk7CQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICB3aGlsZSAoYS0+Y291bnQgPD0gbikJCQkJCQlcCi0gICAgICBhLT5hcmdbYS0+Y291bnQrK10udHlwZSA9IFRZUEVfTk9ORTsJCQkJXAotICAgIGlmIChhLT5hcmdbbl0udHlwZSA9PSBUWVBFX05PTkUpCQkJCQlcCi0gICAgICBhLT5hcmdbbl0udHlwZSA9IChfdHlwZV8pOwkJCQkJXAotICAgIGVsc2UgaWYgKGEtPmFyZ1tuXS50eXBlICE9IChfdHlwZV8pKQkJCQlcCi0gICAgICAvKiBBbWJpZ3VvdXMgdHlwZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCQkJXAotICAgICAgZ290byBlcnJvcjsJCQkJCQkJXAotICB9Ci0KLSAgd2hpbGUgKCpjcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIENIQVJfVCBjID0gKmNwKys7Ci0gICAgICBpZiAoYyA9PSAnJScpCi0JewotCSAgc2l6ZV90IGFyZ19pbmRleCA9IEFSR19OT05FOwotCSAgRElSRUNUSVZFICpkcCA9ICZkLT5kaXJbZC0+Y291bnRdOy8qIHBvaW50ZXIgdG8gbmV4dCBkaXJlY3RpdmUgKi8KLQotCSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV4dCBkaXJlY3RpdmUuICAqLwotCSAgZHAtPmRpcl9zdGFydCA9IGNwIC0gMTsKLQkgIGRwLT5mbGFncyA9IDA7Ci0JICBkcC0+d2lkdGhfc3RhcnQgPSBOVUxMOwotCSAgZHAtPndpZHRoX2VuZCA9IE5VTEw7Ci0JICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gQVJHX05PTkU7Ci0JICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gTlVMTDsKLQkgIGRwLT5wcmVjaXNpb25fZW5kID0gTlVMTDsKLQkgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gQVJHX05PTkU7Ci0JICBkcC0+YXJnX2luZGV4ID0gQVJHX05PTkU7Ci0KLQkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLwotCSAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLQkgICAgewotCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7Ci0KLQkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKLQkJOwotCSAgICAgIGlmICgqbnAgPT0gJyQnKQotCQl7Ci0JCSAgc2l6ZV90IG4gPSAwOwotCi0JCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0JCSAgICBuID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7Ci0JCSAgaWYgKG4gPT0gMCkKLQkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCi0JCSAgICBnb3RvIGVycm9yOwotCQkgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQotCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeSBsYXRlci4gICovCi0JCSAgICBnb3RvIGVycm9yOwotCQkgIGFyZ19pbmRleCA9IG4gLSAxOwotCQkgIGNwID0gbnAgKyAxOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUmVhZCB0aGUgZmxhZ3MuICAqLwotCSAgZm9yICg7OykKLQkgICAgewotCSAgICAgIGlmICgqY3AgPT0gJ1wnJykKLQkJewotCQkgIGRwLT5mbGFncyB8PSBGTEFHX0dST1VQOwotCQkgIGNwKys7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqY3AgPT0gJy0nKQotCQl7Ci0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfTEVGVDsKLQkJICBjcCsrOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKmNwID09ICcrJykKLQkJewotCQkgIGRwLT5mbGFncyB8PSBGTEFHX1NIT1dTSUdOOwotCQkgIGNwKys7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqY3AgPT0gJyAnKQotCQl7Ci0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfU1BBQ0U7Ci0JCSAgY3ArKzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnIycpCi0JCXsKLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19BTFQ7Ci0JCSAgY3ArKzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnMCcpCi0JCXsKLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19aRVJPOwotCQkgIGNwKys7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIFBhcnNlIHRoZSBmaWVsZCB3aWR0aC4gICovCi0JICBpZiAoKmNwID09ICcqJykKLQkgICAgewotCSAgICAgIGRwLT53aWR0aF9zdGFydCA9IGNwOwotCSAgICAgIGNwKys7Ci0JICAgICAgZHAtPndpZHRoX2VuZCA9IGNwOwotCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgMSkKLQkJbWF4X3dpZHRoX2xlbmd0aCA9IDE7Ci0KLQkgICAgICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KLQkgICAgICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQotCQl7Ci0JCSAgY29uc3QgQ0hBUl9UICpucDsKLQotCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotCQkgICAgOwotCQkgIGlmICgqbnAgPT0gJyQnKQotCQkgICAgewotCQkgICAgICBzaXplX3QgbiA9IDA7Ci0KLQkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0JCQluID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7Ci0JCSAgICAgIGlmIChuID09IDApCi0JCQkvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCi0JCQkvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5IGxhdGVyLiAgKi8KLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBuIC0gMTsKLQkJICAgICAgY3AgPSBucCArIDE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKLQkJewotCQkgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBhcmdfcG9zbisrOwotCQkgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ID09IEFSR19OT05FKQotCQkgICAgLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLwotCQkgICAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgIFJFR0lTVEVSX0FSRyAoZHAtPndpZHRoX2FyZ19pbmRleCwgVFlQRV9JTlQpOwotCSAgICB9Ci0JICBlbHNlIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCi0JICAgIHsKLQkgICAgICBzaXplX3Qgd2lkdGhfbGVuZ3RoOwotCi0JICAgICAgZHAtPndpZHRoX3N0YXJ0ID0gY3A7Ci0JICAgICAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKLQkJOwotCSAgICAgIGRwLT53aWR0aF9lbmQgPSBjcDsKLQkgICAgICB3aWR0aF9sZW5ndGggPSBkcC0+d2lkdGhfZW5kIC0gZHAtPndpZHRoX3N0YXJ0OwotCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgd2lkdGhfbGVuZ3RoKQotCQltYXhfd2lkdGhfbGVuZ3RoID0gd2lkdGhfbGVuZ3RoOwotCSAgICB9Ci0KLQkgIC8qIFBhcnNlIHRoZSBwcmVjaXNpb24uICAqLwotCSAgaWYgKCpjcCA9PSAnLicpCi0JICAgIHsKLQkgICAgICBjcCsrOwotCSAgICAgIGlmICgqY3AgPT0gJyonKQotCQl7Ci0JCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IGNwIC0gMTsKLQkJICBjcCsrOwotCQkgIGRwLT5wcmVjaXNpb25fZW5kID0gY3A7Ci0JCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgMikKLQkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gMjsKLQotCQkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLwotCQkgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7Ci0KLQkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0JCQk7Ci0JCSAgICAgIGlmICgqbnAgPT0gJyQnKQotCQkJewotCQkJICBzaXplX3QgbiA9IDA7Ci0KLQkJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0JCQkgICAgbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOwotCQkJICBpZiAobiA9PSAwKQotCQkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCi0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCi0JCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeQotCQkJICAgICAgIGxhdGVyLiAgKi8KLQkJCSAgICBnb3RvIGVycm9yOwotCQkJICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IG4gLSAxOwotCQkJICBjcCA9IG5wICsgMTsKLQkJCX0KLQkJICAgIH0KLQkJICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPT0gQVJHX05PTkUpCi0JCSAgICB7Ci0JCSAgICAgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKLQkJICAgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID09IEFSR19OT05FKQotCQkJLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLwotCQkJZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICBSRUdJU1RFUl9BUkcgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4LCBUWVBFX0lOVCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzaXplX3QgcHJlY2lzaW9uX2xlbmd0aDsKLQotCQkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBjcCAtIDE7Ci0JCSAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKLQkJICAgIDsKLQkJICBkcC0+cHJlY2lzaW9uX2VuZCA9IGNwOwotCQkgIHByZWNpc2lvbl9sZW5ndGggPSBkcC0+cHJlY2lzaW9uX2VuZCAtIGRwLT5wcmVjaXNpb25fc3RhcnQ7Ci0JCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgcHJlY2lzaW9uX2xlbmd0aCkKLQkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gcHJlY2lzaW9uX2xlbmd0aDsKLQkJfQotCSAgICB9Ci0KLQkgIHsKLQkgICAgYXJnX3R5cGUgdHlwZTsKLQotCSAgICAvKiBQYXJzZSBhcmd1bWVudCB0eXBlL3NpemUgc3BlY2lmaWVycy4gICovCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZ3MgPSAwOwotCi0JICAgICAgZm9yICg7OykKLQkJewotCQkgIGlmICgqY3AgPT0gJ2gnKQotCQkgICAgewotCQkgICAgICBmbGFncyB8PSAoMSA8PCAoZmxhZ3MgJiAxKSk7Ci0JCSAgICAgIGNwKys7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmNwID09ICdMJykKLQkJICAgIHsKLQkJICAgICAgZmxhZ3MgfD0gNDsKLQkJICAgICAgY3ArKzsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqY3AgPT0gJ2wnKQotCQkgICAgewotCQkgICAgICBmbGFncyArPSA4OwotCQkgICAgICBjcCsrOwotCQkgICAgfQotI2lmZGVmIEhBVkVfSU5UTUFYX1QKLQkJICBlbHNlIGlmICgqY3AgPT0gJ2onKQotCQkgICAgewotCQkgICAgICBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGxvbmcpKQotCQkJewotCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgbG9uZyAqLwotCQkJICBmbGFncyArPSAxNjsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGludCkpCi0JCQl7Ci0JCQkgIC8qIGludG1heF90ID0gbG9uZyAqLwotCQkJICBmbGFncyArPSA4OwotCQkJfQotCQkgICAgICBjcCsrOwotCQkgICAgfQotI2VuZGlmCi0JCSAgZWxzZSBpZiAoKmNwID09ICd6JyB8fCAqY3AgPT0gJ1onKQotCQkgICAgewotCQkgICAgICAvKiAneicgaXMgc3RhbmRhcmRpemVkIGluIElTTyBDIDk5LCBidXQgZ2xpYmMgdXNlcyAnWicKLQkJCSBiZWNhdXNlIHRoZSB3YXJuaW5nIGZhY2lsaXR5IGluIGdjYy0yLjk1LjIgdW5kZXJzdGFuZHMKLQkJCSBvbmx5ICdaJyAoc2VlIGdjYy0yLjk1LjIvZ2NjL2MtY29tbW9uLmM6MTc4NCkuICAqLwotCQkgICAgICBpZiAoc2l6ZW9mIChzaXplX3QpID4gc2l6ZW9mIChsb25nKSkKLQkJCXsKLQkJCSAgLyogc2l6ZV90ID0gbG9uZyBsb25nICovCi0JCQkgIGZsYWdzICs9IDE2OwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHNpemVfdCkgPiBzaXplb2YgKGludCkpCi0JCQl7Ci0JCQkgIC8qIHNpemVfdCA9IGxvbmcgKi8KLQkJCSAgZmxhZ3MgKz0gODsKLQkJCX0KLQkJICAgICAgY3ArKzsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqY3AgPT0gJ3QnKQotCQkgICAgewotCQkgICAgICBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChsb25nKSkKLQkJCXsKLQkJCSAgLyogcHRyZGlmZl90ID0gbG9uZyBsb25nICovCi0JCQkgIGZsYWdzICs9IDE2OwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHB0cmRpZmZfdCkgPiBzaXplb2YgKGludCkpCi0JCQl7Ci0JCQkgIC8qIHB0cmRpZmZfdCA9IGxvbmcgKi8KLQkJCSAgZmxhZ3MgKz0gODsKLQkJCX0KLQkJICAgICAgY3ArKzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgLyogUmVhZCB0aGUgY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLwotCSAgICAgIGMgPSAqY3ArKzsKLQkgICAgICBzd2l0Y2ggKGMpCi0JCXsKLQkJY2FzZSAnZCc6IGNhc2UgJ2knOgotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQotCQkgICAgdHlwZSA9IFRZUEVfTE9OR0xPTkdJTlQ7Ci0JCSAgZWxzZQotI2VuZGlmCi0JCSAgaWYgKGZsYWdzID49IDgpCi0JCSAgICB0eXBlID0gVFlQRV9MT05HSU5UOwotCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKLQkJICAgIHR5cGUgPSBUWVBFX1NDSEFSOwotCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKLQkJICAgIHR5cGUgPSBUWVBFX1NIT1JUOwotCQkgIGVsc2UKLQkJICAgIHR5cGUgPSBUWVBFX0lOVDsKLQkJICBicmVhazsKLQkJY2FzZSAnbyc6IGNhc2UgJ3UnOiBjYXNlICd4JzogY2FzZSAnWCc6Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0JCSAgICB0eXBlID0gVFlQRV9VTE9OR0xPTkdJTlQ7Ci0JCSAgZWxzZQotI2VuZGlmCi0JCSAgaWYgKGZsYWdzID49IDgpCi0JCSAgICB0eXBlID0gVFlQRV9VTE9OR0lOVDsKLQkJICBlbHNlIGlmIChmbGFncyAmIDIpCi0JCSAgICB0eXBlID0gVFlQRV9VQ0hBUjsKLQkJICBlbHNlIGlmIChmbGFncyAmIDEpCi0JCSAgICB0eXBlID0gVFlQRV9VU0hPUlQ7Ci0JCSAgZWxzZQotCQkgICAgdHlwZSA9IFRZUEVfVUlOVDsKLQkJICBicmVhazsKLQkJY2FzZSAnZic6IGNhc2UgJ0YnOiBjYXNlICdlJzogY2FzZSAnRSc6IGNhc2UgJ2cnOiBjYXNlICdHJzoKLQkJY2FzZSAnYSc6IGNhc2UgJ0EnOgotI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0JCSAgICB0eXBlID0gVFlQRV9MT05HRE9VQkxFOwotCQkgIGVsc2UKLSNlbmRpZgotCQkgIHR5cGUgPSBUWVBFX0RPVUJMRTsKLQkJICBicmVhazsKLQkJY2FzZSAnYyc6Ci0JCSAgaWYgKGZsYWdzID49IDgpCi0jaWZkZWYgSEFWRV9XSU5UX1QKLQkJICAgIHR5cGUgPSBUWVBFX1dJREVfQ0hBUjsKLSNlbHNlCi0JCSAgICBnb3RvIGVycm9yOwotI2VuZGlmCi0JCSAgZWxzZQotCQkgICAgdHlwZSA9IFRZUEVfQ0hBUjsKLQkJICBicmVhazsKLSNpZmRlZiBIQVZFX1dJTlRfVAotCQljYXNlICdDJzoKLQkJICB0eXBlID0gVFlQRV9XSURFX0NIQVI7Ci0JCSAgYyA9ICdjJzsKLQkJICBicmVhazsKLSNlbmRpZgotCQljYXNlICdzJzoKLQkJICBpZiAoZmxhZ3MgPj0gOCkKLSNpZmRlZiBIQVZFX1dDSEFSX1QKLQkJICAgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOwotI2Vsc2UKLQkJICAgIGdvdG8gZXJyb3I7Ci0jZW5kaWYKLQkJICBlbHNlCi0JCSAgICB0eXBlID0gVFlQRV9TVFJJTkc7Ci0JCSAgYnJlYWs7Ci0jaWZkZWYgSEFWRV9XQ0hBUl9UCi0JCWNhc2UgJ1MnOgotCQkgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOwotCQkgIGMgPSAncyc7Ci0JCSAgYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSAncCc6Ci0JCSAgdHlwZSA9IFRZUEVfUE9JTlRFUjsKLQkJICBicmVhazsKLQkJY2FzZSAnbic6Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0JCSAgICB0eXBlID0gVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOwotCQkgIGVsc2UKLSNlbmRpZgotCQkgIGlmIChmbGFncyA+PSA4KQotCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOwotCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKLQkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI7Ci0JCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQotCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjsKLQkJICBlbHNlCi0JCSAgICB0eXBlID0gVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjsKLQkJICBicmVhazsKLQkJY2FzZSAnJSc6Ci0JCSAgdHlwZSA9IFRZUEVfTk9ORTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAvKiBVbmtub3duIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQotCSAgICBpZiAodHlwZSAhPSBUWVBFX05PTkUpCi0JICAgICAgewotCQlkcC0+YXJnX2luZGV4ID0gYXJnX2luZGV4OwotCQlpZiAoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkKLQkJICB7Ci0JCSAgICBkcC0+YXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKLQkJICAgIGlmIChkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKQotCQkgICAgICAvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCi0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgfQotCQlSRUdJU1RFUl9BUkcgKGRwLT5hcmdfaW5kZXgsIHR5cGUpOwotCSAgICAgIH0KLQkgICAgZHAtPmNvbnZlcnNpb24gPSBjOwotCSAgICBkcC0+ZGlyX2VuZCA9IGNwOwotCSAgfQotCi0JICBkLT5jb3VudCsrOwotCSAgaWYgKGQtPmNvdW50ID49IGRfYWxsb2NhdGVkKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IG1lbW9yeV9zaXplOwotCSAgICAgIERJUkVDVElWRSAqbWVtb3J5OwotCi0JICAgICAgZF9hbGxvY2F0ZWQgPSB4dGltZXMgKGRfYWxsb2NhdGVkLCAyKTsKLQkgICAgICBtZW1vcnlfc2l6ZSA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIHNpemVvZiAoRElSRUNUSVZFKSk7Ci0JICAgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQotCQkvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KLQkJZ290byBlcnJvcjsKLQkgICAgICBtZW1vcnkgPSByZWFsbG9jIChkLT5kaXIsIG1lbW9yeV9zaXplKTsKLQkgICAgICBpZiAobWVtb3J5ID09IE5VTEwpCi0JCS8qIE91dCBvZiBtZW1vcnkuICAqLwotCQlnb3RvIGVycm9yOwotCSAgICAgIGQtPmRpciA9IG1lbW9yeTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGQtPmRpcltkLT5jb3VudF0uZGlyX3N0YXJ0ID0gY3A7Ci0KLSAgZC0+bWF4X3dpZHRoX2xlbmd0aCA9IG1heF93aWR0aF9sZW5ndGg7Ci0gIGQtPm1heF9wcmVjaXNpb25fbGVuZ3RoID0gbWF4X3ByZWNpc2lvbl9sZW5ndGg7Ci0gIHJldHVybiAwOwotCi1lcnJvcjoKLSAgaWYgKGEtPmFyZykKLSAgICBmcmVlIChhLT5hcmcpOwotICBpZiAoZC0+ZGlyKQotICAgIGZyZWUgKGQtPmRpcik7Ci0gIHJldHVybiAtMTsKLX0KLQotI3VuZGVmIERJUkVDVElWRVMKLSN1bmRlZiBESVJFQ1RJVkUKLSN1bmRlZiBDSEFSX1QKLSN1bmRlZiBQUklOVEZfUEFSU0UKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYtcGFyc2UuaCBiL3VuaXgvaW50bC9wcmludGYtcGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlYzUwZS4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvcHJpbnRmLXBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBQYXJzZSBwcmludGYgZm9ybWF0IHN0cmluZy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfUFJJTlRGX1BBUlNFX0gKLSNkZWZpbmUgX1BSSU5URl9QQVJTRV9ICi0KLSNpbmNsdWRlICJwcmludGYtYXJncy5oIgotCi0KLS8qIEZsYWdzICovCi0jZGVmaW5lIEZMQUdfR1JPVVAJIDEJLyogJyBmbGFnICovCi0jZGVmaW5lIEZMQUdfTEVGVAkgMgkvKiAtIGZsYWcgKi8KLSNkZWZpbmUgRkxBR19TSE9XU0lHTgkgNAkvKiArIGZsYWcgKi8KLSNkZWZpbmUgRkxBR19TUEFDRQkgOAkvKiBzcGFjZSBmbGFnICovCi0jZGVmaW5lIEZMQUdfQUxUCTE2CS8qICMgZmxhZyAqLwotI2RlZmluZSBGTEFHX1pFUk8JMzIKLQotLyogYXJnX2luZGV4IHZhbHVlIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudCBpcyBjb25zdW1lZC4gICovCi0jZGVmaW5lIEFSR19OT05FCSh+KHNpemVfdCkwKQotCi0vKiBBIHBhcnNlZCBkaXJlY3RpdmUuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciogZGlyX3N0YXJ0OwotICBjb25zdCBjaGFyKiBkaXJfZW5kOwotICBpbnQgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIqIHdpZHRoX3N0YXJ0OwotICBjb25zdCBjaGFyKiB3aWR0aF9lbmQ7Ci0gIHNpemVfdCB3aWR0aF9hcmdfaW5kZXg7Ci0gIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9zdGFydDsKLSAgY29uc3QgY2hhciogcHJlY2lzaW9uX2VuZDsKLSAgc2l6ZV90IHByZWNpc2lvbl9hcmdfaW5kZXg7Ci0gIGNoYXIgY29udmVyc2lvbjsgLyogZCBpIG8gdSB4IFggZiBlIEUgZyBHIGMgcyBwIG4gVSAlIGJ1dCBub3QgQyBTICovCi0gIHNpemVfdCBhcmdfaW5kZXg7Ci19Ci1jaGFyX2RpcmVjdGl2ZTsKLQotLyogQSBwYXJzZWQgZm9ybWF0IHN0cmluZy4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBzaXplX3QgY291bnQ7Ci0gIGNoYXJfZGlyZWN0aXZlICpkaXI7Ci0gIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoOwotICBzaXplX3QgbWF4X3ByZWNpc2lvbl9sZW5ndGg7Ci19Ci1jaGFyX2RpcmVjdGl2ZXM7Ci0KLQotLyogUGFyc2VzIHRoZSBmb3JtYXQgc3RyaW5nLiAgRmlsbHMgaW4gdGhlIG51bWJlciBOIG9mIGRpcmVjdGl2ZXMsIGFuZCBmaWxscwotICAgaW4gZGlyZWN0aXZlc1swXSwgLi4uLCBkaXJlY3RpdmVzW04tMV0sIGFuZCBzZXRzIGRpcmVjdGl2ZXNbTl0uZGlyX3N0YXJ0Ci0gICB0byB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgQWxzbyBmaWxscyBpbiB0aGUgYXJnX3R5cGUgZmllbGRzIG9mIHRoZQotICAgYXJndW1lbnRzIGFuZCB0aGUgbmVlZGVkIGNvdW50IG9mIGFyZ3VtZW50cy4gICovCi0jaWZkZWYgU1RBVElDCi1TVEFUSUMKLSNlbHNlCi1leHRlcm4KLSNlbmRpZgotaW50IHByaW50Zl9wYXJzZSAoY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyX2RpcmVjdGl2ZXMgKmQsIGFyZ3VtZW50cyAqYSk7Ci0KLSNlbmRpZiAvKiBfUFJJTlRGX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYuYyBiL3VuaXgvaW50bC9wcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4NjQ2Yy4uMDAwMDAwMAotLS0gYS91bml4L2ludGwvcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyogRm9ybWF0dGVkIG91dHB1dCB0byBzdHJpbmdzLCB1c2luZyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3Mgd2l0aCBwb3NpdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYQotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgIUhBVkVfUE9TSVhfUFJJTlRGCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQotICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKLSAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKLSMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNlbHNlCi0jIGRlZmluZSBETExfRVhQT1JURUQKLSNlbmRpZgotCi0jZGVmaW5lIFNUQVRJQyBzdGF0aWMKLQotLyogRGVmaW5lIGF1eGlsaWFyeSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInByaW50Zi1hcmdzLmgiLiAgKi8KLSNpbmNsdWRlICJwcmludGYtYXJncy5jIgotCi0vKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAicHJpbnRmLXBhcnNlLmgiLiAgKi8KLSNpbmNsdWRlICJwcmludGYtcGFyc2UuYyIKLQotLyogRGVmaW5lIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAidmFzbnByaW50Zi5oIi4gICovCi0jZGVmaW5lIHZhc25wcmludGYgbGliaW50bF92YXNucHJpbnRmCi0jaW5jbHVkZSAidmFzbnByaW50Zi5jIgotI2lmIDAgLyogbm90IG5lZWRlZCAqLwotI2RlZmluZSBhc25wcmludGYgbGliaW50bF9hc25wcmludGYKLSNpbmNsdWRlICJhc25wcmludGYuYyIKLSNlbmRpZgotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF92ZnByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0gICAgcmV0dXJuIHZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuZ3RoOwotICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgaW50IHJldHZhbCA9IC0xOwotICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCXsKLQkgIGlmIChmd3JpdGUgKHJlc3VsdCwgMSwgbGVuZ3RoLCBzdHJlYW0pID09IGxlbmd0aCkKLQkgICAgcmV0dmFsID0gbGVuZ3RoOwotCSAgZnJlZSAocmVzdWx0KTsKLQl9Ci0gICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KLX0KLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfZnByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgcmV0dmFsOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICByZXR2YWwgPSBsaWJpbnRsX3ZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3ZwcmludGYgKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotewotICByZXR1cm4gbGliaW50bF92ZnByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOwotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF9wcmludGYgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXR2YWw7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJldHZhbCA9IGxpYmludGxfdnByaW50ZiAoZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfdnNwcmludGYgKGNoYXIgKnJlc3VsdGJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi17Ci0gIGlmIChzdHJjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQotICAgIHJldHVybiB2c3ByaW50ZiAocmVzdWx0YnVmLCBmb3JtYXQsIGFyZ3MpOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IGxlbmd0aCA9IChzaXplX3QpIH4wIC8gKDQgKiBzaXplb2YgKGNoYXIpKTsKLSAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCi0JewotCSAgZnJlZSAocmVzdWx0KTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3NwcmludGYgKGNoYXIgKnJlc3VsdGJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldHZhbDsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmV0dmFsID0gbGliaW50bF92c3ByaW50ZiAocmVzdWx0YnVmLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi0jaWYgSEFWRV9TTlBSSU5URgotCi0jIGlmIEhBVkVfREVDTF9fU05QUklOVEYKLSAgIC8qIFdpbmRvd3MuICAqLwotIyAgZGVmaW5lIHN5c3RlbV92c25wcmludGYgX3ZzbnByaW50ZgotIyBlbHNlCi0gICAvKiBVbml4LiAgKi8KLSMgIGRlZmluZSBzeXN0ZW1fdnNucHJpbnRmIHZzbnByaW50ZgotIyBlbmRpZgotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF92c25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi17Ci0gIGlmIChzdHJjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQotICAgIHJldHVybiBzeXN0ZW1fdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7Ci0gICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQotCXsKLQkgIGlmIChtYXhsZW5ndGggPiAwKQotCSAgICB7Ci0JICAgICAgaWYgKGxlbmd0aCA8IG1heGxlbmd0aCkKLQkJYWJvcnQgKCk7Ci0JICAgICAgbWVtY3B5IChyZXN1bHRidWYsIHJlc3VsdCwgbWF4bGVuZ3RoIC0gMSk7Ci0JICAgICAgcmVzdWx0YnVmW21heGxlbmd0aCAtIDFdID0gJ1wwJzsKLQkgICAgfQotCSAgZnJlZSAocmVzdWx0KTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3NucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXR2YWw7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJldHZhbCA9IGxpYmludGxfdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotI2VuZGlmCi0KLSNpZiBIQVZFX0FTUFJJTlRGCi0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3Zhc3ByaW50ZiAoY2hhciAqKnJlc3VsdHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotewotICBzaXplX3QgbGVuZ3RoOwotICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0gICpyZXN1bHRwID0gcmVzdWx0OwotICByZXR1cm4gbGVuZ3RoOwotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF9hc3ByaW50ZiAoY2hhciAqKnJlc3VsdHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXR2YWw7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJldHZhbCA9IGxpYmludGxfdmFzcHJpbnRmIChyZXN1bHRwLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi0jZW5kaWYKLQotI2lmIEhBVkVfRldQUklOVEYKLQotI2luY2x1ZGUgPHdjaGFyLmg+Ci0KLSNkZWZpbmUgV0lERV9DSEFSX1ZFUlNJT04gMQotCi0vKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAid3ByaW50Zi1wYXJzZS5oIi4gICovCi0jaW5jbHVkZSAicHJpbnRmLXBhcnNlLmMiCi0KLS8qIERlZmluZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInZhc25wcmludGYuaCIuICAqLwotI2RlZmluZSB2YXNud3ByaW50ZiBsaWJpbnRsX3Zhc253cHJpbnRmCi0jaW5jbHVkZSAidmFzbnByaW50Zi5jIgotI2lmIDAgLyogbm90IG5lZWRlZCAqLwotI2RlZmluZSBhc253cHJpbnRmIGxpYmludGxfYXNud3ByaW50ZgotI2luY2x1ZGUgImFzbnByaW50Zi5jIgotI2VuZGlmCi0KLSMgaWYgSEFWRV9ERUNMX19TTldQUklOVEYKLSAgIC8qIFdpbmRvd3MuICAqLwotIyAgZGVmaW5lIHN5c3RlbV92c3dwcmludGYgX3ZzbndwcmludGYKLSMgZWxzZQotICAgLyogVW5peC4gICovCi0jICBkZWZpbmUgc3lzdGVtX3Zzd3ByaW50ZiB2c3dwcmludGYKLSMgZW5kaWYKLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfdmZ3cHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotewotICBpZiAod2NzY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKLSAgICByZXR1cm4gdmZ3cHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuZ3RoOwotICAgICAgd2NoYXJfdCAqcmVzdWx0ID0gbGliaW50bF92YXNud3ByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIGludCByZXR2YWwgPSAtMTsKLSAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQl7Ci0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkgICAgaWYgKGZwdXR3YyAocmVzdWx0W2ldLCBzdHJlYW0pID09IFdFT0YpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoaSA9PSBsZW5ndGgpCi0JICAgIHJldHZhbCA9IGxlbmd0aDsKLQkgIGZyZWUgKHJlc3VsdCk7Ci0JfQotICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX2Z3cHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXR2YWw7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJldHZhbCA9IGxpYmludGxfdmZ3cHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3Z3cHJpbnRmIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgcmV0dXJuIGxpYmludGxfdmZ3cHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3dwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXR2YWw7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJldHZhbCA9IGxpYmludGxfdndwcmludGYgKGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3Zzd3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgaWYgKHdjc2NociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0gICAgcmV0dXJuIHN5c3RlbV92c3dwcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IG1heGxlbmd0aCA9IGxlbmd0aDsKLSAgICAgIHdjaGFyX3QgKnJlc3VsdCA9IGxpYmludGxfdmFzbndwcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQotCXsKLQkgIGlmIChtYXhsZW5ndGggPiAwKQotCSAgICB7Ci0JICAgICAgaWYgKGxlbmd0aCA8IG1heGxlbmd0aCkKLQkJYWJvcnQgKCk7Ci0JICAgICAgbWVtY3B5IChyZXN1bHRidWYsIHJlc3VsdCwgKG1heGxlbmd0aCAtIDEpICogc2l6ZW9mICh3Y2hhcl90KSk7Ci0JICAgICAgcmVzdWx0YnVmW21heGxlbmd0aCAtIDFdID0gMDsKLQkgICAgfQotCSAgZnJlZSAocmVzdWx0KTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3N3cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXR2YWw7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJldHZhbCA9IGxpYmludGxfdnN3cHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3JlZi1hZGQuc2luIGIvdW5peC9pbnRsL3JlZi1hZGQuc2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjczNzRlLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9yZWYtYWRkLnNpbgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgQWRkIHRoaXMgcGFja2FnZSB0byBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUuCi0jCi0jICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0jICAgVVNBLgotIwotIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPi4KLSMKLS9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8gewotICBzLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8vCi0gIHRhCi0gIDphCi0gIHMvIEBQQUNLQUdFQCAvIEBQQUNLQUdFQCAvCi0gIHRiCi0gIHMvICQvIEBQQUNLQUdFQCAvCi0gIDpiCi0gIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCi19CmRpZmYgLS1naXQgYS91bml4L2ludGwvcmVmLWRlbC5zaW4gYi91bml4L2ludGwvcmVmLWRlbC5zaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxM2NmMzcuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL3JlZi1kZWwuc2luCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyBSZW1vdmUgdGhpcyBwYWNrYWdlIGZyb20gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgotIwotIyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jICAgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotIyAgIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4uCi0jCi0vXiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAvIHsKLSAgcy8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovLwotICBzLyBAUEFDS0FHRUAgLyAvCi0gIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCi19CmRpZmYgLS1naXQgYS91bml4L2ludGwvcmVsb2NhdGFibGUuYyBiL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjdjNzA4Li4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLQotLyogVGVsbCBnbGliYydzIDxzdGRpby5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBnZXRsaW5lKCkuCi0gICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKLSAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLSNpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgotCi0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgTk9fWE1BTExPQwotIyBkZWZpbmUgeG1hbGxvYyBtYWxsb2MKLSNlbHNlCi0jIGluY2x1ZGUgInhhbGxvYy5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXwotIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2lmIERFUEVORFNfT05fTElCQ0hBUlNFVAotIyBpbmNsdWRlIDxsaWJjaGFyc2V0Lmg+Ci0jZW5kaWYKLSNpZiBERVBFTkRTX09OX0xJQklDT05WICYmIEhBVkVfSUNPTlYKLSMgaW5jbHVkZSA8aWNvbnYuaD4KLSNlbmRpZgotI2lmIERFUEVORFNfT05fTElCSU5UTCAmJiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbmRpZgotCi0vKiBGYWtlZCBjaGVhcCAnYm9vbCcuICAqLwotI3VuZGVmIGJvb2wKLSN1bmRlZiBmYWxzZQotI3VuZGVmIHRydWUKLSNkZWZpbmUgYm9vbCBpbnQKLSNkZWZpbmUgZmFsc2UgMAotI2RlZmluZSB0cnVlIDEKLQotLyogUGF0aG5hbWUgc3VwcG9ydC4KLSAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgotICAgSVNfUEFUSF9XSVRIX0RJUihQKSAgdGVzdHMgd2hldGhlciBQIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCi0gKi8KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLSAgLyogV2luMzIsIE9TLzIsIERPUyAqLwotIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKLSMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAotICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKLSAgICAgJiYgKFApWzFdID09ICc6JykKLSMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgXAotICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCi0jIGRlZmluZSBGSUxFU1lTVEVNX1BSRUZJWF9MRU4oUCkgKEhBU19ERVZJQ0UgKFApID8gMiA6IDApCi0jZWxzZQotICAvKiBVbml4ICovCi0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQotIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwpCi0jIGRlZmluZSBGSUxFU1lTVEVNX1BSRUZJWF9MRU4oUCkgMAotI2VuZGlmCi0KLS8qIE9yaWdpbmFsIGluc3RhbGxhdGlvbiBwcmVmaXguICAqLwotc3RhdGljIGNoYXIgKm9yaWdfcHJlZml4Owotc3RhdGljIHNpemVfdCBvcmlnX3ByZWZpeF9sZW47Ci0vKiBDdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXguICAqLwotc3RhdGljIGNoYXIgKmN1cnJfcHJlZml4Owotc3RhdGljIHNpemVfdCBjdXJyX3ByZWZpeF9sZW47Ci0vKiBUaGVzZSBwcmVmaXhlcyBkbyBub3QgZW5kIGluIGEgc2xhc2guICBBbnl0aGluZyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkCi0gICB0byB0aGVtIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoLiAgKi8KLQotLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhpcyBtb2R1bGUuCi0gICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAotICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKLSAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKLSAgIGluc3RlYWQgb2YgIi8iKS4gICovCi1zdGF0aWMgdm9pZAotc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywKLQkJCSAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeF9hcmcpCi17Ci0gIGlmIChvcmlnX3ByZWZpeF9hcmcgIT0gTlVMTCAmJiBjdXJyX3ByZWZpeF9hcmcgIT0gTlVMTAotICAgICAgLyogT3B0aW1pemF0aW9uOiBpZiBvcmlnX3ByZWZpeCBhbmQgY3Vycl9wcmVmaXggYXJlIGVxdWFsLCB0aGUKLQkgcmVsb2NhdGlvbiBpcyBhIG5vcC4gICovCi0gICAgICAmJiBzdHJjbXAgKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIER1cGxpY2F0ZSB0aGUgYXJndW1lbnQgc3RyaW5ncy4gICovCi0gICAgICBjaGFyICptZW1vcnk7Ci0KLSAgICAgIG9yaWdfcHJlZml4X2xlbiA9IHN0cmxlbiAob3JpZ19wcmVmaXhfYXJnKTsKLSAgICAgIGN1cnJfcHJlZml4X2xlbiA9IHN0cmxlbiAoY3Vycl9wcmVmaXhfYXJnKTsKLSAgICAgIG1lbW9yeSA9IChjaGFyICopIHhtYWxsb2MgKG9yaWdfcHJlZml4X2xlbiArIDEgKyBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKLSNpZmRlZiBOT19YTUFMTE9DCi0gICAgICBpZiAobWVtb3J5ICE9IE5VTEwpCi0jZW5kaWYKLQl7Ci0JICBtZW1jcHkgKG1lbW9yeSwgb3JpZ19wcmVmaXhfYXJnLCBvcmlnX3ByZWZpeF9sZW4gKyAxKTsKLQkgIG9yaWdfcHJlZml4ID0gbWVtb3J5OwotCSAgbWVtb3J5ICs9IG9yaWdfcHJlZml4X2xlbiArIDE7Ci0JICBtZW1jcHkgKG1lbW9yeSwgY3Vycl9wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKLQkgIGN1cnJfcHJlZml4ID0gbWVtb3J5OwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIG9yaWdfcHJlZml4ID0gTlVMTDsKLSAgY3Vycl9wcmVmaXggPSBOVUxMOwotICAvKiBEb24ndCB3b3JyeSBhYm91dCB3YXN0ZWQgbWVtb3J5IGhlcmUgLSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgb25seQotICAgICBjYWxsZWQgb25jZS4gICovCi19Ci0KLS8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgotICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKLSAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCi0gICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCi0gICBpbnN0ZWFkIG9mICIvIikuICAqLwotdm9pZAotc2V0X3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeF9hcmcsIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2FyZykKLXsKLSAgc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKLQotICAvKiBOb3cgbm90aWZ5IGFsbCBkZXBlbmRlbnQgbGlicmFyaWVzLiAgKi8KLSNpZiBERVBFTkRTX09OX0xJQkNIQVJTRVQKLSAgbGliY2hhcnNldF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKLSNlbmRpZgotI2lmIERFUEVORFNfT05fTElCSUNPTlYgJiYgSEFWRV9JQ09OViAmJiBfTElCSUNPTlZfVkVSU0lPTiA+PSAweDAxMDkKLSAgbGliaWNvbnZfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7Ci0jZW5kaWYKLSNpZiBERVBFTkRTX09OX0xJQklOVEwgJiYgRU5BQkxFX05MUyAmJiBkZWZpbmVkIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4Ci0gIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7Ci0jZW5kaWYKLX0KLQotI2lmICFkZWZpbmVkIElOX0xJQlJBUlkgfHwgKGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUikKLQotLyogQ29udmVuaWVuY2UgZnVuY3Rpb246Ci0gICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKLSAgIGluc3RhbGxhdGlvbiBwcmVmaXgsIHRoZSBvcmlnaW5hbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgcGFydGljdWxhcgotICAgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBhdGhuYW1lIG9mIHRoaXMgZmlsZS4gIFJldHVybnMgTlVMTCB1cG9uIGZhaWx1cmUuICAqLwotI2lmZGVmIElOX0xJQlJBUlkKLSNkZWZpbmUgY29tcHV0ZV9jdXJyX3ByZWZpeCBsb2NhbF9jb21wdXRlX2N1cnJfcHJlZml4Ci1zdGF0aWMKLSNlbmRpZgotY29uc3QgY2hhciAqCi1jb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCi0JCSAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAotCQkgICAgIGNvbnN0IGNoYXIgKmN1cnJfcGF0aG5hbWUpCi17Ci0gIGNvbnN0IGNoYXIgKmN1cnJfaW5zdGFsbGRpcjsKLSAgY29uc3QgY2hhciAqcmVsX2luc3RhbGxkaXI7Ci0KLSAgaWYgKGN1cnJfcGF0aG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBEZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIHJlbGF0aXZlIHRvIHRoZSBwcmVmaXguCi0gICAgIFRoaXMgaXMgc2ltcGx5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JpZ19pbnN0YWxscHJlZml4IGFuZAotICAgICBvcmlnX2luc3RhbGxkaXIuICAqLwotICBpZiAoc3RybmNtcCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KSkKLSAgICAgICE9IDApCi0gICAgLyogU2hvdWxkbid0IGhhcHBlbiAtIG5vdGhpbmcgc2hvdWxkIGJlIGluc3RhbGxlZCBvdXRzaWRlICQocHJlZml4KS4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJlbF9pbnN0YWxsZGlyID0gb3JpZ19pbnN0YWxsZGlyICsgc3RybGVuIChvcmlnX2luc3RhbGxwcmVmaXgpOwotCi0gIC8qIERldGVybWluZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgKi8KLSAgewotICAgIGNvbnN0IGNoYXIgKnBfYmFzZSA9IGN1cnJfcGF0aG5hbWUgKyBGSUxFU1lTVEVNX1BSRUZJWF9MRU4gKGN1cnJfcGF0aG5hbWUpOwotICAgIGNvbnN0IGNoYXIgKnAgPSBjdXJyX3BhdGhuYW1lICsgc3RybGVuIChjdXJyX3BhdGhuYW1lKTsKLSAgICBjaGFyICpxOwotCi0gICAgd2hpbGUgKHAgPiBwX2Jhc2UpCi0gICAgICB7Ci0JcC0tOwotCWlmIChJU1NMQVNIICgqcCkpCi0JICBicmVhazsKLSAgICAgIH0KLQotICAgIHEgPSAoY2hhciAqKSB4bWFsbG9jIChwIC0gY3Vycl9wYXRobmFtZSArIDEpOwotI2lmZGVmIE5PX1hNQUxMT0MKLSAgICBpZiAocSA9PSBOVUxMKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLSAgICBtZW1jcHkgKHEsIGN1cnJfcGF0aG5hbWUsIHAgLSBjdXJyX3BhdGhuYW1lKTsKLSAgICBxW3AgLSBjdXJyX3BhdGhuYW1lXSA9ICdcMCc7Ci0gICAgY3Vycl9pbnN0YWxsZGlyID0gcTsKLSAgfQotCi0gIC8qIENvbXB1dGUgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBieSByZW1vdmluZyB0aGUgdHJhaWxpbmcKLSAgICAgcmVsX2luc3RhbGxkaXIgZnJvbSBpdC4gICovCi0gIHsKLSAgICBjb25zdCBjaGFyICpycCA9IHJlbF9pbnN0YWxsZGlyICsgc3RybGVuIChyZWxfaW5zdGFsbGRpcik7Ci0gICAgY29uc3QgY2hhciAqY3AgPSBjdXJyX2luc3RhbGxkaXIgKyBzdHJsZW4gKGN1cnJfaW5zdGFsbGRpcik7Ci0gICAgY29uc3QgY2hhciAqY3BfYmFzZSA9Ci0gICAgICBjdXJyX2luc3RhbGxkaXIgKyBGSUxFU1lTVEVNX1BSRUZJWF9MRU4gKGN1cnJfaW5zdGFsbGRpcik7Ci0KLSAgICB3aGlsZSAocnAgPiByZWxfaW5zdGFsbGRpciAmJiBjcCA+IGNwX2Jhc2UpCi0gICAgICB7Ci0JYm9vbCBzYW1lID0gZmFsc2U7Ci0JY29uc3QgY2hhciAqcnBpID0gcnA7Ci0JY29uc3QgY2hhciAqY3BpID0gY3A7Ci0KLQl3aGlsZSAocnBpID4gcmVsX2luc3RhbGxkaXIgJiYgY3BpID4gY3BfYmFzZSkKLQkgIHsKLQkgICAgcnBpLS07Ci0JICAgIGNwaS0tOwotCSAgICBpZiAoSVNTTEFTSCAoKnJwaSkgfHwgSVNTTEFTSCAoKmNwaSkpCi0JICAgICAgewotCQlpZiAoSVNTTEFTSCAoKnJwaSkgJiYgSVNTTEFTSCAoKmNwaSkpCi0JCSAgc2FtZSA9IHRydWU7Ci0JCWJyZWFrOwotCSAgICAgIH0KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KLQkgICAgLyogV2luMzIsIE9TLzIsIERPUyAtIGNhc2UgaW5zaWduaWZpY2FudCBmaWxlc3lzdGVtICovCi0JICAgIGlmICgoKnJwaSA+PSAnYScgJiYgKnJwaSA8PSAneicgPyAqcnBpIC0gJ2EnICsgJ0EnIDogKnJwaSkKLQkJIT0gKCpjcGkgPj0gJ2EnICYmICpjcGkgPD0gJ3onID8gKmNwaSAtICdhJyArICdBJyA6ICpjcGkpKQotCSAgICAgIGJyZWFrOwotI2Vsc2UKLQkgICAgaWYgKCpycGkgIT0gKmNwaSkKLQkgICAgICBicmVhazsKLSNlbmRpZgotCSAgfQotCWlmICghc2FtZSkKLQkgIGJyZWFrOwotCS8qIFRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudCB3YXMgdGhlIHNhbWUuICBvcGkgYW5kIGNwaSBub3cgcG9pbnQKLQkgICB0byB0aGUgc2xhc2ggYmVmb3JlIGl0LiAgKi8KLQlycCA9IHJwaTsKLQljcCA9IGNwaTsKLSAgICAgIH0KLQotICAgIGlmIChycCA+IHJlbF9pbnN0YWxsZGlyKQotICAgICAgLyogVW5leHBlY3RlZDogVGhlIGN1cnJfaW5zdGFsbGRpciBkb2VzIG5vdCBlbmQgd2l0aCByZWxfaW5zdGFsbGRpci4gICovCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIHsKLSAgICAgIHNpemVfdCBjdXJyX3ByZWZpeF9sZW4gPSBjcCAtIGN1cnJfaW5zdGFsbGRpcjsKLSAgICAgIGNoYXIgKmN1cnJfcHJlZml4OwotCi0gICAgICBjdXJyX3ByZWZpeCA9IChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIDEpOwotI2lmZGVmIE5PX1hNQUxMT0MKLSAgICAgIGlmIChjdXJyX3ByZWZpeCA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotI2VuZGlmCi0gICAgICBtZW1jcHkgKGN1cnJfcHJlZml4LCBjdXJyX2luc3RhbGxkaXIsIGN1cnJfcHJlZml4X2xlbik7Ci0gICAgICBjdXJyX3ByZWZpeFtjdXJyX3ByZWZpeF9sZW5dID0gJ1wwJzsKLQotICAgICAgcmV0dXJuIGN1cnJfcHJlZml4OwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLyogIUlOX0xJQlJBUlkgfHwgUElDICovCi0KLSNpZiBkZWZpbmVkIFBJQyAmJiBkZWZpbmVkIElOU1RBTExESVIKLQotLyogRnVsbCBwYXRobmFtZSBvZiBzaGFyZWQgbGlicmFyeSwgb3IgTlVMTC4gICovCi1zdGF0aWMgY2hhciAqc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Ci0KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXwotCi0vKiBEZXRlcm1pbmUgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHdoZW4gaXQgaXMgbG9hZGVkLiAgKi8KLQotQk9PTCBXSU5BUEkKLURsbE1haW4gKEhJTlNUQU5DRSBtb2R1bGVfaGFuZGxlLCBEV09SRCBldmVudCwgTFBWT0lEIHJlc2VydmVkKQotewotICAodm9pZCkgcmVzZXJ2ZWQ7Ci0KLSAgaWYgKGV2ZW50ID09IERMTF9QUk9DRVNTX0FUVEFDSCkKLSAgICB7Ci0gICAgICAvKiBUaGUgRExMIGlzIGJlaW5nIGxvYWRlZCBpbnRvIGFuIGFwcGxpY2F0aW9uJ3MgYWRkcmVzcyByYW5nZS4gICovCi0gICAgICBzdGF0aWMgY2hhciBsb2NhdGlvbltNQVhfUEFUSF07Ci0KLSAgICAgIGlmICghR2V0TW9kdWxlRmlsZU5hbWUgKG1vZHVsZV9oYW5kbGUsIGxvY2F0aW9uLCBzaXplb2YgKGxvY2F0aW9uKSkpCi0JLyogU2hvdWxkbid0IGhhcHBlbi4gICovCi0JcmV0dXJuIEZBTFNFOwotCi0gICAgICBpZiAoIUlTX1BBVEhfV0lUSF9ESVIgKGxvY2F0aW9uKSkKLQkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KLQlyZXR1cm4gRkFMU0U7Ci0KLSAgICAgIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gc3RyZHVwIChsb2NhdGlvbik7Ci0gICAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0jZWxzZSAvKiBVbml4ICovCi0KLXN0YXRpYyB2b2lkCi1maW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpCi17Ci0jaWYgZGVmaW5lZCBfX2xpbnV4X18gJiYgX19HTElCQ19fID49IDIKLSAgLyogTGludXggaGFzIC9wcm9jL3NlbGYvbWFwcy4gZ2xpYmMgMiBoYXMgdGhlIGdldGxpbmUoKSBmdW5jdGlvbi4gICovCi0gIEZJTEUgKmZwOwotCi0gIC8qIE9wZW4gdGhlIGN1cnJlbnQgcHJvY2VzcycgbWFwcyBmaWxlLiAgSXQgZGVzY3JpYmVzIG9uZSBWTUEgcGVyIGxpbmUuICAqLwotICBmcCA9IGZvcGVuICgiL3Byb2Mvc2VsZi9tYXBzIiwgInIiKTsKLSAgaWYgKGZwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSAmZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKLSAgICAgIGZvciAoOzspCi0JewotCSAgdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwotCSAgaW50IGM7Ci0KLQkgIGlmIChmc2NhbmYgKGZwLCAiJWx4LSVseCIsICZzdGFydCwgJmVuZCkgIT0gMikKLQkgICAgYnJlYWs7Ci0JICBpZiAoYWRkcmVzcyA+PSBzdGFydCAmJiBhZGRyZXNzIDw9IGVuZCAtIDEpCi0JICAgIHsKLQkgICAgICAvKiBGb3VuZCBpdC4gIE5vdyBzZWUgaWYgdGhpcyBsaW5lIGNvbnRhaW5zIGEgZmlsZW5hbWUuICAqLwotCSAgICAgIHdoaWxlIChjID0gZ2V0YyAoZnApLCBjICE9IEVPRiAmJiBjICE9ICdcbicgJiYgYyAhPSAnLycpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChjID09ICcvJykKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIGludCBsZW47Ci0KLQkJICB1bmdldGMgKGMsIGZwKTsKLQkJICBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IE5VTEw7IHNpemUgPSAwOwotCQkgIGxlbiA9IGdldGxpbmUgKCZzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSwgJnNpemUsIGZwKTsKLQkJICBpZiAobGVuID49IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFN1Y2Nlc3M6IGZpbGxlZCBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZS4gICovCi0JCSAgICAgIGlmIChsZW4gPiAwICYmIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lW2xlbiAtIDFdID09ICdcbicpCi0JCQlzaGFyZWRfbGlicmFyeV9mdWxsbmFtZVtsZW4gLSAxXSA9ICdcMCc7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgd2hpbGUgKGMgPSBnZXRjIChmcCksIGMgIT0gRU9GICYmIGMgIT0gJ1xuJykKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZmNsb3NlIChmcCk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLSNlbmRpZiAvKiBXSU4zMiAvIFVuaXggKi8KLQotLyogUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNoYXJlZCBsaWJyYXJ5LgotICAgUmV0dXJuIE5VTEwgaWYgdW5rbm93bi4KLSAgIEd1YXJhbnRlZWQgdG8gd29yayBvbmx5IG9uIExpbnV4IGFuZCBXb2UzMi4gICovCi1zdGF0aWMgY2hhciAqCi1nZXRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkKLXsKLSNpZiAhKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKQotICBzdGF0aWMgYm9vbCB0cmllZF9maW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOwotICBpZiAoIXRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUpCi0gICAgewotICAgICAgZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKTsKLSAgICAgIHRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSB0cnVlOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Ci19Ci0KLSNlbmRpZiAvKiBQSUMgKi8KLQotLyogUmV0dXJucyB0aGUgcGF0aG5hbWUsIHJlbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uCi0gICBkaXJlY3RvcnkuICAqLwotY29uc3QgY2hhciAqCi1yZWxvY2F0ZSAoY29uc3QgY2hhciAqcGF0aG5hbWUpCi17Ci0jaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCi0gIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7Ci0KLSAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYSBzaGFyZWQgbGlicmFyeS4gICovCi0gIGlmICghaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgLyogQXQgdGhpcyBwb2ludCwgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGxpa2VseSBoYXZlIGFscmVhZHkgYmVlbgotCSBzZXQgdGhyb3VnaCB0aGUgbWFpbiBwcm9ncmFtJ3Mgc2V0X3Byb2dyYW1fbmFtZV9hbmRfaW5zdGFsbGRpcgotCSBmdW5jdGlvbi4gIFRoaXMgaXMgc3VmZmljaWVudCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBsaWJyYXJ5IGhhcwotCSBpbml0aWFsbHkgYmVlbiBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgb3JpZ19wcmVmaXguICBCdXQgd2UgY2FuIGRvCi0JIGJldHRlciwgdG8gYWxzbyBjb3ZlciB0aGUgY2FzZXMgdGhhdCAxLiBpdCBoYXMgYmVlbiBpbnN0YWxsZWQKLQkgaW4gYSBkaWZmZXJlbnQgcHJlZml4IGJlZm9yZSBiZWluZyBtb3ZlZCB0byBvcmlnX3ByZWZpeCBhbmQgKGxhdGVyKQotCSB0byBjdXJyX3ByZWZpeCwgMi4gdW5saWtlIHRoZSBwcm9ncmFtLCBpdCBoYXMgbm90IG1vdmVkIGF3YXkgZnJvbQotCSBvcmlnX3ByZWZpeC4gICovCi0gICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXggPSBJTlNUQUxMUFJFRklYOwotICAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyID0gSU5TVEFMTERJUjsKLSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2JldHRlcjsKLQotICAgICAgY3Vycl9wcmVmaXhfYmV0dGVyID0KLQljb21wdXRlX2N1cnJfcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIG9yaWdfaW5zdGFsbGRpciwKLQkJCSAgICAgZ2V0X3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpKTsKLSAgICAgIGlmIChjdXJyX3ByZWZpeF9iZXR0ZXIgPT0gTlVMTCkKLQljdXJyX3ByZWZpeF9iZXR0ZXIgPSBjdXJyX3ByZWZpeDsKLQotICAgICAgc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIGN1cnJfcHJlZml4X2JldHRlcik7Ci0KLSAgICAgIGluaXRpYWxpemVkID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBOb3RlOiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIGhlcmUsCi0gICAgIGV2ZW4gZm9yIERPUy1saWtlIGZpbGVzeXN0ZW1zLCBiZWNhdXNlIHRoZSBwYXRobmFtZSBhcmd1bWVudCB3YXMKLSAgICAgdHlwaWNhbGx5IGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBNYWtlZmlsZSB2YXJpYWJsZSBhcyBvcmlnX3ByZWZpeCBjYW1lCi0gICAgIGZyb20uICAqLwotICBpZiAob3JpZ19wcmVmaXggIT0gTlVMTCAmJiBjdXJyX3ByZWZpeCAhPSBOVUxMCi0gICAgICAmJiBzdHJuY21wIChwYXRobmFtZSwgb3JpZ19wcmVmaXgsIG9yaWdfcHJlZml4X2xlbikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXSA9PSAnXDAnKQotCS8qIHBhdGhuYW1lIGVxdWFscyBvcmlnX3ByZWZpeC4gICovCi0JcmV0dXJuIGN1cnJfcHJlZml4OwotICAgICAgaWYgKElTU0xBU0ggKHBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl0pKQotCXsKLQkgIC8qIHBhdGhuYW1lIHN0YXJ0cyB3aXRoIG9yaWdfcHJlZml4LiAgKi8KLQkgIGNvbnN0IGNoYXIgKnBhdGhuYW1lX3RhaWwgPSAmcGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXTsKLQkgIGNoYXIgKnJlc3VsdCA9Ci0JICAgIChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIHN0cmxlbiAocGF0aG5hbWVfdGFpbCkgKyAxKTsKLQotI2lmZGVmIE5PX1hNQUxMT0MKLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLSNlbmRpZgotCSAgICB7Ci0JICAgICAgbWVtY3B5IChyZXN1bHQsIGN1cnJfcHJlZml4LCBjdXJyX3ByZWZpeF9sZW4pOwotCSAgICAgIHN0cmNweSAocmVzdWx0ICsgY3Vycl9wcmVmaXhfbGVuLCBwYXRobmFtZV90YWlsKTsKLQkgICAgICByZXR1cm4gcmVzdWx0OwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogTm90aGluZyB0byByZWxvY2F0ZS4gICovCi0gIHJldHVybiBwYXRobmFtZTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvcmVsb2NhdGFibGUuaCBiL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGM1YjcxLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogUHJvdmlkZSByZWxvY2F0YWJsZSBwYWNrYWdlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfUkVMT0NBVEFCTEVfSAotI2RlZmluZSBfUkVMT0NBVEFCTEVfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogVGhpcyBjYW4gYmUgZW5hYmxlZCB0aHJvdWdoIHRoZSBjb25maWd1cmUgLS1lbmFibGUtcmVsb2NhdGFibGUgb3B0aW9uLiAgKi8KLSNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKLQotLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQotICAgdGhpcyBpcyBhIHByaXZhdGUgLmggZmlsZSwgd2UgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0gICBpbiBhbnkgY2FzZS4gICovCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKLSMgZGVmaW5lIFJFTE9DQVRBQkxFX0RMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNlbHNlCi0jIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQKLSNlbmRpZgotCi0vKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGUgcGFja2FnZS4KLSAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4Ci0gICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAotICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgotICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KLWV4dGVybiBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgdm9pZAotICAgICAgIHNldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCi0JCQkgICAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeCk7Ci0KLS8qIFJldHVybnMgdGhlIHBhdGhuYW1lLCByZWxvY2F0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbgotICAgZGlyZWN0b3J5LiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICogcmVsb2NhdGUgKGNvbnN0IGNoYXIgKnBhdGhuYW1lKTsKLQotLyogTWVtb3J5IG1hbmFnZW1lbnQ6IHJlbG9jYXRlKCkgbGVha3MgbWVtb3J5LCBiZWNhdXNlIGl0IGhhcyB0byBjb25zdHJ1Y3QKLSAgIGEgZnJlc2ggcGF0aG5hbWUuICBJZiB0aGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlIHlvdXIgcHJvZ3JhbSBjYWxscwotICAgcmVsb2NhdGUoKSBmcmVxdWVudGx5LCB0aGluayBhYm91dCBjYWNoaW5nIHRoZSByZXN1bHQuICAqLwotCi0vKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKLSAgIENvbXB1dGVzIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXgsIGJhc2VkIG9uIHRoZSBvcmlnaW5hbAotICAgaW5zdGFsbGF0aW9uIHByZWZpeCwgdGhlIG9yaWdpbmFsIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYSBwYXJ0aWN1bGFyCi0gICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqIGNvbXB1dGVfY3Vycl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCwKLQkJCQkJIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbGRpciwKLQkJCQkJIGNvbnN0IGNoYXIgKmN1cnJfcGF0aG5hbWUpOwotCi0jZWxzZQotCi0vKiBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhlIGhhcmR3aXJlZCBwYXRobmFtZXMuICAqLwotI2RlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQotCi0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX1JFTE9DQVRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC90ZXh0ZG9tYWluLmMgYi91bml4L2ludGwvdGV4dGRvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzQ1YTg0Li4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC90ZXh0ZG9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRleHRkb21haW4oMykgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotI2VuZGlmCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotI2lmZGVmIF9MSUJDCi0vKiBXZSBoYXZlIHRvIGhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotI2Vsc2UKLS8qIFByb3ZpZGUgZHVtbXkgaW1wbGVtZW50YXRpb24gaWYgdGhpcyBpcyBvdXRzaWRlIGdsaWJjLiAgKi8KLSMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lKENMQVNTLCBOQU1FKQotIyBkZWZpbmUgX19saWJjX3J3bG9ja193cmxvY2soTkFNRSkKLSMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCi0jZW5kaWYKLQotLyogVGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhbG9uZSBsaWJpbnRsLmEgbXVzdCBoYXZlIGRpZmZlcmVudAotICAgbmFtZXMgdGhhbiB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIEdOVSBsaWJjLCBvdGhlcndpc2UgcHJvZ3JhbXMKLSAgIHVzaW5nIGxpYmludGwuYSBjYW5ub3QgYmUgbGlua2VkIHN0YXRpY2FsbHkuICAqLwotI2lmICFkZWZpbmVkIF9MSUJDCi0jIGRlZmluZSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4KLSMgZGVmaW5lIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGxpYmludGxfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLS8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBURVhURE9NQUlOIF9fdGV4dGRvbWFpbgotIyBpZm5kZWYgc3RyZHVwCi0jICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLSMgZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBURVhURE9NQUlOIGxpYmludGxfdGV4dGRvbWFpbgotI2VuZGlmCi0KLS8qIExvY2sgdmFyaWFibGUgdG8gcHJvdGVjdCB0aGUgZ2xvYmFsIGRhdGEgaW4gdGhlIGdldHRleHQgaW1wbGVtZW50YXRpb24uICAqLwotX19saWJjX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1jaGFyICoKLVRFWFRET01BSU4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCi17Ci0gIGNoYXIgKm5ld19kb21haW47Ci0gIGNoYXIgKm9sZF9kb21haW47Ci0KLSAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIF9fbGliY19yd2xvY2tfd3Jsb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0KLSAgb2xkX2RvbWFpbiA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIC8qIElmIGRvbWFpbiBuYW1lIGlzIHRoZSBudWxsIHN0cmluZyBzZXQgdG8gZGVmYXVsdCBkb21haW4gIm1lc3NhZ2VzIi4gICovCi0gIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcKLSAgICAgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pID09IDApCi0gICAgewotICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKLSAgICAgIG5ld19kb21haW4gPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoZG9tYWlubmFtZSwgb2xkX2RvbWFpbikgPT0gMCkKLSAgICAvKiBUaGlzIGNhbiBoYXBwZW4gYW5kIHBlb3BsZSB3aWxsIHVzZSBpdCB0byBzaWduYWwgdGhhdCBzb21lCi0gICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hhbmdlZC4gICovCi0gICAgbmV3X2RvbWFpbiA9IG9sZF9kb21haW47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgZm9sbG93aW5nIG1hbGxvYyBmYWlscyBgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4nCi0JIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQotCSBhcmUgb3V0IG9mIGNvcmUuICAqLwotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotICAgICAgbmV3X2RvbWFpbiA9IHN0cmR1cCAoZG9tYWlubmFtZSk7Ci0jZWxzZQotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgICAgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCi0JbWVtY3B5IChuZXdfZG9tYWluLCBkb21haW5uYW1lLCBsZW4pOwotI2VuZGlmCi0KLSAgICAgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCi0JX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBuZXdfZG9tYWluOwotICAgIH0KLQotICAvKiBXZSB1c2UgdGhpcyBwb3NzaWJpbGl0eSB0byBzaWduYWwgYSBjaGFuZ2Ugb2YgdGhlIGxvYWRlZCBjYXRhbG9ncwotICAgICBzaW5jZSB0aGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBjYXNlIGFuZCB0aGVyZSBpcyBubyBvdGhlciBlYXN5IHdlCi0gICAgIHRvIGRvIGl0LiAgRG8gaXQgb25seSB3aGVuIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KLSAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICArK19ubF9tc2dfY2F0X2NudHI7Ci0KLSAgICAgIGlmIChvbGRfZG9tYWluICE9IG5ld19kb21haW4gJiYgb2xkX2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKLQlmcmVlIChvbGRfZG9tYWluKTsKLSAgICB9Ci0KLSAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLQotICByZXR1cm4gbmV3X2RvbWFpbjsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fdGV4dGRvbWFpbiwgdGV4dGRvbWFpbik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC92YXNucHJpbnRmLmMgYi91bml4L2ludGwvdmFzbnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYyMjgyLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC92YXNucHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODcgKzAsMCBAQAotLyogdnNwcmludGYgd2l0aCBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLS8qIFRlbGwgZ2xpYmMncyA8c3RkaW8uaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc25wcmludGYoKS4KLSAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQotICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotI2lmbmRlZiBfR05VX1NPVVJDRQotIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0jaWZuZGVmIElOX0xJQklOVEwKLSMgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jZW5kaWYKLQotLyogU3BlY2lmaWNhdGlvbi4gICovCi0jaWYgV0lERV9DSEFSX1ZFUlNJT04KLSMgaW5jbHVkZSAidmFzbndwcmludGYuaCIKLSNlbHNlCi0jIGluY2x1ZGUgInZhc25wcmludGYuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4JLyogc25wcmludGYoKSwgc3ByaW50ZigpICovCi0jaW5jbHVkZSA8c3RkbGliLmg+CS8qIGFib3J0KCksIG1hbGxvYygpLCByZWFsbG9jKCksIGZyZWUoKSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBtZW1jcHkoKSwgc3RybGVuKCkgKi8KLSNpbmNsdWRlIDxlcnJuby5oPgkvKiBlcnJubyAqLwotI2luY2x1ZGUgPGxpbWl0cy5oPgkvKiBDSEFSX0JJVCAqLwotI2luY2x1ZGUgPGZsb2F0Lmg+CS8qIERCTF9NQVhfRVhQLCBMREJMX01BWF9FWFAgKi8KLSNpZiBXSURFX0NIQVJfVkVSU0lPTgotIyBpbmNsdWRlICJ3cHJpbnRmLXBhcnNlLmgiCi0jZWxzZQotIyBpbmNsdWRlICJwcmludGYtcGFyc2UuaCIKLSNlbmRpZgotCi0vKiBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuICAqLwotI2luY2x1ZGUgInhzaXplLmgiCi0KLSNpZmRlZiBIQVZFX1dDSEFSX1QKLSMgaWZkZWYgSEFWRV9XQ1NMRU4KLSMgIGRlZmluZSBsb2NhbF93Y3NsZW4gd2NzbGVuCi0jIGVsc2UKLSAgIC8qIFNvbGFyaXMgMi41LjEgaGFzIHdjc2xlbigpIGluIGEgc2VwYXJhdGUgbGlicmFyeSBsaWJ3LnNvLiBUbyBhdm9pZAotICAgICAgYSBkZXBlbmRlbmN5IHRvd2FyZHMgdGhpcyBsaWJyYXJ5LCBoZXJlIGlzIGEgbG9jYWwgc3Vic3RpdHV0ZS4KLSAgICAgIERlZmluZSB0aGlzIHN1YnN0aXR1dGUgb25seSBvbmNlLCBldmVuIGlmIHRoaXMgZmlsZSBpcyBpbmNsdWRlZAotICAgICAgdHdpY2UgaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdC4gICovCi0jICBpZm5kZWYgbG9jYWxfd2NzbGVuX2RlZmluZWQKLSMgICBkZWZpbmUgbG9jYWxfd2NzbGVuX2RlZmluZWQgMQotc3RhdGljIHNpemVfdAotbG9jYWxfd2NzbGVuIChjb25zdCB3Y2hhcl90ICpzKQotewotICBjb25zdCB3Y2hhcl90ICpwdHI7Ci0KLSAgZm9yIChwdHIgPSBzOyAqcHRyICE9ICh3Y2hhcl90KSAwOyBwdHIrKykKLSAgICA7Ci0gIHJldHVybiBwdHIgLSBzOwotfQotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgV0lERV9DSEFSX1ZFUlNJT04KLSMgZGVmaW5lIFZBU05QUklOVEYgdmFzbndwcmludGYKLSMgZGVmaW5lIENIQVJfVCB3Y2hhcl90Ci0jIGRlZmluZSBESVJFQ1RJVkUgd2NoYXJfdF9kaXJlY3RpdmUKLSMgZGVmaW5lIERJUkVDVElWRVMgd2NoYXJfdF9kaXJlY3RpdmVzCi0jIGRlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQotIyBkZWZpbmUgVVNFX1NOUFJJTlRGIDEKLSMgaWYgSEFWRV9ERUNMX19TTldQUklOVEYKLSAgIC8qIE9uIFdpbmRvd3MsIHRoZSBmdW5jdGlvbiBzd3ByaW50ZigpIGhhcyBhIGRpZmZlcmVudCBzaWduYXR1cmUgdGhhbgotICAgICAgb24gVW5peDsgd2UgdXNlIHRoZSBfc253cHJpbnRmKCkgZnVuY3Rpb24gaW5zdGVhZC4gICovCi0jICBkZWZpbmUgU05QUklOVEYgX3Nud3ByaW50ZgotIyBlbHNlCi0gICAvKiBVbml4LiAgKi8KLSMgIGRlZmluZSBTTlBSSU5URiBzd3ByaW50ZgotIyBlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIFZBU05QUklOVEYgdmFzbnByaW50ZgotIyBkZWZpbmUgQ0hBUl9UIGNoYXIKLSMgZGVmaW5lIERJUkVDVElWRSBjaGFyX2RpcmVjdGl2ZQotIyBkZWZpbmUgRElSRUNUSVZFUyBjaGFyX2RpcmVjdGl2ZXMKLSMgZGVmaW5lIFBSSU5URl9QQVJTRSBwcmludGZfcGFyc2UKLSMgZGVmaW5lIFVTRV9TTlBSSU5URiAoSEFWRV9ERUNMX19TTlBSSU5URiB8fCBIQVZFX1NOUFJJTlRGKQotIyBpZiBIQVZFX0RFQ0xfX1NOUFJJTlRGCi0gICAvKiBXaW5kb3dzLiAgKi8KLSMgIGRlZmluZSBTTlBSSU5URiBfc25wcmludGYKLSMgZWxzZQotICAgLyogVW5peC4gICovCi0jICBkZWZpbmUgU05QUklOVEYgc25wcmludGYKLSMgZW5kaWYKLSNlbmRpZgotCi1DSEFSX1QgKgotVkFTTlBSSU5URiAoQ0hBUl9UICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3QgQ0hBUl9UICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgRElSRUNUSVZFUyBkOwotICBhcmd1bWVudHMgYTsKLQotICBpZiAoUFJJTlRGX1BBUlNFIChmb3JtYXQsICZkLCAmYSkgPCAwKQotICAgIHsKLSAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jZGVmaW5lIENMRUFOVVAoKSBcCi0gIGZyZWUgKGQuZGlyKTsJCQkJCQkJCVwKLSAgaWYgKGEuYXJnKQkJCQkJCQkJXAotICAgIGZyZWUgKGEuYXJnKTsKLQotICBpZiAocHJpbnRmX2ZldGNoYXJncyAoYXJncywgJmEpIDwgMCkKLSAgICB7Ci0gICAgICBDTEVBTlVQICgpOwotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgewotICAgIHNpemVfdCBidWZfbmVlZGVkbGVuZ3RoOwotICAgIENIQVJfVCAqYnVmOwotICAgIENIQVJfVCAqYnVmX21hbGxvY2VkOwotICAgIGNvbnN0IENIQVJfVCAqY3A7Ci0gICAgc2l6ZV90IGk7Ci0gICAgRElSRUNUSVZFICpkcDsKLSAgICAvKiBPdXRwdXQgc3RyaW5nIGFjY3VtdWxhdG9yLiAgKi8KLSAgICBDSEFSX1QgKnJlc3VsdDsKLSAgICBzaXplX3QgYWxsb2NhdGVkOwotICAgIHNpemVfdCBsZW5ndGg7Ci0KLSAgICAvKiBBbGxvY2F0ZSBhIHNtYWxsIGJ1ZmZlciB0aGF0IHdpbGwgaG9sZCBhIGRpcmVjdGl2ZSBwYXNzZWQgdG8KLSAgICAgICBzcHJpbnRmIG9yIHNucHJpbnRmLiAgKi8KLSAgICBidWZfbmVlZGVkbGVuZ3RoID0KLSAgICAgIHhzdW00ICg3LCBkLm1heF93aWR0aF9sZW5ndGgsIGQubWF4X3ByZWNpc2lvbl9sZW5ndGgsIDYpOwotI2lmIEhBVkVfQUxMT0NBCi0gICAgaWYgKGJ1Zl9uZWVkZWRsZW5ndGggPCA0MDAwIC8gc2l6ZW9mIChDSEFSX1QpKQotICAgICAgewotCWJ1ZiA9IChDSEFSX1QgKikgYWxsb2NhIChidWZfbmVlZGVkbGVuZ3RoICogc2l6ZW9mIChDSEFSX1QpKTsKLQlidWZfbWFsbG9jZWQgPSBOVUxMOwotICAgICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotCXNpemVfdCBidWZfbWVtc2l6ZSA9IHh0aW1lcyAoYnVmX25lZWRlZGxlbmd0aCwgc2l6ZW9mIChDSEFSX1QpKTsKLQlpZiAoc2l6ZV9vdmVyZmxvd19wIChidWZfbWVtc2l6ZSkpCi0JICBnb3RvIG91dF9vZl9tZW1vcnlfMTsKLQlidWYgPSAoQ0hBUl9UICopIG1hbGxvYyAoYnVmX21lbXNpemUpOwotCWlmIChidWYgPT0gTlVMTCkKLQkgIGdvdG8gb3V0X29mX21lbW9yeV8xOwotCWJ1Zl9tYWxsb2NlZCA9IGJ1ZjsKLSAgICAgIH0KLQotICAgIGlmIChyZXN1bHRidWYgIT0gTlVMTCkKLSAgICAgIHsKLQlyZXN1bHQgPSByZXN1bHRidWY7Ci0JYWxsb2NhdGVkID0gKmxlbmd0aHA7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCXJlc3VsdCA9IE5VTEw7Ci0JYWxsb2NhdGVkID0gMDsKLSAgICAgIH0KLSAgICBsZW5ndGggPSAwOwotICAgIC8qIEludmFyaWFudHM6Ci0gICAgICAgcmVzdWx0IGlzIGVpdGhlciA9PSByZXN1bHRidWYgb3IgPT0gTlVMTCBvciBtYWxsb2MtYWxsb2NhdGVkLgotICAgICAgIElmIGxlbmd0aCA+IDAsIHRoZW4gcmVzdWx0ICE9IE5VTEwuICAqLwotCi0gICAgLyogRW5zdXJlcyB0aGF0IGFsbG9jYXRlZCA+PSBuZWVkZWQuICBBYm9ydHMgdGhyb3VnaCBhIGp1bXAgdG8KLSAgICAgICBvdXRfb2ZfbWVtb3J5IGlmIG5lZWRlZCBpcyBTSVpFX01BWCBvciBvdGhlcndpc2UgdG9vIGJpZy4gICovCi0jZGVmaW5lIEVOU1VSRV9BTExPQ0FUSU9OKG5lZWRlZCkgXAotICAgIGlmICgobmVlZGVkKSA+IGFsbG9jYXRlZCkJCQkJCQkgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgIFwKLQlzaXplX3QgbWVtb3J5X3NpemU7CQkJCQkJICAgICBcCi0JQ0hBUl9UICptZW1vcnk7CQkJCQkJCSAgICAgXAotCQkJCQkJCQkJICAgICBcCi0JYWxsb2NhdGVkID0gKGFsbG9jYXRlZCA+IDAgPyB4dGltZXMgKGFsbG9jYXRlZCwgMikgOiAxMik7CSAgICAgXAotCWlmICgobmVlZGVkKSA+IGFsbG9jYXRlZCkJCQkJCSAgICAgXAotCSAgYWxsb2NhdGVkID0gKG5lZWRlZCk7CQkJCQkJICAgICBcCi0JbWVtb3J5X3NpemUgPSB4dGltZXMgKGFsbG9jYXRlZCwgc2l6ZW9mIChDSEFSX1QpKTsJCSAgICAgXAotCWlmIChzaXplX292ZXJmbG93X3AgKG1lbW9yeV9zaXplKSkJCQkJICAgICBcCi0JICBnb3RvIG91dF9vZl9tZW1vcnk7CQkJCQkJICAgICBcCi0JaWYgKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpCQkJICAgICBcCi0JICBtZW1vcnkgPSAoQ0hBUl9UICopIG1hbGxvYyAobWVtb3J5X3NpemUpOwkJCSAgICAgXAotCWVsc2UJCQkJCQkJCSAgICAgXAotCSAgbWVtb3J5ID0gKENIQVJfVCAqKSByZWFsbG9jIChyZXN1bHQsIG1lbW9yeV9zaXplKTsJCSAgICAgXAotCWlmIChtZW1vcnkgPT0gTlVMTCkJCQkJCQkgICAgIFwKLQkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQkgICAgIFwKLQlpZiAocmVzdWx0ID09IHJlc3VsdGJ1ZiAmJiBsZW5ndGggPiAwKQkJCQkgICAgIFwKLQkgIG1lbWNweSAobWVtb3J5LCByZXN1bHQsIGxlbmd0aCAqIHNpemVvZiAoQ0hBUl9UKSk7CQkgICAgIFwKLQlyZXN1bHQgPSBtZW1vcnk7CQkJCQkJICAgICBcCi0gICAgICB9Ci0KLSAgICBmb3IgKGNwID0gZm9ybWF0LCBpID0gMCwgZHAgPSAmZC5kaXJbMF07IDsgY3AgPSBkcC0+ZGlyX2VuZCwgaSsrLCBkcCsrKQotICAgICAgewotCWlmIChjcCAhPSBkcC0+ZGlyX3N0YXJ0KQotCSAgewotCSAgICBzaXplX3QgbiA9IGRwLT5kaXJfc3RhcnQgLSBjcDsKLQkgICAgc2l6ZV90IGF1Z21lbnRlZF9sZW5ndGggPSB4c3VtIChsZW5ndGgsIG4pOwotCi0JICAgIEVOU1VSRV9BTExPQ0FUSU9OIChhdWdtZW50ZWRfbGVuZ3RoKTsKLQkgICAgbWVtY3B5IChyZXN1bHQgKyBsZW5ndGgsIGNwLCBuICogc2l6ZW9mIChDSEFSX1QpKTsKLQkgICAgbGVuZ3RoID0gYXVnbWVudGVkX2xlbmd0aDsKLQkgIH0KLQlpZiAoaSA9PSBkLmNvdW50KQotCSAgYnJlYWs7Ci0KLQkvKiBFeGVjdXRlIGEgc2luZ2xlIGRpcmVjdGl2ZS4gICovCi0JaWYgKGRwLT5jb252ZXJzaW9uID09ICclJykKLQkgIHsKLQkgICAgc2l6ZV90IGF1Z21lbnRlZF9sZW5ndGg7Ci0KLQkgICAgaWYgKCEoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGF1Z21lbnRlZF9sZW5ndGggPSB4c3VtIChsZW5ndGgsIDEpOwotCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoYXVnbWVudGVkX2xlbmd0aCk7Ci0JICAgIHJlc3VsdFtsZW5ndGhdID0gJyUnOwotCSAgICBsZW5ndGggPSBhdWdtZW50ZWRfbGVuZ3RoOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKCEoZHAtPmFyZ19pbmRleCAhPSBBUkdfTk9ORSkpCi0JICAgICAgYWJvcnQgKCk7Ci0KLQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICduJykKLQkgICAgICB7Ci0JCXN3aXRjaCAoYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSkKLQkJICB7Ci0JCSAgY2FzZSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI6Ci0JCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X3NjaGFyX3BvaW50ZXIgPSBsZW5ndGg7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjoKLQkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfc2hvcnRfcG9pbnRlciA9IGxlbmd0aDsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjoKLQkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfaW50X3BvaW50ZXIgPSBsZW5ndGg7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOgotCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9sb25naW50X3BvaW50ZXIgPSBsZW5ndGg7Ci0JCSAgICBicmVhazsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQkgIGNhc2UgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOgotCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyID0gbGVuZ3RoOwotCQkgICAgYnJlYWs7Ci0jZW5kaWYKLQkJICBkZWZhdWx0OgotCQkgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXJnX3R5cGUgdHlwZSA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGU7Ci0JCUNIQVJfVCAqcDsKLQkJdW5zaWduZWQgaW50IHByZWZpeF9jb3VudDsKLQkJaW50IHByZWZpeGVzWzJdOwotI2lmICFVU0VfU05QUklOVEYKLQkJc2l6ZV90IHRtcF9sZW5ndGg7Ci0JCUNIQVJfVCB0bXBidWZbNzAwXTsKLQkJQ0hBUl9UICp0bXA7Ci0KLQkJLyogQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZSBmb3IgY2FsbGluZwotCQkgICBzcHJpbnRmLiAgKi8KLQkJewotCQkgIHNpemVfdCB3aWR0aDsKLQkJICBzaXplX3QgcHJlY2lzaW9uOwotCi0JCSAgd2lkdGggPSAwOwotCQkgIGlmIChkcC0+d2lkdGhfc3RhcnQgIT0gZHAtPndpZHRoX2VuZCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0JCQl7Ci0JCQkgIGludCBhcmc7Ci0KLQkJCSAgaWYgKCEoYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0JCQkgICAgYWJvcnQgKCk7Ci0JCQkgIGFyZyA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0JCQkgIHdpZHRoID0gKGFyZyA8IDAgPyAodW5zaWduZWQgaW50KSAoLWFyZykgOiBhcmcpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGNvbnN0IENIQVJfVCAqZGlnaXRwID0gZHAtPndpZHRoX3N0YXJ0OwotCi0JCQkgIGRvCi0JCQkgICAgd2lkdGggPSB4c3VtICh4dGltZXMgKHdpZHRoLCAxMCksICpkaWdpdHArKyAtICcwJyk7Ci0JCQkgIHdoaWxlIChkaWdpdHAgIT0gZHAtPndpZHRoX2VuZCk7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBwcmVjaXNpb24gPSA2OwotCQkgIGlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQotCQkgICAgewotCQkgICAgICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0JCQl7Ci0JCQkgIGludCBhcmc7Ci0KLQkJCSAgaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotCQkJICAgIGFib3J0ICgpOwotCQkJICBhcmcgPSBhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0uYS5hX2ludDsKLQkJCSAgcHJlY2lzaW9uID0gKGFyZyA8IDAgPyAwIDogYXJnKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjb25zdCBDSEFSX1QgKmRpZ2l0cCA9IGRwLT5wcmVjaXNpb25fc3RhcnQgKyAxOwotCi0JCQkgIHByZWNpc2lvbiA9IDA7Ci0JCQkgIGRvCi0JCQkgICAgcHJlY2lzaW9uID0geHN1bSAoeHRpbWVzIChwcmVjaXNpb24sIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLQkJCSAgd2hpbGUgKGRpZ2l0cCAhPSBkcC0+cHJlY2lzaW9uX2VuZCk7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBzd2l0Y2ggKGRwLT5jb252ZXJzaW9uKQotCQkgICAgewotCi0JCSAgICBjYXNlICdkJzogY2FzZSAnaSc6IGNhc2UgJ3UnOgotIyBpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCi0JCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCi0JCQkJCSApCi0JCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLwotCQkgICAgICBlbHNlCi0jIGVuZGlmCi0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAotCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLwotCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLwotCQkJCQkgKQotCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KLQkJICAgICAgZWxzZQotCQkJdG1wX2xlbmd0aCA9Ci0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAotCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLwotCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLwotCQkJCQkgKQotCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ28nOgotIyBpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCi0JCSAgICAgIGVsc2UKLSMgZW5kaWYKLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKLQkJCXRtcF9sZW5ndGggPQotCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCi0JCSAgICAgIGVsc2UKLQkJCXRtcF9sZW5ndGggPQotCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKLQkJCQkJICAqIDAuMzMzMzM0IC8qIGJpbmFyeSAtPiBvY3RhbCAqLwotCQkJCQkgKQotCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3gnOiBjYXNlICdYJzoKLSMgaWZkZWYgSEFWRV9MT05HX0xPTkcKLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQotCQkJdG1wX2xlbmd0aCA9Ci0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykgKiBDSEFSX0JJVAotCQkJCQkgICogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCQkgICsgMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduIG9yIGFsdGVybmF0ZSBmb3JtICovCi0JCSAgICAgIGVsc2UKLSMgZW5kaWYKLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKLQkJCXRtcF9sZW5ndGggPQotCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLwotCQkJCQkgKQotCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJCSAgKyAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0gKi8KLQkJICAgICAgZWxzZQotCQkJdG1wX2xlbmd0aCA9Ci0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAotCQkJCQkgICogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCQkgICsgMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduIG9yIGFsdGVybmF0ZSBmb3JtICovCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdmJzogY2FzZSAnRic6Ci0jIGlmZGVmIEhBVkVfTE9OR19ET1VCTEUKLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFKQotCQkJdG1wX2xlbmd0aCA9Ci0JCQkgICh1bnNpZ25lZCBpbnQpIChMREJMX01BWF9FWFAKLQkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KLQkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KLQkJCQkJICkKLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCQkgICsgMTA7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLwotCQkgICAgICBlbHNlCi0jIGVuZGlmCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKERCTF9NQVhfRVhQCi0JCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCi0JCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCi0JCQkJCSApCi0JCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQkJICArIDEwOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIHByZWNpc2lvbik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdlJzogY2FzZSAnRSc6IGNhc2UgJ2cnOiBjYXNlICdHJzoKLQkJICAgIGNhc2UgJ2EnOiBjYXNlICdBJzoKLQkJICAgICAgdG1wX2xlbmd0aCA9Ci0JCQkxMjsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCwgZXhwb25lbnQgZXRjLiAqLwotCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgcHJlY2lzaW9uKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2MnOgotIyBpZiBkZWZpbmVkIEhBVkVfV0lOVF9UICYmICFXSURFX0NIQVJfVkVSU0lPTgotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX1dJREVfQ0hBUikKLQkJCXRtcF9sZW5ndGggPSBNQl9DVVJfTUFYOwotCQkgICAgICBlbHNlCi0jIGVuZGlmCi0JCQl0bXBfbGVuZ3RoID0gMTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3MnOgotIyBpZmRlZiBIQVZFX1dDSEFSX1QKLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9XSURFX1NUUklORykKLQkJCXsKLQkJCSAgdG1wX2xlbmd0aCA9Ci0JCQkgICAgbG9jYWxfd2NzbGVuIChhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9zdHJpbmcpOwotCi0jICBpZiAhV0lERV9DSEFSX1ZFUlNJT04KLQkJCSAgdG1wX2xlbmd0aCA9IHh0aW1lcyAodG1wX2xlbmd0aCwgTUJfQ1VSX01BWCk7Ci0jICBlbmRpZgotCQkJfQotCQkgICAgICBlbHNlCi0jIGVuZGlmCi0JCQl0bXBfbGVuZ3RoID0gc3RybGVuIChhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc3RyaW5nKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgICB0bXBfbGVuZ3RoID0KLQkJCSh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHZvaWQgKikgKiBDSEFSX0JJVAotCQkJCQkqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCi0JCQkJICAgICAgICkKLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCQkgICsgMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyAweCAqLwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpZiAodG1wX2xlbmd0aCA8IHdpZHRoKQotCQkgICAgdG1wX2xlbmd0aCA9IHdpZHRoOwotCi0JCSAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDEpOyAvKiBhY2NvdW50IGZvciB0cmFpbGluZyBOVUwgKi8KLQkJfQotCi0JCWlmICh0bXBfbGVuZ3RoIDw9IHNpemVvZiAodG1wYnVmKSAvIHNpemVvZiAoQ0hBUl9UKSkKLQkJICB0bXAgPSB0bXBidWY7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBzaXplX3QgdG1wX21lbXNpemUgPSB4dGltZXMgKHRtcF9sZW5ndGgsIHNpemVvZiAoQ0hBUl9UKSk7Ci0KLQkJICAgIGlmIChzaXplX292ZXJmbG93X3AgKHRtcF9tZW1zaXplKSkKLQkJICAgICAgLyogT3ZlcmZsb3csIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeS4gICovCi0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLQkJICAgIHRtcCA9IChDSEFSX1QgKikgbWFsbG9jICh0bXBfbWVtc2l6ZSk7Ci0JCSAgICBpZiAodG1wID09IE5VTEwpCi0JCSAgICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLwotCQkgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0JCSAgfQotI2VuZGlmCi0KLQkJLyogQ29uc3RydWN0IHRoZSBmb3JtYXQgc3RyaW5nIGZvciBjYWxsaW5nIHNucHJpbnRmIG9yCi0JCSAgIHNwcmludGYuICAqLwotCQlwID0gYnVmOwotCQkqcCsrID0gJyUnOwotCQlpZiAoZHAtPmZsYWdzICYgRkxBR19HUk9VUCkKLQkJICAqcCsrID0gJ1wnJzsKLQkJaWYgKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkKLQkJICAqcCsrID0gJy0nOwotCQlpZiAoZHAtPmZsYWdzICYgRkxBR19TSE9XU0lHTikKLQkJICAqcCsrID0gJysnOwotCQlpZiAoZHAtPmZsYWdzICYgRkxBR19TUEFDRSkKLQkJICAqcCsrID0gJyAnOwotCQlpZiAoZHAtPmZsYWdzICYgRkxBR19BTFQpCi0JCSAgKnArKyA9ICcjJzsKLQkJaWYgKGRwLT5mbGFncyAmIEZMQUdfWkVSTykKLQkJICAqcCsrID0gJzAnOwotCQlpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0JCSAgewotCQkgICAgc2l6ZV90IG4gPSBkcC0+d2lkdGhfZW5kIC0gZHAtPndpZHRoX3N0YXJ0OwotCQkgICAgbWVtY3B5IChwLCBkcC0+d2lkdGhfc3RhcnQsIG4gKiBzaXplb2YgKENIQVJfVCkpOwotCQkgICAgcCArPSBuOwotCQkgIH0KLQkJaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0JCSAgewotCQkgICAgc2l6ZV90IG4gPSBkcC0+cHJlY2lzaW9uX2VuZCAtIGRwLT5wcmVjaXNpb25fc3RhcnQ7Ci0JCSAgICBtZW1jcHkgKHAsIGRwLT5wcmVjaXNpb25fc3RhcnQsIG4gKiBzaXplb2YgKENIQVJfVCkpOwotCQkgICAgcCArPSBuOwotCQkgIH0KLQotCQlzd2l0Y2ggKHR5cGUpCi0JCSAgewotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCSAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgotCQkgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6Ci0JCSAgICAqcCsrID0gJ2wnOwotCQkgICAgLypGQUxMVEhST1VHSCovCi0jZW5kaWYKLQkJICBjYXNlIFRZUEVfTE9OR0lOVDoKLQkJICBjYXNlIFRZUEVfVUxPTkdJTlQ6Ci0jaWZkZWYgSEFWRV9XSU5UX1QKLQkJICBjYXNlIFRZUEVfV0lERV9DSEFSOgotI2VuZGlmCi0jaWZkZWYgSEFWRV9XQ0hBUl9UCi0JCSAgY2FzZSBUWVBFX1dJREVfU1RSSU5HOgotI2VuZGlmCi0JCSAgICAqcCsrID0gJ2wnOwotCQkgICAgYnJlYWs7Ci0jaWZkZWYgSEFWRV9MT05HX0RPVUJMRQotCQkgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgotCQkgICAgKnArKyA9ICdMJzsKLQkJICAgIGJyZWFrOwotI2VuZGlmCi0JCSAgZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJKnAgPSBkcC0+Y29udmVyc2lvbjsKLSNpZiBVU0VfU05QUklOVEYKLQkJcFsxXSA9ICclJzsKLQkJcFsyXSA9ICduJzsKLQkJcFszXSA9ICdcMCc7Ci0jZWxzZQotCQlwWzFdID0gJ1wwJzsKLSNlbmRpZgotCi0JCS8qIENvbnN0cnVjdCB0aGUgYXJndW1lbnRzIGZvciBjYWxsaW5nIHNucHJpbnRmIG9yIHNwcmludGYuICAqLwotCQlwcmVmaXhfY291bnQgPSAwOwotCQlpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLQkJICB7Ci0JCSAgICBpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICBwcmVmaXhlc1twcmVmaXhfY291bnQrK10gPSBhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS5hLmFfaW50OwotCQkgIH0KLQkJaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQotCQkgIHsKLQkJICAgIGlmICghKGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICBwcmVmaXhlc1twcmVmaXhfY291bnQrK10gPSBhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0uYS5hX2ludDsKLQkJICB9Ci0KLSNpZiBVU0VfU05QUklOVEYKLQkJLyogUHJlcGFyZSBjaGVja2luZyB3aGV0aGVyIHNucHJpbnRmIHJldHVybnMgdGhlIGNvdW50Ci0JCSAgIHZpYSAlbi4gICovCi0JCUVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIDEpKTsKLQkJcmVzdWx0W2xlbmd0aF0gPSAnXDAnOwotI2VuZGlmCi0KLQkJZm9yICg7OykKLQkJICB7Ci0JCSAgICBzaXplX3QgbWF4bGVuOwotCQkgICAgaW50IGNvdW50OwotCQkgICAgaW50IHJldGNvdW50OwotCi0JCSAgICBtYXhsZW4gPSBhbGxvY2F0ZWQgLSBsZW5ndGg7Ci0JCSAgICBjb3VudCA9IC0xOwotCQkgICAgcmV0Y291bnQgPSAwOwotCi0jaWYgVVNFX1NOUFJJTlRGCi0jIGRlZmluZSBTTlBSSU5URl9CVUYoYXJnKSBcCi0JCSAgICBzd2l0Y2ggKHByZWZpeF9jb3VudCkJCQkJICAgIFwKLQkJICAgICAgewkJCQkJCQkgICAgXAotCQkgICAgICBjYXNlIDA6CQkJCQkJICAgIFwKLQkJCXJldGNvdW50ID0gU05QUklOVEYgKHJlc3VsdCArIGxlbmd0aCwgbWF4bGVuLCBidWYsICBcCi0JCQkJCSAgICAgYXJnLCAmY291bnQpOwkJICAgIFwKLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0JCSAgICAgIGNhc2UgMToJCQkJCQkgICAgXAotCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKLQkJCQkJICAgICBwcmVmaXhlc1swXSwgYXJnLCAmY291bnQpOwkgICAgXAotCQkJYnJlYWs7CQkJCQkJICAgIFwKLQkJICAgICAgY2FzZSAyOgkJCQkJCSAgICBcCi0JCQlyZXRjb3VudCA9IFNOUFJJTlRGIChyZXN1bHQgKyBsZW5ndGgsIG1heGxlbiwgYnVmLCAgXAotCQkJCQkgICAgIHByZWZpeGVzWzBdLCBwcmVmaXhlc1sxXSwgYXJnLCBcCi0JCQkJCSAgICAgJmNvdW50KTsJCQkgICAgXAotCQkJYnJlYWs7CQkJCQkJICAgIFwKLQkJICAgICAgZGVmYXVsdDoJCQkJCQkgICAgXAotCQkJYWJvcnQgKCk7CQkJCQkgICAgXAotCQkgICAgICB9Ci0jZWxzZQotIyBkZWZpbmUgU05QUklOVEZfQlVGKGFyZykgXAotCQkgICAgc3dpdGNoIChwcmVmaXhfY291bnQpCQkJCSAgICBcCi0JCSAgICAgIHsJCQkJCQkJICAgIFwKLQkJICAgICAgY2FzZSAwOgkJCQkJCSAgICBcCi0JCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBhcmcpOwkJICAgIFwKLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0JCSAgICAgIGNhc2UgMToJCQkJCQkgICAgXAotCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgcHJlZml4ZXNbMF0sIGFyZyk7CSAgICBcCi0JCQlicmVhazsJCQkJCQkgICAgXAotCQkgICAgICBjYXNlIDI6CQkJCQkJICAgIFwKLQkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIHByZWZpeGVzWzBdLCBwcmVmaXhlc1sxXSxcCi0JCQkJCSBhcmcpOwkJCQkgICAgXAotCQkJYnJlYWs7CQkJCQkJICAgIFwKLQkJICAgICAgZGVmYXVsdDoJCQkJCQkgICAgXAotCQkJYWJvcnQgKCk7CQkJCQkgICAgXAotCQkgICAgICB9Ci0jZW5kaWYKLQotCQkgICAgc3dpdGNoICh0eXBlKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgVFlQRV9TQ0hBUjoKLQkJCXsKLQkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zY2hhcjsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgVFlQRV9VQ0hBUjoKLQkJCXsKLQkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91Y2hhcjsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgVFlQRV9TSE9SVDoKLQkJCXsKLQkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zaG9ydDsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgVFlQRV9VU0hPUlQ6Ci0JCQl7Ci0JCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdXNob3J0OwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX0lOVDoKLQkJCXsKLQkJCSAgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIFRZUEVfVUlOVDoKLQkJCXsKLQkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91aW50OwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX0xPTkdJTlQ6Ci0JCQl7Ci0JCQkgIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25naW50OwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX1VMT05HSU5UOgotCQkJewotCQkJICB1bnNpZ25lZCBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWxvbmdpbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JCSAgICAgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKLQkJCXsKLQkJCSAgbG9uZyBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2xvbmdpbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgotCQkJewotCQkJICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91bG9uZ2xvbmdpbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0JCSAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0JCQl7Ci0JCQkgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLSNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCi0JCSAgICAgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgotCQkJewotCQkJICBsb25nIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2RvdWJsZTsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJICAgICAgY2FzZSBUWVBFX0NIQVI6Ci0JCQl7Ci0JCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY2hhcjsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgSEFWRV9XSU5UX1QKLQkJICAgICAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKLQkJCXsKLQkJCSAgd2ludF90IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX2NoYXI7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0JCSAgICAgIGNhc2UgVFlQRV9TVFJJTkc6Ci0JCQl7Ci0JCQkgIGNvbnN0IGNoYXIgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zdHJpbmc7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotI2lmZGVmIEhBVkVfV0NIQVJfVAotCQkgICAgICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6Ci0JCQl7Ci0JCQkgIGNvbnN0IHdjaGFyX3QgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX3N0cmluZzsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJICAgICAgY2FzZSBUWVBFX1BPSU5URVI6Ci0JCQl7Ci0JCQkgIHZvaWQgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9wb2ludGVyOwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgZGVmYXVsdDoKLQkJCWFib3J0ICgpOwotCQkgICAgICB9Ci0KLSNpZiBVU0VfU05QUklOVEYKLQkJICAgIC8qIFBvcnRhYmlsaXR5OiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyBvZiBzbnByaW50ZigpCi0JCSAgICAgICBhcmUgSVNPIEMgOTkgY29tcGxpYW50LiAgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YKLQkJICAgICAgIGJ5dGVzIHRoYXQgc25wcmludGYoKSBoYXMgcHJvZHVjZWQgb3Igd291bGQgaGF2ZQotCQkgICAgICAgcHJvZHVjZWQuICAqLwotCQkgICAgaWYgKGNvdW50ID49IDApCi0JCSAgICAgIHsKLQkJCS8qIFZlcmlmeSB0aGF0IHNucHJpbnRmKCkgaGFzIE5VTC10ZXJtaW5hdGVkIGl0cwotCQkJICAgcmVzdWx0LiAgKi8KLQkJCWlmIChjb3VudCA8IG1heGxlbiAmJiByZXN1bHRbbGVuZ3RoICsgY291bnRdICE9ICdcMCcpCi0JCQkgIGFib3J0ICgpOwotCQkJLyogUG9ydGFiaWxpdHkgaGFjay4gICovCi0JCQlpZiAocmV0Y291bnQgPiBjb3VudCkKLQkJCSAgY291bnQgPSByZXRjb3VudDsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBzbnByaW50ZigpIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgJyVuJwotCQkJICAgZGlyZWN0aXZlLiAgKi8KLQkJCWlmIChwWzFdICE9ICdcMCcpCi0JCQkgIHsKLQkJCSAgICAvKiBEb24ndCB1c2UgdGhlICclbicgZGlyZWN0aXZlOyBpbnN0ZWFkLCBsb29rCi0JCQkgICAgICAgYXQgdGhlIHNucHJpbnRmKCkgcmV0dXJuIHZhbHVlLiAgKi8KLQkJCSAgICBwWzFdID0gJ1wwJzsKLQkJCSAgICBjb250aW51ZTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgLyogTG9vayBhdCB0aGUgc25wcmludGYoKSByZXR1cm4gdmFsdWUuICAqLwotCQkJICAgIGlmIChyZXRjb3VudCA8IDApCi0JCQkgICAgICB7Ci0JCQkJLyogSFAtVVggMTAuMjAgc25wcmludGYoKSBpcyBkb3VibHkgZGVmaWNpZW50OgotCQkJCSAgIEl0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgJyVuJyBkaXJlY3RpdmUsCi0JCQkJICAgKmFuZCogaXQgcmV0dXJucyAtMSAocmF0aGVyIHRoYW4gdGhlIGxlbmd0aAotCQkJCSAgIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJlcXVpcmVkKSB3aGVuIHRoZQotCQkJCSAgIGJ1ZmZlciBpcyB0b28gc21hbGwuICAqLwotCQkJCXNpemVfdCBiaWdnZXJfbmVlZCA9Ci0JCQkJICB4c3VtICh4dGltZXMgKGFsbG9jYXRlZCwgMiksIDEyKTsKLQkJCQlFTlNVUkVfQUxMT0NBVElPTiAoYmlnZ2VyX25lZWQpOwotCQkJCWNvbnRpbnVlOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIGNvdW50ID0gcmV0Y291bnQ7Ci0JCQkgIH0KLQkJICAgICAgfQotI2VuZGlmCi0KLQkJICAgIC8qIEF0dGVtcHQgdG8gaGFuZGxlIGZhaWx1cmUuICAqLwotCQkgICAgaWYgKGNvdW50IDwgMCkKLQkJICAgICAgewotCQkJaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0JCQkgIGZyZWUgKHJlc3VsdCk7Ci0JCQlpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0JCQkgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0JCQlDTEVBTlVQICgpOwotCQkJZXJybm8gPSBFSU5WQUw7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJICAgICAgfQotCi0jaWYgIVVTRV9TTlBSSU5URgotCQkgICAgaWYgKGNvdW50ID49IHRtcF9sZW5ndGgpCi0JCSAgICAgIC8qIHRtcF9sZW5ndGggd2FzIGluY29ycmVjdGx5IGNhbGN1bGF0ZWQgLSBmaXggdGhlCi0JCQkgY29kZSBhYm92ZSEgICovCi0JCSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLQkJICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIHJlc3VsdC4gICovCi0JCSAgICBpZiAoY291bnQgPj0gbWF4bGVuKQotCQkgICAgICB7Ci0JCQkvKiBOZWVkIGF0IGxlYXN0IGNvdW50IGJ5dGVzLiAgQnV0IGFsbG9jYXRlCi0JCQkgICBwcm9wb3J0aW9uYWxseSwgdG8gYXZvaWQgbG9vcGluZyBldGVybmFsbHkgaWYKLQkJCSAgIHNucHJpbnRmKCkgcmVwb3J0cyBhIHRvbyBzbWFsbCBjb3VudC4gICovCi0JCQlzaXplX3QgbiA9Ci0JCQkgIHhtYXggKHhzdW0gKGxlbmd0aCwgY291bnQpLCB4dGltZXMgKGFsbG9jYXRlZCwgMikpOwotCi0JCQlFTlNVUkVfQUxMT0NBVElPTiAobik7Ci0jaWYgVVNFX1NOUFJJTlRGCi0JCQljb250aW51ZTsKLSNlbmRpZgotCQkgICAgICB9Ci0KLSNpZiBVU0VfU05QUklOVEYKLQkJICAgIC8qIFRoZSBzbnByaW50ZigpIHJlc3VsdCBkaWQgZml0LiAgKi8KLSNlbHNlCi0JCSAgICAvKiBBcHBlbmQgdGhlIHNwcmludGYoKSByZXN1bHQuICAqLwotCQkgICAgbWVtY3B5IChyZXN1bHQgKyBsZW5ndGgsIHRtcCwgY291bnQgKiBzaXplb2YgKENIQVJfVCkpOwotCQkgICAgaWYgKHRtcCAhPSB0bXBidWYpCi0JCSAgICAgIGZyZWUgKHRtcCk7Ci0jZW5kaWYKLQotCQkgICAgbGVuZ3RoICs9IGNvdW50OwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIEFkZCB0aGUgZmluYWwgTlVMLiAgKi8KLSAgICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7Ci0gICAgcmVzdWx0W2xlbmd0aF0gPSAnXDAnOwotCi0gICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYgJiYgbGVuZ3RoICsgMSA8IGFsbG9jYXRlZCkKLSAgICAgIHsKLQkvKiBTaHJpbmsgdGhlIGFsbG9jYXRlZCBtZW1vcnkgaWYgcG9zc2libGUuICAqLwotCUNIQVJfVCAqbWVtb3J5OwotCi0JbWVtb3J5ID0gKENIQVJfVCAqKSByZWFsbG9jIChyZXN1bHQsIChsZW5ndGggKyAxKSAqIHNpemVvZiAoQ0hBUl9UKSk7Ci0JaWYgKG1lbW9yeSAhPSBOVUxMKQotCSAgcmVzdWx0ID0gbWVtb3J5OwotICAgICAgfQotCi0gICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLSAgICBDTEVBTlVQICgpOwotICAgICpsZW5ndGhwID0gbGVuZ3RoOwotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgb3V0X29mX21lbW9yeToKLSAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLSAgb3V0X29mX21lbW9yeV8xOgotICAgIENMRUFOVVAgKCk7Ci0gICAgZXJybm8gPSBFTk9NRU07Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotI3VuZGVmIFNOUFJJTlRGCi0jdW5kZWYgVVNFX1NOUFJJTlRGCi0jdW5kZWYgUFJJTlRGX1BBUlNFCi0jdW5kZWYgRElSRUNUSVZFUwotI3VuZGVmIERJUkVDVElWRQotI3VuZGVmIENIQVJfVAotI3VuZGVmIFZBU05QUklOVEYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC92YXNucHJpbnRmLmggYi91bml4L2ludGwvdmFzbnByaW50Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWYxYmMxLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC92YXNucHJpbnRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiB2c3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfVkFTTlBSSU5URl9ICi0jZGVmaW5lIF9WQVNOUFJJTlRGX0gKLQotLyogR2V0IHZhX2xpc3QuICAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0vKiBHZXQgc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCi0vKiBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGluIGdjYyB2ZXJzaW9ucyAyLjUgYW5kIGxhdGVyLiAgKi8KLSMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNSkgfHwgX19TVFJJQ1RfQU5TSV9fCi0jICBkZWZpbmUgX19hdHRyaWJ1dGVfXyhTcGVjKSAvKiBlbXB0eSAqLwotIyBlbmRpZgotLyogVGhlIF9fLXByb3RlY3RlZCB2YXJpYW50cyBvZiBgZm9ybWF0JyBhbmQgYHByaW50ZicgYXR0cmlidXRlcwotICAgYXJlIGFjY2VwdGVkIGJ5IGdjYyB2ZXJzaW9ucyAyLjYuNCAoZWZmZWN0aXZlbHkgMi43KSBhbmQgbGF0ZXIuICAqLwotIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KQotIyAgZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0Ci0jICBkZWZpbmUgX19wcmludGZfXyBwcmludGYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYJX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0gICBZb3UgY2FuIHBhc3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGluIFJFU1VMVEJVRiBhbmQgaXRzCi0gICBzaXplIGluICpMRU5HVEhQOyBvdGhlcndpc2UgeW91IHBhc3MgUkVTVUxUQlVGID0gTlVMTC4KLSAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgotICAgaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB3YXMgbmVjZXNzYXJ5KSBhbmQgc2V0ICpMRU5HVEhQIHRvIHRoZQotICAgbnVtYmVyIG9mIHJlc3VsdGluZyBieXRlcywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICBVcG9uIGVycm9yLCBzZXQKLSAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4gICovCi1leHRlcm4gY2hhciAqIGFzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotICAgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOwotZXh0ZXJuIGNoYXIgKiB2YXNucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0gICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfVkFTTlBSSU5URl9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvdmFzbndwcmludGYuaCBiL3VuaXgvaW50bC92YXNud3ByaW50Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NlZjRjLi4wMDAwMDAwCi0tLSBhL3VuaXgvaW50bC92YXNud3ByaW50Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogdnN3cHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9WQVNOV1BSSU5URl9ICi0jZGVmaW5lIF9WQVNOV1BSSU5URl9ICi0KLS8qIEdldCB2YV9saXN0LiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotLyogR2V0IHdjaGFyX3QsIHNpemVfdC4gICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBhIHN0cmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4KLSAgIFlvdSBjYW4gcGFzcyBhIHByZWFsbG9jYXRlZCBidWZmZXIgZm9yIHRoZSByZXN1bHQgaW4gUkVTVUxUQlVGIGFuZCBpdHMKLSAgIHNpemUgaW4gKkxFTkdUSFA7IG90aGVyd2lzZSB5b3UgcGFzcyBSRVNVTFRCVUYgPSBOVUxMLgotICAgSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJpbmcgKHRoaXMgbWF5IGJlID0gUkVTVUxUQlVGCi0gICBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHdhcyBuZWNlc3NhcnkpIGFuZCBzZXQgKkxFTkdUSFAgdG8gdGhlCi0gICBudW1iZXIgb2YgcmVzdWx0aW5nIGJ5dGVzLCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gIFVwb24gZXJyb3IsIHNldAotICAgZXJybm8gYW5kIHJldHVybiBOVUxMLiAgKi8KLWV4dGVybiB3Y2hhcl90ICogYXNud3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKTsKLWV4dGVybiB3Y2hhcl90ICogdmFzbndwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfVkFTTldQUklOVEZfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3dwcmludGYtcGFyc2UuaCBiL3VuaXgvaW50bC93cHJpbnRmLXBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTJjZmMuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL3dwcmludGYtcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qIFBhcnNlIHByaW50ZiBmb3JtYXQgc3RyaW5nLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9XUFJJTlRGX1BBUlNFX0gKLSNkZWZpbmUgX1dQUklOVEZfUEFSU0VfSAotCi0jaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKLQotCi0vKiBGbGFncyAqLwotI2RlZmluZSBGTEFHX0dST1VQCSAxCS8qICcgZmxhZyAqLwotI2RlZmluZSBGTEFHX0xFRlQJIDIJLyogLSBmbGFnICovCi0jZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCi0jZGVmaW5lIEZMQUdfU1BBQ0UJIDgJLyogc3BhY2UgZmxhZyAqLwotI2RlZmluZSBGTEFHX0FMVAkxNgkvKiAjIGZsYWcgKi8KLSNkZWZpbmUgRkxBR19aRVJPCTMyCi0KLS8qIGFyZ19pbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnQgaXMgY29uc3VtZWQuICAqLwotI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKLQotLyogQSBwYXJzZWQgZGlyZWN0aXZlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IHdjaGFyX3QqIGRpcl9zdGFydDsKLSAgY29uc3Qgd2NoYXJfdCogZGlyX2VuZDsKLSAgaW50IGZsYWdzOwotICBjb25zdCB3Y2hhcl90KiB3aWR0aF9zdGFydDsKLSAgY29uc3Qgd2NoYXJfdCogd2lkdGhfZW5kOwotICBzaXplX3Qgd2lkdGhfYXJnX2luZGV4OwotICBjb25zdCB3Y2hhcl90KiBwcmVjaXNpb25fc3RhcnQ7Ci0gIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9lbmQ7Ci0gIHNpemVfdCBwcmVjaXNpb25fYXJnX2luZGV4OwotICB3Y2hhcl90IGNvbnZlcnNpb247IC8qIGQgaSBvIHUgeCBYIGYgZSBFIGcgRyBjIHMgcCBuIFUgJSBidXQgbm90IEMgUyAqLwotICBzaXplX3QgYXJnX2luZGV4OwotfQotd2NoYXJfdF9kaXJlY3RpdmU7Ci0KLS8qIEEgcGFyc2VkIGZvcm1hdCBzdHJpbmcuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgc2l6ZV90IGNvdW50OwotICB3Y2hhcl90X2RpcmVjdGl2ZSAqZGlyOwotICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKLSAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoOwotfQotd2NoYXJfdF9kaXJlY3RpdmVzOwotCi0KLS8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKLSAgIGluIGRpcmVjdGl2ZXNbMF0sIC4uLiwgZGlyZWN0aXZlc1tOLTFdLCBhbmQgc2V0cyBkaXJlY3RpdmVzW05dLmRpcl9zdGFydAotICAgdG8gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIEFsc28gZmlsbHMgaW4gdGhlIGFyZ190eXBlIGZpZWxkcyBvZiB0aGUKLSAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLwotI2lmZGVmIFNUQVRJQwotU1RBVElDCi0jZWxzZQotZXh0ZXJuCi0jZW5kaWYKLWludCB3cHJpbnRmX3BhcnNlIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHdjaGFyX3RfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKLQotI2VuZGlmIC8qIF9XUFJJTlRGX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC94c2l6ZS5oIGIvdW5peC9pbnRsL3hzaXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MmUyNGIuLjAwMDAwMDAKLS0tIGEvdW5peC9pbnRsL3hzaXplLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogeHNpemUuaCAtLSBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuCi0KLSAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX1hTSVpFX0gKLSNkZWZpbmUgX1hTSVpFX0gKLQotLyogR2V0IHNpemVfdC4gICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIEdldCBTSVpFX01BWC4gICovCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaWYgSEFWRV9TVERJTlRfSAotIyBpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotCi0vKiBUaGUgc2l6ZSBvZiBtZW1vcnkgb2JqZWN0cyBpcyBvZnRlbiBjb21wdXRlZCB0aHJvdWdoIGV4cHJlc3Npb25zIG9mCi0gICB0eXBlIHNpemVfdC4gRXhhbXBsZToKLSAgICAgIHZvaWQqIHAgPSBtYWxsb2MgKGhlYWRlcl9zaXplICsgbiAqIGVsZW1lbnRfc2l6ZSkuCi0gICBUaGVzZSBjb21wdXRhdGlvbnMgY2FuIGxlYWQgdG8gb3ZlcmZsb3cuICBXaGVuIHRoaXMgaGFwcGVucywgbWFsbG9jKCkKLSAgIHJldHVybnMgYSBwaWVjZSBvZiBtZW1vcnkgdGhhdCBpcyB3YXkgdG9vIHNtYWxsLCBhbmQgdGhlIHByb2dyYW0gdGhlbgotICAgY3Jhc2hlcyB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbGwgdGhlIG1lbW9yeS4KLSAgIFRvIGF2b2lkIHRoaXMsIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3JvcyBpbiB0aGlzIGZpbGUgY2hlY2sgZm9yIG92ZXJmbG93LgotICAgVGhlIGNvbnZlbnRpb24gaXMgdGhhdCBTSVpFX01BWCByZXByZXNlbnRzIG92ZXJmbG93LgotICAgbWFsbG9jIChTSVpFX01BWCkgaXMgbm90IGd1YXJhbnRlZWQgdG8gZmFpbCAtLSB0aGluayBvZiBhIG1hbGxvYwotICAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIG1tYXAgLS0sIGl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIHNpemVfb3ZlcmZsb3dfcCgpCi0gICBvciBzaXplX2luX2JvdW5kc19wKCkgYmVmb3JlIGludm9raW5nIG1hbGxvYygpLgotICAgVGhlIGV4YW1wbGUgdGh1cyBiZWNvbWVzOgotICAgICAgc2l6ZV90IHNpemUgPSB4c3VtIChoZWFkZXJfc2l6ZSwgeHRpbWVzIChuLCBlbGVtZW50X3NpemUpKTsKLSAgICAgIHZvaWQgKnAgPSAoc2l6ZV9pbl9ib3VuZHNfcCAoc2l6ZSkgPyBtYWxsb2MgKHNpemUpIDogTlVMTCk7Ci0qLwotCi0vKiBDb252ZXJ0IGFuIGFyYml0cmFyeSB2YWx1ZSA+PSAwIHRvIHR5cGUgc2l6ZV90LiAgKi8KLSNkZWZpbmUgeGNhc3Rfc2l6ZV90KE4pIFwKLSAgKChOKSA8PSBTSVpFX01BWCA/IChzaXplX3QpIChOKSA6IFNJWkVfTUFYKQotCi0vKiBTdW0gb2YgdHdvIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci0jaWYgX19HTlVDX18gPj0gMwotX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKLSNlbmRpZgoteHN1bSAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpCi17Ci0gIHNpemVfdCBzdW0gPSBzaXplMSArIHNpemUyOwotICByZXR1cm4gKHN1bSA+PSBzaXplMSA/IHN1bSA6IFNJWkVfTUFYKTsKLX0KLQotLyogU3VtIG9mIHRocmVlIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci0jaWYgX19HTlVDX18gPj0gMwotX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKLSNlbmRpZgoteHN1bTMgKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyLCBzaXplX3Qgc2l6ZTMpCi17Ci0gIHJldHVybiB4c3VtICh4c3VtIChzaXplMSwgc2l6ZTIpLCBzaXplMyk7Ci19Ci0KLS8qIFN1bSBvZiBmb3VyIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci0jaWYgX19HTlVDX18gPj0gMwotX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKLSNlbmRpZgoteHN1bTQgKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyLCBzaXplX3Qgc2l6ZTMsIHNpemVfdCBzaXplNCkKLXsKLSAgcmV0dXJuIHhzdW0gKHhzdW0gKHhzdW0gKHNpemUxLCBzaXplMiksIHNpemUzKSwgc2l6ZTQpOwotfQotCi0vKiBNYXhpbXVtIG9mIHR3byBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi1zdGF0aWMgaW5saW5lIHNpemVfdAotI2lmIF9fR05VQ19fID49IDMKLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0jZW5kaWYKLXhtYXggKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyKQotewotICAvKiBObyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgaGVyZSwgYmVjYXVzZSBmb3IgYW55IG46Ci0gICAgIG1heCAoU0laRV9NQVgsIG4pID09IFNJWkVfTUFYIGFuZCBtYXggKG4sIFNJWkVfTUFYKSA9PSBTSVpFX01BWC4gICovCi0gIHJldHVybiAoc2l6ZTEgPj0gc2l6ZTIgPyBzaXplMSA6IHNpemUyKTsKLX0KLQotLyogTXVsdGlwbGljYXRpb24gb2YgYSBjb3VudCB3aXRoIGFuIGVsZW1lbnQgc2l6ZSwgd2l0aCBvdmVyZmxvdyBjaGVjay4KLSAgIFRoZSBjb3VudCBtdXN0IGJlID49IDAgYW5kIHRoZSBlbGVtZW50IHNpemUgbXVzdCBiZSA+IDAuCi0gICBUaGlzIGlzIGEgbWFjcm8sIG5vdCBhbiBpbmxpbmUgZnVuY3Rpb24sIHNvIHRoYXQgaXQgd29ya3MgY29ycmVjdGx5IGV2ZW4KLSAgIHdoZW4gTiBpcyBvZiBhIHdpZGVyIHR1cGUgYW5kIE4gPiBTSVpFX01BWC4gICovCi0jZGVmaW5lIHh0aW1lcyhOLCBFTFNJWkUpIFwKLSAgKChOKSA8PSBTSVpFX01BWCAvIChFTFNJWkUpID8gKHNpemVfdCkgKE4pICogKEVMU0laRSkgOiBTSVpFX01BWCkKLQotLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAgKi8KLSNkZWZpbmUgc2l6ZV9vdmVyZmxvd19wKFNJWkUpIFwKLSAgKChTSVpFKSA9PSBTSVpFX01BWCkKLS8qIENoZWNrIGFnYWluc3Qgb3ZlcmZsb3cuICAqLwotI2RlZmluZSBzaXplX2luX2JvdW5kc19wKFNJWkUpIFwKLSAgKChTSVpFKSAhPSBTSVpFX01BWCkKLQotI2VuZGlmIC8qIF9YU0laRV9IICovCmRpZmYgLS1naXQgYS91bml4L21raW5zdGFsbGRpcnMgYi91bml4L21raW5zdGFsbGRpcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyZDVmMjEuLjAwMDAwMDAKLS0tIGEvdW5peC9ta2luc3RhbGxkaXJzCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5Ci0jIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgotIyBDcmVhdGVkOiAxOTkzLTA1LTE2Ci0jIFB1YmxpYyBkb21haW4KLQotZXJyc3RhdHVzPTAKLWRpcm1vZGU9IiIKLQotdXNhZ2U9IlwKLVVzYWdlOiBta2luc3RhbGxkaXJzIFstaF0gWy0taGVscF0gWy1tIG1vZGVdIGRpciAuLi4iCi0KLSMgcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC1oIHwgLS1oZWxwIHwgLS1oKikgICAgICAgICAjIC1oIGZvciBoZWxwCi0gICAgICBlY2hvICIkdXNhZ2UiIDE+JjIKLSAgICAgIGV4aXQgMAotICAgICAgOzsKLSAgICAtbSkgICAgICAgICAgICAgICAgICAgICAgICAgIyAtbSBQRVJNIGFyZwotICAgICAgc2hpZnQKLSAgICAgIHRlc3QgJCMgLWVxIDAgJiYgeyBlY2hvICIkdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgICAgZGlybW9kZT0kMQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgLS0pICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgc2hpZnQKLSAgICAgIGJyZWFrCi0gICAgICA7OwotICAgIC0qKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHVua25vd24gb3B0aW9uCi0gICAgICBlY2hvICIkdXNhZ2UiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaXJzdCBub24tb3B0IGFyZwotICAgICAgYnJlYWsKLSAgICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotZm9yIGZpbGUKLWRvCi0gIGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgotICAgIHNoaWZ0Ci0gIGVsc2UKLSAgICBicmVhawotICBmaQotZG9uZQotCi1jYXNlICQjIGluCi0gIDApIGV4aXQgMCA7OwotZXNhYwotCi1jYXNlICRkaXJtb2RlIGluCi0gICcnKQotICAgIGlmIG1rZGlyIC1wIC0tIC4gMj4vZGV2L251bGw7IHRoZW4KLSAgICAgIGVjaG8gIm1rZGlyIC1wIC0tICQqIgotICAgICAgZXhlYyBta2RpciAtcCAtLSAiJEAiCi0gICAgZmkKLSAgICA7OwotICAqKQotICAgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS0gLiAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgZWNobyAibWtkaXIgLW0gJGRpcm1vZGUgLXAgLS0gJCoiCi0gICAgICBleGVjIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS0gIiRAIgotICAgIGZpCi0gICAgOzsKLWVzYWMKLQotZm9yIGZpbGUKLWRvCi0gIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8IHNlZCAtbmUgJ3MvXjpcLy8jLztzL146Ly87cy9cLy8gL2c7cy9eIy9cLy87cCdgCi0gIHNoaWZ0Ci0KLSAgcGF0aGNvbXA9Ci0gIGZvciBkCi0gIGRvCi0gICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgotICAgIGNhc2UgJHBhdGhjb21wIGluCi0gICAgICAtKikgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLSAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIKLQotICAgICAgbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPwotCi0gICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLSAgCWVycnN0YXR1cz0kbGFzdGVycgotICAgICAgZWxzZQotICAJaWYgdGVzdCAhIC16ICIkZGlybW9kZSI7IHRoZW4KLQkgIGVjaG8gImNobW9kICRkaXJtb2RlICRwYXRoY29tcCIKLSAgICAJICBsYXN0ZXJyPSIiCi0gIAkgIGNobW9kICIkZGlybW9kZSIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPwotCi0gIAkgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCi0gIAkgICAgZXJyc3RhdHVzPSRsYXN0ZXJyCi0gIAkgIGZpCi0gIAlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCi0gIGRvbmUKLWRvbmUKLQotZXhpdCAkZXJyc3RhdHVzCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOiBzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246IDIKLSMgRW5kOgotIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvdW5peC9wby9NYWtlZmlsZS5pbi5pbiBiL3VuaXgvcG8vTWFrZWZpbGUuaW4uaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZWZjNWUuLjAwMDAwMDAKLS0tIGEvdW5peC9wby9NYWtlZmlsZS5pbi5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBQTyBkaXJlY3RvcnkgaW4gYW55IHBhY2thZ2UgdXNpbmcgR05VIGdldHRleHQuCi0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBjYW4gYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAotIyBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiBHTlUgZ2V0dGV4dCBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgaXMgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCi0jCi0jIE9yaWdpbjogZ2V0dGV4dC0wLjE0Ci0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChkYXRhZGlyKS9nZXR0ZXh0L3BvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJChNS0lOU1RBTExESVJTKQotCi1HTVNHRk1UID0gQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IG1zZ21lcmdlCi1NU0dNRVJHRV9VUERBVEUgPSBATVNHTUVSR0VAIC0tdXBkYXRlCi1NU0dJTklUID0gbXNnaW5pdAotTVNHQ09OViA9IG1zZ2NvbnYKLU1TR0ZJTFRFUiA9IG1zZ2ZpbHRlcgotCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLVVQREFURVBPRklMRVMgPSBAVVBEQVRFUE9GSUxFU0AKLURVTU1ZUE9GSUxFUyA9IEBEVU1NWVBPRklMRVNACi1ESVNURklMRVMuY29tbW9uID0gTWFrZWZpbGUuaW4uaW4gcmVtb3ZlLXBvdGNkYXRlLnNpbiBcCi0kKERJU1RGSUxFUy5jb21tb24uZXh0cmExKSAkKERJU1RGSUxFUy5jb21tb24uZXh0cmEyKSAkKERJU1RGSUxFUy5jb21tb24uZXh0cmEzKQotRElTVEZJTEVTID0gJChESVNURklMRVMuY29tbW9uKSBNYWtldmFycyBQT1RGSUxFUy5pbiAkKERPTUFJTikucG90IHN0YW1wLXBvIFwKLSQoUE9GSUxFUykgJChHTU9GSUxFUykgXAotJChESVNURklMRVMuZXh0cmExKSAkKERJU1RGSUxFUy5leHRyYTIpICQoRElTVEZJTEVTLmV4dHJhMykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotCi0jIE1ha2V2YXJzIGdldHMgaW5zZXJ0ZWQgaGVyZS4gKERvbid0IHJlbW92ZSB0aGlzIGxpbmUhKQotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5wbyAuZ21vIC5tbyAuc2VkIC5zaW4gLm5vcCAucG8tY3JlYXRlIC5wby11cGRhdGUKLQotLnBvLm1vOgotCUBlY2hvICIkKE1TR0ZNVCkgLWMgLW8gJEAgJDwiOyBcCi0JJChNU0dGTVQpIC1jIC1vIHQtJEAgJDwgJiYgbXYgdC0kQCAkQAotCi0ucG8uZ21vOgotCUBsYW5nPWBlY2hvICQqIHwgc2VkIC1lICdzLC4qLywsJ2A7IFwKLQl0ZXN0ICIkKHNyY2RpcikiID0gLiAmJiBjZGNtZD0iIiB8fCBjZGNtZD0iY2QgJChzcmNkaXIpICYmICI7IFwKLQllY2hvICIkJHtjZGNtZH1ybSAtZiAkJHtsYW5nfS5nbW8gJiYgJChHTVNHRk1UKSAtYyAtLXN0YXRpc3RpY3MgLW8gJCR7bGFuZ30uZ21vICQke2xhbmd9LnBvIjsgXAotCWNkICQoc3JjZGlyKSAmJiBybSAtZiAkJHtsYW5nfS5nbW8gJiYgJChHTVNHRk1UKSAtYyAtLXN0YXRpc3RpY3MgLW8gdC0kJHtsYW5nfS5nbW8gJCR7bGFuZ30ucG8gJiYgbXYgdC0kJHtsYW5nfS5nbW8gJCR7bGFuZ30uZ21vCi0KLS5zaW4uc2VkOgotCXNlZCAtZSAnL14jL2QnICQ8ID4gdC0kQAotCW12IHQtJEAgJEAKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogc3RhbXAtcG8KLWFsbC1ubzoKLQotIyBzdGFtcC1wbyBpcyBhIHRpbWVzdGFtcCBkZW5vdGluZyB0aGUgbGFzdCB0aW1lIGF0IHdoaWNoIHRoZSBDQVRBTE9HUyBoYXZlCi0jIGJlZW4gbG9vc2VseSB1cGRhdGVkLiBJdHMgcHVycG9zZSBpcyB0aGF0IHdoZW4gYSBkZXZlbG9wZXIgb3IgdHJhbnNsYXRvcgotIyBjaGVja3Mgb3V0IHRoZSBwYWNrYWdlIHZpYSBDVlMsIGFuZCB0aGUgJChET01BSU4pLnBvdCBmaWxlIGlzIG5vdCBpbiBDVlMsCi0jICJtYWtlIiB3aWxsIHVwZGF0ZSB0aGUgJChET01BSU4pLnBvdCBhbmQgdGhlICQoQ0FUQUxPR1MpLCBidXQgc3Vic2VxdWVudAotIyBpbnZvY2F0aW9ucyBvZiAibWFrZSIgd2lsbCBkbyBub3RoaW5nLiBUaGlzIHRpbWVzdGFtcCB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5Ci0jIGlmIHVwZGF0aW5nIHRoZSAkKENBVEFMT0dTKSB3b3VsZCBhbHdheXMgdG91Y2ggdGhlbTsgaG93ZXZlciwgdGhlIHJ1bGUgZm9yCi0jICQoUE9GSUxFUykgaGFzIGJlZW4gZGVzaWduZWQgdG8gbm90IHRvdWNoIGZpbGVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZQotIyBjaGFuZ2VkLgotc3RhbXAtcG86ICQoc3JjZGlyKS8kKERPTUFJTikucG90Ci0JdGVzdCAteiAiJChHTU9GSUxFUykiIHx8ICQoTUFLRSkgJChHTU9GSUxFUykKLQlAZWNobyAidG91Y2ggc3RhbXAtcG8iCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtcG9UCi0JQG12IHN0YW1wLXBvVCBzdGFtcC1wbwotCi0jIE5vdGU6IFRhcmdldCAnYWxsJyBtdXN0IG5vdCBkZXBlbmQgb24gdGFyZ2V0ICckKERPTUFJTikucG90LXVwZGF0ZScsCi0jIG90aGVyd2lzZSBwYWNrYWdlcyBsaWtlIEdDQyBjYW4gbm90IGJlIGJ1aWx0IGlmIG9ubHkgcGFydHMgb2YgdGhlIHNvdXJjZQotIyBoYXZlIGJlZW4gZG93bmxvYWRlZC4KLQotIyBUaGlzIHRhcmdldCByZWJ1aWxkcyAkKERPTUFJTikucG90OyBpdCBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLgotIyBOb3RlIHRoYXQgJChET01BSU4pLnBvdCBpcyBub3QgdG91Y2hlZCBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZC4KLSQoRE9NQUlOKS5wb3QtdXBkYXRlOiAkKFBPVEZJTEVTKSAkKHNyY2RpcikvUE9URklMRVMuaW4gcmVtb3ZlLXBvdGNkYXRlLnNlZAotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChET01BSU4pIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHM9VFJBTlNMQVRPUlM6ICQoWEdFVFRFWFRfT1BUSU9OUykgXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbiBcCi0JICAtLWNvcHlyaWdodC1ob2xkZXI9JyQoQ09QWVJJR0hUX0hPTERFUiknIFwKLQkgIC0tbXNnaWQtYnVncy1hZGRyZXNzPSckKE1TR0lEX0JVR1NfQUREUkVTUyknCi0JdGVzdCAhIC1mICQoRE9NQUlOKS5wbyB8fCB7IFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQoRE9NQUlOKS5wb3Q7IHRoZW4gXAotCSAgICBzZWQgLWYgcmVtb3ZlLXBvdGNkYXRlLnNlZCA8ICQoc3JjZGlyKS8kKERPTUFJTikucG90ID4gJChET01BSU4pLjFwbyAmJiBcCi0JICAgIHNlZCAtZiByZW1vdmUtcG90Y2RhdGUuc2VkIDwgJChET01BSU4pLnBvID4gJChET01BSU4pLjJwbyAmJiBcCi0JICAgIGlmIGNtcCAkKERPTUFJTikuMXBvICQoRE9NQUlOKS4ycG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICAgICBybSAtZiAkKERPTUFJTikuMXBvICQoRE9NQUlOKS4ycG8gJChET01BSU4pLnBvOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHJtIC1mICQoRE9NQUlOKS4xcG8gJChET01BSU4pLjJwbyAkKHNyY2RpcikvJChET01BSU4pLnBvdCAmJiBcCi0JICAgICAgbXYgJChET01BSU4pLnBvICQoc3JjZGlyKS8kKERPTUFJTikucG90OyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIFwKLQkgICAgbXYgJChET01BSU4pLnBvICQoc3JjZGlyKS8kKERPTUFJTikucG90OyBcCi0JICBmaTsgXAotCX0KLQotIyBUaGlzIHJ1bGUgaGFzIG5vIGRlcGVuZGVuY2llczogd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgJChET01BSU4pLnBvdCBhdAotIyBldmVyeSAibWFrZSIgaW52b2NhdGlvbiwgb25seSBjcmVhdGUgaXQgd2hlbiBpdCBpcyBtaXNzaW5nLgotIyBPbmx5ICJtYWtlICQoRE9NQUlOKS5wb3QtdXBkYXRlIiBvciAibWFrZSBkaXN0IiB3aWxsIGZvcmNlIGFuIHVwZGF0ZS4KLSQoc3JjZGlyKS8kKERPTUFJTikucG90OgotCSQoTUFLRSkgJChET01BSU4pLnBvdC11cGRhdGUKLQotIyBUaGlzIHRhcmdldCByZWJ1aWxkcyBhIFBPIGZpbGUgaWYgJChET01BSU4pLnBvdCBoYXMgY2hhbmdlZC4KLSMgTm90ZSB0aGF0IGEgUE8gZmlsZSBpcyBub3QgdG91Y2hlZCBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZC4KLSQoUE9GSUxFUyk6ICQoc3JjZGlyKS8kKERPTUFJTikucG90Ci0JQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MsLiovLCwnIC1lICdzL1wucG8kJC8vJ2A7IFwKLQlpZiB0ZXN0IC1mICIkKHNyY2RpcikvJCR7bGFuZ30ucG8iOyB0aGVuIFwKLQkgIHRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAotCSAgZWNobyAiJCR7Y2RjbWR9JChNU0dNRVJHRV9VUERBVEUpICQke2xhbmd9LnBvICQoRE9NQUlOKS5wb3QiOyBcCi0JICBjZCAkKHNyY2RpcikgJiYgJChNU0dNRVJHRV9VUERBVEUpICQke2xhbmd9LnBvICQoRE9NQUlOKS5wb3Q7IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJCR7bGFuZ30ucG8tY3JlYXRlOyBcCi0JZmkKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0JICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUy5jb21tb24pIE1ha2V2YXJzLnRlbXBsYXRlOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlIFwKLQkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQkgIGZvciBmaWxlIGluIE1ha2V2YXJzOyBkbyBcCi0JICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGF0YWRpcikKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgLWUgJ3MvXC5nbW8kJC8vJ2A7IFwKLQkgIGRpcj0kKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkJGRpcjsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiByZWFsY2F0PSQkY2F0OyBlbHNlIHJlYWxjYXQ9JChzcmNkaXIpLyQkY2F0OyBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkcmVhbGNhdCAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vOyBcCi0JICBlY2hvICJpbnN0YWxsaW5nICQkcmVhbGNhdCBhcyAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vIjsgXAotCSAgZm9yIGxjIGluICcnICQoRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMpOyBkbyBcCi0JICAgIGlmIHRlc3QgLW4gIiQkbGMiOyB0aGVuIFwKLQkgICAgICBpZiAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcgJiYgTENfQUxMPUMgbHMgLWwgLWQgJCRsYyAyPi9kZXYvbnVsbCkgfCBncmVwICcgLT4gJyA+L2Rldi9udWxsOyB0aGVuIFwKLQkgICAgICAgIGxpbms9YGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgfCBzZWQgLWUgJ3MvXi4qIC0+IC8vJ2A7IFwKLQkgICAgICAgIG12ICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKLQkgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKLQkgICAgICAgIChjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZCAmJiBcCi0JICAgICAgICAgZm9yIGZpbGUgaW4gKjsgZG8gXAotCSAgICAgICAgICAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gXAotCSAgICAgICAgICAgICBsbiAtcyAuLi8kJGxpbmsvJCRmaWxlICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJCRmaWxlOyBcCi0JICAgICAgICAgICBmaTsgXAotCSAgICAgICAgIGRvbmUpOyBcCi0JICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZDsgXAotCSAgICAgIGVsc2UgXAotCSAgICAgICAgaWYgdGVzdCAtZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyB0aGVuIFwKLQkgICAgICAgICAgOjsgXAotCSAgICAgICAgZWxzZSBcCi0JICAgICAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKLQkgICAgICAgICAgbWtkaXIgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAotCSAgICAgICAgZmk7IFwKLQkgICAgICBmaTsgXAotCSAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vOyBcCi0JICAgICAgbG4gLXMgLi4vTENfTUVTU0FHRVMvJChET01BSU4pLm1vICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vIDI+L2Rldi9udWxsIHx8IFwKLQkgICAgICBsbiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKERPTUFJTikubW8gJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8gMj4vZGV2L251bGwgfHwgXAotCSAgICAgIGNwIC1wICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoRE9NQUlOKS5tbyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQoRE9NQUlOKS5tbzsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJCRyZWFsY2F0IGxpbmsgYXMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8iOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1pbnN0YWxsLXN0cmlwOiBpbnN0YWxsCi0KLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1leGVjIGluc3RhbGxkaXJzLWRhdGEKLWluc3RhbGxkaXJzLWV4ZWM6Ci1pbnN0YWxsZGlycy1kYXRhOiBpbnN0YWxsZGlycy1kYXRhLUBVU0VfTkxTQAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLQkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLWluc3RhbGxkaXJzLWRhdGEtbm86Ci1pbnN0YWxsZGlycy1kYXRhLXllczoKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRhdGFkaXIpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCi0JICBkaXI9JChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJCRkaXI7IFwKLQkgIGZvciBsYyBpbiAnJyAkKEVYVFJBX0xPQ0FMRV9DQVRFR09SSUVTKTsgZG8gXAotCSAgICBpZiB0ZXN0IC1uICIkJGxjIjsgdGhlbiBcCi0JICAgICAgaWYgKGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgMj4vZGV2L251bGwpIHwgZ3JlcCAnIC0+ICcgPi9kZXYvbnVsbDsgdGhlbiBcCi0JICAgICAgICBsaW5rPWBjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZyAmJiBMQ19BTEw9QyBscyAtbCAtZCAkJGxjIHwgc2VkIC1lICdzL14uKiAtPiAvLydgOyBcCi0JICAgICAgICBtdiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkOyBcCi0JICAgICAgICBta2RpciAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCi0JICAgICAgICAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQgJiYgXAotCSAgICAgICAgIGZvciBmaWxlIGluICo7IGRvIFwKLQkgICAgICAgICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIFwKLQkgICAgICAgICAgICAgbG4gLXMgLi4vJCRsaW5rLyQkZmlsZSAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQkZmlsZTsgXAotCSAgICAgICAgICAgZmk7IFwKLQkgICAgICAgICBkb25lKTsgXAotCSAgICAgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKLQkgICAgICBlbHNlIFwKLQkgICAgICAgIGlmIHRlc3QgLWQgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgdGhlbiBcCi0JICAgICAgICAgIDo7IFwKLQkgICAgICAgIGVsc2UgXAotCSAgICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCi0JICAgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKLQkgICAgICAgIGZpOyBcCi0JICAgICAgZmk7IFwKLQkgICAgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOiB1bmluc3RhbGwtZXhlYyB1bmluc3RhbGwtZGF0YQotdW5pbnN0YWxsLWV4ZWM6Ci11bmluc3RhbGwtZGF0YTogdW5pbnN0YWxsLWRhdGEtQFVTRV9OTFNACi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotCSAgZm9yIGZpbGUgaW4gJChESVNURklMRVMuY29tbW9uKSBNYWtldmFycy50ZW1wbGF0ZTsgZG8gXAotCSAgICBybSAtZiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLXVuaW5zdGFsbC1kYXRhLW5vOgotdW5pbnN0YWxsLWRhdGEteWVzOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCi0JICBmb3IgbGMgaW4gTENfTUVTU0FHRVMgJChFWFRSQV9MT0NBTEVfQ0FURUdPUklFUyk7IGRvIFwKLQkgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW87IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLWNoZWNrOiBhbGwKLQotaW5mbyBkdmkgcHMgcGRmIGh0bWwgdGFncyBUQUdTIGN0YWdzIENUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiByZW1vdmUtcG90Y2RhdGUuc2VkCi0Jcm0gLWYgc3RhbXAtcG9UCi0Jcm0gLWYgY29yZSBjb3JlLiogJChET01BSU4pLnBvICQoRE9NQUlOKS4xcG8gJChET01BSU4pLjJwbyAqLm5ldy5wbwotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mIHN0YW1wLXBvICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAkKHRvcF9idWlsZGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOgotCSQoTUFLRSkgdXBkYXRlLXBvCi0JQCQoTUFLRSkgZGlzdDIKLSMgVGhpcyBpcyBhIHNlcGFyYXRlIHRhcmdldCBiZWNhdXNlICd1cGRhdGUtcG8nIG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlLgotZGlzdDI6ICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotCSAgZGlzdHM9IiQkZGlzdHMgTWFrZXZhcnMudGVtcGxhdGUiOyBcCi0JZmk7IFwKLQlpZiB0ZXN0IC1mICQoc3JjZGlyKS9DaGFuZ2VMb2c7IHRoZW4gXAotCSAgZGlzdHM9IiQkZGlzdHMgQ2hhbmdlTG9nIjsgXAotCWZpOyBcCi0JZm9yIGkgaW4gMCAxIDIgMyA0IDUgNiA3IDggOTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvQ2hhbmdlTG9nLiQkaTsgdGhlbiBcCi0JICAgIGRpc3RzPSIkJGRpc3RzIENoYW5nZUxvZy4kJGkiOyBcCi0JICBmaTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0IC1mICQoc3JjZGlyKS9MSU5HVUFTOyB0aGVuIGRpc3RzPSIkJGRpc3RzIExJTkdVQVMiOyBmaTsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXAgJCRmaWxlICQoZGlzdGRpcik7IFwKLQkgIGVsc2UgXAotCSAgICBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKERPTUFJTikucG90LXVwZGF0ZQotCXRlc3QgLXogIiQoVVBEQVRFUE9GSUxFUykiIHx8ICQoTUFLRSkgJChVUERBVEVQT0ZJTEVTKQotCSQoTUFLRSkgdXBkYXRlLWdtbwotCi0jIEdlbmVyYWwgcnVsZSBmb3IgY3JlYXRpbmcgUE8gZmlsZXMuCi0KLS5ub3AucG8tY3JlYXRlOgotCUBsYW5nPWBlY2hvICRAIHwgc2VkIC1lICdzL1wucG8tY3JlYXRlJCQvLydgOyBcCi0JZWNobyAiRmlsZSAkJGxhbmcucG8gZG9lcyBub3QgZXhpc3QuIElmIHlvdSBhcmUgYSB0cmFuc2xhdG9yLCB5b3UgY2FuIGNyZWF0ZSBpdCB0aHJvdWdoICdtc2dpbml0Jy4iIDE+JjI7IFwKLQlleGl0IDEKLQotIyBHZW5lcmFsIHJ1bGUgZm9yIHVwZGF0aW5nIFBPIGZpbGVzLgotCi0ubm9wLnBvLXVwZGF0ZToKLQlAbGFuZz1gZWNobyAkQCB8IHNlZCAtZSAncy9cLnBvLXVwZGF0ZSQkLy8nYDsgXAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgZmk7IFwKLQl0bXBkaXI9YHB3ZGA7IFwKLQllY2hvICIkJGxhbmc6IjsgXAotCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAotCWVjaG8gIiQke2NkY21kfSQoTVNHTUVSR0UpICQkbGFuZy5wbyAkKERPTUFJTikucG90IC1vICQkbGFuZy5uZXcucG8iOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JaWYgJChNU0dNRVJHRSkgJCRsYW5nLnBvICQoRE9NQUlOKS5wb3QgLW8gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgdGhlbiBcCi0JICBpZiBjbXAgJCRsYW5nLnBvICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGlmIG12IC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgICA6OyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGxhbmcucG8gZmFpbGVkOiBjYW5ub3QgbW92ZSAkJHRtcGRpci8kJGxhbmcubmV3LnBvIHRvICQkbGFuZy5wbyIgMT4mMjsgXAotCSAgICAgIGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQllbHNlIFwKLQkgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGxhbmcucG8gZmFpbGVkISIgMT4mMjsgXAotCSAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAotCWZpCi0KLSQoRFVNTVlQT0ZJTEVTKToKLQotdXBkYXRlLWdtbzogTWFrZWZpbGUgJChHTU9GSUxFUykKLQlAOgotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4uaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgQFBPTUFLRUZJTEVERVBTQAotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRALmluIENPTkZJR19IRUFERVJTPSBcCi0JICAgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1mb3JjZToKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvdW5peC92bmN2aWV3ZXIvQWJvdXREaWFsb2cuaCBiL3VuaXgvdm5jdmlld2VyL0Fib3V0RGlhbG9nLmgKaW5kZXggYzRmMGE3Yy4uMGM3OTZiZSAxMDA2NDQKLS0tIGEvdW5peC92bmN2aWV3ZXIvQWJvdXREaWFsb2cuaAorKysgYi91bml4L3ZuY3ZpZXdlci9BYm91dERpYWxvZy5oCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSAiVFhNc2dCb3guaCIKICNpbmNsdWRlICJwYXJhbWV0ZXJzLmgiCiAKLSNpbmNsdWRlIDxpbnRsL2dldHRleHQuaD4KKyNpbmNsdWRlICJnZXR0ZXh0LmgiCiAjZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCiAjZGVmaW5lIGdldHRleHRfbm9vcChTdHJpbmcpIFN0cmluZwogI2RlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQo=